Browse Source

fix:

1.添加修改密码
2.优化前端
old-3.0
王军 5 years ago
parent
commit
fd5a6c7587
  1. 84
      content/aspnetcore/host/CompanyName.ProjectName.HttpApi.Host/CompanyNameProjectName.HttpApi.Host.xml
  2. 4
      content/aspnetcore/host/CompanyName.ProjectName.HttpApi.Host/appsettings.json
  3. 44
      content/aspnetcore/src/CompanyName.ProjectName.Application.Contracts/CompanyNameProjectName.Application.Contracts.xml
  4. 73
      content/aspnetcore/src/CompanyName.ProjectName.Application/CompanyNameProjectName.Application.xml
  5. 17
      content/aspnetcore/src/CompanyName.ProjectName.Application/Users/LoginAppService.cs
  6. 30
      content/aspnetcore/src/CompanyName.ProjectName.Application/Users/UserAppService.cs
  7. 8
      content/aspnetcore/src/CompanyName.ProjectName.HttpApi/CompanyNameProjectName.HttpApi.xml
  8. 83
      content/vue/src/layouts/default/header/components/user-dropdown/ChangePassword.vue
  9. 19
      content/vue/src/layouts/default/header/components/user-dropdown/index.vue
  10. 5
      content/vue/src/locales/lang/en/layout/header.ts
  11. 6
      content/vue/src/locales/lang/zh_CN/layout/header.ts
  12. 4
      content/vue/src/router/index.ts
  13. 5113
      content/vue/src/services/ServiceProxies.ts
  14. 11
      content/vue/src/services/ServiceProxyBase.ts
  15. 1
      content/vue/src/store/modules/user.ts
  16. 11
      content/vue/src/views/admin/roles/AbpRole.ts
  17. 10
      content/vue/src/views/admin/roles/CreateAbpRole.vue
  18. 4
      content/vue/src/views/admin/roles/EditAbpRole.vue
  19. 12
      content/vue/src/views/admin/roles/PermissionAbpRole.vue
  20. 13
      content/vue/src/views/admin/users/AbpUser.ts
  21. 28
      content/vue/src/views/admin/users/CreateAbpUser.vue
  22. 29
      content/vue/src/views/admin/users/EditAbpUser.vue
  23. 47
      content/vue/src/views/sys/login/LoginForm.vue

84
content/aspnetcore/host/CompanyName.ProjectName.HttpApi.Host/CompanyNameProjectName.HttpApi.Host.xml

@ -0,0 +1,84 @@
<?xml version="1.0"?>
<doc>
<assembly>
<name>CompanyName.ProjectName.HttpApi.Host</name>
</assembly>
<members>
<member name="M:CompanyNameProjectName.CompanyNameProjectNameHttpApiHostModule.ConfigureOptions(Volo.Abp.Modularity.ServiceConfigurationContext)">
<summary>
配置options
</summary>
<param name="context"></param>
</member>
<member name="M:CompanyNameProjectName.CompanyNameProjectNameHttpApiHostModule.ConfigureAuditLog">
<summary>
审计日志
</summary>
</member>
<member name="M:CompanyNameProjectName.CompanyNameProjectNameHttpApiHostModule.ConfigureCache(Microsoft.Extensions.DependencyInjection.IServiceCollection)">
<summary>
Redis缓存
</summary>
<param name="services"></param>
</member>
<member name="M:CompanyNameProjectName.CompanyNameProjectNameHttpApiHostModule.ConfigureAbpExcepotions(Volo.Abp.Modularity.ServiceConfigurationContext)">
<summary>
异常处理
</summary>
<param name="context"></param>
</member>
<member name="M:CompanyNameProjectName.CompanyNameProjectNameHttpApiHostModule.ConfigureVirtualFileSystem(Volo.Abp.Modularity.ServiceConfigurationContext)">
<summary>
配置虚拟文件系统
</summary>
<param name="context"></param>
</member>
<member name="M:CompanyNameProjectName.CompanyNameProjectNameHttpApiHostModule.ConfigureConventionalControllers">
<summary>
映射Controller
</summary>
</member>
<member name="M:CompanyNameProjectName.CompanyNameProjectNameHttpApiHostModule.ConfigureJwtAuthentication(Volo.Abp.Modularity.ServiceConfigurationContext,Microsoft.Extensions.Configuration.IConfiguration)">
<summary>
配置JWT
</summary>
<param name="context"></param>
<param name="configuration"></param>
</member>
<member name="M:CompanyNameProjectName.CompanyNameProjectNameHttpApiHostModule.ConfigureSwaggerServices(Volo.Abp.Modularity.ServiceConfigurationContext)">
<summary>
配置SwaggerUI
</summary>
<param name="context"></param>
</member>
<member name="M:CompanyNameProjectName.CompanyNameProjectNameHttpApiHostModule.ConfigureLocalization">
<summary>
配置本地化
</summary>
</member>
<member name="M:CompanyNameProjectName.CompanyNameProjectNameHttpApiHostModule.ConfigureCors(Volo.Abp.Modularity.ServiceConfigurationContext,Microsoft.Extensions.Configuration.IConfiguration)">
<summary>
配置跨域
</summary>
<param name="context"></param>
<param name="configuration"></param>
</member>
<member name="M:CompanyNameProjectName.CompanyNameProjectNameHttpApiHostModule.ConfigureHangfire(Microsoft.Extensions.DependencyInjection.IServiceCollection)">
<summary>
配置Hangfire服务
</summary>
<param name="services"></param>
</member>
<member name="T:CompanyNameProjectName.Extensions.Filters.HiddenAbpDefaultApiFilter">
<summary>
在使用nswag的时候,原生默认的api导致生产的代理类存在问题
所有隐藏原生的api,重写路由
</summary>
</member>
<member name="T:CompanyNameProjectName.Extensions.Filters.SwaggerTagsFilter">
<summary>
把abp vnext 提供的api 归档
</summary>
</member>
</members>
</doc>

