Ver Fonte

👍 !1415 系列优化
Merge pull request !1415 from Hans/hans_0830

zuohuaijun há 2 anos atrás
pai
commit
f6d3c03d17

+ 30 - 0
Admin.NET/Admin.NET.Core/Entity/SysUser.cs

@@ -312,4 +312,34 @@ public partial class SysUser : EntityTenant
     [SugarColumn(ColumnDescription = "电子签名", Length = 512)]
     [MaxLength(512)]
     public string? Signature { get; set; }
+    /// <summary>
+    /// 验证超级管理员类型
+    /// </summary>
+    /// <param name="errorMsg">自定义错误消息</param>
+    /// <remarks>
+    /// 如果账号类型为超级管理员则报错
+    /// </remarks>
+    public void ValidateIsSuperAdminAccountType(ErrorCodeEnum? errorMsg = ErrorCodeEnum.D1014)
+    {
+        if (AccountType == AccountTypeEnum.SuperAdmin)
+        {
+            throw Oops.Oh(errorMsg);
+        }
+    }
+    /// <summary>
+    /// 验证用户Id是否相同
+    /// </summary>
+    /// <param name="userId">用户Id</param>
+    /// <param name="errorMsg">自定义错误消息</param>
+    /// <remarks>
+    /// 如果用户id相同则报错
+    /// </remarks>
+
+    public void ValidateIsUserId(long userId,ErrorCodeEnum? errorMsg = ErrorCodeEnum.D1001)
+    {
+        if (Id == userId)
+        {
+            throw Oops.Oh(errorMsg);
+        }
+    }
 }

+ 12 - 13
Admin.NET/Admin.NET.Core/Service/User/SysUserService.cs

