ZR.Admin小改和VUE3版本体验
前言
孔乙己显出极高兴的样子,将两个指头的长指甲敲着柜台,点头说:“对呀,对呀!......回字有四样写法,你知道么?”
大家好,我是44岁的大龄程序员码农阿峰。阿峰从事编程二十年了,虽然没有成为架构师,却也用过很多种架构。几年前开始研究JAVA企业级快速开发框架若依,后来发现了它的.net 版本实现-ZR.Admin。从此一发不可收拾,崇拜的五体投地。对它作了些改动,记录下来。
以下是我自愿加的广告:
## 🍿 在线体验
- 官方文档:http://www.izhaorui.cn/doc
- vue3.x 版本体验:http://www.izhaorui.cn/vue3
- vue2.x 版本体验:http://www.izhaorui.cn/admin
- 账号密码:admin/123456
## 💒 代码仓库
| 仓库 | Github | Gitee |
| ----------- | ------ | ---------------------------------------------------------------- |
| Vue2 + Net5 | | [克隆/下载](https://gitee.com/izory/ZrAdminNetCore/) |
| Vue3 | | [克隆/下载](https://gitee.com/izory/ZRAdmin-vue) |
| Vue2 + Net7 | | [克隆/下载](https://gitee.com/izory/ZrAdminNetCore/tree/net7.0/) |
## 🍁 前端技术
Vue 版前端技术栈 :基于 vue2.x/vue3.x、vuex、vue-router 、vue-cli 、axios、 element-ui、echats、i18n 国际化等,前端采用 vscode 工具开发
## 🍀 后端技术
- 核心框架:.Net5.0/.Net7.0 + Web API + sqlsugar + swagger + signalR + IpRateLimit + Quartz.net + Redis
- 定时计划任务:Quartz.Net 组件,支持执行程序集或者 http 网络请求
- 安全支持:过滤器(数据权限过滤)、Sql 注入、请求伪造
- 日志管理:NLog、登录日志、操作日志、定时任务日志
- 工具类:验证码、丰富公共功能
- 接口限流:支持接口限流,避免恶意请求导致服务层压力过大
- 代码生成:高效率开发,代码生成器可以一键生成所有前后端代码
- 数据字典:支持数据字典,可以方便对一些状态进行管理
- 分库分表:使用 orm sqlsugar 可以很轻松的实现分库分库性能优越
- 多 租 户:支持多租户功能
- 缓存数据:内置内存缓存和 Redis
本文主要内容:
- WEBAPI的默认路由改回swagger的接口列表
- 支持实体类主键是GUID
- Swagger 路径支持Linux
1).WEBAPI的默认路由改回swagger的接口列表
/// <summary> /// hello /// </summary> /// <returns></returns> [Route("/")] [HttpGet] public IActionResult Index() { return Ok("看到这里页面说明你已经成功启动了本项目:)\n\n" + "如果觉得项目有用,打赏作者喝杯咖啡作为奖励\n☛☛http://www.izhaorui.cn/doc/support.html\n"); }
我觉得自己很不厚道。原作者只是提醒一下用他代码的人 “如果觉得项目有用,打赏作者喝杯咖啡作为奖励”。这是应该的,但是我目前失业中,等我接大学生毕业设计赚了钱我会补上的!对作者的辛勤付出表示衷心的感谢!
因为作者把默认路由搞成了这个,那程序集发布和部署完就会被路由到这里,打开一个网页就是这句话。所以对不住了直接移除即可。
2).实体类或数据库表主键支持GUID
这个更简单,ZR.ADMIN是使用SqlSugar来做ORM组件的
[SugarColumn(IsIdentity = true, IsPrimaryKey = true)] public int Cid { get; set; }
一般是使用的自增类型的整数类型来作主键的,而我自己经常是用GUID的,类似这样:
/// <summary> /// 描述 :主键 (产品ID) /// </summary> [EpplusTableColumn(Header = "主键")] [SugarColumn(IsPrimaryKey = true, IsIdentity = false, ColumnName = "product_ID")] public string ProductId { get; set; }
/// <summary> /// 删除产品信息 /// </summary> /// <returns></returns> [HttpDelete("{ids}")] [ActionPermissionFilter(Permission = "trackingdict:mtsproduct:delete")] [Log(Title = "产品信息", BusinessType = BusinessType.DELETE)] public IActionResult DeleteMtsProduct(string ids) { string[] idsArr = Tools.SpitGuidArrary(ids); if (idsArr.Length <= 0) { return ToResponse(ApiResult.Error($"删除失败Id 不能为空")); } var response = _MtsProductService.Delete(idsArr); return ToResponse(response); } public static int[] SpitIntArrary(string str, char split = ',') { if (string.IsNullOrEmpty(str)) { return Array.Empty<int>(); } string[] strIds = str.Split(split, (char)StringSplitOptions.RemoveEmptyEntries); int[] infoIdss = Array.ConvertAll(strIds, s => int.Parse(s)); return infoIdss; } /// <summary> /// 拆分多个GUID /// </summary> /// <param name="str"></param> /// <param name="split"></param> /// <returns></returns> public static string[] SpitGuidArrary(string str, char split = ',') { if (string.IsNullOrEmpty(str)) { return Array.Empty<string>(); } string[] strIds = str.Split(split, (char)StringSplitOptions.RemoveEmptyEntries); string[] infoIdss = Array.ConvertAll(strIds, s => s.ToUpper()); return infoIdss; }
直接看上面的代码吧,把代码生成器生成的"SpitIntArrary"改成“SpitGuidArrary”即可。
3)Swagger XML文件支持Linux
using Infrastructure; using Microsoft.AspNetCore.Authentication.JwtBearer; using Microsoft.OpenApi.Models; using Swashbuckle.AspNetCore.Filters; namespace DataCool.Admin.WebApi.Extensions { /// <summary> /// SwaggerExtension XML路径兼容LINUX /// </summary> public static class SwaggerExtension { /// <summary> /// UseSwagger /// </summary> /// <param name="app"></param> public static void UseSwagger(this IApplicationBuilder app) { app.UseSwagger(c => { c.RouteTemplate = "swagger/{documentName}/swagger.json"; c.PreSerializeFilters.Add((swaggerDoc, httpReq) => { var url = $"{httpReq.Scheme}://{httpReq.Host.Value}"; var referer = httpReq.Headers["Referer"].ToString(); if (referer.Contains(GlobalConstant.DevApiProxy)) url = referer[..(referer.IndexOf(GlobalConstant.DevApiProxy, StringComparison.InvariantCulture) + GlobalConstant.DevApiProxy.Length - 1)]; swaggerDoc.Servers = new List<OpenApiServer> { new OpenApiServer { Url = url } }; }); }); app.UseSwaggerUI(c => c.SwaggerEndpoint("v1/swagger.json", "DataCool_Admin v1")); } /// <summary> /// 添加Swagger配置项 /// </summary> /// <param name="services"></param> /// <exception cref="ArgumentNullException"></exception> public static void AddSwaggerConfig(this IServiceCollection services) { if (services == null) throw new ArgumentNullException(nameof(services)); //IWebHostEnvironment hostEnvironment = App.GetRequiredService<IWebHostEnvironment>(); services.AddSwaggerGen(c => { c.SwaggerDoc("v1", new OpenApiInfo { Title = "产品追溯接口平台", Version = "v1", Description = "", }); try { //添加文档注释 c.IncludeXmlComments($"{AppDomain.CurrentDomain.BaseDirectory}/DataCool.Admin.WebApi.xml", true); } catch (Exception ex) { Console.WriteLine("swagger 文档加载失败" + ex.Message); } //参考文章:http://www.zyiz.net/tech/detail-134965.html //需要安装包Swashbuckle.AspNetCore.Filters // 开启权限小锁 需要在对应的Action上添加[Authorize]才能看到 c.OperationFilter<AddResponseHeadersFilter>(); c.OperationFilter<AppendAuthorizeToSummaryOperationFilter>(); //在header 中添加token,传递到后台 c.OperationFilter<SecurityRequirementsOperationFilter>(); c.AddSecurityDefinition(JwtBearerDefaults.AuthenticationScheme, new OpenApiSecurityScheme { In = ParameterLocation.Header, Description = "请输入Login接口返回的Token,前置Bearer。示例:Bearer {Token}", Name = "Authorization",//jwt默认的参数名称, Type = SecuritySchemeType.ApiKey, //指定ApiKey BearerFormat = "JWT",//标识承载令牌的格式 该信息主要是出于文档目的 Scheme = JwtBearerDefaults.AuthenticationScheme//授权中要使用的HTTP授权方案的名称 }); c.AddSecurityRequirement(new OpenApiSecurityRequirement { { new OpenApiSecurityScheme { Reference = new OpenApiReference { Type = ReferenceType.SecurityScheme, Id = "Bearer" } }, new List<string>() } }); }); } } }
//添加文档注释
c.IncludeXmlComments($"{AppDomain.CurrentDomain.BaseDirectory}/DataCool.Admin.WebApi.xml", true);
LINUX部署后遇到Swagger接口列表打开失败,发现是XML文件的路径错了。
4)VUE3版本前端的体验
速度挺快的,体验也还行,就是有些不习惯,觉得不够成熟,另外不想花太多的学习成本去学习,VUE2还不熟练呢。
文章就此结束,其实单纯想帮ZR.ADMIN做个广告。聊表心意!
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
"作者:" 数据酷软件工作室
"出处:" http://datacool.cnblogs.com
"专注于CMS(综合赋码系统),MES,WCS(智能仓储设备控制系统),WMS,商超,桑拿、餐饮、客房、足浴等行业收银系统的开发,15年+从业经验。因为专业,所以出色。"
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
"作者:" 数据酷软件工作室
"出处:" http://datacool.cnblogs.com
"专注于CMS(综合赋码系统),MES,WCS(智能仓储设备控制系统),WMS,商超,桑拿、餐饮、客房、足浴等行业收银系统的开发,15年+从业经验。因为专业,所以出色。"
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++