4
content/aspnetcore/host/CompanyName.ProjectName.HttpApi.Host/appsettings.json

@ -31,11 +31,11 @@
} }
}, },
"ConnectionStrings": { "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": { "Cache": {
"Redis": { "Redis": {
"ConnectionString": "redis.platform.development.cn,password=OD5VbzIuAWsHOZV5ncYx9xaDsAMsKXn7", "ConnectionString": "redis.platform.development.yhglobal.cn,password=OD5VbzIuAWsHOZV5ncYx9xaDsAMsKXn7",
"DatabaseId": 234 "DatabaseId": 234
} }
}, },

44
content/aspnetcore/src/CompanyName.ProjectName.Application.Contracts/CompanyNameProjectName.Application.Contracts.xml

@ -0,0 +1,44 @@
<?xml version="1.0"?>
<doc>
<assembly>
<name>CompanyName.ProjectName.Application.Contracts</name>
</assembly>
<members>
<member name="M:CompanyNameProjectName.Jobs.IRecurringJob.ExecuteAsync">
<summary>
执行任务
</summary>
<returns></returns>
</member>
<member name="P:CompanyNameProjectName.Pages.Dtos.CustomeRequestDto.PageIndex">
<summary>
当前页面
</summary>
</member>
<member name="P:CompanyNameProjectName.Pages.Dtos.CustomeRequestDto.PageSize">
<summary>
每页多少条
</summary>
</member>
<member name="T:CompanyNameProjectName.Dtos.Users.LoginInputDto">
<summary>
登录
</summary>
</member>
<member name="P:CompanyNameProjectName.Dtos.Users.LoginInputDto.Name">
<summary>
用户名或者邮箱
</summary>
</member>
<member name="P:CompanyNameProjectName.Dtos.Users.LoginInputDto.Password">
<summary>
密码
</summary>
</member>
<member name="P:CompanyNameProjectName.Dtos.Users.LoginOutputDto.Expiration">
<summary>
过期时间
</summary>
</member>
</members>
</doc>

73
content/aspnetcore/src/CompanyName.ProjectName.Application/CompanyNameProjectName.Application.xml

@ -0,0 +1,73 @@
<?xml version="1.0"?>
<doc>
<assembly>
<name>CompanyName.ProjectName.Application</name>
</assembly>
<members>
<member name="T:CompanyNameProjectName.Jobs.CronTypeHelper">
<summary>
Cron类型
</summary>
</member>
<member name="M:CompanyNameProjectName.Jobs.CronTypeHelper.Minute(System.Int32)">
<summary>
周期性为分钟的任务
</summary>
<param name="interval">执行周期的间隔,默认为每分钟一次</param>
<returns></returns>
</member>
<member name="M:CompanyNameProjectName.Jobs.CronTypeHelper.Hour(System.Int32,System.Int32)">
<summary>
周期性为小时的任务
</summary>
<param name="minute">第几分钟开始,默认为第一分钟</param>
<param name="interval">执行周期的间隔,默认为每小时一次</param>
<returns></returns>
</member>
<member name="M:CompanyNameProjectName.Jobs.CronTypeHelper.Day(System.Int32,System.Int32,System.Int32)">
<summary>
周期性为天的任务
</summary>
<param name="hour">第几小时开始,默认从1点开始</param>
<param name="minute">第几分钟开始,默认从第1分钟开始</param>
<param name="interval">执行周期的间隔,默认为每天一次</param>
<returns></returns>
</member>
<member name="M:CompanyNameProjectName.Jobs.CronTypeHelper.Week(System.DayOfWeek,System.Int32,System.Int32)">
<summary>
周期性为周的任务
</summary>
<param name="dayOfWeek">星期几开始,默认从星期一点开始</param>
<param name="hour">第几小时开始,默认从1点开始</param>
<param name="minute">第几分钟开始,默认从第1分钟开始</param>
<returns></returns>
</member>
<member name="M:CompanyNameProjectName.Jobs.CronTypeHelper.Month(System.Int32,System.Int32,System.Int32)">
<summary>
周期性为月的任务
</summary>
<param name="day">几号开始,默认从一号开始</param>
<param name="hour">第几小时开始,默认从1点开始</param>
<param name="minute">第几分钟开始,默认从第1分钟开始</param>
<returns></returns>
</member>
<member name="M:CompanyNameProjectName.Jobs.CronTypeHelper.Year(System.Int32,System.Int32,System.Int32,System.Int32)">
<summary>
周期性为年的任务
</summary>
<param name="month">几月开始,默认从一月开始</param>
<param name="day">几号开始,默认从一号开始</param>
<param name="hour">第几小时开始,默认从1点开始</param>
<param name="minute">第几分钟开始,默认从第1分钟开始</param>
<returns></returns>
</member>
<member name="M:CompanyNameProjectName.Users.LoginAppService.GenerateJwt(Volo.Abp.Identity.IdentityUser,System.Collections.Generic.List{System.String})">
<summary>
生成jwt token
</summary>
<param name="user"></param>
<param name="roles"></param>
<returns></returns>
</member>
</members>
</doc>

17
content/aspnetcore/src/CompanyName.ProjectName.Application/Users/LoginAppService.cs

@ -37,24 +37,25 @@ namespace CompanyNameProjectName.Users
[SwaggerOperation(summary: "登录", Tags = new[] { "Login" })] [SwaggerOperation(summary: "登录", Tags = new[] { "Login" })]
public async Task<LoginOutputDto> PostAsync(LoginInputDto input) public async Task<LoginOutputDto> PostAsync(LoginInputDto input)
{
try
{ {
var result = await _signInManager.PasswordSignInAsync(input.Name, input.Password, false, true); var result = await _signInManager.PasswordSignInAsync(input.Name, input.Password, false, true);
if (!result.Succeeded) throw new BusinessException("Login Faild"); if (!result.Succeeded) throw new Exception("用户名或者密码错误");
var user = await _userManager.FindByNameAsync(input.Name); var user = await _userManager.FindByNameAsync(input.Name);
if (user != null)
{
if (user == null) throw new BusinessException("Login Faild");
var roles = await _userManager.GetRolesAsync(user); 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 token = GenerateJwt(user, roles.ToList());
var loginOutputDto = ObjectMapper.Map<IdentityUser, LoginOutputDto>(user); var loginOutputDto = ObjectMapper.Map<IdentityUser, LoginOutputDto>(user);
loginOutputDto.Token = token; loginOutputDto.Token = token;
loginOutputDto.Expiration = DateTime.Now.AddHours(_jwtOptions.ExpirationTime); loginOutputDto.Expiration = DateTime.Now.AddHours(_jwtOptions.ExpirationTime);
return loginOutputDto; return loginOutputDto;
} }
throw new BusinessException("Login Faild"); catch(Exception ex)
{
throw new Exception(ex.Message);
}
} }
/// <summary> /// <summary>

30
content/aspnetcore/src/CompanyName.ProjectName.Application/Users/UserAppService.cs

@ -1,5 +1,6 @@
using CompanyNameProjectName.Users.Dtos; using CompanyNameProjectName.Users.Dtos;
using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Identity;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
using Swashbuckle.AspNetCore.Annotations; using Swashbuckle.AspNetCore.Annotations;
using System; using System;
@ -10,16 +11,19 @@ using System.Threading.Tasks;
using Volo.Abp.Application.Dtos; using Volo.Abp.Application.Dtos;
using Volo.Abp.Application.Services; using Volo.Abp.Application.Services;
using Volo.Abp.Identity; using Volo.Abp.Identity;
using Volo.Abp.Users;
namespace CompanyNameProjectName.Users namespace CompanyNameProjectName.Users
{ {
[Authorize]
public class UserAppService : ApplicationService public class UserAppService : ApplicationService
{ {
private readonly IIdentityUserAppService _identityUserAppService; private readonly IIdentityUserAppService _identityUserAppService;
private readonly IdentityUserManager _userManager;
public UserAppService(IIdentityUserAppService identityUserAppService) public UserAppService(IIdentityUserAppService identityUserAppService, IdentityUserManager userManager)
{ {
_identityUserAppService = identityUserAppService; _identityUserAppService = identityUserAppService;
_userManager = userManager;
} }
[SwaggerOperation(summary: "分页获取用户信息", Tags = new[] { "User" })] [SwaggerOperation(summary: "分页获取用户信息", Tags = new[] { "User" })]
@ -65,5 +69,27 @@ namespace CompanyNameProjectName.Users
{ {
return await _identityUserAppService.GetRolesAsync(userId); return await _identityUserAppService.GetRolesAsync(userId);
} }
/// <summary>
/// 修改密码
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
public async Task<bool> 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;
}
} }
} }

