后端手册
大约 7 分钟
后端手册
配置文件
appsetting.json
说明
{
"dbConfigs": [
{
"Conn": "Data Source=LAPTOP-STKF2M8H\\SQLEXPRESS;User ID=admin;Password=admin123;Initial Catalog=ZrAdmin;",
"DbType": 1, //数据库类型 MySql = 0, SqlServer = 1, Oracle = 3,PgSql = 4
"ConfigId": "0", //多租户唯一标识
"IsAutoCloseConnection": true
}
//...下面添加更多的数据库源
],
//代码生成数据库配置
"CodeGenDbConfig": {
//代码生成连接字符串,注意{dbName}为固定格式,不要填写数据库名
"Conn": "Data Source=LAPTOP-STKF2M8H\\SQLEXPRESS;User ID=admin;Password=admin123;Initial Catalog={dbName};",
"DbType": 1,
"IsAutoCloseConnection": true,
"DbName": "ZrAdmin" //代码生成默认连接数据库
},
"urls": "http://localhost:8888", //项目启动url,非必要不修改,(本地开发、控制台启动有效、linux启动)
"corsUrls": ["http://localhost:8887", "http://localhost:8886"], //跨域地址(前端启动项目,前后端分离单独部署需要设置),多个用","隔开
//jwt 授权认证配置
"JwtSettings": {
"Issuer": "https://localhost:8888",
"Audience": "https://localhost:8888",
"SecretKey": "Hello-key-ZRADMIN.NET-20210101",
"Expire": 30, //jwt登录超时时间(分)
"RefreshTokenTime": 5, //token有效期剩多久(分钟)刷新token
"TokenType": "Bearer"
},
"InjectClass": ["ZR.Repository", "ZR.Service", "ZR.Tasks", "ZR.ServiceCore"], //自动注入类
"ShowDbLog": true, //是否打印db日志
"InitDb": false, //是否初始化db
"DemoMode": false, //是否演示模式
//本地资源上传访问配置
"Upload": {
//项目默认上传配置
"UploadUrl": "http://localhost:8888/uploads", //默认存储访问域名,线上地址eg:http://xxx.xxx.cn/prod-api
"localSavePath": "", //如果为空将默认保存到项目根目录wwwroot里面,本地上传文件存储目录eg:/home/website/zradmin/wwwroot
"maxSize": 15, //上传文件大小限制 15M
"notAllowedExt": [".bat", ".exe", ".jar", ".js"]
},
//阿里云存储配置 前端访问地址 /common/UploadFileAliyun
"ALIYUN_OSS": {
"REGIONID": "cn-hangzhou",
"KEY": "XX",
"SECRET": "XX",
"bucketName": "bucketName",
"domainUrl": "http://xxx.xxx.com" //访问资源域名
},
//企业微信通知配置
"WxCorp": {
"AgentID": "",
"CorpID": "",
"CorpSecret": "",
"SendUser": "@all"
},
//微信公众号设置
"WxOpen": {
"AppID": "",
"AppSecret": ""
},
//邮箱配置信息
"MailOptions": [
{
//发件人名称
"FromName": "system",
//发送人邮箱
"FromEmail": "", //eg:xxxx@qq.com
//发送人邮箱密码
"Password": "123456",
//协议
"Smtp": "smtp.qq.com",
"Port": 587,
"Signature": "系统邮件,请勿回复!",
"UseSsl": true
}
],
//redis服务配置
"RedisServer": {
"open": 0, //是否启用redis
"dbCache": false, //数据库是否使用Redis缓存,如果启用open要为1
"Cache": "127.0.0.1:6379,defaultDatabase=0,poolsize=50,ssl=false,writeBuffer=10240,prefix=cache:",
"Session": "127.0.0.1:6379,defaultDatabase=0,poolsize=50,ssl=false,writeBuffer=10240,prefix=session:"
},
//代码生成配置
"CodeGen": {
//是否显示移动端代码生成
"showApp": false,
//自动去除表前缀
"autoPre": true,
//默认生成业务模块名
"moduleName": "business",
"author": "admin",
"tablePrefix": "sys_", //"表前缀(生成类名不会包含表前缀,多个用逗号分隔)",
"vuePath": "" //前端代码存储路径eg:D:\Work\ZRAdmin-Vue3
}
}
codeGen.json
代码生成
{
"CodeGen": {
"csharpTypeArr": {
"string": ["varchar", "nvarchar", "text", "longtext"],
"int": ["int", "integer", "smallint", "int4", "int8", "int2"],
"long": ["bigint", "number"],
"float": ["numeric", "real", "float"],
"decimal": ["money", "decimal", "smallmoney"],
"dateTime": [
"date",
"datetime",
"datetime2",
"smalldatetime",
"timestamp"
],
"byte": ["tinyint"],
"bool": ["bit"]
}
}
}
iprate.json
IP 限流
{
//接口请求限制
"IpRateLimiting": {
"EnableEndpointRateLimiting": true,
"StackBlockedRequests": false,
"RealIpHeader": "X-Real-IP",
"ClientIdHeader": "X-ClientId",
"HttpStatusCode": 429,
"EndpointWhitelist": [
"post:/system/dict/data/types",
"*:/msghub/negotiate",
"*:/LogOut",
"*:/common/uploadfile"
],
"QuotaExceededResponse": {
"Content": "{{\"code\":429,\"msg\":\"访问过于频繁,请稍后重试\"}}",
"ContentType": "application/json",
"StatusCode": 429
},
//通用规则,api规则,结尾一定要带*
"GeneralRules": [
{
"Endpoint": "*:/captchaImage",
//时间段,格式:{数字}{单位};可使用单位:s, m, h, d
"Period": "3s",
"Limit": 5
},
{
"Endpoint": "((post)|(put)):*",
"Period": "3s",
"Limit": 1
}
],
"IpRateLimitPolicies": {}
}
}
upload
文件上传
//本地环境配置
"Upload": {
"UploadUrl": "http://xxx.xx.com/uploads", //默认存储访问域名
"localSavePath": "", //如果为空将默认保存到项目根目录wwwroot里面,本地上传文件存储目录
},
//线上环境配置
"Upload": {
"UploadUrl": "http://xxx.xx.com/prod-api/uploads",
"localSavePath": "uploads",
},
提示
建议自己项目新建 如
- 生产环境文件
appsettings.Production.json
- 开发环境文件
appsettings.Development.json
有关跨域配置
使用情景:前后端单独部署
//跨域地址,配置前端启动地址多个用","隔开。注意:http://localhost:8887 和 http://localhost:8887/是不同的
"corsUrls": ["http://localhost:8887"]
获取用户信息
在 Controller
或 Service
层中获取
//Controller获取id
var id = HttpContext.GetUId()
//Controller获取用户名
var userName = HttpContext.GetName()
//Service获取用户名,命名空间Infrastructure.Extensions
var userName = HttpContextExtension.GetName()
//获取登录信息
LoginUser info = Framework.JwtUtil.GetLoginUser(context.HttpContext);
分页实现
- 前端基于 element 封装的分页组件 pagination
- 后端基于 sqlSugar
前端调用实现
- 前端定义分页流程
// 一般在查询参数中定义分页变量
queryParams: {
pageNum: 1,
pageSize: 10
}
// 页面添加分页组件,传入分页变量
<pagination :total="total" :page.sync="queryParams.pageNum" :limit.sync="queryParams.pageSize" @pagination="getList"/>
// 调用后台方法,传入参数 获取结果
listUser(this.queryParams).then(response => {
this.userList = response.data.result;
this.total = response.data.totalNum;
}
)
vue3 需要注意:
<pagination :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList"/>
后台逻辑实现
- 扩展实现
// 查询方法
public List<SysLogininfor> GetLoginLog(PagerInfo pager)
{
int totalCount = 0;
var list = Context.Queryable<SysLogininfor>()
.ToPageList(pager.PageNum, pager.PageSize, ref totalCount);
pager.TotalNum = totalCount;
return list;
}
//前端返回
public IActionResult LoignLogList([FromQuery] PagerInfo pagerInfo)
{
var list = sysLoginService.GetLoginLog(pagerInfo);
return SUCCESS(list.ToPage(pagerInfo));
}
- 直接返回
public IActionResult List([FromQuery] SysPost post, [FromQuery] PagerInfo pagerInfo)
{
//开始拼装查询条件
var predicate = Expressionable.Create<SysPost>();
var list = PostService.GetPages(predicate.ToExpression(), pagerInfo, s => new { s.PostSort });
return SUCCESS(list);
}
异常处理
数据校验
导出 Excel
发送邮件
多数据库源设置
添加数据库配置
修改 appsettings.json
项目已经支持了多库配置,只需要在配置文件中添加对应的数据库既可既可。
"dbConfigs": [
{
"Conn": "Data Source=LAPTOP-STKF2M8H\\SQLEXPRESS;User ID=admin;Password=admin123;Initial Catalog=ZrAdmin;",
"DbType": 1, //数据库类型 MySql = 0, SqlServer = 1, Oracle = 3,PgSql = 4
"ConfigId": "0", //多租户唯一标识
"IsAutoCloseConnection": true
},
{
"Conn": "Data Source=LAPTOP-STKF2M8H\\SQLEXPRESS;User ID=admin;Password=admin123;Initial Catalog=myAdmin;",
"DbType": 1, //数据库类型 MySql = 0, SqlServer = 1, Oracle = 3,PgSql = 4
"ConfigId": "1", //多租户唯一标识
"IsAutoCloseConnection": true
}
//...下面添加更多的数据库源
],
});
实体类配置
[Tenant(1)]
public class GenDemo
{
//...属性
}
Tenant(1) 表示连接上面的 ConfigId = "1" 的数据库,配置后会自动连接到该数据库
如何使用
使用请前往 Sqlsugar 官网查看 点击查看
雪花 id
使用雪花 id 作为 long 类型后前端输出异常
[JsonConverter(typeof(ValueToStringConverter))]
[SugarColumn(IsPrimaryKey = true)]
public long Id { get; set; }
更多使用,请参考sqlsugar 语法
- 雪花 ID 重复 问题 使用雪花 id 需要配置 workid 避免 id 重复(program.cs 已配置),配置请参考文档sqlsugar 雪花 id 配置
JnTemplate 模板引擎使用
我们可以使用模板设置一些邮件模板、来轻松读取绑定数据
首先引用命名空间 using JinianNet.JNTemplate;
读取模板
var tpl = JnHelper.ReadTemplate("wwwroot 下面的文件夹", "文件名");
比如读取项目启动 logo 图标
var contentTpl = JnHelper.ReadTemplate("", "logo.txt");
var content = contentTpl?.Render();
//打印内容
console.log(content)
设置变量
tpl.Set("变量名 1", "值") tpl.Set("user", new { Name = 'Lisa', id: 1, sex: 0})
输出结果
var result = tpl.Render();
Console.WriteLine(result);
调用接口
在特殊方法里面不使用注入形式调用接口方法
public void Test(){
ITaskSchedulerServer _schedulerServer = App.GetRequiredService<ITaskSchedulerServer>();
}
网络请求
系统内置了网络请求模块 ,位置:Infrastructure.Helper.HttpHelper.cs
根据 IP 获取地理位置
使用 var ip_info = IpTool.Search(ip);
提示
注意:ip2region.db 是他的数据库文件,开源库传送门
缓存监控
加密解密工具使用
本项目内置了常用的加密工具类,可以满足你基本的开发需求
- md5
NETCore.Encrypt.EncryptProvider.Md5('123456');
- Base64
NETCore.Encrypt.EncryptProvider.Base64Encrypt('123456');
其他加密方式自己可通过EncryptProvider
类库查看
接口限流
系统内置IpRateLimiting
组件对接口进行限流处理,默认对(post)|(put)
请求方法进行了限流操作,即 3 秒内只能访问一次,超过的请求将会提示访问过于频繁,请稍后重试
看上面 👆配置文件部分