zhengyiming
6 天以前 84e27a26dcbee4d0706dfad6059454ea85fadacc
fix: 修改角色授权代码
2个文件已添加
12个文件已修改
643 ■■■■ 已修改文件
.eslintrc-auto-import.json 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
auto-imports.d.ts 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/constants/apiEnum.ts 58 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/services/api/fileUtils.ts 52 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/services/api/index.ts 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/services/api/ocrUtils.ts 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/services/api/resource.ts 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/services/api/taskUser.ts 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/services/api/typings.d.ts 278 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/services/api/user.ts 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/services/api/userResume.ts 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/utils/common/tree.ts 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/Permission/RoleManage.vue 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/Permission/components/dialogAuthorizeV2.vue 127 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
.eslintrc-auto-import.json
@@ -25,11 +25,16 @@
    "EnumBillingMethodUnitText": true,
    "EnumClientType": true,
    "EnumClientTypeText": true,
    "EnumDataSource": true,
    "EnumEnterpriseRealMethod": true,
    "EnumMenuType": true,
    "EnumMenuVisitLevel": true,
    "EnumOcrAccess": true,
    "EnumPagedListOrder": true,
    "EnumPayAccess": true,
    "EnumPersonalFreeTime": true,
    "EnumPersonalJobSeekingStatus": true,
    "EnumPersonalRealMethod": true,
    "EnumRealAccess": true,
    "EnumRealAccessText": true,
    "EnumResourceController": true,
auto-imports.d.ts
@@ -33,11 +33,16 @@
  const EnumBillingMethodUnitText: typeof import('./src/constants/task')['EnumBillingMethodUnitText']
  const EnumClientType: typeof import('./src/constants/apiEnum')['EnumClientType']
  const EnumClientTypeText: typeof import('./src/constants/apiEnumText')['EnumClientTypeText']
  const EnumDataSource: typeof import('./src/constants/apiEnum')['EnumDataSource']
  const EnumEnterpriseRealMethod: typeof import('./src/constants/apiEnum')['EnumEnterpriseRealMethod']
  const EnumMenuType: typeof import('./src/constants/apiEnum')['EnumMenuType']
  const EnumMenuVisitLevel: typeof import('./src/constants/apiEnum')['EnumMenuVisitLevel']
  const EnumOcrAccess: typeof import('./src/constants/apiEnum')['EnumOcrAccess']
  const EnumPagedListOrder: typeof import('./src/constants/apiEnum')['EnumPagedListOrder']
  const EnumPayAccess: typeof import('./src/constants/apiEnum')['EnumPayAccess']
  const EnumPersonalFreeTime: typeof import('./src/constants/apiEnum')['EnumPersonalFreeTime']
  const EnumPersonalJobSeekingStatus: typeof import('./src/constants/apiEnum')['EnumPersonalJobSeekingStatus']
  const EnumPersonalRealMethod: typeof import('./src/constants/apiEnum')['EnumPersonalRealMethod']
  const EnumRealAccess: typeof import('./src/constants/apiEnum')['EnumRealAccess']
  const EnumRealAccessText: typeof import('./src/constants/enterprise')['EnumRealAccessText']
  const EnumResourceController: typeof import('./src/constants/apiEnum')['EnumResourceController']