@@ -165,11 +165,9 @@ public class SysUserService : IDynamicApiController, ITransient
     [DisplayName("删除用户")]
     public virtual async Task DeleteUser(DeleteUserInput input)
     {
-        var user = await _sysUserRep.GetFirstAsync(u => u.Id == input.Id) ?? throw Oops.Oh(ErrorCodeEnum.D0009);
-        if (user.AccountType == AccountTypeEnum.SuperAdmin)
-            throw Oops.Oh(ErrorCodeEnum.D1014);
-        if (user.Id == _userManager.UserId)
-            throw Oops.Oh(ErrorCodeEnum.D1001);
+        var user = await _sysUserRep.GetByIdAsync(input.Id) ?? throw Oops.Oh(ErrorCodeEnum.D0009);
+        user.ValidateIsSuperAdminAccountType();
+        user.ValidateIsUserId(_userManager.UserId);
 
         // 若账号为租户默认账号则禁止删除
         var isTenantUser = await _sysUserRep.ChangeRepository<SqlSugarRepository<SysTenant>>().IsAnyAsync(u => u.UserId == input.Id);
@@ -203,7 +201,7 @@ public class SysUserService : IDynamicApiController, ITransient
     [DisplayName("查看用户基本信息")]
     public virtual async Task<SysUser> GetBaseInfo()
     {
-        return await _sysUserRep.GetFirstAsync(u => u.Id == _userManager.UserId);
+        return await _sysUserRep.GetByIdAsync(_userManager.UserId);
     }
 
     /// <summary>
@@ -223,16 +221,15 @@ public class SysUserService : IDynamicApiController, ITransient
     /// </summary>
     /// <param name="input"></param>
     /// <returns></returns>
+    [UnitOfWork]
     [DisplayName("设置用户状态")]
     public virtual async Task<int> SetStatus(UserInput input)
     {
         if (_userManager.UserId == input.Id)
             throw Oops.Oh(ErrorCodeEnum.D1026);
 
-        var user = await _sysUserRep.GetFirstAsync(u => u.Id == input.Id) ?? throw Oops.Oh(ErrorCodeEnum.D0009);
-        if (user.AccountType == AccountTypeEnum.SuperAdmin)
-            throw Oops.Oh(ErrorCodeEnum.D1015);
-
+        var user = await _sysUserRep.GetByIdAsync(input.Id) ?? throw Oops.Oh(ErrorCodeEnum.D0009);
+        user.ValidateIsSuperAdminAccountType(ErrorCodeEnum.D1015);
         if (!Enum.IsDefined(typeof(StatusEnum), input.Status))
             throw Oops.Oh(ErrorCodeEnum.D3005);
 
@@ -275,6 +272,7 @@ public class SysUserService : IDynamicApiController, ITransient
     /// </summary>
     /// <param name="input"></param>
     /// <returns></returns>
+    [UnitOfWork]
     [DisplayName("修改用户密码")]
     public virtual async Task<int> ChangePwd(ChangePwdInput input)
     {
@@ -282,7 +280,7 @@ public class SysUserService : IDynamicApiController, ITransient
         input.PasswordOld = CryptogramUtil.SM2Decrypt(input.PasswordOld);
         input.PasswordNew = CryptogramUtil.SM2Decrypt(input.PasswordNew);
 
-        var user = await _sysUserRep.GetFirstAsync(u => u.Id == _userManager.UserId) ?? throw Oops.Oh(ErrorCodeEnum.D0009);
+        var user = await _sysUserRep.GetByIdAsync(_userManager.UserId) ?? throw Oops.Oh(ErrorCodeEnum.D0009);
         if (CryptogramUtil.CryptoType == CryptogramEnum.MD5.ToString())
         {
             if (user.Password != MD5Encryption.Encrypt(input.PasswordOld))
@@ -317,10 +315,11 @@ public class SysUserService : IDynamicApiController, ITransient
     /// </summary>
     /// <param name="input"></param>
     /// <returns></returns>
+    [UnitOfWork]
     [DisplayName("重置用户密码")]
     public virtual async Task<string> ResetPwd(ResetPwdUserInput input)
     {
-        var user = await _sysUserRep.GetFirstAsync(u => u.Id == input.Id) ?? throw Oops.Oh(ErrorCodeEnum.D0009);
+        var user = await _sysUserRep.GetByIdAsync(input.Id) ?? throw Oops.Oh(ErrorCodeEnum.D0009);
         var password = await _sysConfigService.GetConfigValue<string>(ConfigConst.SysPassword);
         user.Password = CryptogramUtil.Encrypt(password);
         await _sysUserRep.AsUpdateable(user).UpdateColumns(u => u.Password).ExecuteCommandAsync();
@@ -340,7 +339,7 @@ public class SysUserService : IDynamicApiController, ITransient
     [DisplayName("解除登录锁定")]
     public virtual async Task UnlockLogin(UnlockLoginInput input)
     {
-        var user = await _sysUserRep.GetFirstAsync(u => u.Id == input.Id) ?? throw Oops.Oh(ErrorCodeEnum.D0009);
+        var user = await _sysUserRep.GetByIdAsync(input.Id) ?? throw Oops.Oh(ErrorCodeEnum.D0009);
 
         // 清空密码错误次数
         var keyPasswordErrorTimes = $"{CacheConst.KeyPasswordErrorTimes}{user.Account}";

+ 7 - 0
Admin.NET/Admin.NET.sln

@@ -26,6 +26,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Admin.NET.Plugin.ReZero", "
 EndProject
 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Admin.NET.Plugin.ApprovalFlow", "Plugins\Admin.NET.Plugin.ApprovalFlow\Admin.NET.Plugin.ApprovalFlow.csproj", "{902A91A7-5EF0-4A63-BC2C-9B783DC00880}"
 EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Admin.NET.Plugin.K3Cloud", "Plugins\Admin.NET.Plugin.K3Cloud\Admin.NET.Plugin.K3Cloud.csproj", "{72EB89AB-15F7-4F85-88DB-7C2EF7C3D588}"
+EndProject
 Global
 	GlobalSection(SolutionConfigurationPlatforms) = preSolution
 		Debug|Any CPU = Debug|Any CPU
@@ -64,6 +66,10 @@ Global
 		{902A91A7-5EF0-4A63-BC2C-9B783DC00880}.Debug|Any CPU.Build.0 = Debug|Any CPU
 		{902A91A7-5EF0-4A63-BC2C-9B783DC00880}.Release|Any CPU.ActiveCfg = Release|Any CPU
 		{902A91A7-5EF0-4A63-BC2C-9B783DC00880}.Release|Any CPU.Build.0 = Release|Any CPU
+		{72EB89AB-15F7-4F85-88DB-7C2EF7C3D588}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{72EB89AB-15F7-4F85-88DB-7C2EF7C3D588}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{72EB89AB-15F7-4F85-88DB-7C2EF7C3D588}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{72EB89AB-15F7-4F85-88DB-7C2EF7C3D588}.Release|Any CPU.Build.0 = Release|Any CPU
 	EndGlobalSection
 	GlobalSection(SolutionProperties) = preSolution
 		HideSolutionNode = FALSE
@@ -73,6 +79,7 @@ Global
 		{F6A002AD-CF7F-4771-8597-F12A50A93DAA} = {76F70D22-8D53-468E-A3B6-1704666A1D71}
 		{04AB2E76-DE8B-4EFD-9F48-F8D4C0993106} = {76F70D22-8D53-468E-A3B6-1704666A1D71}
 		{902A91A7-5EF0-4A63-BC2C-9B783DC00880} = {76F70D22-8D53-468E-A3B6-1704666A1D71}
+		{72EB89AB-15F7-4F85-88DB-7C2EF7C3D588} = {76F70D22-8D53-468E-A3B6-1704666A1D71}
 	EndGlobalSection
 	GlobalSection(ExtensibilityGlobals) = postSolution
 		SolutionGuid = {5CD801D7-984A-4F5C-8FA2-211B7A5EA9F3}

+ 17 - 0
Admin.NET/Plugins/Admin.NET.Plugin.K3Cloud/Admin.NET.Plugin.K3Cloud.csproj

@@ -0,0 +1,17 @@
+<Project Sdk="Microsoft.NET.Sdk">
+
+  <PropertyGroup>
+	  <TargetFrameworks>net6.0;net8.0</TargetFrameworks>
+	  <NoWarn>1701;1702;1591;8632</NoWarn>
+	  <ImplicitUsings>enable</ImplicitUsings>
+	  <Nullable>disable</Nullable>
+	  <GenerateDocumentationFile>True</GenerateDocumentationFile>
+	  <Copyright>Admin.NET</Copyright>
+	  <Description>Admin.NET 通用权限开发平台</Description>
+  </PropertyGroup>
+
+  <ItemGroup>
+    <ProjectReference Include="..\..\Admin.NET.Core\Admin.NET.Core.csproj" />
+  </ItemGroup>
+
+</Project>

+ 19 - 0
Admin.NET/Plugins/Admin.NET.Plugin.K3Cloud/Configuration/K3Cloud.json

@@ -0,0 +1,19 @@
+{
+  "$schema": "https://gitee.com/dotnetchina/Furion/raw/v4/schemas/v4/furion-schema.json",
+  "K3Cloud": {
+    // ERP地址
+    "Url": "http://127.0.0.1/k3cloud/",
+    // 帐套Id(数据中心ID)
+    "AcctID": "XXXXXXXXX",
+    // 应用Id
+    "AppId": "XXXXXXXX",
+    // 应用密钥
+    "AppKey": "XXX",
+    // 用户名称
+    "UserName": "XXX",
+    // 用户密码
+    "UserPassword": "XXXX@2024",
+    // 语言代码
+    "LanguageCode": "2052"
+  }
+}

+ 8 - 0
Admin.NET/Plugins/Admin.NET.Plugin.K3Cloud/GlobalUsings.cs

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

+ 38 - 0
Admin.NET/Plugins/Admin.NET.Plugin.K3Cloud/Option/K3CloudOptions.cs

@@ -0,0 +1,38 @@
+
+
+using Furion.ConfigurableOptions;
+
+namespace Admin.NET.Plugin.K3Cloud;
+public sealed class K3CloudOptions : IConfigurableOptions
+{
+
+    /// <summary>
+    /// ERP业务站点地址
+    /// </summary>
+    public string Url { get; set; }
+    /// <summary>
+    /// 帐套Id(数据中心ID)
+    /// </summary>
+    public string AcctID { get; set; }
+    /// <summary>
+    /// 应用Id
+    /// </summary>
+    public string AppId { get; set; }
+    /// <summary>
+    /// 应用密钥
+    /// </summary>
+    public string AppKey { get; set; }
+    /// <summary>
+    /// 用户名称
+    /// </summary>
+    public string UserName { get; set; }
+    /// <summary>
+    /// 用户密码
+    /// </summary>
+    public string UserPassword { get; set; }
+    /// <summary>
+    /// 语言代码
+    /// </summary>
+    public string LanguageCode { get; set; }
+
+}

+ 16 - 0
Admin.NET/Plugins/Admin.NET.Plugin.K3Cloud/Service/Dto/K3CloudBaeInput.cs

@@ -0,0 +1,16 @@
+namespace Admin.NET.Plugin.K3Cloud.Service;
+/// <summary>
+/// ERP基础入参
+/// </summary>
+public class K3CloudBaeInput<T>
+{
+    /// <summary>
+    /// 表单Id
+    /// </summary>
+    public string formid { get; set; }
+    /// <summary>
+    /// 数据包
+    /// </summary>
+    public T data { get; set; }
+
+}

+ 5 - 0
Admin.NET/Plugins/Admin.NET.Plugin.K3Cloud/Service/Dto/K3CloudLoginInput.cs

@@ -0,0 +1,5 @@
+namespace Admin.NET.Plugin.K3Cloud.Service;
+public class K3CloudLoginInput
+{
+    public List<string> parameters { get; set; }
+}

+ 48 - 0
Admin.NET/Plugins/Admin.NET.Plugin.K3Cloud/Service/Dto/K3CloudLoginOutput.cs

@@ -0,0 +1,48 @@
+namespace Admin.NET.Plugin.K3Cloud.Service;
+public class K3CloudLoginOutput
+{
+    public string Message { get; set; }
+    public string MessageCode { get; set; }
+    public ErpLoginResultType LoginResultType { get; set; }
+}
+
+
+public enum ErpLoginResultType
+{
+    /// <summary>
+    /// 激活
+    /// </summary>
+    Activation = -7,
+    /// <summary>
+    /// 云通行证未绑定Cloud账号
+    /// </summary>
+    EntryCloudUnBind = -6,
+    /// <summary>
+    /// 需要表单处理
+    /// </summary>
+    DealWithForm = -5,
+    /// <summary>
+    /// 登录警告
+    /// </summary>
+    Wanning = -4,
+    /// <summary>
+    /// 密码验证不通过(强制的)
+    /// </summary>
+    PWInvalid_Required = -3,
+    /// <summary>
+    /// 密码验证不通过(可选的)
+    /// </summary>
+    PWInvalid_Optional = -2,
+    /// <summary>
+    /// 登录失败
+    /// </summary>
+    Failure = -1,
+    /// <summary>
+    /// 用户或密码错误
+    /// </summary>
+    PWError = 0,
+    /// <summary>
+    /// 登录成功
+    /// </summary>
+    Success = 1
+}

+ 56 - 0
Admin.NET/Plugins/Admin.NET.Plugin.K3Cloud/Service/Dto/K3CloudPushResultOutput.cs

@@ -0,0 +1,56 @@
+namespace Admin.NET.Plugin.K3Cloud.Service;
+public class K3CloudPushResultOutput
+{
+    public ErpPushResultInfo Result { get; set; }
+}
+public class ErpPushResultInfo
+{
+    /// <summary>
+    /// Id
+    /// </summary>
+    public object? Id { get; set; }
+    /// <summary>
+    /// 编码
+    /// </summary>
+    public string? Number { get; set; }
+    public ErpPushResultInfo_ResponseStatus ResponseStatus { get; set; }
+
+
+}
+public class ErpPushResultInfo_ResponseStatus
+{
+    public bool IsSuccess { get; set; }
+    public int? ErrorCode { get; set; }
+    /// <summary>
+    /// 错误代码MsgCode说明
+    ///0:默认
+    ///1:上下文丢失 会话过期
+    ///2:没有权限
+    ///3:操作标识为空
+    ///4:异常
+    ///5:单据标识为空
+    ///6:数据库操作失败
+    ///7:许可错误
+    ///8:参数错误
+    ///9:指定字段/值不存在
+    ///10:未找到对应数据
+    ///11:验证失败
+    ///12:不可操作
+    ///13:网控冲突
+    ///14:调用限制
+    ///15:禁止管理员登录
+    /// </summary>
+    public int? MsgCode { get; set; }
+    /// <summary>
+    /// 如果失败,具体失败原因
+    /// </summary>
+    public List<ErpPushResultInfo_Errors> Errors { get; set; }
+}
+public class ErpPushResultInfo_Errors
+{
+    public string FieldName { get; set; }
+    public string Message { get; set; }
+    public int DIndex { get; set; }
+
+}
+

+ 46 - 0
Admin.NET/Plugins/Admin.NET.Plugin.K3Cloud/Service/IK3CloudApi.cs

@@ -0,0 +1,46 @@
+using Furion.DependencyInjection;
+using Furion.RemoteRequest;
+
+namespace Admin.NET.Plugin.K3Cloud.Service;
+
+/// <summary>
+/// 金蝶云星空ERP接口
+/// </summary>
+[Client("K3Cloud")]
+public interface IK3CloudApi : IHttpDispatchProxy
+{
+    /// <summary>
+    /// 验证用户
+    /// </summary>
+    /// <param name="input"></param>
+    /// <param name="action"></param>
+    /// <returns></returns>
+    [Post("Kingdee.BOS.WebApi.ServicesStub.AuthService.ValidateUser.common.kdsvc")]
+    Task<K3CloudLoginOutput> ValidateUser([Body] K3CloudLoginInput input, [Interceptor(InterceptorTypes.Response)] Action<HttpClient, HttpResponseMessage> action = default);
+    /// <summary>
+    /// 保存表单
+    /// </summary>
+    /// <param name="input"></param>
+    /// <param name="action"></param>
+    /// <returns></returns>
+    [Post("Kingdee.BOS.WebApi.ServicesStub.DynamicFormService.Save.common.kdsvc")]
+    Task<K3CloudPushResultOutput> Save<T>([Body] K3CloudBaeInput<T> input, [Interceptor(InterceptorTypes.Request)] Action<HttpClient, HttpRequestMessage> action = default);
+    /// <summary>
+    /// 提交表单
+    /// </summary>
+    /// <param name="input"></param>
+    /// <param name="action"></param>
+    /// <returns></returns>
+    [Post("Kingdee.BOS.WebApi.ServicesStub.DynamicFormService.Submit.common.kdsvc")]
+    Task<K3CloudPushResultOutput> Submit<T>([Body] K3CloudBaeInput<T> input, [Interceptor(InterceptorTypes.Request)] Action<HttpClient, HttpRequestMessage> action = default);
+    /// <summary>
+    /// 审核表单
+    /// </summary>
+    /// <param name="input"></param>
+    /// <param name="action"></param>
+    /// <returns></returns>
+    [Post("Kingdee.BOS.WebApi.ServicesStub.DynamicFormService.Audit.common.kdsvc")]
+    Task<K3CloudPushResultOutput> Audit<T>([Body] K3CloudBaeInput<T> input, [Interceptor(InterceptorTypes.Request)] Action<HttpClient, HttpRequestMessage> action = default);
+
+
+}

+ 31 - 0
Admin.NET/Plugins/Admin.NET.Plugin.K3Cloud/Startup.cs

@@ -0,0 +1,31 @@
+// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。
+//
+// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。
+//
+// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任!
+using Admin.NET.Core;
+using Microsoft.AspNetCore.Builder;
+using Microsoft.AspNetCore.Hosting;
+using Microsoft.Extensions.DependencyInjection;
+
+namespace Admin.NET.Plugin.K3Cloud;
+
+[AppStartup(100)]
+public class Startup : AppStartup
+{
+    public void ConfigureServices(IServiceCollection services)
+    {
+        services.AddConfigurableOptions<K3CloudOptions>();
+        services.AddRemoteRequest(options =>
+        {
+            options.AddHttpClient("K3Cloud", c =>
+            {
+                c.BaseAddress = new Uri(App.GetConfig<K3CloudOptions>("K3Cloud", true).Url);
+            });
+        });
+    }
+
+    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
+    {
+    }
+}

+ 67 - 0
Web/api_build/build_api.sh

@@ -0,0 +1,67 @@
+#!/bin/sh
+# 红色信息
+function echoRedInfo() {
+    echo -e "\e[31m$@\e[0m"
+}
+# 绿色信息
+function echoGreenInfo() {
+    echo -e "\e[32m$@\e[0m"
+}
+# 蓝色信息
+function echoBlueInfo() {
+    echo -e "\e[34m$@\e[0m"
+}
+url1="http://172.18.32.33:5050"
+url2="http://127.0.0.1:5050"
+url3="http://localhost:5005"
+# 打印菜单
+echoBlueInfo "请选择Swagger地址:"
+echoBlueInfo "(1) $url1"
+echoBlueInfo "(2) $url2"
+echoBlueInfo "(3) $url3"
+read -p "请输入选项 [1-3]: " choice
+
+currPath=$(pwd)
+parentPath=$(dirname "$currPath")
+apiServicesPath=${parentPath}/src/api-services/
+
+echo "生成目录 ${apiServicesPath}"
+
+# 判断目录是否存在
+if test -d "$apiServicesPath"; then
+  echo "删除目录 api-services"
+  rm -rf "${apiServicesPath}"
+fi
+
+echo "开始生成 api-services"
+
+
+# 检查用户输入并执行相应操作
+case $choice in
+    1)
+        echoGreenInfo "您选择了: $url1"
+        java -jar "${currPath}"/swagger-codegen-cli.jar generate -i $url1/swagger/All%20Groups/swagger.json -l typescript-axios -o "${apiServicesPath}"
+        ;;
+    2)
+        echoGreenInfo "您选择了: $url2"
+        java -jar "${currPath}"/swagger-codegen-cli.jar generate -i $url2/swagger/All%20Groups/swagger.json -l typescript-axios -o "${apiServicesPath}"
+        ;;
+    3)
+        echoGreenInfo "您选择了: $url3"
+        java -jar "${currPath}"/swagger-codegen-cli.jar generate -i $url3/swagger/All%20Groups/swagger.json -l typescript-axios -o "${apiServicesPath}"
+        ;;
+    *)
+        echoRedInfo "无效的选项,请输入[1-3]。"
+        exit 1
+        ;;
+esac
+rm -rf "${apiServicesPath}".swagger-codegen
+rm -f "${apiServicesPath}".gitignore
+rm -f "${apiServicesPath}".npmignore
+rm -f "${apiServicesPath}".swagger-codegen-ignore
+rm -f "${apiServicesPath}"git_push.sh
+rm -f "${apiServicesPath}"package.json
+rm -f "${apiServicesPath}"README.md
+rm -f "${apiServicesPath}"tsconfig.json
+
+echoGreenInfo "生成结束"

+ 3 - 3
Web/src/views/system/user/component/userCenter.vue

@@ -113,13 +113,13 @@
 						<el-tab-pane label="修改密码">
 							<el-form ref="ruleFormPasswordRef" :model="state.ruleFormPassword" label-width="auto">
 								<el-form-item label="当前密码" prop="passwordOld" :rules="[{ required: true, message: '当前密码不能为空', trigger: 'blur' }]">
-									<el-input v-model="state.ruleFormPassword.passwordOld" type="password" autocomplete="off" />
+									<el-input v-model="state.ruleFormPassword.passwordOld" type="password" autocomplete="off" show-password/>
 								</el-form-item>
 								<el-form-item label="新密码" prop="passwordNew" :rules="[{ required: true, message: '新密码不能为空', trigger: 'blur' }]">
-									<el-input v-model="state.ruleFormPassword.passwordNew" type="password" autocomplete="off" />
+									<el-input v-model="state.ruleFormPassword.passwordNew" type="password" autocomplete="off" show-password/>
 								</el-form-item>
 								<el-form-item label="确认密码" prop="passwordNew2" :rules="[{ validator: validatePassword, required: true, trigger: 'blur' }]">
-									<el-input v-model="state.passwordNew2" type="password" autocomplete="off" />
+									<el-input v-model="state.passwordNew2" type="password" autocomplete="off" show-password/>
 								</el-form-item>
 								<el-form-item>
 									<el-button icon="ele-Refresh" @click="resetPassword">重 置</el-button>