Browse Source

feat(user): add organization preview to user page

pull/958/head
colin 2 years ago
parent
commit
96f5ce2519
  1. 15
      apps/vue/src/api/identity/users/index.ts
  2. 4
      apps/vue/src/api/identity/users/model/index.ts
  3. 19
      apps/vue/src/views/identity/user/components/UserModal.vue
  4. 44
      apps/vue/src/views/identity/user/hooks/useOrganizationUnit.ts
  5. 2
      aspnet-core/templates/PackageName.CompanyName.ProjectName.csproj
  6. 4
      aspnet-core/templates/content/Directory.Packages.props
  7. 4
      aspnet-core/templates/content/common.props

15
apps/vue/src/api/identity/users/index.ts

@ -6,9 +6,11 @@ import {
UpdateUser, UpdateUser,
GetUserPagedRequest, GetUserPagedRequest,
UserClaim, UserClaim,
IdentityUserOrganizationUnitUpdateDto,
} from './model'; } from './model';
import { CreateIdentityClaim, UpdateIdentityClaim } from '../claims/model'; import { CreateIdentityClaim, UpdateIdentityClaim } from '../claims/model';
import { Role } from '../roles/model'; import { Role } from '../roles/model';
import { OrganizationUnit } from '../organization-units/model';
export const create = (input: CreateUser) => { export const create = (input: CreateUser) => {
return defHttp.post<User>({ return defHttp.post<User>({
@ -106,6 +108,19 @@ export const unlock = (id: string) => {
}); });
}; };
export const getOrganizationUnits = (id: string) => {
return defHttp.get<ListResultDto<OrganizationUnit>>({
url: `/api/identity/users/${id}/organization-units`,
});
};
export const setOrganizationUnits = (id: string, input: IdentityUserOrganizationUnitUpdateDto) => {
return defHttp.put<ListResultDto<OrganizationUnit>>({
url: `/api/identity/users/${id}/organization-units`,
data: input,
});
};
export const removeOrganizationUnit = (id: string, ouId: string) => { export const removeOrganizationUnit = (id: string, ouId: string) => {
return defHttp.delete<void>({ return defHttp.delete<void>({
url: `/api/identity/users/${id}/organization-units/${ouId}`, url: `/api/identity/users/${id}/organization-units/${ouId}`,

4
apps/vue/src/api/identity/users/model/index.ts

@ -27,6 +27,10 @@ export interface SetPassword {
password: string; password: string;
} }
export interface IdentityUserOrganizationUnitUpdateDto {
organizationUnitIds: string[]
}
/** 用户对象 */ /** 用户对象 */
export interface User extends FullAuditedEntityDto<string>, IUser, IHasConcurrencyStamp { export interface User extends FullAuditedEntityDto<string>, IUser, IHasConcurrencyStamp {
/** 租户标识 */ /** 租户标识 */

19
apps/vue/src/views/identity/user/components/UserModal.vue

@ -45,6 +45,7 @@
</TabPane> </TabPane>
<TabPane key="role" :tab="L('Roles')"> <TabPane key="role" :tab="L('Roles')">
<Transfer <Transfer
:disabled="hasPermission('AbpIdentity.Users.ManageRoles')"
class="tree-transfer" class="tree-transfer"
:dataSource="roleDataSource" :dataSource="roleDataSource"
:targetKeys="userRef.roleNames" :targetKeys="userRef.roleNames"
@ -57,6 +58,18 @@
@change="handleRoleChange" @change="handleRoleChange"
/> />
</TabPane> </TabPane>
<TabPane key="organization-unit" :tab="L('OrganizationUnit')">
<Tree
checkable
disabled
:tree-data="getOrganizationUnitsTree"
:checked-keys="hasInOrganizationUnitKeys"
:field-names="{
title: 'displayName',
key: 'code',
}"
/>
</TabPane>
</Tabs> </Tabs>
</Form> </Form>
</BasicModal> </BasicModal>
@ -65,12 +78,14 @@
<script lang="ts" setup> <script lang="ts" setup>
import { ref } from 'vue'; import { ref } from 'vue';
import { useMessage } from '/@/hooks/web/useMessage'; import { useMessage } from '/@/hooks/web/useMessage';
import { usePermission } from '/@/hooks/web/usePermission';
import { useLocalization } from '/@/hooks/abp/useLocalization'; import { useLocalization } from '/@/hooks/abp/useLocalization';
import { Checkbox, Input, Form, Tabs, Transfer } from 'ant-design-vue'; import { Checkbox, Input, Form, Tabs, Transfer, Tree } from 'ant-design-vue';
import { Input as BInput } from '/@/components/Input'; import { Input as BInput } from '/@/components/Input';
import { FormActionType } from '/@/components/Form'; import { FormActionType } from '/@/components/Form';
import { BasicModal, useModalInner } from '/@/components/Modal'; import { BasicModal, useModalInner } from '/@/components/Modal';
import { useUserForm } from '../hooks/useUserForm'; import { useUserForm } from '../hooks/useUserForm';
import { useOrganizationUnit } from '../hooks/useOrganizationUnit';
const FormItem = Form.Item; const FormItem = Form.Item;
const TabPane = Tabs.TabPane; const TabPane = Tabs.TabPane;
@ -79,6 +94,7 @@
const emits = defineEmits(['register', 'change']); const emits = defineEmits(['register', 'change']);
const { createMessage } = useMessage(); const { createMessage } = useMessage();
const { hasPermission } = usePermission();
const { L } = useLocalization(['AbpIdentity', 'AbpIdentityServer']); const { L } = useLocalization(['AbpIdentity', 'AbpIdentityServer']);
const activedTab = ref('info'); const activedTab = ref('info');
const userRef = ref<Recordable>({}); const userRef = ref<Recordable>({});
@ -88,6 +104,7 @@
userRef, userRef,
formElRef, formElRef,
}); });
const { getOrganizationUnitsTree, hasInOrganizationUnitKeys } = useOrganizationUnit({ userRef });
const [registerModal, { closeModal, changeOkLoading }] = useModalInner(async (val) => { const [registerModal, { closeModal, changeOkLoading }] = useModalInner(async (val) => {
activedTab.value = 'info'; activedTab.value = 'info';
getUser(val.id); getUser(val.id);

44
apps/vue/src/views/identity/user/hooks/useOrganizationUnit.ts

@ -0,0 +1,44 @@
import type { Ref } from 'vue';
import { computed, ref, onMounted, watchEffect } from 'vue';
import { getAll as getAllOrganizationUnits } from '/@/api/identity/organization-units';
import { OrganizationUnit } from '/@/api/identity/organization-units/model';
import { getOrganizationUnits } from '/@/api/identity/users';
import { listToTree } from '/@/utils/helper/treeHelper';
interface UseOrganizationUnit {
userRef: Ref<Recordable | undefined>;
}
export function useOrganizationUnit({ userRef }: UseOrganizationUnit) {
const organizationUnits = ref<OrganizationUnit[]>([]);
const hasInOrganizationUnitKeys = ref<string[]>([]);
const getOrganizationUnitsTree = computed(() => {
const ouTree = listToTree(organizationUnits.value, {
id: 'id',
pid: 'parentId',
children: 'children',
});
return ouTree;
});
async function fetchOrganizationUnits() {
const { items } = await getAllOrganizationUnits();
organizationUnits.value = items;
}
async function fetchUserOrganizationUnits(userId: string) {
const { items } = await getOrganizationUnits(userId);
hasInOrganizationUnitKeys.value = items.map((item) => item.code);
}
onMounted(fetchOrganizationUnits);
watchEffect(() => {
userRef.value?.id && fetchUserOrganizationUnits(userRef.value.id);
});
return {
getOrganizationUnitsTree,
hasInOrganizationUnitKeys,
};
}

2
aspnet-core/templates/PackageName.CompanyName.ProjectName.csproj

@ -3,7 +3,7 @@
<TargetFramework>net8.0</TargetFramework> <!-- 或其他适合的框架 --> <TargetFramework>net8.0</TargetFramework> <!-- 或其他适合的框架 -->
<GeneratePackageOnBuild>true</GeneratePackageOnBuild> <GeneratePackageOnBuild>true</GeneratePackageOnBuild>
<PackageId>LINGYUN.Abp.MicroService.Templates</PackageId> <PackageId>LINGYUN.Abp.MicroService.Templates</PackageId>
<Version>8.1.1.1</Version> <Version>8.1.3</Version>
<Authors>colin.in@foxmail.com</Authors> <Authors>colin.in@foxmail.com</Authors>
<Description>Abp framework micro-service template</Description> <Description>Abp framework micro-service template</Description>
<PackageLicenseExpression>MIT</PackageLicenseExpression> <PackageLicenseExpression>MIT</PackageLicenseExpression>

4
aspnet-core/templates/content/Directory.Packages.props

@ -2,8 +2,8 @@
<PropertyGroup> <PropertyGroup>
<DotNetCoreCAPPackageVersion>8.1.1</DotNetCoreCAPPackageVersion> <DotNetCoreCAPPackageVersion>8.1.1</DotNetCoreCAPPackageVersion>
<ElsaPackageVersion>2.14.1</ElsaPackageVersion> <ElsaPackageVersion>2.14.1</ElsaPackageVersion>
<VoloAbpPackageVersion>8.1.2</VoloAbpPackageVersion> <VoloAbpPackageVersion>8.1.3</VoloAbpPackageVersion>
<LINGYUNAbpPackageVersion>8.1.2</LINGYUNAbpPackageVersion> <LINGYUNAbpPackageVersion>8.1.3</LINGYUNAbpPackageVersion>
<MicrosoftExtensionsPackageVersion>8.0.0</MicrosoftExtensionsPackageVersion> <MicrosoftExtensionsPackageVersion>8.0.0</MicrosoftExtensionsPackageVersion>
<MicrosoftAspNetCorePackageVersion>8.0.0</MicrosoftAspNetCorePackageVersion> <MicrosoftAspNetCorePackageVersion>8.0.0</MicrosoftAspNetCorePackageVersion>
<MicrosoftEntityFrameworkCorePackageVersion>8.0.0</MicrosoftEntityFrameworkCorePackageVersion> <MicrosoftEntityFrameworkCorePackageVersion>8.0.0</MicrosoftEntityFrameworkCorePackageVersion>

4
aspnet-core/templates/content/common.props

@ -1,12 +1,12 @@
<Project> <Project>
<PropertyGroup> <PropertyGroup>
<LangVersion>latest</LangVersion> <LangVersion>latest</LangVersion>
<Version>8.1.2</Version> <Version>8.1.3</Version>
<Authors>colin</Authors> <Authors>colin</Authors>
<NoWarn>$(NoWarn);CS1591;CS0436;CS8618;NU1803</NoWarn> <NoWarn>$(NoWarn);CS1591;CS0436;CS8618;NU1803</NoWarn>
<PackageProjectUrl>https://github.com/colinin/abp-next-admin</PackageProjectUrl> <PackageProjectUrl>https://github.com/colinin/abp-next-admin</PackageProjectUrl>
<PackageOutputPath>$(SolutionDir)LocalNuget</PackageOutputPath> <PackageOutputPath>$(SolutionDir)LocalNuget</PackageOutputPath>
<PackageVersion>8.1.2</PackageVersion> <PackageVersion>8.1.3</PackageVersion>
<PackageLicenseExpression>MIT</PackageLicenseExpression> <PackageLicenseExpression>MIT</PackageLicenseExpression>
<RepositoryType>git</RepositoryType> <RepositoryType>git</RepositoryType>
<RepositoryUrl>https://github.com/colinin/abp-next-admin</RepositoryUrl> <RepositoryUrl>https://github.com/colinin/abp-next-admin</RepositoryUrl>

Loading…
Cancel
Save