@@ -253,7 +258,7 @@
  export type { Component, Slot, Slots, ComponentPublicInstance, ComputedRef, DirectiveBinding, ExtractDefaultPropTypes, ExtractPropTypes, ExtractPublicPropTypes, InjectionKey, PropType, Ref, MaybeRef, MaybeRefOrGetter, VNode, WritableComputedRef } from 'vue'
  import('vue')
  // @ts-ignore
  export type { EnumBillingMethod, EnumClientType, EnumMenuType, EnumMenuVisitLevel, EnumPagedListOrder, EnumPersonalFreeTime, EnumPersonalJobSeekingStatus, EnumRealAccess, EnumResourceController, EnumResourceMethod, EnumRoleWebApiDataPower, EnumSettlementCycle, EnumSmsAccess, EnumTaskCheckReceiveStatus, EnumTaskRecommendStatus, EnumTaskReleaseStatus, EnumTaskSettlementStatus, EnumTaskStatus, EnumTaskUserArrangeStatus, EnumTaskUserHireStatus, EnumTaskUserSignContractStatus, EnumTaskUserSubmitCheckReceiveStatus, EnumUserGender, EnumUserRealMethod, EnumUserStatus, EnumUserType, GetPersonalApplyTaskInfosQueryStatus, GetPersonalHireTaskInfosQueryStatus, GetTaskInfoQueryResultApplyButton, GetTaskInfoQueryResultHireButton, EnumBillingMethod, EnumClientType, EnumMenuType, EnumMenuVisitLevel, EnumPagedListOrder, EnumPersonalFreeTime, EnumPersonalJobSeekingStatus, EnumRealAccess, EnumResourceController, EnumResourceMethod, EnumRoleWebApiDataPower, EnumSettlementCycle, EnumSmsAccess, EnumTaskCheckReceiveStatus, EnumTaskRecommendStatus, EnumTaskReleaseStatus, EnumTaskSettlementStatus, EnumTaskStatus, EnumTaskUserArrangeStatus, EnumTaskUserHireStatus, EnumTaskUserSignContractStatus, EnumTaskUserSubmitCheckReceiveStatus, EnumUserGender, EnumUserRealMethod, EnumUserStatus, EnumUserType, GetPersonalApplyTaskInfosQueryStatus, GetPersonalHireTaskInfosQueryStatus, GetTaskInfoQueryResultApplyButton, GetTaskInfoQueryResultHireButton } from './src/constants/apiEnum'
  export type { EnumBillingMethod, EnumClientType, EnumDataSource, EnumEnterpriseRealMethod, EnumMenuType, EnumMenuVisitLevel, EnumOcrAccess, EnumPagedListOrder, EnumPayAccess, EnumPersonalFreeTime, EnumPersonalJobSeekingStatus, EnumPersonalRealMethod, EnumRealAccess, EnumResourceController, EnumResourceMethod, EnumRoleWebApiDataPower, EnumSettlementCycle, EnumSmsAccess, EnumTaskCheckReceiveStatus, EnumTaskRecommendStatus, EnumTaskReleaseStatus, EnumTaskSettlementStatus, EnumTaskStatus, EnumTaskUserArrangeStatus, EnumTaskUserHireStatus, EnumTaskUserSignContractStatus, EnumTaskUserSubmitCheckReceiveStatus, EnumUserGender, EnumUserRealMethod, EnumUserStatus, EnumUserType, GetPersonalApplyTaskInfosQueryStatus, GetPersonalHireTaskInfosQueryStatus, GetTaskInfoQueryResultApplyButton, GetTaskInfoQueryResultHireButton, EnumBillingMethod, EnumClientType, EnumDataSource, EnumEnterpriseRealMethod, EnumMenuType, EnumMenuVisitLevel, EnumOcrAccess, EnumPagedListOrder, EnumPayAccess, EnumPersonalFreeTime, EnumPersonalJobSeekingStatus, EnumPersonalRealMethod, EnumRealAccess, EnumResourceController, EnumResourceMethod, EnumRoleWebApiDataPower, EnumSettlementCycle, EnumSmsAccess, EnumTaskCheckReceiveStatus, EnumTaskRecommendStatus, EnumTaskReleaseStatus, EnumTaskSettlementStatus, EnumTaskStatus, EnumTaskUserArrangeStatus, EnumTaskUserHireStatus, EnumTaskUserSignContractStatus, EnumTaskUserSubmitCheckReceiveStatus, EnumUserGender, EnumUserRealMethod, EnumUserStatus, EnumUserType, GetPersonalApplyTaskInfosQueryStatus, GetPersonalHireTaskInfosQueryStatus, GetTaskInfoQueryResultApplyButton, GetTaskInfoQueryResultHireButton } from './src/constants/apiEnum'
  import('./src/constants/apiEnum')
  // @ts-ignore
  export type { FlexWorkerEleSignEnum, FlexTaskWorkerHireEnum, FlexWorkerEleSignEnum, FlexTaskWorkerHireEnum } from './src/constants/cPerson'
