13 changed files with 799 additions and 75 deletions
			
			
		@ -0,0 +1,334 @@ | 
				
			|||||||
 | 
					// ========== 静态变量 ==========
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/** | 
				
			||||||
 | 
					 * 全局通用状态枚举 | 
				
			||||||
 | 
					 */ | 
				
			||||||
 | 
					export const CommonStatusEnum = { | 
				
			||||||
 | 
					  ENABLE: 0, // 开启
 | 
				
			||||||
 | 
					  DISABLE: 1 // 禁用
 | 
				
			||||||
 | 
					} | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/** | 
				
			||||||
 | 
					 * 菜单的类型枚举 | 
				
			||||||
 | 
					 */ | 
				
			||||||
 | 
					export const SystemMenuTypeEnum = { | 
				
			||||||
 | 
					  DIR: 1, // 目录
 | 
				
			||||||
 | 
					  MENU: 2, // 菜单
 | 
				
			||||||
 | 
					  BUTTON: 3 // 按钮
 | 
				
			||||||
 | 
					} | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/** | 
				
			||||||
 | 
					 * 角色的类型枚举 | 
				
			||||||
 | 
					 */ | 
				
			||||||
 | 
					export const SystemRoleTypeEnum = { | 
				
			||||||
 | 
					  SYSTEM: 1, // 内置角色
 | 
				
			||||||
 | 
					  CUSTOM: 2 // 自定义角色
 | 
				
			||||||
 | 
					} | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/** | 
				
			||||||
 | 
					 * 数据权限的范围枚举 | 
				
			||||||
 | 
					 */ | 
				
			||||||
 | 
					export const SystemDataScopeEnum = { | 
				
			||||||
 | 
					  ALL: 1, // 全部数据权限
 | 
				
			||||||
 | 
					  DEPT_CUSTOM: 2, // 指定部门数据权限
 | 
				
			||||||
 | 
					  DEPT_ONLY: 3, // 部门数据权限
 | 
				
			||||||
 | 
					  DEPT_AND_CHILD: 4, // 部门及以下数据权限
 | 
				
			||||||
 | 
					  DEPT_SELF: 5 // 仅本人数据权限
 | 
				
			||||||
 | 
					} | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/** | 
				
			||||||
 | 
					 * 代码生成模板类型 | 
				
			||||||
 | 
					 */ | 
				
			||||||
 | 
					export const InfraCodegenTemplateTypeEnum = { | 
				
			||||||
 | 
					  CRUD: 1, // 基础 CRUD
 | 
				
			||||||
 | 
					  TREE: 2, // 树形 CRUD
 | 
				
			||||||
 | 
					  SUB: 3 // 主子表 CRUD
 | 
				
			||||||
 | 
					} | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/** | 
				
			||||||
 | 
					 * 任务状态的枚举 | 
				
			||||||
 | 
					 */ | 
				
			||||||
 | 
					export const InfraJobStatusEnum = { | 
				
			||||||
 | 
					  INIT: 0, // 初始化中
 | 
				
			||||||
 | 
					  NORMAL: 1, // 运行中
 | 
				
			||||||
 | 
					  STOP: 2 // 暂停运行
 | 
				
			||||||
 | 
					} | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/** | 
				
			||||||
 | 
					 * API 异常数据的处理状态 | 
				
			||||||
 | 
					 */ | 
				
			||||||
 | 
					export const InfraApiErrorLogProcessStatusEnum = { | 
				
			||||||
 | 
					  INIT: 0, // 未处理
 | 
				
			||||||
 | 
					  DONE: 1, // 已处理
 | 
				
			||||||
 | 
					  IGNORE: 2 // 已忽略
 | 
				
			||||||
 | 
					} | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/** | 
				
			||||||
 | 
					 * 用户的社交平台的类型枚举 | 
				
			||||||
 | 
					 */ | 
				
			||||||
 | 
					export const SystemUserSocialTypeEnum = { | 
				
			||||||
 | 
					  DINGTALK: { | 
				
			||||||
 | 
					    title: '钉钉', | 
				
			||||||
 | 
					    type: 20, | 
				
			||||||
 | 
					    source: 'dingtalk', | 
				
			||||||
 | 
					    img: 'https://s1.ax1x.com/2022/05/22/OzMDRs.png' | 
				
			||||||
 | 
					  }, | 
				
			||||||
 | 
					  WECHAT_ENTERPRISE: { | 
				
			||||||
 | 
					    title: '企业微信', | 
				
			||||||
 | 
					    type: 30, | 
				
			||||||
 | 
					    source: 'wechat_enterprise', | 
				
			||||||
 | 
					    img: 'https://s1.ax1x.com/2022/05/22/OzMrzn.png' | 
				
			||||||
 | 
					  } | 
				
			||||||
 | 
					} | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/** | 
				
			||||||
 | 
					 * 支付渠道枚举 | 
				
			||||||
 | 
					 */ | 
				
			||||||
 | 
					export const PayChannelEnum = { | 
				
			||||||
 | 
					  WX_PUB: { | 
				
			||||||
 | 
					    code: 'wx_pub', | 
				
			||||||
 | 
					    name: '微信 JSAPI 支付' | 
				
			||||||
 | 
					  }, | 
				
			||||||
 | 
					  WX_LITE: { | 
				
			||||||
 | 
					    code: 'wx_lite', | 
				
			||||||
 | 
					    name: '微信小程序支付' | 
				
			||||||
 | 
					  }, | 
				
			||||||
 | 
					  WX_APP: { | 
				
			||||||
 | 
					    code: 'wx_app', | 
				
			||||||
 | 
					    name: '微信 APP 支付' | 
				
			||||||
 | 
					  }, | 
				
			||||||
 | 
					  ALIPAY_PC: { | 
				
			||||||
 | 
					    code: 'alipay_pc', | 
				
			||||||
 | 
					    name: '支付宝 PC 网站支付' | 
				
			||||||
 | 
					  }, | 
				
			||||||
 | 
					  ALIPAY_WAP: { | 
				
			||||||
 | 
					    code: 'alipay_wap', | 
				
			||||||
 | 
					    name: '支付宝 WAP 网站支付' | 
				
			||||||
 | 
					  }, | 
				
			||||||
 | 
					  ALIPAY_APP: { | 
				
			||||||
 | 
					    code: 'alipay_app', | 
				
			||||||
 | 
					    name: '支付宝 APP 支付' | 
				
			||||||
 | 
					  }, | 
				
			||||||
 | 
					  ALIPAY_QR: { | 
				
			||||||
 | 
					    code: 'alipay_qr', | 
				
			||||||
 | 
					    name: '支付宝扫码支付' | 
				
			||||||
 | 
					  }, | 
				
			||||||
 | 
					  ALIPAY_BAR: { | 
				
			||||||
 | 
					    code: 'alipay_bar', | 
				
			||||||
 | 
					    name: '支付宝条码支付' | 
				
			||||||
 | 
					  } | 
				
			||||||
 | 
					} | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/** | 
				
			||||||
 | 
					 * 支付的展示模式每局 | 
				
			||||||
 | 
					 */ | 
				
			||||||
 | 
					export const PayDisplayModeEnum = { | 
				
			||||||
 | 
					  URL: { | 
				
			||||||
 | 
					    mode: 'url' | 
				
			||||||
 | 
					  }, | 
				
			||||||
 | 
					  IFRAME: { | 
				
			||||||
 | 
					    mode: 'iframe' | 
				
			||||||
 | 
					  }, | 
				
			||||||
 | 
					  FORM: { | 
				
			||||||
 | 
					    mode: 'form' | 
				
			||||||
 | 
					  }, | 
				
			||||||
 | 
					  QR_CODE: { | 
				
			||||||
 | 
					    mode: 'qr_code' | 
				
			||||||
 | 
					  } | 
				
			||||||
 | 
					} | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/** | 
				
			||||||
 | 
					 * 支付类型枚举 | 
				
			||||||
 | 
					 */ | 
				
			||||||
 | 
					export const PayType = { | 
				
			||||||
 | 
					  WECHAT: 'WECHAT', | 
				
			||||||
 | 
					  ALIPAY: 'ALIPAY' | 
				
			||||||
 | 
					} | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/** | 
				
			||||||
 | 
					 * 支付订单状态枚举 | 
				
			||||||
 | 
					 */ | 
				
			||||||
 | 
					export const PayOrderStatusEnum = { | 
				
			||||||
 | 
					  WAITING: { | 
				
			||||||
 | 
					    status: 0, | 
				
			||||||
 | 
					    name: '未支付' | 
				
			||||||
 | 
					  }, | 
				
			||||||
 | 
					  SUCCESS: { | 
				
			||||||
 | 
					    status: 10, | 
				
			||||||
 | 
					    name: '已支付' | 
				
			||||||
 | 
					  }, | 
				
			||||||
 | 
					  CLOSED: { | 
				
			||||||
 | 
					    status: 20, | 
				
			||||||
 | 
					    name: '支付关闭' | 
				
			||||||
 | 
					  } | 
				
			||||||
 | 
					} | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/** | 
				
			||||||
 | 
					 * 支付订单回调状态枚举 | 
				
			||||||
 | 
					 */ | 
				
			||||||
 | 
					export const PayOrderNotifyStatusEnum = { | 
				
			||||||
 | 
					  NO: { | 
				
			||||||
 | 
					    status: 0, | 
				
			||||||
 | 
					    name: '未通知' | 
				
			||||||
 | 
					  }, | 
				
			||||||
 | 
					  SUCCESS: { | 
				
			||||||
 | 
					    status: 10, | 
				
			||||||
 | 
					    name: '通知成功' | 
				
			||||||
 | 
					  }, | 
				
			||||||
 | 
					  FAILURE: { | 
				
			||||||
 | 
					    status: 20, | 
				
			||||||
 | 
					    name: '通知失败' | 
				
			||||||
 | 
					  } | 
				
			||||||
 | 
					} | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/** | 
				
			||||||
 | 
					 * 支付订单退款状态枚举 | 
				
			||||||
 | 
					 */ | 
				
			||||||
 | 
					export const PayOrderRefundStatusEnum = { | 
				
			||||||
 | 
					  NO: { | 
				
			||||||
 | 
					    status: 0, | 
				
			||||||
 | 
					    name: '未退款' | 
				
			||||||
 | 
					  }, | 
				
			||||||
 | 
					  SOME: { | 
				
			||||||
 | 
					    status: 10, | 
				
			||||||
 | 
					    name: '部分退款' | 
				
			||||||
 | 
					  }, | 
				
			||||||
 | 
					  ALL: { | 
				
			||||||
 | 
					    status: 20, | 
				
			||||||
 | 
					    name: '全部退款' | 
				
			||||||
 | 
					  } | 
				
			||||||
 | 
					} | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/** | 
				
			||||||
 | 
					 * 支付退款订单状态枚举 | 
				
			||||||
 | 
					 */ | 
				
			||||||
 | 
					export const PayRefundStatusEnum = { | 
				
			||||||
 | 
					  CREATE: { | 
				
			||||||
 | 
					    status: 0, | 
				
			||||||
 | 
					    name: '退款订单生成' | 
				
			||||||
 | 
					  }, | 
				
			||||||
 | 
					  SUCCESS: { | 
				
			||||||
 | 
					    status: 1, | 
				
			||||||
 | 
					    name: '退款成功' | 
				
			||||||
 | 
					  }, | 
				
			||||||
 | 
					  FAILURE: { | 
				
			||||||
 | 
					    status: 2, | 
				
			||||||
 | 
					    name: '退款失败' | 
				
			||||||
 | 
					  }, | 
				
			||||||
 | 
					  PROCESSING_NOTIFY: { | 
				
			||||||
 | 
					    status: 3, | 
				
			||||||
 | 
					    name: '退款中,渠道通知结果' | 
				
			||||||
 | 
					  }, | 
				
			||||||
 | 
					  PROCESSING_QUERY: { | 
				
			||||||
 | 
					    status: 4, | 
				
			||||||
 | 
					    name: '退款中,系统查询结果' | 
				
			||||||
 | 
					  }, | 
				
			||||||
 | 
					  UNKNOWN_RETRY: { | 
				
			||||||
 | 
					    status: 5, | 
				
			||||||
 | 
					    name: '状态未知,请重试' | 
				
			||||||
 | 
					  }, | 
				
			||||||
 | 
					  UNKNOWN_QUERY: { | 
				
			||||||
 | 
					    status: 6, | 
				
			||||||
 | 
					    name: '状态未知,系统查询结果' | 
				
			||||||
 | 
					  }, | 
				
			||||||
 | 
					  CLOSE: { | 
				
			||||||
 | 
					    status: 99, | 
				
			||||||
 | 
					    name: '退款关闭' | 
				
			||||||
 | 
					  } | 
				
			||||||
 | 
					} | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/** | 
				
			||||||
 | 
					 * 商品 SPU 状态 | 
				
			||||||
 | 
					 */ | 
				
			||||||
 | 
					export const ProductSpuStatusEnum = { | 
				
			||||||
 | 
					  RECYCLE: { | 
				
			||||||
 | 
					    status: -1, | 
				
			||||||
 | 
					    name: '回收站' | 
				
			||||||
 | 
					  }, | 
				
			||||||
 | 
					  DISABLE: { | 
				
			||||||
 | 
					    status: 0, | 
				
			||||||
 | 
					    name: '下架' | 
				
			||||||
 | 
					  }, | 
				
			||||||
 | 
					  ENABLE: { | 
				
			||||||
 | 
					    status: 1, | 
				
			||||||
 | 
					    name: '上架' | 
				
			||||||
 | 
					  } | 
				
			||||||
 | 
					} | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/** | 
				
			||||||
 | 
					 * 优惠类型枚举 | 
				
			||||||
 | 
					 */ | 
				
			||||||
 | 
					export const PromotionDiscountTypeEnum = { | 
				
			||||||
 | 
					  PRICE: { | 
				
			||||||
 | 
					    type: 1, | 
				
			||||||
 | 
					    name: '满减' | 
				
			||||||
 | 
					  }, | 
				
			||||||
 | 
					  PERCENT: { | 
				
			||||||
 | 
					    type: 2, | 
				
			||||||
 | 
					    name: '折扣' | 
				
			||||||
 | 
					  } | 
				
			||||||
 | 
					} | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/** | 
				
			||||||
 | 
					 * 优惠劵模板的有限期类型的枚举 | 
				
			||||||
 | 
					 */ | 
				
			||||||
 | 
					export const CouponTemplateValidityTypeEnum = { | 
				
			||||||
 | 
					  DATE: { | 
				
			||||||
 | 
					    type: 1, | 
				
			||||||
 | 
					    name: '固定日期可用' | 
				
			||||||
 | 
					  }, | 
				
			||||||
 | 
					  TERM: { | 
				
			||||||
 | 
					    type: 2, | 
				
			||||||
 | 
					    name: '领取之后可用' | 
				
			||||||
 | 
					  } | 
				
			||||||
 | 
					} | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/** | 
				
			||||||
 | 
					 * 营销的商品范围枚举 | 
				
			||||||
 | 
					 */ | 
				
			||||||
 | 
					export const PromotionProductScopeEnum = { | 
				
			||||||
 | 
					  ALL: { | 
				
			||||||
 | 
					    scope: 1, | 
				
			||||||
 | 
					    name: '全部商品参与' | 
				
			||||||
 | 
					  }, | 
				
			||||||
 | 
					  SPU: { | 
				
			||||||
 | 
					    scope: 2, | 
				
			||||||
 | 
					    name: '指定商品参与' | 
				
			||||||
 | 
					  } | 
				
			||||||
 | 
					} | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/** | 
				
			||||||
 | 
					 * 营销的条件类型枚举 | 
				
			||||||
 | 
					 */ | 
				
			||||||
 | 
					export const PromotionConditionTypeEnum = { | 
				
			||||||
 | 
					  PRICE: { | 
				
			||||||
 | 
					    type: 10, | 
				
			||||||
 | 
					    name: '满 N 元' | 
				
			||||||
 | 
					  }, | 
				
			||||||
 | 
					  COUNT: { | 
				
			||||||
 | 
					    type: 20, | 
				
			||||||
 | 
					    name: '满 N 件' | 
				
			||||||
 | 
					  } | 
				
			||||||
 | 
					} | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/** | 
				
			||||||
 | 
					 * 促销活动的状态枚举 | 
				
			||||||
 | 
					 */ | 
				
			||||||
 | 
					export const PromotionActivityStatusEnum = { | 
				
			||||||
 | 
					  WAIT: { | 
				
			||||||
 | 
					    type: 10, | 
				
			||||||
 | 
					    name: '未开始' | 
				
			||||||
 | 
					  }, | 
				
			||||||
 | 
					  RUN: { | 
				
			||||||
 | 
					    type: 20, | 
				
			||||||
 | 
					    name: '进行中' | 
				
			||||||
 | 
					  }, | 
				
			||||||
 | 
					  END: { | 
				
			||||||
 | 
					    type: 30, | 
				
			||||||
 | 
					    name: '已结束' | 
				
			||||||
 | 
					  }, | 
				
			||||||
 | 
					  CLOSE: { | 
				
			||||||
 | 
					    type: 40, | 
				
			||||||
 | 
					    name: '已关闭' | 
				
			||||||
 | 
					  } | 
				
			||||||
 | 
					} | 
				
			||||||
