21 Commits
Author SHA1 Message Date
不做码农 78aa48a975 feat:邮件发送新增签名配置 2022-07-01 20:01:40 +08:00
不做码农 13f8ec1cec feat:任务网络请求执行失败新增日志记录 2022-06-30 18:14:05 +08:00
不做码农 32ada25a4a chore:升级SQLsugar 2022-06-28 21:10:40 +08:00
不做码农 ac134308ed fix:自定义异常返回中文乱码 2022-06-28 20:21:51 +08:00
不做码农 79b5015091 perf:优化代码生成模板 2022-06-17 21:58:44 +08:00
不做码农 ebc44ef9c9 perf:菜单添加 2022-06-16 20:54:55 +08:00
不做码农 d37a1ffbd5 feat:菜单新增内链打开外网方式 2022-06-16 20:51:18 +08:00
不做码农 42c4ec914c chore:升级sqlsugar 2022-06-15 18:41:32 +08:00
不做码农 5077d6888f !9 update ZR.Vue/src/views/tool/gen/editTable.vue.
Merge pull request !9 from 当当/N/A
2022-06-13 12:12:51 +00:00
不做码农 c265d6d413 新增加在线用户聊天消息通知 2022-06-12 21:44:43 +08:00
不做码农 254c49e676 优化翻译 2022-06-11 18:58:08 +08:00
不做码农 71bbc27b1e 优化代码 2022-06-09 21:15:30 +08:00
不做码农 e209c4a192 fixd:子表数据查询问题 2022-06-09 20:45:19 +08:00
不做码农 c3325efbc6 优化代码生成模板 2022-06-09 20:07:32 +08:00
不做码农 17008fc9c9 update appsettings.json 2022-06-09 08:41:49 +08:00
不做码农 756dc66350 update SysMenuService.cs 2022-06-09 08:41:29 +08:00
不做码农 d74b350f86 修改默认头像存储位置 2022-06-09 08:39:02 +08:00
不做码农 687160e0ae 修改文件存储 2022-06-09 08:37:31 +08:00
不做码农 ef9baadf92 升级包 2022-06-05 14:52:18 +08:00
不做码农 c6be4db66c 在线用户登录新增用户地理位置显示 2022-06-05 13:15:28 +08:00
当当 2ae73a7d1d update ZR.Vue/src/views/tool/gen/editTable.vue.
删除了列的fixed,现在行可以拖放。
2022-05-30 12:19:17 +00:00
42 changed files with 293 additions and 245 deletions
+7 -1
View File
@@ -29,6 +29,12 @@ namespace Infrastructure.Enums
/// 七牛 /// 七牛
/// </summary> /// </summary>
[Description("七牛云")] [Description("七牛云")]
QINIU = 4 QINIU = 4,
/// <summary>
/// 远程
/// </summary>
[Description("远程")]
REMOTE = 5
} }
} }
+2
View File
@@ -24,6 +24,7 @@ namespace Infrastructure
public string Password { get; set; } public string Password { get; set; }
public string Smtp { get; set; } public string Smtp { get; set; }
public int Port { get; set; } public int Port { get; set; }
public string Signature { get; set; }
} }
/// <summary> /// <summary>
/// 上传 /// 上传
@@ -31,6 +32,7 @@ namespace Infrastructure
public class Upload public class Upload
{ {
public string UploadUrl { get; set; } public string UploadUrl { get; set; }
public string LocalSavePath { get; set; }
} }
/// <summary> /// <summary>
/// 阿里云存储 /// 阿里云存储
@@ -110,13 +110,15 @@ namespace ZR.Admin.WebApi.Controllers
switch (storeType) switch (storeType)
{ {
case StoreType.LOCAL: case StoreType.LOCAL:
string savePath = AppSettings.App(new string[] { "Upload", "localSavePath" }); string savePath = Path.Combine(WebHostEnvironment.WebRootPath);
if (savePath.IsEmpty()) if (fileDir.IsEmpty())
{ {
savePath = Path.Combine(WebHostEnvironment.WebRootPath, "uploads"); fileDir = AppSettings.App(new string[] { "Upload", "localSavePath" });
} }
file = await SysFileService.SaveFileToLocal(savePath, fileName, fileDir, HttpContext.GetName(), formFile); file = await SysFileService.SaveFileToLocal(savePath, fileName, fileDir, HttpContext.GetName(), formFile);
break; break;
case StoreType.REMOTE:
break;
case StoreType.ALIYUN: case StoreType.ALIYUN:
if ((fileSize / 1024) > MaxContentLength) if ((fileSize / 1024) > MaxContentLength)
{ {
@@ -104,12 +104,10 @@ namespace ZR.Admin.WebApi.Controllers
{ {
throw new CustomException("请求实体不能为空"); throw new CustomException("请求实体不能为空");
} }
//从 Dto 映射到 实体
var modal = parm.Adapt<ArticleCategory>().ToUpdate(HttpContext); var modal = parm.Adapt<ArticleCategory>().ToUpdate(HttpContext);
var response = _ArticleCategoryService.Update(w => w.CategoryId == modal.CategoryId, it => new ArticleCategory() var response = _ArticleCategoryService.Update(w => w.CategoryId == modal.CategoryId, it => new ArticleCategory()
{ {
//Update 字段映射
Name = modal.Name, Name = modal.Name,
ParentId = modal.ParentId, ParentId = modal.ParentId,
}); });
@@ -40,10 +40,8 @@ namespace ZR.Admin.WebApi.Controllers
[ActionPermissionFilter(Permission = "system:article:list")] [ActionPermissionFilter(Permission = "system:article:list")]
public IActionResult Query([FromQuery] ArticleQueryDto parm) public IActionResult Query([FromQuery] ArticleQueryDto parm)
{ {
//开始拼装查询条件
var predicate = Expressionable.Create<Article>(); var predicate = Expressionable.Create<Article>();
//搜索条件
predicate = predicate.AndIF(!string.IsNullOrEmpty(parm.Title), m => m.Title.Contains(parm.Title)); predicate = predicate.AndIF(!string.IsNullOrEmpty(parm.Title), m => m.Title.Contains(parm.Title));
predicate = predicate.AndIF(!string.IsNullOrEmpty(parm.Status), m => m.Status == parm.Status); predicate = predicate.AndIF(!string.IsNullOrEmpty(parm.Status), m => m.Status == parm.Status);
@@ -59,10 +57,7 @@ namespace ZR.Admin.WebApi.Controllers
[HttpGet("newList")] [HttpGet("newList")]
public IActionResult QueryNew() public IActionResult QueryNew()
{ {
//开始拼装查询条件
var predicate = Expressionable.Create<Article>(); var predicate = Expressionable.Create<Article>();
//搜索条件
predicate = predicate.And(m => m.Status == "1"); predicate = predicate.And(m => m.Status == "1");
var response = _ArticleService.Queryable() var response = _ArticleService.Queryable()
@@ -99,7 +94,6 @@ namespace ZR.Admin.WebApi.Controllers
{ {
throw new CustomException("请求参数错误"); throw new CustomException("请求参数错误");
} }
//从 Dto 映射到 实体
var addModel = parm.Adapt<Article>().ToCreate(context: HttpContext); var addModel = parm.Adapt<Article>().ToCreate(context: HttpContext);
addModel.AuthorName = HttpContext.GetName(); addModel.AuthorName = HttpContext.GetName();
@@ -6,14 +6,13 @@ using Infrastructure.Model;
using Mapster; using Mapster;
using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
using System;
using System.Collections.Generic; using System.Collections.Generic;
using ZR.Admin.WebApi.Filters; using ZR.Admin.WebApi.Filters;
using ZR.Common; using ZR.Common;
using ZR.Model; using ZR.Model;
using ZR.Model.Dto; using ZR.Model.Dto;
using ZR.Model.Models; using ZR.Model.Models;
using ZR.Service.System.ISystemService; using ZR.Service.System.IService;
namespace ZR.Admin.WebApi.Controllers namespace ZR.Admin.WebApi.Controllers
{ {
@@ -45,8 +44,10 @@ namespace ZR.Admin.WebApi.Controllers
{ {
if (parm.ShowMode == 2) if (parm.ShowMode == 2)
{ {
PagedInfo<dynamic> pagedInfo = new(); PagedInfo<dynamic> pagedInfo = new()
pagedInfo.Result = _CommonLangService.GetListToPivot(parm); {
Result = _CommonLangService.GetListToPivot(parm)
};
return SUCCESS(pagedInfo); return SUCCESS(pagedInfo);
} }
@@ -60,34 +61,11 @@ namespace ZR.Admin.WebApi.Controllers
/// <returns></returns> /// <returns></returns>
[HttpGet("list/{lang}")] [HttpGet("list/{lang}")]
[AllowAnonymous] [AllowAnonymous]
public IActionResult QueryCommonLangs() public IActionResult QueryCommonLangs(string lang)
{ {
var msgList = _CommonLangService.GetLangList(new CommonLangQueryDto() { LangCode = "zh-cn" }); var msgList = _CommonLangService.GetLangList(new CommonLangQueryDto() { LangCode = lang });
var msgListEn = _CommonLangService.GetLangList(new CommonLangQueryDto() { LangCode = "en" });
var msgListTw = _CommonLangService.GetLangList(new CommonLangQueryDto() { LangCode = "zh-tw" });
Dictionary<string, object> dic = new();
Dictionary<string, object> dicEn = new();
Dictionary<string, object> dicTw = new();
SetLang(msgList, dic);
SetLang(msgListEn, dicEn);
SetLang(msgListTw, dicTw);
return SUCCESS(new
{
en = dicEn,
cn = dic,
tw = dicTw
});
}
private static void SetLang(List<CommonLang> msgList, Dictionary<string, object> dic) return SUCCESS(_CommonLangService.SetLang(msgList));
{
foreach (var item in msgList)
{
if (!dic.ContainsKey(item.LangKey))
{
dic.Add(item.LangKey, item.LangName);
}
}
} }
/// <summary> /// <summary>
@@ -137,17 +115,9 @@ namespace ZR.Admin.WebApi.Controllers
throw new CustomException("请求实体不能为空"); throw new CustomException("请求实体不能为空");
} }
List<CommonLang> langs = new(); _CommonLangService.StorageCommonLang(parm);
foreach (var item in parm.LangList)
{
langs.Add(new CommonLang() { Addtime = DateTime.Now, LangKey = parm.LangKey, LangCode = item.LangCode, LangName = item.LangName });
}
var storage = _CommonLangService.Storageable(langs).WhereColumns(it => new { it.LangKey, it.LangCode }).ToStorage();
long r = storage.AsInsertable.ExecuteReturnSnowflakeId();//执行插入 return ToResponse(1);
storage.AsUpdateable.UpdateColumns(it => new { it.LangName }).ExecuteCommand();//执行修改
return ToResponse(r);
} }
/// <summary> /// <summary>
@@ -41,10 +41,8 @@ namespace ZR.Admin.WebApi.Controllers
[ActionPermissionFilter(Permission = "system:config:list")] [ActionPermissionFilter(Permission = "system:config:list")]
public IActionResult QuerySysConfig([FromQuery] SysConfigQueryDto parm) public IActionResult QuerySysConfig([FromQuery] SysConfigQueryDto parm)
{ {
//开始拼装查询条件
var predicate = Expressionable.Create<SysConfig>(); var predicate = Expressionable.Create<SysConfig>();
//TODO 搜索条件
predicate = predicate.AndIF(!parm.ConfigType.IsEmpty(),m => m.ConfigType == parm.ConfigType); predicate = predicate.AndIF(!parm.ConfigType.IsEmpty(),m => m.ConfigType == parm.ConfigType);
predicate = predicate.AndIF(!parm.ConfigName.IsEmpty(),m => m.ConfigName.Contains(parm.ConfigType)); predicate = predicate.AndIF(!parm.ConfigName.IsEmpty(),m => m.ConfigName.Contains(parm.ConfigType));
predicate = predicate.AndIF(!parm.ConfigKey.IsEmpty(),m => m.ConfigKey.Contains(parm.ConfigKey)); predicate = predicate.AndIF(!parm.ConfigKey.IsEmpty(),m => m.ConfigKey.Contains(parm.ConfigKey));
@@ -79,7 +77,6 @@ namespace ZR.Admin.WebApi.Controllers
[AllowAnonymous] [AllowAnonymous]
public IActionResult GetConfigKey(string configKey) public IActionResult GetConfigKey(string configKey)
{ {
//TODO 增加缓存
var response = _SysConfigService.Queryable().First(f=> f.ConfigKey == configKey); var response = _SysConfigService.Queryable().First(f=> f.ConfigKey == configKey);
return SUCCESS(response?.ConfigValue); return SUCCESS(response?.ConfigValue);
@@ -98,7 +95,6 @@ namespace ZR.Admin.WebApi.Controllers
{ {
throw new CustomException("请求参数错误"); throw new CustomException("请求参数错误");
} }
//从 Dto 映射到 实体
var model = parm.Adapt<SysConfig>().ToCreate(HttpContext); var model = parm.Adapt<SysConfig>().ToCreate(HttpContext);
return SUCCESS(_SysConfigService.Insert(model, it => new return SUCCESS(_SysConfigService.Insert(model, it => new
@@ -126,12 +122,10 @@ namespace ZR.Admin.WebApi.Controllers
{ {
throw new CustomException("请求实体不能为空"); throw new CustomException("请求实体不能为空");
} }
//从 Dto 映射到 实体
var model = parm.Adapt<SysConfig>().ToUpdate(HttpContext); var model = parm.Adapt<SysConfig>().ToUpdate(HttpContext);
var response = _SysConfigService.Update(w => w.ConfigId == model.ConfigId, it => new SysConfig() var response = _SysConfigService.Update(w => w.ConfigId == model.ConfigId, it => new SysConfig()
{ {
//Update 字段映射
ConfigName = model.ConfigName, ConfigName = model.ConfigName,
ConfigKey = model.ConfigKey, ConfigKey = model.ConfigKey,
ConfigValue = model.ConfigValue, ConfigValue = model.ConfigValue,
@@ -5,6 +5,7 @@ using Microsoft.AspNetCore.Mvc;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using ZR.Admin.WebApi.Extensions;
using ZR.Admin.WebApi.Filters; using ZR.Admin.WebApi.Filters;
using ZR.Model; using ZR.Model;
using ZR.Model.System; using ZR.Model.System;
@@ -54,6 +55,7 @@ namespace ZR.Admin.WebApi.Controllers.System
{ {
return SUCCESS(SysDictDataService.SelectDictDataByType(dictType)); return SUCCESS(SysDictDataService.SelectDictDataByType(dictType));
} }
/// <summary> /// <summary>
/// 根据字典类型查询字典数据信息 /// 根据字典类型查询字典数据信息
/// </summary> /// </summary>
@@ -101,7 +103,7 @@ namespace ZR.Admin.WebApi.Controllers.System
[HttpPost()] [HttpPost()]
public IActionResult Add([FromBody] SysDictData dict) public IActionResult Add([FromBody] SysDictData dict)
{ {
dict.Create_by = User.Identity.Name; dict.Create_by = HttpContext.GetName();
dict.Create_time = DateTime.Now; dict.Create_time = DateTime.Now;
return SUCCESS(SysDictDataService.InsertDictData(dict)); return SUCCESS(SysDictDataService.InsertDictData(dict));
} }
@@ -116,7 +118,7 @@ namespace ZR.Admin.WebApi.Controllers.System
[HttpPut()] [HttpPut()]
public IActionResult Edit([FromBody] SysDictData dict) public IActionResult Edit([FromBody] SysDictData dict)
{ {
dict.Update_by = User.Identity.Name; dict.Update_by = HttpContext.GetName();
return SUCCESS(SysDictDataService.UpdateDictData(dict)); return SUCCESS(SysDictDataService.UpdateDictData(dict));
} }
@@ -67,8 +67,7 @@ namespace ZR.Admin.WebApi.Controllers.System
{ {
return ToResponse(ApiResult.Error($"新增字典'{dict.DictName}'失败,字典类型已存在")); return ToResponse(ApiResult.Error($"新增字典'{dict.DictName}'失败,字典类型已存在"));
} }
//设置添加人 dict.Create_by = HttpContext.GetName();
dict.Create_by = HttpContext.User.Identity.Name;
dict.Create_time = DateTime.Now; dict.Create_time = DateTime.Now;
return SUCCESS(SysDictService.InsertDictType(dict)); return SUCCESS(SysDictService.InsertDictType(dict));
} }
@@ -123,25 +123,31 @@ namespace ZR.Admin.WebApi.Controllers.System
/// <summary> /// <summary>
/// 添加菜单 /// 添加菜单
/// </summary> /// </summary>
/// <param name="MenuDto"></param> /// <param name="menuDto"></param>
/// <returns></returns> /// <returns></returns>
[HttpPut("add")] [HttpPut("add")]
[Log(Title = "菜单管理", BusinessType = BusinessType.INSERT)] [Log(Title = "菜单管理", BusinessType = BusinessType.INSERT)]
[ActionPermissionFilter(Permission = "system:menu:add")] [ActionPermissionFilter(Permission = "system:menu:add")]
public IActionResult MenuAdd([FromBody] SysMenu MenuDto) public IActionResult MenuAdd([FromBody] MenuDto menuDto)
{ {
if (MenuDto == null) { return ToResponse(ApiResult.Error(101, "请求参数错误")); } var config = new TypeAdapterConfig();
if (UserConstants.NOT_UNIQUE.Equals(sysMenuService.CheckMenuNameUnique(MenuDto))) //映射规则
config.ForType<SysMenu, MenuDto>()
.NameMatchingStrategy(NameMatchingStrategy.IgnoreCase);
var menu = menuDto.Adapt<SysMenu>(config).ToCreate(HttpContext);
if (menu == null) { return ToResponse(ApiResult.Error(101, "请求参数错误")); }
if (UserConstants.NOT_UNIQUE.Equals(sysMenuService.CheckMenuNameUnique(menu)))
{ {
return ToResponse(ApiResult.Error($"新增菜单'{MenuDto.MenuName}'失败,菜单名称已存在")); return ToResponse(ApiResult.Error($"新增菜单'{menu.MenuName}'失败,菜单名称已存在"));
} }
if (UserConstants.YES_FRAME.Equals(MenuDto.isFrame) && !MenuDto.path.StartsWith("http")) if (UserConstants.YES_FRAME.Equals(menu.isFrame) && !menu.path.StartsWith("http"))
{ {
return ToResponse(ApiResult.Error($"新增菜单'{MenuDto.MenuName}'失败,地址必须以http(s)://开头")); return ToResponse(ApiResult.Error($"新增菜单'{menu.MenuName}'失败,地址必须以http(s)://开头"));
} }
MenuDto.Create_by = User.Identity.Name; menu.Create_by = HttpContext.GetName();
int result = sysMenuService.AddMenu(MenuDto); int result = sysMenuService.AddMenu(menu);
return ToResponse(result); return ToResponse(result);
} }
@@ -44,10 +44,8 @@ namespace ZR.Admin.WebApi.Controllers.System
[HttpGet("queryNotice")] [HttpGet("queryNotice")]
public IActionResult QueryNotice([FromQuery] SysNoticeQueryDto parm) public IActionResult QueryNotice([FromQuery] SysNoticeQueryDto parm)
{ {
//开始拼装查询条件
var predicate = Expressionable.Create<SysNotice>(); var predicate = Expressionable.Create<SysNotice>();
//搜索条件查询语法参考Sqlsugar
predicate = predicate.And(m => m.Status == "0"); predicate = predicate.And(m => m.Status == "0");
var response = _SysNoticeService.GetPages(predicate.ToExpression(), parm); var response = _SysNoticeService.GetPages(predicate.ToExpression(), parm);
return SUCCESS(response); return SUCCESS(response);
@@ -61,10 +59,8 @@ namespace ZR.Admin.WebApi.Controllers.System
[ActionPermissionFilter(Permission = "system:notice:list")] [ActionPermissionFilter(Permission = "system:notice:list")]
public IActionResult QuerySysNotice([FromQuery] SysNoticeQueryDto parm) public IActionResult QuerySysNotice([FromQuery] SysNoticeQueryDto parm)
{ {
//开始拼装查询条件
var predicate = Expressionable.Create<SysNotice>(); var predicate = Expressionable.Create<SysNotice>();
//搜索条件查询语法参考Sqlsugar
predicate = predicate.AndIF(!string.IsNullOrEmpty(parm.NoticeTitle), m => m.NoticeTitle.Contains(parm.NoticeTitle)); predicate = predicate.AndIF(!string.IsNullOrEmpty(parm.NoticeTitle), m => m.NoticeTitle.Contains(parm.NoticeTitle));
predicate = predicate.AndIF(!string.IsNullOrEmpty(parm.NoticeType), m => m.NoticeType == parm.NoticeType); predicate = predicate.AndIF(!string.IsNullOrEmpty(parm.NoticeType), m => m.NoticeType == parm.NoticeType);
predicate = predicate.AndIF(!string.IsNullOrEmpty(parm.CreateBy), m => m.Create_by.Contains(parm.CreateBy) || m.Update_by.Contains(parm.CreateBy)); predicate = predicate.AndIF(!string.IsNullOrEmpty(parm.CreateBy), m => m.Create_by.Contains(parm.CreateBy) || m.Update_by.Contains(parm.CreateBy));
@@ -102,7 +98,7 @@ namespace ZR.Admin.WebApi.Controllers.System
} }
//从 Dto 映射到 实体 //从 Dto 映射到 实体
var modal = parm.Adapt<SysNotice>().ToCreate(HttpContext); var modal = parm.Adapt<SysNotice>().ToCreate(HttpContext);
modal.Create_by = User.Identity.Name; modal.Create_by = HttpContext.GetName();
modal.Create_time = DateTime.Now; modal.Create_time = DateTime.Now;
int result = _SysNoticeService.Insert(modal, it => new int result = _SysNoticeService.Insert(modal, it => new
@@ -143,7 +139,7 @@ namespace ZR.Admin.WebApi.Controllers.System
NoticeContent = model.NoticeContent, NoticeContent = model.NoticeContent,
Status = model.Status, Status = model.Status,
Remark = model.Remark, Remark = model.Remark,
Update_by = User.Identity.Name, Update_by = HttpContext.GetName(),
Update_time = DateTime.Now Update_time = DateTime.Now
}); });
@@ -10,6 +10,7 @@ using Infrastructure.Enums;
using Infrastructure; using Infrastructure;
using ZR.Service.System.IService; using ZR.Service.System.IService;
using ZR.Common; using ZR.Common;
using ZR.Admin.WebApi.Extensions;
namespace ZR.Admin.WebApi.Controllers.System namespace ZR.Admin.WebApi.Controllers.System
{ {
@@ -34,7 +35,6 @@ namespace ZR.Admin.WebApi.Controllers.System
[ActionPermissionFilter(Permission = "system:post:list")] [ActionPermissionFilter(Permission = "system:post:list")]
public IActionResult List([FromQuery] SysPost post, [FromQuery] PagerInfo pagerInfo) public IActionResult List([FromQuery] SysPost post, [FromQuery] PagerInfo pagerInfo)
{ {
//开始拼装查询条件
var predicate = Expressionable.Create<SysPost>(); var predicate = Expressionable.Create<SysPost>();
predicate = predicate.AndIF(post.Status.IfNotEmpty(), it => it.Status == post.Status); predicate = predicate.AndIF(post.Status.IfNotEmpty(), it => it.Status == post.Status);
var list = PostService.GetPages(predicate.ToExpression(), pagerInfo, s => new { s.PostSort }); var list = PostService.GetPages(predicate.ToExpression(), pagerInfo, s => new { s.PostSort });
@@ -73,7 +73,7 @@ namespace ZR.Admin.WebApi.Controllers.System
throw new CustomException($"修改岗位{post.PostName}失败,岗位编码已存在"); throw new CustomException($"修改岗位{post.PostName}失败,岗位编码已存在");
} }
post.Create_by = User.Identity.Name; post.Create_by = HttpContext.GetName();
return ToResponse(ToJson(PostService.Add(post))); return ToResponse(ToJson(PostService.Add(post)));
} }
@@ -95,7 +95,7 @@ namespace ZR.Admin.WebApi.Controllers.System
{ {
throw new CustomException($"修改岗位{post.PostName}失败,岗位编码已存在"); throw new CustomException($"修改岗位{post.PostName}失败,岗位编码已存在");
} }
post.Update_by = User.Identity.Name; post.Update_by = HttpContext.GetName();
return ToResponse(PostService.Update(post)); return ToResponse(PostService.Update(post));
} }
@@ -78,7 +78,6 @@ namespace ZR.Admin.WebApi.Controllers.System
{ {
throw new CustomException(ResultCode.PARAM_ERROR, "请求参数错误"); throw new CustomException(ResultCode.PARAM_ERROR, "请求参数错误");
} }
//从 Dto 映射到 实体
var user = userDto.Adapt<SysUser>().ToUpdate(HttpContext); var user = userDto.Adapt<SysUser>().ToUpdate(HttpContext);
int result = UserService.ChangeUser(user); int result = UserService.ChangeUser(user);
@@ -130,7 +129,7 @@ namespace ZR.Admin.WebApi.Controllers.System
LoginUser loginUser = Framework.JwtUtil.GetLoginUser(HttpContext); LoginUser loginUser = Framework.JwtUtil.GetLoginUser(HttpContext);
if (formFile == null) throw new CustomException("请选择文件"); if (formFile == null) throw new CustomException("请选择文件");
SysFile file = await FileService.SaveFileToLocal(hostEnvironment.WebRootPath, "", "", HttpContext.GetName(), formFile); SysFile file = await FileService.SaveFileToLocal(hostEnvironment.WebRootPath, "", "avatar", HttpContext.GetName(), formFile);
UserService.UpdatePhoto(new SysUser() { Avatar = file.AccessUrl, UserId = loginUser.UserId }); UserService.UpdatePhoto(new SysUser() { Avatar = file.AccessUrl, UserId = loginUser.UserId });
return SUCCESS(new { imgUrl = file.AccessUrl }); return SUCCESS(new { imgUrl = file.AccessUrl });
@@ -71,7 +71,7 @@ namespace ZR.Admin.WebApi.Controllers.System
return ToResponse(ApiResult.Error((int)ResultCode.CUSTOM_ERROR, $"新增角色'{sysRoleDto.RoleName}'失败,角色权限已存在")); return ToResponse(ApiResult.Error((int)ResultCode.CUSTOM_ERROR, $"新增角色'{sysRoleDto.RoleName}'失败,角色权限已存在"));
} }
sysRoleDto.Create_by = User.Identity.Name; sysRoleDto.Create_by = HttpContext.GetName();
long roleId = sysRoleService.InsertRole(sysRoleDto); long roleId = sysRoleService.InsertRole(sysRoleDto);
return ToResponse(ToJson(roleId)); return ToResponse(ToJson(roleId));
@@ -101,7 +101,7 @@ namespace ZR.Admin.WebApi.Controllers.System
return ToResponse(ApiResult.Error($"编辑角色'{sysRoleDto.RoleName}'失败,角色权限已存在")); return ToResponse(ApiResult.Error($"编辑角色'{sysRoleDto.RoleName}'失败,角色权限已存在"));
} }
} }
sysRoleDto.Update_by = User.Identity.Name; sysRoleDto.Update_by = HttpContext.GetName();
int upResult = sysRoleService.UpdateRole(sysRoleDto); int upResult = sysRoleService.UpdateRole(sysRoleDto);
if (upResult > 0) if (upResult > 0)
{ {
@@ -36,7 +36,6 @@ namespace ZR.Admin.WebApi.Controllers.System
[HttpGet("list")] [HttpGet("list")]
public IActionResult GetList([FromQuery] PagerInfo pager, [FromQuery] TasksLogQueryDto queryDto) public IActionResult GetList([FromQuery] PagerInfo pager, [FromQuery] TasksLogQueryDto queryDto)
{ {
//开始拼装查询条件
queryDto.BeginTime = DateTimeHelper.GetBeginTime(queryDto.BeginTime, -7); queryDto.BeginTime = DateTimeHelper.GetBeginTime(queryDto.BeginTime, -7);
queryDto.EndTime = DateTimeHelper.GetBeginTime(queryDto.EndTime, 7); queryDto.EndTime = DateTimeHelper.GetBeginTime(queryDto.EndTime, 7);
@@ -29,7 +29,6 @@ namespace ZR.Admin.WebApi.Controllers.monitor
/// <summary> /// <summary>
/// 查询登录日志 /// 查询登录日志
/// /monitor/logininfor/list
/// </summary> /// </summary>
/// <param name="sysLogininfoDto"></param> /// <param name="sysLogininfoDto"></param>
/// <param name="pagerInfo"></param> /// <param name="pagerInfo"></param>
@@ -44,7 +43,6 @@ namespace ZR.Admin.WebApi.Controllers.monitor
/// <summary> /// <summary>
/// 清空登录日志 /// 清空登录日志
/// /monitor/logininfor/clean
/// </summary> /// </summary>
/// <returns></returns> /// <returns></returns>
[Log(Title = "清空登录日志", BusinessType= BusinessType.CLEAN)] [Log(Title = "清空登录日志", BusinessType= BusinessType.CLEAN)]
@@ -61,7 +59,6 @@ namespace ZR.Admin.WebApi.Controllers.monitor
} }
/// <summary> /// <summary>
/// /monitor/logininfor/1
/// </summary> /// </summary>
/// <param name="infoIds"></param> /// <param name="infoIds"></param>
/// <returns></returns> /// <returns></returns>
+32 -5
View File
@@ -5,6 +5,7 @@ using System.Threading.Tasks;
using Infrastructure; using Infrastructure;
using Infrastructure.Constant; using Infrastructure.Constant;
using Infrastructure.Model; using Infrastructure.Model;
using IPTools.Core;
using Microsoft.AspNetCore.SignalR; using Microsoft.AspNetCore.SignalR;
using ZR.Admin.WebApi.Extensions; using ZR.Admin.WebApi.Extensions;
using ZR.Admin.WebApi.Framework; using ZR.Admin.WebApi.Framework;
@@ -19,8 +20,8 @@ namespace ZR.Admin.WebApi.Hubs
//创建用户集合,用于存储所有链接的用户数据 //创建用户集合,用于存储所有链接的用户数据
private static readonly List<OnlineUsers> clientUsers = new(); private static readonly List<OnlineUsers> clientUsers = new();
private readonly NLog.Logger logger = NLog.LogManager.GetCurrentClassLogger(); private readonly NLog.Logger logger = NLog.LogManager.GetCurrentClassLogger();
private ISysNoticeService SysNoticeService; private readonly ISysNoticeService SysNoticeService;
public MessageHub(ISysNoticeService noticeService) public MessageHub(ISysNoticeService noticeService)
{ {
SysNoticeService = noticeService; SysNoticeService = noticeService;
@@ -43,17 +44,23 @@ namespace ZR.Admin.WebApi.Hubs
{ {
var name = Context.User.Identity.Name; var name = Context.User.Identity.Name;
var ip = HttpContextExtension.GetClientUserIp(App.HttpContext); var ip = HttpContextExtension.GetClientUserIp(App.HttpContext);
var ip_info = IpTool.Search(ip);
LoginUser loginUser = JwtUtil.GetLoginUser(App.HttpContext); LoginUser loginUser = JwtUtil.GetLoginUser(App.HttpContext);
var user = clientUsers.Any(u => u.ConnnectionId == Context.ConnectionId); var user = clientUsers.Any(u => u.ConnnectionId == Context.ConnectionId);
//判断用户是否存在,否则添加集合 //判断用户是否存在,否则添加集合
if (!user && Context.User.Identity.IsAuthenticated) if (!user && Context.User.Identity.IsAuthenticated)
{ {
clientUsers.Add(new OnlineUsers(Context.ConnectionId, name, loginUser?.UserId, ip)); OnlineUsers users = new(Context.ConnectionId, name, loginUser?.UserId, ip)
{
Location = ip_info.City
};
clientUsers.Add(users);
Console.WriteLine($"{DateTime.Now}:{name},{Context.ConnectionId}连接服务端success,当前已连接{clientUsers.Count}个"); Console.WriteLine($"{DateTime.Now}:{name},{Context.ConnectionId}连接服务端success,当前已连接{clientUsers.Count}个");
//Clients.All.SendAsync("welcome", $"欢迎您:{name},当前时间:{DateTime.Now}"); //Clients.All.SendAsync("welcome", $"欢迎您:{name},当前时间:{DateTime.Now}");
Clients.All.SendAsync(HubsConstant.MoreNotice, SendNotice()); Clients.All.SendAsync(HubsConstant.MoreNotice, SendNotice());
} }
Clients.All.SendAsync(HubsConstant.OnlineNum, clientUsers.Count); Clients.All.SendAsync(HubsConstant.OnlineNum, clientUsers.Count);
Clients.All.SendAsync(HubsConstant.OnlineUser, clientUsers); Clients.All.SendAsync(HubsConstant.OnlineUser, clientUsers);
return base.OnConnectedAsync(); return base.OnConnectedAsync();
@@ -69,14 +76,34 @@ namespace ZR.Admin.WebApi.Hubs
//判断用户是否存在,否则添加集合 //判断用户是否存在,否则添加集合
if (user != null) if (user != null)
{ {
Console.WriteLine($"用户{user?.Name}离开了,当前已连接{clientUsers.Count}个");
clientUsers.Remove(user); clientUsers.Remove(user);
Clients.All.SendAsync(HubsConstant.OnlineNum, clientUsers.Count); Clients.All.SendAsync(HubsConstant.OnlineNum, clientUsers.Count);
Clients.All.SendAsync(HubsConstant.OnlineUser, clientUsers); Clients.All.SendAsync(HubsConstant.OnlineUser, clientUsers);
Console.WriteLine($"用户{user?.Name}离开了,当前已连接{clientUsers.Count}个");
} }
return base.OnDisconnectedAsync(exception); return base.OnDisconnectedAsync(exception);
} }
#endregion #endregion
/// <summary>
/// 注册信息
/// </summary>
/// <param name="connectId"></param>
/// <param name="userName"></param>
/// <param name="message"></param>
/// <returns></returns>
[HubMethodName("SendMessage")]
public async Task SendMessage(string connectId, string userName, string message)
{
Console.WriteLine($"{connectId},message={message}");
bool isDemoMode = AppSettings.GetAppConfig("DemoMode", true);
if (isDemoMode)
{
await Clients.Caller.SendAsync("receiveChat", new { userName, message = "当前环境为演示环境,消息不会发送给对方" });
return;
}
await Clients.Client(connectId).SendAsync("receiveChat", new { userName, message });
}
} }
} }
+1
View File
@@ -17,6 +17,7 @@ namespace ZR.Model
public string Name { get; set; } public string Name { get; set; }
public DateTime LoginTime { get; set; } public DateTime LoginTime { get; set; }
public string UserIP { get; set; } public string UserIP { get; set; }
public string Location { get; set; }
public OnlineUsers(string clientid, string name, long? userid, string userip) public OnlineUsers(string clientid, string name, long? userid, string userip)
{ {
@@ -106,16 +106,18 @@ namespace ZR.Admin.WebApi.Middleware
sysOperLog.jsonResult = logAttribute.IsSaveResponseData ? sysOperLog.jsonResult : ""; sysOperLog.jsonResult = logAttribute.IsSaveResponseData ? sysOperLog.jsonResult : "";
} }
} }
LogEventInfo ei = new(logLevel, "GlobalExceptionMiddleware", error); LogEventInfo ei = new(logLevel, "GlobalExceptionMiddleware", error)
{
ei.Exception = ex; Exception = ex,
ei.Message = error; Message = error
};
ei.Properties["status"] = 1;//走正常返回都是通过走GlobalExceptionFilter不通过 ei.Properties["status"] = 1;//走正常返回都是通过走GlobalExceptionFilter不通过
ei.Properties["jsonResult"] = responseResult; ei.Properties["jsonResult"] = responseResult;
ei.Properties["requestParam"] = sysOperLog.operParam; ei.Properties["requestParam"] = sysOperLog.operParam;
ei.Properties["user"] = HttpContextExtension.GetName(context); ei.Properties["user"] = HttpContextExtension.GetName(context);
Logger.Log(ei); Logger.Log(ei);
context.Response.ContentType = "text/json;charset=utf-8";
await context.Response.WriteAsync(responseResult, System.Text.Encoding.UTF8); await context.Response.WriteAsync(responseResult, System.Text.Encoding.UTF8);
SysOperLogService.InsertOperlog(sysOperLog); SysOperLogService.InsertOperlog(sysOperLog);
+4 -4
View File
@@ -14,10 +14,10 @@
<ItemGroup> <ItemGroup>
<PackageReference Include="AspNetCoreRateLimit" Version="4.0.2" /> <PackageReference Include="AspNetCoreRateLimit" Version="4.0.2" />
<PackageReference Include="EPPlus" Version="5.8.6" /> <PackageReference Include="EPPlus" Version="6.0.4" />
<PackageReference Include="Hei.Captcha" Version="0.3.0" /> <PackageReference Include="Hei.Captcha" Version="0.3.0" />
<PackageReference Include="IPTools.China" Version="1.6.0" /> <PackageReference Include="IPTools.China" Version="1.6.0" />
<PackageReference Include="CSRedisCore" Version="3.6.9" /> <PackageReference Include="CSRedisCore" Version="3.8.2" />
<PackageReference Include="Mapster" Version="7.3.0" /> <PackageReference Include="Mapster" Version="7.3.0" />
<PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="5.0.0" NoWarn="NU1605" /> <PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="5.0.0" NoWarn="NU1605" />
<PackageReference Include="NETCore.Encrypt" Version="2.1.0" /> <PackageReference Include="NETCore.Encrypt" Version="2.1.0" />
@@ -25,8 +25,8 @@
<PackageReference Include="NLog.Web.AspNetCore" Version="4.14.0" /> <PackageReference Include="NLog.Web.AspNetCore" Version="4.14.0" />
<PackageReference Include="Snowflake.Core" Version="2.0.0" /> <PackageReference Include="Snowflake.Core" Version="2.0.0" />
<PackageReference Include="SqlSugar.IOC" Version="1.8.0" /> <PackageReference Include="SqlSugar.IOC" Version="1.8.0" />
<PackageReference Include="Swashbuckle.AspNetCore" Version="6.3.0" /> <PackageReference Include="Swashbuckle.AspNetCore" Version="6.3.1" />
<PackageReference Include="Swashbuckle.AspNetCore.Filters" Version="7.0.2" /> <PackageReference Include="Swashbuckle.AspNetCore.Filters" Version="7.0.3" />
<PackageReference Include="UAParser" Version="3.1.47" /> <PackageReference Include="UAParser" Version="3.1.47" />
</ItemGroup> </ItemGroup>
+4 -32
View File
@@ -20,8 +20,8 @@
}, },
"DemoMode": false, //是否演示模式 "DemoMode": false, //是否演示模式
"Upload": { "Upload": {
"UploadUrl": "http://localhost:8888", "UploadUrl": "http://localhost:8888", //本地存储资源访问路径
"localSavePath": "" //本地上传文件存储目录/home/website/uploads "localSavePath": "uploads" //本地上传默认文件存储目录 wwwroot/uploads
}, },
//阿里云存储配置 //阿里云存储配置
"ALIYUN_OSS": { "ALIYUN_OSS": {
@@ -47,7 +47,8 @@
"Password": "123456", "Password": "123456",
//协议 //协议
"Smtp": "smtp.qq.com", "Smtp": "smtp.qq.com",
"Port": 587 "Port": 587,
"Signature": "系统邮件,请勿回复!"
}, },
//redis服务配置 //redis服务配置
"RedisServer": { "RedisServer": {
@@ -56,20 +57,12 @@
}, },
//接口请求限制 //接口请求限制
"IpRateLimiting": { "IpRateLimiting": {
//例如设置了5次每分钟访问限流。当False时:项目中每个接口都加入计数,不管你访问哪个接口,只要在一分钟内累计够5次,将禁止访问。
//True:当一分钟请求了5次GetData接口,则该接口将在时间段内禁止访问,但是还可以访问PostData()5次,总得来说是每个接口都有5次在这一分钟,互不干扰。
"EnableEndpointRateLimiting": true, "EnableEndpointRateLimiting": true,
//false,拒绝的API调用不会添加到调用次数计数器上;如 客户端每秒发出3个请求并且您设置了每秒一个调用的限制,则每分钟或每天计数器等其他限制将仅记录第一个调用,即成功的API调用。如果您希望被拒绝的API调用计入其他时间的显示(分钟,小时等)
//,则必须设置StackBlockedRequests为true。
"StackBlockedRequests": false, "StackBlockedRequests": false,
"RealIpHeader": "X-Real-IP", "RealIpHeader": "X-Real-IP",
//取白名单的客户端ID。如果此标头中存在客户端ID并且与ClientWhitelist中指定的值匹配,则不应用速率限制。
"ClientIdHeader": "X-ClientId", "ClientIdHeader": "X-ClientId",
"HttpStatusCode": 429, "HttpStatusCode": 429,
//端点白名单
"EndpointWhitelist": [ "post:/system/dict/data/types", "*:/msghub/negotiate", "*:/LogOut" ], "EndpointWhitelist": [ "post:/system/dict/data/types", "*:/msghub/negotiate", "*:/LogOut" ],
//客户端白名单
//"ClientWhitelist": [ "dev-id-1", "dev-id-2" ],
"QuotaExceededResponse": { "QuotaExceededResponse": {
"Content": "{{\"code\":429,\"msg\":\"访问过于频繁,请稍后重试\"}}", "Content": "{{\"code\":429,\"msg\":\"访问过于频繁,请稍后重试\"}}",
"ContentType": "application/json", "ContentType": "application/json",
@@ -95,27 +88,6 @@
"Period": "3s", "Period": "3s",
"Limit": 1 "Limit": 1
} }
//{
// "Endpoint": "*",
// //时间段,格式:{数字}{单位};可使用单位:s, m, h, d
// "Period": "1s",
// "Limit": 2
//}
//{
// "Endpoint": "*",
// "Period": "15m",
// "Limit": 100
//},
//{
// "Endpoint": "*",
// "Period": "12h",
// "Limit": 1000
//},
//{
// "Endpoint": "*",
// "Period": "7d",
// "Limit": 10000
//}
], ],
"IpRateLimitPolicies": { "IpRateLimitPolicies": {
//ip规则 //ip规则
@@ -90,7 +90,6 @@ $if(replaceDto.ShowBtnAdd)
{ {
throw new CustomException("请求参数错误"); throw new CustomException("请求参数错误");
} }
//从 Dto 映射到 实体
var modal = parm.Adapt<${replaceDto.ModelTypeName}>().ToCreate(HttpContext); var modal = parm.Adapt<${replaceDto.ModelTypeName}>().ToCreate(HttpContext);
var response = _${replaceDto.ModelTypeName}Service.Add${replaceDto.ModelTypeName}(modal); var response = _${replaceDto.ModelTypeName}Service.Add${replaceDto.ModelTypeName}(modal);
@@ -113,18 +112,9 @@ $if(replaceDto.ShowBtnEdit)
{ {
throw new CustomException("请求实体不能为空"); throw new CustomException("请求实体不能为空");
} }
//从 Dto 映射到 实体
var modal = parm.Adapt<${replaceDto.ModelTypeName}>().ToUpdate(HttpContext); var modal = parm.Adapt<${replaceDto.ModelTypeName}>().ToUpdate(HttpContext);
var response = _${replaceDto.ModelTypeName}Service.Update(w => w.${replaceDto.PKName} == modal.${replaceDto.PKName}, it => new ${replaceDto.ModelTypeName}() var response = _${replaceDto.ModelTypeName}Service.Update${replaceDto.ModelTypeName}(modal);
{
//Update 字段映射
$foreach(item in genTable.Columns)
$if((item.IsEdit))
$item.CsharpField = modal.$item.CsharpField,
$end
${end}
});
return ToResponse(response); return ToResponse(response);
} }
@@ -20,5 +20,7 @@ $if(genTable.TplCategory == "tree")
List<${replaceDto.ModelTypeName}> GetTreeList(${replaceDto.ModelTypeName}QueryDto parm); List<${replaceDto.ModelTypeName}> GetTreeList(${replaceDto.ModelTypeName}QueryDto parm);
$end $end
int Add${replaceDto.ModelTypeName}(${replaceDto.ModelTypeName} parm); int Add${replaceDto.ModelTypeName}(${replaceDto.ModelTypeName} parm);
int Update${replaceDto.ModelTypeName}(${replaceDto.ModelTypeName} parm);
} }
} }
@@ -38,12 +38,12 @@ $end
$if(genTable.TplCategory == "subNav" && genTable.SubTable != null) $if(genTable.TplCategory == "subNav" && genTable.SubTable != null)
[Navigate(NavigateType.Dynamic, null)] //自定义关系映射 [Navigate(NavigateType.Dynamic, null)] //自定义关系映射
public ${genTable.SubTable.ClassName} Sub { get; set; } public ${genTable.SubTable.ClassName} ${genTable.SubTable.ClassName} { get; set; }
$end $end
$if(genTable.TplCategory == "subNavMore" && genTable.SubTable != null) $if(genTable.TplCategory == "subNavMore" && genTable.SubTable != null)
[Navigate(NavigateType.Dynamic, null)] //自定义关系映射 [Navigate(NavigateType.Dynamic, null)] //自定义关系映射
public List<${genTable.SubTable.ClassName}> Sub { get; set; } public List<${genTable.SubTable.ClassName}> ${genTable.SubTable.ClassName} { get; set; }
$end $end
} }
} }
@@ -54,7 +54,7 @@ $end
var response = _${replaceDto.ModelTypeName}Repository var response = _${replaceDto.ModelTypeName}Repository
.Queryable() .Queryable()
$if(null != genTable.SubTableName && "" != genTable.SubTableName) $if(null != genTable.SubTableName && "" != genTable.SubTableName)
.Includes(it => it.Sub.MappingField(z => z.${genTable.SubTableFkName}, () => it.${replaceDto.PKName})) .Includes(it => it.${genTable.SubTable.ClassName}.MappingField(z => z.${genTable.SubTableFkName}, () => it.${replaceDto.PKName}))
$end $end
$if(genTable.Options.SortField != "" && genTable.Options.SortField != null) $if(genTable.Options.SortField != "" && genTable.Options.SortField != null)
.OrderBy("${genTable.Options.SortField} ${genTable.Options.SortType}") .OrderBy("${genTable.Options.SortField} ${genTable.Options.SortType}")
@@ -106,6 +106,24 @@ ${foreach(item in genTable.Columns)}
$if((item.IsInsert)) $if((item.IsInsert))
it.$item.CsharpField, it.$item.CsharpField,
$end $end
${end}
});
return response;
}
/// <summary>
/// 修改${genTable.FunctionName}
/// </summary>
/// <param name="parm"></param>
/// <returns></returns>
public int Update${replaceDto.ModelTypeName}(${replaceDto.ModelTypeName} parm)
{
var response = _${replaceDto.ModelTypeName}Repository.Update(w => w.${replaceDto.PKName} == parm.${replaceDto.PKName}, it => new ${replaceDto.ModelTypeName}()
{
$foreach(item in genTable.Columns)
$if((item.IsEdit))
$item.CsharpField = parm.$item.CsharpField,
$end
${end} ${end}
}); });
return response; return response;
@@ -8,7 +8,6 @@
--> -->
<template> <template>
<div> <div>
<!-- :model属性用于表单验证使用 比如下面的el-form-item 的 prop属性用于对表单值进行验证操作 -->
<el-form :model="queryParams" label-position="right" inline ref="queryRef" v-show="showSearch" @submit.prevent> <el-form :model="queryParams" label-position="right" inline ref="queryRef" v-show="showSearch" @submit.prevent>
$foreach(column in genTable.Columns) $foreach(column in genTable.Columns)
$set(labelName = "") $set(labelName = "")
@@ -41,13 +40,13 @@ $if(column.HtmlType == "datetime")
$elseif(column.HtmlType == "select" || column.HtmlType == "radio") $elseif(column.HtmlType == "select" || column.HtmlType == "radio")
<el-form-item label="${labelName}" prop="${columnName}"> <el-form-item label="${labelName}" prop="${columnName}">
<el-select v-model="queryParams.${columnName}" placeholder="请选择${labelName}"> <el-select v-model="queryParams.${columnName}" placeholder="请选择${labelName}">
<el-option v-for="item in $if(column.DictType != "") ${column.DictType} $else ${column.CsharpFieldFl}Options$end" :key="item.dictValue" :label="item.dictLabel" :value="item.dictValue"></el-option> <el-option v-for="item in $if(column.DictType != "") options.${column.DictType} $else options.${column.CsharpFieldFl}Options$end" :key="item.dictValue" :label="item.dictLabel" :value="item.dictValue"></el-option>
</el-select> </el-select>
</el-form-item> </el-form-item>
$elseif(column.HtmlType == "radio") $elseif(column.HtmlType == "radio")
<el-form-item label="${labelName}" prop="${columnName}"> <el-form-item label="${labelName}" prop="${columnName}">
<el-radio-group v-model="queryParams.${columnName}"> <el-radio-group v-model="queryParams.${columnName}">
<el-radio v-for="item in $if(column.DictType != "") ${column.DictType} $else ${column.CsharpFieldFl}Options$end" :key="item.dictValue" :label="item.dictValue">{{item.dictLabel}}</el-radio> <el-radio v-for="item in $if(column.DictType != "") options.${column.DictType} $else options.${column.CsharpFieldFl}Options$end" :key="item.dictValue" :label="item.dictValue">{{item.dictLabel}}</el-radio>
</el-radio-group> </el-radio-group>
</el-form-item> </el-form-item>
$else $else
@@ -136,9 +135,9 @@ $elseif(column.HtmlType == "checkbox" || column.HtmlType == "select" || column.H
<el-table-column prop="${columnName}" label="${labelName}" align="center"${column.sortStr}> <el-table-column prop="${columnName}" label="${labelName}" align="center"${column.sortStr}>
<template #default="scope"> <template #default="scope">
$if(column.HtmlType == "checkbox") $if(column.HtmlType == "checkbox")
<dict-tag :options="$if(column.DictType != "") ${column.DictType} $else ${column.CsharpFieldFl}Options$end" :value="scope.row.${columnName} ? scope.row.${columnName}.split(',') : []" /> <dict-tag :options="$if(column.DictType != "") options.${column.DictType} $else options.${column.CsharpFieldFl}Options$end" :value="scope.row.${columnName} ? scope.row.${columnName}.split(',') : []" />
$else $else
<dict-tag :options="$if(column.DictType != "") ${column.DictType} $else ${column.CsharpFieldFl}Options$end" :value="scope.row.${columnName}" /> <dict-tag :options="$if(column.DictType != "") options.${column.DictType} $else options.${column.CsharpFieldFl}Options$end" :value="scope.row.${columnName}" />
$end $end
</template> </template>
</el-table-column> </el-table-column>
@@ -200,7 +199,7 @@ $if(column.HtmlType == "inputNumber" || column.HtmlType == "customInput")
$elseif(column.HtmlType == "datetime") $elseif(column.HtmlType == "datetime")
<el-col :lg="${options.ColNum}"> <el-col :lg="${options.ColNum}">
<el-form-item label="${labelName}" prop="${columnName}"> <el-form-item label="${labelName}" prop="${columnName}">
<el-date-picker v-model="form.${columnName}" type="datetime" placeholder="选择日期时间"${column.DisabledStr}></el-date-picker> <el-date-picker v-model="form.${columnName}" type="datetime" :teleported="false" placeholder="选择日期时间"${column.DisabledStr}></el-date-picker>
</el-form-item> </el-form-item>
</el-col> </el-col>
$elseif(column.HtmlType == "imageUpload") $elseif(column.HtmlType == "imageUpload")
@@ -219,7 +218,7 @@ $elseif(column.HtmlType == "radio")
<el-col :lg="${options.ColNum}"> <el-col :lg="${options.ColNum}">
<el-form-item label="${labelName}" prop="${columnName}"> <el-form-item label="${labelName}" prop="${columnName}">
<el-radio-group v-model="form.${columnName}"${column.DisabledStr}> <el-radio-group v-model="form.${columnName}"${column.DisabledStr}>
<el-radio v-for="item in $if(column.DictType != "") ${column.DictType} $else ${column.CsharpFieldFl}Options$end" :key="item.dictValue" :label="${value}">{{item.dictLabel}}</el-radio> <el-radio v-for="item in $if(column.DictType != "") options.${column.DictType} $else options.${column.CsharpFieldFl}Options$end" :key="item.dictValue" :label="${value}">{{item.dictLabel}}</el-radio>
</el-radio-group> </el-radio-group>
</el-form-item> </el-form-item>
</el-col> </el-col>
@@ -239,7 +238,7 @@ $elseif(column.HtmlType == "select")
<el-col :lg="${options.ColNum}"> <el-col :lg="${options.ColNum}">
<el-form-item label="${labelName}" prop="${columnName}"> <el-form-item label="${labelName}" prop="${columnName}">
<el-select v-model="form.${columnName}" placeholder="请选择${labelName}"${column.DisabledStr}> <el-select v-model="form.${columnName}" placeholder="请选择${labelName}"${column.DisabledStr}>
<el-option v-for="item in $if(column.DictType != "") ${column.DictType} $else ${column.CsharpFieldFl}Options$end" :key="item.dictValue" :label="item.dictLabel" :value="${value}"></el-option> <el-option v-for="item in $if(column.DictType != "") options.${column.DictType} $else options.${column.CsharpFieldFl}Options$end" :key="item.dictValue" :label="item.dictLabel" :value="${value}"></el-option>
</el-select> </el-select>
</el-form-item> </el-form-item>
</el-col> </el-col>
@@ -247,7 +246,7 @@ $elseif(column.HtmlType == "checkbox")
<el-col :lg="24"> <el-col :lg="24">
<el-form-item label="${labelName}" prop="${columnName}"> <el-form-item label="${labelName}" prop="${columnName}">
<el-checkbox-group v-model="form.${columnName}Checked"${column.DisabledStr}> <el-checkbox-group v-model="form.${columnName}Checked"${column.DisabledStr}>
<el-checkbox v-for="item in $if(column.DictType != "") ${column.DictType} $else ${column.CsharpFieldFl}Options$end" :key="item.dictValue" :label="item.dictValue">{{item.dictLabel}}</el-checkbox> <el-checkbox v-for="item in $if(column.DictType != "") options.${column.DictType} $else options.${column.CsharpFieldFl}Options$end" :key="item.dictValue" :label="item.dictValue">{{item.dictLabel}}</el-checkbox>
</el-checkbox-group> </el-checkbox-group>
</el-form-item> </el-form-item>
</el-col> </el-col>
@@ -273,8 +272,7 @@ $end
<script setup name="${genTable.BusinessName.ToLower()}"> <script setup name="${genTable.BusinessName.ToLower()}">
import { list${genTable.BusinessName}, add${genTable.BusinessName}, del${genTable.BusinessName}, update${genTable.BusinessName}, get${genTable.BusinessName}, import { list${genTable.BusinessName}, add${genTable.BusinessName}, del${genTable.BusinessName}, update${genTable.BusinessName}, get${genTable.BusinessName},$if(replaceDto.ShowBtnExport) export${genTable.BusinessName}, $end $if(showCustomInput) changeSort $end } from '@/api/${tool.FirstLowerCase(genTable.ModuleName)}/${genTable.BusinessName.ToLower()}.js'
$if(replaceDto.ShowBtnExport) export${genTable.BusinessName}, $end $if(showCustomInput) changeSort $end } from '@/api/${tool.FirstLowerCase(genTable.ModuleName)}/${genTable.BusinessName.ToLower()}.js'
const { proxy } = getCurrentInstance() const { proxy } = getCurrentInstance()
// 选中${replaceDto.FistLowerPk}数组数组 // 选中${replaceDto.FistLowerPk}数组数组
@@ -283,11 +281,8 @@ const ids = ref([])
const single = ref(true) const single = ref(true)
// 非多个禁用 // 非多个禁用
const multiple = ref(true) const multiple = ref(true)
// 遮罩层
const loading = ref(false) const loading = ref(false)
// 显示搜索条件
const showSearch = ref(true) const showSearch = ref(true)
// 查询参数
const queryParams = reactive({ const queryParams = reactive({
pageNum: 1, pageNum: 1,
pageSize: 10, pageSize: 10,
@@ -299,13 +294,11 @@ $if(item.IsQuery == true)
$end $end
$end $end
}) })
// 弹出层标题
const title = ref("") const title = ref("")
// 操作类型 1、add 2、edit // 操作类型 1、add 2、edit 3、view
const opertype = ref(0) const opertype = ref(0)
// 是否显示弹出层
const open = ref(false) const open = ref(false)
// 表单参数
const state = reactive({ const state = reactive({
form: {}, form: {},
rules: { rules: {
@@ -314,28 +307,31 @@ $if(column.IsRequired && column.IsIncrement == false)
${column.CsharpFieldFl}: [{ required: true, message: "${column.ColumnComment}不能为空", trigger: $if(column.htmlType == "select")"change"$else"blur"$end ${column.CsharpFieldFl}: [{ required: true, message: "${column.ColumnComment}不能为空", trigger: $if(column.htmlType == "select")"change"$else"blur"$end
$if(column.CsharpType == "int" || column.CsharpType == "long"), type: "number"$end }], $if(column.CsharpType == "int" || column.CsharpType == "long"), type: "number"$end }],
$end $end
$end
},
options: {
$foreach(column in genTable.Columns)
$if((column.HtmlType == "radio" || column.HtmlType == "select" || column.HtmlType == "checkbox"))
// $if(column.ColumnComment != "") ${column.ColumnComment} $else ${column.CsharpFieldFl}$end选项列表 格式 eg:{ dictLabel: '标签', dictValue: '0'}
$if(column.DictType != "")${column.DictType}$else${column.CsharpFieldFl}Options$end: [],
$end
$end $end
} }
}) })
const { form, rules } = toRefs(state) const { form, rules, options } = toRefs(state)
// 总记录数
const total = ref(0) const total = ref(0)
const dataList = ref([]) const dataList = ref([])
const queryRef = ref() const queryRef = ref()
const formRef = ref() const formRef = ref()
$foreach(item in genTable.Columns) $foreach(item in genTable.Columns)
$if((item.HtmlType == "radio" || item.HtmlType == "select" || item.HtmlType == "checkbox")) $if(item.HtmlType == "datetime" && item.IsQuery == true)
// ${item.ColumnComment}选项列表 格式 eg:{ dictLabel: '标签', dictValue: '0'}
const $if(item.DictType != "")${item.DictType}$else${item.CsharpFieldFl}Options$end = ref([])
$elseif(item.HtmlType == "datetime" && item.IsQuery == true)
// ${item.ColumnComment}时间范围 // ${item.ColumnComment}时间范围
const dateRange${item.CsharpField} = ref([]) const dateRange${item.CsharpField} = ref([])
$elseif(item.HtmlType == "customInput") $elseif(item.HtmlType == "customInput")
// ******************自定义编辑 start ********************** // ******************自定义编辑 start **********************
const editIndex = ref(-1) const editIndex = ref(-1)
// 动态ref设置值
const columnRefs = ref([]) const columnRefs = ref([])
const setColumnsRef = (el) => { const setColumnsRef = (el) => {
if (el) { if (el) {
@@ -381,7 +377,7 @@ $end
$if(index > 0) $if(index > 0)
proxy.getDicts(dictParams).then((response) => { proxy.getDicts(dictParams).then((response) => {
response.data.forEach((element) => { response.data.forEach((element) => {
proxy[element.dictType] = element.list state.options[element.dictType] = element.list
}) })
}) })
$end $end
+11 -10
View File
@@ -48,16 +48,17 @@ namespace ZR.CodeGenerator
string PKName = "Id"; string PKName = "Id";
string PKType = "int"; string PKType = "int";
ReplaceDto replaceDto = new(); ReplaceDto replaceDto = new()
replaceDto.ModelTypeName = dto.GenTable.ClassName;//表名对应C# 实体类名 {
replaceDto.PermissionPrefix = dto.GenTable?.Options?.PermissionPrefix; ModelTypeName = dto.GenTable.ClassName,//表名对应C# 实体类名
replaceDto.Author = dto.GenTable.FunctionAuthor; PermissionPrefix = dto.GenTable?.Options?.PermissionPrefix,
replaceDto.ShowBtnAdd = dto.GenTable.Options.CheckedBtn.Any(f => f == 1); Author = dto.GenTable.FunctionAuthor,
replaceDto.ShowBtnEdit = dto.GenTable.Options.CheckedBtn.Any(f => f == 2); ShowBtnAdd = dto.GenTable.Options.CheckedBtn.Any(f => f == 1),
replaceDto.ShowBtnDelete = dto.GenTable.Options.CheckedBtn.Any(f => f == 3); ShowBtnEdit = dto.GenTable.Options.CheckedBtn.Any(f => f == 2),
replaceDto.ShowBtnExport = dto.GenTable.Options.CheckedBtn.Any(f => f == 4); ShowBtnDelete = dto.GenTable.Options.CheckedBtn.Any(f => f == 3),
replaceDto.ShowBtnView = dto.GenTable.Options.CheckedBtn.Any(f => f == 5); ShowBtnExport = dto.GenTable.Options.CheckedBtn.Any(f => f == 4),
ShowBtnView = dto.GenTable.Options.CheckedBtn.Any(f => f == 5)
};
//循环表字段信息 //循环表字段信息
foreach (GenTableColumn dbFieldInfo in dto.GenTable.Columns.OrderBy(x => x.Sort)) foreach (GenTableColumn dbFieldInfo in dto.GenTable.Columns.OrderBy(x => x.Sort))
+1 -1
View File
@@ -12,6 +12,6 @@
<ItemGroup> <ItemGroup>
<PackageReference Include="JinianNet.JNTemplate" Version="2.3.0" /> <PackageReference Include="JinianNet.JNTemplate" Version="2.3.0" />
<PackageReference Include="SqlSugarCoreNoDrive" Version="5.0.8" /> <PackageReference Include="SqlSugarCoreNoDrive" Version="5.0.9.1" />
</ItemGroup> </ItemGroup>
</Project> </Project>
+14 -11
View File
@@ -27,10 +27,13 @@ namespace ZR.Common
/// </summary> /// </summary>
public int Port { get; set; } = 587; public int Port { get; set; } = 587;
/// <summary> /// <summary>
/// 邮件签名
/// </summary>
public string Signature { get; set; }
/// <summary>
/// 是否使用SSL协议 /// 是否使用SSL协议
/// </summary> /// </summary>
public bool UseSsl { get; set; } = false; public bool UseSsl { get; set; } = false;
public string mailSign = @"邮件来自C# 程序发送";
private readonly MailOptions mailOptions = new(); private readonly MailOptions mailOptions = new();
public MailHelper() public MailHelper()
@@ -56,7 +59,7 @@ namespace ZR.Common
} }
/// <summary> /// <summary>
/// 发送一个人 /// 发送一个
/// </summary> /// </summary>
/// <param name="toAddress"></param> /// <param name="toAddress"></param>
/// <param name="subject"></param> /// <param name="subject"></param>
@@ -105,8 +108,8 @@ namespace ZR.Common
//收件人 //收件人
message.To.AddRange(toAddress); message.To.AddRange(toAddress);
message.Subject = subject; message.Subject = subject;
//message.Date = DateTime.Now; message.Date = DateTime.Now;
//创建附件Multipart //创建附件Multipart
Multipart multipart = new Multipart("mixed"); Multipart multipart = new Multipart("mixed");
var alternative = new MultipartAlternative(); var alternative = new MultipartAlternative();
@@ -120,14 +123,14 @@ namespace ZR.Common
alternative.Add(Html); alternative.Add(Html);
} }
//文本内容 //文本内容
if (!string.IsNullOrEmpty(text)) //if (!string.IsNullOrEmpty(text))
//{
var plain = new TextPart(TextFormat.Plain)
{ {
var plain = new TextPart(TextFormat.Plain) Text = text + "\r\n\n\n" + mailOptions.Signature
{ };
Text = text + "\r\n\n\n" + mailSign alternative.Add(plain);
}; //}
alternative.Add(plain);
}
//附件 //附件
if (!string.IsNullOrEmpty(path)) if (!string.IsNullOrEmpty(path))
+3 -3
View File
@@ -6,9 +6,9 @@
<ItemGroup> <ItemGroup>
<PackageReference Include="Aliyun.OSS.SDK.NetCore" Version="2.13.0" /> <PackageReference Include="Aliyun.OSS.SDK.NetCore" Version="2.13.0" />
<PackageReference Include="CSRedisCore" Version="3.6.9" /> <PackageReference Include="CSRedisCore" Version="3.8.2" />
<PackageReference Include="EPPlus" Version="5.8.6" /> <PackageReference Include="EPPlus" Version="6.0.4" />
<PackageReference Include="MailKit" Version="3.1.1" /> <PackageReference Include="MailKit" Version="3.3.0" />
<PackageReference Include="Microsoft.Extensions.Caching.Memory" Version="5.0.0" /> <PackageReference Include="Microsoft.Extensions.Caching.Memory" Version="5.0.0" />
</ItemGroup> </ItemGroup>
+1 -1
View File
@@ -14,7 +14,7 @@ namespace ZR.Model.System.Dto
/// <summary> /// <summary>
/// 父菜单ID /// 父菜单ID
/// </summary> /// </summary>
public long parentId { get; set; } public long? parentId { get; set; }
/// <summary> /// <summary>
/// 显示顺序 /// 显示顺序
+2 -1
View File
@@ -56,7 +56,8 @@ namespace ZR.Model.System
public static string LAYOUT = "Layout"; public static string LAYOUT = "Layout";
/** ParentView组件标识 */ /** ParentView组件标识 */
public static string PARENT_VIEW = "ParentView"; public static string PARENT_VIEW = "ParentView";
/** InnerLink组件标识 */
public static string INNER_LINK = "InnerLink";
/** 校验返回结果码 */ /** 校验返回结果码 */
public static string UNIQUE = "0"; public static string UNIQUE = "0";
public static string NOT_UNIQUE = "1"; public static string NOT_UNIQUE = "1";
+14 -1
View File
@@ -39,19 +39,32 @@ namespace ZR.Model.System.Vo
/// </summary> /// </summary>
public bool NoCache { get; set; } public bool NoCache { get; set; }
public string TitleKey { get; set; } = string.Empty; public string TitleKey { get; set; } = string.Empty;
public string Link { get; set; } = string.Empty;
public Meta(string title, string icon)
{
Title = title;
Icon = icon;
}
public Meta(string title, string icon, string path)
{
Title = title;
Icon = icon;
Link = path;
}
public Meta(string title, string icon, bool noCache) public Meta(string title, string icon, bool noCache)
{ {
Title = title; Title = title;
Icon = icon; Icon = icon;
NoCache = noCache; NoCache = noCache;
} }
public Meta(string title, string icon, bool noCache, string titleKey) public Meta(string title, string icon, bool noCache, string titleKey, string path)
{ {
Title = title; Title = title;
Icon = icon; Icon = icon;
NoCache = noCache; NoCache = noCache;
TitleKey = titleKey; TitleKey = titleKey;
Link = path;
} }
} }
} }
+2 -2
View File
@@ -5,9 +5,9 @@
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="EPPlus" Version="5.8.6" /> <PackageReference Include="EPPlus" Version="6.0.4" />
<PackageReference Include="Newtonsoft.Json" Version="13.0.1" /> <PackageReference Include="Newtonsoft.Json" Version="13.0.1" />
<PackageReference Include="SqlSugarCoreNoDrive" Version="5.0.8" /> <PackageReference Include="SqlSugarCoreNoDrive" Version="5.0.9.1" />
<PackageReference Include="System.ComponentModel.Annotations" Version="5.0.0" /> <PackageReference Include="System.ComponentModel.Annotations" Version="5.0.0" />
</ItemGroup> </ItemGroup>
+1 -1
View File
@@ -14,7 +14,7 @@
<PackageReference Include="MySql.Data" Version="8.0.29" /> <PackageReference Include="MySql.Data" Version="8.0.29" />
<PackageReference Include="NETCore.Encrypt" Version="2.1.0" /> <PackageReference Include="NETCore.Encrypt" Version="2.1.0" />
<PackageReference Include="SqlSugar.IOC" Version="1.8.0" /> <PackageReference Include="SqlSugar.IOC" Version="1.8.0" />
<PackageReference Include="SqlSugarCoreNoDrive" Version="5.0.8" /> <PackageReference Include="SqlSugarCoreNoDrive" Version="5.0.9.1" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
+37 -5
View File
@@ -1,12 +1,13 @@
using Infrastructure.Attribute; using Infrastructure.Attribute;
using SqlSugar; using SqlSugar;
using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using ZR.Model; using ZR.Model;
using ZR.Model.Dto; using ZR.Model.Dto;
using ZR.Model.Models; using ZR.Model.Models;
using ZR.Repository; using ZR.Repository;
using ZR.Service.System.ISystemService; using ZR.Service.System.IService;
namespace ZR.Service.System namespace ZR.Service.System
{ {
@@ -40,7 +41,6 @@ namespace ZR.Service.System
//搜索条件查询语法参考Sqlsugar //搜索条件查询语法参考Sqlsugar
predicate = predicate.AndIF(!string.IsNullOrEmpty(parm.LangCode), it => it.LangCode == parm.LangCode); predicate = predicate.AndIF(!string.IsNullOrEmpty(parm.LangCode), it => it.LangCode == parm.LangCode);
predicate = predicate.AndIF(!string.IsNullOrEmpty(parm.LangKey), it => it.LangKey.Contains(parm.LangKey)); predicate = predicate.AndIF(!string.IsNullOrEmpty(parm.LangKey), it => it.LangKey.Contains(parm.LangKey));
//predicate = predicate.AndIF(parm.BeginAddtime == null, it => it.Addtime >= DateTime.Now.AddDays(-1));
predicate = predicate.AndIF(parm.BeginAddtime != null, it => it.Addtime >= parm.BeginAddtime && it.Addtime <= parm.EndAddtime); predicate = predicate.AndIF(parm.BeginAddtime != null, it => it.Addtime >= parm.BeginAddtime && it.Addtime <= parm.EndAddtime);
var response = _CommonLangrepository var response = _CommonLangrepository
.Queryable() .Queryable()
@@ -62,7 +62,6 @@ namespace ZR.Service.System
//搜索条件查询语法参考Sqlsugar //搜索条件查询语法参考Sqlsugar
predicate = predicate.AndIF(!string.IsNullOrEmpty(parm.LangCode), it => it.LangCode == parm.LangCode); predicate = predicate.AndIF(!string.IsNullOrEmpty(parm.LangCode), it => it.LangCode == parm.LangCode);
predicate = predicate.AndIF(!string.IsNullOrEmpty(parm.LangKey), it => it.LangKey.Contains(parm.LangKey)); predicate = predicate.AndIF(!string.IsNullOrEmpty(parm.LangKey), it => it.LangKey.Contains(parm.LangKey));
//predicate = predicate.AndIF(parm.BeginAddtime == null, it => it.Addtime >= DateTime.Now.AddDays(-1));
predicate = predicate.AndIF(parm.BeginAddtime != null, it => it.Addtime >= parm.BeginAddtime && it.Addtime <= parm.EndAddtime); predicate = predicate.AndIF(parm.BeginAddtime != null, it => it.Addtime >= parm.BeginAddtime && it.Addtime <= parm.EndAddtime);
var response = _CommonLangrepository var response = _CommonLangrepository
.Queryable() .Queryable()
@@ -79,14 +78,47 @@ namespace ZR.Service.System
//搜索条件查询语法参考Sqlsugar //搜索条件查询语法参考Sqlsugar
predicate = predicate.AndIF(!string.IsNullOrEmpty(parm.LangCode), it => it.LangCode == parm.LangCode); predicate = predicate.AndIF(!string.IsNullOrEmpty(parm.LangCode), it => it.LangCode == parm.LangCode);
//predicate = predicate.AndIF(!string.IsNullOrEmpty(parm.LangKey), it => it.LangKey.Contains(parm.LangKey)); //predicate = predicate.AndIF(!string.IsNullOrEmpty(parm.LangKey), it => it.LangKey.Contains(parm.LangKey));
//predicate = predicate.AndIF(parm.BeginAddtime == null, it => it.Addtime >= DateTime.Now.AddDays(-1));
//predicate = predicate.AndIF(parm.BeginAddtime != null, it => it.Addtime >= parm.BeginAddtime && it.Addtime <= parm.EndAddtime);
var response = _CommonLangrepository var response = _CommonLangrepository
.Queryable() .Queryable()
.Where(predicate.ToExpression()) .Where(predicate.ToExpression())
.ToList(); .ToList();
return response; return response;
} }
public void StorageCommonLang(CommonLangDto parm)
{
List<CommonLang> langs = new();
foreach (var item in parm.LangList)
{
langs.Add(new CommonLang()
{
Addtime = DateTime.Now,
LangKey = parm.LangKey,
LangCode = item.LangCode,
LangName = item.LangName,
});
}
var storage = _CommonLangrepository.Storageable(langs)
.WhereColumns(it => new { it.LangKey, it.LangCode })
.ToStorage();
storage.AsInsertable.ExecuteReturnSnowflakeIdList();//执行插入
storage.AsUpdateable.UpdateColumns(it => new { it.LangName }).ExecuteCommand();//执行修改
}
public Dictionary<string, object> SetLang(List<CommonLang> msgList)
{
Dictionary<string, object> dic = new();
foreach (var item in msgList)
{
if (!dic.ContainsKey(item.LangKey))
{
dic.Add(item.LangKey, item.LangName);
}
}
return dic;
}
#endregion #endregion
} }
} }
+1 -1
View File
@@ -58,7 +58,7 @@ namespace ZR.Service.System
var info = GenTableRepository.GetId(tableId); var info = GenTableRepository.GetId(tableId);
if (info != null && !info.SubTableName.IsEmpty()) if (info != null && !info.SubTableName.IsEmpty())
{ {
info.SubTable = GenTableRepository.Queryable().Where(f => f.SubTableName == info.TableName).First(); info.SubTable = GenTableRepository.Queryable().Where(f => f.TableName == info.SubTableName).First();
} }
return info; return info;
} }
@@ -4,7 +4,7 @@ using ZR.Model.Dto;
using ZR.Model.Models; using ZR.Model.Models;
using System.Collections.Generic; using System.Collections.Generic;
namespace ZR.Service.System.ISystemService namespace ZR.Service.System.IService
{ {
/// <summary> /// <summary>
/// 多语言配置service接口 /// 多语言配置service接口
@@ -17,5 +17,7 @@ namespace ZR.Service.System.ISystemService
PagedInfo<CommonLang> GetList(CommonLangQueryDto parm); PagedInfo<CommonLang> GetList(CommonLangQueryDto parm);
List<CommonLang> GetLangList(CommonLangQueryDto parm); List<CommonLang> GetLangList(CommonLangQueryDto parm);
dynamic GetListToPivot(CommonLangQueryDto parm); dynamic GetListToPivot(CommonLangQueryDto parm);
void StorageCommonLang(CommonLangDto parm);
Dictionary<string, object> SetLang(List<CommonLang> msgList);
} }
} }
+14 -15
View File
@@ -1,18 +1,17 @@
using Infrastructure.Attribute; using Infrastructure;
using Microsoft.AspNetCore.Http; using Infrastructure.Attribute;
using System.IO;
using ZR.Service.System.IService;
using ZR.Common;
using Infrastructure;
using System;
using System.Text;
using System.Security.Cryptography;
using System.Net;
using ZR.Model.System;
using ZR.Repository.System;
using Infrastructure.Extensions; using Infrastructure.Extensions;
using System.Threading.Tasks; using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Options; using Microsoft.Extensions.Options;
using System;
using System.IO;
using System.Net;
using System.Security.Cryptography;
using System.Text;
using System.Threading.Tasks;
using ZR.Common;
using ZR.Model.System;
using ZR.Service.System.IService;
namespace ZR.Service.System namespace ZR.Service.System
{ {
@@ -44,7 +43,7 @@ namespace ZR.Service.System
{ {
string fileExt = Path.GetExtension(formFile.FileName); string fileExt = Path.GetExtension(formFile.FileName);
fileName = (fileName.IsEmpty() ? HashFileName() : fileName) + fileExt; fileName = (fileName.IsEmpty() ? HashFileName() : fileName) + fileExt;
string filePath = GetdirPath(fileDir); string filePath = GetdirPath(fileDir);
string finalFilePath = Path.Combine(rootPath, filePath, fileName); string finalFilePath = Path.Combine(rootPath, filePath, fileName);
double fileSize = Math.Round(formFile.Length / 1024.0, 2); double fileSize = Math.Round(formFile.Length / 1024.0, 2);
@@ -58,7 +57,7 @@ namespace ZR.Service.System
{ {
await formFile.CopyToAsync(stream); await formFile.CopyToAsync(stream);
} }
string uploadUrl = SysConfigService.GetSysConfigByKey("sys.file.uploadUrl")?.ConfigValue ?? OptionsSetting.Upload.UploadUrl; string uploadUrl = OptionsSetting.Upload.UploadUrl;
string accessPath = string.Concat(uploadUrl, "/", filePath.Replace("\\", "/"), "/", fileName); string accessPath = string.Concat(uploadUrl, "/", filePath.Replace("\\", "/"), "/", fileName);
SysFile file = new(formFile.FileName, fileName, fileExt, fileSize + "kb", filePath, userName) SysFile file = new(formFile.FileName, fileName, fileExt, fileSize + "kb", filePath, userName)
{ {
+35 -15
View File
@@ -8,6 +8,7 @@ using ZR.Model.Vo.System;
using ZR.Repository.System; using ZR.Repository.System;
using ZR.Service.System.IService; using ZR.Service.System.IService;
using ZR.Common; using ZR.Common;
using Infrastructure.Extensions;
namespace ZR.Service namespace ZR.Service
{ {
@@ -86,7 +87,7 @@ namespace ZR.Service
var list = MenuRepository.GetList(f => f.parentId == menuId).OrderBy(f => f.orderNum).ToList(); var list = MenuRepository.GetList(f => f.parentId == menuId).OrderBy(f => f.orderNum).ToList();
Context.ThenMapper(list, item => Context.ThenMapper(list, item =>
{ {
item.SubNum = Context.Queryable<SysMenu>().SetContext(x => x.parentId, () => item.MenuId, item).Count(); item.SubNum = Context.Queryable<SysMenu>().SetContext(x => x.parentId, () => item.MenuId, item).Count;
}); });
return list; return list;
} }
@@ -281,13 +282,13 @@ namespace ZR.Service
foreach (var menu in menus) foreach (var menu in menus)
{ {
RouterVo router = new RouterVo RouterVo router = new()
{ {
Hidden = "1".Equals(menu.visible), Hidden = "1".Equals(menu.visible),
Name = GetRouteName(menu), Name = GetRouteName(menu),
Path = GetRoutePath(menu), Path = GetRoutePath(menu),
Component = GetComponent(menu), Component = GetComponent(menu),
Meta = new Meta(menu.MenuName, menu.icon, "1".Equals(menu.isCache), menu.MenuNameKey) Meta = new Meta(menu.MenuName, menu.icon, "1".Equals(menu.isCache), menu.MenuNameKey, menu.path)
}; };
List<SysMenu> cMenus = menu.children; List<SysMenu> cMenus = menu.children;
@@ -300,17 +301,32 @@ namespace ZR.Service
} }
else if (IsMeunFrame(menu)) else if (IsMeunFrame(menu))
{ {
List<RouterVo> childrenList = new List<RouterVo>(); router.Meta = null;
RouterVo children = new RouterVo List<RouterVo> childrenList = new();
RouterVo children = new()
{ {
Path = menu.path, Path = menu.path,
Component = menu.component, Component = menu.component,
Name = string.IsNullOrEmpty(menu.path) ? "" : menu.path.ToLower(), Name = string.IsNullOrEmpty(menu.path) ? "" : menu.path.ToLower(),
Meta = new Meta(menu.MenuName, menu.icon, "1".Equals(menu.isCache), menu.MenuNameKey) Meta = new Meta(menu.MenuName, menu.icon, "1".Equals(menu.isCache), menu.MenuNameKey, menu.path)
}; };
childrenList.Add(children); childrenList.Add(children);
router.Children = childrenList; router.Children = childrenList;
} }
else if (menu.parentId == 0 && IsInnerLink(menu))
{
router.Meta = new Meta(menu.MenuName, menu.icon);
router.Path = "/";
List<RouterVo> childrenList = new();
RouterVo children = new();
string routerPath = InnerLinkReplaceEach(menu.path);
children.Path = routerPath;
children.Component = UserConstants.INNER_LINK;
children.Name = routerPath.ToLower();
children.Meta = new Meta(menu.MenuName, menu.icon, menu.path);
childrenList.Add(children);
router.Children = childrenList;
}
routers.Add(router); routers.Add(router);
} }
@@ -384,10 +400,10 @@ namespace ZR.Service
{ {
string routerPath = menu.path; string routerPath = menu.path;
// 内链打开外网方式 // 内链打开外网方式
//if (menu.parentId != 0 && IsInnerLink(menu)) if (menu.parentId != 0 && IsInnerLink(menu))
//{ {
// routerPath = innerLinkReplaceEach(routerPath); routerPath = InnerLinkReplaceEach(routerPath);
//} }
// 非外链并且是一级目录(类型为目录) // 非外链并且是一级目录(类型为目录)
if (0 == menu.parentId && UserConstants.TYPE_DIR.Equals(menu.menuType) if (0 == menu.parentId && UserConstants.TYPE_DIR.Equals(menu.menuType)
&& UserConstants.NO_FRAME.Equals(menu.isFrame)) && UserConstants.NO_FRAME.Equals(menu.isFrame))
@@ -413,6 +429,10 @@ namespace ZR.Service
{ {
component = menu.component; component = menu.component;
} }
else if (menu.component.IsEmpty() && menu.parentId != 0 && IsInnerLink(menu))
{
component = UserConstants.INNER_LINK;
}
else if (string.IsNullOrEmpty(menu.component) && IsParentView(menu)) else if (string.IsNullOrEmpty(menu.component) && IsParentView(menu))
{ {
component = UserConstants.PARENT_VIEW; component = UserConstants.PARENT_VIEW;
@@ -451,16 +471,16 @@ namespace ZR.Service
{ {
return menu.parentId != 0 && UserConstants.TYPE_DIR.Equals(menu.menuType); return menu.parentId != 0 && UserConstants.TYPE_DIR.Equals(menu.menuType);
} }
/// <summary> /// <summary>
/// 内链域名特殊字符替换 /// 内链域名特殊字符替换
/// </summary> /// </summary>
/// <param name = "path" ></ param > /// <param name = "path" ></ param >
/// < returns ></ returns > /// < returns ></ returns >
//public string innerLinkReplaceEach(string path) public string InnerLinkReplaceEach(string path)
//{ {
// return stringUtils.replaceEach(path, new String[] { Constants.HTTP, Constants.HTTPS }, return path.IsNotEmpty() ? path.Replace(UserConstants.HTTP, "").Replace(UserConstants.HTTPS, "") : path;
// new String[] { "", "" }); }
//}
#endregion #endregion
} }
+6 -1
View File
@@ -16,6 +16,7 @@ namespace ZR.Tasks.TaskScheduler
internal class Job_HttpRequest : JobBase, IJob internal class Job_HttpRequest : JobBase, IJob
{ {
private readonly ISysTasksQzService tasksQzService; private readonly ISysTasksQzService tasksQzService;
private readonly NLog.Logger logger = NLog.LogManager.GetCurrentClassLogger();
public Job_HttpRequest(ISysTasksQzService tasksQzService) public Job_HttpRequest(ISysTasksQzService tasksQzService)
{ {
@@ -32,7 +33,11 @@ namespace ZR.Tasks.TaskScheduler
if (info != null) if (info != null)
{ {
var result = await HttpHelper.HttpGetAsync("http://" + info.ApiUrl); var result = await HttpHelper.HttpGetAsync("http://" + info.ApiUrl);
Console.WriteLine(result); logger.Info($"任务【{info.Name}】网络请求执行结果=" + result);
}
else
{
throw new CustomException("任务网络请求执行失败,任务不存在");
} }
} }
} }
+3 -3
View File
@@ -9,9 +9,9 @@
</el-tab-pane> </el-tab-pane>
<el-tab-pane label="字段信息" name="cloum"> <el-tab-pane label="字段信息" name="cloum">
<el-table ref="dragTable" v-loading="loading" :data="columns" row-key="columnId" min-height="150px" :max-height="tableHeight"> <el-table ref="dragTable" v-loading="loading" :data="columns" row-key="columnId" min-height="150px" :max-height="tableHeight">
<el-table-column label="序号" type="index" class-name="allowDrag" fixed /> <el-table-column label="序号" type="index" class-name="allowDrag" />
<el-table-column label="字段列名" prop="columnName" :show-overflow-tooltip="true" fixed /> <el-table-column label="字段列名" prop="columnName" :show-overflow-tooltip="true" />
<el-table-column label="字段描述" fixed> <el-table-column label="字段描述" >
<template slot-scope="scope"> <template slot-scope="scope">
<el-input v-model="scope.row.columnComment" :ref="scope.row.columnId" @keydown.native="nextFocus(scope.row, scope.$index, $event)"> <el-input v-model="scope.row.columnComment" :ref="scope.row.columnId" @keydown.native="nextFocus(scope.row, scope.$index, $event)">
</el-input> </el-input>