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. 5117
      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. 73
      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": {
"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
}
},

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" })]
public async Task<LoginOutputDto> PostAsync(LoginInputDto input)
{
try
{
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);
if (user != null)
{
if (user == null) throw new BusinessException("Login Faild");
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<IdentityUser, LoginOutputDto>(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);
}
}
/// <summary>

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

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

@ -1,6 +1,6 @@
export default {
// user dropdown
dropdownItemDoc: 'Document',
dropdownItemDoc: 'Front Document',
dropdownItemLoginOut: 'Login Out',
tooltipErrorLog: 'Error log',
@ -16,4 +16,7 @@ export default {
lockScreenBtn: 'Locking',
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 {
// user dropdown
dropdownItemDoc: '文档',
dropdownItemDoc: '前端文档',
dropdownItemLoginOut: '退出系统',
// tooltip
@ -17,4 +17,8 @@ export default {
lockScreenBtn: '锁定',
home: '首页',
changePassword: "修改密码",
currentPassword: "当前密码",
newPassword: "新密码"
};

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

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

5117
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> {
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'));
router.replace(PageEnum.BASE_LOGIN)
} else if (response.status == 200 || response.status == 204) {
} else {
message.error(t('common.systemErrorText'));
} else if (response.status >= 500) {
message.error(response.data.error.message)
}
return processor(response);
}
@ -45,7 +42,7 @@ export class ServiceProxyBase {
const userStore = useUserStoreWidthOut();
const token = userStore.getToken;
const language = userStore.getLanguage;
const language = userStore.getLanguage == undefined ? 'zh-Hans' : userStore.getLanguage;
return {
token, language
};

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

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

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

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

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

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

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

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

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

@ -2,8 +2,16 @@
<BasicDrawer
@register="registerDrawer"
: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
:treeData="allPermissionsRef"
checkable
@ -88,6 +96,7 @@
});
allPermissionsRef.push(temp);
});
setDrawerProps({ loading: false });
};
@ -98,6 +107,7 @@
let permisstions: UpdatePermissionDto[] = [];
request.providerName = 'R';
request.providerKey = roleName;
currentRolePermissionsRef.value.forEach((item) => {
if (item.indexOf('.') > 0) {
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
*/
export async function createUserAsync({ request, changeOkLoading, validate, closeModal, resetFields }) {
try {
changeOkLoading(true);
await validate();
const _userServiceProxy = new UserServiceProxy();
@ -179,9 +179,7 @@ export async function createUserAsync({ request, changeOkLoading, validate, clos
message.success(t('common.operationSuccess'));
resetFields();
closeModal();
} catch (error) {
changeOkLoading(false);
}
}
/**
@ -199,7 +197,6 @@ export async function deleteUserAsync({ userId, reload }) {
} catch (error) {
closeFullLoading();
}
}
/**
@ -207,7 +204,7 @@ export async function deleteUserAsync({ userId, reload }) {
* @param param0
*/
export async function updateUserAsync({ request, changeOkLoading, validate, closeModal }) {
try {
changeOkLoading(true);
await validate();
const _userServiceProxy = new UserServiceProxy();
@ -215,7 +212,5 @@ export async function updateUserAsync({ request, changeOkLoading, validate, clos
changeOkLoading(false);
message.success(t('common.operationSuccess'));
closeModal();
} catch (error) {
changeOkLoading(false);
}
}

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

@ -13,10 +13,24 @@
<BasicForm @register="registerUserForm" />
</TabPane>
<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">
{{ item.name }}
</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>
</TabPane>
</Tabs>
@ -81,7 +95,7 @@
//
const submit = async () => {
debugger;
try {
let request = getFieldsValue() as IdentityUserCreateDto;
request.roleNames = defaultRolesRef;
await createUserAsync({
@ -92,6 +106,9 @@
resetFields,
});
ctx.emit('reload');
} catch (error) {
changeOkLoading(false);
}
};
return {
t,
@ -106,5 +123,8 @@
},
});
</script>
<style lang="less" scoped></style>
<style lang="less" scoped>
.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" />
</TabPane>
<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">
{{ item.name }}
</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>
</TabPane>
</Tabs>
@ -75,7 +89,6 @@
let defaultRolesRef = reactive(defaultRoles);
const visibleChange = async (visible: boolean) => {
debugger;
if (visible) {
const roles = await getAllRoleAsync();
const userRoles = await getRolesByUserIdAsync(currentUserInfo.id as string);
@ -99,8 +112,8 @@
});
};
//
const submit = async () => {
try {
let request = getFieldsValue();
let userInfo = new IdentityUserUpdateDto();
request.userId = currentUserInfo.id;
@ -115,6 +128,9 @@
request.userInfo = userInfo;
await updateUserAsync({ request, changeOkLoading, validate, closeModal });
ctx.emit('reload');
} catch (error) {
changeOkLoading(false);
}
};
return {
@ -129,5 +145,8 @@
},
});
</script>
<style lang="less" scoped></style>
<style lang="less" scoped>
.ant-checkbox-wrapper + .ant-checkbox-wrapper {
margin-left: 0px;
}
</style>

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

@ -1,29 +1,10 @@
<template>
<LoginFormTitle
v-show="getShow"
class="enter-x"
/>
<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')"
/>
<LoginFormTitle v-show="getShow" class="enter-x" />
<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
name="password"
class="enter-x"
>
<FormItem name="password" class="enter-x">
<InputPassword
size="large"
visibilityToggle
@ -36,22 +17,18 @@
<ACol :span="12">
<FormItem>
<!-- No logic, you need to deal with it yourself -->
<Checkbox
<!-- <Checkbox
v-model:checked="rememberMe"
size="small"
>
{{ t('sys.login.rememberMe') }}
</Checkbox>
</Checkbox> -->
</FormItem>
</ACol>
<ACol :span="12">
<FormItem :style="{ 'text-align': 'right' }">
<!-- No logic, you need to deal with it yourself -->
<Button
type="link"
size="small"
@click="setLoginState(LoginStateEnum.RESET_PASSWORD)"
>
<Button type="link" size="small" @click="setLoginState(LoginStateEnum.RESET_PASSWORD)">
{{ t('sys.login.forgetPassword') }}
</Button>
</FormItem>
@ -59,13 +36,7 @@
</ARow>
<FormItem class="enter-x">
<Button
type="primary"
size="large"
block
@click="handleLogin"
:loading="loading"
>
<Button type="primary" size="large" block @click="handleLogin" :loading="loading">
{{ t('sys.login.loginButton') }}
</Button>
<!-- <Button size="large" class="mt-4 enter-x" block @click="handleRegister">
@ -121,27 +92,27 @@
</Form>
</template>
<script lang="ts">
import { defineComponent, reactive, ref, toRaw, unref, computed } from 'vue';
import { defineComponent, reactive, ref, toRaw, unref, computed } from 'vue';
import { Checkbox, Form, Input, Row, Col, Button, Divider } from 'ant-design-vue';
import {
import { Checkbox, Form, Input, Row, Col, Button, Divider } from 'ant-design-vue';
import {
GithubFilled,
WechatFilled,
AlipayCircleFilled,
GoogleCircleFilled,
TwitterCircleFilled,
} from '@ant-design/icons-vue';
import LoginFormTitle from './LoginFormTitle.vue';
} from '@ant-design/icons-vue';
import LoginFormTitle from './LoginFormTitle.vue';
import { useI18n } from '/@/hooks/web/useI18n';
import { useMessage } from '/@/hooks/web/useMessage';
import { useI18n } from '/@/hooks/web/useI18n';
import { useMessage } from '/@/hooks/web/useMessage';
import { useUserStore } from '/@/store/modules/user';
import { LoginStateEnum, useLoginState, useFormRules, useFormValid } from './useLogin';
import { useDesign } from '/@/hooks/web/useDesign';
import { onKeyStroke } from '@vueuse/core';
import { useUserStore } from '/@/store/modules/user';
import { LoginStateEnum, useLoginState, useFormRules, useFormValid } from './useLogin';
import { useDesign } from '/@/hooks/web/useDesign';
import { onKeyStroke } from '@vueuse/core';
export default defineComponent({
export default defineComponent({
name: 'LoginForm',
components: {
[Col.name]: Col,
@ -221,5 +192,5 @@ export default defineComponent({
getShow,
};
},
});
});
</script>

Loading…
Cancel
Save