8
content/aspnetcore/src/CompanyName.ProjectName.HttpApi/CompanyNameProjectName.HttpApi.xml

@ -0,0 +1,8 @@
<?xml version="1.0"?>
<doc>
<assembly>
<name>CompanyName.ProjectName.HttpApi</name>
</assembly>
<members>
</members>
</doc>

83
content/vue/src/layouts/default/header/components/user-dropdown/ChangePassword.vue

@ -0,0 +1,83 @@
<template>
<BasicModal
:title="t('layout.header.changePassword')"
v-bind="$attrs"
@register="register"
:canFullscreen="false"
@ok="submit"
:minHeight="120"
:height="120"
>
<BasicForm @register="registerForm" />
</BasicModal>
</template>
<script lang="ts">
import { defineComponent } from 'vue';
import { useI18n } from '/@/hooks/web/useI18n';
import { BasicModal, useModalInner } from '/@/components/Modal/index';
import { BasicForm, useForm } from '/@/components/Form/index';
import { UserServiceProxy, ChangePasswordInput } from '/@/services/ServiceProxies';
import { message } from 'ant-design-vue';
export default defineComponent({
name: 'DefaultWarehouse',
components: { BasicModal, BasicForm },
setup() {
const { t } = useI18n();
const [register, { changeOkLoading, closeModal }] = useModalInner();
const [registerForm, { getFieldsValue, validate, resetFields }] = useForm({
showActionButtonGroup: false,
schemas: [
{
field: 'currentPassword',
label: t('layout.header.currentPassword'),
component: 'InputPassword',
required: true,
labelWidth: 120,
colProps: {
span: 22,
},
},
{
field: 'newPassword',
label: t('layout.header.newPassword'),
component: 'InputPassword',
required: true,
labelWidth: 120,
colProps: {
span: 22,
},
},
],
});
const submit = async () => {
try {
changeOkLoading(true);
await validate();
const _userServiceProxy = new UserServiceProxy();
const request = getFieldsValue() as ChangePasswordInput;
var result = await _userServiceProxy.changePassword(request);
changeOkLoading(false);
if (!result) {
message.error(t('common.operationFail'));
} else {
closeModal();
}
resetFields();
} catch (error) {
changeOkLoading(false);
}
};
return {
t,
register,
registerForm,
submit,
};
},
});
</script>
<style lang="less" scoped></style>

