目录
- 1.后台配置appsettings.json说明
- 2.service.cs扩展 表/明细表(CRUD导入导出)前后做一些操作 数据(CRUD导入导出)前后的处理参数或数据
- 2.编辑
- 3.新建
- 4.查询
- 5.导出
- 6.导入
注意事项
:后台扩展必须写在代码生成的Partial部分类里面
防止代码生成后覆盖你的扩展的代码
1.后台配置appsettings.json说明
{"Logging": {"LogLevel": {"Default": "Information","Microsoft": "Warning","Microsoft.Hosting.Lifetime": "Information"}},"AllowedHosts": "*","VirtualPath": {"StaticFile": "E:\\Web\\Static", //配置的虚拟目录文件所在路径"FolderName": "/Static" //访问时此路径时的别名},"AppUrls": {},"Connection": {"DBType": "MySql", //MySql/MsSql/PgSql //数据库类型,如果使用的是sqlserver此处应设置为MsSql//sqlserver连接字符串//"DbConnectionString": "Data Source=JXX2835\\SQLEXPRESS;Initial Catalog=netcore_demo;Persist Security Info=True;User ID=sa;Password=123456;Connect Timeout=500;",//mysql连接字符串(升级EFCore3.1到时已将mysql连接字符串修改,2019-12-20)"DbConnectionString": " Data Source=127.0.0.1;Database=netcoredev1;AllowLoadLocalInfile=true;User ID=root;Password=666666;allowPublicKeyRetrieval=true;pooling=true;CharSet=utf8;port=3306;sslmode=none;",//PgSql连接字符串// "DbConnectionString": "Host=132.232.2.109;Port=5432;User id=postgres;password=jxx_abcd;Database=netcoredev;","RedisConnectionString": "127.0.0.1,Password=123456,SyncTimeout=15000", //redis连接字符串(最好加密)"UseRedis": "false" //是否使用redis,如果不使用,默认使用Memory内置缓存},"Secret": { //秘钥配置"JWT": "BB3647441FFA4B5DB4E64A29B53CE525", //JWT"Audience": "vol.core","Issuer": "vol.core.owner","User": "C5ABA9E202D94C43A3CA66002BF77FAF", //"DB": "3F8B7B38AD3D484A89ACA513CBD79F36","Redis": "E6D90DDBC70C4F4EA3C312B6FCB473C8"},//================跨域请求 (CORS)配置(2019-12-20新增),//================.netcore3.1必须配置此属性,多个url用豆号隔开,url为vue站点的地址,可以将发布后的地址也同时配置上"CorsUrls": "http://localhost:8081,http://localhost:8080,http://localhost:7080,http://localhost:9980,http://127.0.0.1:9980,http://localhost:9990,http://www.volcore.xyz","ExpMinutes": "120", //PC登录默认-JWT有效期(分钟=默认120),"CreateMember": { //对表插入数据时,需要记录创建人/创建时间/创建日期,配置UserIdField/UserNameField/DateField分别为对应数据库的创建人CreateID,创建人Creator,创建时间CreateDate字段(新建数据时,由框架默认完成给这几个字段赋值,字段区分大小写)或可手动调用T.SetCreateDefaultVal()完成设置创建人/创建时间/创建日期//如果表的主键是GUID,界面查询时默认会用到DateField对应的实体(数据库)字段进行排序//表添加这两个字段新建时就会自动添加创建人的和日期修改也是一样"UserIdField": "CreateID","UserNameField": "Creator","DateField": "CreateDate"},"ModifyMember": { //修改同上"UserIdField": "ModifyID","UserNameField": "Modifier","DateField": "ModifyDate"}, //演示系统过滤Action,只有超级管理员才能操作,其他用户只有只读权限"GlobalFilter": {"Message": "演示环境,当前帐号没有开启此功能权限","Enable": "false", //开启Action过滤"Actions": [ "Update", "Del", "Add", "SavePermission", "Save", "CreatePage", "CreateVuePage", "CreateEntityModel", "SaveEidt", "CreateServices", "Import", "Upload", "Audit", "ModifyPwd" ]},"Mail": {"Address": "code283591387@163.com", //发件的邮箱"Host": "smtp.163.com","Name": "VOL", //发送人名称"Port": 25,"EnableSsl": false,"AuthPwd": "授权密码" //授权密码(对应邮箱设置里面去开启)},"QuartzAccessKey": "65EC9387355E4717899C552963CE59FF", //定时任务的值,请自行修改"WeChat": {"appid": "wx2f2d6e605d60671f","secret": "微信开放平台里找"}
}
2.service.cs扩展 表/明细表(CRUD导入导出)前后做一些操作 数据(CRUD导入导出)前后的处理参数或数据
写在Partial部分类里面
具体文档链接点击链接:
新版:后台基础代码扩展实现链接
旧版:后台基础代码扩展实现链接
2.编辑
- 数据库表的字段前校验表请求的字段原有表中存不存在
public override WebResponseContent Update(SaveModel saveModel)
{//编辑方法保存数据库前处理UpdateOnExecuting = (Demo_Catalog catalog, object addList, object updateList, List<object> delKeys) =>{//如果数据库的分类编号与前端请求的分类编号相同//并且该记录的主键id和请求的不同说明已存在//这边也可以用写原生sql解决repository.DapperContext.ExecuteScalar("select * from .....")if (repository.Exists(x => x.CatalogCode == catalog.CatalogCode && x.CatalogId != catalog.CatalogId)){return webResponse.Error(CatalogCode + "分类编号已存在");}return webResponse.OK();};return base.Update(saveModel);
}
3.新建
- 数据库表的字段前校验表请求的字段原有表中存不存在
public override WebResponseContent Add(SaveModel saveDataModel)
{// 在保存数据库前的操作,所有数据都验证通过了,这一步执行完就执行数据库保存AddOnExecuting = (Demo_Catalog catalog, object list) =>{if (repository.Exists(x => x.CatalogCode == catalog.CatalogCode)){return webResponse.Error("分类编号已存在");}return webResponse.OK();};return base.Add(saveDataModel);
}
4.查询
- 前台提交的原生的查询条件–设置原生查询的sql语句
- 通过UserContext获取当前的用户的信息–做一些查询的权限(查询当前用户对应的数据)
public override PageGridData<Demo_Catalog> GetPageData(PageDataOptions options)
{//此处是从前台提交的原生的查询条件,这里可以自己过滤//QueryRelativeList = (List<SearchParameters> parameters) =>//{//};// searchBefore(param) {// //界面查询前,可以给param.wheres添加查询参数// //返回false,则不会执行查询// 前端查询前添加的值(对象也可以 后端用getObject就行) param.value = 1;// return true;// },//获取前端查询前添加的值//if (options.Value.GetInt()==1)//{// Console.WriteLine("1");//}2020.08.15设置原生查询的sql语句,这里必须返回select * 表所有字段(先内部过滤数据,内部调用EF方法FromSqlRaw,自己写的sql注意sql注入的问题),不会影响界面上提交的查询//查询当前时间的数据//string date = DateTime.Now.AddHours(-10).ToString("yyyy-MM-dd");//QuerySql = $@"select * from Demo_Catalog where createdate>'{date}'";// repository.DapperContext.ex//PageGridData<Demo_Catalog> gridData = new PageGridData<Demo_Catalog>()//{// rows=new List<Demo_Catalog>() { },// total=100//};//查询当前用户对应的数据//QueryRelativeExpression = (IQueryable<Demo_Catalog> queryable) =>//{// queryable = queryable.Where(x => x.CreateID == UserContext.Current.UserId);// return queryable;//};return base.GetPageData(options);
}
5.导出
public override WebResponseContent Export(PageDataOptions pageData)
{//设置最大导出的数量Limit = 100000;//指定导出的字段(2020.05.07)// ExportColumns = x => new { x.CatalogCode, x.CatalogName };//查询要导出的数据后,在生成excel文件前处理//list导出的实体,ignore过滤不导出的字段//ExportOnExecuting = (List<Demo_Catalog> list, List<string> ignore) =>//{// list.ForEach(item =>// {// item.CatalogCode = "11";//所有分类编号全是11// });// ignore.Add("Remark");//忽略Remark字段// return webResponse.OK();//};return base.Export(pageData);
}
6.导入
/// <summary>/// 导入/// </summary>/// <param name="files"></param>/// <returns></returns>public override WebResponseContent Import(List<IFormFile> files){//(2020.05.07)//设置导入的字段(如果指定了上面导出模板的字段,这里配置应该与上面DownLoadTemplate方法里配置一样)//如果不设置导入的字段DownLoadTemplateColumns,默认显示所有界面上所有可以看到的字段DownLoadTemplateColumns = x => new { x.SellNo, x.TranNo, x.Remark, x.CreateDate };/// <summary>/// 2022.06.20增加原生excel读取方法(导入时可以自定义读取excel内容)/// string=当前读取的excel单元格的值/// ExcelWorksheet=excel对象/// ExcelRange当前excel单元格对象/// int=当前读取的第几行/// int=当前读取的第几列/// string=返回的值/// </summary>ImportOnReadCellValue = (string value, ExcelWorksheet worksheet, ExcelRange excelRange, int rowIndex, int columnIndex) =>{string 表头列名 = worksheet.Cells[1, columnIndex].Value?.ToString();//这里可以返回处理后的值,值最终写入到model字段上return value;};//导入保存前处理(可以对list设置新的值)ImportOnExecuting = (List<SellOrder> list) =>{//设置webResponse.Code = "-1"会中止后面代码执行,与返回 webResponse.Error()一样,区别在于前端提示的是成功或失败//webResponse.Code = "-1";//webResponse.Message = "测试强制返回";//return webResponse.OK("ok");return webResponse.OK();};//导入后处理(已经写入到数据库了)ImportOnExecuted = (List<SellOrder> list) =>{return webResponse.OK();};return base.Import(files);}