remove Examples/website

This commit is contained in:
28810 2019-03-19 10:10:40 +08:00
parent 212a9f2786
commit 7738dfec88
638 changed files with 4 additions and 110532 deletions

View File

@ -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);
}
}
}

View File

@ -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
}
}

View File

@ -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>
{
}
}

View File

@ -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);
//}
}
}

View File

@ -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>
{
}
}

View File

@ -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>

View File

@ -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);
}
}
}

View File

@ -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;
}
}
}

View File

@ -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>
{
}
}

View File

@ -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";
}
}

View File

@ -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; }
}
}

View File

@ -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; }
}
}

View File

@ -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; }
}
}

View File

@ -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; }
}
}

View File

@ -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
{
}
}

View File

@ -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; }
}
}

View File

@ -1,11 +0,0 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netcoreapp2.2</TargetFramework>
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\..\..\FreeSql\FreeSql.csproj" />
</ItemGroup>
</Project>

View File

@ -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; }
}
}

View File

@ -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
{
}
}

View File

@ -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);
}
}
}

View File

@ -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
}
}

View File

@ -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);
}
}
}

View File

@ -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);
}
}
}

View File

@ -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; }
}
}

View File

@ -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; }
}
}

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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: "&#xe619;",
close: "&#xe61a;"
},
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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -1,4 +0,0 @@
@{
ViewBag.Title = "";
}
系统参数设置

View File

@ -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>

View File

@ -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

View File

@ -1,4 +0,0 @@
@{
Layout = null;
ViewData["Title"] = ".NETCore最方便的ORM";
}

View File

@ -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);
}
}
}

View File

@ -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; }
}
}

View File

@ -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>

View File

@ -1,3 +0,0 @@
@{
Layout = "~/Views/Shared/_Layout.cshtml";
}

View File

@ -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();
}
}
}
}

View File

@ -1,6 +0,0 @@
@*
For more information on enabling MVC for empty projects, visit https://go.microsoft.com/fwlink/?LinkID=397860
*@
@{
}

View File

@ -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>
}

View File

@ -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>&gt;&nbsp;@children.text</cite></a>
</li>
foreach (var children2 in children.children)
{
<li class="site-tree-noicon">
<a href="?id=@(children2.id)"><cite>&nbsp;&nbsp;&nbsp;&nbsp;@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>

View File

@ -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"

View File

@ -1,3 +0,0 @@
@{
Layout = "~/Views/Shared/_Layout.cshtml";
}

View File

@ -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();
}
}
}

View File

@ -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();
}
}
}

View File

@ -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>

View File

@ -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>

View File

@ -1,3 +0,0 @@
@{
Layout = "~/Views/Shared/_Layout.cshtml";
}

View File

@ -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;
}
}
}

View File

@ -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));
}
}
}
}
}

View File

@ -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();
}
}
}

View File

@ -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);
}
}
}

View File

@ -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
{
}
}

View File

@ -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 });
}
}
}

View File

@ -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>

View File

@ -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);
}
}

View File

@ -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; }
}
}

View File

@ -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;
}
}
}

View File

@ -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>();
}
}

View File

@ -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"
}
}
}
}

View File

@ -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?}"
);
});

View File

@ -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?}");
});
}
}
}

View File

@ -1,4 +0,0 @@
@{
ViewData["Title"] = "About";
}
关于

View File

@ -1,4 +0,0 @@
@{
ViewData["Title"] = "Contact";
}
联系人

View File

@ -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);">&#xe631;</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>

View File

@ -1,4 +0,0 @@
@{
ViewData["Title"] = "Privacy Policy";
}
隐私

View File

@ -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>

View File

@ -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>
}

View File

@ -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>

View File

@ -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>

View File

@ -1,4 +0,0 @@
@using FreeSql.Site.UI
@using FreeSql.Site.UI.Models
@using FreeSql.Site.UI.Common
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers

View File

@ -1,3 +0,0 @@
@{
Layout = "_Layout";
}

View File

@ -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"
}
}
}

View File

@ -1,8 +0,0 @@
{
"Logging": {
"LogLevel": {
"Default": "Warning"
}
},
"AllowedHosts": "*"
}

View File

@ -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;
}

View File

@ -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

View File

@ -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}}

View File

@ -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

View File

@ -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>();
//同步实体类型到数据库
```

View File

@ -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>
```

View File

@ -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语句返回被删除的记录 |

View File

@ -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>
```

View File

@ -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语句返回插入后的记录 |

View File

@ -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 | 缓存查询结果 |

View File

@ -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

View File

@ -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);

View File

@ -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