diff --git a/ZR.Admin.WebApi/Controllers/CommonController.cs b/ZR.Admin.WebApi/Controllers/CommonController.cs index d331494..7e3424c 100644 --- a/ZR.Admin.WebApi/Controllers/CommonController.cs +++ b/ZR.Admin.WebApi/Controllers/CommonController.cs @@ -82,7 +82,7 @@ namespace ZR.Admin.WebApi.Controllers [ActionPermissionFilter(Permission = "system")] public IActionResult UploadFile([FromForm(Name = "file")] IFormFile formFile) { - if (formFile == null) throw new CustomException(ResultCode.PARAM_ERROR, "上传图片不能为空"); + if (formFile == null) throw new CustomException(ResultCode.PARAM_ERROR, "上传文件不能为空"); string fileExt = Path.GetExtension(formFile.FileName); string fileName = FileUtil.HashFileName(Guid.NewGuid().ToString()).ToLower() + fileExt; string finalFilePath = Path.Combine(WebHostEnvironment.WebRootPath, FileUtil.GetdirPath("uploads"), fileName); @@ -99,23 +99,28 @@ namespace ZR.Admin.WebApi.Controllers } string accessPath = $"{OptionsSetting.Upload.UploadUrl}/{FileUtil.GetdirPath("uploads").Replace("\\", " /")}{fileName}"; - return ToResponse(ResultCode.SUCCESS, accessPath); + return ToResponse(ResultCode.SUCCESS, new + { + url = accessPath, + fileName + }); } /// /// 存储文件到阿里云 /// /// + /// 上传文件夹路径 /// [HttpPost] [Verify] [ActionPermissionFilter(Permission = "system")] - public IActionResult UploadFileAliyun([FromForm(Name = "file")] IFormFile formFile) + public IActionResult UploadFileAliyun([FromForm(Name = "file")] IFormFile formFile, string fileDir = "") { if (formFile == null) throw new CustomException(ResultCode.PARAM_ERROR, "上传文件不能为空"); string fileExt = Path.GetExtension(formFile.FileName); string[] AllowedFileExtensions = new string[] { ".jpg", ".gif", ".png", ".jpeg", ".webp", ".svga", ".xls" }; - int MaxContentLength = 1024 * 1024 * 4; + int MaxContentLength = 1024 * 1024 * 5; if (!AllowedFileExtensions.Contains(fileExt)) { @@ -126,9 +131,13 @@ namespace ZR.Admin.WebApi.Controllers { return ToResponse(ResultCode.CUSTOM_ERROR, "上传文件过大,不能超过 " + (MaxContentLength / 1024).ToString() + " MB"); } - (bool, string) result = SysFileService.SaveFile("", formFile); + (bool, string, string) result = SysFileService.SaveFile(fileDir, formFile); - return ToResponse(ResultCode.SUCCESS, result.Item2); + return ToResponse(ResultCode.SUCCESS, new + { + url = result.Item2, + fileName = result.Item3 + }); } #endregion } diff --git a/ZR.Admin.WebApi/Controllers/System/CodeGeneratorController.cs b/ZR.Admin.WebApi/Controllers/System/CodeGeneratorController.cs index 61fc996..f554632 100644 --- a/ZR.Admin.WebApi/Controllers/System/CodeGeneratorController.cs +++ b/ZR.Admin.WebApi/Controllers/System/CodeGeneratorController.cs @@ -195,36 +195,35 @@ namespace ZR.Admin.WebApi.Controllers sortField = genTableDto.SortField, sortType = genTable.SortType }); - int rows = GenTableService.UpdateGenTable(genTable); - if (rows > 0) + int updateCount = 0; + bool result = GenTableService.UseTran2(() => { - GenTableColumnService.UpdateGenTableColumn(genTable.Columns); - } - return SUCCESS(rows); + int rows = GenTableService.UpdateGenTable(genTable); + if (rows > 0) + { + updateCount = GenTableColumnService.UpdateGenTableColumn(genTable.Columns); + } + }); + + return SUCCESS(updateCount); } /// /// 预览代码 /// - /// + /// /// - [HttpGet("preview/{tableId}")] + [HttpPost("preview/{tableId}")] [ActionPermissionFilter(Permission = "tool:gen:preview")] - public IActionResult Preview(long tableId) + public IActionResult Preview([FromBody] GenerateDto dto) { - if (tableId <= 0) + if (dto == null || dto.TableId <= 0) { throw new CustomException(ResultCode.CUSTOM_ERROR, "请求参数为空"); } - var genTableInfo = GenTableService.GetGenTableInfo(tableId); - genTableInfo.Columns = GenTableColumnService.GenTableColumns(tableId); + var genTableInfo = GenTableService.GetGenTableInfo(dto.TableId); + genTableInfo.Columns = GenTableColumnService.GenTableColumns(dto.TableId); - //var dictList = genTableInfo.Columns.FindAll(x => !string.IsNullOrEmpty(x.DictType)); - //foreach (var item in dictList) - //{ - // item.DictDatas = SysDictDataService.SelectDictDataByType(item.DictType); - //} - GenerateDto dto = new(); dto.GenTable = genTableInfo; dto.ZipPath = Path.Combine(WebHostEnvironment.WebRootPath, "Generatecode"); dto.GenCodePath = Path.Combine(dto.ZipPath, DateTime.Now.ToString("yyyyMMdd")); diff --git a/ZR.Admin.WebApi/Controllers/System/SysRoleController.cs b/ZR.Admin.WebApi/Controllers/System/SysRoleController.cs index 5242149..5c1859a 100644 --- a/ZR.Admin.WebApi/Controllers/System/SysRoleController.cs +++ b/ZR.Admin.WebApi/Controllers/System/SysRoleController.cs @@ -128,7 +128,7 @@ namespace ZR.Admin.WebApi.Controllers.System { if (sysRoleDto == null || sysRoleDto.RoleId <= 0) return ToResponse(ApiResult.Error(101, "请求参数错误")); - sysRoleDto.Create_by = HttpContextExtension.GetName(HttpContext); + sysRoleDto.Create_by = HttpContext.GetName(); //删除角色菜单 sysRoleService.DeleteRoleMenuByRoleId(sysRoleDto.RoleId); sysRoleService.InsertRoleMenu(sysRoleDto); diff --git a/ZR.Admin.WebApi/Framework/JwtUtil.cs b/ZR.Admin.WebApi/Framework/JwtUtil.cs index 75f237a..83c8e46 100644 --- a/ZR.Admin.WebApi/Framework/JwtUtil.cs +++ b/ZR.Admin.WebApi/Framework/JwtUtil.cs @@ -25,7 +25,7 @@ namespace ZR.Admin.WebApi.Framework /// public static LoginUser GetLoginUser(HttpContext httpContext) { - string token = HttpContextExtension.GetToken(httpContext); + string token = httpContext.GetToken(); if (!string.IsNullOrEmpty(token)) { @@ -44,6 +44,8 @@ namespace ZR.Admin.WebApi.Framework JwtSettings jwtSettings = new(); ConfigUtils.Instance.Bind("JwtSettings", jwtSettings); + var authTime = DateTime.Now; + var expiresAt = authTime.AddMinutes(jwtSettings.Expire); var tokenHandler = new JwtSecurityTokenHandler(); var key = Encoding.ASCII.GetBytes(jwtSettings.SecretKey); claims.Add(new Claim("Audience", jwtSettings.Audience)); @@ -54,8 +56,9 @@ namespace ZR.Admin.WebApi.Framework Subject = new ClaimsIdentity(claims), Issuer = jwtSettings.Issuer, Audience = jwtSettings.Audience, - IssuedAt = DateTime.Now,//token生成时间 - Expires = DateTime.Now.AddMinutes(jwtSettings.Expire), + IssuedAt = authTime,//token生成时间 + Expires = expiresAt, + //NotBefore = authTime, TokenType = "Bearer", //对称秘钥,签名证书 SigningCredentials = new SigningCredentials(new SymmetricSecurityKey(key), SecurityAlgorithms.HmacSha256Signature) @@ -83,7 +86,8 @@ namespace ZR.Admin.WebApi.Framework ValidAudience = jwtSettings.Audience, IssuerSigningKey = new SymmetricSecurityKey(key), ValidateLifetime = true,//是否验证Token有效期,使用当前时间与Token的Claims中的NotBefore和Expires对比 - RequireExpirationTime = true,//过期时间 + ClockSkew = TimeSpan.FromSeconds(30) + //RequireExpirationTime = true,//过期时间 }; return tokenDescriptor; } diff --git a/ZR.Admin.WebApi/NLog.config b/ZR.Admin.WebApi/NLog.config index a6d075c..4982ce8 100644 --- a/ZR.Admin.WebApi/NLog.config +++ b/ZR.Admin.WebApi/NLog.config @@ -30,6 +30,15 @@ keepFileOpen="false" layout="${longdate} | ${event-properties:item=EventId_Id} | ${uppercase:${level}} | ${logger} | ${aspnet-request-iP} | ${event-properties:item=user} | ${aspnet-request-url} | ${message} | ${event-properties:item=requestParam} | ${event-properties:item=jsonResult} | ${onexception:${exception:format=tostring}"/> + + + @@ -46,6 +55,7 @@ + diff --git a/ZR.Admin.WebApi/ZR.Admin.WebApi.csproj b/ZR.Admin.WebApi/ZR.Admin.WebApi.csproj index 0b71c00..8339601 100644 --- a/ZR.Admin.WebApi/ZR.Admin.WebApi.csproj +++ b/ZR.Admin.WebApi/ZR.Admin.WebApi.csproj @@ -67,7 +67,7 @@ - + diff --git a/ZR.Admin.WebApi/appsettings.json b/ZR.Admin.WebApi/appsettings.json index bd00d8f..e062474 100644 --- a/ZR.Admin.WebApi/appsettings.json +++ b/ZR.Admin.WebApi/appsettings.json @@ -15,13 +15,13 @@ "urls": "http://localhost:8888", //Ŀurl "sysConfig": { "DBCommandTimeout": 10, - "cors": "http://localhost:8887" //ַǰĿ"," + "cors": "http://localhost:8887" //ַǰĿǰ˷뵥Ҫã"," }, "JwtSettings": { - "Issuer": "https://localhost:8888", - "Audience": "https://localhost:8888", - "SecretKey": "Hello-key-ZRADMIN.NET-20210101", - "Expire": 5 + "Issuer": "ZRAdmin.NET", + "Audience": "ZRAdmin.NET", + "SecretKey": "SecretKey-ZRADMIN.NET-20210101", + "Expire": 30 }, "DemoMode": false, //Ƿʾģʽ "DbKey": "", //ݿkey diff --git a/ZR.Admin.WebApi/wwwroot/CodeGenTemplate/TplControllers.txt b/ZR.Admin.WebApi/wwwroot/CodeGenTemplate/TplControllers.txt index 91f9590..c3dd147 100644 --- a/ZR.Admin.WebApi/wwwroot/CodeGenTemplate/TplControllers.txt +++ b/ZR.Admin.WebApi/wwwroot/CodeGenTemplate/TplControllers.txt @@ -26,7 +26,7 @@ namespace ${options.ApiControllerNamespace}.Controllers /// @date ${replaceDto.AddTime} /// [Verify] - [Route("${genTable.ModuleName}/${replaceDto.ModelTypeName}")] + [Route("${genTable.ModuleName}/${genTable.BusinessName}")] public class ${replaceDto.ModelTypeName}Controller : BaseController { /// @@ -51,7 +51,18 @@ namespace ${options.ApiControllerNamespace}.Controllers var predicate = Expressionable.Create<${replaceDto.ModelTypeName}>(); //搜索条件查询语法参考Sqlsugar -${QueryCondition} +$foreach(column in genTable.Columns) +$if(column.IsQuery) +$if(column.CsharpType == "string") + predicate = predicate.AndIF(!string.IsNullOrEmpty(parm.${column.CsharpField}), ${codeTool.QueryExp(column.CsharpField, column.QueryType)}; +$elseif(column.CsharpType == "DateTime") + predicate = predicate.AndIF(parm.Begin${column.CsharpField} != null, it => it.${column.CsharpField} >= parm.Begin${column.CsharpField}); + predicate = predicate.AndIF(parm.End${column.CsharpField} != null, it => it.${column.CsharpField} <= parm.End${column.CsharpField}); +$elseif(column.CsharpType == "int" || column.CsharpType == "long") + predicate = predicate.AndIF(parm.${column.CsharpField} != null, ${codeTool.QueryExp(column.CsharpField, column.QueryType)}; +$end +$end +$end $if(genTable.SortField != "" && genTable.SortField != null) var response = _${replaceDto.ModelTypeName}Service.GetPages(predicate.ToExpression(), parm, x => x.${genTable.SortField}, "${genTable.SortType}"); $else diff --git a/ZR.Admin.WebApi/wwwroot/CodeGenTemplate/TplDto.txt b/ZR.Admin.WebApi/wwwroot/CodeGenTemplate/TplDto.txt index 68c509a..a424ac5 100644 --- a/ZR.Admin.WebApi/wwwroot/CodeGenTemplate/TplDto.txt +++ b/ZR.Admin.WebApi/wwwroot/CodeGenTemplate/TplDto.txt @@ -14,7 +14,7 @@ $foreach(item in genTable.Columns) $if((item.IsInsert || item.IsEdit || item.IsPk || item.IsIncrement)) public $item.CsharpType$item.RequiredStr $item.CsharpField { get; set; } $end -${end} +$end } /// @@ -27,8 +27,8 @@ $if(item.IsQuery && item.htmlType == "datetime") public DateTime? Begin$item.CsharpField { get; set; } public DateTime? End$item.CsharpField { get; set; } $elseif(item.IsQuery) - public $item.CsharpType $item.CsharpField { get; set; } + public $item.CsharpType$if(item.CsharpType != "string")?$end $item.CsharpField { get; set; } +$end $end -${end} } } diff --git a/ZR.Admin.WebApi/wwwroot/CodeGenTemplate/TplVue.txt b/ZR.Admin.WebApi/wwwroot/CodeGenTemplate/TplVue.txt index 8f42fec..76d6a07 100644 --- a/ZR.Admin.WebApi/wwwroot/CodeGenTemplate/TplVue.txt +++ b/ZR.Admin.WebApi/wwwroot/CodeGenTemplate/TplVue.txt @@ -8,7 +8,6 @@ ${vueQueryFormHtml} 重置 - @@ -20,9 +19,11 @@ ${vueQueryFormHtml} 删除 +$if(replaceDto.ShowBtnExport) 导出 +$end $if(genTable.SortField != "" && 1 == 2) 修改排序 @@ -32,15 +33,13 @@ $end - + ${VueViewListContent} @@ -50,7 +49,7 @@ ${VueViewListContent} - ${VueViewFormContent} +${VueViewFormContent} public class CodeGenerateTemplate { - /// - /// 查询Dto属性 - /// - /// - /// 替换字符对象 - /// - public static void GetQueryDtoProperty(GenTableColumn tbColumn, ReplaceDto replaceDto) - { - if (tbColumn.IsQuery) - { - //字符串类型表达式 - if (tbColumn.CsharpType == GenConstants.TYPE_STRING) - { - replaceDto.QueryCondition += $" predicate = predicate.AndIF(!string.IsNullOrEmpty(parm.{tbColumn.CsharpField}), {QueryExp(tbColumn.CsharpField, tbColumn.QueryType)};\n"; - } - //int类型表达式 - if (CodeGeneratorTool.IsNumber(tbColumn.CsharpType)) - { - replaceDto.QueryCondition += $" predicate = predicate.AndIF(parm.{tbColumn.CsharpField} > 0, {QueryExp(tbColumn.CsharpField, tbColumn.QueryType)};\n"; - } - //时间类型 - if (tbColumn.CsharpType == GenConstants.TYPE_DATE) - { - replaceDto.QueryCondition += $" predicate = predicate.AndIF(parm.Begin{tbColumn.CsharpField} != null, it => it.{tbColumn.CsharpField} >= parm.Begin{tbColumn.CsharpField});\n"; - replaceDto.QueryCondition += $" predicate = predicate.AndIF(parm.End{tbColumn.CsharpField} != null, it => it.{tbColumn.CsharpField} <= parm.End{tbColumn.CsharpField});\n"; - } - } - } - #region vue 模板 - /// - /// Vue rules - /// - /// - /// - public static string TplFormRules(GenTableColumn dbFieldInfo) - { - StringBuilder sbRule = new StringBuilder(); - //Rule 规则验证 - if (!dbFieldInfo.IsPk && !dbFieldInfo.IsIncrement && dbFieldInfo.IsRequired) - { - sbRule.AppendLine($" {dbFieldInfo.ColumnName}: [{{ required: true, message: '请输入{dbFieldInfo.ColumnComment}', trigger: \"blur\"}}],"); - } - else if (CodeGeneratorTool.IsNumber(dbFieldInfo.ColumnType) && dbFieldInfo.IsRequired) - { - sbRule.AppendLine($" {dbFieldInfo.ColumnName}: [{{ type: 'number', message: '{dbFieldInfo.ColumnName}必须为数字值', trigger: \"blur\"}}],"); - } - return sbRule.ToString(); - } - /// /// Vue 添加修改表单 /// @@ -85,8 +36,9 @@ namespace ZR.CodeGenerator } if (dbFieldInfo.HtmlType == GenConstants.HTML_INPUT_NUMBER) { + //数字框 sb.AppendLine(" "); - sb.AppendLine($" "); + sb.AppendLine($" "); sb.AppendLine($" "); sb.AppendLine(" "); sb.AppendLine(" "); @@ -95,7 +47,7 @@ namespace ZR.CodeGenerator { //时间 sb.AppendLine(" "); - sb.AppendLine($" "); + sb.AppendLine($" "); sb.AppendLine($" "); sb.AppendLine(" "); sb.AppendLine(" "); @@ -104,72 +56,73 @@ namespace ZR.CodeGenerator { //图片 sb.AppendLine(" "); - sb.AppendLine($" "); - sb.AppendLine($@" "); + sb.AppendLine($" "); + sb.AppendLine($@" "); sb.AppendLine(" "); sb.AppendLine(" "); } - else if (dbFieldInfo.HtmlType == GenConstants.HTML_RADIO && !string.IsNullOrEmpty(dbFieldInfo.DictType)) + else if (dbFieldInfo.HtmlType == GenConstants.HTML_FILE_UPLOAD) { - sb.AppendLine(" "); - sb.AppendLine($" "); - sb.AppendLine($" "); - sb.AppendLine($" {{{{item.dictLabel}}}}"); - sb.AppendLine(" "); + //文件 + sb.AppendLine(" "); + sb.AppendLine($" "); + sb.AppendLine($@" "); sb.AppendLine(" "); sb.AppendLine(" "); } else if (dbFieldInfo.HtmlType == GenConstants.HTML_RADIO) { + //单选按钮 sb.AppendLine(" "); - sb.AppendLine($" "); + sb.AppendLine($" "); sb.AppendLine($" "); - sb.AppendLine(" 请选择字典生成"); + if (string.IsNullOrEmpty(dbFieldInfo.DictType)) + { + sb.AppendLine(" 请选择字典生成"); + } + sb.AppendLine($" {{{{item.dictLabel}}}}"); sb.AppendLine(" "); sb.AppendLine(" "); sb.AppendLine(" "); } else if (dbFieldInfo.HtmlType == GenConstants.HTML_TEXTAREA) { + //文本域 sb.AppendLine(" "); - sb.AppendLine($" "); - sb.AppendLine($" "); + sb.AppendLine($" "); + sb.AppendLine($" "); sb.AppendLine(" "); sb.AppendLine(" "); } else if (dbFieldInfo.HtmlType == GenConstants.HTML_EDITOR) { + //编辑器 sb.AppendLine(" "); - sb.AppendLine($" "); + sb.AppendLine($" "); sb.AppendLine($" "); sb.AppendLine(" "); sb.AppendLine(" "); } - else if (dbFieldInfo.HtmlType == GenConstants.HTML_SELECT && !string.IsNullOrEmpty(dbFieldInfo.DictType)) + else if (dbFieldInfo.HtmlType == GenConstants.HTML_SELECT) { + //下拉框 sb.AppendLine(" "); - sb.AppendLine($" "); + sb.AppendLine($" "); sb.AppendLine($" "); + if (string.IsNullOrEmpty(dbFieldInfo.DictType)) + { + sb.AppendLine($" "); + } sb.AppendLine($" "); sb.AppendLine(" "); sb.AppendLine(" "); sb.AppendLine(" "); } - else if (dbFieldInfo.HtmlType == GenConstants.HTML_SELECT && string.IsNullOrEmpty(dbFieldInfo.DictType)) - { - sb.AppendLine(" "); - sb.AppendLine($" "); - sb.AppendLine($" "); - sb.AppendLine($" "); - sb.AppendLine(" "); - sb.AppendLine(" "); - sb.AppendLine(" "); - } else { string inputNumTxt = CodeGeneratorTool.IsNumber(dbFieldInfo.CsharpType) ? ".number" : ""; sb.AppendLine(" "); - sb.AppendLine($" "); + sb.AppendLine($" "); sb.AppendLine($" "); sb.AppendLine(" "); sb.AppendLine(" "); @@ -187,7 +140,7 @@ namespace ZR.CodeGenerator { StringBuilder sb = new(); string labelName = CodeGeneratorTool.GetLabelName(dbFieldInfo.ColumnComment, dbFieldInfo.ColumnName); - if (!dbFieldInfo.IsQuery || dbFieldInfo.HtmlType == GenConstants.HTML_FILE_UPLOAD) return sb.ToString(); + if (!dbFieldInfo.IsQuery) return sb.ToString(); if (dbFieldInfo.HtmlType == GenConstants.HTML_DATETIME) { sb.AppendLine($" "); @@ -195,28 +148,19 @@ namespace ZR.CodeGenerator sb.AppendLine($" end-placeholder=\"结束日期\" placeholder=\"请选择{dbFieldInfo.ColumnComment}\" >"); sb.AppendLine(" "); } - else if ((dbFieldInfo.HtmlType == GenConstants.HTML_SELECT || dbFieldInfo.HtmlType == GenConstants.HTML_RADIO) && !string.IsNullOrEmpty(dbFieldInfo.DictType)) + else if ((dbFieldInfo.HtmlType == GenConstants.HTML_SELECT || dbFieldInfo.HtmlType == GenConstants.HTML_RADIO)) { //string value = CodeGeneratorTool.IsNumber(dbFieldInfo.CsharpType) ? "parseInt(item.dictValue)" : "item.dictValue"; - sb.AppendLine($" "); - sb.AppendLine($" placeholder=\"请选择{dbFieldInfo.ColumnComment}\" size=\"small\""); + sb.AppendLine($" "); + sb.AppendLine($" "); sb.AppendLine($" "); sb.AppendLine(" "); sb.AppendLine(" "); } - else if (dbFieldInfo.HtmlType == GenConstants.HTML_SELECT) - { - //string value = CodeGeneratorTool.IsNumber(dbFieldInfo.CsharpType) ? "parseInt(item.dictValue)" : "item.dictValue"; - sb.AppendLine($" "); - sb.AppendLine($" "); - sb.AppendLine($" "); - sb.AppendLine(" "); - sb.AppendLine(" "); - } - else + else if(dbFieldInfo.IsQuery) { string inputNumTxt = CodeGeneratorTool.IsNumber(dbFieldInfo.CsharpType) ? ".number" : ""; - sb.AppendLine($" "); + sb.AppendLine($" "); sb.AppendLine($" "); sb.AppendLine(" "); } @@ -235,11 +179,10 @@ namespace ZR.CodeGenerator string columnName = dbFieldInfo.ColumnName; string label = CodeGeneratorTool.GetLabelName(dbFieldInfo.ColumnComment, columnName); string showToolTip = dbFieldInfo.CsharpType == "string" ? ":show-overflow-tooltip=\"true\"" : ""; - string formatter = !string.IsNullOrEmpty(dbFieldInfo.DictType) ? $" :formatter=\"{columnName}Format\"" : ""; + string formatter = GetFormatter(dbFieldInfo.HtmlType, columnName); StringBuilder sb = new StringBuilder(); - var sortField = genTable?.SortField ?? ""; - //有排序字段 - if (!string.IsNullOrEmpty(sortField.ToString()) && sortField.ToString() == dbFieldInfo.CsharpField && !dbFieldInfo.IsPk && CodeGeneratorTool.IsNumber(dbFieldInfo.CsharpType)) + //自定义排序字段 + if (GenConstants.HTML_SORT.Equals(dbFieldInfo.HtmlType) && !dbFieldInfo.IsPk && CodeGeneratorTool.IsNumber(dbFieldInfo.CsharpType)) { sb.AppendLine($@" "); sb.AppendLine(@" "); sb.AppendLine(" "); } + else if (dbFieldInfo.IsList && !string.IsNullOrEmpty(dbFieldInfo.DictType)) + { + sb.AppendLine($@" "); + sb.AppendLine(@" "); + sb.AppendLine(@" "); + } else if (dbFieldInfo.IsList) { sb.AppendLine($" "); @@ -264,7 +222,7 @@ namespace ZR.CodeGenerator } #endregion - + //模板调用 public static string QueryExp(string propertyName, string queryType) { if (queryType.Equals("EQ")) @@ -297,5 +255,21 @@ namespace ZR.CodeGenerator } return ""; } + /// + /// 格式化字典数据显示到table + /// + /// + /// + /// + public static string GetFormatter(string htmlType, string columnName) + { + if (htmlType.Equals(GenConstants.HTML_CHECKBOX) || + htmlType.Equals(GenConstants.HTML_SELECT) || + htmlType.Equals(GenConstants.HTML_RADIO)) + { + return $" :formatter=\"{columnName}Format\""; + } + return ""; + } } } diff --git a/ZR.CodeGenerator/CodeGeneratorTool.cs b/ZR.CodeGenerator/CodeGeneratorTool.cs index c863a5f..0a1b9e3 100644 --- a/ZR.CodeGenerator/CodeGeneratorTool.cs +++ b/ZR.CodeGenerator/CodeGeneratorTool.cs @@ -11,7 +11,7 @@ using ZR.Model.System.Generate; namespace ZR.CodeGenerator { /// - /// 代码生成器。 + /// 代码生成器 /// /// public class CodeGeneratorTool @@ -52,24 +52,27 @@ namespace ZR.CodeGenerator replaceDto.ModelTypeName = dto.GenTable.ClassName;//表名对应C# 实体类名 replaceDto.PermissionPrefix = $"{dto.GenTable.ModuleName}:{dto.GenTable.ClassName.ToLower()}";//权限 replaceDto.Author = dto.GenTable.FunctionAuthor; + replaceDto.ShowBtnAdd = dto.CheckedBtn.Any(f => f == 1); + replaceDto.ShowBtnEdit = dto.CheckedBtn.Any(f => f == 2); + replaceDto.ShowBtnDelete = dto.CheckedBtn.Any(f => f == 3); + replaceDto.ShowBtnExport = dto.CheckedBtn.Any(f => f == 4); //循环表字段信息 - foreach (GenTableColumn dbFieldInfo in dto.GenTable.Columns) + foreach (GenTableColumn dbFieldInfo in dto.GenTable.Columns.OrderBy(x => x.Sort)) { if (dbFieldInfo.IsPk || dbFieldInfo.IsIncrement) { PKName = dbFieldInfo.CsharpField; PKType = dbFieldInfo.CsharpType; } - if (dbFieldInfo.HtmlType.Equals(GenConstants.HTML_IMAGE_UPLOAD)) + if (dbFieldInfo.HtmlType.Equals(GenConstants.HTML_IMAGE_UPLOAD) || dbFieldInfo.HtmlType.Equals(GenConstants.HTML_FILE_UPLOAD)) { replaceDto.UploadFile = 1; } - CodeGenerateTemplate.GetQueryDtoProperty(dbFieldInfo, replaceDto); + //CodeGenerateTemplate.GetQueryDtoProperty(dbFieldInfo, replaceDto); replaceDto.VueViewFormHtml += CodeGenerateTemplate.TplVueFormContent(dbFieldInfo); replaceDto.VueViewListHtml += CodeGenerateTemplate.TplTableColumn(dbFieldInfo, dto.GenTable); - replaceDto.VueViewEditFormRuleContent += CodeGenerateTemplate.TplFormRules(dbFieldInfo); replaceDto.VueQueryFormHtml += CodeGenerateTemplate.TplQueryFormHtml(dbFieldInfo); } @@ -104,13 +107,12 @@ namespace ZR.CodeGenerator /// 替换实体 private static void GenerateModels(ReplaceDto replaceDto, GenerateDto generateDto) { - // ../ZR.Model/Models/User.cs - var fullPath = Path.Combine(generateDto.GenCodePath, _option.ModelsNamespace, "Models", replaceDto.ModelTypeName + ".cs"); + var fullPath = Path.Combine(generateDto.GenCodePath, _option.ModelsNamespace, "Models", generateDto.GenTable.ModuleName, replaceDto.ModelTypeName + ".cs"); var tpl = FileHelper.ReadJtTemplate("TplModel.txt"); var result = tpl.Render(); - generateDto.GenCodes.Add(new GenCode(1, "Model", fullPath, result)); + generateDto.GenCodes.Add(new GenCode(1, "Model.cs", fullPath, result)); } /// @@ -120,12 +122,11 @@ namespace ZR.CodeGenerator /// 替换实体 private static void GenerateInputDto(ReplaceDto replaceDto, GenerateDto generateDto) { - var fullPath = Path.Combine(generateDto.GenCodePath, _option.ModelsNamespace, "Dto", $"{replaceDto.ModelTypeName}Dto.cs"); - + var fullPath = Path.Combine(generateDto.GenCodePath, _option.ModelsNamespace, "Dto", generateDto.GenTable.ModuleName, $"{replaceDto.ModelTypeName}Dto.cs"); var tpl = FileHelper.ReadJtTemplate("TplDto.txt"); var result = tpl.Render(); - generateDto.GenCodes.Add(new GenCode(2, "Dto", fullPath, result)); + generateDto.GenCodes.Add(new GenCode(2, "Dto.cs", fullPath, result)); } #endregion @@ -142,7 +143,7 @@ namespace ZR.CodeGenerator var tpl = FileHelper.ReadJtTemplate("TplRepository.txt"); var result = tpl.Render(); - generateDto.GenCodes.Add(new GenCode(3, "Repository", fullPath, result)); + generateDto.GenCodes.Add(new GenCode(3, "Repository.cs", fullPath, result)); } #endregion @@ -156,15 +157,13 @@ namespace ZR.CodeGenerator { var fullPath = Path.Combine(generateDto.GenCodePath, _option.ServicesNamespace, "Business", $"{replaceDto.ModelTypeName}Service.cs"); var tpl = FileHelper.ReadJtTemplate("TplService.txt"); - var result = tpl.Render(); - generateDto.GenCodes.Add(new GenCode(4, "Service", fullPath, result)); + generateDto.GenCodes.Add(new GenCode(4, "Service.cs", fullPath, result)); var fullPath2 = Path.Combine(generateDto.GenCodePath, _option.IServicsNamespace, "Business", "IBusService", $"I{replaceDto.ModelTypeName}Service.cs"); var tpl2 = FileHelper.ReadJtTemplate("TplIService.txt"); - var result2 = tpl2.Render(); - generateDto.GenCodes.Add(new GenCode(4, "IService", fullPath2, result2)); + generateDto.GenCodes.Add(new GenCode(4, "IService.cs", fullPath2, result2)); } #endregion @@ -180,7 +179,7 @@ namespace ZR.CodeGenerator tpl.Set("QueryCondition", replaceDto.QueryCondition); var result = tpl.Render(); - generateDto.GenCodes.Add(new GenCode(5, "Controller", fullPath, result)); + generateDto.GenCodes.Add(new GenCode(5, "Controller.cs", fullPath, result)); } #endregion @@ -264,7 +263,7 @@ namespace ZR.CodeGenerator { if (!string.IsNullOrEmpty(searcList[i].ToString())) { - tableName = tableName.Replace(searcList[i], ""); + tableName = tableName.Replace(searcList[i], "", StringComparison.OrdinalIgnoreCase); } } } @@ -278,11 +277,11 @@ namespace ZR.CodeGenerator /// 业务名 public static string GetBusinessName(string tableName) { - int lastIndex = tableName.IndexOf("_");//_前缀长度 - int nameLength = tableName.Length; - int subLength = (nameLength - lastIndex) - 1; - string businessName = tableName[(lastIndex + 1)..]; - return businessName.Replace("_", "").ToLower(); + //int firstIndex = tableName.IndexOf("_");//_前缀长度 + //int nameLength = tableName.Length; + //int subLength = (nameLength - lastIndex) - 1; + //string businessName = tableName[(lastIndex + 1)..]; + return tableName.Substring(0, 1).ToUpper() + tableName[1..].Replace("_", ""); } /// @@ -414,8 +413,8 @@ namespace ZR.CodeGenerator /// private static void InitJntTemplate(GenerateDto dto, ReplaceDto replaceDto) { - Engine.Current.Clean(); - + //Engine.Current.Clean(); + dto.GenTable.Columns = dto.GenTable.Columns.OrderBy(x => x.Sort).ToList(); //jnt模板引擎全局变量 Engine.Configure((options) => { @@ -429,9 +428,12 @@ namespace ZR.CodeGenerator options.Data.Set("replaceDto", replaceDto); options.Data.Set("options", dto.GenOptions); options.Data.Set("genTable", dto.GenTable); + options.Data.Set("btns", dto.CheckedBtn); + options.Data.Set("tool", new CodeGeneratorTool()); + options.Data.Set("codeTool", new CodeGenerateTemplate()); + options.EnableCache = true; //...其它数据 }); } - } } diff --git a/ZR.CodeGenerator/DbProvider.cs b/ZR.CodeGenerator/DbProvider.cs index ee7a98f..9a6e711 100644 --- a/ZR.CodeGenerator/DbProvider.cs +++ b/ZR.CodeGenerator/DbProvider.cs @@ -14,14 +14,14 @@ namespace ZR.CodeGenerator /// public class DbProvider { - protected static SqlSugarScope CodeDb; + protected static SqlSugarClient CodeDb; /// /// 获取动态连接字符串 /// /// 数据库名 /// - public SqlSugarScope GetSugarDbContext(string dbName = "") + public SqlSugarClient GetSugarDbContext(string dbName = "") { string connStr = ConfigUtils.Instance.GetConfig(GenConstants.Gen_conn); int dbType = ConfigUtils.Instance.GetAppConfig(GenConstants.Gen_conn_dbType, 0); @@ -31,7 +31,7 @@ namespace ZR.CodeGenerator string replaceStr = GetValue(connStr, "database=", ";"); connStr = connStr.Replace(replaceStr, dbName); } - var db = new SqlSugarScope(new List() + var db = new SqlSugarClient(new List() { new ConnectionConfig(){ ConnectionString = connStr, diff --git a/ZR.CodeGenerator/FileHelper.cs b/ZR.CodeGenerator/FileHelper.cs index 13a4ac5..549c45f 100644 --- a/ZR.CodeGenerator/FileHelper.cs +++ b/ZR.CodeGenerator/FileHelper.cs @@ -130,7 +130,7 @@ namespace ZR.CodeGenerator try { //生成压缩包 - string zipReturnFileName = dto.GenTable.BaseNameSpace + DateTime.Now.ToString("yyyyMMddHHmmss") + ".zip"; + string zipReturnFileName = "ZrAdmin.NET" + DateTime.Now.ToString("yyyyMMddHHmmss") + ".zip"; CreateDirectory(dto.GenCodePath); string zipFileName = Path.Combine(dto.ZipPath, zipReturnFileName); @@ -187,7 +187,7 @@ namespace ZR.CodeGenerator } catch (Exception ex) // 异常处理 { - //Log4NetHelper.Error("代码生成异常", ex); + Console.WriteLine("代码生成异常" + ex.Message); } } diff --git a/ZR.CodeGenerator/GenConstants.cs b/ZR.CodeGenerator/GenConstants.cs index a32f4dc..46a4dda 100644 --- a/ZR.CodeGenerator/GenConstants.cs +++ b/ZR.CodeGenerator/GenConstants.cs @@ -109,6 +109,12 @@ namespace ZR.CodeGenerator /** 富文本控件 */ public static string HTML_EDITOR = "editor"; + // 自定义排序 + public static string HTML_SORT = "sort"; + //颜色选择器 + public static string HTML_COLORPICKER = "colorPicker"; + //switch开关 + public static string HTML_SWITCH { get; set; } /** 字符串类型 */ public static string TYPE_STRING = "string"; diff --git a/ZR.CodeGenerator/Model/GenerateDto.cs b/ZR.CodeGenerator/Model/GenerateDto.cs index 3554346..bdb2c22 100644 --- a/ZR.CodeGenerator/Model/GenerateDto.cs +++ b/ZR.CodeGenerator/Model/GenerateDto.cs @@ -14,6 +14,10 @@ namespace ZR.CodeGenerator.Model /// 生成代码的数据库类型 0、mysql 1、sqlserver /// public int DbType { get; set; } + /// + /// 生成的按钮功能 + /// + public int[] CheckedBtn { get; set; } public GenTable GenTable { get; set; } public CodeGenerateOption GenOptions { get; set; } #region 存储路径 diff --git a/ZR.CodeGenerator/Model/ReplaceDto.cs b/ZR.CodeGenerator/Model/ReplaceDto.cs index 64da250..6f3296a 100644 --- a/ZR.CodeGenerator/Model/ReplaceDto.cs +++ b/ZR.CodeGenerator/Model/ReplaceDto.cs @@ -25,7 +25,7 @@ namespace ZR.CodeGenerator.Model /// public string ModelTypeName { get; set; } //vue、api - public string VueViewFormResetHtml { get; set; } + //public string VueViewFormResetHtml { get; set; } /// /// 前端列表查询html /// @@ -47,7 +47,10 @@ namespace ZR.CodeGenerator.Model /// 查询条件 /// public string QueryCondition { get; set; } = ""; - + public bool ShowBtnExport { get; set; } + public bool ShowBtnAdd { get; set; } + public bool ShowBtnEdit { get; set; } + public bool ShowBtnDelete { get; set; } /// /// 上传URL data /// diff --git a/ZR.CodeGenerator/Service/CodeGeneraterService.cs b/ZR.CodeGenerator/Service/CodeGeneraterService.cs index b0fcbe7..fd0ae3b 100644 --- a/ZR.CodeGenerator/Service/CodeGeneraterService.cs +++ b/ZR.CodeGenerator/Service/CodeGeneraterService.cs @@ -14,7 +14,7 @@ namespace ZR.CodeGenerator.Service public List GetAllDataBases() { var db = GetSugarDbContext(); - var templist = db.DbMaintenance.GetDataBaseList(db.ScopedContext); + var templist = db.DbMaintenance.GetDataBaseList(db); return templist; } diff --git a/ZR.Repository/System/GenTableRepository.cs b/ZR.Repository/System/GenTableRepository.cs index e5839fe..234992a 100644 --- a/ZR.Repository/System/GenTableRepository.cs +++ b/ZR.Repository/System/GenTableRepository.cs @@ -64,31 +64,26 @@ namespace ZR.Repository.System /// public int UpdateGenTableColumn(List tableColumn) { - foreach (var item in tableColumn) - { - Context.Updateable() - .Where(f => f.TableId == item.TableId) - .SetColumns(it => new GenTableColumn() - { - ColumnComment = item.ColumnComment, - CsharpField = item.CsharpField, - CsharpType = item.CsharpType, - IsQuery = item.IsQuery, - IsEdit = item.IsEdit, - IsInsert = item.IsInsert, - IsList = item.IsList, - QueryType = item.QueryType, - HtmlType = item.HtmlType, - IsRequired = item.IsRequired, - Sort = item.Sort, - Update_time = DateTime.Now, - DictType = item.DictType - }) - .Where(f => f.ColumnId == item.ColumnId) - .ExecuteCommand(); - } - - return 1; + return Context.Updateable(tableColumn) + .WhereColumns(it => new { it.ColumnId, it.TableId}) + .UpdateColumns(it => new + { + it.ColumnComment, + it.CsharpField, + it.CsharpType, + it.IsQuery, + it.IsEdit, + it.IsInsert, + it.IsList, + it.QueryType, + it.HtmlType, + it.IsRequired, + it.Sort, + it.Update_time, + it.DictType, + it.Update_by + }) + .ExecuteCommand(); } } } diff --git a/ZR.Service/System/IService/ISysFileService.cs b/ZR.Service/System/IService/ISysFileService.cs index ff1b047..c4dc983 100644 --- a/ZR.Service/System/IService/ISysFileService.cs +++ b/ZR.Service/System/IService/ISysFileService.cs @@ -5,7 +5,13 @@ namespace ZR.Service.System.IService { public interface ISysFileService { - (bool, string) SaveFile(string picdir, IFormFile formFile); + /// + /// 上传文件 + /// + /// + /// + /// 结果、地址、文件名 + (bool, string, string) SaveFile(string picdir, IFormFile formFile); /// /// 按时间来创建文件夹 diff --git a/ZR.Service/System/SysFileService.cs b/ZR.Service/System/SysFileService.cs index 7a78c8b..bab5cb3 100644 --- a/ZR.Service/System/SysFileService.cs +++ b/ZR.Service/System/SysFileService.cs @@ -25,7 +25,7 @@ namespace ZR.Service.System /// /// /// - public (bool, string) SaveFile(string picdir, IFormFile formFile) + public (bool, string, string) SaveFile(string picdir, IFormFile formFile) { // eg: idcard/2020/08/18 string dir = GetdirPath(picdir.ToString()); @@ -36,11 +36,7 @@ namespace ZR.Service.System HttpStatusCode statusCode = AliyunOssHelper.PutObjectFromFile(formFile.OpenReadStream(), Path.Combine(dir, fileName)); - if (statusCode == HttpStatusCode.OK) - { - return (true, webUrl); - } - return (false, ""); + return (statusCode == HttpStatusCode.OK, webUrl, fileName); } public string GetdirPath(string path = "") diff --git a/ZR.Vue/.env.development b/ZR.Vue/.env.development index d7d1cf0..e3942d6 100644 --- a/ZR.Vue/.env.development +++ b/ZR.Vue/.env.development @@ -1,8 +1,10 @@ -# 关于此文件说明 必须以VUE_APP开头 # 开发环境配置 ENV = 'development' -# ZR管理系统/开发环境 +# 页面标题 +VUE_APP_TITLE = ZrAdmin.NET管理系统 + +# 开发环境 VUE_APP_BASE_API = '/dev-api' # 路由前缀 diff --git a/ZR.Vue/.env.production b/ZR.Vue/.env.production index 163fe39..c615a61 100644 --- a/ZR.Vue/.env.production +++ b/ZR.Vue/.env.production @@ -1,7 +1,10 @@ # 生产环境配置 ENV = 'production' -# ZR管理系统/生产环境 +# 页面标题 +VUE_APP_TITLE = ZrAdmin.NET管理系统 + +# 生产环境 VUE_APP_BASE_API = '/prod-api' # 路由前缀 diff --git a/ZR.Vue/.env.staging b/ZR.Vue/.env.staging index 184dcfe..6907d21 100644 --- a/ZR.Vue/.env.staging +++ b/ZR.Vue/.env.staging @@ -1,7 +1,10 @@ # 测试环境配置 ENV = 'staging' -# ZR管理系统/生产环境 +# 页面标题 +VUE_APP_TITLE = ZrAdmin.NET管理系统 + +# 测试环境 VUE_APP_BASE_API = '/stage-api' # 路由前缀 diff --git a/ZR.Vue/src/App.vue b/ZR.Vue/src/App.vue index e448b11..907acd2 100644 --- a/ZR.Vue/src/App.vue +++ b/ZR.Vue/src/App.vue @@ -5,7 +5,7 @@ diff --git a/ZR.Vue/src/api/tool/gen.js b/ZR.Vue/src/api/tool/gen.js index ea4af5c..e8678bf 100644 --- a/ZR.Vue/src/api/tool/gen.js +++ b/ZR.Vue/src/api/tool/gen.js @@ -95,10 +95,11 @@ export function updateGenTable(data) { } // 预览生成代码 -export function previewTable(tableId) { +export function previewTable(tableId, data) { return request({ url: '/tool/gen/preview/' + tableId, - method: 'get' + method: 'post', + data: data }) } diff --git a/ZR.Vue/src/assets/image/profile.jpg b/ZR.Vue/src/assets/image/profile.jpg index 300fca5..997732a 100644 Binary files a/ZR.Vue/src/assets/image/profile.jpg and b/ZR.Vue/src/assets/image/profile.jpg differ diff --git a/ZR.Vue/src/assets/image/reward.jpg b/ZR.Vue/src/assets/image/reward.jpg index 86e15b6..68fe0d3 100644 Binary files a/ZR.Vue/src/assets/image/reward.jpg and b/ZR.Vue/src/assets/image/reward.jpg differ diff --git a/ZR.Vue/src/components/FileUpload/index.vue b/ZR.Vue/src/components/FileUpload/index.vue new file mode 100644 index 0000000..ad5d6e5 --- /dev/null +++ b/ZR.Vue/src/components/FileUpload/index.vue @@ -0,0 +1,198 @@ + + + + + \ No newline at end of file diff --git a/ZR.Vue/src/components/UploadImage/index.vue b/ZR.Vue/src/components/UploadImage/index.vue index 9b41c19..72aafdb 100644 --- a/ZR.Vue/src/components/UploadImage/index.vue +++ b/ZR.Vue/src/components/UploadImage/index.vue @@ -1,10 +1,21 @@ @@ -12,50 +23,100 @@ import { getToken } from "@/utils/auth"; export default { - name: "UploadImage", - data() { - return { - uploadImgUrl: process.env.VUE_APP_BASE_API + this.uploadUrl, // 上传的图片服务器地址 - headers: { - Authorization: "Bearer " + getToken(), - }, - imageUrl: "", - }; - }, props: { - icon: { - type: String, + value: [String], + // 图片数量限制 + limit: { + type: Number, + default: 1, }, - // 当前form 列名 - column: { type: String }, + column: [String], // 上传地址 uploadUrl: { type: String, - default: "Common/UploadFile", + default: "/Common/UploadFile", }, // 文件类型, 例如['png', 'jpg', 'jpeg'] fileType: { type: Array, - default: () => ["png", "jpg", "jpeg"], + default: () => ["png", "jpg", "jpeg", "webp"], }, // 大小限制(MB) fileSize: { type: Number, default: 5, }, + //显示手动输入地址 + showInput: false, + // 是否显示提示 + isShowTip: { + type: Boolean, + default: true, + }, }, - mounted() { - this.imageUrl = this.icon; + data() { + return { + dialogImageUrl: "", + dialogVisible: false, + hideUpload: false, + uploadImgUrl: process.env.VUE_APP_BASE_API + this.uploadUrl, // 上传的图片服务器地址 + headers: { + Authorization: "Bearer " + getToken(), + }, + imageUrl: "", + fileList: [], + }; + }, + watch: { + //监听 v-model 的值 + value: { + immediate: true, + deep: true, + handler: function (val) { + if (val) { + // 首先将值转为数组 + const list = Array.isArray(val) ? val : this.value.split(","); + // 然后将数组转为对象数组 + this.fileList = list.map((item) => { + if (typeof item === "string") { + // if (item.indexOf(this.baseUrl) === -1) { + // item = { name: this.baseUrl + item, url: this.baseUrl + item }; + // } else { + item = { name: item, url: item }; + // } + } + return item; + }); + } else { + this.fileList = []; + return []; + } + }, + }, + }, + computed: { + // 是否显示提示 + showTip() { + return this.isShowTip && (this.fileType || this.fileSize); + }, }, methods: { + // 删除图片 + handleRemove(file, fileList) { + const findex = this.fileList.map((f) => f.name).indexOf(file.name); + if (findex > -1) { + this.fileList.splice(findex, 1); + this.$emit("input", this.column, this.listToString(this.fileList)); + } + }, + //上传成功回调 handleUploadSuccess(res) { - this.$emit(`handleUploadSuccess`, res, this.column); - this.imageUrl = res.data; + this.fileList.push({ name: res.data.fileName, url: res.data.url }); + this.$emit(`input`, this.column, this.listToString(this.fileList)); this.loading.close(); }, // 上传前loading加载 handleBeforeUpload(file) { - console.log(file) let isImg = false; if (this.fileType.length) { let fileExtension = ""; @@ -90,6 +151,24 @@ export default { background: "rgba(0, 0, 0, 0.7)", }); }, + // 文件个数超出 + handleExceed() { + this.$message.error(`上传文件数量不能超过 ${this.limit} 个!`); + }, + // 预览 + handlePictureCardPreview(file) { + this.dialogImageUrl = file.url; + this.dialogVisible = true; + }, + // 对象转成指定字符串分隔 + listToString(list, separator) { + let strs = ""; + separator = separator || ","; + for (let i in list) { + strs += list[i].url.replace(this.baseUrl, "") + separator; + } + return strs != '' ? strs.substr(0, strs.length - 1) : ''; + }, handleUploadError() { this.$message({ type: "error", @@ -98,13 +177,22 @@ export default { this.loading.close(); }, }, - watch: {}, }; \ No newline at end of file diff --git a/ZR.Vue/src/layout/components/Settings/index.vue b/ZR.Vue/src/layout/components/Settings/index.vue index df3d3f3..423f4d9 100644 --- a/ZR.Vue/src/layout/components/Settings/index.vue +++ b/ZR.Vue/src/layout/components/Settings/index.vue @@ -10,7 +10,8 @@
@@ -20,7 +21,8 @@
@@ -55,6 +57,10 @@ 显示 Logo +
+ 动态标题 + +
保存配置 @@ -88,17 +94,20 @@ export default { }, topNav: { get() { - return this.$store.state.settings.topNav + return this.$store.state.settings.topNav; }, set(val) { - this.$store.dispatch('settings/changeSetting', { - key: 'topNav', - value: val - }) + this.$store.dispatch("settings/changeSetting", { + key: "topNav", + value: val, + }); if (!val) { - this.$store.commit("SET_SIDEBAR_ROUTERS", this.$store.state.permission.defaultRoutes); + this.$store.commit( + "SET_SIDEBAR_ROUTERS", + this.$store.state.permission.defaultRoutes + ); } - } + }, }, tagsView: { get() { @@ -122,6 +131,17 @@ export default { }); }, }, + dynamicTitle: { + get() { + return this.$store.state.settings.dynamicTitle; + }, + set(val) { + this.$store.dispatch("settings/changeSetting", { + key: "dynamicTitle", + value: val, + }); + }, + }, }, methods: { themeChange(val) { @@ -154,6 +174,7 @@ export default { "tagsView":${this.tagsView}, "fixedHeader":${this.fixedHeader}, "sidebarLogo":${this.sidebarLogo}, + "dynamicTitle":${this.dynamicTitle}, "sideTheme":"${this.sideTheme}", "theme":"${this.theme}" }` diff --git a/ZR.Vue/src/main.js b/ZR.Vue/src/main.js index fa6dc78..3720641 100644 --- a/ZR.Vue/src/main.js +++ b/ZR.Vue/src/main.js @@ -29,6 +29,8 @@ import DictTag from '@/components/DictTag' // import DictData from '@/components/DictData' // 上传图片 import UploadImage from '@/components/UploadImage/index'; +// 上传文件 +import UploadFile from '@/components/FileUpload/index'; // 全局方法挂载 Vue.prototype.getDicts = getDicts @@ -60,10 +62,11 @@ Vue.component('RightToolbar', RightToolbar) Vue.component('DictTag', DictTag) Vue.component('Editor', Editor) Vue.component('UploadImage', UploadImage) +Vue.component('UploadFile', UploadFile) Vue.use(permission) Vue.use(Element, { - size: Cookies.get('size') || 'medium' // set element-ui default size + size: Cookies.get('size') || 'small' // set element-ui default size }) Vue.config.productionTip = false diff --git a/ZR.Vue/src/permission.js b/ZR.Vue/src/permission.js index 924803a..4ec5adc 100644 --- a/ZR.Vue/src/permission.js +++ b/ZR.Vue/src/permission.js @@ -13,9 +13,10 @@ const whiteList = ['/login', '/auth-redirect', '/bind', '/register', '/demo'] router.beforeEach((to, from, next) => { NProgress.start() - console.log('router to ' + to.path); + console.log('path=' + to.path); if (getToken()) { + to.meta.title && store.dispatch('settings/setTitle', to.meta.title) /* has token*/ if (to.path === '/login') { next({ path: '/' }) diff --git a/ZR.Vue/src/settings.js b/ZR.Vue/src/settings.js index 2b3221c..27e509d 100644 --- a/ZR.Vue/src/settings.js +++ b/ZR.Vue/src/settings.js @@ -3,11 +3,11 @@ module.exports = { * 框架版本号 */ version: '3.7.0', - title: 'ZrAdmin.NET', + title: 'ZrAdmin.NET-管理系统', /** * 主题颜色 */ - theme: '#13C2C2', + theme: '#409EFF', /** * 侧边栏主题 深色主题theme-dark,浅色主题theme-light */ @@ -37,7 +37,10 @@ module.exports = { * 是否显示logo */ sidebarLogo: true, - + /** + * 是否显示动态标题 + */ + dynamicTitle: false, /** * @type {string | array} 'production' | ['production', 'development'] * @description Need show err logs component. diff --git a/ZR.Vue/src/store/getters.js b/ZR.Vue/src/store/getters.js index adcf1d8..ec52d5f 100644 --- a/ZR.Vue/src/store/getters.js +++ b/ZR.Vue/src/store/getters.js @@ -7,6 +7,7 @@ const getters = { token: state => state.user.token, avatar: state => state.user.avatar, name: state => state.user.name, + userId: state => state.user.userInfo.userId, introduction: state => state.user.introduction, roles: state => state.user.roles, permissions: state => state.user.permissions, diff --git a/ZR.Vue/src/store/modules/settings.js b/ZR.Vue/src/store/modules/settings.js index 907cede..67c5567 100644 --- a/ZR.Vue/src/store/modules/settings.js +++ b/ZR.Vue/src/store/modules/settings.js @@ -1,9 +1,10 @@ import defaultSettings from '@/settings' -const { theme, sideTheme, showSettings, topNav, tagsView, fixedHeader, sidebarLogo } = defaultSettings +const { theme, sideTheme, showSettings, topNav, tagsView, fixedHeader, sidebarLogo, dynamicTitle } = defaultSettings const storageSetting = JSON.parse(localStorage.getItem('layout-setting')) || '' const state = { + title: '', theme: storageSetting.theme || theme, //主题颜色 sideTheme: storageSetting.sideTheme || sideTheme, //侧边主题样式 topNav: storageSetting.topNav === undefined ? topNav : storageSetting.topNav, @@ -11,7 +12,7 @@ const state = { tagsView: storageSetting.tagsView === undefined ? tagsView : storageSetting.tagsView, fixedHeader: storageSetting.fixedHeader === undefined ? fixedHeader : storageSetting.fixedHeader, sidebarLogo: storageSetting.sidebarLogo === undefined ? sidebarLogo : storageSetting.sidebarLogo, - // dynamicTitle: storageSetting.dynamicTitle === undefined ? dynamicTitle : storageSetting.dynamicTitle + dynamicTitle: storageSetting.dynamicTitle === undefined ? dynamicTitle : storageSetting.dynamicTitle } const mutations = { @@ -26,6 +27,11 @@ const actions = { //修改布局设置 changeSetting({ commit }, data) { commit('CHANGE_SETTING', data) + }, + // 设置网页标题 + setTitle({ commit }, title) { + state.title = title; + document.title = state.dynamicTitle ? `${title} - ${process.env.VUE_APP_TITLE}` : process.env.VUE_APP_TITLE; } } diff --git a/ZR.Vue/src/utils/request.js b/ZR.Vue/src/utils/request.js index 9cf7d49..4336d66 100644 --- a/ZR.Vue/src/utils/request.js +++ b/ZR.Vue/src/utils/request.js @@ -26,6 +26,7 @@ service.interceptors.request.use(config => { if (getToken()) { //将token放到请求头发送给服务器,将tokenkey放在请求头中 config.headers['Authorization'] = 'Bearer ' + getToken(); + config.headers['userid'] = store.getters.userId; } else { // console.log(config) } @@ -42,7 +43,7 @@ service.interceptors.response.use(res => { return; } // 未设置状态码则默认成功状态 - const { code , msg } = res.data; + const { code, msg } = res.data; if (code == 401) { MessageBox.confirm('登录状态已过期,请重新登录', '系统提示', { @@ -137,4 +138,4 @@ export function postForm(url, data, config) { }) }) } -export default service +export default service \ No newline at end of file diff --git a/ZR.Vue/src/utils/ruoyi.js b/ZR.Vue/src/utils/ruoyi.js index fd86973..03e3587 100644 --- a/ZR.Vue/src/utils/ruoyi.js +++ b/ZR.Vue/src/utils/ruoyi.js @@ -66,8 +66,7 @@ export function addDateRange(params, dateRange) { } export function addDateRange2(dateRange, index) { - console.log(dateRange); - var time = ""; + var time = undefined; if (null != dateRange && '' != dateRange) { if (dateRange.length <= 2) { time = dateRange[index]; diff --git a/ZR.Vue/src/views/login.vue b/ZR.Vue/src/views/login.vue index 86c89b3..9d69617 100644 --- a/ZR.Vue/src/views/login.vue +++ b/ZR.Vue/src/views/login.vue @@ -1,7 +1,7 @@