mirror of
https://github.com/nsnail/FreeSql.git
synced 2025-04-22 02:32:50 +08:00
remove Examples/website
This commit is contained in:
parent
212a9f2786
commit
7738dfec88
@ -1,82 +0,0 @@
|
|||||||
//using FreeSql.Site.Entity;
|
|
||||||
using FreeSql.Site.Entity;
|
|
||||||
using FreeSql.Site.Entity.Common;
|
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq.Expressions;
|
|
||||||
using System.Text;
|
|
||||||
|
|
||||||
namespace FreeSql.Site.DAL
|
|
||||||
{
|
|
||||||
public class BaseDAL<T> where T : BaseEntity
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// 新增方法
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="model"></param>
|
|
||||||
/// <returns></returns>
|
|
||||||
public virtual long Insert(T model)
|
|
||||||
{
|
|
||||||
var runsql = DataBaseType.MySql.DB().Insert<T>(model);
|
|
||||||
return runsql.ExecuteIdentity();
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 修改方法
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="model"></param>
|
|
||||||
/// <returns></returns>
|
|
||||||
public virtual bool Update(T model)
|
|
||||||
{
|
|
||||||
var runsql = DataBaseType.MySql.DB().Update<T>().SetSource(model);
|
|
||||||
return runsql.ExecuteAffrows() > 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 删除方法
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="id"></param>
|
|
||||||
/// <returns></returns>
|
|
||||||
public virtual bool Delete(long id)
|
|
||||||
{
|
|
||||||
return DataBaseType.MySql.DB().Delete<T>(id).ExecuteDeleted().Count > 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 获取一条数据
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="where"></param>
|
|
||||||
/// <returns></returns>
|
|
||||||
public virtual T GetByOne(Expression<Func<T, bool>> where)
|
|
||||||
{
|
|
||||||
return DataBaseType.MySql.DB().Select<T>()
|
|
||||||
.Where(where).ToOne();
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 查询方法
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="where"></param>
|
|
||||||
/// <param name="orderby"></param>
|
|
||||||
/// <returns></returns>
|
|
||||||
public virtual (List<T> list, long count) Query(Expression<Func<T, bool>> where,
|
|
||||||
Expression<Func<T, T>> orderby = null, PageInfo pageInfo = null)
|
|
||||||
{
|
|
||||||
//设置查询条件
|
|
||||||
var list = DataBaseType.MySql.DB().Select<T>()
|
|
||||||
.Where(where);
|
|
||||||
|
|
||||||
BaseEntity baseEntity = new BaseEntity();
|
|
||||||
//设置排序
|
|
||||||
if (orderby != null) list = list.OrderBy(nameof(baseEntity.CreateDt) + " desc ");
|
|
||||||
|
|
||||||
var count = list.Count();
|
|
||||||
//设置分页操作
|
|
||||||
if (pageInfo != null && pageInfo.IsPaging)
|
|
||||||
list.Skip((pageInfo.PageIndex - 1) * pageInfo.PageSize).Limit(pageInfo.PageSize);
|
|
||||||
|
|
||||||
//执行查询
|
|
||||||
return (list.ToList(), count);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,40 +0,0 @@
|
|||||||
using FreeSql.Site.DAL.Helper;
|
|
||||||
using System;
|
|
||||||
|
|
||||||
namespace FreeSql.Site.DAL
|
|
||||||
{
|
|
||||||
public static class Db
|
|
||||||
{
|
|
||||||
public static System.Collections.Generic.Dictionary<string, IFreeSql> ConnectionPool = new System.Collections.Generic.Dictionary<string, IFreeSql>();
|
|
||||||
|
|
||||||
private static string getConnectionString(string sDatabaseType)
|
|
||||||
{
|
|
||||||
return AppSettingsManager.Get($"DbContexts:{sDatabaseType}:ConnectionString");
|
|
||||||
}
|
|
||||||
|
|
||||||
private static IFreeSql SelectDBType(string dbtype)
|
|
||||||
{
|
|
||||||
if (!ConnectionPool.ContainsKey(dbtype))
|
|
||||||
{
|
|
||||||
ConnectionPool.Add(dbtype, new FreeSql.FreeSqlBuilder()
|
|
||||||
.UseConnectionString(FreeSql.DataType.MySql, getConnectionString(dbtype))
|
|
||||||
.Build());
|
|
||||||
}
|
|
||||||
return ConnectionPool[dbtype];
|
|
||||||
}
|
|
||||||
|
|
||||||
public static IFreeSql DB(this DataBaseType t)
|
|
||||||
{
|
|
||||||
return SelectDBType(t.ToString());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public enum DataBaseType
|
|
||||||
{
|
|
||||||
MySql,
|
|
||||||
SqlServer,
|
|
||||||
PostgreSQL,
|
|
||||||
Oracle,
|
|
||||||
Sqlite
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,14 +0,0 @@
|
|||||||
//using FreeSql.Site.Entity;
|
|
||||||
using FreeSql.Site.Entity;
|
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq.Expressions;
|
|
||||||
using System.Text;
|
|
||||||
|
|
||||||
namespace FreeSql.Site.DAL
|
|
||||||
{
|
|
||||||
public class DocumentCommentDAL : BaseDAL<DocumentComment>
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,90 +0,0 @@
|
|||||||
using FreeSql.Site.Entity;
|
|
||||||
using FreeSql.Site.Entity.Common;
|
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq.Expressions;
|
|
||||||
|
|
||||||
namespace FreeSql.Site.DAL
|
|
||||||
{
|
|
||||||
public class DocumentContentDAL : BaseDAL<DocumentContent>
|
|
||||||
{
|
|
||||||
///// <summary>
|
|
||||||
///// 新增
|
|
||||||
///// </summary>
|
|
||||||
///// <param name="model"></param>
|
|
||||||
///// <returns></returns>
|
|
||||||
//public long Insert(DocumentContent model)
|
|
||||||
//{
|
|
||||||
// return DataBaseType.MySql.DB().Insert<DocumentContent>(model).ExecuteIdentity();
|
|
||||||
//}
|
|
||||||
|
|
||||||
///// <summary>
|
|
||||||
///// 修改
|
|
||||||
///// </summary>
|
|
||||||
///// <param name="model"></param>
|
|
||||||
///// <returns></returns>
|
|
||||||
//public bool Update(DocumentContent model)
|
|
||||||
//{
|
|
||||||
// var runsql = DataBaseType.MySql.DB().Update<DocumentContent>().SetSource(model);
|
|
||||||
// return runsql.ExecuteAffrows() > 0;
|
|
||||||
//}
|
|
||||||
|
|
||||||
///// <summary>
|
|
||||||
///// 删除
|
|
||||||
///// </summary>
|
|
||||||
///// <param name="id"></param>
|
|
||||||
///// <returns></returns>
|
|
||||||
//public bool Delete(long id)
|
|
||||||
//{
|
|
||||||
// return DataBaseType.MySql.DB().Delete<DocumentContent>(id).ExecuteDeleted().Count > 0;
|
|
||||||
//}
|
|
||||||
|
|
||||||
///// <summary>
|
|
||||||
///// 获取一条数据
|
|
||||||
///// </summary>
|
|
||||||
///// <param name="where"></param>
|
|
||||||
///// <returns></returns>
|
|
||||||
//public DocumentContent GetByOne(Expression<Func<DocumentContent, bool>> where)
|
|
||||||
//{
|
|
||||||
// return DataBaseType.MySql.DB().Select<DocumentContent>()
|
|
||||||
// .Where(where).ToOne();
|
|
||||||
//}
|
|
||||||
|
|
||||||
|
|
||||||
///// <summary>
|
|
||||||
///// 获取一条数据
|
|
||||||
///// </summary>
|
|
||||||
///// <param name="where"></param>
|
|
||||||
///// <returns></returns>
|
|
||||||
//public long Count(Expression<Func<DocumentContent, bool>> where)
|
|
||||||
//{
|
|
||||||
// return DataBaseType.MySql.DB().Select<DocumentContent>()
|
|
||||||
// .Where(where).Count();
|
|
||||||
//}
|
|
||||||
|
|
||||||
///// <summary>
|
|
||||||
///// 查询功能
|
|
||||||
///// </summary>
|
|
||||||
///// <param name="where"></param>
|
|
||||||
///// <param name="orderby"></param>
|
|
||||||
///// <returns></returns>
|
|
||||||
//public (List<DocumentContent> list, long count) Query(Expression<Func<DocumentContent, bool>> where,
|
|
||||||
// Expression<Func<DocumentContent, DocumentContent>> orderby = null, PageInfo pageInfo = null)
|
|
||||||
//{
|
|
||||||
// //设置查询条件
|
|
||||||
// var list = DataBaseType.MySql.DB().Select<DocumentContent>()
|
|
||||||
// .Where(where);
|
|
||||||
|
|
||||||
// //设置排序
|
|
||||||
// if (orderby != null) list = list.OrderBy(b => b.CreateDt);
|
|
||||||
|
|
||||||
// var count = list.Count();
|
|
||||||
// //设置分页操作
|
|
||||||
// if (pageInfo != null && pageInfo.IsPaging)
|
|
||||||
// list.Skip(pageInfo.PageIndex * pageInfo.PageSize).Limit(pageInfo.PageSize);
|
|
||||||
|
|
||||||
// //执行查询
|
|
||||||
// return (list.ToList(), count);
|
|
||||||
//}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,15 +0,0 @@
|
|||||||
//using FreeSql.Site.Entity;
|
|
||||||
using FreeSql.Site.Entity;
|
|
||||||
using FreeSql.Site.Entity.Common;
|
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq.Expressions;
|
|
||||||
using System.Text;
|
|
||||||
|
|
||||||
namespace FreeSql.Site.DAL
|
|
||||||
{
|
|
||||||
public class DocumentTypeDAL : BaseDAL<DocumentType>
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,18 +0,0 @@
|
|||||||
<Project Sdk="Microsoft.NET.Sdk">
|
|
||||||
|
|
||||||
<PropertyGroup>
|
|
||||||
<TargetFramework>netcoreapp2.2</TargetFramework>
|
|
||||||
</PropertyGroup>
|
|
||||||
|
|
||||||
<ItemGroup>
|
|
||||||
<PackageReference Include="Microsoft.Extensions.Configuration.FileExtensions" Version="2.1.0" />
|
|
||||||
<PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="2.1.0" />
|
|
||||||
<PackageReference Include="Newtonsoft.Json" Version="12.0.1" />
|
|
||||||
</ItemGroup>
|
|
||||||
|
|
||||||
<ItemGroup>
|
|
||||||
<ProjectReference Include="..\..\..\FreeSql\FreeSql.csproj" />
|
|
||||||
<ProjectReference Include="..\FreeSql.Site.Entity\FreeSql.Site.Entity.csproj" />
|
|
||||||
</ItemGroup>
|
|
||||||
|
|
||||||
</Project>
|
|
@ -1,44 +0,0 @@
|
|||||||
using System.IO;
|
|
||||||
using Microsoft.Extensions.Configuration;
|
|
||||||
using Newtonsoft.Json;
|
|
||||||
|
|
||||||
namespace FreeSql.Site.DAL
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// 配置管理器
|
|
||||||
/// </summary>
|
|
||||||
public static class AppSettingsManager
|
|
||||||
{
|
|
||||||
private static IConfiguration _configuration;
|
|
||||||
|
|
||||||
static AppSettingsManager()
|
|
||||||
{
|
|
||||||
BuildConfiguration();
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void BuildConfiguration()
|
|
||||||
{
|
|
||||||
var builder = new ConfigurationBuilder().SetBasePath(Directory.GetCurrentDirectory())
|
|
||||||
.AddJsonFile("appsettings.json", false).AddJsonFile("appsettings.Development.json", true);
|
|
||||||
_configuration = builder.Build();
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 读取指定节点信息
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="key">节点名称,多节点以:分隔</param>
|
|
||||||
public static string Get(string key)
|
|
||||||
{
|
|
||||||
return _configuration[key];
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 读取指定节点信息
|
|
||||||
/// </summary>
|
|
||||||
public static T Get<T>(string key)
|
|
||||||
{
|
|
||||||
string json = Get(key);
|
|
||||||
return JsonConvert.DeserializeObject<T>(json);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,37 +0,0 @@
|
|||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Text;
|
|
||||||
|
|
||||||
namespace FreeSql.Site.DAL.Helper
|
|
||||||
{
|
|
||||||
public class EnumHelper
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// 枚举类型转换为字符串
|
|
||||||
/// </summary>
|
|
||||||
/// <typeparam name="T"></typeparam>
|
|
||||||
/// <param name="en"></param>
|
|
||||||
/// <returns></returns>
|
|
||||||
public static string EnumConvertToString<T>(T en)
|
|
||||||
{
|
|
||||||
//方法一
|
|
||||||
//return color.ToString();
|
|
||||||
|
|
||||||
//方法二
|
|
||||||
return Enum.GetName(en.GetType(), en);
|
|
||||||
}
|
|
||||||
public static T StringConvertToEnum<T>(string str)
|
|
||||||
{
|
|
||||||
T result = default(T);
|
|
||||||
try
|
|
||||||
{
|
|
||||||
result = (T)Enum.Parse(typeof(T), str);
|
|
||||||
}
|
|
||||||
catch
|
|
||||||
{
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,14 +0,0 @@
|
|||||||
//using FreeSql.Site.Entity;
|
|
||||||
using FreeSql.Site.Entity;
|
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq.Expressions;
|
|
||||||
using System.Text;
|
|
||||||
|
|
||||||
namespace FreeSql.Site.DAL
|
|
||||||
{
|
|
||||||
public class TemplateExampleDAL : BaseDAL<TemplateExample>
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,22 +0,0 @@
|
|||||||
//using FreeSql.DataAnnotations;
|
|
||||||
using FreeSql.DataAnnotations;
|
|
||||||
using System;
|
|
||||||
|
|
||||||
namespace FreeSql.Site.Entity
|
|
||||||
{
|
|
||||||
public class BaseEntity
|
|
||||||
{
|
|
||||||
[Column(IsIdentity = true, IsPrimary = true)]
|
|
||||||
public int ID { get; set; } = 0;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 状态
|
|
||||||
/// </summary>
|
|
||||||
public int Status { get; set; } = 1;
|
|
||||||
|
|
||||||
public DateTime? CreateDt { get; set; } = DateTime.Now;
|
|
||||||
|
|
||||||
public string CreateBy { get; set; } = "admin";
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,34 +0,0 @@
|
|||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Text;
|
|
||||||
|
|
||||||
namespace FreeSql.Site.Entity.Common
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// 列表数据返回对象
|
|
||||||
/// </summary>
|
|
||||||
/// <typeparam name="T"></typeparam>
|
|
||||||
public class DataPage<T>
|
|
||||||
where T : class
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// 返回成功与否
|
|
||||||
/// </summary>
|
|
||||||
public string code { get; set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 如果返回报错,具体报错内容
|
|
||||||
/// </summary>
|
|
||||||
public string msg { get; set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 总计记录行数
|
|
||||||
/// </summary>
|
|
||||||
public long count { get; set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 返回具体的数据
|
|
||||||
/// </summary>
|
|
||||||
public List<T> data { get; set; }
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,43 +0,0 @@
|
|||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Text;
|
|
||||||
|
|
||||||
namespace FreeSql.Site.Entity.Common
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// 列表数据返回对象
|
|
||||||
/// </summary>
|
|
||||||
/// <typeparam name="T"></typeparam>
|
|
||||||
public class PageInfo
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// 排序字段
|
|
||||||
/// </summary>
|
|
||||||
public string Order { get; set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 页码
|
|
||||||
/// </summary>
|
|
||||||
public int PageIndex { get; set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 页记录数
|
|
||||||
/// </summary>
|
|
||||||
public int PageSize { get; set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 排序方式
|
|
||||||
/// </summary>
|
|
||||||
public string Sort { get; set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 总计数量
|
|
||||||
/// </summary>
|
|
||||||
public int Total { get; set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 是否获取总数
|
|
||||||
/// </summary>
|
|
||||||
public bool IsPaging { get; set; }
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,16 +0,0 @@
|
|||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Text;
|
|
||||||
|
|
||||||
namespace FreeSql.Site.Entity.Common
|
|
||||||
{
|
|
||||||
public class TreeNode
|
|
||||||
{
|
|
||||||
public string id { get; set; }
|
|
||||||
|
|
||||||
public string pid { get; set; }
|
|
||||||
|
|
||||||
public string title { get; set; }
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,44 +0,0 @@
|
|||||||
//using FreeSql.DataAnnotations;
|
|
||||||
using FreeSql.DataAnnotations;
|
|
||||||
using System;
|
|
||||||
|
|
||||||
namespace FreeSql.Site.Entity
|
|
||||||
{
|
|
||||||
public class DocumentComment:BaseEntity
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// 功能类型(文章、模板、示例等)
|
|
||||||
/// </summary>
|
|
||||||
public int FunctionType { get; set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 功能ID 文章、模板、示例等
|
|
||||||
/// </summary>
|
|
||||||
public int FunctionID { get; set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 是否匿名访问
|
|
||||||
/// </summary>
|
|
||||||
public int IsAnonymous { get; set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 评论人
|
|
||||||
/// </summary>
|
|
||||||
public string Commentator { get; set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 评论者IP
|
|
||||||
/// </summary>
|
|
||||||
public string CommentatorIp { get; set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 回复评论编号
|
|
||||||
/// </summary>
|
|
||||||
public int ReplyID { get; set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 评论内容
|
|
||||||
/// </summary>
|
|
||||||
public string CommentContent { get; set; }
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,77 +0,0 @@
|
|||||||
//using FreeSql.DataAnnotations;
|
|
||||||
using FreeSql.DataAnnotations;
|
|
||||||
using System;
|
|
||||||
|
|
||||||
namespace FreeSql.Site.Entity
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// 数据库实体
|
|
||||||
/// </summary>
|
|
||||||
public class DocumentContent : BaseEntity
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// 类型编号
|
|
||||||
/// </summary>
|
|
||||||
public int TypeID { get; set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 标题
|
|
||||||
/// </summary>
|
|
||||||
public string DocTitle { get; set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 摘要
|
|
||||||
/// </summary>
|
|
||||||
public string DocAbstract { get; set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 内容来源类型(0 当前记录 1=Url地址
|
|
||||||
/// </summary>
|
|
||||||
public int OriginType { get; set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 来源地址
|
|
||||||
/// </summary>
|
|
||||||
public string OriginUrl { get; set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 编辑器模式 (=0 Markdown =1 HTML编辑器 )
|
|
||||||
/// </summary>
|
|
||||||
public int EditorMode { get; set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 文档内容
|
|
||||||
/// </summary>
|
|
||||||
[Column(DbType = "text")]
|
|
||||||
public string DocContent { get; set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 查看次数
|
|
||||||
/// </summary>
|
|
||||||
public int WatchCount { get; set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Star统计
|
|
||||||
/// </summary>
|
|
||||||
public int StarCount { get; set; }
|
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 修改时间
|
|
||||||
/// </summary>
|
|
||||||
public DateTime? UpdateDt { get; set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 修改人
|
|
||||||
/// </summary>
|
|
||||||
public string UpdateBy { get; set; }
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 返回实体内容
|
|
||||||
/// </summary>
|
|
||||||
public class DocumentContentView : DocumentContent
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,45 +0,0 @@
|
|||||||
//using FreeSql.DataAnnotations;
|
|
||||||
using FreeSql.DataAnnotations;
|
|
||||||
using FreeSql.Site.Entity.Common;
|
|
||||||
using System;
|
|
||||||
|
|
||||||
namespace FreeSql.Site.Entity
|
|
||||||
{
|
|
||||||
public class DocumentType : BaseEntity
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// 类型名称
|
|
||||||
/// </summary>
|
|
||||||
public string TypeName { get; set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 上级类型名称
|
|
||||||
/// </summary>
|
|
||||||
public int? UpID { get; set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 标签
|
|
||||||
/// </summary>
|
|
||||||
public string Tag { get; set; }
|
|
||||||
|
|
||||||
public DateTime? UpdateDt { get; set; }
|
|
||||||
|
|
||||||
public string UpdateBy { get; set; }
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 类型树形结构
|
|
||||||
/// </summary>
|
|
||||||
public class DocumentTypeTreeNode : TreeNode
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// 标签
|
|
||||||
/// </summary>
|
|
||||||
public string tag { get; set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 创建时间
|
|
||||||
/// </summary>
|
|
||||||
public DateTime? createdt { get; set; }
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,11 +0,0 @@
|
|||||||
<Project Sdk="Microsoft.NET.Sdk">
|
|
||||||
|
|
||||||
<PropertyGroup>
|
|
||||||
<TargetFramework>netcoreapp2.2</TargetFramework>
|
|
||||||
</PropertyGroup>
|
|
||||||
|
|
||||||
<ItemGroup>
|
|
||||||
<ProjectReference Include="..\..\..\FreeSql\FreeSql.csproj" />
|
|
||||||
</ItemGroup>
|
|
||||||
|
|
||||||
</Project>
|
|
@ -1,59 +0,0 @@
|
|||||||
using FreeSql.DataAnnotations;
|
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Text;
|
|
||||||
|
|
||||||
namespace FreeSql.Site.Entity
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// 模板示例
|
|
||||||
/// </summary>
|
|
||||||
public class TemplateExample : BaseEntity
|
|
||||||
{
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 模板图片
|
|
||||||
/// </summary>
|
|
||||||
public string TemplateImg { get; set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 模板名称
|
|
||||||
/// </summary>
|
|
||||||
public string TempateName { get; set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 描述
|
|
||||||
/// </summary>
|
|
||||||
public string Describe { get; set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 模板路径
|
|
||||||
/// </summary>
|
|
||||||
public string TemplatePath { get; set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 查看次数
|
|
||||||
/// </summary>
|
|
||||||
public int WatchCount { get; set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 下载统计
|
|
||||||
/// </summary>
|
|
||||||
public int DownloadCount { get; set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Star统计
|
|
||||||
/// </summary>
|
|
||||||
public int StarCount { get; set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 修改时间
|
|
||||||
/// </summary>
|
|
||||||
public DateTime? UpdateDt { get; set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 修改人
|
|
||||||
/// </summary>
|
|
||||||
public string UpdateBy { get; set; }
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,13 +0,0 @@
|
|||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
using Microsoft.AspNetCore.Mvc;
|
|
||||||
|
|
||||||
namespace FreeSql.Site.UI.Admin.Common
|
|
||||||
{
|
|
||||||
public class AdminBaseController : Controller
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,23 +0,0 @@
|
|||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
using FreeSql.Site.Entity;
|
|
||||||
using FreeSql.Site.UI.Admin.Common;
|
|
||||||
using FreeSql.Site.UI.Areas.BBS.Models;
|
|
||||||
using FreeSql.Site.UI.Controllers;
|
|
||||||
using Microsoft.AspNetCore.Mvc;
|
|
||||||
|
|
||||||
namespace FreeSql.Site.UI.Areas.Admin.Controllers
|
|
||||||
{
|
|
||||||
[Area("Admin")]
|
|
||||||
public class BBSController : AdminBaseController
|
|
||||||
{
|
|
||||||
public IActionResult Index()
|
|
||||||
{
|
|
||||||
DocumentContent model = new DocumentContent();
|
|
||||||
return View(model);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,254 +0,0 @@
|
|||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Linq.Expressions;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
using FreeSql.Site.DAL;
|
|
||||||
using FreeSql.Site.Entity;
|
|
||||||
using FreeSql.Site.Entity.Common;
|
|
||||||
using FreeSql.Site.UI.Admin.Common;
|
|
||||||
using FreeSql.Site.UI.Areas.BBS.Models;
|
|
||||||
using FreeSql.Site.UI.Common;
|
|
||||||
using FreeSql.Site.UI.Controllers;
|
|
||||||
using Microsoft.AspNetCore.Http;
|
|
||||||
using Microsoft.AspNetCore.Mvc;
|
|
||||||
using Microsoft.AspNetCore.Mvc.Rendering;
|
|
||||||
|
|
||||||
namespace FreeSql.Site.UI.Areas.Admin.Controllers
|
|
||||||
{
|
|
||||||
[Area("Admin")]
|
|
||||||
public class DocumentController : AdminBaseController
|
|
||||||
{
|
|
||||||
public DocumentTypeDAL DocumentTypeDAL { get; set; }
|
|
||||||
|
|
||||||
public DocumentContentDAL DocumentContentDAL { get; set; }
|
|
||||||
|
|
||||||
public DocumentController()
|
|
||||||
{
|
|
||||||
this.DocumentTypeDAL = new DocumentTypeDAL();
|
|
||||||
this.DocumentContentDAL = new DocumentContentDAL();
|
|
||||||
}
|
|
||||||
|
|
||||||
public IActionResult Index()
|
|
||||||
{
|
|
||||||
DocumentContent model = new DocumentContent();
|
|
||||||
return View(model);
|
|
||||||
}
|
|
||||||
|
|
||||||
#region 文档内容
|
|
||||||
public IActionResult DocContent()
|
|
||||||
{
|
|
||||||
DocumentContent model = new DocumentContent();
|
|
||||||
return View(model);
|
|
||||||
}
|
|
||||||
|
|
||||||
[HttpGet]
|
|
||||||
public IActionResult DocContentList(string searchContent, string seniorQueryJson, int page = 1, int limit = 10)
|
|
||||||
{
|
|
||||||
DocumentContent model = null;
|
|
||||||
if (!string.IsNullOrWhiteSpace(seniorQueryJson))
|
|
||||||
{
|
|
||||||
model = Newtonsoft.Json.JsonConvert.DeserializeObject<DocumentContent>(seniorQueryJson);
|
|
||||||
}
|
|
||||||
Expression<Func<DocumentContent, bool>> predicate = i => 1 == 0;
|
|
||||||
var searchPredicate = PredicateExtensions.True<DocumentContent>();
|
|
||||||
if (model != null)
|
|
||||||
{
|
|
||||||
if (model.TypeID >= 0)
|
|
||||||
searchPredicate = searchPredicate.And(u => u.TypeID == model.TypeID);
|
|
||||||
|
|
||||||
if (!string.IsNullOrEmpty(model.DocTitle))
|
|
||||||
searchPredicate = searchPredicate.And(u => u.DocTitle.IndexOf(model.DocTitle) != -1);
|
|
||||||
}
|
|
||||||
PageInfo pageinfo = new PageInfo() { IsPaging = true, PageIndex = page, PageSize = limit };
|
|
||||||
var contents = DocumentContentDAL.Query(searchPredicate, null, pageinfo);
|
|
||||||
|
|
||||||
return Json(new DataPage<DocumentContent>
|
|
||||||
{
|
|
||||||
code = "0",
|
|
||||||
msg = "",
|
|
||||||
count = contents.count,
|
|
||||||
data = contents.list
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
public ActionResult DocContentEditModule(string id)
|
|
||||||
{
|
|
||||||
ViewBag.DocumentTypeList = DocumentTypeDAL.Query(w => w.Status == 1).list.Select(s => new SelectListItem { Text = s.TypeName, Value = s.ID.ToString() }).ToList();
|
|
||||||
DocumentContent model = new DocumentContent() { OriginType = 0};
|
|
||||||
if (!string.IsNullOrEmpty(id) && id != "0")
|
|
||||||
{
|
|
||||||
int _id = Convert.ToInt32(id);
|
|
||||||
model = DocumentContentDAL.GetByOne(w => w.ID == _id);
|
|
||||||
}
|
|
||||||
return View(model);
|
|
||||||
}
|
|
||||||
|
|
||||||
// POST: Documents/Create
|
|
||||||
[HttpPost]
|
|
||||||
//[ValidateAntiForgeryToken]
|
|
||||||
public ActionResult DocContentCreate([FromBody]DocumentContent model)
|
|
||||||
{
|
|
||||||
var resdata = AutoException.Excute<long>((result) =>
|
|
||||||
{
|
|
||||||
result.Data = DocumentContentDAL.Insert(model);
|
|
||||||
if (result.Data == 0)
|
|
||||||
{
|
|
||||||
throw new Exception("数据新增异常,JSON:" + Newtonsoft.Json.JsonConvert.SerializeObject(model));
|
|
||||||
}
|
|
||||||
}, false);
|
|
||||||
return Json(resdata);
|
|
||||||
}
|
|
||||||
|
|
||||||
// POST: Documents/Create
|
|
||||||
[HttpPost]
|
|
||||||
//[ValidateAntiForgeryToken]
|
|
||||||
public ActionResult DocContentUpdate([FromBody]DocumentContent model)
|
|
||||||
{
|
|
||||||
var resdata = AutoException.Excute<bool>((result) =>
|
|
||||||
{
|
|
||||||
model.UpdateBy = "admin";
|
|
||||||
model.UpdateDt = DateTime.Now;
|
|
||||||
result.Data = DocumentContentDAL.Update(model);
|
|
||||||
if (result.Data == false)
|
|
||||||
{
|
|
||||||
throw new Exception("数据新增异常,JSON:" + Newtonsoft.Json.JsonConvert.SerializeObject(model));
|
|
||||||
}
|
|
||||||
}, false);
|
|
||||||
return Json(resdata);
|
|
||||||
}
|
|
||||||
|
|
||||||
[HttpPost]
|
|
||||||
//[ValidateAntiForgeryToken]
|
|
||||||
public ActionResult DocContentDelete(int id, IFormCollection collection)
|
|
||||||
{
|
|
||||||
var resdata = AutoException.Excute<long>((result) =>
|
|
||||||
{
|
|
||||||
if (!DocumentContentDAL.Delete(id))
|
|
||||||
{
|
|
||||||
throw new Exception("数据删除异常,ID:" + id);
|
|
||||||
}
|
|
||||||
}, false);
|
|
||||||
return Json(resdata);
|
|
||||||
}
|
|
||||||
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
#region 文档分类
|
|
||||||
public IActionResult DocType()
|
|
||||||
{
|
|
||||||
DocumentType model = new DocumentType();
|
|
||||||
|
|
||||||
ViewBag.TypeList = DocumentTypeDAL.Query(w => w.Status == 1).list.Select(s => new DocumentTypeTreeNode
|
|
||||||
{
|
|
||||||
id = s.ID.ToString(),
|
|
||||||
pid = (s.UpID ?? 0).ToString(),
|
|
||||||
title = s.TypeName,
|
|
||||||
tag = s.Tag,
|
|
||||||
createdt = s.CreateDt
|
|
||||||
}).ToList();
|
|
||||||
|
|
||||||
return View(model);
|
|
||||||
}
|
|
||||||
|
|
||||||
[HttpGet]
|
|
||||||
public IActionResult DocTypeList(string searchContent, string seniorQueryJson, int page = 1, int limit = 10)
|
|
||||||
{
|
|
||||||
DocumentType model = null;
|
|
||||||
if (!string.IsNullOrWhiteSpace(seniorQueryJson))
|
|
||||||
{
|
|
||||||
model = Newtonsoft.Json.JsonConvert.DeserializeObject<DocumentType>(seniorQueryJson);
|
|
||||||
}
|
|
||||||
Expression<Func<DocumentType, bool>> predicate = i => 1 == 0;
|
|
||||||
var searchPredicate = PredicateExtensions.True<DocumentType>();
|
|
||||||
if (model != null)
|
|
||||||
{
|
|
||||||
searchPredicate = searchPredicate.And(u => u.Status == 1);
|
|
||||||
}
|
|
||||||
var contents = DocumentTypeDAL.Query(searchPredicate);
|
|
||||||
|
|
||||||
return Json(new DataPage<DocumentType>
|
|
||||||
{
|
|
||||||
code = "0",
|
|
||||||
msg = "",
|
|
||||||
count = contents.count,
|
|
||||||
data = contents.list
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
public ActionResult DocTypeEditModule(string id, bool ischildren)
|
|
||||||
{
|
|
||||||
ViewBag.DocumentTypeList = DocumentTypeDAL.Query(w => w.Status == 1).list.Select(s => new SelectListItem { Text = s.TypeName, Value = s.ID.ToString() }).ToList();
|
|
||||||
|
|
||||||
DocumentType model = new DocumentType();
|
|
||||||
if (ischildren)
|
|
||||||
{
|
|
||||||
if (!string.IsNullOrEmpty(id))
|
|
||||||
{
|
|
||||||
model.UpID = Convert.ToInt32(id);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (!string.IsNullOrEmpty(id))
|
|
||||||
{
|
|
||||||
int _id = Convert.ToInt32(id);
|
|
||||||
model = DocumentTypeDAL.GetByOne(w => w.ID == _id);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return View(model);
|
|
||||||
}
|
|
||||||
|
|
||||||
// POST: Documents/Create
|
|
||||||
[HttpPost]
|
|
||||||
//[ValidateAntiForgeryToken]
|
|
||||||
public ActionResult DocTypeCreate([FromBody]DocumentType model)
|
|
||||||
{
|
|
||||||
var resdata = AutoException.Excute<long>((result) =>
|
|
||||||
{
|
|
||||||
model.CreateBy = "admin";
|
|
||||||
model.CreateDt = DateTime.Now;
|
|
||||||
result.Data = DocumentTypeDAL.Insert(model);
|
|
||||||
if (result.Data == 0)
|
|
||||||
{
|
|
||||||
throw new Exception("数据新增异常,JSON:" + Newtonsoft.Json.JsonConvert.SerializeObject(model));
|
|
||||||
}
|
|
||||||
}, false);
|
|
||||||
return Json(resdata);
|
|
||||||
}
|
|
||||||
|
|
||||||
// POST: Documents/Create
|
|
||||||
[HttpPost]
|
|
||||||
//[ValidateAntiForgeryToken]
|
|
||||||
public ActionResult DocTypeUpdate([FromBody]DocumentType model)
|
|
||||||
{
|
|
||||||
var resdata = AutoException.Excute<bool>((result) =>
|
|
||||||
{
|
|
||||||
model.UpdateBy = "admin";
|
|
||||||
model.UpdateDt = DateTime.Now;
|
|
||||||
result.Data = DocumentTypeDAL.Update(model);
|
|
||||||
if (result.Data == false)
|
|
||||||
{
|
|
||||||
throw new Exception("数据新增异常,JSON:" + Newtonsoft.Json.JsonConvert.SerializeObject(model));
|
|
||||||
}
|
|
||||||
}, false);
|
|
||||||
return Json(resdata);
|
|
||||||
}
|
|
||||||
|
|
||||||
[HttpPost]
|
|
||||||
//[ValidateAntiForgeryToken]
|
|
||||||
public ActionResult DocTypeDelete(int id, IFormCollection collection)
|
|
||||||
{
|
|
||||||
var resdata = AutoException.Excute<long>((result) =>
|
|
||||||
{
|
|
||||||
if (!DocumentTypeDAL.Delete(id))
|
|
||||||
{
|
|
||||||
throw new Exception("数据删除异常,ID:" + id);
|
|
||||||
}
|
|
||||||
}, false);
|
|
||||||
return Json(resdata);
|
|
||||||
}
|
|
||||||
|
|
||||||
#endregion
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,23 +0,0 @@
|
|||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
using FreeSql.Site.Entity;
|
|
||||||
using FreeSql.Site.UI.Admin.Common;
|
|
||||||
using FreeSql.Site.UI.Areas.BBS.Models;
|
|
||||||
using FreeSql.Site.UI.Controllers;
|
|
||||||
using Microsoft.AspNetCore.Mvc;
|
|
||||||
|
|
||||||
namespace FreeSql.Site.UI.Areas.Admin.Controllers
|
|
||||||
{
|
|
||||||
[Area("Admin")]
|
|
||||||
public class SystemController : AdminBaseController
|
|
||||||
{
|
|
||||||
public IActionResult Setting()
|
|
||||||
{
|
|
||||||
DocumentContent model = new DocumentContent();
|
|
||||||
return View(model);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,23 +0,0 @@
|
|||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
using FreeSql.Site.Entity;
|
|
||||||
using FreeSql.Site.UI.Admin.Common;
|
|
||||||
using FreeSql.Site.UI.Areas.BBS.Models;
|
|
||||||
using FreeSql.Site.UI.Controllers;
|
|
||||||
using Microsoft.AspNetCore.Mvc;
|
|
||||||
|
|
||||||
namespace FreeSql.Site.UI.Areas.Admin.Controllers
|
|
||||||
{
|
|
||||||
[Area("Admin")]
|
|
||||||
public class TemplateController : AdminBaseController
|
|
||||||
{
|
|
||||||
public IActionResult Index()
|
|
||||||
{
|
|
||||||
DocumentContent model = new DocumentContent();
|
|
||||||
return View(model);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,14 +0,0 @@
|
|||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
|
|
||||||
namespace FreeSql.Site.UI.Areas.Admin.Models
|
|
||||||
{
|
|
||||||
public class DocumentContentModel
|
|
||||||
{
|
|
||||||
public int OrderBy { get; set; }
|
|
||||||
|
|
||||||
public int ContentID { get; set; }
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,14 +0,0 @@
|
|||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
|
|
||||||
namespace FreeSql.Site.UI.Areas.Admin.Models
|
|
||||||
{
|
|
||||||
public class DocumentTypeModel
|
|
||||||
{
|
|
||||||
public int OrderBy { get; set; }
|
|
||||||
|
|
||||||
public int ContentID { get; set; }
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,95 +0,0 @@
|
|||||||
<!DOCTYPE html>
|
|
||||||
<html>
|
|
||||||
<head>
|
|
||||||
<meta charset="utf-8" />
|
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
||||||
<title>@ViewData["Title"]</title>
|
|
||||||
|
|
||||||
<environment include="Development">
|
|
||||||
<link href="~/layui/css/layui.css" rel="stylesheet" />
|
|
||||||
<link href="~/layui/lay/modules/preview.css" rel="stylesheet" />
|
|
||||||
<link href="~/css/admin.css" rel="stylesheet" />
|
|
||||||
<script src="~/lib/jquery/dist/jquery.js"></script>
|
|
||||||
<script src="~/js/common.js"></script>
|
|
||||||
|
|
||||||
<!-- 页面markdown解析成HTML需要的js -->
|
|
||||||
<script src="https://cdn.jsdelivr.net/npm/marked/marked.min.js"></script>
|
|
||||||
<script src="https://cdn.bootcss.com/highlight.js/9.13.1/highlight.min.js"></script>
|
|
||||||
<script src="~/layui/lay/modules/layer.js"></script>
|
|
||||||
<script src="~/layui/layui.js"></script>
|
|
||||||
</environment>
|
|
||||||
<environment exclude="Development">
|
|
||||||
<link rel="stylesheet" href="https://ajax.aspnetcdn.com/ajax/bootstrap/3.3.7/css/bootstrap.min.css"
|
|
||||||
asp-fallback-href="~/lib/bootstrap/dist/css/bootstrap.min.css"
|
|
||||||
asp-fallback-test-class="sr-only" asp-fallback-test-property="position" asp-fallback-test-value="absolute" />
|
|
||||||
</environment>
|
|
||||||
</head>
|
|
||||||
<body class="layui-layout-body" id="LAY_home" style="background-color: #fff;" data-date="12-27">
|
|
||||||
<div class="layui-layout layui-layout-admin">
|
|
||||||
<div class="layui-header">
|
|
||||||
<div class="layui-logo"><span style="font-size:25px; letter-spacing:1px; color:#fff;">FreeSql</span></div>
|
|
||||||
<!-- 头部区域(可配合layui已有的水平导航) -->
|
|
||||||
<ul class="layui-nav layui-layout-left">
|
|
||||||
<li class="layui-nav-item active"><a href="/Admin/Document" target="_self">文档管理</a></li>
|
|
||||||
<li class="layui-nav-item"><a href="/Admin/BBS" target="_self">论坛管理</a></li>
|
|
||||||
<li class="layui-nav-item"><a href="/Admin/Template" target="_self">模板管理</a></li>
|
|
||||||
</ul>
|
|
||||||
<ul class="layui-nav layui-layout-right">
|
|
||||||
<li class="layui-nav-item">
|
|
||||||
<a href="javascript:;">
|
|
||||||
<img src="#" class="layui-nav-img">
|
|
||||||
FreeSql
|
|
||||||
</a>
|
|
||||||
<dl class="layui-nav-child">
|
|
||||||
<dd><a href="">基本资料</a></dd>
|
|
||||||
<dd><a href="">安全设置</a></dd>
|
|
||||||
</dl>
|
|
||||||
</li>
|
|
||||||
<li class="layui-nav-item"><a href="">退出</a></li>
|
|
||||||
</ul>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<partial name="_CookieConsentPartial" />
|
|
||||||
@RenderBody()
|
|
||||||
|
|
||||||
<div class="layui-footer footer">
|
|
||||||
<!-- 底部固定区域 -->
|
|
||||||
© FreeSql.com - 底部固定区域
|
|
||||||
</div>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
<environment include="Development">
|
|
||||||
@*<script src="~/js/site.js" asp-append-version="true"></script>*@
|
|
||||||
<script>
|
|
||||||
layui.config({
|
|
||||||
base: '/layui/lay/modules/'
|
|
||||||
, version: '31111'
|
|
||||||
}).use('global');
|
|
||||||
|
|
||||||
window.global = {
|
|
||||||
preview: function () {
|
|
||||||
var preview = document.getElementById('LAY_preview');
|
|
||||||
return preview ? preview.innerHTML : '';
|
|
||||||
}()
|
|
||||||
};
|
|
||||||
</script>
|
|
||||||
</environment>
|
|
||||||
<environment exclude="Development">
|
|
||||||
<script src="https://ajax.aspnetcdn.com/ajax/jquery/jquery-3.3.1.min.js"
|
|
||||||
asp-fallback-src="~/lib/jquery/dist/jquery.min.js"
|
|
||||||
asp-fallback-test="window.jQuery"
|
|
||||||
crossorigin="anonymous"
|
|
||||||
integrity="sha384-tsQFqpEReu7ZLhBV2VZlAu7zcOV+rXbYlF2cqB8txI/8aZajjp4Bqd+V6D5IgvKT">
|
|
||||||
</script>
|
|
||||||
<script src="https://ajax.aspnetcdn.com/ajax/bootstrap/3.3.7/bootstrap.min.js"
|
|
||||||
asp-fallback-src="~/lib/bootstrap/dist/js/bootstrap.min.js"
|
|
||||||
asp-fallback-test="window.jQuery && window.jQuery.fn && window.jQuery.fn.modal"
|
|
||||||
crossorigin="anonymous"
|
|
||||||
integrity="sha384-Tc5IQib027qvyjSMfHjOMaLkfuWVxZxUPnCJA7l2mCWNIpG9mGCD8wGNIcPD7Txa">
|
|
||||||
</script>
|
|
||||||
<script src="~/js/site.min.js" asp-append-version="true"></script>
|
|
||||||
</environment>
|
|
||||||
|
|
||||||
@RenderSection("Scripts", required: false)
|
|
||||||
</body>
|
|
||||||
</html>
|
|
@ -1,61 +0,0 @@
|
|||||||
@{
|
|
||||||
ViewBag.Title = "";
|
|
||||||
Layout = "~/Areas/Admin/Shared/_Layout.cshtml";
|
|
||||||
}
|
|
||||||
<div class="layui-side layui-bg-black">
|
|
||||||
<div class="layui-side-scroll">
|
|
||||||
<!-- 左侧导航区域(可配合layui已有的垂直导航) -->
|
|
||||||
<ul class="layui-nav layui-nav-tree" lay-filter="test">
|
|
||||||
<li class="layui-nav-item layui-nav-itemed">
|
|
||||||
<a class="" href="javascript:;">论坛管理</a>
|
|
||||||
<dl class="layui-nav-child menu-item">
|
|
||||||
<dd><a href="javascript:void(0);" datajson="{}" path="/Admin/BBS/Index">论坛文章</a></dd>
|
|
||||||
<dd><a href="javascript:void(0);" datajson="{}" path="/Admin/BBS/Index">论坛标签</a></dd>
|
|
||||||
<dd><a href="javascript:void(0);" datajson="{}" path="/Admin/BBS/Index">论坛内容分析</a></dd>
|
|
||||||
<dd><a href="/BBS/BBS/Index" target="_blank">查看论坛</a></dd>
|
|
||||||
</dl>
|
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="layui-body">
|
|
||||||
<!-- 内容主体区域 -->
|
|
||||||
<div style="padding: 15px;" id="page_content">
|
|
||||||
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
var showLoading = function (obj) {
|
|
||||||
|
|
||||||
var index = layer.msg(obj.msg, {
|
|
||||||
icon: 16,
|
|
||||||
shade: 0.1,
|
|
||||||
shadeClose: false,
|
|
||||||
});
|
|
||||||
return index;
|
|
||||||
};
|
|
||||||
|
|
||||||
var closeLoading = function (index) {
|
|
||||||
layer.close(index);
|
|
||||||
};
|
|
||||||
|
|
||||||
$(".menu-item>dd>a").click(function () {
|
|
||||||
var path_item = $(this).attr("path");
|
|
||||||
var path_json = $(this).attr("datajson");
|
|
||||||
|
|
||||||
var index = showLoading({ msg: "数据加载中......" });
|
|
||||||
$("#page_content").load(path_item, $.parseJSON(path_json), function () {
|
|
||||||
//初始化绑定页面的时间,例如时间控件
|
|
||||||
closeLoading(index);
|
|
||||||
index = -1;
|
|
||||||
});
|
|
||||||
|
|
||||||
//如果出现长时间未关闭,定时关闭loading
|
|
||||||
setTimeout(function () {
|
|
||||||
if (index >= 0) closeLoading(index);
|
|
||||||
}, 5000);
|
|
||||||
});
|
|
||||||
|
|
||||||
</script>
|
|
@ -1,225 +0,0 @@
|
|||||||
|
|
||||||
@{
|
|
||||||
ViewBag.Title = ".NET文档园 .NET开源ORM - 首页";
|
|
||||||
}
|
|
||||||
@using FreeSql.Site.UI.Areas.BBS.Models;
|
|
||||||
<script>
|
|
||||||
var dialog_Paramters = { height: 660, width: 1100 };
|
|
||||||
</script>
|
|
||||||
<style>
|
|
||||||
.layui-table, .layui-table-view {
|
|
||||||
margin: 0;
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
<table class="layui-table" id="test" lay-filter="test"></table>
|
|
||||||
|
|
||||||
<script type="text/html" id="docContentEdit">
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<script type="text/html" id="toolbarDemo">
|
|
||||||
<div class="layui-btn-container">
|
|
||||||
<button class="layui-btn layui-btn-sm" lay-event="add">添加</button>
|
|
||||||
@*<button class="layui-btn layui-btn-sm" lay-event="delete">删除</button>
|
|
||||||
<button class="layui-btn layui-btn-sm" lay-event="update">编辑</button>*@
|
|
||||||
<div style="float:right;border:0px solid red;">
|
|
||||||
<input type="text" name="search_txt" lay-verify="title" autocomplete="off" placeholder="标题" class="layui-input" style="height: 30px;width:160px;float:left;">
|
|
||||||
<a href="#" style="line-height:30px;margin-left:8px;">高级查询</a>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<script type="text/html" id="barDemo">
|
|
||||||
<a class="layui-btn layui-btn-xs" lay-event="edit">编辑</a>
|
|
||||||
<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</a>
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
var contentEdit;
|
|
||||||
layui.use(['layer', 'laymd', 'form', 'table'], function () {
|
|
||||||
var table = layui.table;
|
|
||||||
var form = layui.form
|
|
||||||
, layer = layui.layer, laymd = layui.laymd;
|
|
||||||
|
|
||||||
var loadMarkDown = function () {
|
|
||||||
//实例化编辑器,可以多个实例
|
|
||||||
var md = laymd.init('DocContent', {});
|
|
||||||
//内容改变事件
|
|
||||||
md.on('change', function () {
|
|
||||||
//这里借用marked.js解析效率比HyperDown快,用户可自行找解析器
|
|
||||||
this.setPreview(marked(this.getText()));
|
|
||||||
});
|
|
||||||
//初始化数据预览
|
|
||||||
md.do('change');
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
table.render({
|
|
||||||
elem: '#test'
|
|
||||||
, url: '/Admin/Document/DocContentList'
|
|
||||||
, where: { searchContent: '', seniorQueryJson: "" }
|
|
||||||
, toolbar: '#toolbarDemo'
|
|
||||||
, title: '文档列表'
|
|
||||||
, cols: [[
|
|
||||||
{ type: 'checkbox', fixed: 'left' }
|
|
||||||
, { field: 'ID', title: 'ID', width: 80, fixed: 'left', unresize: true, sort: true }
|
|
||||||
, { field: 'DocTitle', title: '标题', edit: 'text' }
|
|
||||||
, { field: 'Status', title: '状态', width: 80, edit: 'text', sort: true }
|
|
||||||
, { field: 'WatchCount', title: '阅读量市', width: 100 }
|
|
||||||
, { field: 'StarCount', title: '获赞数', width: 100 }
|
|
||||||
, { field: 'CreateDt', title: '创建时间', width: 160, sort: true }
|
|
||||||
, { field: 'UpdateDt', title: '修改时间', width: 160 }
|
|
||||||
, { fixed: 'right', title: '操作', toolbar: '#barDemo', width: 150 }
|
|
||||||
]]
|
|
||||||
, page: true
|
|
||||||
, id: 'docContentTable'
|
|
||||||
});
|
|
||||||
|
|
||||||
var reloadTable = function () {
|
|
||||||
//执行重载
|
|
||||||
table.reload('docContentTable', {
|
|
||||||
page: {
|
|
||||||
curr: 1 //重新从第 1 页开始
|
|
||||||
}, where: { searchContent: $("input[type=search_txt]").val(), seniorQueryJson: "" }
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
var deleteObj = function (removeRowDatas) {
|
|
||||||
layer.confirm('确定要删除吗?', function (index) {
|
|
||||||
//调用删除
|
|
||||||
$.ajax({
|
|
||||||
type: "POST",
|
|
||||||
url: "/Admin/Document/DocContentDelete",
|
|
||||||
data: { id: rowid },
|
|
||||||
dataType: "html",
|
|
||||||
success: function (data) {
|
|
||||||
obj.del();
|
|
||||||
layer.close(index);
|
|
||||||
},
|
|
||||||
error: function () {
|
|
||||||
layer.close(index);
|
|
||||||
layer.alert("删除失败!");
|
|
||||||
}
|
|
||||||
});
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
//监听事件
|
|
||||||
table.on('toolbar(test)', function (obj) {
|
|
||||||
var checkStatus = table.checkStatus(obj.config.id);
|
|
||||||
switch (obj.event) {
|
|
||||||
case 'add':
|
|
||||||
var options = {
|
|
||||||
url: "/Admin/Document/DocContentEditModule", paramters: { id: "0" },
|
|
||||||
title: "新增文档",
|
|
||||||
area: ['1100px', '660px'],
|
|
||||||
submit: {
|
|
||||||
url: "/Admin/Document/DocContentCreate",
|
|
||||||
},
|
|
||||||
elmid: "docContentEdit",
|
|
||||||
callback: reloadTable,
|
|
||||||
loadBefore: function () {
|
|
||||||
//监听指定开关
|
|
||||||
form.on('switch(switchTest)', function (data) {
|
|
||||||
if (this.checked) {
|
|
||||||
$("#OriginUrlArea").hide();
|
|
||||||
$("#DocContentArea").show();
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
$("#OriginUrlArea").show();
|
|
||||||
$("#DocContentArea").hide();
|
|
||||||
|
|
||||||
}
|
|
||||||
});
|
|
||||||
//contentEdit = editormd("md_DocContent", {
|
|
||||||
// width: "96%",
|
|
||||||
// height: 640,
|
|
||||||
// syncScrolling: "single",
|
|
||||||
// path: "../../lib/editormd/lib/"
|
|
||||||
//});
|
|
||||||
loadMarkDown();
|
|
||||||
},
|
|
||||||
submitBefore: function (data) {
|
|
||||||
data.field.OriginType = data.field.OriginType == "on" ? 1 : 0;
|
|
||||||
return data;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
freejs.dialogWindow.create(options, form);
|
|
||||||
break;
|
|
||||||
case 'delete':
|
|
||||||
var data = checkStatus.data;
|
|
||||||
deleteObj(data);
|
|
||||||
break;
|
|
||||||
case 'update':
|
|
||||||
layer.msg('编辑');
|
|
||||||
break;
|
|
||||||
};
|
|
||||||
});
|
|
||||||
|
|
||||||
//监听行工具事件
|
|
||||||
table.on('tool(test)', function (obj) {
|
|
||||||
var data = obj.data;
|
|
||||||
if (obj.event === 'del') {
|
|
||||||
deleteObj(obj.data);
|
|
||||||
layer.confirm('确定要删除吗?', function (index) {
|
|
||||||
//调用删除
|
|
||||||
$.ajax({
|
|
||||||
type: "POST",
|
|
||||||
url: "/Admin/Document/DocContentDelete",
|
|
||||||
data: { id: data.ID },
|
|
||||||
dataType: "html",
|
|
||||||
success: function (data) {
|
|
||||||
obj.del();
|
|
||||||
layer.close(index);
|
|
||||||
},
|
|
||||||
error: function () {
|
|
||||||
layer.close(index);
|
|
||||||
layer.alert("删除失败!");
|
|
||||||
}
|
|
||||||
});
|
|
||||||
});
|
|
||||||
} else if (obj.event === 'edit') {
|
|
||||||
var options = {
|
|
||||||
url: "/Admin/Document/DocContentEditModule", paramters: { id: data.ID },
|
|
||||||
title: "编辑文档",
|
|
||||||
area: ['1100px', '660px'],
|
|
||||||
submit: {
|
|
||||||
url: "/Admin/Document/DocContentUpdate",
|
|
||||||
},
|
|
||||||
elmid: "docContentEdit",
|
|
||||||
callback: reloadTable,
|
|
||||||
loadBefore: function () {
|
|
||||||
//监听指定开关
|
|
||||||
form.on('switch(switchTest)', function (data) {
|
|
||||||
if (this.checked) {
|
|
||||||
$("#OriginUrlArea").hide();
|
|
||||||
$("#DocContentArea").show();
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
$("#OriginUrlArea").show();
|
|
||||||
$("#DocContentArea").hide();
|
|
||||||
|
|
||||||
}
|
|
||||||
});
|
|
||||||
//contentEdit = editormd("md_DocContent", {
|
|
||||||
// width: "96%",
|
|
||||||
// height: 640,
|
|
||||||
// syncScrolling: "single",
|
|
||||||
// path: "../../lib/editormd/lib/"
|
|
||||||
//});
|
|
||||||
loadMarkDown();
|
|
||||||
},
|
|
||||||
submitBefore: function (data) {
|
|
||||||
var _origintype = $(".layui-tab-title").find('.layui-this').attr("origintype");
|
|
||||||
data.field.OriginType = _origintype;
|
|
||||||
return data;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
freejs.dialogWindow.create(options, form);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
$(document).on('click', '#btnSubmit', function () {
|
|
||||||
layer.msg('响应点击事件');
|
|
||||||
});
|
|
||||||
});
|
|
||||||
</script>
|
|
@ -1,82 +0,0 @@
|
|||||||
@using FreeSql.Site.Entity;
|
|
||||||
@model FreeSql.Site.Entity.DocumentContent
|
|
||||||
|
|
||||||
<form class="layui-form" action="" id="frm_DocContentEdit">
|
|
||||||
<div class="form-module-content">
|
|
||||||
<div class="layui-form-item">
|
|
||||||
<label class="layui-form-label">文章分类 </label>
|
|
||||||
<div class="layui-input-block">
|
|
||||||
@Html.HiddenFor(m => m.ID)
|
|
||||||
@Html.HiddenFor(m => m.OriginType)
|
|
||||||
@Html.HiddenFor(m => m.WatchCount)
|
|
||||||
@Html.HiddenFor(m => m.StarCount)
|
|
||||||
@Html.HiddenFor(m => m.CreateBy)
|
|
||||||
@Html.HiddenFor(m => m.CreateDt)
|
|
||||||
@Html.DropDownList("TypeID", ViewBag.DocumentTypeList as List<SelectListItem>, "", new Dictionary<string, object> { { "class", "plate_text" } })
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="layui-form-item">
|
|
||||||
<label class="layui-form-label">文章标题</label>
|
|
||||||
<div class="layui-input-block">
|
|
||||||
@Html.TextBoxFor(m => m.DocTitle, "", new Dictionary<string, object> { { "autocomplete", "off" }, { "class", "layui-input " }, { "lay-verify", "title" }, { "placeholder", "请输入标题" } })
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="layui-form-item">
|
|
||||||
<label class="layui-form-label">摘要</label>
|
|
||||||
<div class="layui-input-block">
|
|
||||||
@Html.TextBoxFor(m => m.DocAbstract, "", new Dictionary<string, object> { { "autocomplete", "off" }, { "class", "layui-input " }, { "lay-verify", "title" }, { "placeholder", "请输入摘要" } })
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
@*<div class="layui-form-item">
|
|
||||||
<label class="layui-form-label">文章分类</label>
|
|
||||||
<div class="layui-input-block">
|
|
||||||
<input type="checkbox" name="like[write]" title="写作">
|
|
||||||
<input type="checkbox" name="like[read]" title="阅读">
|
|
||||||
<input type="checkbox" name="like[daze]" title="发呆">
|
|
||||||
</div>
|
|
||||||
</div>*@
|
|
||||||
|
|
||||||
<div class="layui-form-item">
|
|
||||||
<label class="layui-form-label">状态</label>
|
|
||||||
<div class="layui-input-block">
|
|
||||||
<input type="radio" name="status" value="1" title="启用" checked="">
|
|
||||||
<input type="radio" name="status" value="0" title="关闭">
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
@*<div class="layui-form-item">
|
|
||||||
<label class="layui-form-label">来源类型</label>
|
|
||||||
<div class="layui-input-block">
|
|
||||||
<input type="checkbox" id="OriginType" @(Model.OriginType == 1 ? "checked=''" : "") name="OriginType" lay-skin="switch" lay-filter="switchTest" lay-text="当前内容|URL地址">
|
|
||||||
</div>
|
|
||||||
</div>*@
|
|
||||||
|
|
||||||
<div class="layui-tab">
|
|
||||||
<ul class="layui-tab-title">
|
|
||||||
<li class=' @(Model.OriginType == 1 ? "" : "layui-this")' origintype="0">自有内容</li>
|
|
||||||
<li class=' @(Model.OriginType == 1 ? "layui-this" : "")' origintype="1">外部来源</li>
|
|
||||||
</ul>
|
|
||||||
<div class="layui-tab-content">
|
|
||||||
<div class='layui-tab-item @(Model.OriginType == 1 ? "" : "layui-show")'>
|
|
||||||
<div class="layui-form-item layui-form-text" id="DocContentArea">
|
|
||||||
<div id="DocContent">@Model.DocContent</div>
|
|
||||||
@*@Html.TextAreaFor(m => m.DocContent, new Dictionary<string, object> { { "autocomplete", "off" }, { "placeholder", "请输入内容" } })*@
|
|
||||||
@*<textarea style="display:none;" placeholder="请输入内容" name="DocContent"></textarea>*@
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class='layui-tab-item @(Model.OriginType == 1 ? "layui-show" : "")'>
|
|
||||||
<div class="layui-form-item" id="OriginUrlArea">
|
|
||||||
<label class="layui-form-label">外部来源</label>
|
|
||||||
<div class="layui-input-block">
|
|
||||||
@Html.TextBoxFor(m => m.OriginUrl, "", new Dictionary<string, object> { { "autocomplete", "off" }, { "class", "layui-input " }, { "lay-verify", "title" }, { "placeholder", "请输入标题" } })
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
@*<div class="form-module-footer">
|
|
||||||
<button class="layui-btn" lay-submit lay-filter="formDemo">立即提交</button>
|
|
||||||
</div>*@
|
|
||||||
</form>
|
|
@ -1,163 +0,0 @@
|
|||||||
@{
|
|
||||||
ViewBag.Title = "";
|
|
||||||
|
|
||||||
//Layout = "~/Areas/Admin/Shared/_Layout.cshtml";
|
|
||||||
}
|
|
||||||
<style>
|
|
||||||
.hide {
|
|
||||||
display: none
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
<script>
|
|
||||||
var dialog_Paramters = { height: 460, width: 600 };
|
|
||||||
</script>
|
|
||||||
<button class="layui-btn layui-btn-sm down-up-all" expandStatus="down">全部收起/展开</button>
|
|
||||||
<button class="layui-btn layui-btn-sm get-checked">获取选中</button>
|
|
||||||
|
|
||||||
<table class="layui-table layui-form" id="doctype-tree-table"></table>
|
|
||||||
|
|
||||||
<script type="text/html" id="docTypeEdit">
|
|
||||||
</script>
|
|
||||||
|
|
||||||
|
|
||||||
<script type="text/javascript">
|
|
||||||
layui.use(['treetable', 'form'], function () {
|
|
||||||
var data = @Html.Raw(Html.ToJson(ViewBag.TypeList as List<DocumentTypeTreeNode>));
|
|
||||||
|
|
||||||
var o = layui.$, treetable = layui.treetable;
|
|
||||||
var form = layui.form, layer = layui.layer;
|
|
||||||
var loadTreeTable = function () {
|
|
||||||
treetable.render({
|
|
||||||
elem: '#doctype-tree-table',
|
|
||||||
data: data,
|
|
||||||
field: 'title',
|
|
||||||
is_checkbox: true,
|
|
||||||
checked: [1, 2, 3, 4],
|
|
||||||
/*icon_val: {
|
|
||||||
open: "",
|
|
||||||
close: ""
|
|
||||||
},
|
|
||||||
space: 4,*/
|
|
||||||
cols: [
|
|
||||||
{
|
|
||||||
field: 'title',
|
|
||||||
title: '标题',
|
|
||||||
width: '45%',
|
|
||||||
template: function (item) {
|
|
||||||
if (item.level == 1) {
|
|
||||||
return '<span style="color:red;">' + item.title + '</span>';
|
|
||||||
}
|
|
||||||
if (item.level == 2) {
|
|
||||||
return '<span style="color:green;">' + item.title + '</span>';
|
|
||||||
}
|
|
||||||
return item.title;
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: '标签',
|
|
||||||
width: '10%',
|
|
||||||
template: function (item) {
|
|
||||||
return item.tag || "";//'<input type="checkbox" lay-skin="switch" lay-filter="status" lay-text="开启|关闭">';
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: '创建时间',
|
|
||||||
width: '20%',
|
|
||||||
template: function (item) {
|
|
||||||
return (item.createdt || "").replace('T', ' ') || "";//'<input type="checkbox" lay-skin="switch" lay-filter="status" lay-text="开启|关闭">';
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
field: 'actions',
|
|
||||||
title: '操作',
|
|
||||||
width: '20%',
|
|
||||||
template: function (item) {
|
|
||||||
var tem = [];
|
|
||||||
tem.push('<button class="layui-btn layui-btn-xs layui-btn-normal" lay-filter="add">添加子级</button>');
|
|
||||||
tem.push('<button class="layui-btn layui-btn-xs" lay-filter="edit">编辑</button>');
|
|
||||||
tem.push('<button class="layui-btn layui-btn-xs" lay-filter="delete">删除</button>');
|
|
||||||
return tem.join(' ')
|
|
||||||
},
|
|
||||||
},
|
|
||||||
]
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
loadTreeTable();
|
|
||||||
|
|
||||||
var reloadTable = function () {
|
|
||||||
//执行重载
|
|
||||||
//loadTreeTable();
|
|
||||||
//layer.msg('树的刷新功能暂未实现');
|
|
||||||
var options = {
|
|
||||||
url: "/Admin/Document/DocType", paramters: {}
|
|
||||||
};
|
|
||||||
freejs.loadHtml(options);
|
|
||||||
};
|
|
||||||
|
|
||||||
treetable.on('treetable(add)', function (data) {
|
|
||||||
var options = {
|
|
||||||
url: "/Admin/Document/DocTypeEditModule", paramters: { id: data.item.id, ischildren: true },
|
|
||||||
title: "新增分类",
|
|
||||||
area: ['600px', '460px'],
|
|
||||||
submit: {
|
|
||||||
url: "/Admin/Document/DocTypeCreate",
|
|
||||||
},
|
|
||||||
elmid:"docTypeEdit",
|
|
||||||
callback: reloadTable
|
|
||||||
};
|
|
||||||
freejs.dialogWindow.create(options, form);
|
|
||||||
console.log(data);
|
|
||||||
})
|
|
||||||
|
|
||||||
treetable.on('treetable(edit)', function (data) {
|
|
||||||
layer.msg('编辑操作');
|
|
||||||
var options = {
|
|
||||||
url: "/Admin/Document/DocTypeEditModule", paramters: { id: data.item.id, ischildren: false },
|
|
||||||
title: "编辑分类",
|
|
||||||
area: ['600px', '460px'],
|
|
||||||
submit: {
|
|
||||||
url: "/Admin/Document/DocTypeUpdate",
|
|
||||||
},
|
|
||||||
elmid: "docTypeEdit",
|
|
||||||
callback: reloadTable
|
|
||||||
};
|
|
||||||
freejs.dialogWindow.create(options, form);
|
|
||||||
});
|
|
||||||
|
|
||||||
|
|
||||||
treetable.on('treetable(delete)', function (data) {
|
|
||||||
layer.confirm('确定要删除吗?', function (index) {
|
|
||||||
//调用删除
|
|
||||||
$.ajax({
|
|
||||||
type: "POST",
|
|
||||||
url: "/Admin/Document/DocTypeDelete",
|
|
||||||
data: { id: data.item.id },
|
|
||||||
dataType: "html",
|
|
||||||
success: function (data) {
|
|
||||||
layer.close(index);
|
|
||||||
},
|
|
||||||
error: function () {
|
|
||||||
layer.close(index);
|
|
||||||
layer.alert("删除失败!");
|
|
||||||
}
|
|
||||||
});
|
|
||||||
});
|
|
||||||
})
|
|
||||||
|
|
||||||
o('.down-up-all').click(function () {
|
|
||||||
var expandStatus = o(this).attr("expandStatus");
|
|
||||||
expandStatus == "down" ? treetable.all('up') : treetable.all('down');
|
|
||||||
expandStatus == "down" ? o(this).attr('expandStatus', 'up') : o(this).attr('expandStatus', 'down');
|
|
||||||
})
|
|
||||||
|
|
||||||
o('.get-checked').click(function () {
|
|
||||||
layer.alert(JSON.stringify(treetable.all('checked')));
|
|
||||||
})
|
|
||||||
|
|
||||||
form.on('switch(status)', function (data) {
|
|
||||||
layer.msg('监听状态操作');
|
|
||||||
console.log(data);
|
|
||||||
})
|
|
||||||
});
|
|
||||||
</script>
|
|
@ -1,39 +0,0 @@
|
|||||||
@using FreeSql.Site.Entity;
|
|
||||||
@model FreeSql.Site.Entity.DocumentType
|
|
||||||
|
|
||||||
<form class="layui-form" action="" id="frm_DocTypeEdit">
|
|
||||||
@Html.HiddenFor(m => m.ID)
|
|
||||||
@Html.HiddenFor(m => m.CreateBy)
|
|
||||||
@Html.HiddenFor(m => m.CreateDt)
|
|
||||||
<div class="form-module-content">
|
|
||||||
<div class="layui-form-item">
|
|
||||||
<label class="layui-form-label">上级分类</label>
|
|
||||||
<div class="layui-input-block">
|
|
||||||
@Html.DropDownList("UpID", ViewBag.DocumentTypeList as List<SelectListItem>, "", new Dictionary<string, object> { { "class", "plate_text" } })
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="layui-form-item">
|
|
||||||
<label class="layui-form-label">分类名称</label>
|
|
||||||
<div class="layui-input-block">
|
|
||||||
@Html.TextBoxFor(m => m.TypeName, "", new Dictionary<string, object> { { "autocomplete", "off" }, { "class", "layui-input " }, { "lay-verify", "title" }, { "placeholder", "请输入标题" } })
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="layui-form-item">
|
|
||||||
<label class="layui-form-label">标签</label>
|
|
||||||
<div class="layui-input-block">
|
|
||||||
@Html.TextBoxFor(m => m.Tag, "", new Dictionary<string, object> { { "autocomplete", "off" }, { "class", "layui-input " }, { "lay-verify", "title" }, { "placeholder", "请输入摘要" } })
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="layui-form-item">
|
|
||||||
<label class="layui-form-label">状态</label>
|
|
||||||
<div class="layui-input-block">
|
|
||||||
<input type="radio" name="status" value="1" title="启用" checked="">
|
|
||||||
<input type="radio" name="status" value="0" title="关闭">
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
@*<div class="form-module-footer">
|
|
||||||
<button class="layui-btn" lay-submit lay-filter="formDemo">立即提交</button>
|
|
||||||
</div>*@
|
|
||||||
</form>
|
|
@ -1,45 +0,0 @@
|
|||||||
@{
|
|
||||||
ViewData["Title"] = ".NETCore最方便的ORM";
|
|
||||||
Layout = "~/Areas/Admin/Shared/_Layout.cshtml";
|
|
||||||
}
|
|
||||||
<div class="layui-side layui-bg-black">
|
|
||||||
<div class="layui-side-scroll">
|
|
||||||
<!-- 左侧导航区域(可配合layui已有的垂直导航) -->
|
|
||||||
<ul class="layui-nav layui-nav-tree" lay-filter="test">
|
|
||||||
<li class="layui-nav-item layui-nav-itemed">
|
|
||||||
<a class="" href="javascript:;">文档管理</a>
|
|
||||||
<dl class="layui-nav-child menu-item">
|
|
||||||
<dd><a href="javascript:void(0);" datajson="{}" path="/Admin/Document/DocContent">文档内容</a></dd>
|
|
||||||
<dd><a href="javascript:void(0);" datajson="{}" path="/Admin/Document/DocType">文档分类</a></dd>
|
|
||||||
<dd><a href="/Doc/Documents/Index" target="_blank">查看文档</a></dd>
|
|
||||||
</dl>
|
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="layui-body">
|
|
||||||
<!-- 内容主体区域 -->
|
|
||||||
<div style="padding: 15px;" id="page_content">
|
|
||||||
文档主页引导
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
$(".menu-item>dd>a").click(function () {
|
|
||||||
var path_item = $(this).attr("path");
|
|
||||||
var path_json = $(this).attr("datajson");
|
|
||||||
|
|
||||||
var index = freejs.showLoading({ msg: "数据加载中......" });
|
|
||||||
var options = {
|
|
||||||
url: path_item, paramters: $.parseJSON(path_json), loadIndex: index, elm: "page_content"
|
|
||||||
};
|
|
||||||
freejs.loadHtml(options);
|
|
||||||
|
|
||||||
//如果出现长时间未关闭,定时关闭loading
|
|
||||||
setTimeout(function () {
|
|
||||||
if (index >= 0) freejs.closeLoading(index);
|
|
||||||
}, 5000);
|
|
||||||
});
|
|
||||||
|
|
||||||
</script>
|
|
@ -1,61 +0,0 @@
|
|||||||
@{
|
|
||||||
ViewBag.Title = "";
|
|
||||||
Layout = "~/Areas/Admin/Shared/_Layout.cshtml";
|
|
||||||
}
|
|
||||||
<div class="layui-side layui-bg-black">
|
|
||||||
<div class="layui-side-scroll">
|
|
||||||
<!-- 左侧导航区域(可配合layui已有的垂直导航) -->
|
|
||||||
<ul class="layui-nav layui-nav-tree" lay-filter="test">
|
|
||||||
<li class="layui-nav-item layui-nav-itemed">
|
|
||||||
<a class="" href="javascript:;">系统设置</a>
|
|
||||||
<dl class="layui-nav-child menu-item">
|
|
||||||
<dd><a href="javascript:void(0);" datajson="{}" path="/Admin/BBS/Index">论坛文章</a></dd>
|
|
||||||
<dd><a href="javascript:void(0);" datajson="{}" path="/Admin/BBS/Index">论坛标签</a></dd>
|
|
||||||
<dd><a href="javascript:void(0);" datajson="{}" path="/Admin/BBS/Index">论坛内容分析</a></dd>
|
|
||||||
<dd><a href="/BBS/BBS/Index" target="_blank">查看论坛</a></dd>
|
|
||||||
</dl>
|
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="layui-body">
|
|
||||||
<!-- 内容主体区域 -->
|
|
||||||
<div style="padding: 15px;" id="page_content">
|
|
||||||
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
var showLoading = function (obj) {
|
|
||||||
|
|
||||||
var index = layer.msg(obj.msg, {
|
|
||||||
icon: 16,
|
|
||||||
shade: 0.1,
|
|
||||||
shadeClose: false,
|
|
||||||
});
|
|
||||||
return index;
|
|
||||||
};
|
|
||||||
|
|
||||||
var closeLoading = function (index) {
|
|
||||||
layer.close(index);
|
|
||||||
};
|
|
||||||
|
|
||||||
$(".menu-item>dd>a").click(function () {
|
|
||||||
var path_item = $(this).attr("path");
|
|
||||||
var path_json = $(this).attr("datajson");
|
|
||||||
|
|
||||||
var index = showLoading({ msg: "数据加载中......" });
|
|
||||||
$("#page_content").load(path_item, $.parseJSON(path_json), function () {
|
|
||||||
//初始化绑定页面的时间,例如时间控件
|
|
||||||
closeLoading(index);
|
|
||||||
index = -1;
|
|
||||||
});
|
|
||||||
|
|
||||||
//如果出现长时间未关闭,定时关闭loading
|
|
||||||
setTimeout(function () {
|
|
||||||
if (index >= 0) closeLoading(index);
|
|
||||||
}, 5000);
|
|
||||||
});
|
|
||||||
|
|
||||||
</script>
|
|
@ -1,4 +0,0 @@
|
|||||||
@{
|
|
||||||
ViewBag.Title = "";
|
|
||||||
}
|
|
||||||
系统参数设置
|
|
@ -1,62 +0,0 @@
|
|||||||
@{
|
|
||||||
ViewBag.Title = "";
|
|
||||||
Layout = "~/Areas/Admin/Shared/_Layout.cshtml";
|
|
||||||
}
|
|
||||||
<div class="layui-side layui-bg-black">
|
|
||||||
<div class="layui-side-scroll">
|
|
||||||
<!-- 左侧导航区域(可配合layui已有的垂直导航) -->
|
|
||||||
<ul class="layui-nav layui-nav-tree" lay-filter="test">
|
|
||||||
<li class="layui-nav-item layui-nav-itemed">
|
|
||||||
<a class="" href="javascript:;">模板管理</a>
|
|
||||||
<dl class="layui-nav-child menu-item">
|
|
||||||
<dd><a href="javascript:void(0);" datajson="{}" path="/Admin/Template/Index">示例模板</a></dd>
|
|
||||||
<dd><a href="javascript:void(0);" datajson="{}" path="/Admin/Template/Index">模板列表</a></dd>
|
|
||||||
<dd><a href="javascript:void(0);" datajson="{}" path="/Admin/Template/Index">模板统计</a></dd>
|
|
||||||
<dd><a href="/Example/Template/Index" target="_blank">查看模板</a></dd>
|
|
||||||
<dd><a href="/Example/Main/Index" target="_blank">查看示例</a></dd>
|
|
||||||
</dl>
|
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="layui-body">
|
|
||||||
<!-- 内容主体区域 -->
|
|
||||||
<div style="padding: 15px;" id="page_content">
|
|
||||||
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
var showLoading = function (obj) {
|
|
||||||
|
|
||||||
var index = layer.msg(obj.msg, {
|
|
||||||
icon: 16,
|
|
||||||
shade: 0.1,
|
|
||||||
shadeClose: false,
|
|
||||||
});
|
|
||||||
return index;
|
|
||||||
};
|
|
||||||
|
|
||||||
var closeLoading = function (index) {
|
|
||||||
layer.close(index);
|
|
||||||
};
|
|
||||||
|
|
||||||
$(".menu-item>dd>a").click(function () {
|
|
||||||
var path_item = $(this).attr("path");
|
|
||||||
var path_json = $(this).attr("datajson");
|
|
||||||
|
|
||||||
var index = showLoading({ msg: "数据加载中......" });
|
|
||||||
$("#page_content").load(path_item, $.parseJSON(path_json), function () {
|
|
||||||
//初始化绑定页面的时间,例如时间控件
|
|
||||||
closeLoading(index);
|
|
||||||
index = -1;
|
|
||||||
});
|
|
||||||
|
|
||||||
//如果出现长时间未关闭,定时关闭loading
|
|
||||||
setTimeout(function () {
|
|
||||||
if (index >= 0) closeLoading(index);
|
|
||||||
}, 5000);
|
|
||||||
});
|
|
||||||
|
|
||||||
</script>
|
|
@ -1,5 +0,0 @@
|
|||||||
@using FreeSql.Site.UI
|
|
||||||
@using FreeSql.Site.UI.Models
|
|
||||||
@using FreeSql.Site.Entity
|
|
||||||
@using FreeSql.Site.UI.Common
|
|
||||||
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
|
|
@ -1,4 +0,0 @@
|
|||||||
@{
|
|
||||||
Layout = null;
|
|
||||||
ViewData["Title"] = ".NETCore最方便的ORM";
|
|
||||||
}
|
|
@ -1,26 +0,0 @@
|
|||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
using FreeSql.Site.UI.Areas.BBS.Models;
|
|
||||||
using FreeSql.Site.UI.Controllers;
|
|
||||||
using Microsoft.AspNetCore.Mvc;
|
|
||||||
|
|
||||||
namespace FreeSql.Site.UI.Areas.BBS.Controllers
|
|
||||||
{
|
|
||||||
[Area("BBS")]
|
|
||||||
public class BBSContentController : BaseController
|
|
||||||
{
|
|
||||||
public IActionResult Index()
|
|
||||||
{
|
|
||||||
BBSContentModel model = new BBSContentModel();
|
|
||||||
return View(model);
|
|
||||||
}
|
|
||||||
|
|
||||||
public IActionResult Ask() {
|
|
||||||
BBSContentModel model = new BBSContentModel();
|
|
||||||
return View(model);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,14 +0,0 @@
|
|||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
|
|
||||||
namespace FreeSql.Site.UI.Areas.BBS.Models
|
|
||||||
{
|
|
||||||
public class BBSContentModel
|
|
||||||
{
|
|
||||||
public int OrderBy { get; set; }
|
|
||||||
|
|
||||||
public int ContentID { get; set; }
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,9 +0,0 @@
|
|||||||
|
|
||||||
@{
|
|
||||||
ViewBag.Title = ".NET文档园 .NET开源ORM - 首页";
|
|
||||||
}
|
|
||||||
@using FreeSql.Site.UI.Areas.BBS.Models;
|
|
||||||
|
|
||||||
<div style="width:100%; height:430px; text-align:center; padding-top:150px; font-size:20px; font-weight:bold; letter-spacing:6px;" >
|
|
||||||
论坛功能正在开发中......
|
|
||||||
</div>
|
|
@ -1,3 +0,0 @@
|
|||||||
@{
|
|
||||||
Layout = "~/Views/Shared/_Layout.cshtml";
|
|
||||||
}
|
|
@ -1,131 +0,0 @@
|
|||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
using FreeSql.Site.DAL;
|
|
||||||
using FreeSql.Site.Entity;
|
|
||||||
using FreeSql.Site.UI.Controllers;
|
|
||||||
using FreeSql.Site.UI.Models;
|
|
||||||
using Microsoft.AspNetCore.Http;
|
|
||||||
using Microsoft.AspNetCore.Mvc;
|
|
||||||
|
|
||||||
namespace FreeSql.Site.UI.Areas.Doc.Controllers
|
|
||||||
{
|
|
||||||
[Area("Doc")]
|
|
||||||
public class DocumentsController : BaseController
|
|
||||||
{
|
|
||||||
public DocumentTypeDAL DocumentTypeDAL { get; set; }
|
|
||||||
|
|
||||||
public DocumentContentDAL DocumentContentDAL { get; set; }
|
|
||||||
|
|
||||||
public DocumentsController()
|
|
||||||
{
|
|
||||||
this.DocumentTypeDAL = new DocumentTypeDAL();
|
|
||||||
this.DocumentContentDAL = new DocumentContentDAL();
|
|
||||||
}
|
|
||||||
|
|
||||||
// GET: Documents
|
|
||||||
public IActionResult Index(int id = 1)
|
|
||||||
{
|
|
||||||
var typeList = DocumentTypeDAL.Query(d => d.ID != 0).list;
|
|
||||||
var contentlist = DocumentContentDAL.Query(d => d.Status == 1).list;
|
|
||||||
|
|
||||||
//适应两层结构即可
|
|
||||||
var query = (from p in typeList
|
|
||||||
where p.UpID == null || p.UpID == 0
|
|
||||||
select new TreeData(p, typeList).AddChildrens(GetContentTreeData(p.ID, contentlist), (tid) => GetContentTreeData(tid, contentlist))).ToList();
|
|
||||||
|
|
||||||
ViewBag.DocumentList = query;
|
|
||||||
ViewBag.DocID = id;
|
|
||||||
return View();
|
|
||||||
}
|
|
||||||
|
|
||||||
private List<TreeData> GetContentTreeData(int id, List<DocumentContent> contentlist)
|
|
||||||
{
|
|
||||||
return contentlist.Where(w => w.TypeID == id).Select(s => new TreeData
|
|
||||||
{
|
|
||||||
id = s.ID,
|
|
||||||
text = s.DocTitle,
|
|
||||||
datatype = 1
|
|
||||||
}).ToList();
|
|
||||||
}
|
|
||||||
|
|
||||||
// GET: Documents/Details/5
|
|
||||||
public ActionResult Details(int id)
|
|
||||||
{
|
|
||||||
ViewBag.DocumentID = id;
|
|
||||||
var doc = this.DocumentContentDAL.GetByOne(w => w.ID == id);
|
|
||||||
ViewBag.DocumentInfo = doc;
|
|
||||||
return this.PartialView();
|
|
||||||
}
|
|
||||||
|
|
||||||
// GET: Documents/Create
|
|
||||||
public ActionResult Create()
|
|
||||||
{
|
|
||||||
return View();
|
|
||||||
}
|
|
||||||
|
|
||||||
// POST: Documents/Create
|
|
||||||
[HttpPost]
|
|
||||||
[ValidateAntiForgeryToken]
|
|
||||||
public ActionResult Create(IFormCollection collection)
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
// TODO: Add insert logic here
|
|
||||||
|
|
||||||
return RedirectToAction(nameof(Index));
|
|
||||||
}
|
|
||||||
catch
|
|
||||||
{
|
|
||||||
return View();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// GET: Documents/Edit/5
|
|
||||||
public ActionResult Edit(int id)
|
|
||||||
{
|
|
||||||
return View();
|
|
||||||
}
|
|
||||||
|
|
||||||
// POST: Documents/Edit/5
|
|
||||||
[HttpPost]
|
|
||||||
[ValidateAntiForgeryToken]
|
|
||||||
public ActionResult Edit(int id, IFormCollection collection)
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
// TODO: Add update logic here
|
|
||||||
|
|
||||||
return RedirectToAction(nameof(Index));
|
|
||||||
}
|
|
||||||
catch
|
|
||||||
{
|
|
||||||
return View();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// GET: Documents/Delete/5
|
|
||||||
public ActionResult Delete(int id)
|
|
||||||
{
|
|
||||||
return View();
|
|
||||||
}
|
|
||||||
|
|
||||||
// POST: Documents/Delete/5
|
|
||||||
[HttpPost]
|
|
||||||
[ValidateAntiForgeryToken]
|
|
||||||
public ActionResult Delete(int id, IFormCollection collection)
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
// TODO: Add delete logic here
|
|
||||||
|
|
||||||
return RedirectToAction(nameof(Index));
|
|
||||||
}
|
|
||||||
catch
|
|
||||||
{
|
|
||||||
return View();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,6 +0,0 @@
|
|||||||
@*
|
|
||||||
For more information on enabling MVC for empty projects, visit https://go.microsoft.com/fwlink/?LinkID=397860
|
|
||||||
*@
|
|
||||||
@{
|
|
||||||
|
|
||||||
}
|
|
@ -1,56 +0,0 @@
|
|||||||
@{
|
|
||||||
Layout = null;
|
|
||||||
var documentinfo = (FreeSql.Site.Entity.DocumentContent)ViewBag.DocumentInfo;
|
|
||||||
}
|
|
||||||
@if (ViewBag.DocumentInfo == null)
|
|
||||||
{
|
|
||||||
<span>文章不存在,请选择其它文章查看!</span>
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
<h1 class="site-h1">@documentinfo.DocTitle</h1>
|
|
||||||
<div id="details_content" style="display:none;">
|
|
||||||
<blockquote>
|
|
||||||
@documentinfo.DocAbstract
|
|
||||||
</blockquote>
|
|
||||||
@documentinfo.DocContent
|
|
||||||
</div>
|
|
||||||
<script>
|
|
||||||
if ('@documentinfo.OriginType' == '1') {
|
|
||||||
var options = {
|
|
||||||
elm: "details_content", url: "@documentinfo.OriginUrl", paramters: "", loadIndex: 1,
|
|
||||||
successCallBack: function () {
|
|
||||||
debugger
|
|
||||||
document.getElementById('details_content').innerHTML =
|
|
||||||
marked($("#details_content").html());
|
|
||||||
}
|
|
||||||
};
|
|
||||||
freejs.loadHtml(options);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
if ('@documentinfo.EditorMode' == '0') {
|
|
||||||
marked.setOptions({
|
|
||||||
renderer: new marked.Renderer(),
|
|
||||||
gfm: true,
|
|
||||||
tables: true,
|
|
||||||
breaks: true,
|
|
||||||
pedantic: false,
|
|
||||||
sanitize: false,
|
|
||||||
smartLists: true,
|
|
||||||
smartypants: false,
|
|
||||||
});
|
|
||||||
marked.setOptions({
|
|
||||||
highlight: function (code) {
|
|
||||||
return hljs.highlightAuto(code).value;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
document.getElementById('details_content').innerHTML =
|
|
||||||
marked($("#details_content").html());
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
//直接里面的内容就是HTML
|
|
||||||
}
|
|
||||||
}
|
|
||||||
$("#details_content").show();
|
|
||||||
</script>
|
|
||||||
}
|
|
@ -1,62 +0,0 @@
|
|||||||
@{
|
|
||||||
|
|
||||||
}
|
|
||||||
<div class="layui-main site-inline">
|
|
||||||
<div class="site-tree">
|
|
||||||
<ul class="layui-tree">
|
|
||||||
@foreach (var item in (List<FreeSql.Site.UI.Models.TreeData>)ViewBag.DocumentList)
|
|
||||||
{
|
|
||||||
<li><h2>@item.text</h2></li>
|
|
||||||
foreach (var children in item.children)
|
|
||||||
{
|
|
||||||
if (children.datatype == 1)
|
|
||||||
{
|
|
||||||
<li class="site-tree-noicon">
|
|
||||||
<a href="?id=@(children.id)"><cite>@children.text</cite></a>
|
|
||||||
</li>
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
<li class="site-tree-noicon">
|
|
||||||
<a href="#@(children.id)"><cite>> @children.text</cite></a>
|
|
||||||
</li>
|
|
||||||
foreach (var children2 in children.children)
|
|
||||||
{
|
|
||||||
<li class="site-tree-noicon">
|
|
||||||
<a href="?id=@(children2.id)"><cite> @children2.text</cite></a>
|
|
||||||
</li>
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</ul>
|
|
||||||
</div>
|
|
||||||
<div class="site-content">
|
|
||||||
@Html.Action("Details", new RouteValueDictionary { { "id", ViewBag.DocID } })
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="site-tree-mobile layui-hide">
|
|
||||||
<i class="layui-icon"></i>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
//window.onhashchange = function () {
|
|
||||||
// var hash = location.hash;
|
|
||||||
// if (hash.search(/^#C\d+$/g) == 0) {
|
|
||||||
// var docid = hash.replace('C', '');
|
|
||||||
|
|
||||||
// $(".site-content").load("/Doc/Documents/Details", { id: docid }, function () {
|
|
||||||
// alert(1);
|
|
||||||
// });
|
|
||||||
// //$.ajax({
|
|
||||||
// // type: "GET",
|
|
||||||
// // url: "/Doc/Documents/Details",
|
|
||||||
// // data: { id: docid },
|
|
||||||
// // dataType: "html",
|
|
||||||
// // success: function (data) {
|
|
||||||
// // $(".site-content").html(data);
|
|
||||||
// // }
|
|
||||||
// //});
|
|
||||||
// }
|
|
||||||
//}
|
|
||||||
</script>
|
|
@ -1,7 +0,0 @@
|
|||||||
@using FreeSql.Site.UI;
|
|
||||||
@using FreeSql.Site.UI.Models;
|
|
||||||
@using FreeSql.Site.UI.Common;
|
|
||||||
@using Microsoft.AspNetCore.Routing;
|
|
||||||
@using Microsoft.AspNetCore.Mvc;
|
|
||||||
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
|
|
||||||
@addTagHelper "FreeSql.Site.UI.Common.TagHelpers.MarkdownTagHelper, FreeSql.Site.UI"
|
|
@ -1,3 +0,0 @@
|
|||||||
@{
|
|
||||||
Layout = "~/Views/Shared/_Layout.cshtml";
|
|
||||||
}
|
|
@ -1,17 +0,0 @@
|
|||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
using Microsoft.AspNetCore.Mvc;
|
|
||||||
|
|
||||||
namespace FreeSql.Site.UI.Areas.Example.Controllers
|
|
||||||
{
|
|
||||||
[Area("example")]
|
|
||||||
public class MainController : Controller
|
|
||||||
{
|
|
||||||
public IActionResult Index()
|
|
||||||
{
|
|
||||||
return View();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,17 +0,0 @@
|
|||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
using Microsoft.AspNetCore.Mvc;
|
|
||||||
|
|
||||||
namespace FreeSql.Site.UI.Areas.Example.Controllers
|
|
||||||
{
|
|
||||||
[Area("Example")]
|
|
||||||
public class TemplateController : Controller
|
|
||||||
{
|
|
||||||
public IActionResult Index()
|
|
||||||
{
|
|
||||||
return View();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,6 +0,0 @@
|
|||||||
@{
|
|
||||||
ViewBag.Title = ".NET文档园 .NET开源ORM - 首页";
|
|
||||||
}
|
|
||||||
<div style="width:100%; height:430px; text-align:center; padding-top:150px; font-size:20px; font-weight:bold; letter-spacing:6px;">
|
|
||||||
示例功能正在开发中......
|
|
||||||
</div>
|
|
@ -1,137 +0,0 @@
|
|||||||
@*
|
|
||||||
For more information on enabling MVC for empty projects, visit http://go.microsoft.com/fwlink/?LinkID=397860
|
|
||||||
*@
|
|
||||||
<div style="width:100%; height:430px; text-align:center; padding-top:150px; font-size:20px; font-weight:bold; letter-spacing:6px;">
|
|
||||||
示例功能正在开发中......
|
|
||||||
</div>
|
|
||||||
<h2>计划如下效果,通过模板生成项目页面</h2>
|
|
||||||
<div style="padding: 20px; background-color: #F2F2F2;">
|
|
||||||
<div class="layui-row layui-col-space15">
|
|
||||||
<div class="layui-col-md6">
|
|
||||||
<div class="layui-card">
|
|
||||||
<div class="layui-card-header">模板一</div>
|
|
||||||
<div class="layui-card-body">
|
|
||||||
卡片式面板面板通常用于非白色背景色的主体内<br>
|
|
||||||
从而映衬出边框投影
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="layui-col-md6">
|
|
||||||
<div class="layui-card">
|
|
||||||
<div class="layui-card-header">模板二</div>
|
|
||||||
<div class="layui-card-body">
|
|
||||||
结合 layui 的栅格系统<br>
|
|
||||||
轻松实现响应式布局
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="layui-col-md6">
|
|
||||||
<div class="layui-card">
|
|
||||||
<div class="layui-card-header">模板三</div>
|
|
||||||
<div class="layui-card-body">
|
|
||||||
结合 layui 的栅格系统<br>
|
|
||||||
轻松实现响应式布局
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="layui-col-md6">
|
|
||||||
<div class="layui-card">
|
|
||||||
<div class="layui-card-header">模板四</div>
|
|
||||||
<div class="layui-card-body">
|
|
||||||
结合 layui 的栅格系统<br>
|
|
||||||
轻松实现响应式布局
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="layui-col-md6">
|
|
||||||
<div class="layui-card">
|
|
||||||
<div class="layui-card-header">模板五</div>
|
|
||||||
<div class="layui-card-body">
|
|
||||||
结合 layui 的栅格系统<br>
|
|
||||||
轻松实现响应式布局
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="layui-col-md6">
|
|
||||||
<div class="layui-card">
|
|
||||||
<div class="layui-card-header">模板6</div>
|
|
||||||
<div class="layui-card-body">
|
|
||||||
结合 layui 的栅格系统<br>
|
|
||||||
轻松实现响应式布局
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="layui-col-md6">
|
|
||||||
<div class="layui-card">
|
|
||||||
<div class="layui-card-header">模板6</div>
|
|
||||||
<div class="layui-card-body">
|
|
||||||
结合 layui 的栅格系统<br>
|
|
||||||
轻松实现响应式布局
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="layui-col-md6">
|
|
||||||
<div class="layui-card">
|
|
||||||
<div class="layui-card-header">模板6</div>
|
|
||||||
<div class="layui-card-body">
|
|
||||||
结合 layui 的栅格系统<br>
|
|
||||||
轻松实现响应式布局
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="layui-col-md6">
|
|
||||||
<div class="layui-card">
|
|
||||||
<div class="layui-card-header">模板6</div>
|
|
||||||
<div class="layui-card-body">
|
|
||||||
结合 layui 的栅格系统<br>
|
|
||||||
轻松实现响应式布局
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="layui-col-md6">
|
|
||||||
<div class="layui-card">
|
|
||||||
<div class="layui-card-header">模板6</div>
|
|
||||||
<div class="layui-card-body">
|
|
||||||
结合 layui 的栅格系统<br>
|
|
||||||
轻松实现响应式布局
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="layui-col-md6">
|
|
||||||
<div class="layui-card">
|
|
||||||
<div class="layui-card-header">模板6</div>
|
|
||||||
<div class="layui-card-body">
|
|
||||||
结合 layui 的栅格系统<br>
|
|
||||||
轻松实现响应式布局
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="layui-col-md6">
|
|
||||||
<div class="layui-card">
|
|
||||||
<div class="layui-card-header">模板6</div>
|
|
||||||
<div class="layui-card-body">
|
|
||||||
结合 layui 的栅格系统<br>
|
|
||||||
轻松实现响应式布局
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="layui-col-md6">
|
|
||||||
<div class="layui-card">
|
|
||||||
<div class="layui-card-header">模板6</div>
|
|
||||||
<div class="layui-card-body">
|
|
||||||
结合 layui 的栅格系统<br>
|
|
||||||
轻松实现响应式布局
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="layui-col-md6">
|
|
||||||
<div class="layui-card">
|
|
||||||
<div class="layui-card-header">模板6</div>
|
|
||||||
<div class="layui-card-body">
|
|
||||||
结合 layui 的栅格系统<br>
|
|
||||||
轻松实现响应式布局
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
@ -1,3 +0,0 @@
|
|||||||
@{
|
|
||||||
Layout = "~/Views/Shared/_Layout.cshtml";
|
|
||||||
}
|
|
@ -1,73 +0,0 @@
|
|||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
using System.Transactions;
|
|
||||||
|
|
||||||
namespace FreeSql.Site.UI.Common
|
|
||||||
{
|
|
||||||
public class AutoException
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// 执行方法外壳,包括异常抓取,固定格式返回
|
|
||||||
/// </summary>
|
|
||||||
/// <typeparam name="T"></typeparam>
|
|
||||||
/// <param name="action"></param>
|
|
||||||
/// <param name="isTransaction"></param>
|
|
||||||
/// <returns></returns>
|
|
||||||
public static ServiceResult<T> Excute<T>(
|
|
||||||
Action<ServiceResult<T>> action, bool isTransaction = false)
|
|
||||||
{
|
|
||||||
TransactionScope ts = null;
|
|
||||||
if (isTransaction) ts = new TransactionScope();
|
|
||||||
ServiceResult<T> result = new ServiceResult<T>() { Status = EnumServiceResult.Success.GetHashCode() };
|
|
||||||
try
|
|
||||||
{
|
|
||||||
action.Invoke(result);
|
|
||||||
if (isTransaction) ts.Complete();
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
result.Msg = ex.Message;
|
|
||||||
result.Status = EnumServiceResult.Failure.GetHashCode();
|
|
||||||
}
|
|
||||||
finally
|
|
||||||
{
|
|
||||||
if (isTransaction) ts.Dispose();
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 规范接口调用方法
|
|
||||||
/// </summary>
|
|
||||||
/// <typeparam name="T">返回值参数 </typeparam>
|
|
||||||
/// <param name="action">执行方法内容</param>
|
|
||||||
/// <param name="isTransaction">是否启用事务</param>
|
|
||||||
/// <returns></returns>
|
|
||||||
public static ServiceResult Execute(Action<ServiceResult> action, bool isTransaction = false)
|
|
||||||
{
|
|
||||||
TransactionScope ts = null;
|
|
||||||
if (isTransaction) ts = new TransactionScope();
|
|
||||||
ServiceResult result = new ServiceResult() { Status = EnumServiceResult.Success.GetHashCode(), Msg = "保存成功" };
|
|
||||||
try
|
|
||||||
{
|
|
||||||
action.Invoke(result);
|
|
||||||
if (result.Status == EnumServiceResult.Success.GetHashCode())
|
|
||||||
{
|
|
||||||
if (isTransaction) ts.Complete();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
result.Msg = ex.Message;
|
|
||||||
result.Status = EnumServiceResult.Failure.GetHashCode();
|
|
||||||
}
|
|
||||||
finally
|
|
||||||
{
|
|
||||||
if (isTransaction) ts.Dispose();
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,110 +0,0 @@
|
|||||||
using Microsoft.AspNetCore.Html;
|
|
||||||
using Microsoft.AspNetCore.Mvc;
|
|
||||||
using System;
|
|
||||||
using Microsoft.AspNetCore.Routing;
|
|
||||||
using System.IO;
|
|
||||||
using Microsoft.AspNetCore.Http;
|
|
||||||
using Microsoft.AspNetCore.Mvc.Infrastructure;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
using Microsoft.Extensions.DependencyInjection;
|
|
||||||
using Microsoft.AspNetCore.Mvc.Rendering;
|
|
||||||
|
|
||||||
namespace FreeSql.Site.UI.Common
|
|
||||||
{
|
|
||||||
public static class HtmlHelperViewExtensions
|
|
||||||
{
|
|
||||||
public static string ToJson(this IHtmlHelper htmlHeler, object val)
|
|
||||||
{
|
|
||||||
if (val != null)
|
|
||||||
{
|
|
||||||
return Newtonsoft.Json.JsonConvert.SerializeObject(val);
|
|
||||||
}
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
|
|
||||||
public static IHtmlContent Action(this IHtmlHelper helper, string action, object parameters = null)
|
|
||||||
{
|
|
||||||
var controller = (string)helper.ViewContext.RouteData.Values["controller"];
|
|
||||||
|
|
||||||
return Action(helper, action, controller, parameters);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static IHtmlContent Action(this IHtmlHelper helper, string action, string controller, object parameters = null)
|
|
||||||
{
|
|
||||||
var area = (string)helper.ViewContext.RouteData.Values["area"];
|
|
||||||
|
|
||||||
return Action(helper, action, controller, area, parameters);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static IHtmlContent Action(this IHtmlHelper helper, string action, string controller, string area, object parameters = null)
|
|
||||||
{
|
|
||||||
if (action == null)
|
|
||||||
throw new ArgumentNullException("action");
|
|
||||||
|
|
||||||
if (controller == null)
|
|
||||||
throw new ArgumentNullException("controller");
|
|
||||||
|
|
||||||
|
|
||||||
var task = RenderActionAsync(helper, action, controller, area, parameters);
|
|
||||||
|
|
||||||
return task.Result;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static async Task<IHtmlContent> RenderActionAsync(this IHtmlHelper helper, string action, string controller, string area, object parameters = null)
|
|
||||||
{
|
|
||||||
// fetching required services for invocation
|
|
||||||
var serviceProvider = helper.ViewContext.HttpContext.RequestServices;
|
|
||||||
var actionContextAccessor = helper.ViewContext.HttpContext.RequestServices.GetRequiredService<IActionContextAccessor>();
|
|
||||||
var httpContextAccessor = helper.ViewContext.HttpContext.RequestServices.GetRequiredService<IHttpContextAccessor>();
|
|
||||||
var actionSelector = serviceProvider.GetRequiredService<IActionSelector>();
|
|
||||||
|
|
||||||
// creating new action invocation context
|
|
||||||
var routeData = new RouteData();
|
|
||||||
foreach (var router in helper.ViewContext.RouteData.Routers)
|
|
||||||
{
|
|
||||||
routeData.PushState(router, null, null);
|
|
||||||
}
|
|
||||||
routeData.PushState(null, new RouteValueDictionary(new { controller = controller, action = action, area = area }), null);
|
|
||||||
routeData.PushState(null, new RouteValueDictionary(parameters ?? new { }), null);
|
|
||||||
|
|
||||||
//get the actiondescriptor
|
|
||||||
RouteContext routeContext = new RouteContext(helper.ViewContext.HttpContext) { RouteData = routeData };
|
|
||||||
var candidates = actionSelector.SelectCandidates(routeContext);
|
|
||||||
var actionDescriptor = actionSelector.SelectBestCandidate(routeContext, candidates);
|
|
||||||
|
|
||||||
var originalActionContext = actionContextAccessor.ActionContext;
|
|
||||||
var originalhttpContext = httpContextAccessor.HttpContext;
|
|
||||||
try
|
|
||||||
{
|
|
||||||
var newHttpContext = serviceProvider.GetRequiredService<IHttpContextFactory>().Create(helper.ViewContext.HttpContext.Features);
|
|
||||||
if (newHttpContext.Items.ContainsKey(typeof(IUrlHelper)))
|
|
||||||
{
|
|
||||||
newHttpContext.Items.Remove(typeof(IUrlHelper));
|
|
||||||
}
|
|
||||||
newHttpContext.Response.Body = new MemoryStream();
|
|
||||||
var actionContext = new ActionContext(newHttpContext, routeData, actionDescriptor);
|
|
||||||
actionContextAccessor.ActionContext = actionContext;
|
|
||||||
var invoker = serviceProvider.GetRequiredService<IActionInvokerFactory>().CreateInvoker(actionContext);
|
|
||||||
await invoker.InvokeAsync();
|
|
||||||
newHttpContext.Response.Body.Position = 0;
|
|
||||||
using (var reader = new StreamReader(newHttpContext.Response.Body))
|
|
||||||
{
|
|
||||||
return new HtmlString(reader.ReadToEnd());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
return new HtmlString(ex.Message);
|
|
||||||
}
|
|
||||||
finally
|
|
||||||
{
|
|
||||||
actionContextAccessor.ActionContext = originalActionContext;
|
|
||||||
httpContextAccessor.HttpContext = originalhttpContext;
|
|
||||||
if (helper.ViewContext.HttpContext.Items.ContainsKey(typeof(IUrlHelper)))
|
|
||||||
{
|
|
||||||
helper.ViewContext.HttpContext.Items.Remove(typeof(IUrlHelper));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,40 +0,0 @@
|
|||||||
using CommonMark;
|
|
||||||
using Microsoft.AspNetCore.Mvc.ViewFeatures;
|
|
||||||
using Microsoft.AspNetCore.Razor.TagHelpers;
|
|
||||||
using System.Net;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
|
|
||||||
namespace FreeSql.Site.UI.Common.TagHelpers
|
|
||||||
{
|
|
||||||
[HtmlTargetElement("markdown", TagStructure = TagStructure.NormalOrSelfClosing)]
|
|
||||||
[HtmlTargetElement(Attributes = "markdown")]
|
|
||||||
public class MarkdownTagHelper : TagHelper
|
|
||||||
{
|
|
||||||
public MarkdownTagHelper()
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
public ModelExpression Content { get; set; }
|
|
||||||
|
|
||||||
public async override Task ProcessAsync(TagHelperContext context, TagHelperOutput output)
|
|
||||||
{
|
|
||||||
if (output.TagName == "markdown")
|
|
||||||
{
|
|
||||||
output.TagName = null;
|
|
||||||
}
|
|
||||||
output.Attributes.RemoveAll("markdown");
|
|
||||||
var content = await GetContent(output);
|
|
||||||
var markdown = WebUtility.HtmlEncode(WebUtility.HtmlDecode(content));
|
|
||||||
var html = CommonMarkConverter.Convert(markdown);
|
|
||||||
output.Content.SetHtmlContent(html ?? "");
|
|
||||||
}
|
|
||||||
|
|
||||||
private async Task<string> GetContent(TagHelperOutput output)
|
|
||||||
{
|
|
||||||
if (Content == null)
|
|
||||||
return (await output.GetChildContentAsync()).GetContent();
|
|
||||||
return Content.Model?.ToString();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,35 +0,0 @@
|
|||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Linq.Expressions;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
|
|
||||||
namespace FreeSql.Site.UI.Common
|
|
||||||
{
|
|
||||||
public static class PredicateExtensions
|
|
||||||
{
|
|
||||||
public static Expression<Func<T, bool>> True<T>() { return f => true; }
|
|
||||||
|
|
||||||
public static Expression<Func<T, bool>> False<T>() { return f => false; }
|
|
||||||
|
|
||||||
public static Expression<Func<T, bool>> Or<T>(this Expression<Func<T, bool>> expression1,
|
|
||||||
Expression<Func<T, bool>> expression2)
|
|
||||||
{
|
|
||||||
var invokedExpression = Expression.Invoke(expression2, expression1.Parameters
|
|
||||||
.Cast<Expression>());
|
|
||||||
|
|
||||||
return Expression.Lambda<Func<T, bool>>(Expression.Or(expression1.Body, invokedExpression),
|
|
||||||
expression1.Parameters);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Expression<Func<T, bool>> And<T>(this Expression<Func<T, bool>> expression1,
|
|
||||||
Expression<Func<T, bool>> expression2)
|
|
||||||
{
|
|
||||||
var invokedExpression = Expression.Invoke(expression2, expression1.Parameters
|
|
||||||
.Cast<Expression>());
|
|
||||||
|
|
||||||
return Expression.Lambda<Func<T, bool>>(Expression.And(expression1.Body,
|
|
||||||
invokedExpression), expression1.Parameters);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,13 +0,0 @@
|
|||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
using Microsoft.AspNetCore.Mvc;
|
|
||||||
|
|
||||||
namespace FreeSql.Site.UI.Controllers
|
|
||||||
{
|
|
||||||
public class BaseController : Controller
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,43 +0,0 @@
|
|||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Diagnostics;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
using Microsoft.AspNetCore.Mvc;
|
|
||||||
using FreeSql.Site.UI.Models;
|
|
||||||
|
|
||||||
namespace FreeSql.Site.UI.Controllers
|
|
||||||
{
|
|
||||||
public class HomeController : Controller
|
|
||||||
{
|
|
||||||
public IActionResult Index()
|
|
||||||
{
|
|
||||||
return View();
|
|
||||||
}
|
|
||||||
|
|
||||||
public IActionResult About()
|
|
||||||
{
|
|
||||||
ViewData["Message"] = "Your application description page.";
|
|
||||||
|
|
||||||
return View();
|
|
||||||
}
|
|
||||||
|
|
||||||
public IActionResult Contact()
|
|
||||||
{
|
|
||||||
ViewData["Message"] = "Your contact page.";
|
|
||||||
|
|
||||||
return View();
|
|
||||||
}
|
|
||||||
|
|
||||||
public IActionResult Privacy()
|
|
||||||
{
|
|
||||||
return View();
|
|
||||||
}
|
|
||||||
|
|
||||||
[ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)]
|
|
||||||
public IActionResult Error()
|
|
||||||
{
|
|
||||||
return View(new ErrorViewModel { RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier });
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,50 +0,0 @@
|
|||||||
<Project Sdk="Microsoft.NET.Sdk.Web">
|
|
||||||
|
|
||||||
<PropertyGroup>
|
|
||||||
<TargetFramework>netcoreapp2.2</TargetFramework>
|
|
||||||
</PropertyGroup>
|
|
||||||
|
|
||||||
<ItemGroup>
|
|
||||||
<PackageReference Include="CommonMark.NET" Version="0.15.1" />
|
|
||||||
<PackageReference Include="Microsoft.AspNetCore.App" />
|
|
||||||
</ItemGroup>
|
|
||||||
|
|
||||||
<ItemGroup>
|
|
||||||
<Folder Include="Areas\Admin\Data\" />
|
|
||||||
<Folder Include="Areas\BBS\Data\" />
|
|
||||||
<Folder Include="Areas\Doc\Data\" />
|
|
||||||
<Folder Include="Areas\Doc\Models\" />
|
|
||||||
<Folder Include="Areas\Example\Data\" />
|
|
||||||
<Folder Include="Areas\Example\Models\" />
|
|
||||||
<Folder Include="wwwroot\laymd\" />
|
|
||||||
<Folder Include="wwwroot\layui\ext\treetable\js\" />
|
|
||||||
<Folder Include="wwwroot\file\" />
|
|
||||||
</ItemGroup>
|
|
||||||
|
|
||||||
<ItemGroup>
|
|
||||||
<ProjectReference Include="..\FreeSql.Site.DAL\FreeSql.Site.DAL.csproj" />
|
|
||||||
<ProjectReference Include="..\FreeSql.Site.Entity\FreeSql.Site.Entity.csproj" />
|
|
||||||
</ItemGroup>
|
|
||||||
|
|
||||||
<ItemGroup>
|
|
||||||
<Content Update="Areas\Admin\Views\Document\DocType.cshtml">
|
|
||||||
<CopyToPublishDirectory>PreserveNewest</CopyToPublishDirectory>
|
|
||||||
</Content>
|
|
||||||
<Content Update="Areas\Admin\_ViewStart.cshtml">
|
|
||||||
<CopyToPublishDirectory>PreserveNewest</CopyToPublishDirectory>
|
|
||||||
<Pack>$(IncludeRazorContentInPack)</Pack>
|
|
||||||
</Content>
|
|
||||||
<Content Update="Areas\BBS\_ViewStart.cshtml">
|
|
||||||
<Pack>$(IncludeRazorContentInPack)</Pack>
|
|
||||||
</Content>
|
|
||||||
<Content Update="Areas\Doc\_ViewStart.cshtml">
|
|
||||||
<Pack>$(IncludeRazorContentInPack)</Pack>
|
|
||||||
</Content>
|
|
||||||
<Content Update="Areas\Example\_ViewStart.cshtml">
|
|
||||||
<Pack>$(IncludeRazorContentInPack)</Pack>
|
|
||||||
</Content>
|
|
||||||
</ItemGroup>
|
|
||||||
|
|
||||||
<ProjectExtensions><VisualStudio><UserProperties appsettings_1json__JSONSchema="" /></VisualStudio></ProjectExtensions>
|
|
||||||
|
|
||||||
</Project>
|
|
@ -1,11 +0,0 @@
|
|||||||
using System;
|
|
||||||
|
|
||||||
namespace FreeSql.Site.UI.Models
|
|
||||||
{
|
|
||||||
public class ErrorViewModel
|
|
||||||
{
|
|
||||||
public string RequestId { get; set; }
|
|
||||||
|
|
||||||
public bool ShowRequestId => !string.IsNullOrEmpty(RequestId);
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,49 +0,0 @@
|
|||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
|
|
||||||
namespace FreeSql.Site.UI
|
|
||||||
{
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// ServiceResult操作结果
|
|
||||||
/// </summary>
|
|
||||||
public enum EnumServiceResult
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// 操作成功
|
|
||||||
/// </summary>
|
|
||||||
Success = 1,
|
|
||||||
/// <summary>
|
|
||||||
/// 操作失败
|
|
||||||
/// </summary>
|
|
||||||
Failure = 0
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 方法错误结果
|
|
||||||
/// </summary>
|
|
||||||
[Serializable]
|
|
||||||
public class ServiceResult
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// 返回结果 =1 表示成功 否则失败
|
|
||||||
/// </summary>
|
|
||||||
public int Status { get; set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 返回结果信息
|
|
||||||
/// </summary>
|
|
||||||
public string Msg { get; set; }
|
|
||||||
}
|
|
||||||
|
|
||||||
[Serializable]
|
|
||||||
public class ServiceResult<T> : ServiceResult
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// 数据返回
|
|
||||||
/// </summary>
|
|
||||||
public T Data { get; set; }
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,56 +0,0 @@
|
|||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
using FreeSql.Site.Entity;
|
|
||||||
|
|
||||||
namespace FreeSql.Site.UI.Models
|
|
||||||
{
|
|
||||||
public class TreeData
|
|
||||||
{
|
|
||||||
public TreeData() { }
|
|
||||||
|
|
||||||
public TreeData(DocumentType type)
|
|
||||||
{
|
|
||||||
this.id = type.ID;
|
|
||||||
this.text = type.TypeName;
|
|
||||||
}
|
|
||||||
|
|
||||||
public TreeData(DocumentType type, List<DocumentType> list)
|
|
||||||
{
|
|
||||||
this.id = type.ID;
|
|
||||||
this.text = type.TypeName;
|
|
||||||
this.children = (from l in list where l.UpID == type.ID select new TreeData(l, list)).ToList();
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 唯一编号
|
|
||||||
/// </summary>
|
|
||||||
public int id { get; set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 标题
|
|
||||||
/// </summary>
|
|
||||||
public string text { get; set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 类型 =0 表示类型 =1 表示内容
|
|
||||||
/// </summary>
|
|
||||||
public int datatype { get; set; } = 0;
|
|
||||||
|
|
||||||
public List<TreeData> children { get; set; }
|
|
||||||
|
|
||||||
public TreeData AddChildrens(List<TreeData> list, Func<int, List<TreeData>> bind = null)
|
|
||||||
{
|
|
||||||
if (this.children != null && bind != null)
|
|
||||||
{
|
|
||||||
this.children.ForEach(f =>
|
|
||||||
{
|
|
||||||
f.children = bind(f.id);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
this.children?.AddRange(list);
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,24 +0,0 @@
|
|||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.IO;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
using Microsoft.AspNetCore;
|
|
||||||
using Microsoft.AspNetCore.Hosting;
|
|
||||||
using Microsoft.Extensions.Configuration;
|
|
||||||
using Microsoft.Extensions.Logging;
|
|
||||||
|
|
||||||
namespace FreeSql.Site.UI
|
|
||||||
{
|
|
||||||
public class Program
|
|
||||||
{
|
|
||||||
public static void Main(string[] args)
|
|
||||||
{
|
|
||||||
CreateWebHostBuilder(args).Build().Run();
|
|
||||||
}
|
|
||||||
|
|
||||||
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
|
|
||||||
WebHost.CreateDefaultBuilder(args)
|
|
||||||
.UseStartup<Startup>();
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,27 +0,0 @@
|
|||||||
{
|
|
||||||
"iisSettings": {
|
|
||||||
"windowsAuthentication": false,
|
|
||||||
"anonymousAuthentication": true,
|
|
||||||
"iisExpress": {
|
|
||||||
"applicationUrl": "http://localhost:59757",
|
|
||||||
"sslPort": 44395
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"profiles": {
|
|
||||||
"IIS Express": {
|
|
||||||
"commandName": "IISExpress",
|
|
||||||
"launchBrowser": true,
|
|
||||||
"environmentVariables": {
|
|
||||||
"ASPNETCORE_ENVIRONMENT": "Development"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"FreeSql.Site.UI": {
|
|
||||||
"commandName": "Project",
|
|
||||||
"launchBrowser": true,
|
|
||||||
"applicationUrl": "https://localhost:5001;http://localhost:5000",
|
|
||||||
"environmentVariables": {
|
|
||||||
"ASPNETCORE_ENVIRONMENT": "Development"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,12 +0,0 @@
|
|||||||
Scaffolding has generated all the files and added the required dependencies.
|
|
||||||
|
|
||||||
However the Application's Startup code may required additional changes for things to work end to end.
|
|
||||||
Add the following code to the Configure method in your Application's Startup class if not already done:
|
|
||||||
|
|
||||||
app.UseMvc(routes =>
|
|
||||||
{
|
|
||||||
routes.MapRoute(
|
|
||||||
name : "areas",
|
|
||||||
template : "{area:exists}/{controller=Home}/{action=Index}/{id?}"
|
|
||||||
);
|
|
||||||
});
|
|
@ -1,95 +0,0 @@
|
|||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
using Microsoft.AspNetCore.Builder;
|
|
||||||
using Microsoft.AspNetCore.Hosting;
|
|
||||||
using Microsoft.AspNetCore.Http;
|
|
||||||
using Microsoft.AspNetCore.HttpsPolicy;
|
|
||||||
using Microsoft.AspNetCore.Mvc;
|
|
||||||
using Microsoft.AspNetCore.Mvc.Infrastructure;
|
|
||||||
using Microsoft.Extensions.Configuration;
|
|
||||||
using Microsoft.Extensions.DependencyInjection;
|
|
||||||
using Newtonsoft.Json.Serialization;
|
|
||||||
|
|
||||||
namespace FreeSql.Site.UI
|
|
||||||
{
|
|
||||||
public class Startup
|
|
||||||
{
|
|
||||||
public Startup(IConfiguration configuration)
|
|
||||||
{
|
|
||||||
Configuration = configuration;
|
|
||||||
}
|
|
||||||
|
|
||||||
public IConfiguration Configuration { get; }
|
|
||||||
|
|
||||||
// This method gets called by the runtime. Use this method to add services to the container.
|
|
||||||
public void ConfigureServices(IServiceCollection services)
|
|
||||||
{
|
|
||||||
services.Configure<CookiePolicyOptions>(options =>
|
|
||||||
{
|
|
||||||
// This lambda determines whether user consent for non-essential cookies is needed for a given request.
|
|
||||||
options.CheckConsentNeeded = context => true;
|
|
||||||
options.MinimumSameSitePolicy = SameSiteMode.None;
|
|
||||||
});
|
|
||||||
|
|
||||||
//设置Action方法
|
|
||||||
services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
|
|
||||||
services.AddSingleton<IActionContextAccessor, ActionContextAccessor>();
|
|
||||||
|
|
||||||
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1)
|
|
||||||
//设置返回内容得大小写格式
|
|
||||||
.AddJsonOptions(options => { options.SerializerSettings.ContractResolver = new DefaultContractResolver(); });
|
|
||||||
|
|
||||||
//Session服务
|
|
||||||
services.AddSession();
|
|
||||||
|
|
||||||
//添加跨域访问
|
|
||||||
services.AddCors(options => options.AddPolicy("AllowAnyOrigin",
|
|
||||||
builder => builder.WithOrigins("*")
|
|
||||||
.AllowAnyMethod()
|
|
||||||
.AllowAnyHeader()
|
|
||||||
.AllowAnyOrigin()
|
|
||||||
.AllowCredentials()));
|
|
||||||
|
|
||||||
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
|
|
||||||
}
|
|
||||||
|
|
||||||
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
|
|
||||||
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
|
|
||||||
{
|
|
||||||
if (env.IsDevelopment())
|
|
||||||
{
|
|
||||||
app.UseDeveloperExceptionPage();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
app.UseExceptionHandler("/Home/Error");
|
|
||||||
app.UseHsts();
|
|
||||||
}
|
|
||||||
|
|
||||||
app.UseHttpsRedirection();
|
|
||||||
app.UseStaticFiles();
|
|
||||||
app.UseCookiePolicy();
|
|
||||||
|
|
||||||
//app.UseMvc(routes =>
|
|
||||||
//{
|
|
||||||
// routes.MapRoute(
|
|
||||||
// name: "default",
|
|
||||||
// template: "{controller=Home}/{action=Index}/{id?}");
|
|
||||||
//});
|
|
||||||
//使用Session,必须在UseMvc之上
|
|
||||||
app.UseSession();
|
|
||||||
app.UseMvc(routes =>
|
|
||||||
{
|
|
||||||
routes.MapRoute(
|
|
||||||
name: "area",
|
|
||||||
template: "{area:exists}/{controller=Home}/{action=Index}/{id?}");
|
|
||||||
|
|
||||||
routes.MapRoute(
|
|
||||||
name: "default",
|
|
||||||
template: "{controller=Home}/{action=Index}/{id?}");
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,4 +0,0 @@
|
|||||||
@{
|
|
||||||
ViewData["Title"] = "About";
|
|
||||||
}
|
|
||||||
关于
|
|
@ -1,4 +0,0 @@
|
|||||||
@{
|
|
||||||
ViewData["Title"] = "Contact";
|
|
||||||
}
|
|
||||||
联系人
|
|
@ -1,66 +0,0 @@
|
|||||||
@{
|
|
||||||
ViewData["Title"] = ".NETCore最方便的ORM";
|
|
||||||
}
|
|
||||||
|
|
||||||
<div class="site-banner">
|
|
||||||
<div class="site-banner-bg" style="background-image: url(/images/banner_index.jpg?v=0); background-size: cover;">
|
|
||||||
</div>
|
|
||||||
<div class="site-banner-main">
|
|
||||||
<div class="site-zfj site-zfj-anim">
|
|
||||||
<i class="layui-icon" style="color: #fff; color: rgba(255,255,255,.7);"></i>
|
|
||||||
</div>
|
|
||||||
<div class="layui-anim site-desc site-desc-anim">
|
|
||||||
<p class="web-font-desc">.NETCore最方便的ORM</p>
|
|
||||||
<cite>打造.NETCore最方便的ORM,包括dbfirst、codefirst混合使用</cite>
|
|
||||||
</div>
|
|
||||||
<div class="site-download">
|
|
||||||
<a href="https://github.com/2881099/FreeSql" class="layui-inline site-down" target="_blank">
|
|
||||||
<cite class="layui-icon"></cite>
|
|
||||||
立即下载
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
<div class="site-version">
|
|
||||||
<span>当前版本:<cite class="site-showv">0.0.1.181227_Beta</cite></span>
|
|
||||||
<span><a href="/doc/base/changelog.html" rel="nofollow" target="_blank">更新日志</a></span>
|
|
||||||
<span>下载量:<em class="site-showdowns">23</em></span>
|
|
||||||
</div>
|
|
||||||
<div class="site-banner-other">
|
|
||||||
<a href="https://github.com/2881099/FreeSql" target="_blank" class="site-star">
|
|
||||||
<i class="layui-icon"></i>
|
|
||||||
Star <cite id="getStars">1</cite>
|
|
||||||
</a>
|
|
||||||
<a href="https://github.com/2881099/FreeSql" target="_blank" rel="nofollow" class="site-fork">
|
|
||||||
<i class="layui-icon">1</i>
|
|
||||||
Fork
|
|
||||||
</a>
|
|
||||||
<a href="https://github.com/2881099/FreeSql" target="_blank" rel="nofollow" class="site-fork">
|
|
||||||
Github
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="layui-main">
|
|
||||||
|
|
||||||
<ul class="site-idea">
|
|
||||||
<li>
|
|
||||||
<fieldset class="layui-elem-field layui-field-title">
|
|
||||||
<legend>返璞归真</legend>
|
|
||||||
<p>身处在前端社区的繁荣之下,我们都在有意或无意地追逐。而 FreeSql 偏偏回望当初,奔赴在返璞归真的漫漫征途,自信并勇敢着,追寻于原生态的书写指令,试图以最简单的方式诠释高效。</p>
|
|
||||||
</fieldset>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<fieldset class="layui-elem-field layui-field-title">
|
|
||||||
<legend>双面体验</legend>
|
|
||||||
<p>拥有双面的不仅是人生,还有 FreeSql。一面极简,一面丰盈。极简是视觉所见的外在,是开发所念的简易。丰盈是倾情雕琢的内在,是信手拈来的承诺。一切本应如此,简而全,双重体验。</p>
|
|
||||||
</fieldset>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<fieldset class="layui-elem-field layui-field-title">
|
|
||||||
<legend>星辰大海</legend>
|
|
||||||
<p>如果眼下还是一团零星之火,那运筹帷幄之后,迎面东风,就是一场烈焰燎原吧,那必定会是一番尽情的燃烧。待,秋风萧瑟时,散作满天星辰,你看那四季轮回<!--海天相接-->,正是 FreeSql 不灭的执念。</p>
|
|
||||||
</fieldset>
|
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
|
|
||||||
</div>
|
|
@ -1,4 +0,0 @@
|
|||||||
@{
|
|
||||||
ViewData["Title"] = "Privacy Policy";
|
|
||||||
}
|
|
||||||
隐私
|
|
@ -1,22 +0,0 @@
|
|||||||
@model ErrorViewModel
|
|
||||||
@{
|
|
||||||
ViewData["Title"] = "Error";
|
|
||||||
}
|
|
||||||
|
|
||||||
<h1 class="text-danger">Error.</h1>
|
|
||||||
<h2 class="text-danger">An error occurred while processing your request.</h2>
|
|
||||||
|
|
||||||
@if (Model.ShowRequestId)
|
|
||||||
{
|
|
||||||
<p>
|
|
||||||
<strong>Request ID:</strong> <code>@Model.RequestId</code>
|
|
||||||
</p>
|
|
||||||
}
|
|
||||||
|
|
||||||
<h3>Development Mode</h3>
|
|
||||||
<p>
|
|
||||||
Swapping to <strong>Development</strong> environment will display more detailed information about the error that occurred.
|
|
||||||
</p>
|
|
||||||
<p>
|
|
||||||
<strong>Development environment should not be enabled in deployed applications</strong>, as it can result in sensitive information from exceptions being displayed to end users. For local debugging, development environment can be enabled by setting the <strong>ASPNETCORE_ENVIRONMENT</strong> environment variable to <strong>Development</strong>, and restarting the application.
|
|
||||||
</p>
|
|
@ -1,41 +0,0 @@
|
|||||||
@using Microsoft.AspNetCore.Http.Features
|
|
||||||
|
|
||||||
@{
|
|
||||||
var consentFeature = Context.Features.Get<ITrackingConsentFeature>();
|
|
||||||
var showBanner = !consentFeature?.CanTrack ?? false;
|
|
||||||
var cookieString = consentFeature?.CreateConsentCookie();
|
|
||||||
}
|
|
||||||
|
|
||||||
@if (showBanner)
|
|
||||||
{
|
|
||||||
<nav id="cookieConsent" class="navbar navbar-default navbar-fixed-top" role="alert">
|
|
||||||
<div class="container">
|
|
||||||
<div class="navbar-header">
|
|
||||||
<button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#cookieConsent .navbar-collapse">
|
|
||||||
<span class="sr-only">Toggle cookie consent banner</span>
|
|
||||||
<span class="icon-bar"></span>
|
|
||||||
<span class="icon-bar"></span>
|
|
||||||
<span class="icon-bar"></span>
|
|
||||||
</button>
|
|
||||||
<span class="navbar-brand"><span class="glyphicon glyphicon-info-sign" aria-hidden="true"></span></span>
|
|
||||||
</div>
|
|
||||||
<div class="collapse navbar-collapse">
|
|
||||||
<p class="navbar-text">
|
|
||||||
Use this space to summarize your privacy and cookie use policy.
|
|
||||||
</p>
|
|
||||||
<div class="navbar-right">
|
|
||||||
<a asp-controller="Home" asp-action="Privacy" class="btn btn-info navbar-btn">Learn More</a>
|
|
||||||
<button type="button" class="btn btn-default navbar-btn" data-cookie-string="@cookieString">Accept</button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</nav>
|
|
||||||
<script>
|
|
||||||
(function () {
|
|
||||||
document.querySelector("#cookieConsent button[data-cookie-string]").addEventListener("click", function (el) {
|
|
||||||
document.cookie = el.target.dataset.cookieString;
|
|
||||||
document.querySelector("#cookieConsent").classList.add("hidden");
|
|
||||||
}, false);
|
|
||||||
})();
|
|
||||||
</script>
|
|
||||||
}
|
|
@ -1,201 +0,0 @@
|
|||||||
<!DOCTYPE html>
|
|
||||||
<html>
|
|
||||||
<head>
|
|
||||||
<meta charset="utf-8" />
|
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
||||||
<title>@ViewData["Title"]</title>
|
|
||||||
|
|
||||||
<environment include="Development">
|
|
||||||
<link href="~/layui/css/layui.css" rel="stylesheet" />
|
|
||||||
<link href="~/layui/lay/modules/preview.css" rel="stylesheet" />
|
|
||||||
<link rel="stylesheet" href="~/css/site.css" />
|
|
||||||
<script src="~/lib/jquery/dist/jquery.js"></script>
|
|
||||||
<script src="~/lib/bootstrap/dist/js/bootstrap.js"></script>
|
|
||||||
<script src="https://cdn.jsdelivr.net/npm/marked/marked.min.js"></script>
|
|
||||||
<script src="https://cdn.bootcss.com/highlight.js/9.13.1/highlight.min.js"></script>
|
|
||||||
<script src="~/layui/layui.js"></script>
|
|
||||||
<script src="~/layui/lay/modules/layer.js"></script>
|
|
||||||
<script src="~/js/common.js"></script>
|
|
||||||
</environment>
|
|
||||||
<environment exclude="Development">
|
|
||||||
<link rel="stylesheet" href="https://ajax.aspnetcdn.com/ajax/bootstrap/3.3.7/css/bootstrap.min.css"
|
|
||||||
asp-fallback-href="~/lib/bootstrap/dist/css/bootstrap.min.css"
|
|
||||||
asp-fallback-test-class="sr-only" asp-fallback-test-property="position" asp-fallback-test-value="absolute" />
|
|
||||||
<link rel="stylesheet" href="~/css/site.min.css" asp-append-version="true" />
|
|
||||||
|
|
||||||
</environment>
|
|
||||||
</head>
|
|
||||||
<body class="site-home" id="LAY_home" style="background-color: #fff;" data-date="12-27">
|
|
||||||
<div class="layui-header header header-index" winter="">
|
|
||||||
<div class="layui-main">
|
|
||||||
<a class="logo" href="/">
|
|
||||||
@*<img src="//res.layui.com/static/images/layui/logo.png" alt="layui">*@
|
|
||||||
<span style="font-size:25px; letter-spacing:1px; color:#fff;">FreeSql</span>
|
|
||||||
</a>
|
|
||||||
<div class="layui-form component">
|
|
||||||
<select lay-search="" lay-filter="component">
|
|
||||||
<option value="">搜索功能</option>
|
|
||||||
<option value="element/layout.html">实体</option>
|
|
||||||
<option value="element/layout.html#admin">查询</option>
|
|
||||||
<option value="element/color.html">联表之一:使用导航属性</option>
|
|
||||||
<option value="element/icon.html">联表之二:无导航属性</option>
|
|
||||||
<option value="element/anim.html">联表之三:b, c 条件怎么设?试试这种!</option>
|
|
||||||
<option value="element/button.html">联表之四:原生SQL联表</option>
|
|
||||||
<option value="element/form.html">分组聚合</option>
|
|
||||||
<option value="element/form.html#input">执行SQL返回数据</option>
|
|
||||||
<option value="element/form.html#select">添加</option>
|
|
||||||
<option value="element/form.html#checkbox">执行命令</option>
|
|
||||||
<option value="element/form.html#switch">修改</option>
|
|
||||||
<option value="element/form.html#radio">更新条件</option>
|
|
||||||
<option value="element/form.html#textarea">自定义SQL</option>
|
|
||||||
<option value="element/nav.html">删除</option>
|
|
||||||
<option value="element/nav.html#breadcrumb">表达式函数</option>
|
|
||||||
</select>
|
|
||||||
<div class="layui-form-select">
|
|
||||||
<div class="layui-select-title">
|
|
||||||
<input type="text" placeholder="搜索组件或模块" value="" class="layui-input"><i class="layui-edge"></i>
|
|
||||||
</div>
|
|
||||||
<dl class="layui-anim layui-anim-upbit" style="">
|
|
||||||
<dd lay-value="" class="layui-select-tips layui-this">搜索组件或模块</dd>
|
|
||||||
<dd lay-value="element/layout.html" class="">grid 栅格布局</dd>
|
|
||||||
<dd lay-value="element/layout.html#admin" class="">admin 后台布局</dd>
|
|
||||||
<dd lay-value="element/color.html" class="">color 颜色</dd>
|
|
||||||
<dd lay-value="element/icon.html" class="">iconfont 字体图标</dd>
|
|
||||||
<dd lay-value="element/anim.html" class="">animation 动画</dd>
|
|
||||||
<dd lay-value="element/button.html" class="">button 按钮</dd>
|
|
||||||
<dd lay-value="element/form.html" class="">form 表单组</dd>
|
|
||||||
<dd lay-value="element/form.html#input" class="">input 输入框</dd>
|
|
||||||
<dd lay-value="element/form.html#select" class="">select 下拉选择框</dd>
|
|
||||||
<dd lay-value="element/form.html#checkbox" class="">checkbox 复选框</dd>
|
|
||||||
<dd lay-value="element/form.html#switch" class="">switch 开关</dd>
|
|
||||||
<dd lay-value="element/form.html#radio" class="">radio 单选框</dd>
|
|
||||||
<dd lay-value="element/form.html#textarea" class="">textarea 文本域</dd>
|
|
||||||
<dd lay-value="element/nav.html" class="">nav 导航菜单</dd>
|
|
||||||
<dd lay-value="element/nav.html#breadcrumb" class="">breadcrumb 面包屑</dd>
|
|
||||||
<dd lay-value="element/tab.html" class="">tabs 选项卡</dd>
|
|
||||||
<dd lay-value="element/progress.html" class="">progress 进度条</dd>
|
|
||||||
<dd lay-value="element/collapse.html" class="">collapse 折叠面板/手风琴</dd>
|
|
||||||
<dd lay-value="element/table.html" class="">table 表格元素</dd>
|
|
||||||
<dd lay-value="element/badge.html" class="">badge 徽章</dd>
|
|
||||||
<dd lay-value="element/timeline.html" class="">timeline 时间线</dd>
|
|
||||||
<dd lay-value="element/auxiliar.html#blockquote" class="">blockquote 引用块</dd>
|
|
||||||
<dd lay-value="element/auxiliar.html#fieldset" class="">fieldset 字段集</dd>
|
|
||||||
<dd lay-value="element/auxiliar.html#hr" class="">hr 分割线</dd>
|
|
||||||
<dd lay-value="modules/layer.html" class="">layer 弹出层/弹窗综合</dd>
|
|
||||||
<dd lay-value="modules/laydate.html" class="">laydate 日期时间选择器</dd>
|
|
||||||
<dd lay-value="modules/layim.html" class="">layim 即时通讯/聊天</dd>
|
|
||||||
<dd lay-value="modules/laypage.html" class="">laypage 分页</dd>
|
|
||||||
<dd lay-value="modules/laytpl.html" class="">laytpl 模板引擎</dd>
|
|
||||||
<dd lay-value="modules/form.html" class="">form 表单模块</dd>
|
|
||||||
<dd lay-value="modules/table.html" class="">table 数据表格</dd>
|
|
||||||
<dd lay-value="modules/upload.html" class="">upload 文件/图片上传</dd>
|
|
||||||
<dd lay-value="modules/element.html" class="">element 常用元素操作</dd>
|
|
||||||
<dd lay-value="modules/rate.html" class="">rate 评分</dd>
|
|
||||||
<dd lay-value="modules/colorpicker.html" class="">colorpicker 颜色选择器</dd>
|
|
||||||
<dd lay-value="modules/slider.html" class="">slider 滑块</dd>
|
|
||||||
<dd lay-value="modules/carousel.html" class="">carousel 轮播/跑马灯</dd>
|
|
||||||
<dd lay-value="modules/layedit.html" class="">layedit 富文本编辑器</dd>
|
|
||||||
<dd lay-value="modules/tree.html" class="">tree 树形菜单</dd>
|
|
||||||
<dd lay-value="modules/flow.html" class="">flow 信息流/图片懒加载</dd>
|
|
||||||
<dd lay-value="modules/util.html" class="">util 工具集</dd>
|
|
||||||
<dd lay-value="modules/code.html" class="">code 代码修饰</dd>
|
|
||||||
</dl>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<ul class="layui-nav">
|
|
||||||
<li class="layui-nav-item ">
|
|
||||||
<a href="/doc/documents/" target="_self">文档<!-- <span class="layui-badge-dot"></span> --></a>
|
|
||||||
</li>
|
|
||||||
<li class="layui-nav-item ">
|
|
||||||
<a href="/example/main/" target="_self">示例<!-- <span class="layui-badge-dot"></span> --></a>
|
|
||||||
</li>
|
|
||||||
<li class="layui-nav-item layui-hide-xs">
|
|
||||||
<a href="/bbs/bbscontent/" target="_self">社区</a>
|
|
||||||
</li>
|
|
||||||
|
|
||||||
@*<li class="layui-nav-item">
|
|
||||||
<a href="javascript:;"><span class="layui-badge-dot" style="margin: -5px 0 0 -15px;"></span>周边<span class="layui-nav-more"></span></a>
|
|
||||||
<dl class="layui-nav-child layui-anim layui-anim-upbit">
|
|
||||||
<dd lay-unselect="">
|
|
||||||
<a href="//fly.layui.com/extend/" target="_blank">扩展组件</a>
|
|
||||||
</dd>
|
|
||||||
<dd lay-unselect="">
|
|
||||||
<a href="//fly.layui.com/store/" target="_blank">模板市场 <span class="layui-badge-dot"></span></a>
|
|
||||||
<hr>
|
|
||||||
</dd>
|
|
||||||
|
|
||||||
<dd class="layui-hide-sm layui-show-xs" lay-unselect="">
|
|
||||||
<a href="//fly.layui.com/" target="_blank">社区交流</a>
|
|
||||||
<hr>
|
|
||||||
</dd>
|
|
||||||
<dd lay-unselect=""><a href="/admin/" target="_blank">后台模板</a></dd>
|
|
||||||
<dd lay-unselect=""><a href="/layim/" target="_blank">即时聊天</a><hr></dd>
|
|
||||||
|
|
||||||
<dd lay-unselect=""><a href="/alone.html" target="_blank" lay-unselect="">独立组件</a></dd>
|
|
||||||
<dd lay-unselect=""><a href="#" target="_blank">Axure 组件</a></dd>
|
|
||||||
</dl>
|
|
||||||
</li>*@
|
|
||||||
|
|
||||||
<li class="layui-nav-item layui-hide-xs" lay-unselect="">
|
|
||||||
<a href="/Example/Template">模板下载<span class="layui-badge-dot" style="margin-top: -5px;"></span></a>
|
|
||||||
</li>
|
|
||||||
<span class="layui-nav-bar" style="left: 54px; top: 55px; width: 0px; opacity: 0;"></span>
|
|
||||||
</ul>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<partial name="_CookieConsentPartial" />
|
|
||||||
|
|
||||||
<div class="container body-content">
|
|
||||||
@RenderBody()
|
|
||||||
<div class="layui-footer footer footer-index">
|
|
||||||
<div class="layui-main">
|
|
||||||
<p>© 2018 <a href="/">FreeSql.com</a> MIT license</p>
|
|
||||||
<p>
|
|
||||||
<a href="#" target="_blank">案例</a>
|
|
||||||
<a href="#" target="_blank">支持</a>
|
|
||||||
<a href="#" target="_blank" rel="nofollow">GitHub</a>
|
|
||||||
<a href="#" target="_blank" rel="nofollow">码云</a>
|
|
||||||
<a href="#" target="_blank">公众号</a>
|
|
||||||
<a href="#" target="_blank" rel="nofollow">赣ICP备xxxxxxx号-2</a>
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<environment include="Development">
|
|
||||||
@*<script src="~/js/site.js" asp-append-version="true"></script>*@
|
|
||||||
<script src="~/layui/layui.js"></script>
|
|
||||||
<script>
|
|
||||||
layui.config({
|
|
||||||
base: '/layui/lay/modules/'
|
|
||||||
, version: '31111'
|
|
||||||
}).use('global');
|
|
||||||
|
|
||||||
window.global = {
|
|
||||||
preview: function () {
|
|
||||||
var preview = document.getElementById('LAY_preview');
|
|
||||||
return preview ? preview.innerHTML : '';
|
|
||||||
}()
|
|
||||||
};
|
|
||||||
</script>
|
|
||||||
</environment>
|
|
||||||
<environment exclude="Development">
|
|
||||||
<script src="https://ajax.aspnetcdn.com/ajax/jquery/jquery-3.3.1.min.js"
|
|
||||||
asp-fallback-src="~/lib/jquery/dist/jquery.min.js"
|
|
||||||
asp-fallback-test="window.jQuery"
|
|
||||||
crossorigin="anonymous"
|
|
||||||
integrity="sha384-tsQFqpEReu7ZLhBV2VZlAu7zcOV+rXbYlF2cqB8txI/8aZajjp4Bqd+V6D5IgvKT">
|
|
||||||
</script>
|
|
||||||
<script src="https://ajax.aspnetcdn.com/ajax/bootstrap/3.3.7/bootstrap.min.js"
|
|
||||||
asp-fallback-src="~/lib/bootstrap/dist/js/bootstrap.min.js"
|
|
||||||
asp-fallback-test="window.jQuery && window.jQuery.fn && window.jQuery.fn.modal"
|
|
||||||
crossorigin="anonymous"
|
|
||||||
integrity="sha384-Tc5IQib027qvyjSMfHjOMaLkfuWVxZxUPnCJA7l2mCWNIpG9mGCD8wGNIcPD7Txa">
|
|
||||||
</script>
|
|
||||||
<script src="~/js/site.min.js" asp-append-version="true"></script>
|
|
||||||
</environment>
|
|
||||||
|
|
||||||
@RenderSection("Scripts", required: false)
|
|
||||||
</body>
|
|
||||||
</html>
|
|
@ -1,18 +0,0 @@
|
|||||||
<environment include="Development">
|
|
||||||
<script src="~/lib/jquery-validation/dist/jquery.validate.js"></script>
|
|
||||||
<script src="~/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.js"></script>
|
|
||||||
</environment>
|
|
||||||
<environment exclude="Development">
|
|
||||||
<script src="https://ajax.aspnetcdn.com/ajax/jquery.validate/1.17.0/jquery.validate.min.js"
|
|
||||||
asp-fallback-src="~/lib/jquery-validation/dist/jquery.validate.min.js"
|
|
||||||
asp-fallback-test="window.jQuery && window.jQuery.validator"
|
|
||||||
crossorigin="anonymous"
|
|
||||||
integrity="sha384-rZfj/ogBloos6wzLGpPkkOr/gpkBNLZ6b6yLy4o+ok+t/SAKlL5mvXLr0OXNi1Hp">
|
|
||||||
</script>
|
|
||||||
<script src="https://ajax.aspnetcdn.com/ajax/jquery.validation.unobtrusive/3.2.9/jquery.validate.unobtrusive.min.js"
|
|
||||||
asp-fallback-src="~/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.min.js"
|
|
||||||
asp-fallback-test="window.jQuery && window.jQuery.validator && window.jQuery.validator.unobtrusive"
|
|
||||||
crossorigin="anonymous"
|
|
||||||
integrity="sha384-ifv0TYDWxBHzvAk2Z0n8R434FL1Rlv/Av18DXE43N/1rvHyOG4izKst0f2iSLdds">
|
|
||||||
</script>
|
|
||||||
</environment>
|
|
@ -1,4 +0,0 @@
|
|||||||
@using FreeSql.Site.UI
|
|
||||||
@using FreeSql.Site.UI.Models
|
|
||||||
@using FreeSql.Site.UI.Common
|
|
||||||
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
|
|
@ -1,3 +0,0 @@
|
|||||||
@{
|
|
||||||
Layout = "_Layout";
|
|
||||||
}
|
|
@ -1,22 +0,0 @@
|
|||||||
{
|
|
||||||
"ConnectionStrings": {
|
|
||||||
"DefaultDbContext": "Data Source=127.0.0.1;Port=3307;User ID=root;Password=abc123456;Database=FreeSqlTest;Charset=utf8;SslMode=none;Max pool size=10"
|
|
||||||
},
|
|
||||||
"DbContexts": {
|
|
||||||
"SqlServer": {
|
|
||||||
"ConnectionString": "Data Source=127.0.0.1;Port=3307;User ID=root;Password=abc123456;Database=FreeSqlTest;Charset=utf8;SslMode=none;Max pool size=10",
|
|
||||||
"IsAutoMigration": true
|
|
||||||
},
|
|
||||||
"MySql": {
|
|
||||||
"ConnectionString": "Data Source=127.0.0.1;Port=3307;User ID=root;Password=abc123456;Database=FreeSqlTest;Charset=utf8;SslMode=none;Max pool size=10",
|
|
||||||
"IsAutoMigration": true
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"Logging": {
|
|
||||||
"LogLevel": {
|
|
||||||
"Default": "Debug",
|
|
||||||
"System": "Information",
|
|
||||||
"Microsoft": "Information"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,8 +0,0 @@
|
|||||||
{
|
|
||||||
"Logging": {
|
|
||||||
"LogLevel": {
|
|
||||||
"Default": "Warning"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"AllowedHosts": "*"
|
|
||||||
}
|
|
@ -1,43 +0,0 @@
|
|||||||
|
|
||||||
.layui-layer-content {
|
|
||||||
padding: 0px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.layui-form-label {
|
|
||||||
width: 80px;
|
|
||||||
font-weight:bold;
|
|
||||||
}
|
|
||||||
|
|
||||||
.layui-input, .layui-textarea {
|
|
||||||
display: block;
|
|
||||||
width: 100%;
|
|
||||||
padding-left: 10px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.form-module-content {
|
|
||||||
border: 0px solid red;
|
|
||||||
overflow: auto;
|
|
||||||
/*height: 548px;*/
|
|
||||||
height: 80%;
|
|
||||||
padding: 5px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.form-module-footer {
|
|
||||||
border: 0px solid red;
|
|
||||||
height: 55px;
|
|
||||||
width: 100%;
|
|
||||||
position: absolute;
|
|
||||||
border-top: 5px solid #e8e8e8;
|
|
||||||
/*border-bottom: 5px solid #dedede;*/
|
|
||||||
left: 0;
|
|
||||||
bottom: 0px;
|
|
||||||
width: 100%;
|
|
||||||
text-align: right;
|
|
||||||
z-index: 100;
|
|
||||||
padding: 0px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.form-module-footer button {
|
|
||||||
margin-right: 10px;
|
|
||||||
margin-top: 10px;
|
|
||||||
}
|
|
@ -1 +0,0 @@
|
|||||||
body{padding-top:50px;padding-bottom:20px}.body-content{padding-left:15px;padding-right:15px}.carousel-caption p{font-size:20px;line-height:1.4}.carousel-inner .item img[src$=".svg"]{width:100%}#qrCode{margin:15px}@media screen and (max-width:767px){.carousel-caption{display:none}}
|
|
File diff suppressed because it is too large
Load Diff
@ -1 +0,0 @@
|
|||||||
body{padding-top:50px;padding-bottom:20px}.body-content{padding-left:15px;padding-right:15px}.carousel-caption p{font-size:20px;line-height:1.4}.carousel-inner .item img[src$=".svg"]{width:100%}#qrCode{margin:15px}@media screen and (max-width:767px){.carousel-caption{display:none}}
|
|
@ -1,95 +0,0 @@
|
|||||||
{
|
|
||||||
"code": 0
|
|
||||||
,"msg": ""
|
|
||||||
,"count": 3000000
|
|
||||||
,"data": [{
|
|
||||||
"id": "10001"
|
|
||||||
,"username": "杜甫"
|
|
||||||
,"email": "xianxin@layui.com"
|
|
||||||
,"sex": "男"
|
|
||||||
,"city": "浙江杭州"
|
|
||||||
,"sign": "点击此处,显示更多。当内容超出时,点击单元格会自动显示更多内容。"
|
|
||||||
,"experience": "116"
|
|
||||||
,"ip": "192.168.0.8"
|
|
||||||
,"logins": "108"
|
|
||||||
,"joinTime": "2016-10-14"
|
|
||||||
}, {
|
|
||||||
"id": "10002"
|
|
||||||
,"username": "李白"
|
|
||||||
,"email": "xianxin@layui.com"
|
|
||||||
,"sex": "男"
|
|
||||||
,"city": "浙江杭州"
|
|
||||||
,"sign": "君不见,黄河之水天上来,奔流到海不复回。 君不见,高堂明镜悲白发,朝如青丝暮成雪。 人生得意须尽欢,莫使金樽空对月。 天生我材必有用,千金散尽还复来。 烹羊宰牛且为乐,会须一饮三百杯。 岑夫子,丹丘生,将进酒,杯莫停。 与君歌一曲,请君为我倾耳听。(倾耳听 一作:侧耳听) 钟鼓馔玉不足贵,但愿长醉不复醒。(不足贵 一作:何足贵;不复醒 一作:不愿醒/不用醒) 古来圣贤皆寂寞,惟有饮者留其名。(古来 一作:自古;惟 通:唯) 陈王昔时宴平乐,斗酒十千恣欢谑。 主人何为言少钱,径须沽取对君酌。 五花马,千金裘,呼儿将出换美酒,与尔同销万古愁。"
|
|
||||||
,"experience": "12"
|
|
||||||
,"ip": "192.168.0.8"
|
|
||||||
,"logins": "106"
|
|
||||||
,"joinTime": "2016-10-14"
|
|
||||||
,"LAY_CHECKED": true
|
|
||||||
}, {
|
|
||||||
"id": "10003"
|
|
||||||
,"username": "王勃"
|
|
||||||
,"email": "xianxin@layui.com"
|
|
||||||
,"sex": "男"
|
|
||||||
,"city": "浙江杭州"
|
|
||||||
,"sign": "人生恰似一场修行"
|
|
||||||
,"experience": "65"
|
|
||||||
,"ip": "192.168.0.8"
|
|
||||||
,"logins": "106"
|
|
||||||
,"joinTime": "2016-10-14"
|
|
||||||
}, {
|
|
||||||
"id": "10004"
|
|
||||||
,"username": "李清照"
|
|
||||||
,"email": "xianxin@layui.com"
|
|
||||||
,"sex": "女"
|
|
||||||
,"city": "浙江杭州"
|
|
||||||
,"sign": "人生恰似一场修行"
|
|
||||||
,"experience": "666"
|
|
||||||
,"ip": "192.168.0.8"
|
|
||||||
,"logins": "106"
|
|
||||||
,"joinTime": "2016-10-14"
|
|
||||||
}, {
|
|
||||||
"id": "10005"
|
|
||||||
,"username": "冰心"
|
|
||||||
,"email": "xianxin@layui.com"
|
|
||||||
,"sex": "女"
|
|
||||||
,"city": "浙江杭州"
|
|
||||||
,"sign": "人生恰似一场修行"
|
|
||||||
,"experience": "86"
|
|
||||||
,"ip": "192.168.0.8"
|
|
||||||
,"logins": "106"
|
|
||||||
,"joinTime": "2016-10-14"
|
|
||||||
}, {
|
|
||||||
"id": "10006"
|
|
||||||
,"username": "贤心"
|
|
||||||
,"email": "xianxin@layui.com"
|
|
||||||
,"sex": "男"
|
|
||||||
,"city": "浙江杭州"
|
|
||||||
,"sign": "人生恰似一场修行"
|
|
||||||
,"experience": "12"
|
|
||||||
,"ip": "192.168.0.8"
|
|
||||||
,"logins": "106"
|
|
||||||
,"joinTime": "2016-10-14"
|
|
||||||
}, {
|
|
||||||
"id": "10007"
|
|
||||||
,"username": "贤心"
|
|
||||||
,"email": "xianxin@layui.com"
|
|
||||||
,"sex": "男"
|
|
||||||
,"city": "浙江杭州"
|
|
||||||
,"sign": "人生恰似一场修行"
|
|
||||||
,"experience": "16"
|
|
||||||
,"ip": "192.168.0.8"
|
|
||||||
,"logins": "106"
|
|
||||||
,"joinTime": "2016-10-14"
|
|
||||||
}, {
|
|
||||||
"id": "10008"
|
|
||||||
,"username": "贤心"
|
|
||||||
,"email": "xianxin@layui.com"
|
|
||||||
,"sex": "男"
|
|
||||||
,"city": "浙江杭州"
|
|
||||||
,"sign": "人生恰似一场修行"
|
|
||||||
,"experience": "106"
|
|
||||||
,"ip": "192.168.0.8"
|
|
||||||
,"logins": "106"
|
|
||||||
,"joinTime": "2016-10-14"
|
|
||||||
}]
|
|
||||||
}
|
|
Binary file not shown.
Before Width: | Height: | Size: 31 KiB |
@ -1,129 +0,0 @@
|
|||||||
# CodeFirst
|
|
||||||
|
|
||||||
| 数据库 | 支持的类型类型 |
|
|
||||||
| - | - |
|
|
||||||
| MySql | bool, sbyte, short, int, long, byte, ushort, uint, ulong, double, float, decimal, Guid, TimeSpan, DateTime<br>bool?, sbyte?, short?, int?, long?, byte?, ushort?, uint?, ulong?, double?, float?, decimal?, Guid?, TimeSpan?, DateTime?<br>byte[], string, Enum & FlagsEnum<br>MygisPoint, MygisLineString, MygisPolygon, MygisMultiPoint, MygisMultiLineString, MygisMultiPolygon |
|
|
||||||
| SqlServer | bool, sbyte, short, int, long, byte, ushort, uint, ulong, double, float, decimal, Guid, TimeSpan, DateTime, DateTimeOffset<br>bool?, sbyte?, short?, int?, long?, byte?, ushort?, uint?, ulong?, double?, float?, decimal?, Guid?, TimeSpan?, DateTime?, DateTimeOffset?<br>byte[], string, Enum & FlagsEnum |
|
|
||||||
|
|
||||||
|
|
||||||
```csharp
|
|
||||||
IFreeSql fsql = new FreeSql.FreeSqlBuilder()
|
|
||||||
.UseConnectionString(FreeSql.DataType.MySql, "Data Source=127.0.0.1;Port=3306;User ID=root;Password=root;Initial Catalog=cccddd;Charset=utf8;SslMode=none;Max pool size=10")
|
|
||||||
.Build();
|
|
||||||
```
|
|
||||||
|
|
||||||
### 自动同步实体结构【开发环境必备】
|
|
||||||
|
|
||||||
自动同步实体结构到数据库,程序运行中检查实体表是否存在,然后创建或修改
|
|
||||||
|
|
||||||
```csharp
|
|
||||||
fsql.CodeFirst.IsAutoSyncDataStructure = true;
|
|
||||||
```
|
|
||||||
|
|
||||||
> 此功能默认为开启状态,发布正式环境后,请修改此设置
|
|
||||||
|
|
||||||
> 虽然【自动同步实体结构】功能开发非常好用,但是有个坏处,就是数据库后面会很乱,没用的字段一大堆
|
|
||||||
|
|
||||||
### 手工同步实体结构
|
|
||||||
|
|
||||||
| 实体&表对比 | 添加 | 改名 | 删除 |
|
|
||||||
| - | - | - | - |
|
|
||||||
| | √ | √ | X |
|
|
||||||
|
|
||||||
| 实体属性&字段对比 | 添加 | 修改可空 | 修改自增 | 修改类型 | 改名 | 删除 |
|
|
||||||
| - | - | - | - | - | - | - |
|
|
||||||
| | √ | √ | √ | √ | √ | X |
|
|
||||||
|
|
||||||
> 为了保证安全,不提供删除字段
|
|
||||||
|
|
||||||
|
|
||||||
1、提供方法对比实体,与数据库中的变化部分
|
|
||||||
|
|
||||||
```csharp
|
|
||||||
var t1 = mysql.CodeFirst.GetComparisonDDLStatements<Topic>();
|
|
||||||
|
|
||||||
class Topic {
|
|
||||||
[Column(IsIdentity = true, IsPrimary = true)]
|
|
||||||
public int Id { get; set; }
|
|
||||||
public int Clicks { get; set; }
|
|
||||||
public TestTypeInfo Type { get; set; }
|
|
||||||
public string Title { get; set; }
|
|
||||||
public DateTime CreateTime { get; set; }
|
|
||||||
public ushort fusho { get; set; }
|
|
||||||
}
|
|
||||||
```
|
|
||||||
```sql
|
|
||||||
CREATE TABLE IF NOT EXISTS `cccddd`.`Topic` (
|
|
||||||
`Id` INT(11) NOT NULL AUTO_INCREMENT,
|
|
||||||
`Clicks` INT(11) NOT NULL,
|
|
||||||
`Title` VARCHAR(255),
|
|
||||||
`CreateTime` DATETIME NOT NULL,
|
|
||||||
`fusho` SMALLINT(5) UNSIGNED NOT NULL,
|
|
||||||
PRIMARY KEY (`Id`)
|
|
||||||
) Engine=InnoDB CHARACTER SET utf8;
|
|
||||||
```
|
|
||||||
|
|
||||||
2、指定实体的表名
|
|
||||||
|
|
||||||
指定 Name 后,实体类名变化不影响数据库对应的表
|
|
||||||
```csharp
|
|
||||||
[Table(Name = "tb_topic111")]
|
|
||||||
class Topic {
|
|
||||||
//...
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
3、无指定实体的表名,修改实体类名
|
|
||||||
|
|
||||||
指定数据库旧的表名,修改实体命名时,同时设置此参数为修改之前的值,CodeFirst才可以正确修改数据库表;否则将视为【创建新表】
|
|
||||||
|
|
||||||
```csharp
|
|
||||||
[Table(OldName = "Topic")]
|
|
||||||
class Topic2 {
|
|
||||||
//...
|
|
||||||
}
|
|
||||||
```
|
|
||||||
```sql
|
|
||||||
ALTER TABLE `cccddd`.`Topic` RENAME TO `cccddd`.`Topic2`;
|
|
||||||
```
|
|
||||||
|
|
||||||
4、修改属性的类型
|
|
||||||
|
|
||||||
把 Id 类型改为 uint 后
|
|
||||||
```sql
|
|
||||||
ALTER TABLE `cccddd`.`Topic2` MODIFY `Id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT;
|
|
||||||
```
|
|
||||||
```csharp
|
|
||||||
[Column(DbType = "varchar(128)")]
|
|
||||||
public string Title { get; set; }
|
|
||||||
```
|
|
||||||
```sql
|
|
||||||
ALTER TABLE `cccddd`.`Topic2` MODIFY `Title2` VARCHAR(128);
|
|
||||||
```
|
|
||||||
|
|
||||||
5、指定属性的字段名
|
|
||||||
|
|
||||||
这样指定后,修改实体的属性名不影响数据库对应的列
|
|
||||||
```csharp
|
|
||||||
[Column(Name = "titl2")]
|
|
||||||
public string Title { get; set; }
|
|
||||||
```
|
|
||||||
|
|
||||||
6、无指定属性的字段名,修改属性名
|
|
||||||
|
|
||||||
指定数据库旧的列名,修改实体属性命名时,同时设置此参数为修改之前的值,CodeFirst才可以正确修改数据库字段;否则将视为【新增字段】
|
|
||||||
|
|
||||||
```csharp
|
|
||||||
[Column(OldName = "Title2")]
|
|
||||||
public string Title { get; set; }
|
|
||||||
```
|
|
||||||
```sql
|
|
||||||
ALTER TABLE `cccddd`.`Topic2` CHANGE COLUMN `Title2` `Title` VARCHAR(255);
|
|
||||||
```
|
|
||||||
|
|
||||||
7、提供方法同步结构
|
|
||||||
|
|
||||||
```csharp
|
|
||||||
var t2 = fsql.CodeFirst.SyncStructure<Topic>();
|
|
||||||
//同步实体类型到数据库
|
|
||||||
```
|
|
@ -1,109 +0,0 @@
|
|||||||
# DbFirst
|
|
||||||
|
|
||||||
```csharp
|
|
||||||
IFreeSql fsql = new FreeSql.FreeSqlBuilder()
|
|
||||||
.UseConnectionString(FreeSql.DataType.MySql, "Data Source=127.0.0.1;Port=3306;User ID=root;Password=root;Initial Catalog=cccddd;Charset=utf8;SslMode=none;Max pool size=10")
|
|
||||||
.Build();
|
|
||||||
```
|
|
||||||
|
|
||||||
### 获取所有数据库
|
|
||||||
|
|
||||||
```csharp
|
|
||||||
var t1 = fsql.DbFirst.GetDatabases();
|
|
||||||
//返回字符串数组, ["cccddd", "test"]
|
|
||||||
```
|
|
||||||
|
|
||||||
### 获取指定数据库的表信息
|
|
||||||
|
|
||||||
```csharp
|
|
||||||
var t2 = fsql.DbFirst.GetTablesByDatabase(fsql.DbFirst.GetDatabases()[0]);
|
|
||||||
//返回包括表、列详情、主键、唯一键、索引、外键
|
|
||||||
```
|
|
||||||
|
|
||||||
# 生成器
|
|
||||||
|
|
||||||
生成器是基于 dbfirst 开发的辅助工具,适用老项目一键生成实体。生成器采用模板的方式,作者实现了三种生成模板:
|
|
||||||
|
|
||||||
| 模板名称 | 路径 | 类型映射 | 外键导航属性 | 缓存管理 | 失血 | 贫血 | 充血 |
|
|
||||||
| ------------- | - | - |- | - |- | - |- |
|
|
||||||
| simple-entity | ../Templates/MySql/simple-entity | √ | X | X | √ | X | X |
|
|
||||||
| simple-entity-navigation-object | ../Templates/MySql/simple-entity-navigation-object | √ | √ | X | √ | X | X |
|
|
||||||
| rich-entity-navigation-object | ../Templates/MySql/rich-entity-navigation-object | √ | √ | √ | X | √ | X |
|
|
||||||
|
|
||||||
> 更多模板逐步开发中。。。
|
|
||||||
|
|
||||||
```csharp
|
|
||||||
//创建模板生成类实现
|
|
||||||
var gen = new FreeSql.Generator.TemplateGenerator();
|
|
||||||
gen.Build(fsql.DbFirst,
|
|
||||||
@"C:\Users\28810\Desktop\github\FreeSql\Templates\MySql\simple-entity", //模板目录(事先下载)
|
|
||||||
@"C:\Users\28810\Desktop\新建文件夹 (9)", //生成后保存的目录
|
|
||||||
"cccddd" //数据库
|
|
||||||
);
|
|
||||||
```
|
|
||||||
|
|
||||||
## 模板语法
|
|
||||||
|
|
||||||
```html
|
|
||||||
<html>
|
|
||||||
<head>
|
|
||||||
<title>{#title}</title>
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
|
|
||||||
<!--绑定表达式-->
|
|
||||||
{#表达式}
|
|
||||||
{##表达式} 当表达式可能发生runtime错误时使用,性能没有上面的高
|
|
||||||
|
|
||||||
<!--可嵌套使用,同一标签最多支持3个指令-->
|
|
||||||
{include ../header.html}
|
|
||||||
<div @for="i 1, 101">
|
|
||||||
<p @if="i === 50" @for="item,index in data">aaa</p>
|
|
||||||
<p @else="i % 3 === 0">bbb {#i}</p>
|
|
||||||
<p @else="">ccc {#i}</p>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<!--定义模块,可以将公共模块定义到一个文件中-->
|
|
||||||
{module module_name1 parms1, 2, 3...}
|
|
||||||
{/module}
|
|
||||||
{module module_name2 parms1, 2, 3...}
|
|
||||||
{/module}
|
|
||||||
|
|
||||||
<!--使用模块-->
|
|
||||||
{import ../module.html as myname}
|
|
||||||
{#myname.module_name(parms1, 2, 3...)}
|
|
||||||
|
|
||||||
<!--继承-->
|
|
||||||
{extends ../inc/layout.html}
|
|
||||||
{block body}{/block}
|
|
||||||
|
|
||||||
<!--嵌入代码块-->
|
|
||||||
{%
|
|
||||||
for (var a = 0; a < 100; a++)
|
|
||||||
print(a);
|
|
||||||
%}
|
|
||||||
|
|
||||||
<!--条件分支-->
|
|
||||||
{if i === 50}
|
|
||||||
{elseif i > 60}
|
|
||||||
{else}
|
|
||||||
{/if}
|
|
||||||
|
|
||||||
<!--三种循环-->
|
|
||||||
{for i 1,101} 可自定义名 {for index2 表达式1 in 表达式2}
|
|
||||||
|
|
||||||
{for item,index in items} 可选参数称 index
|
|
||||||
可自定义名 {for item2, index99 in 数组表达式}
|
|
||||||
|
|
||||||
{for key,item,index on json} 可选参数 item, index,
|
|
||||||
可自定义名 {for key2, item2, index99 in 对象表达式}
|
|
||||||
{/for}
|
|
||||||
|
|
||||||
<!--不被解析-->
|
|
||||||
{miss}
|
|
||||||
此块内容不被bmw.js解析
|
|
||||||
{/miss}
|
|
||||||
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
```
|
|
@ -1,82 +0,0 @@
|
|||||||
# 删除数据
|
|
||||||
|
|
||||||
| 方法 | 返回值 | 参数 | 描述 |
|
|
||||||
| - | - | - | - |
|
|
||||||
| Where | \<this\> | Lambda | 表达式条件,仅支持实体基础成员(不包含导航对象) |
|
|
||||||
| Where | \<this\> | string, parms | 原生sql语法条件,Where("id = ?id", new { id = 1 }) |
|
|
||||||
| Where | \<this\> | T1 \| IEnumerable<T1> | 传入实体或集合,将其主键作为条件 |
|
|
||||||
| WhereExists | \<this\> | ISelect | 子查询是否存在 |
|
|
||||||
| ToSql | string | | 返回即将执行的SQL语句 |
|
|
||||||
| ExecuteAffrows | long | | 执行SQL语句,返回影响的行数 |
|
|
||||||
| ExecuteDeleted | List\<T1\> | | 执行SQL语句,返回被删除的记录 |
|
|
||||||
|
|
||||||
### 测试代码
|
|
||||||
|
|
||||||
```csharp
|
|
||||||
IFreeSql fsql = new FreeSql.FreeSqlBuilder()
|
|
||||||
.UseConnectionString(FreeSql.DataType.MySql, "Data Source=127.0.0.1;Port=3306;User ID=root;Password=root;Initial Catalog=cccddd;Charset=utf8;SslMode=none;Max pool size=10")
|
|
||||||
.Build();
|
|
||||||
IDelete<Topic> delete => fsql.Delete<Topic>();
|
|
||||||
|
|
||||||
[Table(Name = "tb_topic")]
|
|
||||||
class Topic {
|
|
||||||
[Column(IsIdentity = true, IsPrimary = true)]
|
|
||||||
public int Id { get; set; }
|
|
||||||
public int Clicks { get; set; }
|
|
||||||
public TestTypeInfo Type { get; set; }
|
|
||||||
public string Title { get; set; }
|
|
||||||
public DateTime CreateTime { get; set; }
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
### 动态条件
|
|
||||||
```csharp
|
|
||||||
Delete<Topic>(object dywhere)
|
|
||||||
```
|
|
||||||
dywhere 支持
|
|
||||||
|
|
||||||
* 主键值
|
|
||||||
* new[] { 主键值1, 主键值2 }
|
|
||||||
* Topic对象
|
|
||||||
* new[] { Topic对象1, Topic对象2 }
|
|
||||||
* new { id = 1 }
|
|
||||||
|
|
||||||
```csharp
|
|
||||||
var t1 = fsql.Delete<Topic>(new[] { 1, 2 }).ToSql();
|
|
||||||
//DELETE FROM `tb_topic` WHERE (`Id` = 1 OR `Id` = 2)
|
|
||||||
|
|
||||||
var t2 = fsql.Delete<Topic>(new Topic { Id = 1, Title = "test" }).ToSql();
|
|
||||||
//DELETE FROM `tb_topic` WHERE (`Id` = 1)
|
|
||||||
|
|
||||||
var t3 = fsql.Delete<Topic>(new[] { new Topic { Id = 1, Title = "test" }, new Topic { Id = 2, Title = "test" } }).ToSql();
|
|
||||||
//DELETE FROM `tb_topic` WHERE (`Id` = 1 OR `Id` = 2)
|
|
||||||
|
|
||||||
var t4 = fsql.Delete<Topic>(new { id = 1 }).ToSql();
|
|
||||||
//DELETE FROM `tb_topic` WHERE (`Id` = 1)
|
|
||||||
```
|
|
||||||
|
|
||||||
### 删除条件
|
|
||||||
|
|
||||||
```csharp
|
|
||||||
var t5 = delete.Where(a => a.Id == 1).ToSql().Replace("\r\n", "");
|
|
||||||
//DELETE FROM `tb_topic` WHERE (`Id` = 1)
|
|
||||||
|
|
||||||
var t6 = delete.Where("id = ?id", new { id = 1 }).ToSql().Replace("\r\n", "");
|
|
||||||
//DELETE FROM `tb_topic` WHERE (id = ?id)
|
|
||||||
|
|
||||||
var item = new Topic { Id = 1, Title = "newtitle" };
|
|
||||||
var t7 = delete.Where(item).ToSql().Replace("\r\n", "");
|
|
||||||
//DELETE FROM `tb_topic` WHERE (`Id` = 1)
|
|
||||||
|
|
||||||
var items = new List<Topic>();
|
|
||||||
for (var a = 0; a < 10; a++) items.Add(new Topic { Id = a + 1, Title = $"newtitle{a}", Clicks = a * 100 });
|
|
||||||
var t8 = delete.Where(items).ToSql().Replace("\r\n", "");
|
|
||||||
//DELETE FROM `tb_topic` WHERE (`Id` IN (1,2,3,4,5,6,7,8,9,10))
|
|
||||||
```
|
|
||||||
|
|
||||||
### 执行命令
|
|
||||||
|
|
||||||
| 方法 | 返回值 | 参数 | 描述 |
|
|
||||||
| - | - | - | - |
|
|
||||||
| ExecuteAffrows | long | | 执行SQL语句,返回影响的行数 |
|
|
||||||
| ExecuteDeleted | List\<T1\> | | 执行SQL语句,返回被删除的记录 |
|
|
@ -1,94 +0,0 @@
|
|||||||
# 生成器
|
|
||||||
|
|
||||||
生成器是基于 dbfirst 开发的辅助工具,适用老项目一键生成实体。生成器采用模板的方式,作者实现了三种生成模板:
|
|
||||||
|
|
||||||
| 模板名称 | 类型映射 | 外键导航属性 | 缓存管理 | 失血 | 贫血 | 充血 |
|
|
||||||
| ------------- | - | - |- | - |- | - |
|
|
||||||
| simple-entity | √ | X | X | √ | X | X |
|
|
||||||
| simple-entity-navigation-object | √ | √ | X | √ | X | X |
|
|
||||||
| rich-entity-navigation-object | √ | √ | √ | X | √ | X |
|
|
||||||
|
|
||||||
模板在项目目录:/Templates/MySql
|
|
||||||
|
|
||||||
> 更多模板逐步开发中。。。
|
|
||||||
|
|
||||||
```csharp
|
|
||||||
//定义 mysql FreeSql
|
|
||||||
var mysql = new FreeSql.FreeSqlBuilder()
|
|
||||||
.UseConnectionString(FreeSql.DataType.MySql, "Data Source=127.0.0.1;Port=3306;User ID=root;Password=root;Initial Catalog=cccddd;Charset=utf8;SslMode=none;Max pool size=10")
|
|
||||||
.Build();
|
|
||||||
|
|
||||||
//创建模板生成类实现
|
|
||||||
var gen = new FreeSql.Generator.TemplateGenerator();
|
|
||||||
gen.Build(mysql.DbFirst,
|
|
||||||
@"C:\Users\28810\Desktop\github\FreeSql\Templates\MySql\simple-entity", //模板目录(事先下载)
|
|
||||||
@"C:\Users\28810\Desktop\新建文件夹 (9)", //生成后保存的目录
|
|
||||||
"cccddd" //数据库
|
|
||||||
);
|
|
||||||
```
|
|
||||||
|
|
||||||
## 模板语法
|
|
||||||
|
|
||||||
```html
|
|
||||||
<html>
|
|
||||||
<head>
|
|
||||||
<title>{#title}</title>
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
|
|
||||||
<!--绑定表达式-->
|
|
||||||
{#表达式}
|
|
||||||
{##表达式} 当表达式可能发生runtime错误时使用,性能没有上面的高
|
|
||||||
|
|
||||||
<!--可嵌套使用,同一标签最多支持3个指令-->
|
|
||||||
{include ../header.html}
|
|
||||||
<div @for="i 1, 101">
|
|
||||||
<p @if="i === 50" @for="item,index in data">aaa</p>
|
|
||||||
<p @else="i % 3 === 0">bbb {#i}</p>
|
|
||||||
<p @else="">ccc {#i}</p>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<!--定义模块,可以将公共模块定义到一个文件中-->
|
|
||||||
{module module_name1 parms1, 2, 3...}
|
|
||||||
{/module}
|
|
||||||
{module module_name2 parms1, 2, 3...}
|
|
||||||
{/module}
|
|
||||||
|
|
||||||
<!--使用模块-->
|
|
||||||
{import ../module.html as myname}
|
|
||||||
{#myname.module_name(parms1, 2, 3...)}
|
|
||||||
|
|
||||||
<!--继承-->
|
|
||||||
{extends ../inc/layout.html}
|
|
||||||
{block body}{/block}
|
|
||||||
|
|
||||||
<!--嵌入代码块-->
|
|
||||||
{%
|
|
||||||
for (var a = 0; a < 100; a++)
|
|
||||||
print(a);
|
|
||||||
%}
|
|
||||||
|
|
||||||
<!--条件分支-->
|
|
||||||
{if i === 50}
|
|
||||||
{elseif i > 60}
|
|
||||||
{else}
|
|
||||||
{/if}
|
|
||||||
|
|
||||||
<!--三种循环-->
|
|
||||||
{for i 1,101} 可自定义名 {for index2 表达式1 in 表达式2}
|
|
||||||
|
|
||||||
{for item,index in items} 可选参数称 index
|
|
||||||
可自定义名 {for item2, index99 in 数组表达式}
|
|
||||||
|
|
||||||
{for key,item,index on json} 可选参数 item, index,
|
|
||||||
可自定义名 {for key2, item2, index99 in 对象表达式}
|
|
||||||
{/for}
|
|
||||||
|
|
||||||
<!--不被解析-->
|
|
||||||
{miss}
|
|
||||||
此块内容不被bmw.js解析
|
|
||||||
{/miss}
|
|
||||||
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
```
|
|
@ -1,79 +0,0 @@
|
|||||||
# 插入数据
|
|
||||||
|
|
||||||
| 方法 | 返回值 | 参数 | 描述 |
|
|
||||||
| - | - | - | - |
|
|
||||||
| AppendData | \<this\> | T1 \| IEnumerable<T1> | 追加准备插入的实体 |
|
|
||||||
| InsertColumns | \<this\> | Lambda | 只插入的列 |
|
|
||||||
| IgnoreColumns | \<this\> | Lambda | 忽略的列 |
|
|
||||||
| ToSql | string | | 返回即将执行的SQL语句 |
|
|
||||||
| ExecuteAffrows | long | | 执行SQL语句,返回影响的行数 |
|
|
||||||
| ExecuteIdentity | long | | 执行SQL语句,返回自增值 |
|
|
||||||
| ExecuteInserted | List\<T1\> | | 执行SQL语句,返回插入后的记录 |
|
|
||||||
|
|
||||||
### 列优先级
|
|
||||||
|
|
||||||
> 全部列 < 指定列(InsertColumns) < 忽略列(IgnoreColumns)
|
|
||||||
|
|
||||||
### 测试代码
|
|
||||||
|
|
||||||
```csharp
|
|
||||||
IFreeSql fsql = new FreeSql.FreeSqlBuilder()
|
|
||||||
.UseConnectionString(FreeSql.DataType.MySql, "Data Source=127.0.0.1;Port=3306;User ID=root;Password=root;Initial Catalog=cccddd;Charset=utf8;SslMode=none;Max pool size=10")
|
|
||||||
.Build();
|
|
||||||
IInsert<Topic> insert => fsql.Insert<Topic>();
|
|
||||||
|
|
||||||
[Table(Name = "tb_topic")]
|
|
||||||
class Topic {
|
|
||||||
[Column(IsIdentity = true, IsPrimary = true)]
|
|
||||||
public int Id { get; set; }
|
|
||||||
public int Clicks { get; set; }
|
|
||||||
public TestTypeInfo Type { get; set; }
|
|
||||||
public string Title { get; set; }
|
|
||||||
public DateTime CreateTime { get; set; }
|
|
||||||
}
|
|
||||||
|
|
||||||
var items = new List<Topic>();
|
|
||||||
for (var a = 0; a < 10; a++) items.Add(new Topic { Id = a + 1, Title = $"newtitle{a}", Clicks = a * 100 });
|
|
||||||
```
|
|
||||||
|
|
||||||
### 插入
|
|
||||||
|
|
||||||
```csharp
|
|
||||||
var t1 = insert.AppendData(items.First()).ToSql();
|
|
||||||
//INSERT INTO `tb_topic`(`Clicks`, `Title`, `CreateTime`) VALUES(?Clicks0, ?Title0, ?CreateTime0)
|
|
||||||
```
|
|
||||||
|
|
||||||
### 批量插入
|
|
||||||
|
|
||||||
```csharp
|
|
||||||
var t2 = insert.AppendData(items).ToSql();
|
|
||||||
//INSERT INTO `tb_topic`(`Clicks`, `Title`, `CreateTime`) VALUES(?Clicks0, ?Title0, ?CreateTime0), (?Clicks1, ?Title1, ?CreateTime1), (?Clicks2, ?Title2, ?CreateTime2), (?Clicks3, ?Title3, ?CreateTime3), (?Clicks4, ?Title4, ?CreateTime4), (?Clicks5, ?Title5, ?CreateTime5), (?Clicks6, ?Title6, ?CreateTime6), (?Clicks7, ?Title7, ?CreateTime7), (?Clicks8, ?Title8, ?CreateTime8), (?Clicks9, ?Title9, ?CreateTime9)
|
|
||||||
```
|
|
||||||
|
|
||||||
### 只想插入指定的列
|
|
||||||
|
|
||||||
```csharp
|
|
||||||
var t3 = insert.AppendData(items).InsertColumns(a => a.Title).ToSql();
|
|
||||||
//INSERT INTO `tb_topic`(`Title`) VALUES(?Title0), (?Title1), (?Title2), (?Title3), (?Title4), (?Title5), (?Title6), (?Title7), (?Title8), (?Title9)
|
|
||||||
|
|
||||||
var t4 = insert.AppendData(items).InsertColumns(a =>new { a.Title, a.Clicks }).ToSql();
|
|
||||||
//INSERT INTO `tb_topic`(`Clicks`, `Title`) VALUES(?Clicks0, ?Title0), (?Clicks1, ?Title1), (?Clicks2, ?Title2), (?Clicks3, ?Title3), (?Clicks4, ?Title4), (?Clicks5, ?Title5), (?Clicks6, ?Title6), (?Clicks7, ?Title7), (?Clicks8, ?Title8), (?Clicks9, ?Title9)
|
|
||||||
```
|
|
||||||
|
|
||||||
### 忽略列
|
|
||||||
|
|
||||||
```csharp
|
|
||||||
var t5 = insert.AppendData(items).IgnoreColumns(a => a.CreateTime).ToSql();
|
|
||||||
//INSERT INTO `tb_topic`(`Clicks`, `Title`) VALUES(?Clicks0, ?Title0), (?Clicks1, ?Title1), (?Clicks2, ?Title2), (?Clicks3, ?Title3), (?Clicks4, ?Title4), (?Clicks5, ?Title5), (?Clicks6, ?Title6), (?Clicks7, ?Title7), (?Clicks8, ?Title8), (?Clicks9, ?Title9)
|
|
||||||
|
|
||||||
var t6 = insert.AppendData(items).IgnoreColumns(a => new { a.Title, a.CreateTime }).ToSql();
|
|
||||||
///INSERT INTO `tb_topic`(`Clicks`) VALUES(?Clicks0), (?Clicks1), (?Clicks2), (?Clicks3), (?Clicks4), (?Clicks5), (?Clicks6), (?Clicks7), (?Clicks8), (?Clicks9)
|
|
||||||
```
|
|
||||||
|
|
||||||
### 执行命令
|
|
||||||
|
|
||||||
| 方法 | 返回值 | 描述 |
|
|
||||||
| - | - | - |
|
|
||||||
| ExecuteAffrows | long | 执行SQL语句,返回影响的行数 |
|
|
||||||
| ExecuteIdentity | long | 执行SQL语句,返回自增值 |
|
|
||||||
| ExecuteInserted | List\<T1\> | 执行SQL语句,返回插入后的记录 |
|
|
@ -1,211 +0,0 @@
|
|||||||
# 查询数据
|
|
||||||
|
|
||||||
## 测试代码
|
|
||||||
|
|
||||||
```csharp
|
|
||||||
IFreeSql fsql = new FreeSql.FreeSqlBuilder()
|
|
||||||
.UseConnectionString(FreeSql.DataType.MySql, "Data Source=127.0.0.1;Port=3306;User ID=root;Password=root;Initial Catalog=cccddd;Charset=utf8;SslMode=none;Max pool size=10")
|
|
||||||
.Build();
|
|
||||||
ISelect<Topic> select => fsql.Select<Topic>();
|
|
||||||
|
|
||||||
[Table(Name = "tb_topic")]
|
|
||||||
class Topic {
|
|
||||||
[Column(IsIdentity = true, IsPrimary = true)]
|
|
||||||
public int Id { get; set; }
|
|
||||||
public int Clicks { get; set; }
|
|
||||||
public int TypeGuid { get; set; }
|
|
||||||
public TestTypeInfo Type { get; set; }
|
|
||||||
public string Title { get; set; }
|
|
||||||
public DateTime CreateTime { get; set; }
|
|
||||||
}
|
|
||||||
class TestTypeInfo {
|
|
||||||
public int Guid { get; set; }
|
|
||||||
public int ParentId { get; set; }
|
|
||||||
public TestTypeParentInfo Parent { get; set; }
|
|
||||||
public string Name { get; set; }
|
|
||||||
}
|
|
||||||
class TestTypeParentInfo {
|
|
||||||
public int Id { get; set; }
|
|
||||||
public string Name { get; set; }
|
|
||||||
|
|
||||||
public List<TestTypeInfo> Types { get; set; }
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
# Where
|
|
||||||
|
|
||||||
### 表达式函数支持
|
|
||||||
|
|
||||||
#### String 对象方法
|
|
||||||
StartsWith, EndsWith, Contains, ToLower, ToUpper, Substring, Length, IndexOf, PadLeft, PadRight, Trim, TrimStart, TrimEnd, Replace, CompareTo
|
|
||||||
|
|
||||||
#### Math 方法
|
|
||||||
...
|
|
||||||
|
|
||||||
### 单表
|
|
||||||
```csharp
|
|
||||||
var sql = select.Where(a => a.Id == 10).ToSql();
|
|
||||||
///SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5 FROM `tb_topic` a WHERE (a.`Id` = 10)
|
|
||||||
|
|
||||||
sql = select.Where(a => a.Id == 10 && a.Id > 10 || a.Clicks > 100).ToSql();
|
|
||||||
///SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5 FROM `tb_topic` a WHERE (a.`Id` = 10 AND a.`Id` > 10 OR a.`Clicks` > 100)
|
|
||||||
```
|
|
||||||
|
|
||||||
### 多表,使用导航属性
|
|
||||||
```csharp
|
|
||||||
sql = select.Where(a => a.Type.Name == "typeTitle" && a.Type.Guid == a.TypeGuid).ToSql();
|
|
||||||
///SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a__Type.`Guid` as4, a__Type.`ParentId` as5, a__Type.`Name` as6, a.`Title` as7, a.`CreateTime` as8 FROM `tb_topic` a, `TestTypeInfo` a__Type WHERE (a__Type.`Name` = 'typeTitle' AND a__Type.`Guid` = a.`TypeGuid`)
|
|
||||||
|
|
||||||
sql = select.Where(a => a.Type.Parent.Name == "tparent").ToSql();
|
|
||||||
//SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a__Type.`Guid` as4, a__Type.`ParentId` as5, a__Type.`Name` as6, a.`Title` as7, a.`CreateTime` as8 FROM `tb_topic` a, `TestTypeInfo` a__Type, `TestTypeParentInfo` a__Type__Parent WHERE (a__Type__Parent.`Name` = 'tparent')
|
|
||||||
```
|
|
||||||
|
|
||||||
### 多表,没有导航属性
|
|
||||||
```csharp
|
|
||||||
sql = select.Where<TestTypeInfo>((a, b) => b.Guid == a.TypeGuid && b.Name == "typeTitle").ToSql();
|
|
||||||
//SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, b.`Guid` as4, b.`ParentId` as5, b.`Name` as6, a.`Title` as7, a.`CreateTime` as8 FROM `tb_topic` a, `TestTypeInfo` b WHERE (b.`Guid` = a.`TypeGuid` AND b.`Name` = 'typeTitle')
|
|
||||||
|
|
||||||
sql = select.Where<TestTypeInfo, TestTypeParentInfo>((a, b, c) => c.Name == "tparent").ToSql();
|
|
||||||
//SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5 FROM `tb_topic` a, `TestTypeParentInfo` c WHERE (c.`Name` = 'tparent')
|
|
||||||
```
|
|
||||||
|
|
||||||
### 多表,任意查
|
|
||||||
```csharp
|
|
||||||
sql = select.From<TestTypeInfo, TestTypeParentInfo>((s, b, c) => s
|
|
||||||
.Where(a => a.Id == 10 && c.Name == "xxx")
|
|
||||||
.Where(a => b.ParentId == 20)).ToSql();
|
|
||||||
//SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, b.`Guid` as4, b.`ParentId` as5, b.`Name` as6, a.`Title` as7, a.`CreateTime` as8 FROM `tb_topic` a, `TestTypeParentInfo` c, `TestTypeInfo` b WHERE (a.`Id` = 10 AND c.`Name` = 'xxx') AND (b.`ParentId` = 20)
|
|
||||||
```
|
|
||||||
|
|
||||||
### 原生SQL
|
|
||||||
```csharp
|
|
||||||
sql = select.Where("a.clicks > 100 && a.id = ?id", new { id = 10 }).ToSql();
|
|
||||||
//SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5 FROM `tb_topic` a WHERE (a.clicks > 100 && a.id = ?id)
|
|
||||||
```
|
|
||||||
|
|
||||||
> 以上条件查询,支持 WhereIf
|
|
||||||
|
|
||||||
# 联表
|
|
||||||
|
|
||||||
### 使用导航属性联表
|
|
||||||
```csharp
|
|
||||||
sql = select.LeftJoin(a => a.Type.Guid == a.TypeGuid).ToSql();
|
|
||||||
//SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a__Type.`Guid` as4, a__Type.`ParentId` as5, a__Type.`Name` as6, a.`Title` as7, a.`CreateTime` as8 FROM `tb_topic` a LEFT JOIN `TestTypeInfo` a__Type ON a__Type.`Guid` = a.`TypeGuid`
|
|
||||||
|
|
||||||
sql = select
|
|
||||||
.LeftJoin(a => a.Type.Guid == a.TypeGuid)
|
|
||||||
.LeftJoin(a => a.Type.Parent.Id == a.Type.ParentId).ToSql();
|
|
||||||
//SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a__Type.`Guid` as4, a__Type.`ParentId` as5, a__Type.`Name` as6, a.`Title` as7, a.`CreateTime` as8 FROM `tb_topic` a LEFT JOIN `TestTypeInfo` a__Type ON a__Type.`Guid` = a.`TypeGuid` LEFT JOIN `TestTypeParentInfo` a__Type__Parent ON a__Type__Parent.`Id` = a__Type.`ParentId`
|
|
||||||
```
|
|
||||||
|
|
||||||
### 没有导航属性联表
|
|
||||||
```csharp
|
|
||||||
sql = select.LeftJoin<TestTypeInfo>((a, b) => b.Guid == a.TypeGuid).ToSql();
|
|
||||||
//SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, b.`Guid` as4, b.`ParentId` as5, b.`Name` as6, a.`Title` as7, a.`CreateTime` as8 FROM `tb_topic` a LEFT JOIN `TestTypeInfo` b ON b.`Guid` = a.`TypeGuid`
|
|
||||||
|
|
||||||
sql = select
|
|
||||||
.LeftJoin<TestTypeInfo>((a, b) => b.Guid == a.TypeGuid)
|
|
||||||
.LeftJoin<TestTypeParentInfo>((a, c) => c.Id == a.Type.ParentId).ToSql();
|
|
||||||
//SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, b.`Guid` as4, b.`ParentId` as5, b.`Name` as6, a.`Title` as7, a.`CreateTime` as8 FROM `tb_topic` a LEFT JOIN `TestTypeInfo` b ON b.`Guid` = a.`TypeGuid` LEFT JOIN `TestTypeParentInfo` c ON c.`Id` = b.`ParentId`
|
|
||||||
```
|
|
||||||
|
|
||||||
### 联表任意查
|
|
||||||
```csharp
|
|
||||||
sql = select.From<TestTypeInfo, TestTypeParentInfo>((s, b, c) => s
|
|
||||||
.LeftJoin(a => a.TypeGuid == b.Guid)
|
|
||||||
.LeftJoin(a => b.ParentId == c.Id)).ToSql();
|
|
||||||
//SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, b.`Guid` as4, b.`ParentId` as5, b.`Name` as6, a.`Title` as7, a.`CreateTime` as8 FROM `tb_topic` a LEFT JOIN `TestTypeInfo` b ON a.`TypeGuid` = b.`Guid` LEFT JOIN `TestTypeParentInfo` c ON b.`ParentId` = c.`Id`
|
|
||||||
```
|
|
||||||
|
|
||||||
### 原生SQL联表
|
|
||||||
```csharp
|
|
||||||
sql = select.LeftJoin("TestTypeInfo b on b.Guid = a.TypeGuid and b.Name = ?bname", new { bname = "xxx" }).ToSql();
|
|
||||||
//SELECT a.`Id` as1, a.`Clicks` as2, a.`TypeGuid` as3, a.`Title` as4, a.`CreateTime` as5 FROM `tb_topic` a LEFT JOIN TestTypeInfo b on b.Guid = a.TypeGuid and b.Name = ?bname
|
|
||||||
```
|
|
||||||
|
|
||||||
# 查询数据
|
|
||||||
|
|
||||||
### 返回 List
|
|
||||||
```csharp
|
|
||||||
List<Topic> t1 = select.Where(a => a.Id > 0).Skip(100).Limit(200).ToList();
|
|
||||||
```
|
|
||||||
|
|
||||||
### 返回 List + 导航属性的数据
|
|
||||||
```csharp
|
|
||||||
List<Topic> t2 = select.LeftJoin(a => a.Type.Guid == a.TypeGuid).ToList();
|
|
||||||
//此时会返回普通字段 + 导航对象 Type 的数据
|
|
||||||
```
|
|
||||||
|
|
||||||
### 指定字段返回
|
|
||||||
```csharp
|
|
||||||
//返回一个字段
|
|
||||||
List<int> t3 = select.Where(a => a.Id > 0).Skip(100).Limit(200).ToList(a => a.Id);
|
|
||||||
|
|
||||||
//返回匿名类
|
|
||||||
List<匿名类> t4 = select.Where(a => a.Id > 0).Skip(100).Limit(200).ToList(a => new { a.Id, a.Title });
|
|
||||||
|
|
||||||
//返回元组
|
|
||||||
List<(int, string)> t5 = select.Where(a => a.Id > 0).Skip(100).Limit(200).ToList<(int, string)>("id, title");
|
|
||||||
```
|
|
||||||
|
|
||||||
### 执行SQL返回数据
|
|
||||||
```csharp
|
|
||||||
class xxx {
|
|
||||||
public int Id { get; set; }
|
|
||||||
public string Path { get; set; }
|
|
||||||
public string Title2 { get; set; }
|
|
||||||
}
|
|
||||||
|
|
||||||
List<xxx> t6 = fsql.Ado.Query<xxx>("select * from song");
|
|
||||||
List<(int, string ,string)> t7 = fsql.Ado.Query<(int, string, string)>("select * from song");
|
|
||||||
List<dynamic> t8 = fsql.Ado.Query<dynamic>("select * from song");
|
|
||||||
```
|
|
||||||
|
|
||||||
# 更多文档整理中。。。
|
|
||||||
|
|
||||||
| 方法 | 返回值 | 参数 | 描述 |
|
|
||||||
| ------------- | - | - | - |
|
|
||||||
| ToSql | string | | 返回即将执行的SQL语句 |
|
|
||||||
| ToList | List<T1> | | 执行SQL查询,返回 T1 实体所有字段的记录,若存在导航属性则一起查询返回,记录不存在时返回 Count 为 0 的列表 |
|
|
||||||
| ToList\<T\> | List\<T\> | Lambda | 执行SQL查询,返回指定字段的记录,记录不存在时返回 Count 为 0 的列表 |
|
|
||||||
| ToList\<T\> | List\<T\> | string field | 执行SQL查询,返回 field 指定字段的记录,并以元组或基础类型(int,string,long)接收,记录不存在时返回 Count 为 0 的列表 |
|
|
||||||
| ToOne | T1 | | 执行SQL查询,返回 T1 实体所有字段的第一条记录,记录不存在时返回 null |
|
|
||||||
| Any | bool | | 执行SQL查询,是否有记录 |
|
|
||||||
| Sum | T | Lambda | 指定一个列求和 |
|
|
||||||
| Min | T | Lambda | 指定一个列求最小值 |
|
|
||||||
| Max | T | Lambda | 指定一个列求最大值 |
|
|
||||||
| Avg | T | Lambda | 指定一个列求平均值 |
|
|
||||||
| 【分页】 |
|
|
||||||
| Count | long | | 查询的记录数量 |
|
|
||||||
| Count | \<this\> | out long | 查询的记录数量,以参数out形式返回 |
|
|
||||||
| Skip | \<this\> | int offset | 查询向后偏移行数 |
|
|
||||||
| Offset | \<this\> | int offset | 查询向后偏移行数 |
|
|
||||||
| Limit | \<this\> | int limit | 查询多少条数据 |
|
|
||||||
| Take | \<this\> | int limit | 查询多少条数据 |
|
|
||||||
| Page | \<this\> | int pageIndex, int pageSize | 分页 |
|
|
||||||
| 【条件】 |
|
|
||||||
| Where | \<this\> | Lambda | 支持多表查询表达式 |
|
|
||||||
| WhereIf | \<this\> | bool, Lambda | 支持多表查询表达式 |
|
|
||||||
| Where | \<this\> | string, parms | 原生sql语法条件,Where("id = ?id", new { id = 1 }) |
|
|
||||||
| WhereIf | \<this\> | bool, string, parms | 原生sql语法条件,WhereIf(true, "id = ?id", new { id = 1 }) |
|
|
||||||
| WhereLike | \<this\> | Lambda, string, bool | like 查询条件,where title like '%xxx%' or content like '%xxx%' |
|
|
||||||
| 【分组】 |
|
|
||||||
| GroupBy | \<this\> | Lambda | 按选择的列分组,GroupBy(a => a.Name) | GroupBy(a => new{a.Name,a.Time}) | GroupBy(a => new[]{"name","time"}) |
|
|
||||||
| GroupBy | \<this\> | string, parms | 按原生sql语法分组,GroupBy("concat(name, ?cc)", new { cc = 1 }) |
|
|
||||||
| Having | \<this\> | string, parms | 按原生sql语法聚合条件过滤,Having("count(name) = ?cc", new { cc = 1 }) |
|
|
||||||
| 【排序】 |
|
|
||||||
| OrderBy | \<this\> | Lambda | 按列排序,OrderBy(a => a.Time) |
|
|
||||||
| OrderByDescending | \<this\> | Lambda | 按列倒向排序,OrderByDescending(a => a.Time) |
|
|
||||||
| OrderBy | \<this\> | string, parms | 按原生sql语法排序,OrderBy("count(name) + ?cc", new { cc = 1 }) |
|
|
||||||
| 【联表】 |
|
|
||||||
| LeftJoin | \<this\> | Lambda | 左联查询,可使用导航属性,或指定关联的实体类型 |
|
|
||||||
| InnerJoin | \<this\> | Lambda | 联接查询,可使用导航属性,或指定关联的实体类型 |
|
|
||||||
| RightJoin | \<this\> | Lambda | 右联查询,可使用导航属性,或指定关联的实体类型 |
|
|
||||||
| LeftJoin | \<this\> | string, parms | 左联查询,使用原生sql语法,LeftJoin("type b on b.id = a.id and b.clicks > ?clicks", new { clicks = 1 }) |
|
|
||||||
| InnerJoin | \<this\> | string, parms | 联接查询,使用原生sql语法,InnerJoin("type b on b.id = a.id and b.clicks > ?clicks", new { clicks = 1 }) |
|
|
||||||
| RightJoin | \<this\> | string, parms | 右联查询,使用原生sql语法,RightJoin("type b on b.id = a.id and b.clicks > ?clicks", new { clicks = 1 }) |
|
|
||||||
| From | \<this\> | Lambda | 多表查询,3个表以上使用非常方便,目前设计最大支持10个表 |
|
|
||||||
| 【其他】 |
|
|
||||||
| As | \<this\> | string alias = "a" | 指定别名 |
|
|
||||||
| Master | \<this\> | | 指定从主库查询(默认查询从库) |
|
|
||||||
| Caching | \<this\> | int seconds, string key = null | 缓存查询结果 |
|
|
@ -1,129 +0,0 @@
|
|||||||
# 更新数据
|
|
||||||
|
|
||||||
| 方法 | 返回值 | 参数 | 描述 |
|
|
||||||
| - | - | - | - |
|
|
||||||
| SetSource | \<this\> | T1 \| IEnumerable<T1> | 更新数据,设置更新的实体 |
|
|
||||||
| IgnoreColumns | \<this\> | Lambda | 忽略的列 |
|
|
||||||
| Set | \<this\> | Lambda, value | 设置列的新值,Set(a => a.Name, "newvalue") |
|
|
||||||
| Set | \<this\> | Lambda | 设置列的的新值为基础上增加,Set(a => a.Clicks + 1),相当于 clicks=clicks+1; |
|
|
||||||
| SetRaw | \<this\> | string, parms | 设置值,自定义SQL语法,SetRaw("title = ?title", new { title = "newtitle" }) |
|
|
||||||
| Where | \<this\> | Lambda | 表达式条件,仅支持实体基础成员(不包含导航对象) |
|
|
||||||
| Where | \<this\> | string, parms | 原生sql语法条件,Where("id = ?id", new { id = 1 }) |
|
|
||||||
| Where | \<this\> | T1 \| IEnumerable<T1> | 传入实体或集合,将其主键作为条件 |
|
|
||||||
| WhereExists | \<this\> | ISelect | 子查询是否存在 |
|
|
||||||
| ToSql | string | | 返回即将执行的SQL语句 |
|
|
||||||
| ExecuteAffrows | long | | 执行SQL语句,返回影响的行数 |
|
|
||||||
| ExecuteUpdated | List\<T1\> | | 执行SQL语句,返回更新后的记录 |
|
|
||||||
|
|
||||||
### 列优先级
|
|
||||||
|
|
||||||
> 全部列 < 指定列(Set/SetRaw) < 忽略列(IgnoreColumns)
|
|
||||||
|
|
||||||
### 测试代码
|
|
||||||
|
|
||||||
```csharp
|
|
||||||
[Table(Name = "tb_topic")]
|
|
||||||
class Topic {
|
|
||||||
[Column(IsIdentity = true, IsPrimary = true)]
|
|
||||||
public int Id { get; set; }
|
|
||||||
public int Clicks { get; set; }
|
|
||||||
public TestTypeInfo Type { get; set; }
|
|
||||||
public string Title { get; set; }
|
|
||||||
public DateTime CreateTime { get; set; }
|
|
||||||
}
|
|
||||||
|
|
||||||
IFreeSql fsql = new FreeSql.FreeSqlBuilder()
|
|
||||||
.UseConnectionString(FreeSql.DataType.MySql, "Data Source=127.0.0.1;Port=3306;User ID=root;Password=root;Initial Catalog=cccddd;Charset=utf8;SslMode=none;Max pool size=10")
|
|
||||||
.Build();
|
|
||||||
IUpdate<Topic> update => fsql.Update<Topic>();
|
|
||||||
```
|
|
||||||
|
|
||||||
### 动态条件
|
|
||||||
```csharp
|
|
||||||
Update<Topic>(object dywhere)
|
|
||||||
```
|
|
||||||
dywhere 支持
|
|
||||||
|
|
||||||
* 主键值
|
|
||||||
* new[] { 主键值1, 主键值2 }
|
|
||||||
* Topic对象
|
|
||||||
* new[] { Topic对象1, Topic对象2 }
|
|
||||||
* new { id = 1 }
|
|
||||||
|
|
||||||
### 更新指定列
|
|
||||||
```csharp
|
|
||||||
var t1 = fsql.Update<Topic>(1).Set(a => a.CreateTime, DateTime.Now).ToSql();
|
|
||||||
//UPDATE `tb_topic` SET `CreateTime` = '2018-12-08 00:04:59' WHERE (`Id` = 1)
|
|
||||||
```
|
|
||||||
|
|
||||||
### 更新指定列,累加
|
|
||||||
```csharp
|
|
||||||
var t2 = fsql.Update<Topic>(1).Set(a => a.Clicks + 1).ToSql();
|
|
||||||
//UPDATE `tb_topic` SET `Clicks` = ifnull(`Clicks`,0) + 1 WHERE (`Id` = 1)
|
|
||||||
```
|
|
||||||
|
|
||||||
### 保存实体
|
|
||||||
```csharp
|
|
||||||
var item = new Topic { Id = 1, Title = "newtitle" };
|
|
||||||
var t3 = update.SetSource(item).ToSql();
|
|
||||||
//UPDATE `tb_topic` SET `Clicks` = ?p_0, `Title` = ?p_1, `CreateTime` = ?p_2 WHERE (`Id` = 1)
|
|
||||||
```
|
|
||||||
|
|
||||||
### 保存实体,忽略一些列
|
|
||||||
```csharp
|
|
||||||
var t4 = update.SetSource(item).IgnoreColumns(a => a.Clicks).ToSql();
|
|
||||||
//UPDATE `tb_topic` SET `Title` = ?p_0, `CreateTime` = ?p_1 WHERE (`Id` = 1)
|
|
||||||
var t5 = update.SetSource(item).IgnoreColumns(a => new { a.Clicks, a.CreateTime }).ToSql();
|
|
||||||
//UPDATE `tb_topic` SET `Title` = ?p_0 WHERE (`Id` = 1)
|
|
||||||
```
|
|
||||||
|
|
||||||
### 批量保存
|
|
||||||
```csharp
|
|
||||||
var items = new List<Topic>();
|
|
||||||
for (var a = 0; a < 10; a++) items.Add(new Topic { Id = a + 1, Title = $"newtitle{a}", Clicks = a * 100 });
|
|
||||||
|
|
||||||
var t6 = update.SetSource(items).ToSql();
|
|
||||||
//UPDATE `tb_topic` SET `Clicks` = CASE `Id` WHEN 1 THEN ?p_0 WHEN 2 THEN ?p_1 WHEN 3 THEN ?p_2 WHEN 4 THEN ?p_3 WHEN 5 THEN ?p_4 WHEN 6 THEN ?p_5 WHEN 7 THEN ?p_6 WHEN 8 THEN ?p_7 WHEN 9 THEN ?p_8 WHEN 10 THEN ?p_9 END, `Title` = CASE `Id` WHEN 1 THEN ?p_10 WHEN 2 THEN ?p_11 WHEN 3 THEN ?p_12 WHEN 4 THEN ?p_13 WHEN 5 THEN ?p_14 WHEN 6 THEN ?p_15 WHEN 7 THEN ?p_16 WHEN 8 THEN ?p_17 WHEN 9 THEN ?p_18 WHEN 10 THEN ?p_19 END, `CreateTime` = CASE `Id` WHEN 1 THEN ?p_20 WHEN 2 THEN ?p_21 WHEN 3 THEN ?p_22 WHEN 4 THEN ?p_23 WHEN 5 THEN ?p_24 WHEN 6 THEN ?p_25 WHEN 7 THEN ?p_26 WHEN 8 THEN ?p_27 WHEN 9 THEN ?p_28 WHEN 10 THEN ?p_29 END WHERE (`Id` IN (1,2,3,4,5,6,7,8,9,10))
|
|
||||||
```
|
|
||||||
|
|
||||||
> 批量保存的场景,先查询20条记录,根据本地很复杂的规则把集合的值改完后
|
|
||||||
|
|
||||||
> 传统做法是循环20次保存,用 case when 只要一次就行
|
|
||||||
|
|
||||||
### 批量保存,忽略一些列
|
|
||||||
```csharp
|
|
||||||
var t7 = update.SetSource(items).IgnoreColumns(a => new { a.Clicks, a.CreateTime }).ToSql();
|
|
||||||
//UPDATE `tb_topic` SET `Title` = CASE `Id` WHEN 1 THEN ?p_0 WHEN 2 THEN ?p_1 WHEN 3 THEN ?p_2 WHEN 4 THEN ?p_3 WHEN 5 THEN ?p_4 WHEN 6 THEN ?p_5 WHEN 7 THEN ?p_6 WHEN 8 THEN ?p_7 WHEN 9 THEN ?p_8 WHEN 10 THEN ?p_9 END WHERE (`Id` IN (1,2,3,4,5,6,7,8,9,10))
|
|
||||||
```
|
|
||||||
|
|
||||||
### 批量更新指定列
|
|
||||||
```csharp
|
|
||||||
var t8 = update.SetSource(items).Set(a => a.CreateTime, DateTime.Now).ToSql();
|
|
||||||
//UPDATE `tb_topic` SET `CreateTime` = ?p_0 WHERE (`Id` IN (1,2,3,4,5,6,7,8,9,10))
|
|
||||||
```
|
|
||||||
|
|
||||||
> 指定列更新后,批量保存将失效
|
|
||||||
|
|
||||||
### 更新条件
|
|
||||||
|
|
||||||
> 除了顶上介绍的 dywhere 构造参数外,还支持 Where lambda/sql 方法
|
|
||||||
|
|
||||||
```csharp
|
|
||||||
var t9 = update.Set(a => a.Title, "新标题").Where(a => a.Id == 1).ToSql();
|
|
||||||
//UPDATE `tb_topic` SET `Title` = '新标题' WHERE (Id = 1)
|
|
||||||
```
|
|
||||||
|
|
||||||
### 自定义SQL
|
|
||||||
|
|
||||||
```csharp
|
|
||||||
var t10 = update.SetRaw("Title = {0}", "新标题").Where("Id = {0}", 1).ToSql();
|
|
||||||
//UPDATE `tb_topic` SET Title = '新标题' WHERE (Id = 1)
|
|
||||||
//sql语法条件,参数使用 {0},与 string.Format 保持一致,无须加单引号,错误的用法:'{0}'
|
|
||||||
```
|
|
||||||
|
|
||||||
### 执行命令
|
|
||||||
|
|
||||||
| 方法 | 返回值 | 参数 | 描述 |
|
|
||||||
| - | - | - | - |
|
|
||||||
| ExecuteAffrows | long | | 执行SQL语句,返回影响的行数 |
|
|
||||||
| ExecuteUpdated | List\<T1\> | | 执行SQL语句,返回更新后的记录 |
|
|
File diff suppressed because one or more lines are too long
Before Width: | Height: | Size: 9.5 KiB |
File diff suppressed because one or more lines are too long
Before Width: | Height: | Size: 8.2 KiB |
File diff suppressed because one or more lines are too long
Before Width: | Height: | Size: 12 KiB |
Binary file not shown.
Before Width: | Height: | Size: 33 KiB |
Binary file not shown.
Before Width: | Height: | Size: 46 KiB |
@ -1,321 +0,0 @@
|
|||||||
|
|
||||||
(function (window) {
|
|
||||||
|
|
||||||
window.base = function () { };
|
|
||||||
|
|
||||||
base.prototype = {
|
|
||||||
showLoading: function (obj) {
|
|
||||||
var index = layer.msg(obj.msg, {
|
|
||||||
icon: 16,
|
|
||||||
shade: 0.1,
|
|
||||||
shadeClose: false,
|
|
||||||
});
|
|
||||||
return index;
|
|
||||||
},
|
|
||||||
closeLoading: function (index) {
|
|
||||||
layer.close(index);
|
|
||||||
},
|
|
||||||
showMessage: function (options) {
|
|
||||||
if (layer == null) {
|
|
||||||
alert(options.msg);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
var yes = function (index) {
|
|
||||||
if ($.isFunction(options.yes)) {
|
|
||||||
options.yes();
|
|
||||||
}
|
|
||||||
layer.close(index);
|
|
||||||
};
|
|
||||||
layer.alert(options.msg || "操作成功", {
|
|
||||||
icon: options.type || 1,
|
|
||||||
scrollbar: false,
|
|
||||||
shadeClose: false,
|
|
||||||
closeBtn: 0,
|
|
||||||
skin: 'layui-layer-lan'//'layer-ext-moon'
|
|
||||||
}, yes);
|
|
||||||
},
|
|
||||||
//options={title:"标题",msg:"内容",yes:function,no:function}
|
|
||||||
showConfirm: function (options) {
|
|
||||||
if (options == null || options.msg == null) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
var yes = options.yes;
|
|
||||||
var no = options.no;
|
|
||||||
var defaultAction = function (index) {
|
|
||||||
layer.close(index);
|
|
||||||
};
|
|
||||||
if (yes == null) {
|
|
||||||
yes = defaultAction;
|
|
||||||
}
|
|
||||||
if (no == null) {
|
|
||||||
no = defaultAction
|
|
||||||
}
|
|
||||||
////layer.confirm(options.msg, yes, options.title, no);
|
|
||||||
//layer.confirm(options.msg, { btn: ['确定', '取消'] }, yes, no);
|
|
||||||
layer.confirm(options.msg, {
|
|
||||||
btn: ['确定', '取消'], //按钮
|
|
||||||
icon: 3,
|
|
||||||
shadeClose: false,
|
|
||||||
skin: 'layer-ext-moon'
|
|
||||||
}, yes, no);
|
|
||||||
},
|
|
||||||
markDownEdit: function (id, option) {
|
|
||||||
var _option = $.extend({
|
|
||||||
width: "96%",
|
|
||||||
height: 640,
|
|
||||||
syncScrolling: "single",
|
|
||||||
path: "../../lib/editormd/lib/"
|
|
||||||
}, options);
|
|
||||||
return editormd(id, _option);
|
|
||||||
},
|
|
||||||
ajax: function (url, appendPostData, beforeFn, completeFn, successFn, errorFn, isShowLoading) {
|
|
||||||
jQuery.ajax({
|
|
||||||
type: "POST",
|
|
||||||
url: url,
|
|
||||||
data: appendPostData,
|
|
||||||
global: false,
|
|
||||||
beforeSend: function (XMLHttpRequest) {
|
|
||||||
if (jQuery.isFunction(beforeFn)) {
|
|
||||||
if (beforeFn(XMLHttpRequest)) {
|
|
||||||
if (isShowLoading != false) {
|
|
||||||
freejs.showLoading();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
if (isShowLoading != false) {
|
|
||||||
freejs.showLoading();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
success: function (data, textStatus) {
|
|
||||||
if (jQuery.isFunction(successFn)) {
|
|
||||||
successFn(data, textStatus);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
complete: function (XMLHttpRequest, textStatus) {
|
|
||||||
var gohome = XMLHttpRequest.getResponseHeader("Timeout");
|
|
||||||
if (gohome) {
|
|
||||||
// window.top.window.location.href = gohome;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
if (isShowLoading != false) {
|
|
||||||
freejs.hideLoading();
|
|
||||||
}
|
|
||||||
if (jQuery.isFunction(completeFn)) {
|
|
||||||
completeFn();
|
|
||||||
}
|
|
||||||
},
|
|
||||||
error: function (e, d, s, u, b) {
|
|
||||||
if (jQuery.isFunction(errorFn)) {
|
|
||||||
errorFn(e, d, s);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
freejs.showMessage({
|
|
||||||
title: "发生异常",
|
|
||||||
type: 2,
|
|
||||||
msg: s
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
},
|
|
||||||
dialogWindow: {
|
|
||||||
/*
|
|
||||||
url: "/Admin/Document/DocContentEditModule", //页面地址
|
|
||||||
paramters: { id: "" }, //参数
|
|
||||||
-------------------------------------------------------
|
|
||||||
title: "新增文档", //标题
|
|
||||||
area: ['1100px', '660px'], //尺寸
|
|
||||||
submit: { //提交参数
|
|
||||||
url: "/Admin/Document/DocContentCreate", // 提交的地址
|
|
||||||
}, //
|
|
||||||
callback: reloadTable //执行完成回调函数
|
|
||||||
*/
|
|
||||||
create: function (options, formpage) {
|
|
||||||
//docContentEdit
|
|
||||||
$("#" + options.elmid).load(options.url, options.paramters, function (responseText, textStatus, jqXHR) {
|
|
||||||
switch (textStatus) {
|
|
||||||
case "success":
|
|
||||||
freejs.dialogWindow.open($.extend({
|
|
||||||
type: 1,
|
|
||||||
maxmin: true,
|
|
||||||
title: "编辑",
|
|
||||||
area: ['1100px', '660px'],
|
|
||||||
shadeClose: false, //点击遮罩关闭
|
|
||||||
content: responseText,
|
|
||||||
submit: {
|
|
||||||
url: "/Admin/Document/DocContentCreate",
|
|
||||||
}
|
|
||||||
}, options), formpage);
|
|
||||||
break;
|
|
||||||
case "error":
|
|
||||||
freejs.showMessage({ title: "提示", msg: "页面加载失败", type: 2 });
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
},
|
|
||||||
/*
|
|
||||||
{
|
|
||||||
type: 1,
|
|
||||||
maxmin: true,
|
|
||||||
title: "编辑",
|
|
||||||
area: ['1100px', '660px'],
|
|
||||||
shadeClose: false, //点击遮罩关闭
|
|
||||||
content: responseText,
|
|
||||||
submit: {
|
|
||||||
url: "/Admin/Document/DocContentCreate",
|
|
||||||
}
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
open: function (options, form) {
|
|
||||||
var currentOpenID = 0;
|
|
||||||
var base_options = {
|
|
||||||
type: 1,
|
|
||||||
maxmin: true,
|
|
||||||
title: "编辑",
|
|
||||||
area: ['1100px', '660px'],
|
|
||||||
btn: ['立即提交', '关闭'],
|
|
||||||
yes: function (index, layero) {
|
|
||||||
form.on('submit(saveSubmit)', function (data) {
|
|
||||||
if ($.isFunction(options.submitBefore)) data = options.submitBefore(data);
|
|
||||||
$.ajax({
|
|
||||||
type: 'POST',
|
|
||||||
url: options.submit.url,//"/Admin/Document/DocContentCreate",
|
|
||||||
data: JSON.stringify(data.field),
|
|
||||||
contentType: "application/json; charset=utf-8",
|
|
||||||
dataType: "json",
|
|
||||||
success: function (e) {
|
|
||||||
if (e.Status == 1) {
|
|
||||||
freejs.showMessage({ title: "提示", msg: e.Msg || "保存成功", type: 1 });
|
|
||||||
if ($.isFunction(new_options.callback)) new_options.callback();
|
|
||||||
layer.close(index);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
freejs.showMessage({ title: "提示", msg: e.Msg, type: 2 });
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
return false;
|
|
||||||
});
|
|
||||||
},
|
|
||||||
btn2: function (index, layero) {
|
|
||||||
layer.confirm('确定要关闭么?', {
|
|
||||||
btn: ['确定', '取消'] //按钮
|
|
||||||
}, function (index, layero) {
|
|
||||||
layer.close(index);
|
|
||||||
layer.close(currentOpenID);
|
|
||||||
}, function () {
|
|
||||||
});
|
|
||||||
return false;
|
|
||||||
},
|
|
||||||
//右上角关闭回调
|
|
||||||
cancel: function (index, layero) {
|
|
||||||
layer.confirm('确定要关闭么?', {
|
|
||||||
btn: ['确定', '取消'] //按钮
|
|
||||||
}, function (index, layero) {
|
|
||||||
layer.close(index);
|
|
||||||
layer.close(currentOpenID);
|
|
||||||
}, function () {
|
|
||||||
});
|
|
||||||
return false;
|
|
||||||
},
|
|
||||||
shadeClose: false //点击遮罩关闭
|
|
||||||
};
|
|
||||||
var new_options = $.extend(base_options, options);
|
|
||||||
new_options.success = function (layero, index) {
|
|
||||||
if ($.isFunction(options.loadBefore)) options.loadBefore(form);
|
|
||||||
$(".form-module-content").height(dialog_Paramters.height - 110);
|
|
||||||
|
|
||||||
// 解决按enter键重复弹窗问题
|
|
||||||
$(':focus').blur();
|
|
||||||
// 添加form标识
|
|
||||||
layero.addClass('layui-form');
|
|
||||||
// 将保存按钮改变成提交按钮
|
|
||||||
layero.find('.layui-layer-btn0').attr({
|
|
||||||
'lay-filter': 'saveSubmit',
|
|
||||||
'lay-submit': ''
|
|
||||||
});
|
|
||||||
form.render();
|
|
||||||
}
|
|
||||||
currentOpenID = layer.open(new_options);
|
|
||||||
},
|
|
||||||
close: function () {
|
|
||||||
}
|
|
||||||
},
|
|
||||||
loadHtml: function (options) {
|
|
||||||
//options = {
|
|
||||||
// elm:"page_content",url: "/Admin/Document/DocType", paramters: {},loadIndex:1,isform:false
|
|
||||||
//};
|
|
||||||
var _container = options.elm || "page_content";
|
|
||||||
$("#" + _container).load(options.url, options.paramters, function (responseText, textStatus, jqXHR) {
|
|
||||||
freejs.closeLoading(options.loadIndex);
|
|
||||||
alert(textStatus);
|
|
||||||
switch (textStatus) {
|
|
||||||
case "success":
|
|
||||||
debugger
|
|
||||||
if ($.isFunction(options.successCallBack)) options.successCallBack();
|
|
||||||
//初始化绑定页面的时间,例如时间控件
|
|
||||||
index = -1;
|
|
||||||
//if (options.isform) {
|
|
||||||
// layui.use('form', function () {
|
|
||||||
// var form = layui.form;
|
|
||||||
|
|
||||||
// });
|
|
||||||
//}
|
|
||||||
break;
|
|
||||||
//case "notmodified":
|
|
||||||
//case "error":
|
|
||||||
//case "timeout":
|
|
||||||
//case "parsererror":
|
|
||||||
//spf.loadHtml(mcid, "/Service/Error/", function (jElement, responseText) {
|
|
||||||
// loadResultShow(jElement, responseText, spTitle, spHead);
|
|
||||||
//});
|
|
||||||
//break;
|
|
||||||
case "error":
|
|
||||||
if ($.isFunction(options.errorCallBack)) options.errorCallBack(form);
|
|
||||||
$("#page_content").html(responseText);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
//如果出现长时间未关闭,定时关闭loading
|
|
||||||
setTimeout(function () {
|
|
||||||
if (options.loadIndex >= 0) freejs.closeLoading(options.loadIndex);
|
|
||||||
}, 5000);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
window.freejs = new base();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 数组扩展
|
|
||||||
* @param {any} func
|
|
||||||
*/
|
|
||||||
Array.prototype.select = function (func) {
|
|
||||||
var retValues = [];
|
|
||||||
if (this.length == 0) {
|
|
||||||
return retValues;
|
|
||||||
}
|
|
||||||
if (func == null) {
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
for (var i = 0; i < this.length; i++) {
|
|
||||||
retValues.push(func(this[i]));
|
|
||||||
}
|
|
||||||
return retValues;
|
|
||||||
};
|
|
||||||
Array.prototype.where = function (func) {
|
|
||||||
if (func == null) {
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
var retList = [];
|
|
||||||
for (var i = 0; i < this.length; i++) {
|
|
||||||
if (func(this[i]) != false) {
|
|
||||||
retList.push(this[i]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return retList;
|
|
||||||
}
|
|
||||||
})(window);
|
|
@ -1,478 +0,0 @@
|
|||||||
/**
|
|
||||||
|
|
||||||
layui官网
|
|
||||||
|
|
||||||
*/
|
|
||||||
|
|
||||||
layui.define(['code', 'element', 'table', 'util'], function (exports) {
|
|
||||||
var $ = layui.jquery
|
|
||||||
, element = layui.element
|
|
||||||
, layer = layui.layer
|
|
||||||
, form = layui.form
|
|
||||||
, util = layui.util
|
|
||||||
, device = layui.device()
|
|
||||||
|
|
||||||
, $win = $(window), $body = $('body');
|
|
||||||
|
|
||||||
|
|
||||||
//阻止IE7以下访问
|
|
||||||
if (device.ie && device.ie < 8) {
|
|
||||||
layer.alert('Layui最低支持ie8,您当前使用的是古老的 IE' + device.ie + ',你丫的肯定不是程序猿!');
|
|
||||||
}
|
|
||||||
|
|
||||||
var home = $('#LAY_home');
|
|
||||||
|
|
||||||
|
|
||||||
layer.ready(function () {
|
|
||||||
var local = layui.data('layui');
|
|
||||||
|
|
||||||
//升级提示
|
|
||||||
if (local.version && local.version !== layui.v) {
|
|
||||||
layer.open({
|
|
||||||
type: 1
|
|
||||||
, title: '更新提示' //不显示标题栏
|
|
||||||
, closeBtn: false
|
|
||||||
, area: '300px;'
|
|
||||||
, shade: false
|
|
||||||
, offset: 'b'
|
|
||||||
, id: 'LAY_updateNotice' //设定一个id,防止重复弹出
|
|
||||||
, btn: ['更新日志', '朕不想升']
|
|
||||||
, btnAlign: 'c'
|
|
||||||
, moveType: 1 //拖拽模式,0或者1
|
|
||||||
, content: ['<div class="layui-text">'
|
|
||||||
, 'layui 已更新到:<strong style="padding-right: 10px; color: #fff;">v' + layui.v + '</strong> <br>请注意升级!'
|
|
||||||
, '</div>'].join('')
|
|
||||||
, skin: 'layui-layer-notice'
|
|
||||||
, yes: function (index) {
|
|
||||||
layer.close(index);
|
|
||||||
setTimeout(function () {
|
|
||||||
location.href = '/doc/base/changelog.html';
|
|
||||||
}, 500);
|
|
||||||
}
|
|
||||||
, end: function () {
|
|
||||||
layui.data('layui', {
|
|
||||||
key: 'version'
|
|
||||||
, value: layui.v
|
|
||||||
});
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
layui.data('layui', {
|
|
||||||
key: 'version'
|
|
||||||
, value: layui.v
|
|
||||||
});
|
|
||||||
|
|
||||||
|
|
||||||
//公告
|
|
||||||
; !function () {
|
|
||||||
return layui.data('layui', {
|
|
||||||
key: 'notice_20180530'
|
|
||||||
, remove: true
|
|
||||||
});
|
|
||||||
|
|
||||||
if (local.notice_20180530 && new Date().getTime() - local.notice_20180530 < 1000 * 60 * 60 * 24 * 5) {
|
|
||||||
return;
|
|
||||||
};
|
|
||||||
|
|
||||||
layer.open({
|
|
||||||
type: 1
|
|
||||||
, title: 'layui 官方通用后台管理模板'
|
|
||||||
, closeBtn: false
|
|
||||||
, area: ['300px', '280px']
|
|
||||||
, shade: false
|
|
||||||
//,offset: 'c'
|
|
||||||
, id: 'LAY_Notice' //设定一个id,防止重复弹出
|
|
||||||
, btn: ['前往围观', '朕不想看']
|
|
||||||
, btnAlign: 'b'
|
|
||||||
, moveType: 1 //拖拽模式,0或者1
|
|
||||||
, resize: false
|
|
||||||
, content: ['<div style="padding: 15px; text-align: center; background-color: #e2e2e2;">'
|
|
||||||
, '<a href="/admin/std/dist/views/" target="_blank"><img src="//cdn.layui.com/upload/2018_5/168_1527691799254_76462.jpg" alt="layuiAdmin" style="width: 100%; height:149.78px;"></a>'
|
|
||||||
, '</div>'].join('')
|
|
||||||
, success: function (layero, index) {
|
|
||||||
var btn = layero.find('.layui-layer-btn');
|
|
||||||
btn.find('.layui-layer-btn0').attr({
|
|
||||||
href: '/admin/std/dist/views/'
|
|
||||||
, target: '_blank'
|
|
||||||
});
|
|
||||||
|
|
||||||
layero.find('a').on('click', function () {
|
|
||||||
layer.close(index);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
, end: function () {
|
|
||||||
layui.data('layui', {
|
|
||||||
key: 'notice_20180530'
|
|
||||||
, value: new Date().getTime()
|
|
||||||
});
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}();
|
|
||||||
|
|
||||||
});
|
|
||||||
|
|
||||||
; !function () {
|
|
||||||
var elemComponentSelect = $(['<select lay-search lay-filter="component">'
|
|
||||||
, '<option value="">搜索组件或模块</option>'
|
|
||||||
, '<option value="element/layout.html">grid 栅格布局</option>'
|
|
||||||
, '<option value="element/layout.html#admin">admin 后台布局</option>'
|
|
||||||
, '<option value="element/color.html">color 颜色</option>'
|
|
||||||
, '<option value="element/icon.html">iconfont 字体图标</option>'
|
|
||||||
, '<option value="element/anim.html">animation 动画</option>'
|
|
||||||
, '<option value="element/button.html">button 按钮</option>'
|
|
||||||
, '<option value="element/form.html">form 表单组</option>'
|
|
||||||
, '<option value="element/form.html#input">input 输入框</option>'
|
|
||||||
, '<option value="element/form.html#select">select 下拉选择框</option>'
|
|
||||||
, '<option value="element/form.html#checkbox">checkbox 复选框</option>'
|
|
||||||
, '<option value="element/form.html#switch">switch 开关</option>'
|
|
||||||
, '<option value="element/form.html#radio">radio 单选框</option>'
|
|
||||||
, '<option value="element/form.html#textarea">textarea 文本域</option>'
|
|
||||||
, '<option value="element/nav.html">nav 导航菜单</option>'
|
|
||||||
, '<option value="element/nav.html#breadcrumb">breadcrumb 面包屑</option>'
|
|
||||||
, '<option value="element/tab.html">tabs 选项卡</option>'
|
|
||||||
, '<option value="element/progress.html">progress 进度条</option>'
|
|
||||||
, '<option value="element/collapse.html">collapse 折叠面板/手风琴</option>'
|
|
||||||
, '<option value="element/table.html">table 表格元素</option>'
|
|
||||||
, '<option value="element/badge.html">badge 徽章</option>'
|
|
||||||
, '<option value="element/timeline.html">timeline 时间线</option>'
|
|
||||||
, '<option value="element/auxiliar.html#blockquote">blockquote 引用块</option>'
|
|
||||||
, '<option value="element/auxiliar.html#fieldset">fieldset 字段集</option>'
|
|
||||||
, '<option value="element/auxiliar.html#hr">hr 分割线</option>'
|
|
||||||
|
|
||||||
, '<option value="modules/layer.html">layer 弹出层/弹窗综合</option>'
|
|
||||||
, '<option value="modules/laydate.html">laydate 日期时间选择器</option>'
|
|
||||||
, '<option value="modules/layim.html">layim 即时通讯/聊天</option>'
|
|
||||||
, '<option value="modules/laypage.html">laypage 分页</option>'
|
|
||||||
, '<option value="modules/laytpl.html">laytpl 模板引擎</option>'
|
|
||||||
, '<option value="modules/form.html">form 表单模块</option>'
|
|
||||||
, '<option value="modules/table.html">table 数据表格</option>'
|
|
||||||
, '<option value="modules/upload.html">upload 文件/图片上传</option>'
|
|
||||||
, '<option value="modules/element.html">element 常用元素操作</option>'
|
|
||||||
, '<option value="modules/rate.html">rate 评分</option>'
|
|
||||||
, '<option value="modules/colorpicker.html">colorpicker 颜色选择器</option>'
|
|
||||||
, '<option value="modules/slider.html">slider 滑块</option>'
|
|
||||||
, '<option value="modules/carousel.html">carousel 轮播/跑马灯</option>'
|
|
||||||
, '<option value="modules/layedit.html">layedit 富文本编辑器</option>'
|
|
||||||
, '<option value="modules/tree.html">tree 树形菜单</option>'
|
|
||||||
, '<option value="modules/flow.html">flow 信息流/图片懒加载</option>'
|
|
||||||
, '<option value="modules/util.html">util 工具集</option>'
|
|
||||||
, '<option value="modules/code.html">code 代码修饰</option>'
|
|
||||||
, '</select>'].join(''));
|
|
||||||
|
|
||||||
$('.component').append(elemComponentSelect);
|
|
||||||
form.render('select', 'LAY-site-header-component');
|
|
||||||
|
|
||||||
//搜索组件
|
|
||||||
form.on('select(component)', function (data) {
|
|
||||||
var value = data.value;
|
|
||||||
location.href = '/doc/' + value;
|
|
||||||
});
|
|
||||||
}();
|
|
||||||
|
|
||||||
|
|
||||||
//点击事件
|
|
||||||
var events = {
|
|
||||||
//联系方式
|
|
||||||
contactInfo: function () {
|
|
||||||
layer.alert('<div class="layui-text">如有合作意向,可联系:<br>邮箱:xianxin@layui-inc.com</div>', {
|
|
||||||
title: '联系'
|
|
||||||
, btn: false
|
|
||||||
, shadeClose: true
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
$body.on('click', '*[site-event]', function () {
|
|
||||||
var othis = $(this)
|
|
||||||
, attrEvent = othis.attr('site-event');
|
|
||||||
events[attrEvent] && events[attrEvent].call(this, othis);
|
|
||||||
});
|
|
||||||
|
|
||||||
//切换版本
|
|
||||||
form.on('select(tabVersion)', function (data) {
|
|
||||||
var value = data.value;
|
|
||||||
location.href = value === 'new' ? '/' : ('/' + value + '/doc/');
|
|
||||||
});
|
|
||||||
|
|
||||||
|
|
||||||
//首页banner
|
|
||||||
setTimeout(function () {
|
|
||||||
$('.site-zfj').addClass('site-zfj-anim');
|
|
||||||
setTimeout(function () {
|
|
||||||
$('.site-desc').addClass('site-desc-anim')
|
|
||||||
}, 5000)
|
|
||||||
}, 100);
|
|
||||||
|
|
||||||
|
|
||||||
//数字前置补零
|
|
||||||
var digit = function (num, length, end) {
|
|
||||||
var str = '';
|
|
||||||
num = String(num);
|
|
||||||
length = length || 2;
|
|
||||||
for (var i = num.length; i < length; i++) {
|
|
||||||
str += '0';
|
|
||||||
}
|
|
||||||
return num < Math.pow(10, length) ? str + (num | 0) : num;
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
//下载倒计时
|
|
||||||
var setCountdown = $('#setCountdown');
|
|
||||||
if ($('#setCountdown')[0]) {
|
|
||||||
$.get('/api/getTime', function (res) {
|
|
||||||
util.countdown(new Date(2017, 7, 21, 8, 30, 0), new Date(res.time), function (date, serverTime, timer) {
|
|
||||||
var str = digit(date[1]) + ':' + digit(date[2]) + ':' + digit(date[3]);
|
|
||||||
setCountdown.children('span').html(str);
|
|
||||||
});
|
|
||||||
}, 'jsonp');
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
for (var i = 0; i < $('.adsbygoogle').length; i++) {
|
|
||||||
(adsbygoogle = window.adsbygoogle || []).push({});
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//展示当前版本
|
|
||||||
$('.site-showv').html(layui.v);
|
|
||||||
|
|
||||||
////获取下载数
|
|
||||||
//$.get('//fly.layui.com/api/handle?id=10&type=find', function (res) {
|
|
||||||
// $('.site-showdowns').html(res.number);
|
|
||||||
//}, 'jsonp');
|
|
||||||
|
|
||||||
////记录下载
|
|
||||||
//$('.site-down').on('click', function () {
|
|
||||||
// $.get('//fly.layui.com/api/handle?id=10', function () { }, 'jsonp');
|
|
||||||
//});
|
|
||||||
|
|
||||||
//获取Github数据
|
|
||||||
var getStars = $('#getStars');
|
|
||||||
if (getStars[0]) {
|
|
||||||
$.get('https://api.github.com/repos/2881099/FreeSql', function (res) {
|
|
||||||
getStars.html(res.stargazers_count);
|
|
||||||
}, 'json');
|
|
||||||
}
|
|
||||||
|
|
||||||
//固定Bar
|
|
||||||
if (global.pageType !== 'demo') {
|
|
||||||
util.fixbar({
|
|
||||||
bar1: true
|
|
||||||
, click: function (type) {
|
|
||||||
if (type === 'bar1') {
|
|
||||||
location.href = '//fly.layui.com/';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
//窗口scroll
|
|
||||||
; !function () {
|
|
||||||
var main = $('.site-tree').parent(), scroll = function () {
|
|
||||||
var stop = $(window).scrollTop();
|
|
||||||
|
|
||||||
if ($(window).width() <= 750) return;
|
|
||||||
var bottom = $('.footer').offset().top - $(window).height();
|
|
||||||
if (stop > 211 && stop < bottom) {
|
|
||||||
if (!main.hasClass('site-fix')) {
|
|
||||||
main.addClass('site-fix');
|
|
||||||
}
|
|
||||||
if (main.hasClass('site-fix-footer')) {
|
|
||||||
main.removeClass('site-fix-footer');
|
|
||||||
}
|
|
||||||
} else if (stop >= bottom) {
|
|
||||||
if (!main.hasClass('site-fix-footer')) {
|
|
||||||
main.addClass('site-fix site-fix-footer');
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (main.hasClass('site-fix')) {
|
|
||||||
main.removeClass('site-fix').removeClass('site-fix-footer');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
stop = null;
|
|
||||||
};
|
|
||||||
scroll();
|
|
||||||
$(window).on('scroll', scroll);
|
|
||||||
}();
|
|
||||||
|
|
||||||
//示例页面滚动
|
|
||||||
$('.site-demo-body').on('scroll', function () {
|
|
||||||
var elemDate = $('.layui-laydate,.layui-colorpicker-main')
|
|
||||||
, elemTips = $('.layui-table-tips');
|
|
||||||
if (elemDate[0]) {
|
|
||||||
elemDate.each(function () {
|
|
||||||
var othis = $(this);
|
|
||||||
if (!othis.hasClass('layui-laydate-static')) {
|
|
||||||
othis.remove();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
$('input').blur();
|
|
||||||
}
|
|
||||||
if (elemTips[0]) elemTips.remove();
|
|
||||||
|
|
||||||
if ($('.layui-layer')[0]) {
|
|
||||||
layer.closeAll('tips');
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
//目录
|
|
||||||
var siteDir = $('.site-dir');
|
|
||||||
if (siteDir[0] && $(window).width() > 750) {
|
|
||||||
layer.ready(function () {
|
|
||||||
layer.open({
|
|
||||||
type: 1
|
|
||||||
, content: siteDir
|
|
||||||
, skin: 'layui-layer-dir'
|
|
||||||
, area: 'auto'
|
|
||||||
, maxHeight: $(window).height() - 300
|
|
||||||
, title: '目录'
|
|
||||||
//,closeBtn: false
|
|
||||||
, offset: 'r'
|
|
||||||
, shade: false
|
|
||||||
, success: function (layero, index) {
|
|
||||||
layer.style(index, {
|
|
||||||
marginLeft: -15
|
|
||||||
});
|
|
||||||
}
|
|
||||||
});
|
|
||||||
});
|
|
||||||
siteDir.find('li').on('click', function () {
|
|
||||||
var othis = $(this);
|
|
||||||
othis.find('a').addClass('layui-this');
|
|
||||||
othis.siblings().find('a').removeClass('layui-this');
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
//在textarea焦点处插入字符
|
|
||||||
var focusInsert = function (str) {
|
|
||||||
var start = this.selectionStart
|
|
||||||
, end = this.selectionEnd
|
|
||||||
, offset = start + str.length
|
|
||||||
|
|
||||||
this.value = this.value.substring(0, start) + str + this.value.substring(end);
|
|
||||||
this.setSelectionRange(offset, offset);
|
|
||||||
};
|
|
||||||
|
|
||||||
//演示页面
|
|
||||||
$('body').on('keydown', '#LAY_editor, .site-demo-text', function (e) {
|
|
||||||
var key = e.keyCode;
|
|
||||||
if (key === 9 && window.getSelection) {
|
|
||||||
e.preventDefault();
|
|
||||||
focusInsert.call(this, ' ');
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
var editor = $('#LAY_editor')
|
|
||||||
, iframeElem = $('#LAY_demo')
|
|
||||||
, demoForm = $('#LAY_demoForm')[0]
|
|
||||||
, demoCodes = $('#LAY_demoCodes')[0]
|
|
||||||
, runCodes = function () {
|
|
||||||
if (!iframeElem[0]) return;
|
|
||||||
var html = editor.val();
|
|
||||||
|
|
||||||
html = html.replace(/=/gi, "layequalsign");
|
|
||||||
html = html.replace(/script/gi, "layscrlayipttag");
|
|
||||||
demoCodes.value = html.length > 100 * 1000 ? '<h1>卧槽,你的代码过长</h1>' : html;
|
|
||||||
|
|
||||||
demoForm.action = '/api/runHtml/';
|
|
||||||
demoForm.submit();
|
|
||||||
|
|
||||||
};
|
|
||||||
$('#LAY_demo_run').on('click', runCodes), runCodes();
|
|
||||||
|
|
||||||
//让导航在最佳位置
|
|
||||||
var setScrollTop = function (thisItem, elemScroll) {
|
|
||||||
if (thisItem[0]) {
|
|
||||||
var itemTop = thisItem.offset().top
|
|
||||||
, winHeight = $(window).height();
|
|
||||||
if (itemTop > winHeight - 120) {
|
|
||||||
elemScroll.animate({ 'scrollTop': itemTop / 2 }, 200)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
setScrollTop($('.site-demo-nav').find('dd.layui-this'), $('.layui-side-scroll').eq(0));
|
|
||||||
setScrollTop($('.site-demo-table-nav').find('li.layui-this'), $('.layui-side-scroll').eq(1));
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//查看代码
|
|
||||||
$(function () {
|
|
||||||
var DemoCode = $('#LAY_democode');
|
|
||||||
DemoCode.val([
|
|
||||||
DemoCode.val()
|
|
||||||
, '<body>'
|
|
||||||
, global.preview
|
|
||||||
, '\n<script src="//res.layui.com/layui/dist/layui.js" charset="utf-8"></script>'
|
|
||||||
, '\n<!-- 注意:如果你直接复制所有代码到本地,上述js路径需要改成你本地的 -->'
|
|
||||||
, $('#LAY_democodejs').html()
|
|
||||||
, '\n</body>\n</html>'
|
|
||||||
].join(''));
|
|
||||||
});
|
|
||||||
|
|
||||||
//点击查看代码选项
|
|
||||||
element.on('tab(demoTitle)', function (obj) {
|
|
||||||
if (obj.index === 1) {
|
|
||||||
if (device.ie && device.ie < 9) {
|
|
||||||
layer.alert('强烈不推荐你通过ie8/9 查看代码!因为,所有的标签都会被格式成大写,且没有换行符,影响阅读');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
|
|
||||||
//手机设备的简单适配
|
|
||||||
var treeMobile = $('.site-tree-mobile')
|
|
||||||
, shadeMobile = $('.site-mobile-shade')
|
|
||||||
|
|
||||||
treeMobile.on('click', function () {
|
|
||||||
$('body').addClass('site-mobile');
|
|
||||||
});
|
|
||||||
|
|
||||||
shadeMobile.on('click', function () {
|
|
||||||
$('body').removeClass('site-mobile');
|
|
||||||
});
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//愚人节
|
|
||||||
; !function () {
|
|
||||||
if (home.data('date') === '4-1') {
|
|
||||||
|
|
||||||
if (local['20180401']) return;
|
|
||||||
|
|
||||||
home.addClass('site-out-up');
|
|
||||||
setTimeout(function () {
|
|
||||||
layer.photos({
|
|
||||||
photos: {
|
|
||||||
"data": [{
|
|
||||||
"src": "//cdn.layui.com/upload/2018_4/168_1522515820513_397.png",
|
|
||||||
}]
|
|
||||||
}
|
|
||||||
, anim: 2
|
|
||||||
, shade: 1
|
|
||||||
, move: false
|
|
||||||
, end: function () {
|
|
||||||
layer.msg('愚公,快醒醒!', {
|
|
||||||
shade: 1
|
|
||||||
}, function () {
|
|
||||||
layui.data('layui', {
|
|
||||||
key: '20180401'
|
|
||||||
, value: true
|
|
||||||
});
|
|
||||||
});
|
|
||||||
}
|
|
||||||
, success: function (layero, index) {
|
|
||||||
home.removeClass('site-out-up');
|
|
||||||
|
|
||||||
layero.find('#layui-layer-photos').on('click', function () {
|
|
||||||
layer.close(layero.attr('times'));
|
|
||||||
}).find('.layui-layer-imgsee').remove();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}, 1000 * 3);
|
|
||||||
}
|
|
||||||
}();
|
|
||||||
|
|
||||||
|
|
||||||
exports('global', {});
|
|
||||||
});
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user