@@ -316,11 +321,16 @@
    readonly EnumBillingMethodUnitText: UnwrapRef<typeof import('./src/constants/task')['EnumBillingMethodUnitText']>
    readonly EnumClientType: UnwrapRef<typeof import('./src/constants/apiEnum')['EnumClientType']>
    readonly EnumClientTypeText: UnwrapRef<typeof import('./src/constants/apiEnumText')['EnumClientTypeText']>
    readonly EnumDataSource: UnwrapRef<typeof import('./src/constants/apiEnum')['EnumDataSource']>
    readonly EnumEnterpriseRealMethod: UnwrapRef<typeof import('./src/constants/apiEnum')['EnumEnterpriseRealMethod']>
    readonly EnumMenuType: UnwrapRef<typeof import('./src/constants/apiEnum')['EnumMenuType']>
    readonly EnumMenuVisitLevel: UnwrapRef<typeof import('./src/constants/apiEnum')['EnumMenuVisitLevel']>
    readonly EnumOcrAccess: UnwrapRef<typeof import('./src/constants/apiEnum')['EnumOcrAccess']>
    readonly EnumPagedListOrder: UnwrapRef<typeof import('./src/constants/apiEnum')['EnumPagedListOrder']>
    readonly EnumPayAccess: UnwrapRef<typeof import('./src/constants/apiEnum')['EnumPayAccess']>
    readonly EnumPersonalFreeTime: UnwrapRef<typeof import('./src/constants/apiEnum')['EnumPersonalFreeTime']>
    readonly EnumPersonalJobSeekingStatus: UnwrapRef<typeof import('./src/constants/apiEnum')['EnumPersonalJobSeekingStatus']>
    readonly EnumPersonalRealMethod: UnwrapRef<typeof import('./src/constants/apiEnum')['EnumPersonalRealMethod']>
    readonly EnumRealAccess: UnwrapRef<typeof import('./src/constants/apiEnum')['EnumRealAccess']>
    readonly EnumRealAccessText: UnwrapRef<typeof import('./src/constants/enterprise')['EnumRealAccessText']>
    readonly EnumResourceController: UnwrapRef<typeof import('./src/constants/apiEnum')['EnumResourceController']>
