😎增加系统更新日志管理及显示

This commit is contained in:
zuohuaijun 2024-12-21 12:08:16 +08:00
parent 56fc8ce049
commit c0b590a5ec
33 changed files with 1716 additions and 46 deletions

View File

@ -3,8 +3,6 @@
// Lazy.Captcha.Core (https://api.gitee.com/pojianbing/lazy-captcha/)
"CaptchaOptions": {
"CacheType": "Memory", // MemoryRedis
"RedisCacheString": "127.0.0.1:6379,password=, defaultDatabase=2", // Redis
"CaptchaType": 10, // 01234567891011
"CodeLength": 1, // , CaptchaType , 2
"ExpirySeconds": 60, //

View File

@ -46,7 +46,7 @@
<PackageReference Include="SSH.NET" Version="2024.2.0" />
<PackageReference Include="System.Linq.Dynamic.Core" Version="1.5.1" />
<PackageReference Include="System.Net.Http" Version="4.3.4" />
<PackageReference Include="TencentCloudSDK.Sms" Version="3.0.1145" />
<PackageReference Include="TencentCloudSDK.Sms" Version="3.0.1146" />
<PackageReference Include="UAParser" Version="3.1.47" />
<PackageReference Include="Yitter.IdGenerator" Version="1.0.14" />
</ItemGroup>

View File

@ -116,6 +116,11 @@ public class ConfigConst
/// </summary>
public const string SysPasswordRecord = "sys_password_record";
/// <summary>
/// 显示系统更新日志
/// </summary>
public const string SysUpgrade = "sys_upgrade";
/// <summary>
/// Default 分组
/// </summary>

View File

@ -0,0 +1,23 @@
// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。
//
// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。
//
// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任!
namespace Admin.NET.Core;
/// <summary>
/// 系统更新日志表
/// </summary>
[SugarTable(null, "系统更新日志表")]
[SysTable]
public partial class SysUpgrade : EntityBase
{
/// <summary>
/// 内容
/// </summary>
[SugarColumn(ColumnDescription = "内容", ColumnDataType = StaticConfig.CodeFirst_BigString)]
[Required]
[SensitiveDetection('*')]
public virtual string Content { get; set; }
}

View File

@ -0,0 +1,33 @@
// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。
//
// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。
//
// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任!
namespace Admin.NET.Core;
/// <summary>
/// 系统更新日志用户表
/// </summary>
[SugarTable(null, "系统更新日志用户表")]
[SysTable]
public partial class SysUpgradeUser : EntityBaseId
{
/// <summary>
/// 更新日志Id
/// </summary>
[SugarColumn(ColumnDescription = "更新日志Id")]
public long UpgradeId { get; set; }
/// <summary>
/// 用户Id
/// </summary>
[SugarColumn(ColumnDescription = "用户Id")]
public long UserId { get; set; }
/// <summary>
/// 阅读时间
/// </summary>
[SugarColumn(ColumnDescription = "阅读时间")]
public DateTime? ReadTime { get; set; }
}

View File

@ -1,11 +1,8 @@
// 麻省理工学院许可证
// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。
//
// 版权所有 (c) 2021-2023 zuohuaijun大名科技天津有限公司 联系电话/微信18020030720 QQ515096995
// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。
//
// 特此免费授予获得本软件的任何人以处理本软件的权利,但须遵守以下条件:在所有副本或重要部分的软件中必须包括上述版权声明和本许可声明。
//
// 软件按“原样”提供,不提供任何形式的明示或暗示的保证,包括但不限于对适销性、适用性和非侵权的保证。
// 在任何情况下,作者或版权持有人均不对任何索赔、损害或其他责任负责,无论是因合同、侵权或其他方式引起的,与软件或其使用或其他交易有关。
// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任!
namespace Admin.NET.Core;

View File

@ -31,16 +31,17 @@ public class SysConfigSeedData : ISqlSugarEntitySeedData<SysConfig>
new SysConfig{ Id=1300000000191, Name="RefreshToken过期时间", Code=ConfigConst.SysRefreshTokenExpire, Value="20160", SysFlag=YesNoEnum.Y, Remark="刷新Token过期时间分钟一般 refresh_token 的有效时间 > 2 * access_token 的有效时间)", OrderNo=100, GroupCode=ConfigConst.SysDefaultGroup, CreateTime=DateTime.Parse("2022-02-10 00:00:00") },
new SysConfig{ Id=1300000000201, Name="发送异常日志邮件", Code=ConfigConst.SysErrorMail, Value="False", SysFlag=YesNoEnum.Y, Remark="是否发送异常日志邮件", OrderNo=110, GroupCode=ConfigConst.SysDefaultGroup, CreateTime=DateTime.Parse("2022-02-10 00:00:00") },
new SysConfig{ Id=1300000000211, Name="域登录验证", Code=ConfigConst.SysDomainLogin, Value="False", SysFlag=YesNoEnum.Y, Remark="是否开启域登录验证", OrderNo=120, GroupCode=ConfigConst.SysDefaultGroup, CreateTime=DateTime.Parse("2022-02-10 00:00:00") },
new SysConfig{ Id=1300000000221, Name="租户隔离登录验证", Code=ConfigConst.SysTenantHostLogin, Value="False", SysFlag=YesNoEnum.Y, Remark="租户隔离登录验证", OrderNo=370, GroupCode=ConfigConst.SysDefaultGroup, CreateTime=DateTime.Parse("2022-02-10 00:00:00") },
new SysConfig{ Id=1300000000231, Name="数据校验日志", Code=ConfigConst.SysValidationLog, Value="True", SysFlag=YesNoEnum.Y, Remark="是否数据校验日志", OrderNo=130, GroupCode=ConfigConst.SysDefaultGroup, CreateTime=DateTime.Parse("2022-02-10 00:00:00") },
new SysConfig{ Id=1300000000241, Name="行政区划同步层级", Code=ConfigConst.SysRegionSyncLevel, Value="3", SysFlag=YesNoEnum.Y, Remark="行政区划同步层级 1-省级,2-市级,3-区县级,4-街道级,5-村级", OrderNo=140, GroupCode=ConfigConst.SysDefaultGroup, CreateTime=DateTime.Parse("2022-02-10 00:00:00") },
new SysConfig{ Id=1300000000221, Name="租户隔离登录验证", Code=ConfigConst.SysTenantHostLogin, Value="False", SysFlag=YesNoEnum.Y, Remark="租户隔离登录验证", OrderNo=130, GroupCode=ConfigConst.SysDefaultGroup, CreateTime=DateTime.Parse("2022-02-10 00:00:00") },
new SysConfig{ Id=1300000000231, Name="数据校验日志", Code=ConfigConst.SysValidationLog, Value="True", SysFlag=YesNoEnum.Y, Remark="是否数据校验日志", OrderNo=140, GroupCode=ConfigConst.SysDefaultGroup, CreateTime=DateTime.Parse("2022-02-10 00:00:00") },
new SysConfig{ Id=1300000000241, Name="行政区划同步层级", Code=ConfigConst.SysRegionSyncLevel, Value="3", SysFlag=YesNoEnum.Y, Remark="行政区划同步层级 1-省级,2-市级,3-区县级,4-街道级,5-村级", OrderNo=150, GroupCode=ConfigConst.SysDefaultGroup, CreateTime=DateTime.Parse("2022-02-10 00:00:00") },
// 新业务系统记得更改密匙,通过接口(http://localhost:5005/api/sysCommon/smKeyPair)获取
new SysConfig{ Id=1300000000251, Name="国密SM2密匙", Code=ConfigConst.SysSM2Key, Value="04851D329AA3E38C2E7670AFE70E6E70E92F8769CA27C8766B12209A0FFBA4493B603EF7A0B9B1E16F0E8930C0406EA0B179B68DF28E25334BDEC4AE76D907E9E9;3A61D1D30C6302DABFF36201D936D0143EEF0C850AF28C5CA6D5C045AF8C5C8A", SysFlag=YesNoEnum.Y, Remark="国密SM2密匙", OrderNo=160, GroupCode=ConfigConst.SysDefaultGroup, CreateTime=DateTime.Parse("2024-11-21 00:00:00") },
new SysConfig{ Id=1300000000261, Name="开启强制修改密码", Code=ConfigConst.SysForceChangePassword, Value="False", SysFlag=YesNoEnum.Y, Remark="开启强制修改密码", OrderNo=150, GroupCode=ConfigConst.SysDefaultGroup, CreateTime=DateTime.Parse("2022-02-10 00:00:00") },
new SysConfig{ Id=1300000000271, Name="开启密码强度验证", Code=ConfigConst.SysPasswordStrength, Value="False", SysFlag=YesNoEnum.Y, Remark="开启强制修改密码", OrderNo=170, GroupCode=ConfigConst.SysDefaultGroup, CreateTime=DateTime.Parse("2022-02-10 00:00:00") },
new SysConfig{ Id=1300000000281, Name="密码强度验证正则表达式", Code=ConfigConst.SysPasswordStrengthExpression, Value="(?=^.{6,20}$)(?=.*\\d)(?=.*\\W+)(?=.*[A-Z])(?=.*[a-z])(?!.*\\n).*$", SysFlag=YesNoEnum.Y, Remark="必须包含大小写字母、数字和特殊字符的组合长度在6-20之间", OrderNo=180, GroupCode=ConfigConst.SysDefaultGroup, CreateTime=DateTime.Parse("2024-11-21 00:00:00") },
new SysConfig{ Id=1300000000291, Name="密码时间有效期", Code=ConfigConst.SysPasswordExpirationTime, Value="0", SysFlag=YesNoEnum.Y, Remark="默认0表示永不过期否则表示过期天数", OrderNo=190, GroupCode=ConfigConst.SysDefaultGroup, CreateTime=DateTime.Parse("2024-12-17 00:00:00") },
new SysConfig{ Id=1300000000301, Name="密码历史记录验证", Code=ConfigConst.SysPasswordRecord, Value="False", SysFlag=YesNoEnum.Y, Remark="是否验证历史密码禁止再次使用", OrderNo=200, GroupCode=ConfigConst.SysDefaultGroup, CreateTime=DateTime.Parse("2024-12-17 00:00:00") },
new SysConfig{ Id=1300000000261, Name="开启强制修改密码", Code=ConfigConst.SysForceChangePassword, Value="False", SysFlag=YesNoEnum.Y, Remark="开启强制修改密码", OrderNo=170, GroupCode=ConfigConst.SysDefaultGroup, CreateTime=DateTime.Parse("2022-02-10 00:00:00") },
new SysConfig{ Id=1300000000271, Name="开启密码强度验证", Code=ConfigConst.SysPasswordStrength, Value="False", SysFlag=YesNoEnum.Y, Remark="开启强制修改密码", OrderNo=180, GroupCode=ConfigConst.SysDefaultGroup, CreateTime=DateTime.Parse("2022-02-10 00:00:00") },
new SysConfig{ Id=1300000000281, Name="密码强度验证正则表达式", Code=ConfigConst.SysPasswordStrengthExpression, Value="(?=^.{6,20}$)(?=.*\\d)(?=.*\\W+)(?=.*[A-Z])(?=.*[a-z])(?!.*\\n).*$", SysFlag=YesNoEnum.Y, Remark="必须包含大小写字母、数字和特殊字符的组合长度在6-20之间", OrderNo=190, GroupCode=ConfigConst.SysDefaultGroup, CreateTime=DateTime.Parse("2024-11-21 00:00:00") },
new SysConfig{ Id=1300000000291, Name="密码时间有效期", Code=ConfigConst.SysPasswordExpirationTime, Value="0", SysFlag=YesNoEnum.Y, Remark="默认0表示永不过期否则表示过期天数", OrderNo=200, GroupCode=ConfigConst.SysDefaultGroup, CreateTime=DateTime.Parse("2024-12-17 00:00:00") },
new SysConfig{ Id=1300000000301, Name="密码历史记录验证", Code=ConfigConst.SysPasswordRecord, Value="False", SysFlag=YesNoEnum.Y, Remark="是否验证历史密码禁止再次使用", OrderNo=210, GroupCode=ConfigConst.SysDefaultGroup, CreateTime=DateTime.Parse("2024-12-17 00:00:00") },
new SysConfig{ Id=1300000000401, Name="显示系统更新日志", Code=ConfigConst.SysUpgrade, Value="True", SysFlag=YesNoEnum.Y, Remark="是否显示系统更新日志", OrderNo=220, GroupCode=ConfigConst.SysDefaultGroup, CreateTime=DateTime.Parse("2024-12-20 00:00:00") },
new SysConfig{ Id=1310000000301, Name="系统主标题", Code=ConfigConst.SysWebTitle, Value="Admin.NET.Pro", SysFlag=YesNoEnum.Y, Remark="系统主标题", OrderNo=300, GroupCode=ConfigConst.SysWebConfigGroup, CreateTime=DateTime.Parse("2022-02-10 00:00:00") },
new SysConfig{ Id=1310000000311, Name="系统副标题", Code=ConfigConst.SysWebViceTitle, Value="Admin.NET.Pro", SysFlag=YesNoEnum.Y, Remark="系统副标题", OrderNo=310, GroupCode=ConfigConst.SysWebConfigGroup, CreateTime=DateTime.Parse("2022-02-10 00:00:00") },

View File

@ -176,10 +176,12 @@ public class SysMenuSeedData : ISqlSugarEntitySeedData<SysMenu>
new SysMenu{ Id=1310000000445, Pid=1310000000441, Title="获取支付订单详情(微信接口)", Permission="sysWechatPay/payInfoFromWechat", Type=MenuTypeEnum.Btn, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=100 },
new SysMenu{ Id=1310000000446, Pid=1310000000441, Title="退款申请", Permission="sysWechatPay/refundDomestic", Type=MenuTypeEnum.Btn, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=100 },
//new SysMenu{ Id=1310000000451, Pid=1310000000301, Title="数据库备份", Path="/platform/dbBackup", Name="dbBackup", Component="/system/database/dbBackup", Icon="ele-Coin", Type=MenuTypeEnum.Menu, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=240 },
//new SysMenu{ Id=1310000000452, Pid=1310000000451, Title="查询", Permission="dbBackup/page", Type=MenuTypeEnum.Btn, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=100 },
//new SysMenu{ Id=1310000000453, Pid=1310000000451, Title="删除", Permission="dbBackup/delete", Type=MenuTypeEnum.Btn, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=100 },
//new SysMenu{ Id=1310000000454, Pid=1310000000451, Title="增加", Permission="dbBackup/add", Type=MenuTypeEnum.Btn, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=100 },
new SysMenu{ Id=1310000000451, Pid=1310000000301, Title="更新日志", Path="/platform/upgrade", Name="sysUpgrade", Component="/system/upgrade/index", Icon="ele-Paperclip", Type=MenuTypeEnum.Menu, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=220 },
//new SysMenu{ Id=1310000000461, Pid=1310000000301, Title="数据库备份", Path="/platform/dbBackup", Name="dbBackup", Component="/system/database/dbBackup", Icon="ele-Coin", Type=MenuTypeEnum.Menu, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=240 },
//new SysMenu{ Id=1310000000462, Pid=1310000000461, Title="查询", Permission="dbBackup/page", Type=MenuTypeEnum.Btn, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=100 },
//new SysMenu{ Id=1310000000463, Pid=1310000000461, Title="删除", Permission="dbBackup/delete", Type=MenuTypeEnum.Btn, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=100 },
//new SysMenu{ Id=1310000000464, Pid=1310000000461, Title="增加", Permission="dbBackup/add", Type=MenuTypeEnum.Btn, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=100 },
new SysMenu{ Id=1310000000501, Pid=0, Title="日志管理", Path="/log", Name="log", Component="Layout", Icon="ele-DocumentCopy", Type=MenuTypeEnum.Dir, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=12000 },
new SysMenu{ Id=1310000000511, Pid=1310000000501, Title="访问日志", Path="/log/logvis", Name="sysLogVis", Component="/system/log/logvis/index", Icon="ele-Document", Type=MenuTypeEnum.Menu, CreateTime=DateTime.Parse("2022-02-10 00:00:00"), OrderNo=100 },

View File

@ -18,8 +18,7 @@ public class SysNoticeService : IDynamicApiController, ITransient
private readonly SqlSugarRepository<SysNoticeUser> _sysNoticeUserRep;
private readonly SysOnlineUserService _sysOnlineUserService;
public SysNoticeService(
UserManager userManager,
public SysNoticeService(UserManager userManager,
SqlSugarRepository<SysUser> sysUserRep,
SqlSugarRepository<SysNotice> sysNoticeRep,
SqlSugarRepository<SysNoticeUser> sysNoticeUserRep,

View File

@ -0,0 +1,27 @@
// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。
//
// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。
//
// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任!
namespace Admin.NET.Core.Service;
public class PageUpgradeInput : BasePageInput
{
}
public class AddUpgradeInput : SysUpgrade
{
}
public class UpdateUpgradeInput : AddUpgradeInput
{
}
public class DeleteUpgradeInput : BaseIdInput
{
}
public class UpgradeInput : BaseIdInput
{
}

View File

@ -0,0 +1,120 @@
// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。
//
// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。
//
// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任!
namespace Admin.NET.Core.Service;
/// <summary>
/// 系统更新日志服务 🧩
/// </summary>
[ApiDescriptionSettings(Order = 380, Description = "更新日志")]
public class SysUpgradeService : IDynamicApiController, ITransient
{
private readonly UserManager _userManager;
private readonly SqlSugarRepository<SysUpgrade> _sysUpgradeRep;
private readonly SqlSugarRepository<SysUpgradeUser> _sysUpgradeUserRep;
private readonly SysConfigService _sysConfigService;
public SysUpgradeService(UserManager userManager,
SqlSugarRepository<SysUpgrade> sysUpgradeRep,
SqlSugarRepository<SysUpgradeUser> sysUpgradeUserRep,
SysConfigService sysConfigService)
{
_userManager = userManager;
_sysUpgradeRep = sysUpgradeRep;
_sysUpgradeUserRep = sysUpgradeUserRep;
_sysConfigService = sysConfigService;
}
/// <summary>
/// 获取系统更新日志分页列表 🔖
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[DisplayName("获取系统更新日志分页列表")]
public async Task<SqlSugarPagedList<SysUpgrade>> Page(PageUpgradeInput input)
{
return await _sysUpgradeRep.AsQueryable()
.OrderBy(u => u.CreateTime, OrderByType.Desc)
.ToPagedListAsync(input.Page, input.PageSize);
}
/// <summary>
/// 增加系统更新日志 🔖
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[ApiDescriptionSettings(Name = "Add"), HttpPost]
[DisplayName("增加系统更新日志")]
public async Task AddUpgrade(AddUpgradeInput input)
{
var upgrade = input.Adapt<SysUpgrade>();
await _sysUpgradeRep.InsertAsync(upgrade);
}
/// <summary>
/// 更新系统更新日志 🔖
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[UnitOfWork]
[ApiDescriptionSettings(Name = "Update"), HttpPost]
[DisplayName("更新系统更新日志")]
public async Task UpdateUpgrade(UpdateUpgradeInput input)
{
var upgrade = input.Adapt<SysUpgrade>();
await _sysUpgradeRep.UpdateAsync(upgrade);
}
/// <summary>
/// 删除系统更新日志 🔖
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[UnitOfWork]
[ApiDescriptionSettings(Name = "Delete"), HttpPost]
[DisplayName("删除系统更新日志")]
public async Task DeleteUpgrade(DeleteUpgradeInput input)
{
await _sysUpgradeRep.DeleteAsync(u => u.Id == input.Id);
await _sysUpgradeUserRep.DeleteAsync(u => u.UpgradeId == input.Id);
}
/// <summary>
/// 设置系统更新日志已读状态 🔖
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[DisplayName("设置系统更新日志已读状态")]
public async Task SetRead(UpgradeInput input)
{
await _sysUpgradeUserRep.InsertAsync(new SysUpgradeUser
{
UpgradeId = input.Id,
UserId = _userManager.UserId,
ReadTime = DateTime.Now
});
}
/// <summary>
/// 获取最新的系统更新日志 🔖
/// </summary>
/// <returns></returns>
[DisplayName("获取最新的系统更新日志")]
public async Task<SysUpgrade> GetLastUnRead()
{
// 是否启用显示系统更新日志
var enableUpgrade = await _sysConfigService.GetConfigValueByCode<bool>(ConfigConst.SysUpgrade);
if (!enableUpgrade) return null;
// 取最新的系统更新日志
var upgrade = await _sysUpgradeRep.AsQueryable().OrderBy(u => u.CreateTime, OrderByType.Desc).FirstAsync();
if (upgrade == null) return null;
// 若当前用户没有阅读过则进行显示
return (await _sysUpgradeUserRep.IsAnyAsync(u => u.UserId == _userManager.UserId && u.UpgradeId == upgrade.Id)) ? null : upgrade;
}
}

View File

@ -32,7 +32,7 @@ public class SysUserService : IDynamicApiController, ITransient
SysUserRoleService sysUserRoleService,
SysConfigService sysConfigService,
SysOnlineUserService sysOnlineUserService,
SysUserMenuService sysUserMenuService,
SysUserMenuService sysUserMenuService,
SysCacheService sysCacheService,
SysUserLdapService sysUserLdapService,
SqlSugarRepository<SysUser> sysUserRep,

View File

@ -4,8 +4,6 @@
//
// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任!
using Lazy.Captcha.Core;
namespace Admin.NET.Core;
public static class SqlSugarSetup
@ -24,8 +22,7 @@ public static class SqlSugarSetup
{
// 注册雪花Id
var snowIdOpt = App.GetConfig<SnowIdOptions>("SnowId", true);
var cacheOpt = App.GetConfig<CacheOptions>("Cache", true);
if(cacheOpt.CacheType == "Memory")
if (App.GetConfig<CacheOptions>("Cache", true).CacheType == "Memory")
{
YitIdHelper.SetIdGenerator(snowIdOpt);
SnowFlakeSingle.WorkId = snowIdOpt.WorkerId;

View File

@ -32,7 +32,6 @@ using System.Linq;
using System.Text.Encodings.Web;
using System.Text.Unicode;
using System.Threading.Tasks;
using Microsoft.Extensions.Configuration;
namespace Admin.NET.Web.Core;
@ -212,19 +211,6 @@ public class Startup : AppStartup
// 验证码
services.AddCaptcha();
var captchaCacheType = App.GetService<IConfiguration>().GetSection("CaptchaOptions:CacheType")?.Value;
if (captchaCacheType == "Redis")
{
var connectionString = App.GetService<IConfiguration>().GetSection("CaptchaOptions:RedisCacheString")?.Value;
// 如果使用redis分布式缓存
services.AddStackExchangeRedisCache(options =>
{
options.Configuration = connectionString;
options.InstanceName = "captcha:";
});
}
// 控制台logo
services.AddConsoleLogo();

View File

@ -80,7 +80,7 @@
}else if(@column.EffectType == "InputTextArea"){
@:<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="mb20">
@:<el-form-item label="@column.ColumnComment" prop="@(@column.LowerPropertyName)">
@:<el-input v-model="state.ruleForm.@(@column.LowerPropertyName)" autocomplete="new-password" placeholder="请输入@(@column.ColumnComment)" type="textarea"
@:<el-input v-model="state.ruleForm.@(@column.LowerPropertyName)" autocomplete="new-password" placeholder="请输入@(@column.ColumnComment)" type="textarea"
@if(@column.ColumnLength>0){
@:maxlength="@(@column.ColumnLength)"
}

View File

@ -74,7 +74,7 @@
"vue-router": "^4.5.0",
"vue-signature-pad": "^3.0.2",
"vue3-tree-org": "^4.2.2",
"vxe-pc-ui": "^4.3.38",
"vxe-pc-ui": "^4.3.40",
"vxe-table": "^4.8.10",
"vxe-table-plugin-element": "^4.0.4",
"vxe-table-plugin-export-xlsx": "^4.0.7",
@ -103,7 +103,7 @@
"sass": "^1.83.0",
"terser": "^5.37.0",
"typescript": "^5.7.2",
"vite": "^6.0.4",
"vite": "^6.0.5",
"vite-plugin-cdn-import": "^1.0.1",
"vite-plugin-compression2": "^1.3.3",
"vite-plugin-vue-setup-extend": "^0.4.0",

View File

@ -52,6 +52,7 @@ export * from './apis/sys-schedule-api';
export * from './apis/sys-server-api';
export * from './apis/sys-sms-api';
export * from './apis/sys-tenant-api';
export * from './apis/sys-upgrade-api';
export * from './apis/sys-user-api';
export * from './apis/sys-user-menu-api';
export * from './apis/sys-wechat-api';

View File

@ -0,0 +1,551 @@
/* tslint:disable */
/* eslint-disable */
/**
* Admin.NET
* .NET <br/><u><b><font color='FF0000'> 👮</font></b></u>
*
* OpenAPI spec version: 1.0.0
*
*
* NOTE: This class is auto generated by the swagger code generator program.
* https://github.com/swagger-api/swagger-codegen.git
* Do not edit the class manually.
*/
import globalAxios, { AxiosResponse, AxiosInstance, AxiosRequestConfig } from 'axios';
import { Configuration } from '../configuration';
// Some imports not used depending on template conditions
// @ts-ignore
import { BASE_PATH, COLLECTION_FORMATS, RequestArgs, BaseAPI, RequiredError } from '../base';
import { AddUpgradeInput } from '../models';
import { AdminResultSqlSugarPagedListSysUpgrade } from '../models';
import { AdminResultSysUpgrade } from '../models';
import { DeleteUpgradeInput } from '../models';
import { PageUpgradeInput } from '../models';
import { UpdateUpgradeInput } from '../models';
import { UpgradeInput } from '../models';
/**
* SysUpgradeApi - axios parameter creator
* @export
*/
export const SysUpgradeApiAxiosParamCreator = function (configuration?: Configuration) {
return {
/**
*
* @summary 🔖
* @param {AddUpgradeInput} [body]
* @param {*} [options] Override http request option.
* @throws {RequiredError}
*/
apiSysUpgradeAddPost: async (body?: AddUpgradeInput, options: AxiosRequestConfig = {}): Promise<RequestArgs> => {
const localVarPath = `/api/sysUpgrade/add`;
// use dummy base URL string because the URL constructor only accepts absolute URLs.
const localVarUrlObj = new URL(localVarPath, 'https://example.com');
let baseOptions;
if (configuration) {
baseOptions = configuration.baseOptions;
}
const localVarRequestOptions :AxiosRequestConfig = { method: 'POST', ...baseOptions, ...options};
const localVarHeaderParameter = {} as any;
const localVarQueryParameter = {} as any;
// authentication Bearer required
// http bearer authentication required
if (configuration && configuration.accessToken) {
const accessToken = typeof configuration.accessToken === 'function'
? await configuration.accessToken()
: await configuration.accessToken;
localVarHeaderParameter["Authorization"] = "Bearer " + accessToken;
}
localVarHeaderParameter['Content-Type'] = 'application/json-patch+json';
const query = new URLSearchParams(localVarUrlObj.search);
for (const key in localVarQueryParameter) {
query.set(key, localVarQueryParameter[key]);
}
for (const key in options.params) {
query.set(key, options.params[key]);
}
localVarUrlObj.search = (new URLSearchParams(query)).toString();
let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {};
localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers};
const needsSerialization = (typeof body !== "string") || localVarRequestOptions.headers['Content-Type'] === 'application/json';
localVarRequestOptions.data = needsSerialization ? JSON.stringify(body !== undefined ? body : {}) : (body || "");
return {
url: localVarUrlObj.pathname + localVarUrlObj.search + localVarUrlObj.hash,
options: localVarRequestOptions,
};
},
/**
*
* @summary 🔖
* @param {DeleteUpgradeInput} [body]
* @param {*} [options] Override http request option.
* @throws {RequiredError}
*/
apiSysUpgradeDeletePost: async (body?: DeleteUpgradeInput, options: AxiosRequestConfig = {}): Promise<RequestArgs> => {
const localVarPath = `/api/sysUpgrade/delete`;
// use dummy base URL string because the URL constructor only accepts absolute URLs.
const localVarUrlObj = new URL(localVarPath, 'https://example.com');
let baseOptions;
if (configuration) {
baseOptions = configuration.baseOptions;
}
const localVarRequestOptions :AxiosRequestConfig = { method: 'POST', ...baseOptions, ...options};
const localVarHeaderParameter = {} as any;
const localVarQueryParameter = {} as any;
// authentication Bearer required
// http bearer authentication required
if (configuration && configuration.accessToken) {
const accessToken = typeof configuration.accessToken === 'function'
? await configuration.accessToken()
: await configuration.accessToken;
localVarHeaderParameter["Authorization"] = "Bearer " + accessToken;
}
localVarHeaderParameter['Content-Type'] = 'application/json-patch+json';
const query = new URLSearchParams(localVarUrlObj.search);
for (const key in localVarQueryParameter) {
query.set(key, localVarQueryParameter[key]);
}
for (const key in options.params) {
query.set(key, options.params[key]);
}
localVarUrlObj.search = (new URLSearchParams(query)).toString();
let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {};
localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers};
const needsSerialization = (typeof body !== "string") || localVarRequestOptions.headers['Content-Type'] === 'application/json';
localVarRequestOptions.data = needsSerialization ? JSON.stringify(body !== undefined ? body : {}) : (body || "");
return {
url: localVarUrlObj.pathname + localVarUrlObj.search + localVarUrlObj.hash,
options: localVarRequestOptions,
};
},
/**
*
* @summary 🔖
* @param {*} [options] Override http request option.
* @throws {RequiredError}
*/
apiSysUpgradeLastUnReadGet: async (options: AxiosRequestConfig = {}): Promise<RequestArgs> => {
const localVarPath = `/api/sysUpgrade/lastUnRead`;
// use dummy base URL string because the URL constructor only accepts absolute URLs.
const localVarUrlObj = new URL(localVarPath, 'https://example.com');
let baseOptions;
if (configuration) {
baseOptions = configuration.baseOptions;
}
const localVarRequestOptions :AxiosRequestConfig = { method: 'GET', ...baseOptions, ...options};
const localVarHeaderParameter = {} as any;
const localVarQueryParameter = {} as any;
// authentication Bearer required
// http bearer authentication required
if (configuration && configuration.accessToken) {
const accessToken = typeof configuration.accessToken === 'function'
? await configuration.accessToken()
: await configuration.accessToken;
localVarHeaderParameter["Authorization"] = "Bearer " + accessToken;
}
const query = new URLSearchParams(localVarUrlObj.search);
for (const key in localVarQueryParameter) {
query.set(key, localVarQueryParameter[key]);
}
for (const key in options.params) {
query.set(key, options.params[key]);
}
localVarUrlObj.search = (new URLSearchParams(query)).toString();
let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {};
localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers};
return {
url: localVarUrlObj.pathname + localVarUrlObj.search + localVarUrlObj.hash,
options: localVarRequestOptions,
};
},
/**
*
* @summary 🔖
* @param {PageUpgradeInput} [body]
* @param {*} [options] Override http request option.
* @throws {RequiredError}
*/
apiSysUpgradePagePost: async (body?: PageUpgradeInput, options: AxiosRequestConfig = {}): Promise<RequestArgs> => {
const localVarPath = `/api/sysUpgrade/page`;
// use dummy base URL string because the URL constructor only accepts absolute URLs.
const localVarUrlObj = new URL(localVarPath, 'https://example.com');
let baseOptions;
if (configuration) {
baseOptions = configuration.baseOptions;
}
const localVarRequestOptions :AxiosRequestConfig = { method: 'POST', ...baseOptions, ...options};
const localVarHeaderParameter = {} as any;
const localVarQueryParameter = {} as any;
// authentication Bearer required
// http bearer authentication required
if (configuration && configuration.accessToken) {
const accessToken = typeof configuration.accessToken === 'function'
? await configuration.accessToken()
: await configuration.accessToken;
localVarHeaderParameter["Authorization"] = "Bearer " + accessToken;
}
localVarHeaderParameter['Content-Type'] = 'application/json-patch+json';
const query = new URLSearchParams(localVarUrlObj.search);
for (const key in localVarQueryParameter) {
query.set(key, localVarQueryParameter[key]);
}
for (const key in options.params) {
query.set(key, options.params[key]);
}
localVarUrlObj.search = (new URLSearchParams(query)).toString();
let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {};
localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers};
const needsSerialization = (typeof body !== "string") || localVarRequestOptions.headers['Content-Type'] === 'application/json';
localVarRequestOptions.data = needsSerialization ? JSON.stringify(body !== undefined ? body : {}) : (body || "");
return {
url: localVarUrlObj.pathname + localVarUrlObj.search + localVarUrlObj.hash,
options: localVarRequestOptions,
};
},
/**
*
* @summary 🔖
* @param {UpgradeInput} [body]
* @param {*} [options] Override http request option.
* @throws {RequiredError}
*/
apiSysUpgradeSetReadPost: async (body?: UpgradeInput, options: AxiosRequestConfig = {}): Promise<RequestArgs> => {
const localVarPath = `/api/sysUpgrade/setRead`;
// use dummy base URL string because the URL constructor only accepts absolute URLs.
const localVarUrlObj = new URL(localVarPath, 'https://example.com');
let baseOptions;
if (configuration) {
baseOptions = configuration.baseOptions;
}
const localVarRequestOptions :AxiosRequestConfig = { method: 'POST', ...baseOptions, ...options};
const localVarHeaderParameter = {} as any;
const localVarQueryParameter = {} as any;
// authentication Bearer required
// http bearer authentication required
if (configuration && configuration.accessToken) {
const accessToken = typeof configuration.accessToken === 'function'
? await configuration.accessToken()
: await configuration.accessToken;
localVarHeaderParameter["Authorization"] = "Bearer " + accessToken;
}
localVarHeaderParameter['Content-Type'] = 'application/json-patch+json';
const query = new URLSearchParams(localVarUrlObj.search);
for (const key in localVarQueryParameter) {
query.set(key, localVarQueryParameter[key]);
}
for (const key in options.params) {
query.set(key, options.params[key]);
}
localVarUrlObj.search = (new URLSearchParams(query)).toString();
let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {};
localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers};
const needsSerialization = (typeof body !== "string") || localVarRequestOptions.headers['Content-Type'] === 'application/json';
localVarRequestOptions.data = needsSerialization ? JSON.stringify(body !== undefined ? body : {}) : (body || "");
return {
url: localVarUrlObj.pathname + localVarUrlObj.search + localVarUrlObj.hash,
options: localVarRequestOptions,
};
},
/**
*
* @summary 🔖
* @param {UpdateUpgradeInput} [body]
* @param {*} [options] Override http request option.
* @throws {RequiredError}
*/
apiSysUpgradeUpdatePost: async (body?: UpdateUpgradeInput, options: AxiosRequestConfig = {}): Promise<RequestArgs> => {
const localVarPath = `/api/sysUpgrade/update`;
// use dummy base URL string because the URL constructor only accepts absolute URLs.
const localVarUrlObj = new URL(localVarPath, 'https://example.com');
let baseOptions;
if (configuration) {
baseOptions = configuration.baseOptions;
}
const localVarRequestOptions :AxiosRequestConfig = { method: 'POST', ...baseOptions, ...options};
const localVarHeaderParameter = {} as any;
const localVarQueryParameter = {} as any;
// authentication Bearer required
// http bearer authentication required
if (configuration && configuration.accessToken) {
const accessToken = typeof configuration.accessToken === 'function'
? await configuration.accessToken()
: await configuration.accessToken;
localVarHeaderParameter["Authorization"] = "Bearer " + accessToken;
}
localVarHeaderParameter['Content-Type'] = 'application/json-patch+json';
const query = new URLSearchParams(localVarUrlObj.search);
for (const key in localVarQueryParameter) {
query.set(key, localVarQueryParameter[key]);
}
for (const key in options.params) {
query.set(key, options.params[key]);
}
localVarUrlObj.search = (new URLSearchParams(query)).toString();
let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {};
localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers};
const needsSerialization = (typeof body !== "string") || localVarRequestOptions.headers['Content-Type'] === 'application/json';
localVarRequestOptions.data = needsSerialization ? JSON.stringify(body !== undefined ? body : {}) : (body || "");
return {
url: localVarUrlObj.pathname + localVarUrlObj.search + localVarUrlObj.hash,
options: localVarRequestOptions,
};
},
}
};
/**
* SysUpgradeApi - functional programming interface
* @export
*/
export const SysUpgradeApiFp = function(configuration?: Configuration) {
return {
/**
*
* @summary 🔖
* @param {AddUpgradeInput} [body]
* @param {*} [options] Override http request option.
* @throws {RequiredError}
*/
async apiSysUpgradeAddPost(body?: AddUpgradeInput, options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => Promise<AxiosResponse<void>>> {
const localVarAxiosArgs = await SysUpgradeApiAxiosParamCreator(configuration).apiSysUpgradeAddPost(body, options);
return (axios: AxiosInstance = globalAxios, basePath: string = BASE_PATH) => {
const axiosRequestArgs :AxiosRequestConfig = {...localVarAxiosArgs.options, url: basePath + localVarAxiosArgs.url};
return axios.request(axiosRequestArgs);
};
},
/**
*
* @summary 🔖
* @param {DeleteUpgradeInput} [body]
* @param {*} [options] Override http request option.
* @throws {RequiredError}
*/
async apiSysUpgradeDeletePost(body?: DeleteUpgradeInput, options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => Promise<AxiosResponse<void>>> {
const localVarAxiosArgs = await SysUpgradeApiAxiosParamCreator(configuration).apiSysUpgradeDeletePost(body, options);
return (axios: AxiosInstance = globalAxios, basePath: string = BASE_PATH) => {
const axiosRequestArgs :AxiosRequestConfig = {...localVarAxiosArgs.options, url: basePath + localVarAxiosArgs.url};
return axios.request(axiosRequestArgs);
};
},
/**
*
* @summary 🔖
* @param {*} [options] Override http request option.
* @throws {RequiredError}
*/
async apiSysUpgradeLastUnReadGet(options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => Promise<AxiosResponse<AdminResultSysUpgrade>>> {
const localVarAxiosArgs = await SysUpgradeApiAxiosParamCreator(configuration).apiSysUpgradeLastUnReadGet(options);
return (axios: AxiosInstance = globalAxios, basePath: string = BASE_PATH) => {
const axiosRequestArgs :AxiosRequestConfig = {...localVarAxiosArgs.options, url: basePath + localVarAxiosArgs.url};
return axios.request(axiosRequestArgs);
};
},
/**
*
* @summary 🔖
* @param {PageUpgradeInput} [body]
* @param {*} [options] Override http request option.
* @throws {RequiredError}
*/
async apiSysUpgradePagePost(body?: PageUpgradeInput, options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => Promise<AxiosResponse<AdminResultSqlSugarPagedListSysUpgrade>>> {
const localVarAxiosArgs = await SysUpgradeApiAxiosParamCreator(configuration).apiSysUpgradePagePost(body, options);
return (axios: AxiosInstance = globalAxios, basePath: string = BASE_PATH) => {
const axiosRequestArgs :AxiosRequestConfig = {...localVarAxiosArgs.options, url: basePath + localVarAxiosArgs.url};
return axios.request(axiosRequestArgs);
};
},
/**
*
* @summary 🔖
* @param {UpgradeInput} [body]
* @param {*} [options] Override http request option.
* @throws {RequiredError}
*/
async apiSysUpgradeSetReadPost(body?: UpgradeInput, options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => Promise<AxiosResponse<void>>> {
const localVarAxiosArgs = await SysUpgradeApiAxiosParamCreator(configuration).apiSysUpgradeSetReadPost(body, options);
return (axios: AxiosInstance = globalAxios, basePath: string = BASE_PATH) => {
const axiosRequestArgs :AxiosRequestConfig = {...localVarAxiosArgs.options, url: basePath + localVarAxiosArgs.url};
return axios.request(axiosRequestArgs);
};
},
/**
*
* @summary 🔖
* @param {UpdateUpgradeInput} [body]
* @param {*} [options] Override http request option.
* @throws {RequiredError}
*/
async apiSysUpgradeUpdatePost(body?: UpdateUpgradeInput, options?: AxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => Promise<AxiosResponse<void>>> {
const localVarAxiosArgs = await SysUpgradeApiAxiosParamCreator(configuration).apiSysUpgradeUpdatePost(body, options);
return (axios: AxiosInstance = globalAxios, basePath: string = BASE_PATH) => {
const axiosRequestArgs :AxiosRequestConfig = {...localVarAxiosArgs.options, url: basePath + localVarAxiosArgs.url};
return axios.request(axiosRequestArgs);
};
},
}
};
/**
* SysUpgradeApi - factory interface
* @export
*/
export const SysUpgradeApiFactory = function (configuration?: Configuration, basePath?: string, axios?: AxiosInstance) {
return {
/**
*
* @summary 🔖
* @param {AddUpgradeInput} [body]
* @param {*} [options] Override http request option.
* @throws {RequiredError}
*/
async apiSysUpgradeAddPost(body?: AddUpgradeInput, options?: AxiosRequestConfig): Promise<AxiosResponse<void>> {
return SysUpgradeApiFp(configuration).apiSysUpgradeAddPost(body, options).then((request) => request(axios, basePath));
},
/**
*
* @summary 🔖
* @param {DeleteUpgradeInput} [body]
* @param {*} [options] Override http request option.
* @throws {RequiredError}
*/
async apiSysUpgradeDeletePost(body?: DeleteUpgradeInput, options?: AxiosRequestConfig): Promise<AxiosResponse<void>> {
return SysUpgradeApiFp(configuration).apiSysUpgradeDeletePost(body, options).then((request) => request(axios, basePath));
},
/**
*
* @summary 🔖
* @param {*} [options] Override http request option.
* @throws {RequiredError}
*/
async apiSysUpgradeLastUnReadGet(options?: AxiosRequestConfig): Promise<AxiosResponse<AdminResultSysUpgrade>> {
return SysUpgradeApiFp(configuration).apiSysUpgradeLastUnReadGet(options).then((request) => request(axios, basePath));
},
/**
*
* @summary 🔖
* @param {PageUpgradeInput} [body]
* @param {*} [options] Override http request option.
* @throws {RequiredError}
*/
async apiSysUpgradePagePost(body?: PageUpgradeInput, options?: AxiosRequestConfig): Promise<AxiosResponse<AdminResultSqlSugarPagedListSysUpgrade>> {
return SysUpgradeApiFp(configuration).apiSysUpgradePagePost(body, options).then((request) => request(axios, basePath));
},
/**
*
* @summary 🔖
* @param {UpgradeInput} [body]
* @param {*} [options] Override http request option.
* @throws {RequiredError}
*/
async apiSysUpgradeSetReadPost(body?: UpgradeInput, options?: AxiosRequestConfig): Promise<AxiosResponse<void>> {
return SysUpgradeApiFp(configuration).apiSysUpgradeSetReadPost(body, options).then((request) => request(axios, basePath));
},
/**
*
* @summary 🔖
* @param {UpdateUpgradeInput} [body]
* @param {*} [options] Override http request option.
* @throws {RequiredError}
*/
async apiSysUpgradeUpdatePost(body?: UpdateUpgradeInput, options?: AxiosRequestConfig): Promise<AxiosResponse<void>> {
return SysUpgradeApiFp(configuration).apiSysUpgradeUpdatePost(body, options).then((request) => request(axios, basePath));
},
};
};
/**
* SysUpgradeApi - object-oriented interface
* @export
* @class SysUpgradeApi
* @extends {BaseAPI}
*/
export class SysUpgradeApi extends BaseAPI {
/**
*
* @summary 🔖
* @param {AddUpgradeInput} [body]
* @param {*} [options] Override http request option.
* @throws {RequiredError}
* @memberof SysUpgradeApi
*/
public async apiSysUpgradeAddPost(body?: AddUpgradeInput, options?: AxiosRequestConfig) : Promise<AxiosResponse<void>> {
return SysUpgradeApiFp(this.configuration).apiSysUpgradeAddPost(body, options).then((request) => request(this.axios, this.basePath));
}
/**
*
* @summary 🔖
* @param {DeleteUpgradeInput} [body]
* @param {*} [options] Override http request option.
* @throws {RequiredError}
* @memberof SysUpgradeApi
*/
public async apiSysUpgradeDeletePost(body?: DeleteUpgradeInput, options?: AxiosRequestConfig) : Promise<AxiosResponse<void>> {
return SysUpgradeApiFp(this.configuration).apiSysUpgradeDeletePost(body, options).then((request) => request(this.axios, this.basePath));
}
/**
*
* @summary 🔖
* @param {*} [options] Override http request option.
* @throws {RequiredError}
* @memberof SysUpgradeApi
*/
public async apiSysUpgradeLastUnReadGet(options?: AxiosRequestConfig) : Promise<AxiosResponse<AdminResultSysUpgrade>> {
return SysUpgradeApiFp(this.configuration).apiSysUpgradeLastUnReadGet(options).then((request) => request(this.axios, this.basePath));
}
/**
*
* @summary 🔖
* @param {PageUpgradeInput} [body]
* @param {*} [options] Override http request option.
* @throws {RequiredError}
* @memberof SysUpgradeApi
*/
public async apiSysUpgradePagePost(body?: PageUpgradeInput, options?: AxiosRequestConfig) : Promise<AxiosResponse<AdminResultSqlSugarPagedListSysUpgrade>> {
return SysUpgradeApiFp(this.configuration).apiSysUpgradePagePost(body, options).then((request) => request(this.axios, this.basePath));
}
/**
*
* @summary 🔖
* @param {UpgradeInput} [body]
* @param {*} [options] Override http request option.
* @throws {RequiredError}
* @memberof SysUpgradeApi
*/
public async apiSysUpgradeSetReadPost(body?: UpgradeInput, options?: AxiosRequestConfig) : Promise<AxiosResponse<void>> {
return SysUpgradeApiFp(this.configuration).apiSysUpgradeSetReadPost(body, options).then((request) => request(this.axios, this.basePath));
}
/**
*
* @summary 🔖
* @param {UpdateUpgradeInput} [body]
* @param {*} [options] Override http request option.
* @throws {RequiredError}
* @memberof SysUpgradeApi
*/
public async apiSysUpgradeUpdatePost(body?: UpdateUpgradeInput, options?: AxiosRequestConfig) : Promise<AxiosResponse<void>> {
return SysUpgradeApiFp(this.configuration).apiSysUpgradeUpdatePost(body, options).then((request) => request(this.axios, this.basePath));
}
}

View File

@ -0,0 +1,94 @@
/* tslint:disable */
/* eslint-disable */
/**
* Admin.NET
* .NET <br/><u><b><font color='FF0000'> 👮</font></b></u>
*
* OpenAPI spec version: 1.0.0
*
*
* NOTE: This class is auto generated by the swagger code generator program.
* https://github.com/swagger-api/swagger-codegen.git
* Do not edit the class manually.
*/
/**
*
*
* @export
* @interface AddUpgradeInput
*/
export interface AddUpgradeInput {
/**
* Id
*
* @type {number}
* @memberof AddUpgradeInput
*/
id?: number;
/**
*
*
* @type {Date}
* @memberof AddUpgradeInput
*/
createTime?: Date;
/**
*
*
* @type {Date}
* @memberof AddUpgradeInput
*/
updateTime?: Date | null;
/**
* Id
*
* @type {number}
* @memberof AddUpgradeInput
*/
createUserId?: number | null;
/**
*
*
* @type {string}
* @memberof AddUpgradeInput
*/
createUserName?: string | null;
/**
* Id
*
* @type {number}
* @memberof AddUpgradeInput
*/
updateUserId?: number | null;
/**
*
*
* @type {string}
* @memberof AddUpgradeInput
*/
updateUserName?: string | null;
/**
*
*
* @type {boolean}
* @memberof AddUpgradeInput
*/
isDelete?: boolean;
/**
*
*
* @type {string}
* @memberof AddUpgradeInput
*/
content: string;
}

View File

@ -0,0 +1,69 @@
/* tslint:disable */
/* eslint-disable */
/**
* Admin.NET
* .NET <br/><u><b><font color='FF0000'> 👮</font></b></u>
*
* OpenAPI spec version: 1.0.0
*
*
* NOTE: This class is auto generated by the swagger code generator program.
* https://github.com/swagger-api/swagger-codegen.git
* Do not edit the class manually.
*/
import { SqlSugarPagedListSysUpgrade } from './sql-sugar-paged-list-sys-upgrade';
/**
*
*
* @export
* @interface AdminResultSqlSugarPagedListSysUpgrade
*/
export interface AdminResultSqlSugarPagedListSysUpgrade {
/**
*
*
* @type {number}
* @memberof AdminResultSqlSugarPagedListSysUpgrade
*/
code?: number;
/**
* successwarningerror
*
* @type {string}
* @memberof AdminResultSqlSugarPagedListSysUpgrade
*/
type?: string | null;
/**
*
*
* @type {string}
* @memberof AdminResultSqlSugarPagedListSysUpgrade
*/
message?: string | null;
/**
* @type {SqlSugarPagedListSysUpgrade}
* @memberof AdminResultSqlSugarPagedListSysUpgrade
*/
result?: SqlSugarPagedListSysUpgrade;
/**
*
*
* @type {any}
* @memberof AdminResultSqlSugarPagedListSysUpgrade
*/
extras?: any | null;
/**
*
*
* @type {Date}
* @memberof AdminResultSqlSugarPagedListSysUpgrade
*/
time?: Date;
}

View File

@ -0,0 +1,69 @@
/* tslint:disable */
/* eslint-disable */
/**
* Admin.NET
* .NET <br/><u><b><font color='FF0000'> 👮</font></b></u>
*
* OpenAPI spec version: 1.0.0
*
*
* NOTE: This class is auto generated by the swagger code generator program.
* https://github.com/swagger-api/swagger-codegen.git
* Do not edit the class manually.
*/
import { SysUpgrade } from './sys-upgrade';
/**
*
*
* @export
* @interface AdminResultSysUpgrade
*/
export interface AdminResultSysUpgrade {
/**
*
*
* @type {number}
* @memberof AdminResultSysUpgrade
*/
code?: number;
/**
* successwarningerror
*
* @type {string}
* @memberof AdminResultSysUpgrade
*/
type?: string | null;
/**
*
*
* @type {string}
* @memberof AdminResultSysUpgrade
*/
message?: string | null;
/**
* @type {SysUpgrade}
* @memberof AdminResultSysUpgrade
*/
result?: SysUpgrade;
/**
*
*
* @type {any}
* @memberof AdminResultSysUpgrade
*/
extras?: any | null;
/**
*
*
* @type {Date}
* @memberof AdminResultSysUpgrade
*/
time?: Date;
}

View File

@ -0,0 +1,30 @@
/* tslint:disable */
/* eslint-disable */
/**
* Admin.NET
* .NET <br/><u><b><font color='FF0000'> 👮</font></b></u>
*
* OpenAPI spec version: 1.0.0
*
*
* NOTE: This class is auto generated by the swagger code generator program.
* https://github.com/swagger-api/swagger-codegen.git
* Do not edit the class manually.
*/
/**
*
*
* @export
* @interface DeleteUpgradeInput
*/
export interface DeleteUpgradeInput {
/**
* Id
*
* @type {number}
* @memberof DeleteUpgradeInput
*/
id: number;
}

View File

@ -19,6 +19,7 @@ export * from './add-subscribe-message-template-input';
export * from './add-sys-app-input';
export * from './add-sys-ldap-input';
export * from './add-tenant-input';
export * from './add-upgrade-input';
export * from './add-user-input';
export * from './admin-result-boolean';
export * from './admin-result-captcha-output';
@ -99,6 +100,7 @@ export * from './admin-result-sql-sugar-paged-list-sys-online-user';
export * from './admin-result-sql-sugar-paged-list-sys-plugin';
export * from './admin-result-sql-sugar-paged-list-sys-print';
export * from './admin-result-sql-sugar-paged-list-sys-region';
export * from './admin-result-sql-sugar-paged-list-sys-upgrade';
export * from './admin-result-sql-sugar-paged-list-sys-wechat-pay';
export * from './admin-result-sql-sugar-paged-list-tenant-output';
export * from './admin-result-sql-sugar-paged-list-user-output';
@ -115,6 +117,7 @@ export * from './admin-result-sys-log-ex';
export * from './admin-result-sys-log-op';
export * from './admin-result-sys-print';
export * from './admin-result-sys-schedule';
export * from './admin-result-sys-upgrade';
export * from './admin-result-sys-user';
export * from './admin-result-sys-wechat-pay';
export * from './admin-result-visual-db-table';
@ -194,6 +197,7 @@ export * from './delete-role-input';
export * from './delete-schedule-input';
export * from './delete-sys-ldap-input';
export * from './delete-tenant-input';
export * from './delete-upgrade-input';
export * from './delete-user-input';
export * from './dict-data-input';
export * from './dict-type-input';
@ -289,6 +293,7 @@ export * from './page-role-input';
export * from './page-role-output';
export * from './page-sys-wechat-pay-input';
export * from './page-tenant-input';
export * from './page-upgrade-input';
export * from './page-user-input';
export * from './page-vis-log-input';
export * from './parameter-attributes';
@ -346,6 +351,7 @@ export * from './sql-sugar-paged-list-sys-online-user';
export * from './sql-sugar-paged-list-sys-plugin';
export * from './sql-sugar-paged-list-sys-print';
export * from './sql-sugar-paged-list-sys-region';
export * from './sql-sugar-paged-list-sys-upgrade';
export * from './sql-sugar-paged-list-sys-wechat-pay';
export * from './sql-sugar-paged-list-tenant-output';
export * from './sql-sugar-paged-list-user-output';
@ -387,6 +393,7 @@ export * from './sys-plugin';
export * from './sys-print';
export * from './sys-region';
export * from './sys-schedule';
export * from './sys-upgrade';
export * from './sys-user';
export * from './sys-user-ext-org';
export * from './sys-user-ldap';
@ -431,7 +438,9 @@ export * from './update-schedule-input';
export * from './update-sys-app-input';
export * from './update-sys-ldap-input';
export * from './update-tenant-input';
export * from './update-upgrade-input';
export * from './update-user-input';
export * from './upgrade-input';
export * from './upload-file-from-base64-input';
export * from './user-input';
export * from './user-menu-input';

View File

@ -0,0 +1,84 @@
/* tslint:disable */
/* eslint-disable */
/**
* Admin.NET
* .NET <br/><u><b><font color='FF0000'> 👮</font></b></u>
*
* OpenAPI spec version: 1.0.0
*
*
* NOTE: This class is auto generated by the swagger code generator program.
* https://github.com/swagger-api/swagger-codegen.git
* Do not edit the class manually.
*/
import { Filter } from './filter';
import { Search } from './search';
/**
*
*
* @export
* @interface PageUpgradeInput
*/
export interface PageUpgradeInput {
/**
* @type {Search}
* @memberof PageUpgradeInput
*/
search?: Search;
/**
*
*
* @type {string}
* @memberof PageUpgradeInput
*/
keyword?: string | null;
/**
* @type {Filter}
* @memberof PageUpgradeInput
*/
filter?: Filter;
/**
*
*
* @type {number}
* @memberof PageUpgradeInput
*/
page?: number;
/**
*
*
* @type {number}
* @memberof PageUpgradeInput
*/
pageSize?: number;
/**
*
*
* @type {string}
* @memberof PageUpgradeInput
*/
field?: string | null;
/**
*
*
* @type {string}
* @memberof PageUpgradeInput
*/
order?: string | null;
/**
*
*
* @type {string}
* @memberof PageUpgradeInput
*/
descStr?: string | null;
}

View File

@ -0,0 +1,79 @@
/* tslint:disable */
/* eslint-disable */
/**
* Admin.NET
* .NET <br/><u><b><font color='FF0000'> 👮</font></b></u>
*
* OpenAPI spec version: 1.0.0
*
*
* NOTE: This class is auto generated by the swagger code generator program.
* https://github.com/swagger-api/swagger-codegen.git
* Do not edit the class manually.
*/
import { SysUpgrade } from './sys-upgrade';
/**
*
*
* @export
* @interface SqlSugarPagedListSysUpgrade
*/
export interface SqlSugarPagedListSysUpgrade {
/**
*
*
* @type {number}
* @memberof SqlSugarPagedListSysUpgrade
*/
page?: number;
/**
*
*
* @type {number}
* @memberof SqlSugarPagedListSysUpgrade
*/
pageSize?: number;
/**
*
*
* @type {number}
* @memberof SqlSugarPagedListSysUpgrade
*/
total?: number;
/**
*
*
* @type {number}
* @memberof SqlSugarPagedListSysUpgrade
*/
totalPages?: number;
/**
*
*
* @type {Array<SysUpgrade>}
* @memberof SqlSugarPagedListSysUpgrade
*/
items?: Array<SysUpgrade> | null;
/**
*
*
* @type {boolean}
* @memberof SqlSugarPagedListSysUpgrade
*/
hasPrevPage?: boolean;
/**
*
*
* @type {boolean}
* @memberof SqlSugarPagedListSysUpgrade
*/
hasNextPage?: boolean;
}

View File

@ -0,0 +1,94 @@
/* tslint:disable */
/* eslint-disable */
/**
* Admin.NET
* .NET <br/><u><b><font color='FF0000'> 👮</font></b></u>
*
* OpenAPI spec version: 1.0.0
*
*
* NOTE: This class is auto generated by the swagger code generator program.
* https://github.com/swagger-api/swagger-codegen.git
* Do not edit the class manually.
*/
/**
*
*
* @export
* @interface SysUpgrade
*/
export interface SysUpgrade {
/**
* Id
*
* @type {number}
* @memberof SysUpgrade
*/
id?: number;
/**
*
*
* @type {Date}
* @memberof SysUpgrade
*/
createTime?: Date;
/**
*
*
* @type {Date}
* @memberof SysUpgrade
*/
updateTime?: Date | null;
/**
* Id
*
* @type {number}
* @memberof SysUpgrade
*/
createUserId?: number | null;
/**
*
*
* @type {string}
* @memberof SysUpgrade
*/
createUserName?: string | null;
/**
* Id
*
* @type {number}
* @memberof SysUpgrade
*/
updateUserId?: number | null;
/**
*
*
* @type {string}
* @memberof SysUpgrade
*/
updateUserName?: string | null;
/**
*
*
* @type {boolean}
* @memberof SysUpgrade
*/
isDelete?: boolean;
/**
*
*
* @type {string}
* @memberof SysUpgrade
*/
content: string;
}

View File

@ -0,0 +1,94 @@
/* tslint:disable */
/* eslint-disable */
/**
* Admin.NET
* .NET <br/><u><b><font color='FF0000'> 👮</font></b></u>
*
* OpenAPI spec version: 1.0.0
*
*
* NOTE: This class is auto generated by the swagger code generator program.
* https://github.com/swagger-api/swagger-codegen.git
* Do not edit the class manually.
*/
/**
*
*
* @export
* @interface UpdateUpgradeInput
*/
export interface UpdateUpgradeInput {
/**
* Id
*
* @type {number}
* @memberof UpdateUpgradeInput
*/
id?: number;
/**
*
*
* @type {Date}
* @memberof UpdateUpgradeInput
*/
createTime?: Date;
/**
*
*
* @type {Date}
* @memberof UpdateUpgradeInput
*/
updateTime?: Date | null;
/**
* Id
*
* @type {number}
* @memberof UpdateUpgradeInput
*/
createUserId?: number | null;
/**
*
*
* @type {string}
* @memberof UpdateUpgradeInput
*/
createUserName?: string | null;
/**
* Id
*
* @type {number}
* @memberof UpdateUpgradeInput
*/
updateUserId?: number | null;
/**
*
*
* @type {string}
* @memberof UpdateUpgradeInput
*/
updateUserName?: string | null;
/**
*
*
* @type {boolean}
* @memberof UpdateUpgradeInput
*/
isDelete?: boolean;
/**
*
*
* @type {string}
* @memberof UpdateUpgradeInput
*/
content: string;
}

View File

@ -0,0 +1,30 @@
/* tslint:disable */
/* eslint-disable */
/**
* Admin.NET
* .NET <br/><u><b><font color='FF0000'> 👮</font></b></u>
*
* OpenAPI spec version: 1.0.0
*
*
* NOTE: This class is auto generated by the swagger code generator program.
* https://github.com/swagger-api/swagger-codegen.git
* Do not edit the class manually.
*/
/**
*
*
* @export
* @interface UpgradeInput
*/
export interface UpgradeInput {
/**
* Id
*
* @type {number}
* @memberof UpgradeInput
*/
id: number;
}

View File

@ -84,6 +84,7 @@
<Search ref="searchRef" />
<OnlineUser ref="onlineUserRef" />
<ChangePassword ref="changePasswordRef" />
<UpgradeInfo ref="upgradeInfoRef" />
</div>
</template>
@ -105,13 +106,14 @@ import { signalR } from '/@/views/system/onlineUser/signalR';
import { Avatar, CircleCloseFilled, Loading, Lock } from '@element-plus/icons-vue';
import { clearAccessTokens, getAPI } from '/@/utils/axios-utils';
import { SysAuthApi, SysNoticeApi, SysUserApi } from '/@/api-services/api';
import { SysAuthApi, SysNoticeApi, SysUpgradeApi, SysUserApi } from '/@/api-services/api';
//
const UserNews = defineAsyncComponent(() => import('/@/layout/navBars/topBar/userNews.vue'));
const Search = defineAsyncComponent(() => import('/@/layout/navBars/topBar/search.vue'));
const OnlineUser = defineAsyncComponent(() => import('/@/views/system/onlineUser/index.vue'));
const ChangePassword = defineAsyncComponent(() => import('/@/views/system/user/component/changePassword.vue'));
const UpgradeInfo = defineAsyncComponent(() => import('/@/views/system/upgrade/component/upgradeInfo.vue'));
//
const { locale, t } = useI18n();
@ -123,6 +125,7 @@ const { themeConfig } = storeToRefs(storesThemeConfig);
const searchRef = ref();
const onlineUserRef = ref();
const changePasswordRef = ref();
const upgradeInfoRef = ref();
const state = reactive({
isScreenfull: false,
disabledI18n: 'zh-cn',
@ -263,6 +266,12 @@ onMounted(async () => {
// notice.readStatus = 1;
// });
//
var res1 = await getAPI(SysUpgradeApi).apiSysUpgradeLastUnReadGet();
if (res1.data.result != null) {
upgradeInfoRef.value?.openDialog(res1.data.result);
}
//
await changePassword();
});

View File

@ -0,0 +1,83 @@
<template>
<div class="sys-upgrade-container">
<vxe-modal v-model="state.isShowDialog" width="60vw" height="600px" resize show-footer show-zoom @close="cancel">
<template #title>
<div>
<el-icon size="16" style="margin-right: 3px; display: inline; vertical-align: middle"> <ele-Edit /> </el-icon>
<span> {{ props.title }} </span>
</div>
</template>
<template #default>
<el-form :model="state.ruleForm" ref="ruleFormRef" label-width="auto">
<el-form-item label="" prop="content" :rules="[{ required: true, message: '系统更新日志不能为空', trigger: 'blur' }]">
<Editor v-model:get-html="state.ruleForm.content" style="width: 100%; height: 100%" />
</el-form-item>
</el-form>
</template>
<template #footer>
<vxe-button @click="cancel"> </vxe-button>
<vxe-button status="primary" @click="submit"> </vxe-button>
</template>
</vxe-modal>
</div>
</template>
<script lang="ts" setup name="sysUpgradeEdit">
import { reactive, ref } from 'vue';
import Editor from '/@/components/editor/index.vue';
import { getAPI } from '/@/utils/axios-utils';
import { SysUpgradeApi } from '/@/api-services/api';
import { UpdateUpgradeInput } from '/@/api-services/models';
const props = defineProps({
title: String,
});
const emits = defineEmits(['handleQuery']);
const ruleFormRef = ref();
const state = reactive({
isShowDialog: false,
ruleForm: {} as UpdateUpgradeInput,
});
//
const openDialog = (row: any) => {
state.ruleForm = JSON.parse(JSON.stringify(row));
state.isShowDialog = true;
ruleFormRef.value?.resetFields();
};
//
const closeDialog = () => {
emits('handleQuery');
state.isShowDialog = false;
};
//
const cancel = () => {
state.isShowDialog = false;
};
//
const submit = () => {
ruleFormRef.value.validate(async (valid: boolean) => {
if (!valid || state.ruleForm.content == undefined || state.ruleForm.content.length < 20) return;
if (state.ruleForm.id != undefined && state.ruleForm.id > 0) {
await getAPI(SysUpgradeApi).apiSysUpgradeUpdatePost(state.ruleForm);
} else {
await getAPI(SysUpgradeApi).apiSysUpgradeAddPost(state.ruleForm);
}
closeDialog();
});
};
//
defineExpose({ openDialog });
</script>
<style scoped lang="scss">
// :deep(.vxe-modal--header) {
// background: var(--el-color-primary) !important;
// color: #fff;
// }
</style>

View File

@ -0,0 +1,43 @@
<template>
<div class="sys-upgrade-container">
<el-dialog v-model="state.isShowDialog" draggable :close-on-click-modal="false" width="50vw" :before-close="cancel">
<template #header>
<div style="color: #fff">
<el-icon size="16" style="margin-right: 3px; display: inline; vertical-align: middle"> <ele-InfoFilled /> </el-icon>
<span> 系统更新日志 </span>
</div>
</template>
<div v-html="state.ruleForm.content" style="padding: 20px"></div>
</el-dialog>
</div>
</template>
<script lang="ts" setup>
import { reactive } from 'vue';
import { getAPI } from '/@/utils/axios-utils';
import { SysUpgradeApi } from '/@/api-services/api';
const state = reactive({
isShowDialog: false,
ruleForm: {} as any,
});
//
const openDialog = (row: any) => {
state.ruleForm = JSON.parse(JSON.stringify(row));
state.isShowDialog = true;
};
//
const cancel = async () => {
//
await getAPI(SysUpgradeApi).apiSysUpgradeSetReadPost({ id: state.ruleForm.id });
state.isShowDialog = false;
};
//
defineExpose({ openDialog });
</script>

View File

@ -0,0 +1,143 @@
<template>
<div class="sys-upgrade-container">
<el-card class="full-table" shadow="hover" style="margin-top: 5px">
<vxe-grid ref="xGrid" class="xGrid-style" v-bind="options" v-on="gridEvents">
<template #toolbar_buttons>
<el-button type="primary" icon="ele-Plus" @click="handleAdd" v-auth="'sysNotice/add'"> 新增 </el-button>
</template>
<template #toolbar_tools> </template>
<template #empty>
<el-empty :image-size="200" />
</template>
<template #row_record="{ row }">
<ModifyRecord :data="row" />
</template>
<template #row_buttons="{ row }">
<el-button icon="ele-Edit" size="small" text type="primary" @click="handleEdit(row)" />
<!-- <el-button icon="ele-Delete" size="small" text type="danger" @click="handleDelete(row)" /> -->
</template>
</vxe-grid>
</el-card>
<EditUpgrade ref="editUpgradeRef" :title="state.title" @handleQuery="handleQuery" />
</div>
</template>
<script lang="ts" setup name="sysUpgrade">
import { onMounted, reactive, ref } from 'vue';
import { ElMessageBox, ElMessage } from 'element-plus';
import { VxeGridInstance, VxeGridListeners, VxeGridPropTypes } from 'vxe-table';
import { useVxeTable } from '/@/hooks/useVxeTableOptionsHook';
import { Local } from '/@/utils/storage';
import EditUpgrade from './component/editUpgrade.vue';
import ModifyRecord from '/@/components/table/modifyRecord.vue';
import { getAPI } from '/@/utils/axios-utils';
import { SysUpgradeApi } from '/@/api-services/api';
import { SysUpgrade, PageUpgradeInput } from '/@/api-services/models';
const xGrid = ref<VxeGridInstance>();
const editUpgradeRef = ref<InstanceType<typeof EditUpgrade>>();
const state = reactive({
queryParams: {
title: undefined,
type: undefined,
},
localPageParam: {
pageSize: 50 as number,
defaultSort: { field: 'orderNo', order: 'asc', descStr: 'desc' },
},
visible: false,
title: '',
});
//
const localPageParamKey = 'localPageParam:sysUpgrade';
//
const options = useVxeTable<SysUpgrade>(
{
id: 'sysUpgrade',
name: '更新日志',
columns: [
{ type: 'seq', title: '序号', width: 60, fixed: 'left' },
{ field: 'content', title: '系统更新日志', align: 'left', headerAlign: 'center', type: 'html', showOverflow: 'tooltip' },
{ field: 'createTime', title: '创建时间', width: 160, showOverflow: 'tooltip' },
{ field: '', title: '修改记录', width: 100, showOverflow: 'tooltip', slots: { default: 'row_record' } },
{ title: '操作', fixed: 'right', width: 100, showOverflow: true, slots: { default: 'row_buttons' } },
],
},
// vxeGrid()vxe-table
{
//
proxyConfig: { autoLoad: true, ajax: { query: ({ page, sort }) => handleQueryApi(page, sort) } },
//
sortConfig: { defaultSort: Local.get(localPageParamKey)?.defaultSort || state.localPageParam.defaultSort },
//
pagerConfig: { pageSize: Local.get(localPageParamKey)?.pageSize || state.localPageParam.pageSize },
//
toolbarConfig: { export: false },
//
rowConfig: { height: 120 },
}
);
//
onMounted(() => {
state.localPageParam = Local.get(localPageParamKey) || state.localPageParam;
});
// api
const handleQueryApi = async (page: VxeGridPropTypes.ProxyAjaxQueryPageParams, sort: VxeGridPropTypes.ProxyAjaxQuerySortCheckedParams) => {
const params = Object.assign(state.queryParams, { page: page.currentPage, pageSize: page.pageSize, field: sort.field, order: sort.order, descStr: 'desc' }) as PageUpgradeInput;
return getAPI(SysUpgradeApi).apiSysUpgradePagePost(params);
};
//
const handleQuery = async (reset = false) => {
options.loading = true;
reset ? await xGrid.value?.commitProxy('reload') : await xGrid.value?.commitProxy('query');
options.loading = false;
};
//
const handleAdd = () => {
state.title = '添加系统更新日志';
editUpgradeRef.value?.openDialog({ type: 1 });
};
//
const handleEdit = (row: any) => {
state.title = '编辑系统更新日志';
editUpgradeRef.value?.openDialog(row);
};
//
const handleDelete = (row: any) => {
ElMessageBox.confirm(`确定删除系统更新日志:【${row.createTime}】?`, '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
})
.then(async () => {
await getAPI(SysUpgradeApi).apiSysUpgradeDeletePost({ id: row.id });
handleQuery();
ElMessage.success('删除成功');
})
.catch(() => {});
};
//
const gridEvents: VxeGridListeners<SysUpgrade> = {
// pager-config
async pageChange({ pageSize }) {
state.localPageParam.pageSize = pageSize;
Local.set(localPageParamKey, state.localPageParam);
},
//
async sortChange({ field, order }) {
state.localPageParam.defaultSort = { field: field, order: order!, descStr: 'desc' };
Local.set(localPageParamKey, state.localPageParam);
},
};
</script>