@ -0,0 +1,58 @@ | 
				
			|||||||
 | 
					<template> | 
				
			||||||
 | 
					  <BasicModal v-bind="$attrs" @register="registerModal" :title="getTitle" @ok="handleSubmit"> | 
				
			||||||
 | 
					    <BasicForm @register="registerForm" /> | 
				
			||||||
 | 
					  </BasicModal> | 
				
			||||||
 | 
					</template> | 
				
			||||||
 | 
					<script lang="ts" setup name="RoleModal"> | 
				
			||||||
 | 
					import { ref, computed, unref } from 'vue' | 
				
			||||||
 | 
					import { BasicModal, useModalInner } from '@/components/Modal' | 
				
			||||||
 | 
					import { BasicForm, useForm } from '@/components/Form' | 
				
			||||||
 | 
					import { formSchema } from './role.data' | 
				
			||||||
 | 
					import { createRoleApi, getRoleApi, updateRoleApi } from '@/api/system/role' | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const emit = defineEmits(['success', 'register']) | 
				
			||||||
 | 
					const isUpdate = ref(true) | 
				
			||||||
 | 
					const rowId = ref() | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const [registerForm, { setFieldsValue, resetFields, validate }] = useForm({ | 
				
			||||||
 | 
					  labelWidth: 100, | 
				
			||||||
 | 
					  baseColProps: { span: 24 }, | 
				
			||||||
 | 
					  schemas: formSchema, | 
				
			||||||
 | 
					  showActionButtonGroup: false, | 
				
			||||||
 | 
					  actionColOptions: { | 
				
			||||||
 | 
					    span: 23 | 
				
			||||||
 | 
					  } | 
				
			||||||
 | 
					}) | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const [registerModal, { setModalProps, closeModal }] = useModalInner(async (data) => { | 
				
			||||||
 | 
					  resetFields() | 
				
			||||||
 | 
					  setModalProps({ confirmLoading: false }) | 
				
			||||||
 | 
					  isUpdate.value = !!data?.isUpdate | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if (unref(isUpdate)) { | 
				
			||||||
 | 
					    const res = await getRoleApi(data.record.id) | 
				
			||||||
 | 
					    rowId.value = res.id | 
				
			||||||
 | 
					    setFieldsValue({ | 
				
			||||||
 | 
					      ...res | 
				
			||||||
 | 
					    }) | 
				
			||||||
 | 
					  } | 
				
			||||||
 | 
					}) | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const getTitle = computed(() => (!unref(isUpdate) ? '新增角色' : '编辑角色')) | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					async function handleSubmit() { | 
				
			||||||
 | 
					  try { | 
				
			||||||
 | 
					    const values = await validate() | 
				
			||||||
 | 
					    setModalProps({ confirmLoading: true }) | 
				
			||||||
 | 
					    if (unref(isUpdate)) { | 
				
			||||||
 | 
					      await updateRoleApi(values) | 
				
			||||||
 | 
					    } else { | 
				
			||||||
 | 
					      await createRoleApi(values) | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					    closeModal() | 
				
			||||||
 | 
					    emit('success') | 
				
			||||||
 | 
					  } finally { | 
				
			||||||
 | 
					    setModalProps({ confirmLoading: false }) | 
				
			||||||
 | 
					  } | 
				
			||||||
 | 
					} | 
				
			||||||
 | 
					</script> | 
				
			||||||
@ -0,0 +1,58 @@ | 
				
			|||||||
 | 
					<template> | 
				
			||||||
 | 
					  <BasicModal v-bind="$attrs" @register="registerModal" :title="getTitle" @ok="handleSubmit"> | 
				
			||||||
 | 
					    <BasicForm @register="registerForm" /> | 
				
			||||||
 | 
					  </BasicModal> | 
				
			||||||
 | 
					</template> | 
				
			||||||
 | 
					<script lang="ts" setup name="RoleModal"> | 
				
			||||||
 | 
					import { ref, computed, unref } from 'vue' | 
				
			||||||
 | 
					import { BasicModal, useModalInner } from '@/components/Modal' | 
				
			||||||
 | 
					import { BasicForm, useForm } from '@/components/Form' | 
				
			||||||
 | 
					import { dataScopeFormSchema } from './role.data' | 
				
			||||||
 | 
					import { createRoleApi, getRoleApi, updateRoleApi } from '@/api/system/role' | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const emit = defineEmits(['success', 'register']) | 
				
			||||||
 | 
					const isUpdate = ref(true) | 
				
			||||||
 | 
					const rowId = ref() | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const [registerForm, { setFieldsValue, resetFields, validate }] = useForm({ | 
				
			||||||
 | 
					  labelWidth: 100, | 
				
			||||||
 | 
					  baseColProps: { span: 24 }, | 
				
			||||||
 | 
					  schemas: dataScopeFormSchema, | 
				
			||||||
 | 
					  showActionButtonGroup: false, | 
				
			||||||
 | 
					  actionColOptions: { | 
				
			||||||
 | 
					    span: 23 | 
				
			||||||
 | 
					  } | 
				
			||||||
 | 
					}) | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const [registerModal, { setModalProps, closeModal }] = useModalInner(async (data) => { | 
				
			||||||
 | 
					  resetFields() | 
				
			||||||
 | 
					  setModalProps({ confirmLoading: false }) | 
				
			||||||
 | 
					  isUpdate.value = !!data?.isUpdate | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if (unref(isUpdate)) { | 
				
			||||||
 | 
					    const res = await getRoleApi(data.record.id) | 
				
			||||||
 | 
					    rowId.value = res.id | 
				
			||||||
 | 
					    setFieldsValue({ | 
				
			||||||
 | 
					      ...res | 
				
			||||||
 | 
					    }) | 
				
			||||||
 | 
					  } | 
				
			||||||
 | 
					}) | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const getTitle = computed(() => (!unref(isUpdate) ? '新增角色' : '编辑角色')) | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					async function handleSubmit() { | 
				
			||||||
 | 
					  try { | 
				
			||||||
 | 
					    const values = await validate() | 
				
			||||||
 | 
					    setModalProps({ confirmLoading: true }) | 
				
			||||||
 | 
					    if (unref(isUpdate)) { | 
				
			||||||
 | 
					      await updateRoleApi(values) | 
				
			||||||
 | 
					    } else { | 
				
			||||||
 | 
					      await createRoleApi(values) | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					    closeModal() | 
				
			||||||
 | 
					    emit('success') | 
				
			||||||
 | 
					  } finally { | 
				
			||||||
 | 
					    setModalProps({ confirmLoading: false }) | 
				
			||||||
 | 
					  } | 
				
			||||||
 | 
					} | 
				
			||||||
 | 
					</script> | 
				
			||||||
@ -1,3 +1,106 @@ | 
				
			|||||||
<template> | 
					<template> | 
				
			||||||
  <div>开发中</div> | 
					  <div> | 
				
			||||||
 | 
					    <BasicTable @register="registerTable"> | 
				
			||||||
 | 
					      <template #toolbar> | 
				
			||||||
 | 
					        <a-button type="primary" @click="handleCreate"> 新增 </a-button> | 
				
			||||||
 | 
					        <a-button type="warning" @click="handleExport"> 导出 </a-button> | 
				
			||||||
 | 
					      </template> | 
				
			||||||
 | 
					      <template #bodyCell="{ column, record }"> | 
				
			||||||
 | 
					        <template v-if="column.key === 'action'"> | 
				
			||||||
 | 
					          <TableAction | 
				
			||||||
 | 
					            :actions="[ | 
				
			||||||
 | 
					              { | 
				
			||||||
 | 
					                icon: 'clarity:note-edit-line', | 
				
			||||||
 | 
					                label: '修改', | 
				
			||||||
 | 
					                onClick: handleEdit.bind(null, record) | 
				
			||||||
 | 
					              }, | 
				
			||||||
 | 
					              { | 
				
			||||||
 | 
					                icon: 'clarity:note-edit-line', | 
				
			||||||
 | 
					                label: '菜单权限', | 
				
			||||||
 | 
					                onClick: handleEdit.bind(null, record) | 
				
			||||||
 | 
					              }, | 
				
			||||||
 | 
					              { | 
				
			||||||
 | 
					                icon: 'clarity:note-edit-line', | 
				
			||||||
 | 
					                label: '数据权限', | 
				
			||||||
 | 
					                onClick: handleEdit.bind(null, record) | 
				
			||||||
 | 
					              }, | 
				
			||||||
 | 
					              { | 
				
			||||||
 | 
					                icon: 'ant-design:delete-outlined', | 
				
			||||||
 | 
					                label: '删除', | 
				
			||||||
 | 
					                color: 'error', | 
				
			||||||
 | 
					                popConfirm: { | 
				
			||||||
 | 
					                  title: '是否确认删除', | 
				
			||||||
 | 
					                  placement: 'left', | 
				
			||||||
 | 
					                  confirm: handleDelete.bind(null, record) | 
				
			||||||
 | 
					                } | 
				
			||||||
 | 
					              } | 
				
			||||||
 | 
					            ]" | 
				
			||||||
 | 
					          /> | 
				
			||||||
 | 
					        </template> | 
				
			||||||
 | 
					      </template> | 
				
			||||||
 | 
					    </BasicTable> | 
				
			||||||
 | 
					    <RoleModel @register="registerModal" @success="reload()" /> | 
				
			||||||
 | 
					  </div> | 
				
			||||||
</template> | 
					</template> | 
				
			||||||
 | 
					<script lang="ts" setup name="Role"> | 
				
			||||||
 | 
					import { BasicTable, useTable, TableAction } from '@/components/Table' | 
				
			||||||
 | 
					import { RoleExportReqVO, deleteRoleApi, exportRoleApi, getRolePageApi } from '@/api/system/role' | 
				
			||||||
 | 
					import { useModal } from '@/components/Modal' | 
				
			||||||
 | 
					import RoleModel from './RoleModel.vue' | 
				
			||||||
 | 
					import { columns, searchFormSchema } from './role.data' | 
				
			||||||
 | 
					import { useI18n } from '@/hooks/web/useI18n' | 
				
			||||||
 | 
					import { useMessage } from '@/hooks/web/useMessage' | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const { t } = useI18n() | 
				
			||||||
 | 
					const { createConfirm, createMessage } = useMessage() | 
				
			||||||
 | 
					const [registerModal, { openModal }] = useModal() | 
				
			||||||
 | 
					const [registerTable, { getForm, reload }] = useTable({ | 
				
			||||||
 | 
					  title: '角色列表', | 
				
			||||||
 | 
					  api: getRolePageApi, | 
				
			||||||
 | 
					  columns, | 
				
			||||||
 | 
					  formConfig: { | 
				
			||||||
 | 
					    labelWidth: 120, | 
				
			||||||
 | 
					    schemas: searchFormSchema | 
				
			||||||
 | 
					  }, | 
				
			||||||
 | 
					  useSearchForm: true, | 
				
			||||||
 | 
					  showTableSetting: true, | 
				
			||||||
 | 
					  showIndexColumn: false, | 
				
			||||||
 | 
					  actionColumn: { | 
				
			||||||
 | 
					    width: 240, | 
				
			||||||
 | 
					    title: '操作', | 
				
			||||||
 | 
					    dataIndex: 'action', | 
				
			||||||
 | 
					    fixed: 'right' | 
				
			||||||
 | 
					  } | 
				
			||||||
 | 
					}) | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function handleCreate() { | 
				
			||||||
 | 
					  openModal(true, { | 
				
			||||||
 | 
					    isUpdate: false | 
				
			||||||
 | 
					  }) | 
				
			||||||
 | 
					} | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function handleEdit(record: Recordable) { | 
				
			||||||
 | 
					  openModal(true, { | 
				
			||||||
 | 
					    record, | 
				
			||||||
 | 
					    isUpdate: true | 
				
			||||||
 | 
					  }) | 
				
			||||||
 | 
					} | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					async function handleExport() { | 
				
			||||||
 | 
					  createConfirm({ | 
				
			||||||
 | 
					    title: '导出', | 
				
			||||||
 | 
					    iconType: 'warning', | 
				
			||||||
 | 
					    content: '是否要导出数据?', | 
				
			||||||
 | 
					    async onOk() { | 
				
			||||||
 | 
					      await exportRoleApi(getForm().getFieldsValue() as RoleExportReqVO) | 
				
			||||||
 | 
					      createMessage.success(t('common.exportSuccessText')) | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					  }) | 
				
			||||||
 | 
					} | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					async function handleDelete(record: Recordable) { | 
				
			||||||
 | 
					  await deleteRoleApi(record.id) | 
				
			||||||
 | 
					  createMessage.success('删除成功') | 
				
			||||||
 | 
					  reload() | 
				
			||||||
 | 
					} | 
				
			||||||
 | 
					</script> | 
				
			||||||
 | 
				
			|||||||
@ -0,0 +1,167 @@ | 
				
			|||||||
 | 
					import { BasicColumn, FormSchema, useRender } from '@/components/Table' | 
				
			||||||
 | 
					import { DICT_TYPE, getIntDictOptions } from '@/utils/dict' | 
				
			||||||
 | 
					import { listSimpleDeptApi } from '@/api/system/dept' | 
				
			||||||
 | 
					import { SystemDataScopeEnum } from '@/enums/systemEnum' | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export const columns: BasicColumn[] = [ | 
				
			||||||
 | 
					  { | 
				
			||||||
 | 
					    title: '角色编号', | 
				
			||||||
 | 
					    dataIndex: 'id', | 
				
			||||||
 | 
					    width: 120 | 
				
			||||||
 | 
					  }, | 
				
			||||||
 | 
					  { | 
				
			||||||
 | 
					    title: '角色名称', | 
				
			||||||
 | 
					    dataIndex: 'name', | 
				
			||||||
 | 
					    width: 150 | 
				
			||||||
 | 
					  }, | 
				
			||||||
 | 
					  { | 
				
			||||||
 | 
					    title: '角色标识', | 
				
			||||||
 | 
					    dataIndex: 'code', | 
				
			||||||
 | 
					    width: 150 | 
				
			||||||
 | 
					  }, | 
				
			||||||
 | 
					  { | 
				
			||||||
 | 
					    title: '角色类型', | 
				
			||||||
 | 
					    dataIndex: 'type', | 
				
			||||||
 | 
					    width: 150, | 
				
			||||||
 | 
					    customRender: ({ text }) => { | 
				
			||||||
 | 
					      return useRender.renderDict(text, DICT_TYPE.SYSTEM_ROLE_TYPE) | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					  }, | 
				
			||||||
 | 
					  { | 
				
			||||||
 | 
					    title: '显示顺序', | 
				
			||||||
 | 
					    dataIndex: 'sort', | 
				
			||||||
 | 
					    width: 120 | 
				
			||||||
 | 
					  }, | 
				
			||||||
 | 
					  { | 
				
			||||||
 | 
					    title: '状态', | 
				
			||||||
 | 
					    dataIndex: 'status', | 
				
			||||||
 | 
					    width: 180, | 
				
			||||||
 | 
					    customRender: ({ text }) => { | 
				
			||||||
 | 
					      return useRender.renderDict(text, DICT_TYPE.COMMON_STATUS) | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					  }, | 
				
			||||||
 | 
					  { | 
				
			||||||
 | 
					    title: '创建时间', | 
				
			||||||
 | 
					    dataIndex: 'createTime', | 
				
			||||||
 | 
					    width: 180, | 
				
			||||||
 | 
					    customRender: ({ text }) => { | 
				
			||||||
 | 
					      return useRender.renderDate(text) | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					  } | 
				
			||||||
 | 
					] | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export const searchFormSchema: FormSchema[] = [ | 
				
			||||||
 | 
					  { | 
				
			||||||
 | 
					    label: '角色名称', | 
				
			||||||
 | 
					    field: 'name', | 
				
			||||||
 | 
					    component: 'Input', | 
				
			||||||
 | 
					    colProps: { span: 8 } | 
				
			||||||
 | 
					  }, | 
				
			||||||
 | 
					  { | 
				
			||||||
 | 
					    label: '角色标识', | 
				
			||||||
 | 
					    field: 'code', | 
				
			||||||
 | 
					    component: 'Input', | 
				
			||||||
 | 
					    colProps: { span: 8 } | 
				
			||||||
 | 
					  }, | 
				
			||||||
 | 
					  { | 
				
			||||||
 | 
					    label: '状态', | 
				
			||||||
 | 
					    field: 'status', | 
				
			||||||
 | 
					    component: 'Select', | 
				
			||||||
 | 
					    componentProps: { | 
				
			||||||
 | 
					      options: getIntDictOptions(DICT_TYPE.COMMON_STATUS) | 
				
			||||||
 | 
					    }, | 
				
			||||||
 | 
					    colProps: { span: 8 } | 
				
			||||||
 | 
					  }, | 
				
			||||||
 | 
					  { | 
				
			||||||
 | 
					    label: '创建时间', | 
				
			||||||
 | 
					    field: 'createTime', | 
				
			||||||
 | 
					    component: 'RangePicker', | 
				
			||||||
 | 
					    colProps: { span: 8 } | 
				
			||||||
 | 
					  } | 
				
			||||||
 | 
					] | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export const formSchema: FormSchema[] = [ | 
				
			||||||
 | 
					  { | 
				
			||||||
 | 
					    label: '编号', | 
				
			||||||
 | 
					    field: 'id', | 
				
			||||||
 | 
					    show: false, | 
				
			||||||
 | 
					    component: 'Input' | 
				
			||||||
 | 
					  }, | 
				
			||||||
 | 
					  { | 
				
			||||||
 | 
					    label: '角色名称', | 
				
			||||||
 | 
					    field: 'name', | 
				
			||||||
 | 
					    required: true, | 
				
			||||||
 | 
					    component: 'Input' | 
				
			||||||
 | 
					  }, | 
				
			||||||
 | 
					  { | 
				
			||||||
 | 
					    label: '角色标识', | 
				
			||||||
 | 
					    field: 'code', | 
				
			||||||
 | 
					    required: true, | 
				
			||||||
 | 
					    component: 'Input' | 
				
			||||||
 | 
					  }, | 
				
			||||||
 | 
					  { | 
				
			||||||
 | 
					    label: '角色顺序', | 
				
			||||||
 | 
					    field: 'sort', | 
				
			||||||
 | 
					    required: true, | 
				
			||||||
 | 
					    component: 'InputNumber' | 
				
			||||||
 | 
					  }, | 
				
			||||||
 | 
					  { | 
				
			||||||
 | 
					    label: '状态', | 
				
			||||||
 | 
					    field: 'status', | 
				
			||||||
 | 
					    component: 'Select', | 
				
			||||||
 | 
					    defaultValue: 0, | 
				
			||||||
 | 
					    componentProps: { | 
				
			||||||
 | 
					      options: getIntDictOptions(DICT_TYPE.COMMON_STATUS) | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					  }, | 
				
			||||||
 | 
					  { | 
				
			||||||
 | 
					    label: '备注', | 
				
			||||||
 | 
					    field: 'remark', | 
				
			||||||
 | 
					    component: 'InputTextArea' | 
				
			||||||
 | 
					  } | 
				
			||||||
 | 
					] | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export const dataScopeFormSchema: FormSchema[] = [ | 
				
			||||||
 | 
					  { | 
				
			||||||
 | 
					    label: '编号', | 
				
			||||||
 | 
					    field: 'id', | 
				
			||||||
 | 
					    show: false, | 
				
			||||||
 | 
					    component: 'Input' | 
				
			||||||
 | 
					  }, | 
				
			||||||
 | 
					  { | 
				
			||||||
 | 
					    label: '角色名称', | 
				
			||||||
 | 
					    field: 'name', | 
				
			||||||
 | 
					    dynamicDisabled: true, | 
				
			||||||
 | 
					    component: 'Input' | 
				
			||||||
 | 
					  }, | 
				
			||||||
 | 
					  { | 
				
			||||||
 | 
					    label: '角色标识', | 
				
			||||||
 | 
					    field: 'code', | 
				
			||||||
 | 
					    dynamicDisabled: true, | 
				
			||||||
 | 
					    component: 'Input' | 
				
			||||||
 | 
					  }, | 
				
			||||||
 | 
					  { | 
				
			||||||
 | 
					    label: '权限范围', | 
				
			||||||
 | 
					    field: 'dataScope', | 
				
			||||||
 | 
					    required: true, | 
				
			||||||
 | 
					    component: 'Select', | 
				
			||||||
 | 
					    componentProps: { | 
				
			||||||
 | 
					      options: getIntDictOptions(DICT_TYPE.SYSTEM_DATA_SCOPE) | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					  }, | 
				
			||||||
 | 
					  { | 
				
			||||||
 | 
					    label: '数据权限', | 
				
			||||||
 | 
					    field: 'status', | 
				
			||||||
 | 
					    component: 'ApiTreeSelect', | 
				
			||||||
 | 
					    ifShow: ({ values }) => values.dataScope === SystemDataScopeEnum.DEPT_CUSTOM, | 
				
			||||||
 | 
					    componentProps: { | 
				
			||||||
 | 
					      api: () => listSimpleDeptApi(), | 
				
			||||||
 | 
					      fieldNames: { | 
				
			||||||
 | 
					        label: 'name', | 
				
			||||||
 | 
					        key: 'id', | 
				
			||||||
 | 
					        value: 'id' | 
				
			||||||
 | 
					      }, | 
				
			||||||
 | 
					      handleTree: 'id' | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					  } | 
				
			||||||
 | 
					] | 
				
			||||||
		Reference in new issue