src/constants/apiEnum.ts
@@ -21,6 +21,20 @@
  Wxmp = 20,
}
/** 数据来源 */
export enum EnumDataSource {
  /**818 */
  HumanResources = 10,
}
/** 企业实名方式 */
export enum EnumEnterpriseRealMethod {
  /**企业三要素 */
  Identity3 = 10,
  /**企业四要素 */
  Identity4 = 20,
}
/** 菜单类型 */
export enum EnumMenuType {
  /**菜单 */
@@ -45,12 +59,26 @@
  NeedPower = 30,
}
/** 文字识别通道 */
export enum EnumOcrAccess {
  /**百度 */
  Baidu = 10,
}
/** 分页列表排序 */
export enum EnumPagedListOrder {
  /**升序 */
  Asc = 0,
  /**降序 */
  Desc = 1,
}
/** 支付通道 */
export enum EnumPayAccess {
  /**平安银行 */
  PingAnBank = 10,
  /**支付宝 */
  Alipay = 20,
}
/** 空闲时间 */
@@ -77,6 +105,16 @@
  Not = 30,
}
/** 个人实名方式 */
export enum EnumPersonalRealMethod {
  /**个人手机号三要素 */
  Identity3 = 10,
  /**银行卡多要素 */
  Identity4 = 20,
  /**刷脸认证 */
  Face = 30,
}
/** 实名通道 */
export enum EnumRealAccess {
  /**上上签 */
@@ -95,22 +133,26 @@
  TaskUser = 2,
  /**任务验收 */
  TaskCheckReceive = 3,
  /**文字识别 */
  FileUtils = 4,
  /**文字识别 */
  OcrUtils = 5,
  /**用户认证 */
  Auth = 4,
  Auth = 6,
  /**用户菜单 */
  Menu = 5,
  Menu = 7,
  /**用户资源 */
  Resource = 6,
  Resource = 8,
  /**用户角色 */
  Role = 7,
  Role = 9,
  /**用户信息 */
  User = 8,
  User = 10,
  /**用户简历 */
  UserResume = 9,
  UserResume = 11,
  /**企业信息 */
  Enterprise = 10,
  Enterprise = 12,
  /**灵工信息 */
  EnterpriseEmployee = 11,
  EnterpriseEmployee = 13,
}
/** 资源请求方式 */
src/services/api/fileUtils.ts
New file
@@ -0,0 +1,52 @@
/* eslint-disable */
// @ts-ignore
import { request } from '@/utils/request';
/** 获取文件地址 GET /api/common/fileUtils/getFileUrl */
export async function getFileUrl(
  // 叠加生成的Param类型 (非body参数swagger默认没有生成对象)
  params: API.APIgetFileUrlParams,
  options?: API.RequestConfig
) {
  return request<string>('/api/common/fileUtils/getFileUrl', {
    method: 'GET',
    params: {
      ...params,
    },
    ...(options || {}),
  });
}
/** 上传文件 POST /api/common/fileUtils/uploadFile */
export async function uploadFile(
  body: {
    /** 场景 */
    Scene?: string;
  },
  File?: File,
  options?: API.RequestConfig
) {
  const formData = new FormData();
  if (File) {
    formData.append('File', File);
  }
  Object.keys(body).forEach((ele) => {
    const item = (body as any)[ele];
    if (item !== undefined && item !== null) {
      formData.append(
        ele,
        typeof item === 'object' && !(item instanceof File) ? JSON.stringify(item) : item
      );
    }
  });
  return request<API.UploadFileCommandResult>('/api/common/fileUtils/uploadFile', {
    method: 'POST',
    data: formData,
    requestType: 'form',
    ...(options || {}),
  });
}
src/services/api/index.ts
@@ -7,6 +7,7 @@
import * as role from './role';
import * as enterprise from './enterprise';
import * as task from './task';
import * as ocrUtils from './ocrUtils';
import * as dictionary from './dictionary';
import * as userResume from './userResume';
import * as auth from './auth';
@@ -14,12 +15,14 @@
import * as resource from './resource';
import * as taskUser from './taskUser';
import * as menu from './menu';
import * as fileUtils from './fileUtils';
export default {
  enterpriseEmployee,
  user,
  role,
  enterprise,
  task,
  ocrUtils,
  dictionary,
  userResume,
  auth,
@@ -27,4 +30,5 @@
  resource,
  taskUser,
  menu,
  fileUtils,
};
src/services/api/ocrUtils.ts
New file
@@ -0,0 +1,18 @@
/* eslint-disable */
// @ts-ignore
import { request } from '@/utils/request';
/** 文字识别营业执照 GET /api/common/ocrUtils/getLicenseOcr */
export async function getLicenseOcr(
  // 叠加生成的Param类型 (非body参数swagger默认没有生成对象)
  params: API.APIgetLicenseOcrParams,
  options?: API.RequestConfig
) {
  return request<API.GetLicenseOcrCommandResult>('/api/common/ocrUtils/getLicenseOcr', {
    method: 'GET',
    params: {
      ...params,
    },
    ...(options || {}),
  });
}
src/services/api/resource.ts
@@ -31,18 +31,3 @@
    ...(options || {}),
  });
}
/** 保存任务调度-作业 POST /api/user/resource/saveScheduleJobDetail */
export async function saveScheduleJobDetail(
  body: API.SaveScheduleJobDetailCommand,
  options?: API.RequestConfig
) {
  return request<boolean>('/api/user/resource/saveScheduleJobDetail', {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json-patch+json',
    },
    data: body,
    ...(options || {}),
  });
}
src/services/api/taskUser.ts
@@ -14,6 +14,21 @@
  });
}
/** 清空已停止的任务收藏 DELETE /api/flexjob/taskUser/clearTaskCollect */
export async function clearTaskCollect(
  body: API.ClearTaskCollectCommand,
  options?: API.RequestConfig
) {
  return request<number>('/api/flexjob/taskUser/clearTaskCollect', {
    method: 'DELETE',
    headers: {
      'Content-Type': 'application/json-patch+json',
    },
    data: body,
    ...(options || {}),
  });
}
/** 收藏任务 POST /api/flexjob/taskUser/collectTask */
export async function collectTask(body: API.CollectTaskCommand, options?: API.RequestConfig) {
  return request<number>('/api/flexjob/taskUser/collectTask', {
src/services/api/typings.d.ts
@@ -83,6 +83,22 @@
    id?: string;
  }
  interface APIgetFileUrlParams {
    /** 地址 */
    url?: string;
  }
  interface APIgetLicenseOcrParams {
    /** 通道 */
    access?: EnumOcrAccess;
    /** 场景 */
    scene?: string;
    /** 链接地址 */
    url?: string;
    /** 是否为云存储相对地址 */
    isOssUrl?: boolean;
  }
  interface APIgetMenuParams {
    /** Id */
    id?: string;
@@ -189,6 +205,25 @@
    ids?: string[];
  }
  interface BaiduOcrBusinessLicenseResultModel {
    /** 企业全称 */
    enterpriseName?: string;
    /** 统一社会信用代码 */
    societyCreditCode?: string;
    /** 法人姓名 */
    legalPerson?: string;
    /** 企业类型 */
    enterpriseType?: string;
    /** 注册资本 */
    registeredCapital?: string;
    /** 成立日期 */
    establishmentDate?: string;
    /** 企业地址 */
    address?: string;
    /** 经营范围 */
    mainBusiness?: string;
  }
  interface BindWxmpUserInfoCommand {
    /** 访问令牌 */
    accessToken: string;
@@ -212,6 +247,8 @@
    id?: string;
    checkReceiveStatus?: EnumTaskUserSubmitCheckReceiveStatus;
  }
  type ClearTaskCollectCommand = Record<string, any>;
  interface CollectTaskCommand {
    /** 任务Id */
@@ -288,6 +325,18 @@
    Wxmp = 20,
  }
  enum EnumDataSource {
    /**818 */
    HumanResources = 10,
  }
  enum EnumEnterpriseRealMethod {
    /**企业三要素 */
    Identity3 = 10,
    /**企业四要素 */
    Identity4 = 20,
  }
  enum EnumMenuType {
    /**菜单 */
    Menu = 10,
@@ -310,11 +359,23 @@
    NeedPower = 30,
  }
  enum EnumOcrAccess {
    /**百度 */
    Baidu = 10,
  }
  enum EnumPagedListOrder {
    /**升序 */
    Asc = 0,
    /**降序 */
    Desc = 1,
  }
  enum EnumPayAccess {
    /**平安银行 */
    PingAnBank = 10,
    /**支付宝 */
    Alipay = 20,
  }
  enum EnumPersonalFreeTime {
@@ -339,6 +400,15 @@
    Not = 30,
  }
  enum EnumPersonalRealMethod {
    /**个人手机号三要素 */
    Identity3 = 10,
    /**银行卡多要素 */
    Identity4 = 20,
    /**刷脸认证 */
    Face = 30,
  }
  enum EnumRealAccess {
    /**上上签 */
    BestSign = 10,
@@ -355,22 +425,26 @@
    TaskUser = 2,
    /**任务验收 */
    TaskCheckReceive = 3,
    /**文字识别 */
    FileUtils = 4,
    /**文字识别 */
    OcrUtils = 5,
    /**用户认证 */
    Auth = 4,
    Auth = 6,
    /**用户菜单 */
    Menu = 5,
    Menu = 7,
    /**用户资源 */
    Resource = 6,
    Resource = 8,
    /**用户角色 */
    Role = 7,
    Role = 9,
    /**用户信息 */
    User = 8,
    User = 10,
    /**用户简历 */
    UserResume = 9,
    UserResume = 11,
    /**企业信息 */
    Enterprise = 10,
    Enterprise = 12,
    /**灵工信息 */
    EnterpriseEmployee = 11,
    EnterpriseEmployee = 13,
  }
  enum EnumResourceMethod {
@@ -748,6 +822,24 @@
    /** 错误码 */
    errorCode?: string;
    data?: GetEnterpriseSmsSettingQueryResult;
    /** 执行成功 */
    success?: boolean;
    /** 错误信息 */
    msg?: any;
    /** 附加数据 */
    extras?: any;
    /** 时间戳 */
    timestamp?: number;
  }
  interface FriendlyResultGetLicenseOcrCommandResult {
    /** 跟踪Id */
    traceId?: string;
    /** 状态码 */
    code?: number;
    /** 错误码 */
    errorCode?: string;
    data?: GetLicenseOcrCommandResult;
    /** 执行成功 */
    success?: boolean;
    /** 错误信息 */
@@ -1454,6 +1546,24 @@
    timestamp?: number;
  }
  interface FriendlyResultUploadFileCommandResult {
    /** 跟踪Id */
    traceId?: string;
    /** 状态码 */
    code?: number;
    /** 错误码 */
    errorCode?: string;
    data?: UploadFileCommandResult;
    /** 执行成功 */
    success?: boolean;
    /** 错误信息 */
    msg?: any;
    /** 附加数据 */
    extras?: any;
    /** 时间戳 */
    timestamp?: number;
  }
  type GetAliyunOSSAcsQuery = Record<string, any>;
  interface GetAliyunOSSAcsQueryResult {
@@ -1936,6 +2046,7 @@
    avatar?: string;
    /** 姓名 */
    name?: string;
    gender?: EnumUserGender;
    /** 企业全称 */
    enterpriseName?: string;
    /** 角色 */
@@ -2024,6 +2135,12 @@
    industryTypeContent?: string;
    /** 是否已配置 */
    isConfigured?: boolean;
  }
  interface GetLicenseOcrCommandResult {
    /** 地址 */
    url?: string;
    model?: BaiduOcrBusinessLicenseResultModel;
  }
  interface GetMenuQueryResult {
@@ -2161,6 +2278,27 @@
    releaseStatus?: EnumTaskReleaseStatus;
    recommendStatus?: EnumTaskRecommendStatus;
    checkReceiveStatus?: EnumTaskCheckReceiveStatus;
    pageModel?: PagedListQueryPageModel;
  }
  interface GetOpenUserResumesQuery {
    /** 任务Id */
    taskInfoId?: string;
    /** 期望岗位编号 */
    userExpectJobs?: string[];
    gender?: EnumUserGender;
    /** 身份编号 */
    personalIdentityCode?: string;
    /** 年龄范围最小 */
    ageMin?: number;
    /** 年龄范围大 */
    ageMax?: number;
    /** 资格证书编号 */
    userCredentials?: string[];
    /** 是否已收藏 */
    isCollected?: boolean;
    /** 是否已联系 */
    isContacted?: boolean;
    pageModel?: PagedListQueryPageModel;
  }
@@ -2303,6 +2441,8 @@
  interface GetPersonalLoginInfoQueryResult {
    /** Id */
    id?: string;
    /** 头像 */
    avatar?: string;
    /** 姓名 */
    name?: string;
    /** 是否实名 */
@@ -2993,6 +3133,7 @@
    workExperience?: string;
    /** 创建时间 */
    createdTime?: string;
    hireStatus?: EnumTaskUserHireStatus;
  }
  type GetUserResumeWorkExperienceQuery = Record<string, any>;
@@ -3332,15 +3473,6 @@
    resources?: GetRoleQueryResultResource[];
  }
  interface SaveScheduleJobDetailCommand {
    /** 资源Id */
    resourceId?: string;
    /** 请求数据 */
    body?: string;
    /** Cron表达式 */
    cron?: string;
  }
  interface SaveTaskInfoCommand {
    /** 任务名称 */
    name: string;
@@ -3557,8 +3689,115 @@
  interface SubmitCheckReceiveTaskCommand {
    /** 任务Id */
    taskInfoId?: string;
    /** 日期 */
    date?: string;
    /** 附件 */
    files?: string[];
  }
  interface SyncEnterpriseUserCommand {
    dataSource?: EnumDataSource;
    /** 数据来源Id */
    dataSourceId?: string;
    /** 密码 */
    password?: string;
    /** 姓名 */
    name?: string;
    /** 用户名 */
    userName?: string;
    /** 手机号 */
    phoneNumber?: string;
    enterprise?: SyncEnterpriseUserCommandEnterprise;
  }
  interface SyncEnterpriseUserCommandEnterprise {
    /** 企业全称 */
    enterpriseName: string;
    /** 统一社会信用代码 */
    societyCreditCode: string;
    /** 营业执照照片 */
    licenseImage?: string;
    /** 法人姓名 */
    legalPerson?: string;
    /** 法人身份证号 */
    legalIdentity?: string;
    /** 所在省份编号 */
    provinceCode?: string;
    /** 所在城市编号 */
    cityCode?: string;
    /** 所属行业编号 */
    industryTypeCode?: string;
    /** 企业类型 */
    enterpriseType?: string;
    /** 注册资本 */
    registeredCapital?: string;
    /** 成立日期 */
    establishmentDate?: string;
    /** 企业地址 */
    address?: string;
    /** 经营范围 */
    mainBusiness?: string;
    /** 联系人 */
    contacts?: string;
    /** 联系电话 */
    contactPhoneNumber?: string;
    /** 联系邮箱 */
    contactEmail?: string;
    payAccess?: EnumPayAccess;
    /** 开户总行 */
    bankName?: string;
    /** 开户支行 */
    bankBranchName?: string;
    /** 银行账户 */
    bankCard?: string;
    /** 是否已校验银行账户 */
    isCheckedBankCard?: boolean;
    realAccess?: EnumRealAccess;
    /** 实名费用 */
    realVerifyCost?: number;
    /** 签约费用 */
    signCost?: number;
    /** 一口价 */
    mergeSignCost?: number;
    smsAccess?: EnumSmsAccess;
    /** 短信费用 */
    smsCost?: number;
    /** 是否实名 */
    isReal?: boolean;
    enterpriseAuth?: SyncEnterpriseUserCommandEnterpriseAuth;
  }
  interface SyncEnterpriseUserCommandEnterpriseAuth {
    enterpriseRealMethod?: EnumEnterpriseRealMethod;
    /** 企业全称 */
    enterpriseName: string;
    /** 统一社会信用代码 */
    societyCreditCode: string;
    /** 营业执照照片 */
    licenseImage?: string;
    /** 法人姓名 */
    legalPerson?: string;
    /** 法人身份证号 */
    legalIdentity?: string;
    personalRealMethod?: EnumPersonalRealMethod;
    /** 法人或经办人姓名 */
    name?: string;
    /** 法人或经办人身份证号 */
    identity?: string;
    /** 法人或经办人身份证人像面 */
    identityImg?: string;
    /** 法人或经办人身份证国徽面 */
    identityBackImg?: string;
    /** 法人或经办人银行卡号 */
    bankCard?: string;
    /** 法人或经办人银行卡照片 */
    bankCardImg?: string;
    /** 法人或经办人手机号 */
    phoneNumber?: string;
    /** 是否委托经办人 */
    proxy?: boolean;
    /** 企业授权书 */
    proxyPowerAttorneyUrl?: string;
  }
  type SyncHumanResourcesAreaDictionaryDataCommand = Record<string, any>;
@@ -3568,6 +3807,11 @@
    phoneNumber: string;
  }
  interface UploadFileCommandResult {
    /** 地址 */
    url?: string;
  }
  interface WxmpLoginCommand {
    /** 用户登录凭证 */
    code: string;
src/services/api/user.ts
@@ -97,3 +97,18 @@
    ...(options || {}),
  });
}
/** 同步企业用户 POST /api/user/user/syncEnterpriseUser */
export async function syncEnterpriseUser(
  body: API.SyncEnterpriseUserCommand,
  options?: API.RequestConfig
) {
  return request<string>('/api/user/user/syncEnterpriseUser', {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json-patch+json',
    },
    data: body,
    ...(options || {}),
  });
}
src/services/api/userResume.ts
@@ -47,6 +47,21 @@
  });
}
/** 查询开放简历分页列表数据 POST /api/user/userResume/getOpenUserResumes */
export async function getOpenUserResumes(
  body: API.GetOpenUserResumesQuery,
  options?: API.RequestConfig
) {
  return request<API.GetUserResumesQueryResult>('/api/user/userResume/getOpenUserResumes', {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json-patch+json',
    },
    data: body,
    ...(options || {}),
  });
}
/** 查询用户简历 GET /api/user/userResume/getUserResume */
export async function getUserResume(
  // 叠加生成的Param类型 (非body参数swagger默认没有生成对象)
src/utils/common/tree.ts
@@ -1,3 +1,5 @@
import { TreeNodeData } from 'element-plus/es/components/tree/src/tree.type';
export function getTree(
  data: API.ModuleDto[],
  root?: string,
@@ -44,3 +46,27 @@
  return result;
}
type TreeCallback<T extends TreeNodeData, R> = (
  data: T,
  index: number,
  array: T[],
  parent?: T
) => R;
export function treeEach<T extends TreeNodeData>(
  treeData: T[],
  callback: TreeCallback<T, void>,
  getChildren: (data: T) => T[],
  parent?: T
) {
  for (let i = 0; i < treeData.length; i++) {
    const data = treeData[i];
    callback(data, i, treeData, parent);
    const children = getChildren(data);
    if (Array.isArray(children)) {
      treeEach(children, callback, getChildren, data);
    }
  }
}
src/views/Permission/RoleManage.vue
@@ -260,7 +260,8 @@
  } catch (error) {}
}
async function handleAuthorize(selectedMenuIds: string[], resourceIds: string[]) {
async function handleAuthorize(selectedMenuIds: string[]) {
  console.log('selectedMenuIds: ', selectedMenuIds);
  try {
    let params: API.SaveRoleCommand = {
      ...authorizeForm.detail,
src/views/Permission/components/dialogAuthorizeV2.vue
@@ -24,7 +24,8 @@
            default-expand-all
            show-checkbox
            ref="moduleTree"
            :default-checked-keys="checkedModules"
            :default-checked-keys="defaultCheckedKeys"
            @check="handleModuleCheck"
          >
            <template #default="{ node }">
              <div class="custom-tree-node">
@@ -62,7 +63,8 @@
            default-expand-all
            show-checkbox
            ref="pageButtonTree"
            :default-checked-keys="checkedPageButton"
            :default-checked-keys="defaultCheckedKeys"
            @check="handlePageButtonCheck"
          >
            <template #default="{ node }">
              <div class="custom-tree-node">
@@ -97,7 +99,8 @@
            default-expand-all
            show-checkbox
            ref="dataButtonTree"
            :default-checked-keys="checkedDataButton"
            :default-checked-keys="defaultCheckedKeys"
            @check="handleDataButtonCheck"
          >
            <template #default="{ node }">
              <div class="custom-tree-node">
@@ -132,7 +135,8 @@
            default-expand-all
            show-checkbox
            ref="dataColumnTree"
            :default-checked-keys="checkedDataColumn"
            :default-checked-keys="defaultCheckedKeys"
            @check="handleDataColumnCheck"
          >
            <template #default="{ node }">
              <div class="custom-tree-node">
@@ -155,10 +159,11 @@
<script setup lang="ts">
import { Message } from '@bole-core/core';
import { AuthorizeType, SubModuleType, SubModuleTitle, EnumMenuType } from '@/constants';
import { getTree } from '@/utils';
import { getTree, treeEach } from '@/utils';
import { TreeInstance } from 'element-plus';
import { ProDialog } from '@bole-core/components';
import { useMenus, useMenu } from '@/hooks';
import data from '@iconify-icons/ep/tickets';
const TypeTip = defineComponent({
  name: 'TypeTip',
@@ -195,7 +200,7 @@
const form = defineModel<Form>('form');
const emit = defineEmits<{
  (e: 'onConfirm', selectedMenuIds: string[], resourceIds: string[]): void;
  (e: 'onConfirm', selectedMenuIds: string[]): void;
  (e: 'onCancel'): void;
}>();
@@ -207,13 +212,17 @@
const state = reactive({
  currentMenuId: '',
  checkedInfo: [] as CheckedResourceItem[],
  selectedMenuIds: [] as string[],
});
const defaultCheckedKeys = computed(() => Array.from(state.selectedMenuIds));
watch(visible, (newVal) => {
  if (newVal) {
    state.currentMenuId = '';
    state.checkedInfo = [];
    const menuIds = form.value.detail?.menuIds ?? [];
    // menuIds.forEach((id) => state.selectedMenuIds.add(id));
    state.selectedMenuIds = [...menuIds];
  }
});
@@ -225,6 +234,8 @@
const pageButtonTree = useTemplateRef<TreeInstance>('pageButtonTree');
const dataButtonTree = useTemplateRef<TreeInstance>('dataButtonTree');
const dataColumnTree = useTemplateRef<TreeInstance>('dataColumnTree');
type TreeRef = ReturnType<typeof useTemplateRef<TreeInstance>>;
const { menusTree, getMenuById } = useMenus({
  params: computed(() => ({
@@ -243,77 +254,45 @@
  enabled: computed(() => !!state.currentMenuId),
});
const checkedModules = computed(() => {
  if (form.value.detail) {
    return form.value.detail.menuIds;
  }
  return [];
});
const checkedPageButton = computed(() => initChecked(SubModuleType.PageButton));
const checkedDataButton = computed(() => initChecked(SubModuleType.DataButton));
const checkedDataColumn = computed(() => initChecked(SubModuleType.Column));
function initChecked(type: SubModuleType) {
  return state.checkedInfo.filter((x) => x.resourceType === type).map((x) => x.resourceId);
}
function handleSelectModule(menu: API.GetMenusQueryResultItem) {
  const modules1 =
    dataButtonTree &&
    dataButtonTree.value.getCheckedKeys(true).map((x) => {
      return {
        resourceType: SubModuleType.DataButton,
        resourceId: x,
        menuId: menu.id,
      } as CheckedResourceItem;
    });
  const modules2 =
    pageButtonTree &&
    pageButtonTree.value.getCheckedKeys(true).map((x) => {
      return {
        resourceType: SubModuleType.PageButton,
        resourceId: x,
        menuId: menu.id,
      } as CheckedResourceItem;
    });
  const modules3 =
    dataColumnTree &&
    dataColumnTree.value.getCheckedKeys(true).map((x) => {
      return {
        resourceType: SubModuleType.Column,
        resourceId: x,
        menuId: menu.id,
      } as CheckedResourceItem;
    });
  const checkExtends = state.checkedInfo.filter(
    (x) => x.menuId !== menu.id && x.menuId !== undefined
  );
  if (modules1 && modules1.length) {
    checkExtends.push(...modules1);
  }
  if (modules2 && modules2.length) {
    checkExtends.push(...modules2);
  }
  if (modules3 && modules3.length) {
    checkExtends.push(...modules3);
  }
  state.checkedInfo = checkExtends;
  state.currentMenuId = menu.id;
}
function handleConfirm() {
  const selectedMenuIds = moduleTree.value.getCheckedNodes().map((x) => x.id);
  if (state.currentMenuId) {
    handleSelectModule(getMenuById(state.currentMenuId));
function handleModuleCheck(data, params) {
  handleCheck(data, params, moduleTree);
  }
  const resourceIds = state.checkedInfo.map((x) => x.resourceId);
  emit('onConfirm', selectedMenuIds, resourceIds);
function handlePageButtonCheck(data, params) {
  handleCheck(data, params, pageButtonTree);
}
function handleDataButtonCheck(data, params) {
  handleCheck(data, params, dataButtonTree);
}
function handleDataColumnCheck(data, params) {
  handleCheck(data, params, dataColumnTree);
}
function handleCheck(data, params, treeRef: TreeRef) {
  const dataMap = {};
  treeEach(
    [treeRef.value.store.root],
    (node) => (dataMap[node.key] = node),
    (node) => node.childNodes
  );
  const uncachedCheckedKeys = params.checkedKeys.filter(
    (item) => !['pageButtonAll', 'dataButtonAll', 'dataColumnAll'].includes(item)
  );
  const cachedKeys = state.selectedMenuIds.filter(
    (item) => !(item in dataMap) && !uncachedCheckedKeys.includes(item)
  );
  state.selectedMenuIds = cachedKeys.concat(uncachedCheckedKeys);
}
function handleConfirm() {
  emit('onConfirm', state.selectedMenuIds);
}
</script>