19
content/vue/src/layouts/default/header/components/user-dropdown/index.vue

@ -17,6 +17,11 @@
icon="ion:document-text-outline" icon="ion:document-text-outline"
v-if="getShowDoc" v-if="getShowDoc"
/> />
<MenuItem
key="password"
:text="t('layout.header.changePassword')"
icon="ant-design:info-circle-outlined"
/>
<MenuDivider v-if="getShowDoc" /> <MenuDivider v-if="getShowDoc" />
<MenuItem <MenuItem
key="lock" key="lock"
@ -32,6 +37,7 @@
</template> </template>
</Dropdown> </Dropdown>
<LockAction @register="register" /> <LockAction @register="register" />
<PasswordAction @register="registerChangePasswordModal" />
</template> </template>
<script lang="ts"> <script lang="ts">
// components // components
@ -53,7 +59,7 @@
import { createAsyncComponent } from '/@/utils/factory/createAsyncComponent'; import { createAsyncComponent } from '/@/utils/factory/createAsyncComponent';
type MenuEvent = 'logout' | 'doc' | 'lock'; type MenuEvent = 'logout' | 'doc' | 'lock' | 'password';
export default defineComponent({ export default defineComponent({
name: 'UserDropdown', name: 'UserDropdown',
@ -63,6 +69,7 @@
MenuItem: createAsyncComponent(() => import('./DropMenuItem.vue')), MenuItem: createAsyncComponent(() => import('./DropMenuItem.vue')),
MenuDivider: Menu.Divider, MenuDivider: Menu.Divider,
LockAction: createAsyncComponent(() => import('../lock/LockModal.vue')), LockAction: createAsyncComponent(() => import('../lock/LockModal.vue')),
PasswordAction: createAsyncComponent(() => import('./ChangePassword.vue')),
}, },
props: { props: {
theme: propTypes.oneOf(['dark', 'light']), theme: propTypes.oneOf(['dark', 'light']),
@ -79,7 +86,7 @@
}); });
const [register, { openModal }] = useModal(); const [register, { openModal }] = useModal();
const [registerChangePasswordModal, { openModal: openChangePasswordModal }] = useModal();
function handleLock() { function handleLock() {
openModal(true); openModal(true);
} }
@ -94,6 +101,10 @@
openWindow(DOC_URL); openWindow(DOC_URL);
} }
function handleChangePassword() {
openChangePasswordModal(true);
}
function handleMenuClick(e: { key: MenuEvent }) { function handleMenuClick(e: { key: MenuEvent }) {
switch (e.key) { switch (e.key) {
case 'logout': case 'logout':
@ -105,6 +116,9 @@
case 'lock': case 'lock':
handleLock(); handleLock();
break; break;
case 'password':
handleChangePassword();
break;
} }
} }
@ -116,6 +130,7 @@
getShowDoc, getShowDoc,
headerImg, headerImg,
register, register,
registerChangePasswordModal,
}; };
}, },
}); });

5
content/vue/src/locales/lang/en/layout/header.ts

@ -1,6 +1,6 @@
export default { export default {
// user dropdown // user dropdown
dropdownItemDoc: 'Document', dropdownItemDoc: 'Front Document',
dropdownItemLoginOut: 'Login Out', dropdownItemLoginOut: 'Login Out',
tooltipErrorLog: 'Error log', tooltipErrorLog: 'Error log',
@ -16,4 +16,7 @@ export default {
lockScreenBtn: 'Locking', lockScreenBtn: 'Locking',
home: 'Home', home: 'Home',
changePassword: "ChangePassword",
currentPassword: "CurrentPassword",
newPassword: "NewPassword"
}; };

6
content/vue/src/locales/lang/zh_CN/layout/header.ts

@ -1,6 +1,6 @@
export default { export default {
// user dropdown // user dropdown
dropdownItemDoc: '文档', dropdownItemDoc: '前端文档',
dropdownItemLoginOut: '退出系统', dropdownItemLoginOut: '退出系统',
// tooltip // tooltip
@ -17,4 +17,8 @@ export default {
lockScreenBtn: '锁定', lockScreenBtn: '锁定',
home: '首页', home: '首页',
changePassword: "修改密码",
currentPassword: "当前密码",
newPassword: "新密码"
}; };

4
content/vue/src/router/index.ts

@ -1,7 +1,7 @@
import type { RouteRecordRaw } from 'vue-router'; import type { RouteRecordRaw } from 'vue-router';
import type { App } from 'vue'; import type { App } from 'vue';
import { createRouter, createWebHashHistory } from 'vue-router'; import { createRouter, createWebHistory } from 'vue-router';
import { basicRoutes, LoginRoute } from './routes'; import { basicRoutes, LoginRoute } from './routes';
import { REDIRECT_NAME } from './constant'; import { REDIRECT_NAME } from './constant';
@ -9,7 +9,7 @@ const WHITE_NAME_LIST = [LoginRoute.name, REDIRECT_NAME];
// app router // app router
const router = createRouter({ const router = createRouter({
history: createWebHashHistory(import.meta.env.VITE_PUBLIC_PATH), history: createWebHistory(import.meta.env.VITE_PUBLIC_PATH),
routes: (basicRoutes as unknown) as RouteRecordRaw[], routes: (basicRoutes as unknown) as RouteRecordRaw[],
strict: true, strict: true,
scrollBehavior: () => ({ left: 0, top: 0 }), scrollBehavior: () => ({ left: 0, top: 0 }),

5113
content/vue/src/services/ServiceProxies.ts

File diff suppressed because it is too large

11
content/vue/src/services/ServiceProxyBase.ts

@ -23,15 +23,12 @@ export class ServiceProxyBase {
protected transformResult(url: string, response: AxiosResponse, processor: (response: AxiosResponse) => Promise<any>): Promise<any> { protected transformResult(url: string, response: AxiosResponse, processor: (response: AxiosResponse) => Promise<any>): Promise<any> {
const { t } = useI18n(); const { t } = useI18n();
if (response.status == 401 || response.status == 403) { if (response.status == 401 || response.status == 403 || response.status == 302) {
message.error(t('common.authorityText')); message.error(t('common.authorityText'));
router.replace(PageEnum.BASE_LOGIN) router.replace(PageEnum.BASE_LOGIN)
} else if (response.status == 200 || response.status == 204) { } else if (response.status >= 500) {
message.error(response.data.error.message)
} else {
message.error(t('common.systemErrorText'));
} }
return processor(response); return processor(response);
} }
@ -45,7 +42,7 @@ export class ServiceProxyBase {
const userStore = useUserStoreWidthOut(); const userStore = useUserStoreWidthOut();
const token = userStore.getToken; const token = userStore.getToken;
const language = userStore.getLanguage; const language = userStore.getLanguage == undefined ? 'zh-Hans' : userStore.getLanguage;
return { return {
token, language token, language
}; };

1
content/vue/src/store/modules/user.ts

@ -105,7 +105,6 @@ export const useUserStore = defineStore({
async getAbpApplicationConfigurationAsync() { async getAbpApplicationConfigurationAsync() {
var application = await getAbpApplicationConfiguration(); var application = await getAbpApplicationConfiguration();
const permissionStore = usePermissionStore(); const permissionStore = usePermissionStore();
debugger;
const grantPolicy = Object.keys(application.auth?.grantedPolicies as object); const grantPolicy = Object.keys(application.auth?.grantedPolicies as object);
permissionStore.setPermCodeList(grantPolicy); permissionStore.setPermCodeList(grantPolicy);
}, },

11
content/vue/src/views/admin/roles/AbpRole.ts

@ -123,7 +123,7 @@ export async function deleleRoleAsync({ roleId, reload }) {
* @param param0 * @param param0
*/ */
export async function createRoleAsync({ request, changeOkLoading, validate, closeModal }) { export async function createRoleAsync({ request, changeOkLoading, validate, closeModal }) {
try {
changeOkLoading(true); changeOkLoading(true);
await validate(); await validate();
let requestBody: IdentityRoleCreateDto = new IdentityRoleCreateDto(); let requestBody: IdentityRoleCreateDto = new IdentityRoleCreateDto();
@ -134,9 +134,7 @@ export async function createRoleAsync({ request, changeOkLoading, validate, clos
changeOkLoading(false); changeOkLoading(false);
message.success(t('common.operationSuccess')); message.success(t('common.operationSuccess'));
closeModal(); closeModal();
} catch (error) {
changeOkLoading(false);
}
} }
/** /**
@ -167,8 +165,6 @@ export async function updateRolePermissionAsync({ request, closeDrawer, setDrawe
* @param param0 * @param param0
*/ */
export async function updateRoleAsync({ request, changeOkLoading, validate, closeModal }) { export async function updateRoleAsync({ request, changeOkLoading, validate, closeModal }) {
try {
await validate(); await validate();
changeOkLoading(true); changeOkLoading(true);
const _roleServiceProxy = new RoleServiceProxy(); const _roleServiceProxy = new RoleServiceProxy();
@ -176,9 +172,6 @@ export async function updateRoleAsync({ request, changeOkLoading, validate, clos
changeOkLoading(false); changeOkLoading(false);
message.success(t('common.operationSuccess')); message.success(t('common.operationSuccess'));
closeModal(); closeModal();
} catch (error) {
changeOkLoading(false);
}
} }

10
content/vue/src/views/admin/roles/CreateAbpRole.vue

@ -29,18 +29,24 @@
const ctx = useContext(); const ctx = useContext();
const { t } = useI18n(); const { t } = useI18n();
const [registerModal, { changeOkLoading, closeModal }] = useModalInner(); const [registerUserForm, { getFieldsValue, validate, resetFields }] = useForm({
const [registerUserForm, { getFieldsValue, validate }] = useForm({
labelWidth: 120, labelWidth: 120,
schemas: createFormSchema, schemas: createFormSchema,
showActionButtonGroup: false, showActionButtonGroup: false,
}); });
const [registerModal, { changeOkLoading, closeModal }] = useModalInner();
// //
const submit = async () => { const submit = async () => {
try {
const request = getFieldsValue(); const request = getFieldsValue();
await createRoleAsync({ request, changeOkLoading, validate, closeModal }); await createRoleAsync({ request, changeOkLoading, validate, closeModal });
resetFields();
ctx.emit('reload'); ctx.emit('reload');
} catch (error) {
changeOkLoading(false);
}
}; };
const cancel = () => { const cancel = () => {

4
content/vue/src/views/admin/roles/EditAbpRole.vue

@ -48,6 +48,7 @@
// //
const submit = async () => { const submit = async () => {
try {
const request = getFieldsValue(); const request = getFieldsValue();
let role = new UpdateRoleInput(); let role = new UpdateRoleInput();
role.roleId = currentRoleInfo.id; role.roleId = currentRoleInfo.id;
@ -58,6 +59,9 @@
role.roleInfo.concurrencyStamp = currentRoleInfo.concurrencyStamp; role.roleInfo.concurrencyStamp = currentRoleInfo.concurrencyStamp;
await updateRoleAsync({ request: role, changeOkLoading, validate, closeModal }); await updateRoleAsync({ request: role, changeOkLoading, validate, closeModal });
ctx.emit('reload'); ctx.emit('reload');
} catch (error) {
changeOkLoading(false);
}
}; };
return { return {

12
content/vue/src/views/admin/roles/PermissionAbpRole.vue

@ -2,8 +2,16 @@
<BasicDrawer <BasicDrawer
@register="registerDrawer" @register="registerDrawer"
:title="t('routes.admin.roleManagement_permission')" :title="t('routes.admin.roleManagement_permission')"
width="15%" width="20%"
> >
<!-- <a-tree
checkable
:tree-data="allPermissionsRef"
v-model:checkedKeys="currentRolePermissionsRef"
>
<template #title0010><span style="color: #1890ff"></span></template>
</a-tree> -->
<BasicTree <BasicTree
:treeData="allPermissionsRef" :treeData="allPermissionsRef"
checkable checkable
@ -88,6 +96,7 @@
}); });
allPermissionsRef.push(temp); allPermissionsRef.push(temp);
}); });
setDrawerProps({ loading: false }); setDrawerProps({ loading: false });
}; };
@ -98,6 +107,7 @@
let permisstions: UpdatePermissionDto[] = []; let permisstions: UpdatePermissionDto[] = [];
request.providerName = 'R'; request.providerName = 'R';
request.providerKey = roleName; request.providerKey = roleName;
currentRolePermissionsRef.value.forEach((item) => { currentRolePermissionsRef.value.forEach((item) => {
if (item.indexOf('.') > 0) { if (item.indexOf('.') > 0) {
let permisstion = new UpdatePermissionDto(); let permisstion = new UpdatePermissionDto();

13
content/vue/src/views/admin/users/AbpUser.ts

@ -170,7 +170,7 @@ export async function getAllRoleAsync(): Promise<IdentityRoleDtoListResultDto> {
* @param param0 * @param param0
*/ */
export async function createUserAsync({ request, changeOkLoading, validate, closeModal, resetFields }) { export async function createUserAsync({ request, changeOkLoading, validate, closeModal, resetFields }) {
try {
changeOkLoading(true); changeOkLoading(true);
await validate(); await validate();
const _userServiceProxy = new UserServiceProxy(); const _userServiceProxy = new UserServiceProxy();
@ -179,9 +179,7 @@ export async function createUserAsync({ request, changeOkLoading, validate, clos
message.success(t('common.operationSuccess')); message.success(t('common.operationSuccess'));
resetFields(); resetFields();
closeModal(); closeModal();
} catch (error) {
changeOkLoading(false);
}
} }
/** /**
@ -199,7 +197,6 @@ export async function deleteUserAsync({ userId, reload }) {
} catch (error) { } catch (error) {
closeFullLoading(); closeFullLoading();
} }
} }
/** /**
@ -207,7 +204,7 @@ export async function deleteUserAsync({ userId, reload }) {
* @param param0 * @param param0
*/ */
export async function updateUserAsync({ request, changeOkLoading, validate, closeModal }) { export async function updateUserAsync({ request, changeOkLoading, validate, closeModal }) {
try {
changeOkLoading(true); changeOkLoading(true);
await validate(); await validate();
const _userServiceProxy = new UserServiceProxy(); const _userServiceProxy = new UserServiceProxy();
@ -215,7 +212,5 @@ export async function updateUserAsync({ request, changeOkLoading, validate, clos
changeOkLoading(false); changeOkLoading(false);
message.success(t('common.operationSuccess')); message.success(t('common.operationSuccess'));
closeModal(); closeModal();
} catch (error) {
changeOkLoading(false);
}
} }

28
content/vue/src/views/admin/users/CreateAbpUser.vue

@ -13,10 +13,24 @@
<BasicForm @register="registerUserForm" /> <BasicForm @register="registerUserForm" />
</TabPane> </TabPane>
<TabPane :tab="t('routes.admin.userManagement_role')" key="2"> <TabPane :tab="t('routes.admin.userManagement_role')" key="2">
<a-checkbox-group @change="onRoleSelectedChange" v-model:value="defaultRolesRef"> <!-- <a-checkbox-group @change="onRoleSelectedChange" v-model:value="defaultRolesRef">
<a-checkbox v-for="(item, index) in rolesRef" :key="index" :value="item.name"> <a-checkbox v-for="(item, index) in rolesRef" :key="index" :value="item.name">
{{ item.name }} {{ item.name }}
</a-checkbox> </a-checkbox>
</a-checkbox-group> -->
<a-checkbox-group @change="onRoleSelectedChange" v-model:value="defaultRolesRef">
<a-row justify="center">
<a-col :span="24">
<a-checkbox
style="width: 150px"
v-for="(item, index) in rolesRef"
:key="index"
:value="item.name"
>{{ item.name }}</a-checkbox
>
</a-col>
</a-row>
</a-checkbox-group> </a-checkbox-group>
</TabPane> </TabPane>
</Tabs> </Tabs>
@ -81,7 +95,7 @@
// //
const submit = async () => { const submit = async () => {
debugger; try {
let request = getFieldsValue() as IdentityUserCreateDto; let request = getFieldsValue() as IdentityUserCreateDto;
request.roleNames = defaultRolesRef; request.roleNames = defaultRolesRef;
await createUserAsync({ await createUserAsync({
@ -92,6 +106,9 @@
resetFields, resetFields,
}); });
ctx.emit('reload'); ctx.emit('reload');
} catch (error) {
changeOkLoading(false);
}
}; };
return { return {
t, t,
@ -106,5 +123,8 @@
}, },
}); });
</script> </script>
<style lang="less" scoped>
<style lang="less" scoped></style> .ant-checkbox-wrapper + .ant-checkbox-wrapper {
margin-left: 0px;
}
</style>

29
content/vue/src/views/admin/users/EditAbpUser.vue

@ -13,10 +13,24 @@
<BasicForm @register="registerUserForm" /> <BasicForm @register="registerUserForm" />
</TabPane> </TabPane>
<TabPane tab="角色" key="2"> <TabPane tab="角色" key="2">
<a-checkbox-group @change="onRoleSelectedChange" v-model:value="defaultRolesRef"> <!-- <a-checkbox-group @change="onRoleSelectedChange" v-model:value="defaultRolesRef">
<a-checkbox v-for="(item, index) in rolesRef" :key="index" :value="item.name"> <a-checkbox v-for="(item, index) in rolesRef" :key="index" :value="item.name">
{{ item.name }} {{ item.name }}
</a-checkbox> </a-checkbox>
</a-checkbox-group> -->
<a-checkbox-group v-model:value="defaultRolesRef" @change="onRoleSelectedChange">
<a-row justify="center">
<a-col :span="24">
<a-checkbox
style="width: 150px"
v-for="(item, index) in rolesRef"
:key="index"
:value="item.name"
>{{ item.name }}</a-checkbox
>
</a-col>
</a-row>
</a-checkbox-group> </a-checkbox-group>
</TabPane> </TabPane>
</Tabs> </Tabs>
@ -75,7 +89,6 @@
let defaultRolesRef = reactive(defaultRoles); let defaultRolesRef = reactive(defaultRoles);
const visibleChange = async (visible: boolean) => { const visibleChange = async (visible: boolean) => {
debugger;
if (visible) { if (visible) {
const roles = await getAllRoleAsync(); const roles = await getAllRoleAsync();
const userRoles = await getRolesByUserIdAsync(currentUserInfo.id as string); const userRoles = await getRolesByUserIdAsync(currentUserInfo.id as string);
@ -99,8 +112,8 @@
}); });
}; };
//
const submit = async () => { const submit = async () => {
try {
let request = getFieldsValue(); let request = getFieldsValue();
let userInfo = new IdentityUserUpdateDto(); let userInfo = new IdentityUserUpdateDto();
request.userId = currentUserInfo.id; request.userId = currentUserInfo.id;
@ -115,6 +128,9 @@
request.userInfo = userInfo; request.userInfo = userInfo;
await updateUserAsync({ request, changeOkLoading, validate, closeModal }); await updateUserAsync({ request, changeOkLoading, validate, closeModal });
ctx.emit('reload'); ctx.emit('reload');
} catch (error) {
changeOkLoading(false);
}
}; };
return { return {
@ -129,5 +145,8 @@
}, },
}); });
</script> </script>
<style lang="less" scoped>
<style lang="less" scoped></style> .ant-checkbox-wrapper + .ant-checkbox-wrapper {
margin-left: 0px;
}
</style>

47
content/vue/src/views/sys/login/LoginForm.vue

@ -1,29 +1,10 @@
<template> <template>
<LoginFormTitle <LoginFormTitle v-show="getShow" class="enter-x" />
v-show="getShow" <Form class="p-4 enter-x" :model="formData" :rules="getFormRules" ref="formRef" v-show="getShow">
class="enter-x" <FormItem name="account" class="enter-x">
/> <Input size="large" v-model:value="formData.account" :placeholder="t('sys.login.userName')" />
<Form
class="p-4 enter-x"
:model="formData"
:rules="getFormRules"
ref="formRef"
v-show="getShow"
>
<FormItem
name="account"
class="enter-x"
>
<Input
size="large"
v-model:value="formData.account"
:placeholder="t('sys.login.userName')"
/>
</FormItem> </FormItem>
<FormItem <FormItem name="password" class="enter-x">
name="password"
class="enter-x"
>
<InputPassword <InputPassword
size="large" size="large"
visibilityToggle visibilityToggle
@ -36,22 +17,18 @@
<ACol :span="12"> <ACol :span="12">
<FormItem> <FormItem>
<!-- No logic, you need to deal with it yourself --> <!-- No logic, you need to deal with it yourself -->
<Checkbox <!-- <Checkbox
v-model:checked="rememberMe" v-model:checked="rememberMe"
size="small" size="small"
> >
{{ t('sys.login.rememberMe') }} {{ t('sys.login.rememberMe') }}
</Checkbox> </Checkbox> -->
</FormItem> </FormItem>
</ACol> </ACol>
<ACol :span="12"> <ACol :span="12">
<FormItem :style="{ 'text-align': 'right' }"> <FormItem :style="{ 'text-align': 'right' }">
<!-- No logic, you need to deal with it yourself --> <!-- No logic, you need to deal with it yourself -->
<Button <Button type="link" size="small" @click="setLoginState(LoginStateEnum.RESET_PASSWORD)">
type="link"
size="small"
@click="setLoginState(LoginStateEnum.RESET_PASSWORD)"
>
{{ t('sys.login.forgetPassword') }} {{ t('sys.login.forgetPassword') }}
</Button> </Button>
</FormItem> </FormItem>
@ -59,13 +36,7 @@
</ARow> </ARow>
<FormItem class="enter-x"> <FormItem class="enter-x">
<Button <Button type="primary" size="large" block @click="handleLogin" :loading="loading">
type="primary"
size="large"
block
@click="handleLogin"
:loading="loading"
>
{{ t('sys.login.loginButton') }} {{ t('sys.login.loginButton') }}
</Button> </Button>
<!-- <Button size="large" class="mt-4 enter-x" block @click="handleRegister"> <!-- <Button size="large" class="mt-4 enter-x" block @click="handleRegister">

Loading…
Cancel
Save