diff --git a/content/aspnetcore/host/CompanyName.ProjectName.HttpApi.Host/CompanyNameProjectName.HttpApi.Host.xml b/content/aspnetcore/host/CompanyName.ProjectName.HttpApi.Host/CompanyNameProjectName.HttpApi.Host.xml
new file mode 100644
index 00000000..11085c4f
--- /dev/null
+++ b/content/aspnetcore/host/CompanyName.ProjectName.HttpApi.Host/CompanyNameProjectName.HttpApi.Host.xml
@@ -0,0 +1,84 @@
+
+
+
+ CompanyName.ProjectName.HttpApi.Host
+
+
+
+
+ 配置options
+
+
+
+
+
+ 审计日志
+
+
+
+
+ Redis缓存
+
+
+
+
+
+ 异常处理
+
+
+
+
+
+ 配置虚拟文件系统
+
+
+
+
+
+ 映射Controller
+
+
+
+
+ 配置JWT
+
+
+
+
+
+
+ 配置SwaggerUI
+
+
+
+
+
+ 配置本地化
+
+
+
+
+ 配置跨域
+
+
+
+
+
+
+ 配置Hangfire服务
+
+
+
+
+
+ 在使用nswag的时候,原生默认的api导致生产的代理类存在问题
+ 所有隐藏原生的api,重写路由
+
+
+
+
+ 把abp vnext 提供的api 归档
+
+
+
+
diff --git a/content/aspnetcore/host/CompanyName.ProjectName.HttpApi.Host/appsettings.json b/content/aspnetcore/host/CompanyName.ProjectName.HttpApi.Host/appsettings.json
index 2350b5cf..941171a1 100644
--- a/content/aspnetcore/host/CompanyName.ProjectName.HttpApi.Host/appsettings.json
+++ b/content/aspnetcore/host/CompanyName.ProjectName.HttpApi.Host/appsettings.json
@@ -31,11 +31,11 @@
}
},
"ConnectionStrings": {
- "Default": "Data Source=mysql.platform.development.cn;Database=CompanyNameProjectName;uid=root;pwd=mysql@dmin;charset=utf8mb4;Allow User Variables=true;AllowLoadLocalInfile=true"
+ "Default": "Data Source=mysql.platform.development.yhglobal.cn;Database=CompanyNameProjectName;uid=root;pwd=mysql@dmin;charset=utf8mb4;Allow User Variables=true;AllowLoadLocalInfile=true"
},
"Cache": {
"Redis": {
- "ConnectionString": "redis.platform.development.cn,password=OD5VbzIuAWsHOZV5ncYx9xaDsAMsKXn7",
+ "ConnectionString": "redis.platform.development.yhglobal.cn,password=OD5VbzIuAWsHOZV5ncYx9xaDsAMsKXn7",
"DatabaseId": 234
}
},
diff --git a/content/aspnetcore/src/CompanyName.ProjectName.Application.Contracts/CompanyNameProjectName.Application.Contracts.xml b/content/aspnetcore/src/CompanyName.ProjectName.Application.Contracts/CompanyNameProjectName.Application.Contracts.xml
new file mode 100644
index 00000000..123c6ec3
--- /dev/null
+++ b/content/aspnetcore/src/CompanyName.ProjectName.Application.Contracts/CompanyNameProjectName.Application.Contracts.xml
@@ -0,0 +1,44 @@
+
+
+
+ CompanyName.ProjectName.Application.Contracts
+
+
+
+
+ 执行任务
+
+
+
+
+
+ 当前页面
+
+
+
+
+ 每页多少条
+
+
+
+
+ 登录
+
+
+
+
+ 用户名或者邮箱
+
+
+
+
+ 密码
+
+
+
+
+ 过期时间
+
+
+
+
diff --git a/content/aspnetcore/src/CompanyName.ProjectName.Application/CompanyNameProjectName.Application.xml b/content/aspnetcore/src/CompanyName.ProjectName.Application/CompanyNameProjectName.Application.xml
new file mode 100644
index 00000000..23b1e13e
--- /dev/null
+++ b/content/aspnetcore/src/CompanyName.ProjectName.Application/CompanyNameProjectName.Application.xml
@@ -0,0 +1,73 @@
+
+
+
+ CompanyName.ProjectName.Application
+
+
+
+
+ Cron类型
+
+
+
+
+ 周期性为分钟的任务
+
+ 执行周期的间隔,默认为每分钟一次
+
+
+
+
+ 周期性为小时的任务
+
+ 第几分钟开始,默认为第一分钟
+ 执行周期的间隔,默认为每小时一次
+
+
+
+
+ 周期性为天的任务
+
+ 第几小时开始,默认从1点开始
+ 第几分钟开始,默认从第1分钟开始
+ 执行周期的间隔,默认为每天一次
+
+
+
+
+ 周期性为周的任务
+
+ 星期几开始,默认从星期一点开始
+ 第几小时开始,默认从1点开始
+ 第几分钟开始,默认从第1分钟开始
+
+
+
+
+ 周期性为月的任务
+
+ 几号开始,默认从一号开始
+ 第几小时开始,默认从1点开始
+ 第几分钟开始,默认从第1分钟开始
+
+
+
+
+ 周期性为年的任务
+
+ 几月开始,默认从一月开始
+ 几号开始,默认从一号开始
+ 第几小时开始,默认从1点开始
+ 第几分钟开始,默认从第1分钟开始
+
+
+
+
+ 生成jwt token
+
+
+
+
+
+
+
diff --git a/content/aspnetcore/src/CompanyName.ProjectName.Application/Users/LoginAppService.cs b/content/aspnetcore/src/CompanyName.ProjectName.Application/Users/LoginAppService.cs
index a5fc3689..df44c7a2 100644
--- a/content/aspnetcore/src/CompanyName.ProjectName.Application/Users/LoginAppService.cs
+++ b/content/aspnetcore/src/CompanyName.ProjectName.Application/Users/LoginAppService.cs
@@ -38,23 +38,24 @@ namespace CompanyNameProjectName.Users
[SwaggerOperation(summary: "登录", Tags = new[] { "Login" })]
public async Task PostAsync(LoginInputDto input)
{
- var result = await _signInManager.PasswordSignInAsync(input.Name, input.Password, false, true);
- if (!result.Succeeded) throw new BusinessException("Login Faild");
-
- var user = await _userManager.FindByNameAsync(input.Name);
- if (user != null)
+ try
{
-
- if (user == null) throw new BusinessException("Login Faild");
+ var result = await _signInManager.PasswordSignInAsync(input.Name, input.Password, false, true);
+ if (!result.Succeeded) throw new Exception("用户名或者密码错误");
+ var user = await _userManager.FindByNameAsync(input.Name);
var roles = await _userManager.GetRolesAsync(user);
- if (roles == null || roles.Count == 0) throw new BusinessException("Login Faild");
+ if (roles == null || roles.Count == 0) throw new Exception("当前用户未分配角色");
var token = GenerateJwt(user, roles.ToList());
var loginOutputDto = ObjectMapper.Map(user);
loginOutputDto.Token = token;
loginOutputDto.Expiration = DateTime.Now.AddHours(_jwtOptions.ExpirationTime);
return loginOutputDto;
}
- throw new BusinessException("Login Faild");
+ catch(Exception ex)
+ {
+ throw new Exception(ex.Message);
+ }
+
}
///
diff --git a/content/aspnetcore/src/CompanyName.ProjectName.Application/Users/UserAppService.cs b/content/aspnetcore/src/CompanyName.ProjectName.Application/Users/UserAppService.cs
index 2ec2c220..caeb1e1a 100644
--- a/content/aspnetcore/src/CompanyName.ProjectName.Application/Users/UserAppService.cs
+++ b/content/aspnetcore/src/CompanyName.ProjectName.Application/Users/UserAppService.cs
@@ -1,5 +1,6 @@
using CompanyNameProjectName.Users.Dtos;
using Microsoft.AspNetCore.Authorization;
+using Microsoft.AspNetCore.Identity;
using Microsoft.AspNetCore.Mvc;
using Swashbuckle.AspNetCore.Annotations;
using System;
@@ -10,16 +11,19 @@ using System.Threading.Tasks;
using Volo.Abp.Application.Dtos;
using Volo.Abp.Application.Services;
using Volo.Abp.Identity;
+using Volo.Abp.Users;
namespace CompanyNameProjectName.Users
{
+ [Authorize]
public class UserAppService : ApplicationService
{
private readonly IIdentityUserAppService _identityUserAppService;
-
- public UserAppService(IIdentityUserAppService identityUserAppService)
+ private readonly IdentityUserManager _userManager;
+ public UserAppService(IIdentityUserAppService identityUserAppService, IdentityUserManager userManager)
{
_identityUserAppService = identityUserAppService;
+ _userManager = userManager;
}
[SwaggerOperation(summary: "分页获取用户信息", Tags = new[] { "User" })]
@@ -65,5 +69,27 @@ namespace CompanyNameProjectName.Users
{
return await _identityUserAppService.GetRolesAsync(userId);
}
+
+ ///
+ /// 修改密码
+ ///
+ ///
+ ///
+ public async Task ChangePasswordAsync(ChangePasswordInput input)
+ {
+ var identityUser = await _userManager.GetByIdAsync(base.CurrentUser.GetId());
+ IdentityResult result;
+ if (identityUser.PasswordHash == null)
+ {
+ result = await _userManager.AddPasswordAsync(identityUser, input.NewPassword);
+ }
+ else
+ {
+ result = await _userManager.ChangePasswordAsync(identityUser, input.CurrentPassword, input.NewPassword);
+ }
+
+ if (!result.Succeeded) throw new Exception(result.Errors.FirstOrDefault().Description);
+ return result.Succeeded;
+ }
}
}
diff --git a/content/aspnetcore/src/CompanyName.ProjectName.HttpApi/CompanyNameProjectName.HttpApi.xml b/content/aspnetcore/src/CompanyName.ProjectName.HttpApi/CompanyNameProjectName.HttpApi.xml
new file mode 100644
index 00000000..27b12d23
--- /dev/null
+++ b/content/aspnetcore/src/CompanyName.ProjectName.HttpApi/CompanyNameProjectName.HttpApi.xml
@@ -0,0 +1,8 @@
+
+
+
+ CompanyName.ProjectName.HttpApi
+
+
+
+
diff --git a/content/vue/src/layouts/default/header/components/user-dropdown/ChangePassword.vue b/content/vue/src/layouts/default/header/components/user-dropdown/ChangePassword.vue
new file mode 100644
index 00000000..8460b7d2
--- /dev/null
+++ b/content/vue/src/layouts/default/header/components/user-dropdown/ChangePassword.vue
@@ -0,0 +1,83 @@
+
+
+
+
+
+
+
diff --git a/content/vue/src/layouts/default/header/components/user-dropdown/index.vue b/content/vue/src/layouts/default/header/components/user-dropdown/index.vue
index 9c6779ac..5913631d 100644
--- a/content/vue/src/layouts/default/header/components/user-dropdown/index.vue
+++ b/content/vue/src/layouts/default/header/components/user-dropdown/index.vue
@@ -17,6 +17,11 @@
icon="ion:document-text-outline"
v-if="getShowDoc"
/>
+