Merge branch 'dev' of https://gitee.com/fessor/yudao-ui-admin-vue3 into dev
commit
29fd92e60c
@ -1,57 +1,39 @@
|
|||||||
import request from '@/config/axios'
|
import request from '@/config/axios'
|
||||||
|
|
||||||
export interface SmsLogVO {
|
export interface SmsLogVO {
|
||||||
id: number
|
id: number | null
|
||||||
channelId: number
|
channelId: number | null
|
||||||
channelCode: string
|
channelCode: string
|
||||||
templateId: number
|
templateId: number | null
|
||||||
templateCode: string
|
templateCode: string
|
||||||
templateType: number
|
templateType: number | null
|
||||||
templateContent: string
|
templateContent: string
|
||||||
templateParams: Map<string, object>
|
templateParams: Map<string, object> | null
|
||||||
|
apiTemplateId: string
|
||||||
mobile: string
|
mobile: string
|
||||||
userId: number
|
userId: number | null
|
||||||
userType: number
|
userType: number | null
|
||||||
sendStatus: number
|
sendStatus: number | null
|
||||||
sendTime: Date
|
sendTime: Date | null
|
||||||
sendCode: number
|
sendCode: number | null
|
||||||
sendMsg: string
|
sendMsg: string
|
||||||
apiSendCode: string
|
apiSendCode: string
|
||||||
apiSendMsg: string
|
apiSendMsg: string
|
||||||
apiRequestId: string
|
apiRequestId: string
|
||||||
apiSerialNo: string
|
apiSerialNo: string
|
||||||
receiveStatus: number
|
receiveStatus: number | null
|
||||||
receiveTime: Date
|
receiveTime: Date | null
|
||||||
apiReceiveCode: string
|
apiReceiveCode: string
|
||||||
apiReceiveMsg: string
|
apiReceiveMsg: string
|
||||||
createTime: Date
|
createTime: Date | null
|
||||||
}
|
|
||||||
|
|
||||||
export interface SmsLogPageReqVO extends PageParam {
|
|
||||||
channelId?: number
|
|
||||||
templateId?: number
|
|
||||||
mobile?: string
|
|
||||||
sendStatus?: number
|
|
||||||
sendTime?: Date[]
|
|
||||||
receiveStatus?: number
|
|
||||||
receiveTime?: Date[]
|
|
||||||
}
|
|
||||||
export interface SmsLogExportReqVO {
|
|
||||||
channelId?: number
|
|
||||||
templateId?: number
|
|
||||||
mobile?: string
|
|
||||||
sendStatus?: number
|
|
||||||
sendTime?: Date[]
|
|
||||||
receiveStatus?: number
|
|
||||||
receiveTime?: Date[]
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// 查询短信日志列表
|
// 查询短信日志列表
|
||||||
export const getSmsLogPageApi = (params: SmsLogPageReqVO) => {
|
export const getSmsLogPage = (params: PageParam) => {
|
||||||
return request.get({ url: '/system/sms-log/page', params })
|
return request.get({ url: '/system/sms-log/page', params })
|
||||||
}
|
}
|
||||||
|
|
||||||
// 导出短信日志
|
// 导出短信日志
|
||||||
export const exportSmsLogApi = (params: SmsLogExportReqVO) => {
|
export const exportSmsLog = (params) => {
|
||||||
return request.download({ url: '/system/sms-log/export-excel', params })
|
return request.download({ url: '/system/sms-log/export-excel', params })
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,79 +0,0 @@
|
|||||||
import type { VxeCrudSchema } from '@/hooks/web/useVxeCrudSchemas'
|
|
||||||
|
|
||||||
// CrudSchema
|
|
||||||
const crudSchemas = reactive<VxeCrudSchema>({
|
|
||||||
primaryKey: 'id',
|
|
||||||
primaryType: null,
|
|
||||||
action: true,
|
|
||||||
columns: [
|
|
||||||
{
|
|
||||||
title: '定义编号',
|
|
||||||
field: 'id',
|
|
||||||
table: {
|
|
||||||
width: 360
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: '定义名称',
|
|
||||||
field: 'name',
|
|
||||||
table: {
|
|
||||||
// width: 120,
|
|
||||||
slots: {
|
|
||||||
default: 'name_default'
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: '定义分类',
|
|
||||||
field: 'category',
|
|
||||||
// dictType: DICT_TYPE.BPM_MODEL_CATEGORY,
|
|
||||||
// dictClass: 'number',
|
|
||||||
table: {
|
|
||||||
// width: 120,
|
|
||||||
slots: {
|
|
||||||
default: 'category_default'
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: '表单信息',
|
|
||||||
field: 'formId',
|
|
||||||
table: {
|
|
||||||
// width: 200,
|
|
||||||
slots: {
|
|
||||||
default: 'formId_default'
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: '流程版本',
|
|
||||||
field: 'version',
|
|
||||||
table: {
|
|
||||||
// width: 80,
|
|
||||||
slots: {
|
|
||||||
default: 'version_default'
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: '激活状态',
|
|
||||||
field: 'suspensionState',
|
|
||||||
table: {
|
|
||||||
// width: 80,
|
|
||||||
slots: {
|
|
||||||
default: 'suspensionState_default'
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: '部署时间',
|
|
||||||
field: 'deploymentTime',
|
|
||||||
isForm: false,
|
|
||||||
formatter: 'formatDate'
|
|
||||||
// table: {
|
|
||||||
// width: 180
|
|
||||||
// }
|
|
||||||
}
|
|
||||||
]
|
|
||||||
})
|
|
||||||
export const { allSchemas } = useVxeCrudSchemas(crudSchemas)
|
|
||||||
@ -1,43 +0,0 @@
|
|||||||
import type { VxeCrudSchema } from '@/hooks/web/useVxeCrudSchemas'
|
|
||||||
|
|
||||||
const { t } = useI18n() // 国际化
|
|
||||||
|
|
||||||
// 表单校验
|
|
||||||
export const rules = reactive({
|
|
||||||
name: [required]
|
|
||||||
})
|
|
||||||
|
|
||||||
// CrudSchema
|
|
||||||
const crudSchemas = reactive<VxeCrudSchema>({
|
|
||||||
primaryKey: 'id',
|
|
||||||
primaryType: 'id',
|
|
||||||
primaryTitle: '表单编号',
|
|
||||||
action: true,
|
|
||||||
columns: [
|
|
||||||
{
|
|
||||||
title: '表单名',
|
|
||||||
field: 'name',
|
|
||||||
isSearch: true
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: t('common.status'),
|
|
||||||
field: 'status',
|
|
||||||
dictType: DICT_TYPE.COMMON_STATUS,
|
|
||||||
dictClass: 'number'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: '备注',
|
|
||||||
field: 'remark'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: t('common.createTime'),
|
|
||||||
field: 'createTime',
|
|
||||||
formatter: 'formatDate',
|
|
||||||
isForm: false,
|
|
||||||
table: {
|
|
||||||
width: 180
|
|
||||||
}
|
|
||||||
}
|
|
||||||
]
|
|
||||||
})
|
|
||||||
export const { allSchemas } = useVxeCrudSchemas(crudSchemas)
|
|
||||||
@ -1,64 +0,0 @@
|
|||||||
import type { VxeCrudSchema } from '@/hooks/web/useVxeCrudSchemas'
|
|
||||||
|
|
||||||
const { t } = useI18n() // 国际化
|
|
||||||
|
|
||||||
// 表单校验
|
|
||||||
export const rules = reactive({
|
|
||||||
name: [required],
|
|
||||||
description: [required],
|
|
||||||
memberUserIds: [required],
|
|
||||||
status: [required]
|
|
||||||
})
|
|
||||||
|
|
||||||
// CrudSchema
|
|
||||||
const crudSchemas = reactive<VxeCrudSchema>({
|
|
||||||
primaryKey: 'id',
|
|
||||||
primaryType: 'id',
|
|
||||||
primaryTitle: '编号',
|
|
||||||
action: true,
|
|
||||||
searchSpan: 8,
|
|
||||||
columns: [
|
|
||||||
{
|
|
||||||
title: '组名',
|
|
||||||
field: 'name',
|
|
||||||
isSearch: true
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: '成员',
|
|
||||||
field: 'memberUserIds',
|
|
||||||
table: {
|
|
||||||
slots: {
|
|
||||||
default: 'memberUserIds_default'
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: '描述',
|
|
||||||
field: 'description'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: t('common.status'),
|
|
||||||
field: 'status',
|
|
||||||
dictType: DICT_TYPE.COMMON_STATUS,
|
|
||||||
dictClass: 'number',
|
|
||||||
isSearch: true
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: t('common.createTime'),
|
|
||||||
field: 'createTime',
|
|
||||||
formatter: 'formatDate',
|
|
||||||
isForm: false,
|
|
||||||
isSearch: true,
|
|
||||||
search: {
|
|
||||||
show: true,
|
|
||||||
itemRender: {
|
|
||||||
name: 'XDataTimePicker'
|
|
||||||
}
|
|
||||||
},
|
|
||||||
table: {
|
|
||||||
width: 180
|
|
||||||
}
|
|
||||||
}
|
|
||||||
]
|
|
||||||
})
|
|
||||||
export const { allSchemas } = useVxeCrudSchemas(crudSchemas)
|
|
||||||
@ -1,106 +0,0 @@
|
|||||||
import type { VxeCrudSchema } from '@/hooks/web/useVxeCrudSchemas'
|
|
||||||
|
|
||||||
const { t } = useI18n() // 国际化
|
|
||||||
|
|
||||||
// 表单校验
|
|
||||||
export const rules = reactive({
|
|
||||||
key: [required],
|
|
||||||
name: [required],
|
|
||||||
category: [required],
|
|
||||||
formType: [required],
|
|
||||||
formId: [required],
|
|
||||||
formCustomCreatePath: [required],
|
|
||||||
formCustomViewPath: [required]
|
|
||||||
})
|
|
||||||
|
|
||||||
// CrudSchema
|
|
||||||
const crudSchemas = reactive<VxeCrudSchema>({
|
|
||||||
primaryKey: 'key',
|
|
||||||
primaryType: null,
|
|
||||||
action: true,
|
|
||||||
actionWidth: '540px',
|
|
||||||
columns: [
|
|
||||||
{
|
|
||||||
title: '流程标识',
|
|
||||||
field: 'key',
|
|
||||||
isSearch: true,
|
|
||||||
table: {
|
|
||||||
width: 120
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: '流程名称',
|
|
||||||
field: 'name',
|
|
||||||
isSearch: true,
|
|
||||||
table: {
|
|
||||||
width: 120,
|
|
||||||
slots: {
|
|
||||||
default: 'name_default'
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: '流程分类',
|
|
||||||
field: 'category',
|
|
||||||
dictType: DICT_TYPE.BPM_MODEL_CATEGORY,
|
|
||||||
dictClass: 'number',
|
|
||||||
isSearch: true,
|
|
||||||
table: {
|
|
||||||
slots: {
|
|
||||||
default: 'category_default'
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: '表单信息',
|
|
||||||
field: 'formId',
|
|
||||||
table: {
|
|
||||||
width: 180,
|
|
||||||
slots: {
|
|
||||||
default: 'formId_default'
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: '最新部署的流程定义',
|
|
||||||
field: 'processDefinition',
|
|
||||||
isForm: false,
|
|
||||||
table: {
|
|
||||||
children: [
|
|
||||||
{
|
|
||||||
title: '流程版本',
|
|
||||||
field: 'version',
|
|
||||||
slots: {
|
|
||||||
default: 'version_default'
|
|
||||||
},
|
|
||||||
width: 80
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: '激活状态',
|
|
||||||
field: 'status',
|
|
||||||
slots: {
|
|
||||||
default: 'status_default'
|
|
||||||
},
|
|
||||||
width: 80
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: '部署时间',
|
|
||||||
field: 'processDefinition.deploymentTime',
|
|
||||||
formatter: 'formatDate',
|
|
||||||
width: 180
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: t('common.createTime'),
|
|
||||||
field: 'createTime',
|
|
||||||
isForm: false,
|
|
||||||
formatter: 'formatDate',
|
|
||||||
table: {
|
|
||||||
width: 180
|
|
||||||
}
|
|
||||||
}
|
|
||||||
]
|
|
||||||
})
|
|
||||||
export const { allSchemas } = useVxeCrudSchemas(crudSchemas)
|
|
||||||
@ -1,54 +0,0 @@
|
|||||||
import type { VxeCrudSchema } from '@/hooks/web/useVxeCrudSchemas'
|
|
||||||
|
|
||||||
// 表单校验
|
|
||||||
export const rules = reactive({
|
|
||||||
type: [{ required: true, message: '规则类型不能为空', trigger: 'change' }],
|
|
||||||
roleIds: [{ required: true, message: '指定角色不能为空', trigger: 'change' }],
|
|
||||||
deptIds: [{ required: true, message: '指定部门不能为空', trigger: 'change' }],
|
|
||||||
postIds: [{ required: true, message: '指定岗位不能为空', trigger: 'change' }],
|
|
||||||
userIds: [{ required: true, message: '指定用户不能为空', trigger: 'change' }],
|
|
||||||
userGroupIds: [{ required: true, message: '指定用户组不能为空', trigger: 'change' }],
|
|
||||||
scripts: [{ required: true, message: '指定脚本不能为空', trigger: 'change' }]
|
|
||||||
})
|
|
||||||
|
|
||||||
// CrudSchema
|
|
||||||
const crudSchemas = reactive<VxeCrudSchema>({
|
|
||||||
primaryKey: 'id',
|
|
||||||
primaryType: null,
|
|
||||||
action: true,
|
|
||||||
actionWidth: '200px',
|
|
||||||
columns: [
|
|
||||||
{
|
|
||||||
title: '任务名',
|
|
||||||
field: 'taskDefinitionName'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: '任务标识',
|
|
||||||
field: 'taskDefinitionKey'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: '规则类型',
|
|
||||||
field: 'type',
|
|
||||||
dictType: DICT_TYPE.BPM_TASK_ASSIGN_RULE_TYPE,
|
|
||||||
dictClass: 'number'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: '规则范围',
|
|
||||||
field: 'options',
|
|
||||||
table: {
|
|
||||||
slots: {
|
|
||||||
default: 'options_default'
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
]
|
|
||||||
})
|
|
||||||
|
|
||||||
export const idShowActionClick = (modelId?: any) => {
|
|
||||||
if (modelId) {
|
|
||||||
return true
|
|
||||||
} else {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
export const { allSchemas } = useVxeCrudSchemas(crudSchemas)
|
|
||||||
@ -1,74 +0,0 @@
|
|||||||
import type { VxeCrudSchema } from '@/hooks/web/useVxeCrudSchemas'
|
|
||||||
|
|
||||||
// CrudSchema
|
|
||||||
const crudSchemas = reactive<VxeCrudSchema>({
|
|
||||||
primaryKey: 'id',
|
|
||||||
primaryType: 'id',
|
|
||||||
primaryTitle: '日志编号',
|
|
||||||
action: true,
|
|
||||||
actionWidth: '80px',
|
|
||||||
columns: [
|
|
||||||
{
|
|
||||||
title: '链路追踪',
|
|
||||||
field: 'traceId',
|
|
||||||
isTable: false
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: '用户编号',
|
|
||||||
field: 'userId',
|
|
||||||
isSearch: true
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: '用户类型',
|
|
||||||
field: 'userType',
|
|
||||||
dictType: DICT_TYPE.USER_TYPE,
|
|
||||||
dictClass: 'number',
|
|
||||||
isSearch: true
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: '应用名',
|
|
||||||
field: 'applicationName',
|
|
||||||
isSearch: true
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: '请求方法名',
|
|
||||||
field: 'requestMethod'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: '请求地址',
|
|
||||||
field: 'requestUrl',
|
|
||||||
isSearch: true
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: '请求时间',
|
|
||||||
field: 'beginTime',
|
|
||||||
formatter: 'formatDate',
|
|
||||||
search: {
|
|
||||||
show: true,
|
|
||||||
itemRender: {
|
|
||||||
name: 'XDataTimePicker'
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: '执行时长',
|
|
||||||
field: 'duration',
|
|
||||||
table: {
|
|
||||||
slots: {
|
|
||||||
default: 'duration_default'
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: '操作结果',
|
|
||||||
field: 'resultCode',
|
|
||||||
isSearch: true,
|
|
||||||
table: {
|
|
||||||
slots: {
|
|
||||||
default: 'resultCode_default'
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
]
|
|
||||||
})
|
|
||||||
export const { allSchemas } = useVxeCrudSchemas(crudSchemas)
|
|
||||||
@ -1,76 +0,0 @@
|
|||||||
import type { VxeCrudSchema } from '@/hooks/web/useVxeCrudSchemas'
|
|
||||||
|
|
||||||
// CrudSchema
|
|
||||||
const crudSchemas = reactive<VxeCrudSchema>({
|
|
||||||
primaryKey: 'id',
|
|
||||||
primaryType: 'id',
|
|
||||||
primaryTitle: '日志编号',
|
|
||||||
action: true,
|
|
||||||
actionWidth: '300',
|
|
||||||
columns: [
|
|
||||||
{
|
|
||||||
title: '链路追踪',
|
|
||||||
field: 'traceId',
|
|
||||||
isTable: false
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: '用户编号',
|
|
||||||
field: 'userId',
|
|
||||||
isSearch: true
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: '用户类型',
|
|
||||||
field: 'userType',
|
|
||||||
dictType: DICT_TYPE.USER_TYPE,
|
|
||||||
isSearch: true
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: '应用名',
|
|
||||||
field: 'applicationName',
|
|
||||||
isSearch: true
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: '请求方法名',
|
|
||||||
field: 'requestMethod'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: '请求地址',
|
|
||||||
field: 'requestUrl',
|
|
||||||
isSearch: true
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: '异常发生时间',
|
|
||||||
field: 'exceptionTime',
|
|
||||||
formatter: 'formatDate',
|
|
||||||
search: {
|
|
||||||
show: true,
|
|
||||||
itemRender: {
|
|
||||||
name: 'XDataTimePicker'
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: '异常名',
|
|
||||||
field: 'exceptionName'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: '处理状态',
|
|
||||||
field: 'processStatus',
|
|
||||||
dictType: DICT_TYPE.INFRA_API_ERROR_LOG_PROCESS_STATUS,
|
|
||||||
dictClass: 'number',
|
|
||||||
isSearch: true
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: '处理人',
|
|
||||||
field: 'processUserId',
|
|
||||||
isTable: false
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: '处理时间',
|
|
||||||
field: 'processTime',
|
|
||||||
formatter: 'formatDate',
|
|
||||||
isTable: false
|
|
||||||
}
|
|
||||||
]
|
|
||||||
})
|
|
||||||
export const { allSchemas } = useVxeCrudSchemas(crudSchemas)
|
|
||||||
@ -1,3 +1,192 @@
|
|||||||
<template>
|
<template>
|
||||||
<span>开发中</span>
|
<!-- 搜索工作栏 -->
|
||||||
|
<content-wrap>
|
||||||
|
<el-form
|
||||||
|
class="-mb-15px"
|
||||||
|
:model="queryParams"
|
||||||
|
ref="queryFormRef"
|
||||||
|
:inline="true"
|
||||||
|
label-width="68px"
|
||||||
|
>
|
||||||
|
<el-form-item label="名称" prop="name">
|
||||||
|
<el-input
|
||||||
|
v-model="queryParams.name"
|
||||||
|
placeholder="请输入名称"
|
||||||
|
clearable
|
||||||
|
@keyup.enter="handleQuery"
|
||||||
|
class="!w-240px"
|
||||||
|
/>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item>
|
||||||
|
<el-button @click="handleQuery"><Icon icon="ep:search" class="mr-5px" />搜索</el-button>
|
||||||
|
<el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" />重置</el-button>
|
||||||
|
<el-button type="primary" @click="openForm('create')" v-hasPermi="['mp:account:create']">
|
||||||
|
<Icon icon="ep:plus" class="mr-5px" /> 新增
|
||||||
|
</el-button>
|
||||||
|
</el-form-item>
|
||||||
|
</el-form>
|
||||||
|
</content-wrap>
|
||||||
|
|
||||||
|
<!-- 列表 -->
|
||||||
|
<content-wrap>
|
||||||
|
<el-table v-loading="loading" :data="list">
|
||||||
|
<el-table-column label="名称" align="center" prop="name" />
|
||||||
|
<el-table-column label="微信号" align="center" prop="account" width="180" />
|
||||||
|
<el-table-column label="appId" align="center" prop="appId" width="180" />
|
||||||
|
<el-table-column label="服务器地址(URL)" align="center" prop="appId" width="360">
|
||||||
|
<template #default="scope">
|
||||||
|
{{ 'http://服务端地址/mp/open/' + scope.row.appId }}
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column label="二维码" align="center" prop="qrCodeUrl">
|
||||||
|
<template #default="scope">
|
||||||
|
<img
|
||||||
|
v-if="scope.row.qrCodeUrl"
|
||||||
|
:src="scope.row.qrCodeUrl"
|
||||||
|
alt="二维码"
|
||||||
|
style="height: 100px; display: inline-block"
|
||||||
|
/>
|
||||||
|
<el-button
|
||||||
|
link
|
||||||
|
type="primary"
|
||||||
|
@click="handleGenerateQrCode(scope.row)"
|
||||||
|
v-hasPermi="['mp:account:qr-code']"
|
||||||
|
>
|
||||||
|
生成二维码
|
||||||
|
</el-button>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column label="备注" align="center" prop="remark" />
|
||||||
|
<el-table-column label="操作" align="center">
|
||||||
|
<template #default="scope">
|
||||||
|
<el-button
|
||||||
|
link
|
||||||
|
type="primary"
|
||||||
|
@click="openForm('update', scope.row.id)"
|
||||||
|
v-hasPermi="['mp:account:update']"
|
||||||
|
>
|
||||||
|
编辑
|
||||||
|
</el-button>
|
||||||
|
<el-button
|
||||||
|
link
|
||||||
|
type="danger"
|
||||||
|
@click="handleDelete(scope.row.id)"
|
||||||
|
v-hasPermi="['mp:account:delete']"
|
||||||
|
>
|
||||||
|
删除
|
||||||
|
</el-button>
|
||||||
|
<el-button
|
||||||
|
link
|
||||||
|
type="danger"
|
||||||
|
@click="handleCleanQuota(scope.row)"
|
||||||
|
v-hasPermi="['mp:account:clear-quota']"
|
||||||
|
>
|
||||||
|
清空 API 配额
|
||||||
|
</el-button>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
</el-table>
|
||||||
|
<!-- 分页组件 -->
|
||||||
|
<pagination
|
||||||
|
v-show="total > 0"
|
||||||
|
:total="total"
|
||||||
|
v-model:page="queryParams.pageNo"
|
||||||
|
v-model:limit="queryParams.pageSize"
|
||||||
|
@pagination="getList"
|
||||||
|
/>
|
||||||
|
</content-wrap>
|
||||||
|
|
||||||
|
<!-- 对话框(添加 / 修改) -->
|
||||||
|
<AccountForm ref="formRef" @success="getList" />
|
||||||
</template>
|
</template>
|
||||||
|
<script setup lang="ts" name="MpAccount">
|
||||||
|
import * as AccountApi from '@/api/mp/account'
|
||||||
|
import AccountForm from './AccountForm.vue'
|
||||||
|
|
||||||
|
const message = useMessage() // 消息弹窗
|
||||||
|
const { t } = useI18n() // 国际化
|
||||||
|
|
||||||
|
const loading = ref(true) // 列表的加载中
|
||||||
|
const total = ref(0) // 列表的总页数
|
||||||
|
const list = ref([]) // 列表的数据
|
||||||
|
const queryParams = reactive({
|
||||||
|
pageNo: 1,
|
||||||
|
pageSize: 10,
|
||||||
|
name: null,
|
||||||
|
account: null,
|
||||||
|
appId: null
|
||||||
|
})
|
||||||
|
const queryFormRef = ref() // 搜索的表单
|
||||||
|
|
||||||
|
/** 查询列表 */
|
||||||
|
const getList = async () => {
|
||||||
|
loading.value = true
|
||||||
|
// 处理查询参数
|
||||||
|
let params = { ...queryParams }
|
||||||
|
// 执行查询
|
||||||
|
const data = await AccountApi.getAccountPage(params)
|
||||||
|
list.value = data.list
|
||||||
|
total.value = data.total
|
||||||
|
loading.value = false
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 搜索按钮操作 */
|
||||||
|
const handleQuery = () => {
|
||||||
|
queryParams.pageNo = 1
|
||||||
|
getList()
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 重置按钮操作 */
|
||||||
|
const resetQuery = () => {
|
||||||
|
queryFormRef.value.resetFields()
|
||||||
|
handleQuery()
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 添加/修改操作 */
|
||||||
|
const formRef = ref()
|
||||||
|
const openForm = (type: string, id?: number) => {
|
||||||
|
formRef.value.open(type, id)
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 删除按钮操作 */
|
||||||
|
const handleDelete = async (id) => {
|
||||||
|
try {
|
||||||
|
// 删除的二次确认
|
||||||
|
await message.delConfirm()
|
||||||
|
// 发起删除
|
||||||
|
await AccountApi.deleteAccount(id)
|
||||||
|
message.success(t('common.delSuccess'))
|
||||||
|
// 刷新列表
|
||||||
|
await getList()
|
||||||
|
} catch {}
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 生成二维码的按钮操作 */
|
||||||
|
const handleGenerateQrCode = async (row) => {
|
||||||
|
try {
|
||||||
|
// 生成二维码的二次确认
|
||||||
|
await message.confirm('是否确认生成公众号账号编号为"' + row.name + '"的二维码?')
|
||||||
|
// 发起生成二维码
|
||||||
|
await AccountApi.generateAccountQrCode(row.id)
|
||||||
|
message.success('生成二维码成功')
|
||||||
|
// 刷新列表
|
||||||
|
await getList()
|
||||||
|
} catch {}
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 清空二维码 API 配额的按钮操作 */
|
||||||
|
const handleCleanQuota = async (row) => {
|
||||||
|
try {
|
||||||
|
// 清空 API 配额的二次确认
|
||||||
|
await message.confirm('是否确认清空生成公众号账号编号为"' + row.name + '"的 API 配额?')
|
||||||
|
// 发起清空 API 配额
|
||||||
|
await AccountApi.clearAccountQuota(row.id)
|
||||||
|
message.success('清空 API 配额成功')
|
||||||
|
} catch {}
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 初始化 **/
|
||||||
|
onMounted(() => {
|
||||||
|
getList()
|
||||||
|
})
|
||||||
|
</script>
|
||||||
|
|||||||
Binary file not shown.
|
After Width: | Height: | Size: 15 KiB |
@ -0,0 +1,71 @@
|
|||||||
|
<!--
|
||||||
|
【微信消息 - 定位】
|
||||||
|
-->
|
||||||
|
<template>
|
||||||
|
<div>
|
||||||
|
<el-link
|
||||||
|
type="primary"
|
||||||
|
target="_blank"
|
||||||
|
:href="
|
||||||
|
'https://map.qq.com/?type=marker&isopeninfowin=1&markertype=1&pointx=' +
|
||||||
|
locationY +
|
||||||
|
'&pointy=' +
|
||||||
|
locationX +
|
||||||
|
'&name=' +
|
||||||
|
label +
|
||||||
|
'&ref=yudao'
|
||||||
|
"
|
||||||
|
>
|
||||||
|
<el-col>
|
||||||
|
<el-row>
|
||||||
|
<img
|
||||||
|
:src="
|
||||||
|
'https://apis.map.qq.com/ws/staticmap/v2/?zoom=10&markers=color:blue|label:A|' +
|
||||||
|
locationX +
|
||||||
|
',' +
|
||||||
|
locationY +
|
||||||
|
'&key=' +
|
||||||
|
qqMapKey +
|
||||||
|
'&size=250*180'
|
||||||
|
"
|
||||||
|
/>
|
||||||
|
</el-row>
|
||||||
|
<el-row>
|
||||||
|
<el-icon><Location /></el-icon>
|
||||||
|
<Icon icon="ep:location" />
|
||||||
|
{{ label }}
|
||||||
|
</el-row>
|
||||||
|
</el-col>
|
||||||
|
</el-link>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
<script setup lang="ts" name="WxLocation">
|
||||||
|
const props = defineProps({
|
||||||
|
locationX: {
|
||||||
|
required: true,
|
||||||
|
type: Number
|
||||||
|
},
|
||||||
|
locationY: {
|
||||||
|
required: true,
|
||||||
|
type: Number
|
||||||
|
},
|
||||||
|
label: {
|
||||||
|
// 地名
|
||||||
|
required: true,
|
||||||
|
type: String
|
||||||
|
},
|
||||||
|
qqMapKey: {
|
||||||
|
// QQ 地图的密钥 https://lbs.qq.com/service/staticV2/staticGuide/staticDoc
|
||||||
|
required: false,
|
||||||
|
type: String,
|
||||||
|
default: 'TVDBZ-TDILD-4ON4B-PFDZA-RNLKH-VVF6E' // 需要自定义
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
defineExpose({
|
||||||
|
locationX: props.locationX,
|
||||||
|
locationY: props.locationY,
|
||||||
|
label: props.label,
|
||||||
|
qqMapKey: props.qqMapKey
|
||||||
|
})
|
||||||
|
</script>
|
||||||
@ -0,0 +1,101 @@
|
|||||||
|
.avue-card{
|
||||||
|
&__item{
|
||||||
|
margin-bottom: 16px;
|
||||||
|
border: 1px solid #e8e8e8;
|
||||||
|
background-color: #fff;
|
||||||
|
box-sizing: border-box;
|
||||||
|
color: rgba(0,0,0,.65);
|
||||||
|
font-size: 14px;
|
||||||
|
font-variant: tabular-nums;
|
||||||
|
line-height: 1.5;
|
||||||
|
list-style: none;
|
||||||
|
font-feature-settings: "tnum";
|
||||||
|
cursor: pointer;
|
||||||
|
height:200px;
|
||||||
|
&:hover{
|
||||||
|
border-color: rgba(0,0,0,.09);
|
||||||
|
box-shadow: 0 2px 8px rgba(0,0,0,.09);
|
||||||
|
}
|
||||||
|
&--add{
|
||||||
|
border:1px dashed #000;
|
||||||
|
width: 100%;
|
||||||
|
color: rgba(0,0,0,.45);
|
||||||
|
background-color: #fff;
|
||||||
|
border-color: #d9d9d9;
|
||||||
|
border-radius: 2px;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
font-size: 16px;
|
||||||
|
i{
|
||||||
|
margin-right: 10px;
|
||||||
|
}
|
||||||
|
&:hover{
|
||||||
|
color: #40a9ff;
|
||||||
|
background-color: #fff;
|
||||||
|
border-color: #40a9ff;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
&__body{
|
||||||
|
display: flex;
|
||||||
|
padding: 24px;
|
||||||
|
}
|
||||||
|
&__detail{
|
||||||
|
flex:1
|
||||||
|
}
|
||||||
|
&__avatar{
|
||||||
|
width: 48px;
|
||||||
|
height: 48px;
|
||||||
|
border-radius: 48px;
|
||||||
|
overflow: hidden;
|
||||||
|
margin-right: 12px;
|
||||||
|
img{
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
&__title{
|
||||||
|
color: rgba(0,0,0,.85);
|
||||||
|
margin-bottom: 12px;
|
||||||
|
font-size: 16px;
|
||||||
|
&:hover{
|
||||||
|
color:#1890ff;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
&__info{
|
||||||
|
color: rgba(0,0,0,.45);
|
||||||
|
display: -webkit-box;
|
||||||
|
-webkit-box-orient: vertical;
|
||||||
|
-webkit-line-clamp: 3;
|
||||||
|
overflow: hidden;
|
||||||
|
height: 64px;
|
||||||
|
}
|
||||||
|
&__menu{
|
||||||
|
display: flex;
|
||||||
|
justify-content:space-around;
|
||||||
|
height: 50px;
|
||||||
|
background: #f7f9fa;
|
||||||
|
color: rgba(0,0,0,.45);
|
||||||
|
text-align: center;
|
||||||
|
line-height: 50px;
|
||||||
|
&:hover{
|
||||||
|
color:#1890ff;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/** joolun 额外加的 */
|
||||||
|
.avue-comment__main {
|
||||||
|
flex: unset!important;
|
||||||
|
border-radius: 5px!important;
|
||||||
|
margin: 0 8px!important;
|
||||||
|
}
|
||||||
|
.avue-comment__header {
|
||||||
|
border-top-left-radius: 5px;
|
||||||
|
border-top-right-radius: 5px;
|
||||||
|
}
|
||||||
|
.avue-comment__body {
|
||||||
|
border-bottom-right-radius: 5px;
|
||||||
|
border-bottom-left-radius: 5px;
|
||||||
|
}
|
||||||
@ -0,0 +1,88 @@
|
|||||||
|
/* 来自 https://github.com/nmxiaowei/avue/blob/master/styles/src/element-ui/comment.scss */
|
||||||
|
.avue-comment{
|
||||||
|
margin-bottom: 30px;
|
||||||
|
display: flex;
|
||||||
|
align-items: flex-start;
|
||||||
|
&--reverse{
|
||||||
|
flex-direction:row-reverse;
|
||||||
|
.avue-comment__main{
|
||||||
|
&:before,&:after{
|
||||||
|
left: auto;
|
||||||
|
right: -8px;
|
||||||
|
border-width: 8px 0 8px 8px;
|
||||||
|
}
|
||||||
|
&:before{
|
||||||
|
border-left-color: #dedede;
|
||||||
|
}
|
||||||
|
&:after{
|
||||||
|
border-left-color: #f8f8f8;
|
||||||
|
margin-right: 1px;
|
||||||
|
margin-left: auto;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
&__avatar{
|
||||||
|
width: 48px;
|
||||||
|
height: 48px;
|
||||||
|
border-radius: 50%;
|
||||||
|
border: 1px solid transparent;
|
||||||
|
box-sizing: border-box;
|
||||||
|
vertical-align: middle;
|
||||||
|
}
|
||||||
|
&__header{
|
||||||
|
padding: 5px 15px;
|
||||||
|
background: #f8f8f8;
|
||||||
|
border-bottom: 1px solid #eee;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: space-between;
|
||||||
|
}
|
||||||
|
&__author{
|
||||||
|
font-weight: 700;
|
||||||
|
font-size: 14px;
|
||||||
|
color: #999;
|
||||||
|
}
|
||||||
|
&__main{
|
||||||
|
flex:1;
|
||||||
|
margin: 0 20px;
|
||||||
|
position: relative;
|
||||||
|
border: 1px solid #dedede;
|
||||||
|
border-radius: 2px;
|
||||||
|
&:before,&:after{
|
||||||
|
position: absolute;
|
||||||
|
top: 10px;
|
||||||
|
left: -8px;
|
||||||
|
right: 100%;
|
||||||
|
width: 0;
|
||||||
|
height: 0;
|
||||||
|
display: block;
|
||||||
|
content: " ";
|
||||||
|
border-color: transparent;
|
||||||
|
border-style: solid solid outset;
|
||||||
|
border-width: 8px 8px 8px 0;
|
||||||
|
pointer-events: none;
|
||||||
|
}
|
||||||
|
&:before {
|
||||||
|
border-right-color: #dedede;
|
||||||
|
z-index: 1;
|
||||||
|
}
|
||||||
|
&:after{
|
||||||
|
border-right-color: #f8f8f8;
|
||||||
|
margin-left: 1px;
|
||||||
|
z-index: 2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
&__body{
|
||||||
|
padding: 15px;
|
||||||
|
overflow: hidden;
|
||||||
|
background: #fff;
|
||||||
|
font-family: Segoe UI,Lucida Grande,Helvetica,Arial,Microsoft YaHei,FreeSans,Arimo,Droid Sans,wenquanyi micro hei,Hiragino Sans GB,Hiragino Sans GB W3,FontAwesome,sans-serif;color: #333;
|
||||||
|
font-size: 14px;
|
||||||
|
}
|
||||||
|
blockquote{
|
||||||
|
margin:0;
|
||||||
|
font-family: Georgia,Times New Roman,Times,Kai,Kaiti SC,KaiTi,BiauKai,FontAwesome,serif;
|
||||||
|
padding: 1px 0 1px 15px;
|
||||||
|
border-left: 4px solid #ddd;
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,60 @@
|
|||||||
|
<!--
|
||||||
|
【微信消息 - 音乐】
|
||||||
|
-->
|
||||||
|
<template>
|
||||||
|
<div>
|
||||||
|
<el-link
|
||||||
|
type="success"
|
||||||
|
:underline="false"
|
||||||
|
target="_blank"
|
||||||
|
:href="hqMusicUrl ? hqMusicUrl : musicUrl"
|
||||||
|
>
|
||||||
|
<div
|
||||||
|
class="avue-card__body"
|
||||||
|
style="padding: 10px; background-color: #fff; border-radius: 5px"
|
||||||
|
>
|
||||||
|
<div class="avue-card__avatar">
|
||||||
|
<img :src="thumbMediaUrl" alt="" />
|
||||||
|
</div>
|
||||||
|
<div class="avue-card__detail">
|
||||||
|
<div class="avue-card__title" style="margin-bottom: unset">{{ title }}</div>
|
||||||
|
<div class="avue-card__info" style="height: unset">{{ description }}</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</el-link>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup lang="ts" name="WxMusic">
|
||||||
|
const props = defineProps({
|
||||||
|
title: {
|
||||||
|
required: false,
|
||||||
|
type: String
|
||||||
|
},
|
||||||
|
description: {
|
||||||
|
required: false,
|
||||||
|
type: String
|
||||||
|
},
|
||||||
|
musicUrl: {
|
||||||
|
required: false,
|
||||||
|
type: String
|
||||||
|
},
|
||||||
|
hqMusicUrl: {
|
||||||
|
required: false,
|
||||||
|
type: String
|
||||||
|
},
|
||||||
|
thumbMediaUrl: {
|
||||||
|
required: true,
|
||||||
|
type: String
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
defineExpose({
|
||||||
|
musicUrl: props.musicUrl
|
||||||
|
})
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
/* 因为 joolun 实现依赖 avue 组件,该页面使用了 card.scc */
|
||||||
|
@import '../wx-msg/card.scss';
|
||||||
|
</style>
|
||||||
@ -1,84 +0,0 @@
|
|||||||
import type { VxeCrudSchema } from '@/hooks/web/useVxeCrudSchemas'
|
|
||||||
|
|
||||||
const { t } = useI18n() // 国际化
|
|
||||||
|
|
||||||
// 表单校验
|
|
||||||
export const rules = reactive({
|
|
||||||
name: [required],
|
|
||||||
sort: [required],
|
|
||||||
// email: [required],
|
|
||||||
email: [
|
|
||||||
{ required: true, message: t('profile.rules.mail'), trigger: 'blur' },
|
|
||||||
{
|
|
||||||
type: 'email',
|
|
||||||
message: t('profile.rules.truemail'),
|
|
||||||
trigger: ['blur', 'change']
|
|
||||||
}
|
|
||||||
],
|
|
||||||
phone: [
|
|
||||||
{
|
|
||||||
len: 11,
|
|
||||||
trigger: 'blur',
|
|
||||||
message: '请输入正确的手机号码'
|
|
||||||
}
|
|
||||||
]
|
|
||||||
})
|
|
||||||
|
|
||||||
// CrudSchema
|
|
||||||
const crudSchemas = reactive<VxeCrudSchema>({
|
|
||||||
primaryKey: 'id',
|
|
||||||
primaryType: null,
|
|
||||||
action: true,
|
|
||||||
columns: [
|
|
||||||
{
|
|
||||||
title: '上级部门',
|
|
||||||
field: 'parentId',
|
|
||||||
isTable: false
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: '部门名称',
|
|
||||||
field: 'name',
|
|
||||||
isSearch: true,
|
|
||||||
table: {
|
|
||||||
treeNode: true,
|
|
||||||
align: 'left'
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: '负责人',
|
|
||||||
field: 'leaderUserId',
|
|
||||||
table: {
|
|
||||||
slots: {
|
|
||||||
default: 'leaderUserId_default'
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: '联系电话',
|
|
||||||
field: 'phone'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: '邮箱',
|
|
||||||
field: 'email',
|
|
||||||
isTable: false
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: '显示排序',
|
|
||||||
field: 'sort'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: t('common.status'),
|
|
||||||
field: 'status',
|
|
||||||
dictType: DICT_TYPE.COMMON_STATUS,
|
|
||||||
dictClass: 'number',
|
|
||||||
isSearch: true
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: t('common.createTime'),
|
|
||||||
field: 'createTime',
|
|
||||||
formatter: 'formatDate',
|
|
||||||
isForm: false
|
|
||||||
}
|
|
||||||
]
|
|
||||||
})
|
|
||||||
export const { allSchemas } = useVxeCrudSchemas(crudSchemas)
|
|
||||||
@ -1,53 +0,0 @@
|
|||||||
import type { VxeCrudSchema } from '@/hooks/web/useVxeCrudSchemas'
|
|
||||||
|
|
||||||
// CrudSchema
|
|
||||||
const crudSchemas = reactive<VxeCrudSchema>({
|
|
||||||
primaryKey: 'id',
|
|
||||||
primaryType: 'id',
|
|
||||||
primaryTitle: '日志编号',
|
|
||||||
action: true,
|
|
||||||
actionWidth: '100px',
|
|
||||||
columns: [
|
|
||||||
{
|
|
||||||
title: '日志类型',
|
|
||||||
field: 'logType',
|
|
||||||
dictType: DICT_TYPE.SYSTEM_LOGIN_TYPE,
|
|
||||||
dictClass: 'number'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: '用户名称',
|
|
||||||
field: 'username',
|
|
||||||
isSearch: true
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: '登录地址',
|
|
||||||
field: 'userIp',
|
|
||||||
isSearch: true
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: '浏览器',
|
|
||||||
field: 'userAgent'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: '登陆结果',
|
|
||||||
field: 'result',
|
|
||||||
dictType: DICT_TYPE.SYSTEM_LOGIN_RESULT,
|
|
||||||
dictClass: 'number'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: '登录日期',
|
|
||||||
field: 'createTime',
|
|
||||||
formatter: 'formatDate',
|
|
||||||
table: {
|
|
||||||
width: 150
|
|
||||||
},
|
|
||||||
search: {
|
|
||||||
show: true,
|
|
||||||
itemRender: {
|
|
||||||
name: 'XDataTimePicker'
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
]
|
|
||||||
})
|
|
||||||
export const { allSchemas } = useVxeCrudSchemas(crudSchemas)
|
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue