Merge remote-tracking branch 'yudao/dev' into dev
# Conflicts: # src/config/axios/service.ts # src/types/auto-components.d.ts
This commit is contained in:
commit
d679a7a3be
5
.env
5
.env
@ -13,3 +13,8 @@ VITE_APP_TENANT_ENABLE=true
|
|||||||
# 验证码的开关
|
# 验证码的开关
|
||||||
VITE_APP_CAPTCHA_ENABLE=true
|
VITE_APP_CAPTCHA_ENABLE=true
|
||||||
|
|
||||||
|
# 验证码的开关
|
||||||
|
VITE_APP_CAPTCHA_ENABLE=true
|
||||||
|
|
||||||
|
# 百度统计
|
||||||
|
VITE_APP_BAIDU_CODE = a1ff8825baa73c3a78eb96aa40325abc
|
||||||
|
@ -9,6 +9,7 @@
|
|||||||
|
|
||||||
## 🐶 新手必读
|
## 🐶 新手必读
|
||||||
|
|
||||||
|
* nodejs > 16.0.0 && pnpm > 7.30.0
|
||||||
* 演示地址:<http://dashboard.yudao.iocoder.cn>
|
* 演示地址:<http://dashboard.yudao.iocoder.cn>
|
||||||
* 启动文档:<https://doc.iocoder.cn/quick-start/>
|
* 启动文档:<https://doc.iocoder.cn/quick-start/>
|
||||||
* 视频教程:<https://doc.iocoder.cn/video/>
|
* 视频教程:<https://doc.iocoder.cn/video/>
|
||||||
|
@ -98,7 +98,7 @@ export function createVitePlugins() {
|
|||||||
deleteOriginFile: false //压缩后是否删除源文件
|
deleteOriginFile: false //压缩后是否删除源文件
|
||||||
}),
|
}),
|
||||||
ViteEjsPlugin(),
|
ViteEjsPlugin(),
|
||||||
topLevelAwait({
|
topLevelAwait({ // https://juejin.cn/post/7152191742513512485
|
||||||
// The export name of top-level await promise for each chunk module
|
// The export name of top-level await promise for each chunk module
|
||||||
promiseExportName: '__tla',
|
promiseExportName: '__tla',
|
||||||
// The function to generate import names of top-level await promise in each chunk module
|
// The function to generate import names of top-level await promise in each chunk module
|
||||||
|
@ -13,6 +13,7 @@
|
|||||||
"build:dev": "node --max_old_space_size=8000 ./node_modules/vite/bin/vite.js build --mode dev",
|
"build:dev": "node --max_old_space_size=8000 ./node_modules/vite/bin/vite.js build --mode dev",
|
||||||
"build:test": "node --max_old_space_size=8000 ./node_modules/vite/bin/vite.js build --mode test",
|
"build:test": "node --max_old_space_size=8000 ./node_modules/vite/bin/vite.js build --mode test",
|
||||||
"build:static": "node --max_old_space_size=8000 ./node_modules/vite/bin/vite.js build --mode static",
|
"build:static": "node --max_old_space_size=8000 ./node_modules/vite/bin/vite.js build --mode static",
|
||||||
|
"build:front": "node --max_old_space_size=8000 ./node_modules/vite/bin/vite.js build --mode front",
|
||||||
"serve:pro": "vite preview --mode pro",
|
"serve:pro": "vite preview --mode pro",
|
||||||
"serve:dev": "vite preview --mode dev",
|
"serve:dev": "vite preview --mode dev",
|
||||||
"serve:test": "vite preview --mode test",
|
"serve:test": "vite preview --mode test",
|
||||||
@ -129,7 +130,7 @@
|
|||||||
"windicss": "^3.5.6"
|
"windicss": "^3.5.6"
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=16.18.0"
|
"node": ">=16.0.0"
|
||||||
},
|
},
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"repository": {
|
"repository": {
|
||||||
|
@ -12,16 +12,16 @@ export type LeaveVO = {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 创建请假申请
|
// 创建请假申请
|
||||||
export const createLeaveApi = async (data: LeaveVO) => {
|
export const createLeave = async (data: LeaveVO) => {
|
||||||
return await request.post({ url: '/bpm/oa/leave/create', data: data })
|
return await request.post({ url: '/bpm/oa/leave/create', data: data })
|
||||||
}
|
}
|
||||||
|
|
||||||
// 获得请假申请
|
// 获得请假申请
|
||||||
export const getLeaveApi = async (id: number) => {
|
export const getLeave = async (id: number) => {
|
||||||
return await request.get({ url: '/bpm/oa/leave/get?id=' + id })
|
return await request.get({ url: '/bpm/oa/leave/get?id=' + id })
|
||||||
}
|
}
|
||||||
|
|
||||||
// 获得请假申请分页
|
// 获得请假申请分页
|
||||||
export const getLeavePageApi = async (params) => {
|
export const getLeavePage = async (params) => {
|
||||||
return await request.get({ url: '/bpm/oa/leave/page', params })
|
return await request.get({ url: '/bpm/oa/leave/page', params })
|
||||||
}
|
}
|
||||||
|
@ -20,15 +20,15 @@ export type ProcessInstanceVO = {
|
|||||||
endTime: string
|
endTime: string
|
||||||
}
|
}
|
||||||
|
|
||||||
export const getMyProcessInstancePageApi = async (params) => {
|
export const getMyProcessInstancePage = async (params) => {
|
||||||
return await request.get({ url: '/bpm/process-instance/my-page', params })
|
return await request.get({ url: '/bpm/process-instance/my-page', params })
|
||||||
}
|
}
|
||||||
|
|
||||||
export const createProcessInstanceApi = async (data) => {
|
export const createProcessInstance = async (data) => {
|
||||||
return await request.post({ url: '/bpm/process-instance/create', data: data })
|
return await request.post({ url: '/bpm/process-instance/create', data: data })
|
||||||
}
|
}
|
||||||
|
|
||||||
export const cancelProcessInstanceApi = async (id: number, reason: string) => {
|
export const cancelProcessInstance = async (id: number, reason: string) => {
|
||||||
const data = {
|
const data = {
|
||||||
id: id,
|
id: id,
|
||||||
reason: reason
|
reason: reason
|
||||||
@ -36,6 +36,6 @@ export const cancelProcessInstanceApi = async (id: number, reason: string) => {
|
|||||||
return await request.delete({ url: '/bpm/process-instance/cancel', data: data })
|
return await request.delete({ url: '/bpm/process-instance/cancel', data: data })
|
||||||
}
|
}
|
||||||
|
|
||||||
export const getProcessInstanceApi = async (id: number) => {
|
export const getProcessInstance = async (id: number) => {
|
||||||
return await request.get({ url: '/bpm/process-instance/get?id=' + id })
|
return await request.get({ url: '/bpm/process-instance/get?id=' + id })
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,9 @@
|
|||||||
import request from '@/config/axios'
|
import request from '@/config/axios'
|
||||||
|
|
||||||
|
export type TaskVO = {
|
||||||
|
id: number
|
||||||
|
}
|
||||||
|
|
||||||
export const getTodoTaskPage = async (params) => {
|
export const getTodoTaskPage = async (params) => {
|
||||||
return await request.get({ url: '/bpm/task/todo-page', params })
|
return await request.get({ url: '/bpm/task/todo-page', params })
|
||||||
}
|
}
|
||||||
@ -32,3 +36,8 @@ export const getTaskListByProcessInstanceId = async (processInstanceId) => {
|
|||||||
url: '/bpm/task/list-by-process-instance-id?processInstanceId=' + processInstanceId
|
url: '/bpm/task/list-by-process-instance-id?processInstanceId=' + processInstanceId
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 导出任务
|
||||||
|
export const exportTask = async (params) => {
|
||||||
|
return await request.download({ url: '/bpm/task/export', params })
|
||||||
|
}
|
||||||
|
@ -43,6 +43,6 @@ export const deleteConfig = (id: number) => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 导出参数
|
// 导出参数
|
||||||
export const exportConfigApi = (params) => {
|
export const exportConfig = (params) => {
|
||||||
return request.download({ url: '/infra/config/export', params })
|
return request.download({ url: '/infra/config/export', params })
|
||||||
}
|
}
|
||||||
|
@ -1,16 +1,16 @@
|
|||||||
import request from '@/config/axios'
|
import request from '@/config/axios'
|
||||||
|
|
||||||
// 导出Html
|
// 导出Html
|
||||||
export const exportHtmlApi = () => {
|
export const exportHtml = () => {
|
||||||
return request.download({ url: '/infra/db-doc/export-html' })
|
return request.download({ url: '/infra/db-doc/export-html' })
|
||||||
}
|
}
|
||||||
|
|
||||||
// 导出Word
|
// 导出Word
|
||||||
export const exportWordApi = () => {
|
export const exportWord = () => {
|
||||||
return request.download({ url: '/infra/db-doc/export-word' })
|
return request.download({ url: '/infra/db-doc/export-word' })
|
||||||
}
|
}
|
||||||
|
|
||||||
// 导出Markdown
|
// 导出Markdown
|
||||||
export const exportMarkdownApi = () => {
|
export const exportMarkdown = () => {
|
||||||
return request.download({ url: '/infra/db-doc/export-markdown' })
|
return request.download({ url: '/infra/db-doc/export-markdown' })
|
||||||
}
|
}
|
||||||
|
@ -53,7 +53,7 @@ export const updateJobStatus = (id: number, status: number) => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 定时任务立即执行一次
|
// 定时任务立即执行一次
|
||||||
export const runJobApi = (id: number) => {
|
export const runJob = (id: number) => {
|
||||||
return request.put({ url: '/infra/job/trigger?id=' + id })
|
return request.put({ url: '/infra/job/trigger?id=' + id })
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3,39 +3,6 @@ import request from '@/config/axios'
|
|||||||
/**
|
/**
|
||||||
* 获取redis 监控信息
|
* 获取redis 监控信息
|
||||||
*/
|
*/
|
||||||
export const getCacheApi = () => {
|
export const getCache = () => {
|
||||||
return request.get({ url: '/infra/redis/get-monitor-info' })
|
return request.get({ url: '/infra/redis/get-monitor-info' })
|
||||||
}
|
}
|
||||||
// 获取模块
|
|
||||||
export const getKeyDefineListApi = () => {
|
|
||||||
return request.get({ url: '/infra/redis/get-key-define-list' })
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* 获取redis key列表
|
|
||||||
*/
|
|
||||||
export const getKeyListApi = (keyTemplate: string) => {
|
|
||||||
return request.get({
|
|
||||||
url: '/infra/redis/get-key-list',
|
|
||||||
params: {
|
|
||||||
keyTemplate
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
// 获取缓存内容
|
|
||||||
export const getKeyValueApi = (key: string) => {
|
|
||||||
return request.get({ url: '/infra/redis/get-key-value?key=' + key })
|
|
||||||
}
|
|
||||||
|
|
||||||
// 根据键名删除缓存
|
|
||||||
export const deleteKeyApi = (key: string) => {
|
|
||||||
return request.delete({ url: '/infra/redis/delete-key?key=' + key })
|
|
||||||
}
|
|
||||||
|
|
||||||
export const deleteKeysApi = (keyTemplate: string) => {
|
|
||||||
return request.delete({
|
|
||||||
url: '/infra/redis/delete-keys?',
|
|
||||||
params: {
|
|
||||||
keyTemplate
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
@ -174,12 +174,3 @@ export interface RedisCommandStatsVO {
|
|||||||
calls: number
|
calls: number
|
||||||
usec: number
|
usec: number
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface RedisKeyInfo {
|
|
||||||
keyTemplate: string
|
|
||||||
keyType: string
|
|
||||||
valueType: string
|
|
||||||
timeoutType: number
|
|
||||||
timeout: number
|
|
||||||
memo: string
|
|
||||||
}
|
|
||||||
|
@ -20,7 +20,7 @@ export interface SmsLoginVO {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 登录
|
// 登录
|
||||||
export const loginApi = (data: UserLoginVO) => {
|
export const login = (data: UserLoginVO) => {
|
||||||
return request.post({ url: '/system/auth/login', data })
|
return request.post({ url: '/system/auth/login', data })
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -30,48 +30,48 @@ export const refreshToken = () => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 使用租户名,获得租户编号
|
// 使用租户名,获得租户编号
|
||||||
export const getTenantIdByNameApi = (name: string) => {
|
export const getTenantIdByName = (name: string) => {
|
||||||
return request.get({ url: '/system/tenant/get-id-by-name?name=' + name })
|
return request.get({ url: '/system/tenant/get-id-by-name?name=' + name })
|
||||||
}
|
}
|
||||||
|
|
||||||
// 登出
|
// 登出
|
||||||
export const loginOutApi = () => {
|
export const loginOut = () => {
|
||||||
return request.post({ url: '/system/auth/logout' })
|
return request.post({ url: '/system/auth/logout' })
|
||||||
}
|
}
|
||||||
|
|
||||||
// 获取用户权限信息
|
// 获取用户权限信息
|
||||||
export const getInfoApi = () => {
|
export const getInfo = () => {
|
||||||
return request.get({ url: '/system/auth/get-permission-info' })
|
return request.get({ url: '/system/auth/get-permission-info' })
|
||||||
}
|
}
|
||||||
|
|
||||||
// 路由
|
// 路由
|
||||||
export const getAsyncRoutesApi = () => {
|
export const getAsyncRoutes = () => {
|
||||||
return request.get({ url: '/system/auth/list-menus' })
|
return request.get({ url: '/system/auth/list-menus' })
|
||||||
}
|
}
|
||||||
|
|
||||||
//获取登录验证码
|
//获取登录验证码
|
||||||
export const sendSmsCodeApi = (data: SmsCodeVO) => {
|
export const sendSmsCode = (data: SmsCodeVO) => {
|
||||||
return request.post({ url: '/system/auth/send-sms-code', data })
|
return request.post({ url: '/system/auth/send-sms-code', data })
|
||||||
}
|
}
|
||||||
|
|
||||||
// 短信验证码登录
|
// 短信验证码登录
|
||||||
export const smsLoginApi = (data: SmsLoginVO) => {
|
export const smsLogin = (data: SmsLoginVO) => {
|
||||||
return request.post({ url: '/system/auth/sms-login', data })
|
return request.post({ url: '/system/auth/sms-login', data })
|
||||||
}
|
}
|
||||||
|
|
||||||
// 社交授权的跳转
|
// 社交授权的跳转
|
||||||
export const socialAuthRedirectApi = (type: number, redirectUri: string) => {
|
export const socialAuthRedirect = (type: number, redirectUri: string) => {
|
||||||
return request.get({
|
return request.get({
|
||||||
url: '/system/auth/social-auth-redirect?type=' + type + '&redirectUri=' + redirectUri
|
url: '/system/auth/social-auth-redirect?type=' + type + '&redirectUri=' + redirectUri
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
// 获取验证图片 以及token
|
// 获取验证图片以及 token
|
||||||
export const getCodeApi = (data) => {
|
export const getCode = (data) => {
|
||||||
return request.postOriginal({ url: 'system/captcha/get', data })
|
return request.postOriginal({ url: 'system/captcha/get', data })
|
||||||
}
|
}
|
||||||
|
|
||||||
// 滑动或者点选验证
|
// 滑动或者点选验证
|
||||||
export const reqCheckApi = (data) => {
|
export const reqCheck = (data) => {
|
||||||
return request.postOriginal({ url: 'system/captcha/check', data })
|
return request.postOriginal({ url: 'system/captcha/check', data })
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -38,41 +38,41 @@ export interface AppUpdateStatusReqVO {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 查询列表支付应用
|
// 查询列表支付应用
|
||||||
export const getAppPageApi = (params: AppPageReqVO) => {
|
export const getAppPage = (params: AppPageReqVO) => {
|
||||||
return request.get({ url: '/pay/app/page', params })
|
return request.get({ url: '/pay/app/page', params })
|
||||||
}
|
}
|
||||||
|
|
||||||
// 查询详情支付应用
|
// 查询详情支付应用
|
||||||
export const getAppApi = (id: number) => {
|
export const getApp = (id: number) => {
|
||||||
return request.get({ url: '/pay/app/get?id=' + id })
|
return request.get({ url: '/pay/app/get?id=' + id })
|
||||||
}
|
}
|
||||||
|
|
||||||
// 新增支付应用
|
// 新增支付应用
|
||||||
export const createAppApi = (data: AppVO) => {
|
export const createApp = (data: AppVO) => {
|
||||||
return request.post({ url: '/pay/app/create', data })
|
return request.post({ url: '/pay/app/create', data })
|
||||||
}
|
}
|
||||||
|
|
||||||
// 修改支付应用
|
// 修改支付应用
|
||||||
export const updateAppApi = (data: AppVO) => {
|
export const updateApp = (data: AppVO) => {
|
||||||
return request.put({ url: '/pay/app/update', data })
|
return request.put({ url: '/pay/app/update', data })
|
||||||
}
|
}
|
||||||
|
|
||||||
// 支付应用信息状态修改
|
// 支付应用信息状态修改
|
||||||
export const changeAppStatusApi = (data: AppUpdateStatusReqVO) => {
|
export const changeAppStatus = (data: AppUpdateStatusReqVO) => {
|
||||||
return request.put({ url: '/pay/app/update-status', data: data })
|
return request.put({ url: '/pay/app/update-status', data: data })
|
||||||
}
|
}
|
||||||
|
|
||||||
// 删除支付应用
|
// 删除支付应用
|
||||||
export const deleteAppApi = (id: number) => {
|
export const deleteApp = (id: number) => {
|
||||||
return request.delete({ url: '/pay/app/delete?id=' + id })
|
return request.delete({ url: '/pay/app/delete?id=' + id })
|
||||||
}
|
}
|
||||||
|
|
||||||
// 导出支付应用
|
// 导出支付应用
|
||||||
export const exportAppApi = (params: AppExportReqVO) => {
|
export const exportApp = (params: AppExportReqVO) => {
|
||||||
return request.download({ url: '/pay/app/export-excel', params })
|
return request.download({ url: '/pay/app/export-excel', params })
|
||||||
}
|
}
|
||||||
|
|
||||||
// 根据商ID称搜索应用列表
|
// 根据商ID称搜索应用列表
|
||||||
export const getAppListByMerchantIdApi = (merchantId: number) => {
|
export const getAppListByMerchantId = (merchantId: number) => {
|
||||||
return request.get({ url: '/pay/app/list-merchant-id', params: { merchantId: merchantId } })
|
return request.get({ url: '/pay/app/list-merchant-id', params: { merchantId: merchantId } })
|
||||||
}
|
}
|
||||||
|
@ -12,35 +12,13 @@ export interface ChannelVO {
|
|||||||
createTime: Date
|
createTime: Date
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface ChannelPageReqVO extends PageParam {
|
|
||||||
code?: string
|
|
||||||
status?: number
|
|
||||||
remark?: string
|
|
||||||
feeRate?: number
|
|
||||||
merchantId?: number
|
|
||||||
appId?: number
|
|
||||||
config?: string
|
|
||||||
createTime?: Date[]
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface ChannelExportReqVO {
|
|
||||||
code?: string
|
|
||||||
status?: number
|
|
||||||
remark?: string
|
|
||||||
feeRate?: number
|
|
||||||
merchantId?: number
|
|
||||||
appId?: number
|
|
||||||
config?: string
|
|
||||||
createTime?: Date[]
|
|
||||||
}
|
|
||||||
|
|
||||||
// 查询列表支付渠道
|
// 查询列表支付渠道
|
||||||
export const getChannelPageApi = (params: ChannelPageReqVO) => {
|
export const getChannelPage = (params: PageParam) => {
|
||||||
return request.get({ url: '/pay/channel/page', params })
|
return request.get({ url: '/pay/channel/page', params })
|
||||||
}
|
}
|
||||||
|
|
||||||
// 查询详情支付渠道
|
// 查询详情支付渠道
|
||||||
export const getChannelApi = (merchantId: number, appId: string, code: string) => {
|
export const getChannel = (merchantId: number, appId: string, code: string) => {
|
||||||
const params = {
|
const params = {
|
||||||
merchantId: merchantId,
|
merchantId: merchantId,
|
||||||
appId: appId,
|
appId: appId,
|
||||||
@ -50,21 +28,21 @@ export const getChannelApi = (merchantId: number, appId: string, code: string) =
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 新增支付渠道
|
// 新增支付渠道
|
||||||
export const createChannelApi = (data: ChannelVO) => {
|
export const createChannel = (data: ChannelVO) => {
|
||||||
return request.post({ url: '/pay/channel/create', data })
|
return request.post({ url: '/pay/channel/create', data })
|
||||||
}
|
}
|
||||||
|
|
||||||
// 修改支付渠道
|
// 修改支付渠道
|
||||||
export const updateChannelApi = (data: ChannelVO) => {
|
export const updateChannel = (data: ChannelVO) => {
|
||||||
return request.put({ url: '/pay/channel/update', data })
|
return request.put({ url: '/pay/channel/update', data })
|
||||||
}
|
}
|
||||||
|
|
||||||
// 删除支付渠道
|
// 删除支付渠道
|
||||||
export const deleteChannelApi = (id: number) => {
|
export const deleteChannel = (id: number) => {
|
||||||
return request.delete({ url: '/pay/channel/delete?id=' + id })
|
return request.delete({ url: '/pay/channel/delete?id=' + id })
|
||||||
}
|
}
|
||||||
|
|
||||||
// 导出支付渠道
|
// 导出支付渠道
|
||||||
export const exportChannelApi = (params: ChannelExportReqVO) => {
|
export const exportChannel = (params) => {
|
||||||
return request.download({ url: '/pay/channel/export-excel', params })
|
return request.download({ url: '/pay/channel/export-excel', params })
|
||||||
}
|
}
|
||||||
|
@ -79,31 +79,31 @@ export interface OrderExportReqVO {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 查询列表支付订单
|
// 查询列表支付订单
|
||||||
export const getOrderPageApi = async (params: OrderPageReqVO) => {
|
export const getOrderPage = async (params: OrderPageReqVO) => {
|
||||||
return await request.get({ url: '/pay/order/page', params })
|
return await request.get({ url: '/pay/order/page', params })
|
||||||
}
|
}
|
||||||
|
|
||||||
// 查询详情支付订单
|
// 查询详情支付订单
|
||||||
export const getOrderApi = async (id: number) => {
|
export const getOrder = async (id: number) => {
|
||||||
return await request.get({ url: '/pay/order/get?id=' + id })
|
return await request.get({ url: '/pay/order/get?id=' + id })
|
||||||
}
|
}
|
||||||
|
|
||||||
// 新增支付订单
|
// 新增支付订单
|
||||||
export const createOrderApi = async (data: OrderVO) => {
|
export const createOrder = async (data: OrderVO) => {
|
||||||
return await request.post({ url: '/pay/order/create', data })
|
return await request.post({ url: '/pay/order/create', data })
|
||||||
}
|
}
|
||||||
|
|
||||||
// 修改支付订单
|
// 修改支付订单
|
||||||
export const updateOrderApi = async (data: OrderVO) => {
|
export const updateOrder = async (data: OrderVO) => {
|
||||||
return await request.put({ url: '/pay/order/update', data })
|
return await request.put({ url: '/pay/order/update', data })
|
||||||
}
|
}
|
||||||
|
|
||||||
// 删除支付订单
|
// 删除支付订单
|
||||||
export const deleteOrderApi = async (id: number) => {
|
export const deleteOrder = async (id: number) => {
|
||||||
return await request.delete({ url: '/pay/order/delete?id=' + id })
|
return await request.delete({ url: '/pay/order/delete?id=' + id })
|
||||||
}
|
}
|
||||||
|
|
||||||
// 导出支付订单
|
// 导出支付订单
|
||||||
export const exportOrderApi = async (params: OrderExportReqVO) => {
|
export const exportOrder = async (params: OrderExportReqVO) => {
|
||||||
return await request.download({ url: '/pay/order/export-excel', params })
|
return await request.download({ url: '/pay/order/export-excel', params })
|
||||||
}
|
}
|
||||||
|
@ -86,31 +86,31 @@ export interface PayRefundExportReqVO {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 查询列表退款订单
|
// 查询列表退款订单
|
||||||
export const getRefundPageApi = (params: RefundPageReqVO) => {
|
export const getRefundPage = (params: RefundPageReqVO) => {
|
||||||
return request.get({ url: '/pay/refund/page', params })
|
return request.get({ url: '/pay/refund/page', params })
|
||||||
}
|
}
|
||||||
|
|
||||||
// 查询详情退款订单
|
// 查询详情退款订单
|
||||||
export const getRefundApi = (id: number) => {
|
export const getRefund = (id: number) => {
|
||||||
return request.get({ url: '/pay/refund/get?id=' + id })
|
return request.get({ url: '/pay/refund/get?id=' + id })
|
||||||
}
|
}
|
||||||
|
|
||||||
// 新增退款订单
|
// 新增退款订单
|
||||||
export const createRefundApi = (data: RefundVO) => {
|
export const createRefund = (data: RefundVO) => {
|
||||||
return request.post({ url: '/pay/refund/create', data })
|
return request.post({ url: '/pay/refund/create', data })
|
||||||
}
|
}
|
||||||
|
|
||||||
// 修改退款订单
|
// 修改退款订单
|
||||||
export const updateRefundApi = (data: RefundVO) => {
|
export const updateRefund = (data: RefundVO) => {
|
||||||
return request.put({ url: '/pay/refund/update', data })
|
return request.put({ url: '/pay/refund/update', data })
|
||||||
}
|
}
|
||||||
|
|
||||||
// 删除退款订单
|
// 删除退款订单
|
||||||
export const deleteRefundApi = (id: number) => {
|
export const deleteRefund = (id: number) => {
|
||||||
return request.delete({ url: '/pay/refund/delete?id=' + id })
|
return request.delete({ url: '/pay/refund/delete?id=' + id })
|
||||||
}
|
}
|
||||||
|
|
||||||
// 导出退款订单
|
// 导出退款订单
|
||||||
export const exportRefundApi = (params: PayRefundExportReqVO) => {
|
export const exportRefund = (params: PayRefundExportReqVO) => {
|
||||||
return request.download({ url: '/pay/refund/export-excel', params })
|
return request.download({ url: '/pay/refund/export-excel', params })
|
||||||
}
|
}
|
||||||
|
@ -12,37 +12,32 @@ export interface DeptVO {
|
|||||||
createTime: Date
|
createTime: Date
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface DeptPageReqVO {
|
|
||||||
name?: string
|
|
||||||
status?: number
|
|
||||||
}
|
|
||||||
|
|
||||||
// 查询部门(精简)列表
|
// 查询部门(精简)列表
|
||||||
export const getSimpleDeptList = async (): Promise<DeptVO[]> => {
|
export const getSimpleDeptList = async (): Promise<DeptVO[]> => {
|
||||||
return await request.get({ url: '/system/dept/list-all-simple' })
|
return await request.get({ url: '/system/dept/list-all-simple' })
|
||||||
}
|
}
|
||||||
|
|
||||||
// 查询部门列表
|
// 查询部门列表
|
||||||
export const getDeptPageApi = async (params: DeptPageReqVO) => {
|
export const getDeptPage = async (params: PageParam) => {
|
||||||
return await request.get({ url: '/system/dept/list', params })
|
return await request.get({ url: '/system/dept/list', params })
|
||||||
}
|
}
|
||||||
|
|
||||||
// 查询部门详情
|
// 查询部门详情
|
||||||
export const getDeptApi = async (id: number) => {
|
export const getDept = async (id: number) => {
|
||||||
return await request.get({ url: '/system/dept/get?id=' + id })
|
return await request.get({ url: '/system/dept/get?id=' + id })
|
||||||
}
|
}
|
||||||
|
|
||||||
// 新增部门
|
// 新增部门
|
||||||
export const createDeptApi = async (data: DeptVO) => {
|
export const createDept = async (data: DeptVO) => {
|
||||||
return await request.post({ url: '/system/dept/create', data: data })
|
return await request.post({ url: '/system/dept/create', data: data })
|
||||||
}
|
}
|
||||||
|
|
||||||
// 修改部门
|
// 修改部门
|
||||||
export const updateDeptApi = async (params: DeptVO) => {
|
export const updateDept = async (params: DeptVO) => {
|
||||||
return await request.put({ url: '/system/dept/update', data: params })
|
return await request.put({ url: '/system/dept/update', data: params })
|
||||||
}
|
}
|
||||||
|
|
||||||
// 删除部门
|
// 删除部门
|
||||||
export const deleteDeptApi = async (id: number) => {
|
export const deleteDept = async (id: number) => {
|
||||||
return await request.delete({ url: '/system/dept/delete?id=' + id })
|
return await request.delete({ url: '/system/dept/delete?id=' + id })
|
||||||
}
|
}
|
||||||
|
@ -10,39 +10,31 @@ export interface ErrorCodeVO {
|
|||||||
createTime: Date
|
createTime: Date
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface ErrorCodePageReqVO extends PageParam {
|
|
||||||
type?: number
|
|
||||||
applicationName?: string
|
|
||||||
code?: number
|
|
||||||
message?: string
|
|
||||||
createTime?: Date[]
|
|
||||||
}
|
|
||||||
|
|
||||||
// 查询错误码列表
|
// 查询错误码列表
|
||||||
export const getErrorCodePageApi = (params: ErrorCodePageReqVO) => {
|
export const getErrorCodePage = (params: PageParam) => {
|
||||||
return request.get({ url: '/system/error-code/page', params })
|
return request.get({ url: '/system/error-code/page', params })
|
||||||
}
|
}
|
||||||
|
|
||||||
// 查询错误码详情
|
// 查询错误码详情
|
||||||
export const getErrorCodeApi = (id: number) => {
|
export const getErrorCode = (id: number) => {
|
||||||
return request.get({ url: '/system/error-code/get?id=' + id })
|
return request.get({ url: '/system/error-code/get?id=' + id })
|
||||||
}
|
}
|
||||||
|
|
||||||
// 新增错误码
|
// 新增错误码
|
||||||
export const createErrorCodeApi = (data: ErrorCodeVO) => {
|
export const createErrorCode = (data: ErrorCodeVO) => {
|
||||||
return request.post({ url: '/system/error-code/create', data })
|
return request.post({ url: '/system/error-code/create', data })
|
||||||
}
|
}
|
||||||
|
|
||||||
// 修改错误码
|
// 修改错误码
|
||||||
export const updateErrorCodeApi = (data: ErrorCodeVO) => {
|
export const updateErrorCode = (data: ErrorCodeVO) => {
|
||||||
return request.put({ url: '/system/error-code/update', data })
|
return request.put({ url: '/system/error-code/update', data })
|
||||||
}
|
}
|
||||||
|
|
||||||
// 删除错误码
|
// 删除错误码
|
||||||
export const deleteErrorCodeApi = (id: number) => {
|
export const deleteErrorCode = (id: number) => {
|
||||||
return request.delete({ url: '/system/error-code/delete?id=' + id })
|
return request.delete({ url: '/system/error-code/delete?id=' + id })
|
||||||
}
|
}
|
||||||
// 导出错误码
|
// 导出错误码
|
||||||
export const excelErrorCodeApi = (params: ErrorCodePageReqVO) => {
|
export const excelErrorCode = (params) => {
|
||||||
return request.download({ url: '/system/error-code/export-excel', params })
|
return request.download({ url: '/system/error-code/export-excel', params })
|
||||||
}
|
}
|
||||||
|
@ -29,7 +29,7 @@ export const getMenuList = (params) => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 获取菜单详情
|
// 获取菜单详情
|
||||||
export const getMenuApi = (id: number) => {
|
export const getMenu = (id: number) => {
|
||||||
return request.get({ url: '/system/menu/get?id=' + id })
|
return request.get({ url: '/system/menu/get?id=' + id })
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -38,11 +38,11 @@ export const updateAllNotifyMessageRead = async () => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 获取当前用户的最新站内信列表
|
// 获取当前用户的最新站内信列表
|
||||||
export const getUnreadNotifyMessageListApi = async () => {
|
export const getUnreadNotifyMessageList = async () => {
|
||||||
return await request.get({ url: '/system/notify-message/get-unread-list' })
|
return await request.get({ url: '/system/notify-message/get-unread-list' })
|
||||||
}
|
}
|
||||||
|
|
||||||
// 获得当前用户的未读站内信数量
|
// 获得当前用户的未读站内信数量
|
||||||
export const getUnreadNotifyMessageCountApi = async () => {
|
export const getUnreadNotifyMessageCount = async () => {
|
||||||
return await request.get({ url: '/system/notify-message/get-unread-count' })
|
return await request.get({ url: '/system/notify-message/get-unread-count' })
|
||||||
}
|
}
|
||||||
|
@ -51,17 +51,17 @@ export interface UserProfileUpdateReqVO {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 查询用户个人信息
|
// 查询用户个人信息
|
||||||
export const getUserProfileApi = () => {
|
export const getUserProfile = () => {
|
||||||
return request.get({ url: '/system/user/profile/get' })
|
return request.get({ url: '/system/user/profile/get' })
|
||||||
}
|
}
|
||||||
|
|
||||||
// 修改用户个人信息
|
// 修改用户个人信息
|
||||||
export const updateUserProfileApi = (data: UserProfileUpdateReqVO) => {
|
export const updateUserProfile = (data: UserProfileUpdateReqVO) => {
|
||||||
return request.put({ url: '/system/user/profile/update', data })
|
return request.put({ url: '/system/user/profile/update', data })
|
||||||
}
|
}
|
||||||
|
|
||||||
// 用户密码重置
|
// 用户密码重置
|
||||||
export const updateUserPwdApi = (oldPassword: string, newPassword: string) => {
|
export const updateUserPassword = (oldPassword: string, newPassword: string) => {
|
||||||
return request.put({
|
return request.put({
|
||||||
url: '/system/user/profile/update-password',
|
url: '/system/user/profile/update-password',
|
||||||
data: {
|
data: {
|
||||||
@ -72,6 +72,6 @@ export const updateUserPwdApi = (oldPassword: string, newPassword: string) => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 用户头像上传
|
// 用户头像上传
|
||||||
export const uploadAvatarApi = (data) => {
|
export const uploadAvatar = (data) => {
|
||||||
return request.upload({ url: '/system/user/profile/update-avatar', data: data })
|
return request.upload({ url: '/system/user/profile/update-avatar', data: data })
|
||||||
}
|
}
|
||||||
|
@ -48,6 +48,7 @@ export default defineComponent({
|
|||||||
? dictData.value?.cssClass
|
? dictData.value?.cssClass
|
||||||
: ''
|
: ''
|
||||||
}
|
}
|
||||||
|
disableTransitions={true}
|
||||||
>
|
>
|
||||||
{dictData.value?.label}
|
{dictData.value?.label}
|
||||||
</ElTag>
|
</ElTag>
|
||||||
|
32
src/components/DocAlert/index.vue
Normal file
32
src/components/DocAlert/index.vue
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
<template>
|
||||||
|
<el-alert v-if="getEnable()" type="success" show-icon>
|
||||||
|
<template #title>
|
||||||
|
<div @click="goToUrl">{{ '【' + title + '】文档地址:' + url }}</div>
|
||||||
|
</template>
|
||||||
|
</el-alert>
|
||||||
|
</template>
|
||||||
|
<script setup lang="tsx" name="DocAlert">
|
||||||
|
import { propTypes } from '@/utils/propTypes'
|
||||||
|
|
||||||
|
const props = defineProps({
|
||||||
|
title: propTypes.string,
|
||||||
|
url: propTypes.string
|
||||||
|
})
|
||||||
|
|
||||||
|
/** 跳转 URL 链接 */
|
||||||
|
const goToUrl = () => {
|
||||||
|
window.open(props.url)
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 是否开启 */
|
||||||
|
const getEnable = () => {
|
||||||
|
return import.meta.env.VITE_APP_TENANT_ENABLE === 'true'
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
<style scoped>
|
||||||
|
.el-alert--success.is-light {
|
||||||
|
border: 1px solid green;
|
||||||
|
margin-bottom: 10px;
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
</style>
|
@ -64,7 +64,7 @@
|
|||||||
* */
|
* */
|
||||||
import { resetSize } from './../utils/util'
|
import { resetSize } from './../utils/util'
|
||||||
import { aesEncrypt } from './../utils/ase'
|
import { aesEncrypt } from './../utils/ase'
|
||||||
import { getCodeApi, reqCheckApi } from '@/api/login'
|
import { getCode, reqCheck } from '@/api/login'
|
||||||
import { onMounted, reactive, ref, nextTick, toRefs, getCurrentInstance } from 'vue'
|
import { onMounted, reactive, ref, nextTick, toRefs, getCurrentInstance } from 'vue'
|
||||||
|
|
||||||
const props = defineProps({
|
const props = defineProps({
|
||||||
@ -170,7 +170,7 @@ const canvasClick = (e) => {
|
|||||||
: JSON.stringify(checkPosArr),
|
: JSON.stringify(checkPosArr),
|
||||||
token: backToken.value
|
token: backToken.value
|
||||||
}
|
}
|
||||||
reqCheckApi(data).then((res) => {
|
reqCheck(data).then((res) => {
|
||||||
if (res.repCode == '0000') {
|
if (res.repCode == '0000') {
|
||||||
barAreaColor.value = '#4cae4c'
|
barAreaColor.value = '#4cae4c'
|
||||||
barAreaBorderColor.value = '#5cb85c'
|
barAreaBorderColor.value = '#5cb85c'
|
||||||
@ -227,7 +227,7 @@ const getPictrue = async () => {
|
|||||||
let data = {
|
let data = {
|
||||||
captchaType: captchaType.value
|
captchaType: captchaType.value
|
||||||
}
|
}
|
||||||
const res = await getCodeApi(data)
|
const res = await getCode(data)
|
||||||
if (res.repCode == '0000') {
|
if (res.repCode == '0000') {
|
||||||
pointBackImgBase.value = res.repData.originalImageBase64
|
pointBackImgBase.value = res.repData.originalImageBase64
|
||||||
backToken.value = res.repData.token
|
backToken.value = res.repData.token
|
||||||
|
@ -78,7 +78,7 @@
|
|||||||
* */
|
* */
|
||||||
import { aesEncrypt } from './../utils/ase'
|
import { aesEncrypt } from './../utils/ase'
|
||||||
import { resetSize } from './../utils/util'
|
import { resetSize } from './../utils/util'
|
||||||
import { getCodeApi, reqCheckApi } from '@/api/login'
|
import { getCode, reqCheck } from '@/api/login'
|
||||||
|
|
||||||
const props = defineProps({
|
const props = defineProps({
|
||||||
captchaType: {
|
captchaType: {
|
||||||
@ -286,7 +286,7 @@ const end = () => {
|
|||||||
: JSON.stringify({ x: moveLeftDistance, y: 5.0 }),
|
: JSON.stringify({ x: moveLeftDistance, y: 5.0 }),
|
||||||
token: backToken.value
|
token: backToken.value
|
||||||
}
|
}
|
||||||
reqCheckApi(data).then((res) => {
|
reqCheck(data).then((res) => {
|
||||||
if (res.repCode == '0000') {
|
if (res.repCode == '0000') {
|
||||||
moveBlockBackgroundColor.value = '#5cb85c'
|
moveBlockBackgroundColor.value = '#5cb85c'
|
||||||
leftBarBorderColor.value = '#5cb85c'
|
leftBarBorderColor.value = '#5cb85c'
|
||||||
@ -301,7 +301,7 @@ const end = () => {
|
|||||||
}, 1500)
|
}, 1500)
|
||||||
}
|
}
|
||||||
passFlag.value = true
|
passFlag.value = true
|
||||||
tipWords.value = `${((endMovetime.value - startMoveTime.value) / 1000).toFixed(2)}s
|
tipWords.value = `${((endMovetime.value - startMoveTime.value) / 1000).toFixed(2)}s
|
||||||
${t('captcha.success')}`
|
${t('captcha.success')}`
|
||||||
var captchaVerification = secretKey.value
|
var captchaVerification = secretKey.value
|
||||||
? aesEncrypt(
|
? aesEncrypt(
|
||||||
@ -363,7 +363,7 @@ const getPictrue = async () => {
|
|||||||
let data = {
|
let data = {
|
||||||
captchaType: captchaType.value
|
captchaType: captchaType.value
|
||||||
}
|
}
|
||||||
const res = await getCodeApi(data)
|
const res = await getCode(data)
|
||||||
if (res.repCode == '0000') {
|
if (res.repCode == '0000') {
|
||||||
backImgBase.value = res.repData.originalImageBase64
|
backImgBase.value = res.repData.originalImageBase64
|
||||||
blockBackImgBase.value = res.repData.jigsawImageBase64
|
blockBackImgBase.value = res.repData.jigsawImageBase64
|
||||||
|
@ -9,14 +9,14 @@ const list = ref<any[]>([]) // 消息列表
|
|||||||
|
|
||||||
// 获得消息列表
|
// 获得消息列表
|
||||||
const getList = async () => {
|
const getList = async () => {
|
||||||
list.value = await NotifyMessageApi.getUnreadNotifyMessageListApi()
|
list.value = await NotifyMessageApi.getUnreadNotifyMessageList()
|
||||||
// 强制设置 unreadCount 为 0,避免小红点因为轮询太慢,不消除
|
// 强制设置 unreadCount 为 0,避免小红点因为轮询太慢,不消除
|
||||||
unreadCount.value = 0
|
unreadCount.value = 0
|
||||||
}
|
}
|
||||||
|
|
||||||
// 获得未读消息数
|
// 获得未读消息数
|
||||||
const getUnreadCount = async () => {
|
const getUnreadCount = async () => {
|
||||||
NotifyMessageApi.getUnreadNotifyMessageCountApi().then((data) => {
|
NotifyMessageApi.getUnreadNotifyMessageCount().then((data) => {
|
||||||
unreadCount.value = data
|
unreadCount.value = data
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
@ -303,8 +303,7 @@ export default {
|
|||||||
typeCreate: '字典类型新增',
|
typeCreate: '字典类型新增',
|
||||||
typeUpdate: '字典类型编辑',
|
typeUpdate: '字典类型编辑',
|
||||||
dataCreate: '字典数据新增',
|
dataCreate: '字典数据新增',
|
||||||
dataUpdate: '字典数据编辑',
|
dataUpdate: '字典数据编辑'
|
||||||
fileUpload: '上传文件'
|
|
||||||
},
|
},
|
||||||
dialog: {
|
dialog: {
|
||||||
dialog: '弹窗',
|
dialog: '弹窗',
|
||||||
|
@ -52,6 +52,8 @@ import 'bpmn-js/dist/assets/bpmn-font/css/bpmn-embedded.css'
|
|||||||
import hljs from 'highlight.js' //导入代码高亮文件
|
import hljs from 'highlight.js' //导入代码高亮文件
|
||||||
import 'highlight.js/styles/github.css' //导入代码高亮样式 新版
|
import 'highlight.js/styles/github.css' //导入代码高亮样式 新版
|
||||||
|
|
||||||
|
import '@/plugins/tongji' // 百度统计
|
||||||
|
|
||||||
import Logger from '@/utils/Logger'
|
import Logger from '@/utils/Logger'
|
||||||
|
|
||||||
// 本地开发模式 全局引入 element-plus 样式,加快第一次进入速度
|
// 本地开发模式 全局引入 element-plus 样式,加快第一次进入速度
|
||||||
|
23
src/plugins/tongji/index.ts
Normal file
23
src/plugins/tongji/index.ts
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
import router from '@/router'
|
||||||
|
|
||||||
|
// 用于 router push
|
||||||
|
window._hmt = window._hmt || []
|
||||||
|
// HM_ID
|
||||||
|
const HM_ID = import.meta.env.VITE_APP_BAIDU_CODE
|
||||||
|
;(function () {
|
||||||
|
// 有值的时候,才开启
|
||||||
|
if (!HM_ID) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
const hm = document.createElement('script')
|
||||||
|
hm.src = 'https://hm.baidu.com/hm.js?' + HM_ID
|
||||||
|
const s = document.getElementsByTagName('script')[0]
|
||||||
|
s.parentNode.insertBefore(hm, s)
|
||||||
|
})()
|
||||||
|
|
||||||
|
router.afterEach(function (to) {
|
||||||
|
if (!HM_ID) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
_hmt.push(['_trackPageview', to.fullPath])
|
||||||
|
})
|
@ -115,7 +115,7 @@ const remainingRouter: AppRouteRecordRaw[] = [
|
|||||||
children: [
|
children: [
|
||||||
{
|
{
|
||||||
path: 'type/data/:dictType',
|
path: 'type/data/:dictType',
|
||||||
component: () => import('@/views/system/dict/data.vue'),
|
component: () => import('@/views/system/dict/data/index.vue'),
|
||||||
name: 'data',
|
name: 'data',
|
||||||
meta: {
|
meta: {
|
||||||
title: '字典数据',
|
title: '字典数据',
|
||||||
@ -123,7 +123,7 @@ const remainingRouter: AppRouteRecordRaw[] = [
|
|||||||
hidden: true,
|
hidden: true,
|
||||||
canTo: true,
|
canTo: true,
|
||||||
icon: '',
|
icon: '',
|
||||||
activeMenu: 'system/dict/data'
|
activeMenu: '/system/dict'
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
@ -317,15 +317,27 @@ const remainingRouter: AppRouteRecordRaw[] = [
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
path: '/bpm/oa/leave/detail',
|
path: '/bpm/task/todo',
|
||||||
component: () => import('@/views/bpm/oa/leave/detail.vue'),
|
component: () => import('@/views/bpm/task/todo/index.vue'),
|
||||||
name: 'OALeaveDetail',
|
name: 'TaskTodo',
|
||||||
meta: {
|
meta: {
|
||||||
noCache: true,
|
noCache: true,
|
||||||
hidden: true,
|
hidden: true,
|
||||||
canTo: true,
|
canTo: true,
|
||||||
title: '查看 OA 请假',
|
title: '代办任务',
|
||||||
activeMenu: 'bpm/oa/leave/detail'
|
activeMenu: 'bpm/task/todo/index'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
path: '/bpm/processInstance',
|
||||||
|
component: () => import('@/views/bpm/processInstance/index.vue'),
|
||||||
|
name: 'processInstance',
|
||||||
|
meta: {
|
||||||
|
noCache: true,
|
||||||
|
hidden: true,
|
||||||
|
canTo: true,
|
||||||
|
title: '流程办理',
|
||||||
|
activeMenu: 'bpm/processInstance/index'
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
@ -3,7 +3,7 @@ import { store } from '../index'
|
|||||||
import { cloneDeep } from 'lodash-es'
|
import { cloneDeep } from 'lodash-es'
|
||||||
import remainingRouter from '@/router/modules/remaining'
|
import remainingRouter from '@/router/modules/remaining'
|
||||||
import { generateRoute, flatMultiLevelRoutes } from '@/utils/routerHelper'
|
import { generateRoute, flatMultiLevelRoutes } from '@/utils/routerHelper'
|
||||||
import { getAsyncRoutesApi } from '@/api/login'
|
import { getAsyncRoutes } from '@/api/login'
|
||||||
import { CACHE_KEY, useCache } from '@/hooks/web/useCache'
|
import { CACHE_KEY, useCache } from '@/hooks/web/useCache'
|
||||||
|
|
||||||
const { wsCache } = useCache()
|
const { wsCache } = useCache()
|
||||||
@ -38,7 +38,7 @@ export const usePermissionStore = defineStore('permission', {
|
|||||||
if (wsCache.get(CACHE_KEY.ROLE_ROUTERS)) {
|
if (wsCache.get(CACHE_KEY.ROLE_ROUTERS)) {
|
||||||
res = wsCache.get(CACHE_KEY.ROLE_ROUTERS) as AppCustomRouteRecordRaw[]
|
res = wsCache.get(CACHE_KEY.ROLE_ROUTERS) as AppCustomRouteRecordRaw[]
|
||||||
} else {
|
} else {
|
||||||
res = await getAsyncRoutesApi()
|
res = await getAsyncRoutes()
|
||||||
wsCache.set(CACHE_KEY.ROLE_ROUTERS, res)
|
wsCache.set(CACHE_KEY.ROLE_ROUTERS, res)
|
||||||
}
|
}
|
||||||
const routerMap: AppRouteRecordRaw[] = generateRoute(res as AppCustomRouteRecordRaw[])
|
const routerMap: AppRouteRecordRaw[] = generateRoute(res as AppCustomRouteRecordRaw[])
|
||||||
|
@ -2,7 +2,7 @@ import { store } from '../index'
|
|||||||
import { defineStore } from 'pinia'
|
import { defineStore } from 'pinia'
|
||||||
import { getAccessToken, removeToken } from '@/utils/auth'
|
import { getAccessToken, removeToken } from '@/utils/auth'
|
||||||
import { CACHE_KEY, useCache } from '@/hooks/web/useCache'
|
import { CACHE_KEY, useCache } from '@/hooks/web/useCache'
|
||||||
import { getInfoApi, loginOutApi } from '@/api/login'
|
import { getInfo, loginOut } from '@/api/login'
|
||||||
|
|
||||||
const { wsCache } = useCache()
|
const { wsCache } = useCache()
|
||||||
|
|
||||||
@ -51,7 +51,7 @@ export const useUserStore = defineStore('admin-user', {
|
|||||||
}
|
}
|
||||||
let userInfo = wsCache.get(CACHE_KEY.USER)
|
let userInfo = wsCache.get(CACHE_KEY.USER)
|
||||||
if (!userInfo) {
|
if (!userInfo) {
|
||||||
userInfo = await getInfoApi()
|
userInfo = await getInfo()
|
||||||
}
|
}
|
||||||
this.permissions = userInfo.permissions
|
this.permissions = userInfo.permissions
|
||||||
this.roles = userInfo.roles
|
this.roles = userInfo.roles
|
||||||
@ -60,7 +60,7 @@ export const useUserStore = defineStore('admin-user', {
|
|||||||
wsCache.set(CACHE_KEY.USER, userInfo)
|
wsCache.set(CACHE_KEY.USER, userInfo)
|
||||||
},
|
},
|
||||||
async loginOut() {
|
async loginOut() {
|
||||||
await loginOutApi()
|
await loginOut()
|
||||||
removeToken()
|
removeToken()
|
||||||
wsCache.clear()
|
wsCache.clear()
|
||||||
this.resetState()
|
this.resetState()
|
||||||
|
@ -112,7 +112,6 @@ export enum DICT_TYPE {
|
|||||||
|
|
||||||
// ========== INFRA 模块 ==========
|
// ========== INFRA 模块 ==========
|
||||||
INFRA_BOOLEAN_STRING = 'infra_boolean_string',
|
INFRA_BOOLEAN_STRING = 'infra_boolean_string',
|
||||||
INFRA_REDIS_TIMEOUT_TYPE = 'infra_redis_timeout_type',
|
|
||||||
INFRA_JOB_STATUS = 'infra_job_status',
|
INFRA_JOB_STATUS = 'infra_job_status',
|
||||||
INFRA_JOB_LOG_STATUS = 'infra_job_log_status',
|
INFRA_JOB_LOG_STATUS = 'infra_job_log_status',
|
||||||
INFRA_API_ERROR_LOG_PROCESS_STATUS = 'infra_api_error_log_process_status',
|
INFRA_API_ERROR_LOG_PROCESS_STATUS = 'infra_api_error_log_process_status',
|
||||||
|
@ -195,7 +195,7 @@ const getCode = async () => {
|
|||||||
//获取租户ID
|
//获取租户ID
|
||||||
const getTenantId = async () => {
|
const getTenantId = async () => {
|
||||||
if (loginData.tenantEnable === 'true') {
|
if (loginData.tenantEnable === 'true') {
|
||||||
const res = await LoginApi.getTenantIdByNameApi(loginData.loginForm.tenantName)
|
const res = await LoginApi.getTenantIdByName(loginData.loginForm.tenantName)
|
||||||
authUtil.setTenantId(res)
|
authUtil.setTenantId(res)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -222,7 +222,7 @@ const handleLogin = async (params) => {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
loginData.loginForm.captchaVerification = params.captchaVerification
|
loginData.loginForm.captchaVerification = params.captchaVerification
|
||||||
const res = await LoginApi.loginApi(loginData.loginForm)
|
const res = await LoginApi.login(loginData.loginForm)
|
||||||
if (!res) {
|
if (!res) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@ -264,7 +264,7 @@ const doSocialLogin = async (type: number) => {
|
|||||||
loginLoading.value = true
|
loginLoading.value = true
|
||||||
if (loginData.tenantEnable === 'true') {
|
if (loginData.tenantEnable === 'true') {
|
||||||
await message.prompt('请输入租户名称', t('common.reminder')).then(async ({ value }) => {
|
await message.prompt('请输入租户名称', t('common.reminder')).then(async ({ value }) => {
|
||||||
const res = await LoginApi.getTenantIdByNameApi(value)
|
const res = await LoginApi.getTenantIdByName(value)
|
||||||
authUtil.setTenantId(res)
|
authUtil.setTenantId(res)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
@ -272,7 +272,7 @@ const doSocialLogin = async (type: number) => {
|
|||||||
const redirectUri =
|
const redirectUri =
|
||||||
location.origin + '/social-login?type=' + type + '&redirect=' + (redirect.value || '/')
|
location.origin + '/social-login?type=' + type + '&redirect=' + (redirect.value || '/')
|
||||||
// 进行跳转
|
// 进行跳转
|
||||||
const res = await LoginApi.socialAuthRedirectApi(type, encodeURIComponent(redirectUri))
|
const res = await LoginApi.socialAuthRedirect(type, encodeURIComponent(redirectUri))
|
||||||
window.location.href = res
|
window.location.href = res
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -98,7 +98,7 @@ import { useIcon } from '@/hooks/web/useIcon'
|
|||||||
|
|
||||||
import { setTenantId, setToken } from '@/utils/auth'
|
import { setTenantId, setToken } from '@/utils/auth'
|
||||||
import { usePermissionStore } from '@/store/modules/permission'
|
import { usePermissionStore } from '@/store/modules/permission'
|
||||||
import { getTenantIdByNameApi, sendSmsCodeApi, smsLoginApi } from '@/api/login'
|
import { getTenantIdByName, sendSmsCode, smsLogin } from '@/api/login'
|
||||||
import LoginFormTitle from './LoginFormTitle.vue'
|
import LoginFormTitle from './LoginFormTitle.vue'
|
||||||
import { useLoginState, LoginStateEnum, useFormValid } from './useLogin'
|
import { useLoginState, LoginStateEnum, useFormValid } from './useLogin'
|
||||||
|
|
||||||
@ -149,7 +149,7 @@ const redirect = ref<string>('')
|
|||||||
const getSmsCode = async () => {
|
const getSmsCode = async () => {
|
||||||
await getTenantId()
|
await getTenantId()
|
||||||
smsVO.smsCode.mobile = loginData.loginForm.mobileNumber
|
smsVO.smsCode.mobile = loginData.loginForm.mobileNumber
|
||||||
await sendSmsCodeApi(smsVO.smsCode).then(async () => {
|
await sendSmsCode(smsVO.smsCode).then(async () => {
|
||||||
message.success(t('login.SmsSendMsg'))
|
message.success(t('login.SmsSendMsg'))
|
||||||
// 设置倒计时
|
// 设置倒计时
|
||||||
mobileCodeTimer.value = 60
|
mobileCodeTimer.value = 60
|
||||||
@ -173,7 +173,7 @@ watch(
|
|||||||
// 获取租户 ID
|
// 获取租户 ID
|
||||||
const getTenantId = async () => {
|
const getTenantId = async () => {
|
||||||
if (loginData.tenantEnable === 'true') {
|
if (loginData.tenantEnable === 'true') {
|
||||||
const res = await getTenantIdByNameApi(loginData.loginForm.tenantName)
|
const res = await getTenantIdByName(loginData.loginForm.tenantName)
|
||||||
setTenantId(res)
|
setTenantId(res)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -185,7 +185,7 @@ const signIn = async () => {
|
|||||||
loginLoading.value = true
|
loginLoading.value = true
|
||||||
smsVO.loginSms.mobile = loginData.loginForm.mobileNumber
|
smsVO.loginSms.mobile = loginData.loginForm.mobileNumber
|
||||||
smsVO.loginSms.code = loginData.loginForm.code
|
smsVO.loginSms.code = loginData.loginForm.code
|
||||||
await smsLoginApi(smsVO.loginSms)
|
await smsLogin(smsVO.loginSms)
|
||||||
.then(async (res) => {
|
.then(async (res) => {
|
||||||
setToken(res?.token)
|
setToken(res?.token)
|
||||||
if (!redirect.value) {
|
if (!redirect.value) {
|
||||||
|
@ -17,8 +17,8 @@ import { ElMessage } from 'element-plus'
|
|||||||
import { FormSchema } from '@/types/form'
|
import { FormSchema } from '@/types/form'
|
||||||
import type { FormExpose } from '@/components/Form'
|
import type { FormExpose } from '@/components/Form'
|
||||||
import {
|
import {
|
||||||
getUserProfileApi,
|
getUserProfile,
|
||||||
updateUserProfileApi,
|
updateUserProfile,
|
||||||
UserProfileUpdateReqVO
|
UserProfileUpdateReqVO
|
||||||
} from '@/api/system/user/profile'
|
} from '@/api/system/user/profile'
|
||||||
|
|
||||||
@ -73,14 +73,14 @@ const submit = () => {
|
|||||||
elForm.validate(async (valid) => {
|
elForm.validate(async (valid) => {
|
||||||
if (valid) {
|
if (valid) {
|
||||||
const data = unref(formRef)?.formModel as UserProfileUpdateReqVO
|
const data = unref(formRef)?.formModel as UserProfileUpdateReqVO
|
||||||
await updateUserProfileApi(data)
|
await updateUserProfile(data)
|
||||||
ElMessage.success(t('common.updateSuccess'))
|
ElMessage.success(t('common.updateSuccess'))
|
||||||
await init()
|
await init()
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
const init = async () => {
|
const init = async () => {
|
||||||
const res = await getUserProfileApi()
|
const res = await getUserProfile()
|
||||||
unref(formRef)?.setValues(res)
|
unref(formRef)?.setValues(res)
|
||||||
}
|
}
|
||||||
onMounted(async () => {
|
onMounted(async () => {
|
||||||
|
@ -43,12 +43,12 @@
|
|||||||
import { formatDate } from '@/utils/formatTime'
|
import { formatDate } from '@/utils/formatTime'
|
||||||
import UserAvatar from './UserAvatar.vue'
|
import UserAvatar from './UserAvatar.vue'
|
||||||
|
|
||||||
import { getUserProfileApi, ProfileVO } from '@/api/system/user/profile'
|
import { getUserProfile, ProfileVO } from '@/api/system/user/profile'
|
||||||
|
|
||||||
const { t } = useI18n()
|
const { t } = useI18n()
|
||||||
const userInfo = ref<ProfileVO>()
|
const userInfo = ref<ProfileVO>()
|
||||||
const getUserInfo = async () => {
|
const getUserInfo = async () => {
|
||||||
const users = await getUserProfileApi()
|
const users = await getUserProfile()
|
||||||
userInfo.value = users
|
userInfo.value = users
|
||||||
}
|
}
|
||||||
onMounted(async () => {
|
onMounted(async () => {
|
||||||
|
@ -19,7 +19,7 @@
|
|||||||
import type { FormRules, FormInstance } from 'element-plus'
|
import type { FormRules, FormInstance } from 'element-plus'
|
||||||
|
|
||||||
import { InputPassword } from '@/components/InputPassword'
|
import { InputPassword } from '@/components/InputPassword'
|
||||||
import { updateUserPwdApi } from '@/api/system/user/profile'
|
import { updateUserPassword } from '@/api/system/user/profile'
|
||||||
|
|
||||||
const { t } = useI18n()
|
const { t } = useI18n()
|
||||||
const message = useMessage()
|
const message = useMessage()
|
||||||
@ -56,7 +56,7 @@ const submit = (formEl: FormInstance | undefined) => {
|
|||||||
if (!formEl) return
|
if (!formEl) return
|
||||||
formEl.validate(async (valid) => {
|
formEl.validate(async (valid) => {
|
||||||
if (valid) {
|
if (valid) {
|
||||||
await updateUserPwdApi(password.oldPassword, password.newPassword)
|
await updateUserPassword(password.oldPassword, password.newPassword)
|
||||||
message.success(t('common.updateSuccess'))
|
message.success(t('common.updateSuccess'))
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
@ -12,7 +12,7 @@
|
|||||||
</template>
|
</template>
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { propTypes } from '@/utils/propTypes'
|
import { propTypes } from '@/utils/propTypes'
|
||||||
import { uploadAvatarApi } from '@/api/system/user/profile'
|
import { uploadAvatar } from '@/api/system/user/profile'
|
||||||
const props = defineProps({
|
const props = defineProps({
|
||||||
img: propTypes.string.def('')
|
img: propTypes.string.def('')
|
||||||
})
|
})
|
||||||
@ -22,7 +22,7 @@ const avatar = computed(() => {
|
|||||||
|
|
||||||
const cropperRef = ref()
|
const cropperRef = ref()
|
||||||
const handelUpload = async ({ data }) => {
|
const handelUpload = async ({ data }) => {
|
||||||
await uploadAvatarApi({ avatarFile: data })
|
await uploadAvatar({ avatarFile: data })
|
||||||
cropperRef.value.close()
|
cropperRef.value.close()
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
@ -23,7 +23,7 @@
|
|||||||
</template>
|
</template>
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { SystemUserSocialTypeEnum } from '@/utils/constants'
|
import { SystemUserSocialTypeEnum } from '@/utils/constants'
|
||||||
import { getUserProfileApi, ProfileVO } from '@/api/system/user/profile'
|
import { getUserProfile, ProfileVO } from '@/api/system/user/profile'
|
||||||
import { socialAuthRedirect, socialUnbind } from '@/api/system/user/socialUser'
|
import { socialAuthRedirect, socialUnbind } from '@/api/system/user/socialUser'
|
||||||
|
|
||||||
const message = useMessage()
|
const message = useMessage()
|
||||||
@ -31,7 +31,7 @@ const socialUsers = ref<any[]>([])
|
|||||||
const userInfo = ref<ProfileVO>()
|
const userInfo = ref<ProfileVO>()
|
||||||
|
|
||||||
const initSocial = async () => {
|
const initSocial = async () => {
|
||||||
const res = await getUserProfileApi()
|
const res = await getUserProfile()
|
||||||
userInfo.value = res
|
userInfo.value = res
|
||||||
for (const i in SystemUserSocialTypeEnum) {
|
for (const i in SystemUserSocialTypeEnum) {
|
||||||
const socialUser = { ...SystemUserSocialTypeEnum[i] }
|
const socialUser = { ...SystemUserSocialTypeEnum[i] }
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
<template>
|
<template>
|
||||||
<content-wrap>
|
<ContentWrap>
|
||||||
<!-- 搜索工作栏 -->
|
<!-- 搜索工作栏 -->
|
||||||
<el-form
|
<el-form
|
||||||
class="-mb-15px"
|
class="-mb-15px"
|
||||||
@ -25,10 +25,10 @@
|
|||||||
</el-button>
|
</el-button>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-form>
|
</el-form>
|
||||||
</content-wrap>
|
</ContentWrap>
|
||||||
|
|
||||||
<!-- 列表 -->
|
<!-- 列表 -->
|
||||||
<content-wrap>
|
<ContentWrap>
|
||||||
<el-table v-loading="loading" :data="list">
|
<el-table v-loading="loading" :data="list">
|
||||||
<el-table-column label="编号" align="center" prop="id" />
|
<el-table-column label="编号" align="center" prop="id" />
|
||||||
<el-table-column label="表单名" align="center" prop="name" />
|
<el-table-column label="表单名" align="center" prop="name" />
|
||||||
@ -75,7 +75,7 @@
|
|||||||
v-model:limit="queryParams.pageSize"
|
v-model:limit="queryParams.pageSize"
|
||||||
@pagination="getList"
|
@pagination="getList"
|
||||||
/>
|
/>
|
||||||
</content-wrap>
|
</ContentWrap>
|
||||||
|
|
||||||
<!-- 表单详情的弹窗 -->
|
<!-- 表单详情的弹窗 -->
|
||||||
<Dialog title="表单详情" v-model="detailVisible" width="800">
|
<Dialog title="表单详情" v-model="detailVisible" width="800">
|
||||||
|
@ -44,7 +44,7 @@ const submitForm = async () => {
|
|||||||
data.startTime = Date.parse(new Date(data.startTime).toString()).toString()
|
data.startTime = Date.parse(new Date(data.startTime).toString()).toString()
|
||||||
data.endTime = Date.parse(new Date(data.endTime).toString()).toString()
|
data.endTime = Date.parse(new Date(data.endTime).toString()).toString()
|
||||||
// 添加的提交
|
// 添加的提交
|
||||||
await LeaveApi.createLeaveApi(data)
|
await LeaveApi.createLeave(data)
|
||||||
message.success(t('common.createSuccess'))
|
message.success(t('common.createSuccess'))
|
||||||
// 关闭窗口
|
// 关闭窗口
|
||||||
push('/bpm/oa/leave')
|
push('/bpm/oa/leave')
|
||||||
|
@ -35,7 +35,7 @@ onMounted(() => {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
// 获得请假信息
|
// 获得请假信息
|
||||||
LeaveApi.getLeaveApi(id.value).then((data) => {
|
LeaveApi.getLeave(id.value).then((data) => {
|
||||||
formData.value = data
|
formData.value = data
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
@ -37,7 +37,7 @@ const { push } = useRouter() // 路由
|
|||||||
|
|
||||||
const [registerTable, { reload }] = useXTable({
|
const [registerTable, { reload }] = useXTable({
|
||||||
allSchemas: allSchemas,
|
allSchemas: allSchemas,
|
||||||
getListApi: LeaveApi.getLeavePageApi
|
getListApi: LeaveApi.getLeavePage
|
||||||
})
|
})
|
||||||
|
|
||||||
// 发起请假
|
// 发起请假
|
||||||
@ -55,7 +55,7 @@ const cancelLeave = (row) => {
|
|||||||
inputPattern: /^[\s\S]*.*\S[\s\S]*$/, // 判断非空,且非空格
|
inputPattern: /^[\s\S]*.*\S[\s\S]*$/, // 判断非空,且非空格
|
||||||
inputErrorMessage: '取消原因不能为空'
|
inputErrorMessage: '取消原因不能为空'
|
||||||
}).then(async ({ value }) => {
|
}).then(async ({ value }) => {
|
||||||
await ProcessInstanceApi.cancelProcessInstanceApi(row.id, value)
|
await ProcessInstanceApi.cancelProcessInstance(row.id, value)
|
||||||
message.success('取消成功')
|
message.success('取消成功')
|
||||||
reload()
|
reload()
|
||||||
})
|
})
|
||||||
|
@ -111,7 +111,7 @@ const submitForm = async (formData) => {
|
|||||||
// 提交请求
|
// 提交请求
|
||||||
fApi.value.btn.loading(true)
|
fApi.value.btn.loading(true)
|
||||||
try {
|
try {
|
||||||
await ProcessInstanceApi.createProcessInstanceApi({
|
await ProcessInstanceApi.createProcessInstance({
|
||||||
processDefinitionId: selectProcessInstance.value.id,
|
processDefinitionId: selectProcessInstance.value.id,
|
||||||
variables: formData
|
variables: formData
|
||||||
})
|
})
|
||||||
|
@ -189,7 +189,7 @@ const getDetail = () => {
|
|||||||
const getProcessInstance = async () => {
|
const getProcessInstance = async () => {
|
||||||
try {
|
try {
|
||||||
processInstanceLoading.value = true
|
processInstanceLoading.value = true
|
||||||
const data = await ProcessInstanceApi.getProcessInstanceApi(id)
|
const data = await ProcessInstanceApi.getProcessInstance(id)
|
||||||
if (!data) {
|
if (!data) {
|
||||||
message.error('查询不到流程信息!')
|
message.error('查询不到流程信息!')
|
||||||
return
|
return
|
||||||
|
@ -1,64 +1,211 @@
|
|||||||
<template>
|
<template>
|
||||||
<ContentWrap>
|
<ContentWrap>
|
||||||
<!-- 列表 -->
|
<!-- 搜索工作栏 -->
|
||||||
<XTable @register="registerTable">
|
<el-form
|
||||||
<template #toolbar_buttons>
|
class="-mb-15px"
|
||||||
<!-- 操作:新增 -->
|
:model="queryParams"
|
||||||
<XButton
|
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 label="所属流程" prop="processDefinitionId">
|
||||||
|
<el-input
|
||||||
|
v-model="queryParams.processDefinitionId"
|
||||||
|
placeholder="请输入流程定义的编号"
|
||||||
|
clearable
|
||||||
|
@keyup.enter="handleQuery"
|
||||||
|
class="!w-240px"
|
||||||
|
/>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="流程分类" prop="category">
|
||||||
|
<el-select
|
||||||
|
v-model="queryParams.category"
|
||||||
|
placeholder="请选择流程分类"
|
||||||
|
clearable
|
||||||
|
class="!w-240px"
|
||||||
|
>
|
||||||
|
<el-option
|
||||||
|
v-for="dict in getIntDictOptions(DICT_TYPE.BPM_MODEL_CATEGORY)"
|
||||||
|
:key="dict.value"
|
||||||
|
:label="dict.label"
|
||||||
|
:value="dict.value"
|
||||||
|
/>
|
||||||
|
</el-select>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="状态" prop="status">
|
||||||
|
<el-select v-model="queryParams.status" placeholder="请选择状态" clearable class="!w-240px">
|
||||||
|
<el-option
|
||||||
|
v-for="dict in getIntDictOptions(DICT_TYPE.BPM_PROCESS_INSTANCE_STATUS)"
|
||||||
|
:key="dict.value"
|
||||||
|
:label="dict.label"
|
||||||
|
:value="dict.value"
|
||||||
|
/>
|
||||||
|
</el-select>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="结果" prop="result">
|
||||||
|
<el-select v-model="queryParams.result" placeholder="请选择结果" clearable class="!w-240px">
|
||||||
|
<el-option
|
||||||
|
v-for="dict in getIntDictOptions(DICT_TYPE.BPM_PROCESS_INSTANCE_RESULT)"
|
||||||
|
:key="dict.value"
|
||||||
|
:label="dict.label"
|
||||||
|
:value="dict.value"
|
||||||
|
/>
|
||||||
|
</el-select>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="提交时间" prop="createTime">
|
||||||
|
<el-date-picker
|
||||||
|
v-model="queryParams.createTime"
|
||||||
|
value-format="YYYY-MM-DD HH:mm:ss"
|
||||||
|
type="daterange"
|
||||||
|
start-placeholder="开始日期"
|
||||||
|
end-placeholder="结束日期"
|
||||||
|
:default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]"
|
||||||
|
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"
|
type="primary"
|
||||||
preIcon="ep:zoom-in"
|
plain
|
||||||
title="发起流程"
|
|
||||||
v-hasPermi="['bpm:process-instance:query']"
|
v-hasPermi="['bpm:process-instance:query']"
|
||||||
@click="handleCreate"
|
@click="handleCreate"
|
||||||
/>
|
>
|
||||||
</template>
|
发起流程
|
||||||
<!-- 流程分类 -->
|
|
||||||
<template #category_default="{ row }">
|
|
||||||
<DictTag :type="DICT_TYPE.BPM_MODEL_CATEGORY" :value="Number(row?.category)" />
|
|
||||||
</template>
|
|
||||||
<!-- 当前审批任务 -->
|
|
||||||
<template #tasks_default="{ row }">
|
|
||||||
<el-button v-for="task in row.tasks" :key="task.id" link>
|
|
||||||
<span>{{ task.name }}</span>
|
|
||||||
</el-button>
|
</el-button>
|
||||||
</template>
|
</el-form-item>
|
||||||
<!-- 操作 -->
|
</el-form>
|
||||||
<template #actionbtns_default="{ row }">
|
</ContentWrap>
|
||||||
<XTextButton
|
|
||||||
preIcon="ep:view"
|
<!-- 列表 -->
|
||||||
:title="t('action.detail')"
|
<ContentWrap>
|
||||||
v-hasPermi="['bpm:process-instance:cancel']"
|
<el-table v-loading="loading" :data="list">
|
||||||
@click="handleDetail(row)"
|
<el-table-column label="流程编号" align="center" prop="id" width="300px" />
|
||||||
/>
|
<el-table-column label="流程名称" align="center" prop="name" />
|
||||||
<XTextButton
|
<el-table-column label="流程分类" align="center" prop="category">
|
||||||
preIcon="ep:delete"
|
<template #default="scope">
|
||||||
title="取消"
|
<dict-tag :type="DICT_TYPE.BPM_MODEL_CATEGORY" :value="scope.row.category" />
|
||||||
v-if="row.result === 1"
|
</template>
|
||||||
v-hasPermi="['bpm:process-instance:query']"
|
</el-table-column>
|
||||||
@click="handleCancel(row)"
|
<el-table-column label="当前审批任务" align="center" prop="tasks">
|
||||||
/>
|
<template #default="scope">
|
||||||
</template>
|
<el-button type="primary" v-for="task in scope.row.tasks" :key="task.id" link>
|
||||||
</XTable>
|
<span>{{ task.name }}</span>
|
||||||
|
</el-button>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column label="状态" prop="status">
|
||||||
|
<template #default="scope">
|
||||||
|
<dict-tag :type="DICT_TYPE.BPM_PROCESS_INSTANCE_STATUS" :value="scope.row.status" />
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column label="结果" prop="result">
|
||||||
|
<template #default="scope">
|
||||||
|
<dict-tag :type="DICT_TYPE.BPM_PROCESS_INSTANCE_RESULT" :value="scope.row.result" />
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column
|
||||||
|
label="提交时间"
|
||||||
|
align="center"
|
||||||
|
prop="createTime"
|
||||||
|
width="180"
|
||||||
|
:formatter="dateFormatter"
|
||||||
|
/>
|
||||||
|
<el-table-column
|
||||||
|
label="结束时间"
|
||||||
|
align="center"
|
||||||
|
prop="endTime"
|
||||||
|
width="180"
|
||||||
|
:formatter="dateFormatter"
|
||||||
|
/>
|
||||||
|
<el-table-column label="操作" align="center">
|
||||||
|
<template #default="scope">
|
||||||
|
<el-button
|
||||||
|
link
|
||||||
|
type="primary"
|
||||||
|
v-hasPermi="['bpm:process-instance:cancel']"
|
||||||
|
@click="handleDetail(scope.row)"
|
||||||
|
>
|
||||||
|
详情
|
||||||
|
</el-button>
|
||||||
|
<el-button
|
||||||
|
link
|
||||||
|
type="primary"
|
||||||
|
v-if="scope.row.result === 1"
|
||||||
|
v-hasPermi="['bpm:process-instance:query']"
|
||||||
|
@click="handleCancel(scope.row)"
|
||||||
|
>
|
||||||
|
取消
|
||||||
|
</el-button>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
</el-table>
|
||||||
|
<!-- 分页 -->
|
||||||
|
<Pagination
|
||||||
|
:total="total"
|
||||||
|
v-model:page="queryParams.pageNo"
|
||||||
|
v-model:limit="queryParams.pageSize"
|
||||||
|
@pagination="getList"
|
||||||
|
/>
|
||||||
</ContentWrap>
|
</ContentWrap>
|
||||||
</template>
|
</template>
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
// 全局相关的 import
|
import { DICT_TYPE, getIntDictOptions } from '@/utils/dict'
|
||||||
|
import { dateFormatter } from '@/utils/formatTime'
|
||||||
import { ElMessageBox } from 'element-plus'
|
import { ElMessageBox } from 'element-plus'
|
||||||
import { DICT_TYPE } from '@/utils/dict'
|
|
||||||
|
|
||||||
// 业务相关的 import
|
|
||||||
import * as ProcessInstanceApi from '@/api/bpm/processInstance'
|
import * as ProcessInstanceApi from '@/api/bpm/processInstance'
|
||||||
import { allSchemas } from './process.data'
|
|
||||||
|
|
||||||
const router = useRouter() // 路由
|
const router = useRouter() // 路由
|
||||||
const message = useMessage() // 消息弹窗
|
const message = useMessage() // 消息弹窗
|
||||||
const { t } = useI18n() // 国际化
|
const { t } = useI18n() // 国际化
|
||||||
|
|
||||||
// ========== 列表相关 ==========
|
const loading = ref(true) // 列表的加载中
|
||||||
const [registerTable, { reload }] = useXTable({
|
const total = ref(0) // 列表的总页数
|
||||||
allSchemas: allSchemas,
|
const list = ref([]) // 列表的数据
|
||||||
getListApi: ProcessInstanceApi.getMyProcessInstancePageApi
|
const queryParams = reactive({
|
||||||
|
pageNo: 1,
|
||||||
|
pageSize: 10,
|
||||||
|
name: '',
|
||||||
|
processDefinitionId: undefined,
|
||||||
|
category: undefined,
|
||||||
|
status: undefined,
|
||||||
|
result: undefined,
|
||||||
|
createTime: []
|
||||||
})
|
})
|
||||||
|
const queryFormRef = ref() // 搜索的表单
|
||||||
|
|
||||||
|
/** 查询列表 */
|
||||||
|
const getList = async () => {
|
||||||
|
loading.value = true
|
||||||
|
try {
|
||||||
|
const data = await ProcessInstanceApi.getMyProcessInstancePage(queryParams)
|
||||||
|
list.value = data.list
|
||||||
|
total.value = data.total
|
||||||
|
} finally {
|
||||||
|
loading.value = false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 搜索按钮操作 */
|
||||||
|
const handleQuery = () => {
|
||||||
|
queryParams.pageNo = 1
|
||||||
|
getList()
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 重置按钮操作 */
|
||||||
|
const resetQuery = () => {
|
||||||
|
queryFormRef.value.resetFields()
|
||||||
|
handleQuery()
|
||||||
|
}
|
||||||
|
|
||||||
/** 发起流程操作 **/
|
/** 发起流程操作 **/
|
||||||
const handleCreate = () => {
|
const handleCreate = () => {
|
||||||
@ -67,7 +214,7 @@ const handleCreate = () => {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
// 列表操作
|
/** 查看详情 */
|
||||||
const handleDetail = (row) => {
|
const handleDetail = (row) => {
|
||||||
router.push({
|
router.push({
|
||||||
name: 'BpmProcessInstanceDetail',
|
name: 'BpmProcessInstanceDetail',
|
||||||
@ -78,16 +225,23 @@ const handleDetail = (row) => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/** 取消按钮操作 */
|
/** 取消按钮操作 */
|
||||||
const handleCancel = (row) => {
|
const handleCancel = async (row) => {
|
||||||
ElMessageBox.prompt('请输入取消原因', '取消流程', {
|
// 二次确认
|
||||||
|
const { value } = await ElMessageBox.prompt('请输入取消原因', '取消流程', {
|
||||||
confirmButtonText: t('common.ok'),
|
confirmButtonText: t('common.ok'),
|
||||||
cancelButtonText: t('common.cancel'),
|
cancelButtonText: t('common.cancel'),
|
||||||
inputPattern: /^[\s\S]*.*\S[\s\S]*$/, // 判断非空,且非空格
|
inputPattern: /^[\s\S]*.*\S[\s\S]*$/, // 判断非空,且非空格
|
||||||
inputErrorMessage: '取消原因不能为空'
|
inputErrorMessage: '取消原因不能为空'
|
||||||
}).then(async ({ value }) => {
|
|
||||||
await ProcessInstanceApi.cancelProcessInstanceApi(row.id, value)
|
|
||||||
message.success('取消成功')
|
|
||||||
reload()
|
|
||||||
})
|
})
|
||||||
|
// 发起取消
|
||||||
|
await ProcessInstanceApi.cancelProcessInstance(row.id, value)
|
||||||
|
message.success('取消成功')
|
||||||
|
// 刷新列表
|
||||||
|
await getList()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** 初始化 **/
|
||||||
|
onMounted(() => {
|
||||||
|
getList()
|
||||||
|
})
|
||||||
</script>
|
</script>
|
||||||
|
@ -1,94 +0,0 @@
|
|||||||
import type { VxeCrudSchema } from '@/hooks/web/useVxeCrudSchemas'
|
|
||||||
|
|
||||||
const { t } = useI18n() // 国际化
|
|
||||||
|
|
||||||
// CrudSchema
|
|
||||||
const crudSchemas = reactive<VxeCrudSchema>({
|
|
||||||
primaryKey: 'id',
|
|
||||||
primaryType: null,
|
|
||||||
primaryTitle: '编号',
|
|
||||||
action: true,
|
|
||||||
actionWidth: '200px',
|
|
||||||
columns: [
|
|
||||||
{
|
|
||||||
title: '编号',
|
|
||||||
field: 'id',
|
|
||||||
table: {
|
|
||||||
width: 320
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: '流程名',
|
|
||||||
field: 'name',
|
|
||||||
isSearch: true
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: '所属流程',
|
|
||||||
field: 'processDefinitionId',
|
|
||||||
isSearch: true,
|
|
||||||
isTable: false
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: '流程分类',
|
|
||||||
field: 'category',
|
|
||||||
dictType: DICT_TYPE.BPM_MODEL_CATEGORY,
|
|
||||||
dictClass: 'number',
|
|
||||||
isSearch: true,
|
|
||||||
table: {
|
|
||||||
slots: {
|
|
||||||
default: 'category_default'
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: '当前审批任务',
|
|
||||||
field: 'tasks',
|
|
||||||
table: {
|
|
||||||
width: 140,
|
|
||||||
slots: {
|
|
||||||
default: 'tasks_default'
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: t('common.status'),
|
|
||||||
field: 'status',
|
|
||||||
dictType: DICT_TYPE.BPM_PROCESS_INSTANCE_STATUS,
|
|
||||||
dictClass: 'number',
|
|
||||||
isSearch: true
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: '结果',
|
|
||||||
field: 'result',
|
|
||||||
dictType: DICT_TYPE.BPM_PROCESS_INSTANCE_RESULT,
|
|
||||||
dictClass: 'number',
|
|
||||||
isSearch: true
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: '提交时间',
|
|
||||||
field: 'createTime',
|
|
||||||
formatter: 'formatDate',
|
|
||||||
table: {
|
|
||||||
width: 180
|
|
||||||
},
|
|
||||||
isForm: false,
|
|
||||||
isSearch: true,
|
|
||||||
search: {
|
|
||||||
show: true,
|
|
||||||
itemRender: {
|
|
||||||
name: 'XDataTimePicker'
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: '结束时间',
|
|
||||||
field: 'endTime',
|
|
||||||
formatter: 'formatDate',
|
|
||||||
table: {
|
|
||||||
width: 180
|
|
||||||
},
|
|
||||||
isForm: false
|
|
||||||
}
|
|
||||||
]
|
|
||||||
})
|
|
||||||
export const { allSchemas } = useVxeCrudSchemas(crudSchemas)
|
|
49
src/views/bpm/task/done/TaskDetail.vue
Normal file
49
src/views/bpm/task/done/TaskDetail.vue
Normal file
@ -0,0 +1,49 @@
|
|||||||
|
<template>
|
||||||
|
<Dialog title="详情" v-model="dialogVisible" :scroll="true" :max-height="500">
|
||||||
|
<el-descriptions border :column="1">
|
||||||
|
<el-descriptions-item label="任务编号" min-width="120">
|
||||||
|
{{ detailData.id }}
|
||||||
|
</el-descriptions-item>
|
||||||
|
<el-descriptions-item label="任务名称">
|
||||||
|
{{ detailData.name }}
|
||||||
|
</el-descriptions-item>
|
||||||
|
<el-descriptions-item label="所属流程">
|
||||||
|
{{ detailData.processInstance.name }}
|
||||||
|
</el-descriptions-item>
|
||||||
|
<el-descriptions-item label="流程发起人">
|
||||||
|
{{ detailData.processInstance.startUserNickname }}
|
||||||
|
</el-descriptions-item>
|
||||||
|
<el-descriptions-item label="状态">
|
||||||
|
<dict-tag :type="DICT_TYPE.BPM_PROCESS_INSTANCE_RESULT" :value="detailData.result" />
|
||||||
|
</el-descriptions-item>
|
||||||
|
<el-descriptions-item label="原因">
|
||||||
|
{{ detailData.reason }}
|
||||||
|
</el-descriptions-item>
|
||||||
|
<el-descriptions-item label="创建时间">
|
||||||
|
{{ formatDate(detailData.createTime) }}
|
||||||
|
</el-descriptions-item>
|
||||||
|
</el-descriptions>
|
||||||
|
</Dialog>
|
||||||
|
</template>
|
||||||
|
<script setup lang="ts">
|
||||||
|
import { DICT_TYPE } from '@/utils/dict'
|
||||||
|
import { formatDate } from '@/utils/formatTime'
|
||||||
|
import * as TaskApi from '@/api/bpm/task'
|
||||||
|
|
||||||
|
const dialogVisible = ref(false) // 弹窗的是否展示
|
||||||
|
const detailLoading = ref(false) // 表单的加载中
|
||||||
|
const detailData = ref() // 详情数据
|
||||||
|
|
||||||
|
/** 打开弹窗 */
|
||||||
|
const open = async (data: TaskApi.TaskVO) => {
|
||||||
|
dialogVisible.value = true
|
||||||
|
// 设置数据
|
||||||
|
detailLoading.value = true
|
||||||
|
try {
|
||||||
|
detailData.value = data
|
||||||
|
} finally {
|
||||||
|
detailLoading.value = false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
defineExpose({ open }) // 提供 open 方法,用于打开弹窗
|
||||||
|
</script>
|
@ -1,52 +0,0 @@
|
|||||||
import type { VxeCrudSchema } from '@/hooks/web/useVxeCrudSchemas'
|
|
||||||
|
|
||||||
const { t } = useI18n() // 国际化
|
|
||||||
|
|
||||||
// crudSchemas
|
|
||||||
const crudSchemas = reactive<VxeCrudSchema>({
|
|
||||||
primaryKey: 'id',
|
|
||||||
primaryType: null,
|
|
||||||
action: true,
|
|
||||||
columns: [
|
|
||||||
{
|
|
||||||
title: '任务编号',
|
|
||||||
field: 'id',
|
|
||||||
table: {
|
|
||||||
width: 320
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: '任务名称',
|
|
||||||
field: 'name',
|
|
||||||
isSearch: true
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: '所属流程',
|
|
||||||
field: 'processInstance.name'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: '流程发起人',
|
|
||||||
field: 'processInstance.startUserNickname'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: t('common.status'),
|
|
||||||
field: 'result',
|
|
||||||
dictType: DICT_TYPE.BPM_PROCESS_INSTANCE_RESULT,
|
|
||||||
dictClass: 'number',
|
|
||||||
isSearch: true
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: '原因',
|
|
||||||
field: 'reason'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: t('common.createTime'),
|
|
||||||
field: 'createTime',
|
|
||||||
formatter: 'formatDate',
|
|
||||||
table: {
|
|
||||||
width: 180
|
|
||||||
}
|
|
||||||
}
|
|
||||||
]
|
|
||||||
})
|
|
||||||
export const { allSchemas } = useVxeCrudSchemas(crudSchemas)
|
|
@ -1,31 +1,128 @@
|
|||||||
<template>
|
<template>
|
||||||
<ContentWrap>
|
<ContentWrap>
|
||||||
<XTable @register="registerTable">
|
<!-- 搜索工作栏 -->
|
||||||
<template #suspensionState_default="{ row }">
|
<el-form
|
||||||
<el-tag type="success" v-if="row.suspensionState === 1">激活</el-tag>
|
class="-mb-15px"
|
||||||
<el-tag type="warning" v-if="row.suspensionState === 2">挂起</el-tag>
|
:model="queryParams"
|
||||||
</template>
|
ref="queryFormRef"
|
||||||
<template #actionbtns_default="{ row }">
|
:inline="true"
|
||||||
<!-- 操作: 审批进度 -->
|
label-width="68px"
|
||||||
<XTextButton preIcon="ep:view" title="详情" @click="handleAudit(row)" />
|
>
|
||||||
</template>
|
<el-form-item label="任务名称" prop="name">
|
||||||
</XTable>
|
<el-input
|
||||||
|
v-model="queryParams.name"
|
||||||
|
placeholder="请输入任务名称"
|
||||||
|
clearable
|
||||||
|
@keyup.enter="handleQuery"
|
||||||
|
class="!w-240px"
|
||||||
|
/>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="创建时间" prop="createTime">
|
||||||
|
<el-date-picker
|
||||||
|
v-model="queryParams.createTime"
|
||||||
|
value-format="YYYY-MM-DD HH:mm:ss"
|
||||||
|
type="daterange"
|
||||||
|
start-placeholder="开始日期"
|
||||||
|
end-placeholder="结束日期"
|
||||||
|
:default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]"
|
||||||
|
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-form-item>
|
||||||
|
</el-form>
|
||||||
</ContentWrap>
|
</ContentWrap>
|
||||||
</template>
|
|
||||||
<script setup lang="ts">
|
|
||||||
// 业务相关的 import
|
|
||||||
import { allSchemas } from './done.data'
|
|
||||||
import * as TaskApi from '@/api/bpm/task'
|
|
||||||
|
|
||||||
|
<!-- 列表 -->
|
||||||
|
<ContentWrap>
|
||||||
|
<el-table v-loading="loading" :data="list">
|
||||||
|
<el-table-column label="任务编号" align="center" prop="id" width="300px" />
|
||||||
|
<el-table-column label="任务名称" align="center" prop="name" />
|
||||||
|
<el-table-column label="所属流程" align="center" prop="processInstance.name" />
|
||||||
|
<el-table-column label="流程发起人" align="center" prop="processInstance.startUserNickname" />
|
||||||
|
<el-table-column label="状态" align="center" prop="result">
|
||||||
|
<template #default="scope">
|
||||||
|
<dict-tag :type="DICT_TYPE.BPM_PROCESS_INSTANCE_RESULT" :value="scope.row.result" />
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column label="原因" align="center" prop="reason" />
|
||||||
|
<el-table-column
|
||||||
|
label="创建时间"
|
||||||
|
align="center"
|
||||||
|
prop="createTime"
|
||||||
|
width="180"
|
||||||
|
:formatter="dateFormatter"
|
||||||
|
/>
|
||||||
|
<el-table-column label="操作" align="center">
|
||||||
|
<template #default="scope">
|
||||||
|
<el-button link type="primary" @click="openDetail(scope.row)">详情</el-button>
|
||||||
|
<el-button link type="primary" @click="handleAudit(scope.row)">流程</el-button>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
</el-table>
|
||||||
|
<!-- 分页 -->
|
||||||
|
<Pagination
|
||||||
|
:total="total"
|
||||||
|
v-model:page="queryParams.pageNo"
|
||||||
|
v-model:limit="queryParams.pageSize"
|
||||||
|
@pagination="getList"
|
||||||
|
/>
|
||||||
|
</ContentWrap>
|
||||||
|
|
||||||
|
<!-- 表单弹窗:详情 -->
|
||||||
|
<TaskDetail ref="detailRef" @success="getList" />
|
||||||
|
</template>
|
||||||
|
<script setup lang="tsx">
|
||||||
|
import { DICT_TYPE } from '@/utils/dict'
|
||||||
|
import { dateFormatter } from '@/utils/formatTime'
|
||||||
|
import * as TaskApi from '@/api/bpm/task'
|
||||||
|
import TaskDetail from './TaskDetail.vue'
|
||||||
const { push } = useRouter() // 路由
|
const { push } = useRouter() // 路由
|
||||||
|
|
||||||
const [registerTable] = useXTable({
|
const loading = ref(true) // 列表的加载中
|
||||||
allSchemas: allSchemas,
|
const total = ref(0) // 列表的总页数
|
||||||
topActionSlots: false,
|
const list = ref([]) // 列表的数据
|
||||||
getListApi: TaskApi.getDoneTaskPage
|
const queryParams = reactive({
|
||||||
|
pageNo: 1,
|
||||||
|
pageSize: 10,
|
||||||
|
name: '',
|
||||||
|
createTime: []
|
||||||
})
|
})
|
||||||
|
const queryFormRef = ref() // 搜索的表单
|
||||||
|
|
||||||
// 处理审批按钮
|
/** 查询任务列表 */
|
||||||
|
const getList = async () => {
|
||||||
|
loading.value = true
|
||||||
|
try {
|
||||||
|
const data = await TaskApi.getDoneTaskPage(queryParams)
|
||||||
|
list.value = data.list
|
||||||
|
total.value = data.total
|
||||||
|
} finally {
|
||||||
|
loading.value = false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 搜索按钮操作 */
|
||||||
|
const handleQuery = () => {
|
||||||
|
queryParams.pageNo = 1
|
||||||
|
getList()
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 重置按钮操作 */
|
||||||
|
const resetQuery = () => {
|
||||||
|
queryFormRef.value.resetFields()
|
||||||
|
handleQuery()
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 详情操作 */
|
||||||
|
const detailRef = ref()
|
||||||
|
const openDetail = (row: TaskApi.TaskVO) => {
|
||||||
|
detailRef.value.open(row)
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 处理审批按钮 */
|
||||||
const handleAudit = (row) => {
|
const handleAudit = (row) => {
|
||||||
push({
|
push({
|
||||||
name: 'BpmProcessInstanceDetail',
|
name: 'BpmProcessInstanceDetail',
|
||||||
@ -34,4 +131,9 @@ const handleAudit = (row) => {
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** 初始化 **/
|
||||||
|
onMounted(() => {
|
||||||
|
getList()
|
||||||
|
})
|
||||||
</script>
|
</script>
|
||||||
|
@ -1,32 +1,117 @@
|
|||||||
<template>
|
<template>
|
||||||
<ContentWrap>
|
<ContentWrap>
|
||||||
<XTable @register="registerTable">
|
<!-- 搜索工作栏 -->
|
||||||
<template #suspensionState_default="{ row }">
|
<el-form
|
||||||
<el-tag type="success" v-if="row.suspensionState === 1">激活</el-tag>
|
class="-mb-15px"
|
||||||
<el-tag type="warning" v-if="row.suspensionState === 2">挂起</el-tag>
|
:model="queryParams"
|
||||||
</template>
|
ref="queryFormRef"
|
||||||
<template #actionbtns_default="{ row }">
|
:inline="true"
|
||||||
<!-- 操作: 审批进度 -->
|
label-width="68px"
|
||||||
<XTextButton preIcon="ep:edit-pen" title="审批进度" @click="handleAudit(row)" />
|
>
|
||||||
</template>
|
<el-form-item label="任务名称" prop="name">
|
||||||
</XTable>
|
<el-input
|
||||||
|
v-model="queryParams.name"
|
||||||
|
placeholder="请输入任务名称"
|
||||||
|
clearable
|
||||||
|
@keyup.enter="handleQuery"
|
||||||
|
class="!w-240px"
|
||||||
|
/>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="创建时间" prop="createTime">
|
||||||
|
<el-date-picker
|
||||||
|
v-model="queryParams.createTime"
|
||||||
|
value-format="YYYY-MM-DD HH:mm:ss"
|
||||||
|
type="daterange"
|
||||||
|
start-placeholder="开始日期"
|
||||||
|
end-placeholder="结束日期"
|
||||||
|
:default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]"
|
||||||
|
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-form-item>
|
||||||
|
</el-form>
|
||||||
|
</ContentWrap>
|
||||||
|
|
||||||
|
<!-- 列表 -->
|
||||||
|
<ContentWrap>
|
||||||
|
<el-table v-loading="loading" :data="list">
|
||||||
|
<el-table-column label="任务编号" align="center" prop="id" width="300px" />
|
||||||
|
<el-table-column label="任务名称" align="center" prop="name" />
|
||||||
|
<el-table-column label="所属流程" align="center" prop="processInstance.name" />
|
||||||
|
<el-table-column label="流程发起人" align="center" prop="processInstance.startUserNickname" />
|
||||||
|
<el-table-column
|
||||||
|
label="创建时间"
|
||||||
|
align="center"
|
||||||
|
prop="createTime"
|
||||||
|
width="180"
|
||||||
|
:formatter="dateFormatter"
|
||||||
|
/>
|
||||||
|
<el-table-column label="任务状态" prop="suspensionState">
|
||||||
|
<template #default="scope">
|
||||||
|
<el-tag type="success" v-if="scope.row.suspensionState === 1">激活</el-tag>
|
||||||
|
<el-tag type="warning" v-if="scope.row.suspensionState === 2">挂起</el-tag>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column label="操作" align="center">
|
||||||
|
<template #default="scope">
|
||||||
|
<el-button link type="primary" @click="handleAudit(scope.row)">审批进度</el-button>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
</el-table>
|
||||||
|
<!-- 分页 -->
|
||||||
|
<Pagination
|
||||||
|
:total="total"
|
||||||
|
v-model:page="queryParams.pageNo"
|
||||||
|
v-model:limit="queryParams.pageSize"
|
||||||
|
@pagination="getList"
|
||||||
|
/>
|
||||||
</ContentWrap>
|
</ContentWrap>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup lang="ts">
|
<script setup lang="tsx">
|
||||||
// 业务相关的 import
|
import { dateFormatter } from '@/utils/formatTime'
|
||||||
import { allSchemas } from './todo.data'
|
const { push } = useRouter() // 路由
|
||||||
import * as TaskApi from '@/api/bpm/task'
|
import * as TaskApi from '@/api/bpm/task'
|
||||||
|
|
||||||
const { push } = useRouter() // 路由
|
const loading = ref(true) // 列表的加载中
|
||||||
|
const total = ref(0) // 列表的总页数
|
||||||
const [registerTable] = useXTable({
|
const list = ref([]) // 列表的数据
|
||||||
allSchemas: allSchemas,
|
const queryParams = reactive({
|
||||||
topActionSlots: false,
|
pageNo: 1,
|
||||||
getListApi: TaskApi.getTodoTaskPage
|
pageSize: 10,
|
||||||
|
name: '',
|
||||||
|
createTime: []
|
||||||
})
|
})
|
||||||
|
const queryFormRef = ref() // 搜索的表单
|
||||||
|
|
||||||
// 处理审批按钮
|
/** 查询任务列表 */
|
||||||
|
const getList = async () => {
|
||||||
|
loading.value = true
|
||||||
|
try {
|
||||||
|
const data = await TaskApi.getTodoTaskPage(queryParams)
|
||||||
|
list.value = data.list
|
||||||
|
total.value = data.total
|
||||||
|
} finally {
|
||||||
|
loading.value = false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 搜索按钮操作 */
|
||||||
|
const handleQuery = () => {
|
||||||
|
queryParams.pageNo = 1
|
||||||
|
getList()
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 重置按钮操作 */
|
||||||
|
const resetQuery = () => {
|
||||||
|
queryFormRef.value.resetFields()
|
||||||
|
handleQuery()
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 处理审批按钮 */
|
||||||
const handleAudit = (row) => {
|
const handleAudit = (row) => {
|
||||||
push({
|
push({
|
||||||
name: 'BpmProcessInstanceDetail',
|
name: 'BpmProcessInstanceDetail',
|
||||||
@ -35,4 +120,9 @@ const handleAudit = (row) => {
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** 初始化 **/
|
||||||
|
onMounted(() => {
|
||||||
|
getList()
|
||||||
|
})
|
||||||
</script>
|
</script>
|
||||||
|
@ -1,58 +0,0 @@
|
|||||||
import type { VxeCrudSchema } from '@/hooks/web/useVxeCrudSchemas'
|
|
||||||
|
|
||||||
const { t } = useI18n() // 国际化
|
|
||||||
|
|
||||||
// crudSchemas
|
|
||||||
const crudSchemas = reactive<VxeCrudSchema>({
|
|
||||||
primaryKey: 'id',
|
|
||||||
primaryType: null,
|
|
||||||
action: true,
|
|
||||||
searchSpan: 8,
|
|
||||||
columns: [
|
|
||||||
{
|
|
||||||
title: '任务编号',
|
|
||||||
field: 'id',
|
|
||||||
table: {
|
|
||||||
width: 320
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: '任务名称',
|
|
||||||
field: 'name',
|
|
||||||
isSearch: true
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: '所属流程',
|
|
||||||
field: 'processInstance.name'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: '流程发起人',
|
|
||||||
field: 'processInstance.startUserNickname'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: t('common.createTime'),
|
|
||||||
field: 'createTime',
|
|
||||||
formatter: 'formatDate',
|
|
||||||
table: {
|
|
||||||
width: 180
|
|
||||||
},
|
|
||||||
isSearch: true,
|
|
||||||
search: {
|
|
||||||
show: true,
|
|
||||||
itemRender: {
|
|
||||||
name: 'XDataTimePicker'
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: '任务状态',
|
|
||||||
field: 'suspensionState',
|
|
||||||
table: {
|
|
||||||
slots: {
|
|
||||||
default: 'suspensionState_default'
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
]
|
|
||||||
})
|
|
||||||
export const { allSchemas } = useVxeCrudSchemas(crudSchemas)
|
|
@ -1,5 +1,7 @@
|
|||||||
<template>
|
<template>
|
||||||
<content-wrap>
|
<doc-alert title="系统日志" url="https://doc.iocoder.cn/system-log/" />
|
||||||
|
|
||||||
|
<ContentWrap>
|
||||||
<!-- 搜索工作栏 -->
|
<!-- 搜索工作栏 -->
|
||||||
<el-form
|
<el-form
|
||||||
class="-mb-15px"
|
class="-mb-15px"
|
||||||
@ -25,10 +27,10 @@
|
|||||||
class="!w-240px"
|
class="!w-240px"
|
||||||
>
|
>
|
||||||
<el-option
|
<el-option
|
||||||
v-for="dict in getDictOptions(DICT_TYPE.USER_TYPE)"
|
v-for="dict in getIntDictOptions(DICT_TYPE.USER_TYPE)"
|
||||||
:key="parseInt(dict.value)"
|
:key="dict.value"
|
||||||
:label="dict.label"
|
:label="dict.label"
|
||||||
:value="parseInt(dict.value)"
|
:value="dict.value"
|
||||||
/>
|
/>
|
||||||
</el-select>
|
</el-select>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
@ -84,10 +86,10 @@
|
|||||||
</el-button>
|
</el-button>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-form>
|
</el-form>
|
||||||
</content-wrap>
|
</ContentWrap>
|
||||||
|
|
||||||
<!-- 列表 -->
|
<!-- 列表 -->
|
||||||
<content-wrap>
|
<ContentWrap>
|
||||||
<el-table v-loading="loading" :data="list">
|
<el-table v-loading="loading" :data="list">
|
||||||
<el-table-column label="日志编号" align="center" prop="id" />
|
<el-table-column label="日志编号" align="center" prop="id" />
|
||||||
<el-table-column label="用户编号" align="center" prop="userId" />
|
<el-table-column label="用户编号" align="center" prop="userId" />
|
||||||
@ -105,15 +107,11 @@
|
|||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column label="执行时长" align="center" prop="duration" width="180">
|
<el-table-column label="执行时长" align="center" prop="duration" width="180">
|
||||||
<template #default="scope">
|
<template #default="scope"> {{ scope.row.duration }} ms </template>
|
||||||
<span>{{ scope.row.duration }} ms</span>
|
|
||||||
</template>
|
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column label="操作结果" align="center" prop="status">
|
<el-table-column label="操作结果" align="center" prop="status">
|
||||||
<template #default="scope">
|
<template #default="scope">
|
||||||
<span>{{
|
{{ scope.row.resultCode === 0 ? '成功' : '失败(' + scope.row.resultMsg + ')' }}
|
||||||
scope.row.resultCode === 0 ? '成功' : '失败(' + scope.row.resultMsg + ')'
|
|
||||||
}}</span>
|
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column label="操作" align="center">
|
<el-table-column label="操作" align="center">
|
||||||
@ -136,19 +134,17 @@
|
|||||||
v-model:limit="queryParams.pageSize"
|
v-model:limit="queryParams.pageSize"
|
||||||
@pagination="getList"
|
@pagination="getList"
|
||||||
/>
|
/>
|
||||||
</content-wrap>
|
</ContentWrap>
|
||||||
|
|
||||||
<!-- 表单弹窗:详情 -->
|
<!-- 表单弹窗:详情 -->
|
||||||
<ApiAccessLogDetail ref="detailRef" />
|
<ApiAccessLogDetail ref="detailRef" />
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup lang="ts" name="ApiAccessLog">
|
<script setup lang="ts" name="ApiAccessLog">
|
||||||
import { DICT_TYPE, getDictOptions } from '@/utils/dict'
|
import { DICT_TYPE, getIntDictOptions } from '@/utils/dict'
|
||||||
import download from '@/utils/download'
|
import download from '@/utils/download'
|
||||||
import { formatDate } from '@/utils/formatTime'
|
import { formatDate } from '@/utils/formatTime'
|
||||||
import * as ApiAccessLogApi from '@/api/infra/apiAccessLog'
|
import * as ApiAccessLogApi from '@/api/infra/apiAccessLog'
|
||||||
import ApiAccessLogDetail from './ApiAccessLogDetail.vue'
|
import ApiAccessLogDetail from './ApiAccessLogDetail.vue'
|
||||||
|
|
||||||
const message = useMessage() // 消息弹窗
|
const message = useMessage() // 消息弹窗
|
||||||
|
|
||||||
const loading = ref(true) // 列表的加载中
|
const loading = ref(true) // 列表的加载中
|
||||||
|
@ -1,4 +1,6 @@
|
|||||||
<template>
|
<template>
|
||||||
|
<doc-alert title="系统日志" url="https://doc.iocoder.cn/system-log/" />
|
||||||
|
|
||||||
<ContentWrap>
|
<ContentWrap>
|
||||||
<!-- 搜索工作栏 -->
|
<!-- 搜索工作栏 -->
|
||||||
<el-form
|
<el-form
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
<template>
|
<template>
|
||||||
<content-wrap v-loading="formLoading">
|
<ContentWrap v-loading="formLoading">
|
||||||
<el-tabs v-model="activeName">
|
<el-tabs v-model="activeName">
|
||||||
<el-tab-pane label="基本信息" name="basicInfo">
|
<el-tab-pane label="基本信息" name="basicInfo">
|
||||||
<basic-info-form ref="basicInfoRef" :table="formData.table" />
|
<basic-info-form ref="basicInfoRef" :table="formData.table" />
|
||||||
@ -17,7 +17,7 @@
|
|||||||
<el-button @click="close">返回</el-button>
|
<el-button @click="close">返回</el-button>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-form>
|
</el-form>
|
||||||
</content-wrap>
|
</ContentWrap>
|
||||||
</template>
|
</template>
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { useTagsViewStore } from '@/store/modules/tagsView'
|
import { useTagsViewStore } from '@/store/modules/tagsView'
|
||||||
|
@ -1,6 +1,9 @@
|
|||||||
<template>
|
<template>
|
||||||
|
<doc-alert title="代码生成" url="https://doc.iocoder.cn/new-feature/" />
|
||||||
|
<doc-alert title="单元测试" url="https://doc.iocoder.cn/unit-test/" />
|
||||||
|
|
||||||
<!-- 搜索 -->
|
<!-- 搜索 -->
|
||||||
<content-wrap>
|
<ContentWrap>
|
||||||
<el-form
|
<el-form
|
||||||
class="-mb-15px"
|
class="-mb-15px"
|
||||||
:model="queryParams"
|
:model="queryParams"
|
||||||
@ -45,10 +48,10 @@
|
|||||||
</el-button>
|
</el-button>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-form>
|
</el-form>
|
||||||
</content-wrap>
|
</ContentWrap>
|
||||||
|
|
||||||
<!-- 列表 -->
|
<!-- 列表 -->
|
||||||
<content-wrap>
|
<ContentWrap>
|
||||||
<el-table v-loading="loading" :data="list">
|
<el-table v-loading="loading" :data="list">
|
||||||
<el-table-column label="数据源" align="center">
|
<el-table-column label="数据源" align="center">
|
||||||
<template #default="scope">
|
<template #default="scope">
|
||||||
@ -132,7 +135,7 @@
|
|||||||
v-model:limit="queryParams.pageSize"
|
v-model:limit="queryParams.pageSize"
|
||||||
@pagination="getList"
|
@pagination="getList"
|
||||||
/>
|
/>
|
||||||
</content-wrap>
|
</ContentWrap>
|
||||||
|
|
||||||
<!-- 弹窗:导入表 -->
|
<!-- 弹窗:导入表 -->
|
||||||
<ImportTable ref="importRef" success="getList" />
|
<ImportTable ref="importRef" success="getList" />
|
||||||
|
@ -70,7 +70,7 @@ const formRules = reactive({
|
|||||||
const formRef = ref() // 表单 Ref
|
const formRef = ref() // 表单 Ref
|
||||||
|
|
||||||
/** 打开弹窗 */
|
/** 打开弹窗 */
|
||||||
const openModal = async (type: string, id?: number) => {
|
const open = async (type: string, id?: number) => {
|
||||||
dialogVisible.value = true
|
dialogVisible.value = true
|
||||||
dialogTitle.value = t('action.' + type)
|
dialogTitle.value = t('action.' + type)
|
||||||
formType.value = type
|
formType.value = type
|
||||||
@ -85,7 +85,7 @@ const openModal = async (type: string, id?: number) => {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
defineExpose({ openModal }) // 提供 openModal 方法,用于打开弹窗
|
defineExpose({ open }) // 提供 open 方法,用于打开弹窗
|
||||||
|
|
||||||
/** 提交表单 */
|
/** 提交表单 */
|
||||||
const emit = defineEmits(['success']) // 定义 success 事件,用于操作成功后的回调
|
const emit = defineEmits(['success']) // 定义 success 事件,用于操作成功后的回调
|
@ -1,6 +1,8 @@
|
|||||||
<template>
|
<template>
|
||||||
|
<doc-alert title="配置中心" url="https://doc.iocoder.cn/config-center/" />
|
||||||
|
|
||||||
<!-- 搜索 -->
|
<!-- 搜索 -->
|
||||||
<content-wrap>
|
<ContentWrap>
|
||||||
<el-form
|
<el-form
|
||||||
class="-mb-15px"
|
class="-mb-15px"
|
||||||
:model="queryParams"
|
:model="queryParams"
|
||||||
@ -34,10 +36,10 @@
|
|||||||
class="!w-240px"
|
class="!w-240px"
|
||||||
>
|
>
|
||||||
<el-option
|
<el-option
|
||||||
v-for="dict in getDictOptions(DICT_TYPE.INFRA_CONFIG_TYPE)"
|
v-for="dict in getIntDictOptions(DICT_TYPE.INFRA_CONFIG_TYPE)"
|
||||||
:key="parseInt(dict.value)"
|
:key="dict.value"
|
||||||
:label="dict.label"
|
:label="dict.label"
|
||||||
:value="parseInt(dict.value)"
|
:value="dict.value"
|
||||||
/>
|
/>
|
||||||
</el-select>
|
</el-select>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
@ -58,7 +60,7 @@
|
|||||||
<el-button
|
<el-button
|
||||||
type="primary"
|
type="primary"
|
||||||
plain
|
plain
|
||||||
@click="openModal('create')"
|
@click="openForm('create')"
|
||||||
v-hasPermi="['infra:config:create']"
|
v-hasPermi="['infra:config:create']"
|
||||||
>
|
>
|
||||||
<Icon icon="ep:plus" class="mr-5px" /> 新增
|
<Icon icon="ep:plus" class="mr-5px" /> 新增
|
||||||
@ -74,10 +76,10 @@
|
|||||||
</el-button>
|
</el-button>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-form>
|
</el-form>
|
||||||
</content-wrap>
|
</ContentWrap>
|
||||||
|
|
||||||
<!-- 列表 -->
|
<!-- 列表 -->
|
||||||
<content-wrap>
|
<ContentWrap>
|
||||||
<el-table v-loading="loading" :data="list">
|
<el-table v-loading="loading" :data="list">
|
||||||
<el-table-column label="参数主键" align="center" prop="id" />
|
<el-table-column label="参数主键" align="center" prop="id" />
|
||||||
<el-table-column label="参数分类" align="center" prop="category" />
|
<el-table-column label="参数分类" align="center" prop="category" />
|
||||||
@ -107,7 +109,7 @@
|
|||||||
<el-button
|
<el-button
|
||||||
link
|
link
|
||||||
type="primary"
|
type="primary"
|
||||||
@click="openModal('update', scope.row.id)"
|
@click="openForm('update', scope.row.id)"
|
||||||
v-hasPermi="['infra:config:update']"
|
v-hasPermi="['infra:config:update']"
|
||||||
>
|
>
|
||||||
编辑
|
编辑
|
||||||
@ -130,17 +132,17 @@
|
|||||||
v-model:limit="queryParams.pageSize"
|
v-model:limit="queryParams.pageSize"
|
||||||
@pagination="getList"
|
@pagination="getList"
|
||||||
/>
|
/>
|
||||||
</content-wrap>
|
</ContentWrap>
|
||||||
|
|
||||||
<!-- 表单弹窗:添加/修改 -->
|
<!-- 表单弹窗:添加/修改 -->
|
||||||
<config-form ref="modalRef" @success="getList" />
|
<ConfigForm ref="formRef" @success="getList" />
|
||||||
</template>
|
</template>
|
||||||
<script setup lang="ts" name="Config">
|
<script setup lang="ts" name="Config">
|
||||||
import { DICT_TYPE, getDictOptions } from '@/utils/dict'
|
import { DICT_TYPE, getIntDictOptions } from '@/utils/dict'
|
||||||
import { dateFormatter } from '@/utils/formatTime'
|
import { dateFormatter } from '@/utils/formatTime'
|
||||||
import download from '@/utils/download'
|
import download from '@/utils/download'
|
||||||
import * as ConfigApi from '@/api/infra/config'
|
import * as ConfigApi from '@/api/infra/config'
|
||||||
import ConfigForm from './form.vue'
|
import ConfigForm from './ConfigForm.vue'
|
||||||
const message = useMessage() // 消息弹窗
|
const message = useMessage() // 消息弹窗
|
||||||
const { t } = useI18n() // 国际化
|
const { t } = useI18n() // 国际化
|
||||||
|
|
||||||
@ -183,9 +185,9 @@ const resetQuery = () => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/** 添加/修改操作 */
|
/** 添加/修改操作 */
|
||||||
const modalRef = ref()
|
const formRef = ref()
|
||||||
const openModal = (type: string, id?: number) => {
|
const openForm = (type: string, id?: number) => {
|
||||||
modalRef.value.openModal(type, id)
|
formRef.value.open(type, id)
|
||||||
}
|
}
|
||||||
|
|
||||||
/** 删除按钮操作 */
|
/** 删除按钮操作 */
|
||||||
@ -208,7 +210,7 @@ const handleExport = async () => {
|
|||||||
await message.exportConfirm()
|
await message.exportConfirm()
|
||||||
// 发起导出
|
// 发起导出
|
||||||
exportLoading.value = true
|
exportLoading.value = true
|
||||||
const data = await ConfigApi.exportConfigApi(queryParams)
|
const data = await ConfigApi.exportConfig(queryParams)
|
||||||
download.excel(data, '参数配置.xls')
|
download.excel(data, '参数配置.xls')
|
||||||
} catch {
|
} catch {
|
||||||
} finally {
|
} finally {
|
||||||
|
@ -52,7 +52,7 @@ const formRules = reactive({
|
|||||||
const formRef = ref() // 表单 Ref
|
const formRef = ref() // 表单 Ref
|
||||||
|
|
||||||
/** 打开弹窗 */
|
/** 打开弹窗 */
|
||||||
const openModal = async (type: string, id?: number) => {
|
const open = async (type: string, id?: number) => {
|
||||||
dialogVisible.value = true
|
dialogVisible.value = true
|
||||||
dialogTitle.value = t('action.' + type)
|
dialogTitle.value = t('action.' + type)
|
||||||
formType.value = type
|
formType.value = type
|
||||||
@ -67,7 +67,7 @@ const openModal = async (type: string, id?: number) => {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
defineExpose({ openModal }) // 提供 openModal 方法,用于打开弹窗
|
defineExpose({ open }) // 提供 open 方法,用于打开弹窗
|
||||||
|
|
||||||
/** 提交表单 */
|
/** 提交表单 */
|
||||||
const emit = defineEmits(['success']) // 定义 success 事件,用于操作成功后的回调
|
const emit = defineEmits(['success']) // 定义 success 事件,用于操作成功后的回调
|
@ -1,23 +1,23 @@
|
|||||||
<template>
|
<template>
|
||||||
<content-wrap>
|
<ContentWrap>
|
||||||
<!-- 搜索工作栏 -->
|
<!-- 搜索工作栏 -->
|
||||||
<el-form class="-mb-15px" :inline="true">
|
<el-form class="-mb-15px" :inline="true">
|
||||||
<el-form-item>
|
<el-form-item>
|
||||||
<el-button
|
<el-button
|
||||||
type="primary"
|
type="primary"
|
||||||
plain
|
plain
|
||||||
@click="openModal('create')"
|
@click="openForm('create')"
|
||||||
v-hasPermi="['infra:data-source-config:create']"
|
v-hasPermi="['infra:data-source-config:create']"
|
||||||
>
|
>
|
||||||
<Icon icon="ep:plus" class="mr-5px" /> 新增
|
<Icon icon="ep:plus" class="mr-5px" /> 新增
|
||||||
</el-button>
|
</el-button>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-form>
|
</el-form>
|
||||||
</content-wrap>
|
</ContentWrap>
|
||||||
|
|
||||||
<!-- 列表 -->
|
<!-- 列表 -->
|
||||||
<content-wrap>
|
<ContentWrap>
|
||||||
<el-table v-loading="loading" :data="list" align="center">
|
<el-table v-loading="loading" :data="list">
|
||||||
<el-table-column label="主键编号" align="center" prop="id" />
|
<el-table-column label="主键编号" align="center" prop="id" />
|
||||||
<el-table-column label="数据源名称" align="center" prop="name" />
|
<el-table-column label="数据源名称" align="center" prop="name" />
|
||||||
<el-table-column label="数据源连接" align="center" prop="url" :show-overflow-tooltip="true" />
|
<el-table-column label="数据源连接" align="center" prop="url" :show-overflow-tooltip="true" />
|
||||||
@ -34,7 +34,7 @@
|
|||||||
<el-button
|
<el-button
|
||||||
link
|
link
|
||||||
type="primary"
|
type="primary"
|
||||||
@click="openModal('update', scope.row.id)"
|
@click="openForm('update', scope.row.id)"
|
||||||
v-hasPermi="['infra:data-source-config:update']"
|
v-hasPermi="['infra:data-source-config:update']"
|
||||||
:disabled="scope.row.id === 0"
|
:disabled="scope.row.id === 0"
|
||||||
>
|
>
|
||||||
@ -52,15 +52,15 @@
|
|||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
</el-table>
|
</el-table>
|
||||||
</content-wrap>
|
</ContentWrap>
|
||||||
|
|
||||||
<!-- 表单弹窗:添加/修改 -->
|
<!-- 表单弹窗:添加/修改 -->
|
||||||
<data-source-config-form ref="modalRef" @success="getList" />
|
<DataSourceConfigForm ref="formRef" @success="getList" />
|
||||||
</template>
|
</template>
|
||||||
<script setup lang="ts" name="DataSourceConfig">
|
<script setup lang="ts" name="DataSourceConfig">
|
||||||
import { dateFormatter } from '@/utils/formatTime'
|
import { dateFormatter } from '@/utils/formatTime'
|
||||||
import * as DataSourceConfigApi from '@/api/infra/dataSourceConfig'
|
import * as DataSourceConfigApi from '@/api/infra/dataSourceConfig'
|
||||||
import DataSourceConfigForm from './form.vue'
|
import DataSourceConfigForm from './DataSourceConfigForm.vue'
|
||||||
const message = useMessage() // 消息弹窗
|
const message = useMessage() // 消息弹窗
|
||||||
const { t } = useI18n() // 国际化
|
const { t } = useI18n() // 国际化
|
||||||
|
|
||||||
@ -78,9 +78,9 @@ const getList = async () => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/** 添加/修改操作 */
|
/** 添加/修改操作 */
|
||||||
const modalRef = ref()
|
const formRef = ref()
|
||||||
const openModal = (type: string, id?: number) => {
|
const openForm = (type: string, id?: number) => {
|
||||||
modalRef.value.openModal(type, id)
|
formRef.value.open(type, id)
|
||||||
}
|
}
|
||||||
|
|
||||||
/** 删除按钮操作 */
|
/** 删除按钮操作 */
|
||||||
|
@ -1,4 +1,6 @@
|
|||||||
<template>
|
<template>
|
||||||
|
<doc-alert title="数据库文档" url="https://doc.iocoder.cn/db-doc/" />
|
||||||
|
|
||||||
<ContentWrap title="数据库文档">
|
<ContentWrap title="数据库文档">
|
||||||
<!-- 操作工具栏 -->
|
<!-- 操作工具栏 -->
|
||||||
<div class="mb-10px">
|
<div class="mb-10px">
|
||||||
@ -34,7 +36,7 @@ const src = ref('')
|
|||||||
const loding = ref(true)
|
const loding = ref(true)
|
||||||
/** 页面加载 */
|
/** 页面加载 */
|
||||||
const init = async () => {
|
const init = async () => {
|
||||||
const res = await DbDocApi.exportHtmlApi()
|
const res = await DbDocApi.exportHtml()
|
||||||
let blob = new Blob([res], { type: 'text/html' })
|
let blob = new Blob([res], { type: 'text/html' })
|
||||||
let blobUrl = window.URL.createObjectURL(blob)
|
let blobUrl = window.URL.createObjectURL(blob)
|
||||||
src.value = blobUrl
|
src.value = blobUrl
|
||||||
@ -43,15 +45,15 @@ const init = async () => {
|
|||||||
/** 处理导出 */
|
/** 处理导出 */
|
||||||
const handleExport = async (type: string) => {
|
const handleExport = async (type: string) => {
|
||||||
if (type === 'HTML') {
|
if (type === 'HTML') {
|
||||||
const res = await DbDocApi.exportHtmlApi()
|
const res = await DbDocApi.exportHtml()
|
||||||
download.html(res, '数据库文档.html')
|
download.html(res, '数据库文档.html')
|
||||||
}
|
}
|
||||||
if (type === 'Word') {
|
if (type === 'Word') {
|
||||||
const res = await DbDocApi.exportWordApi()
|
const res = await DbDocApi.exportWord()
|
||||||
download.word(res, '数据库文档.doc')
|
download.word(res, '数据库文档.doc')
|
||||||
}
|
}
|
||||||
if (type === 'Markdown') {
|
if (type === 'Markdown') {
|
||||||
const res = await DbDocApi.exportMarkdownApi()
|
const res = await DbDocApi.exportMarkdown()
|
||||||
download.markdown(res, '数据库文档.md')
|
download.markdown(res, '数据库文档.md')
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,4 +1,7 @@
|
|||||||
<template>
|
<template>
|
||||||
|
<doc-alert title="数据库 MyBatis" url="https://doc.iocoder.cn/mybatis/" />
|
||||||
|
<doc-alert title="多数据源(读写分离)" url="https://doc.iocoder.cn/dynamic-datasource/" />
|
||||||
|
|
||||||
<ContentWrap>
|
<ContentWrap>
|
||||||
<IFrame :src="src" />
|
<IFrame :src="src" />
|
||||||
</ContentWrap>
|
</ContentWrap>
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
<template>
|
<template>
|
||||||
<Dialog :title="dialogTitle" v-model="dialogVisible">
|
<Dialog title="上传文件" v-model="dialogVisible">
|
||||||
<el-upload
|
<el-upload
|
||||||
ref="uploadRef"
|
ref="uploadRef"
|
||||||
:limit="1"
|
:limit="1"
|
||||||
@ -28,11 +28,9 @@
|
|||||||
</template>
|
</template>
|
||||||
</Dialog>
|
</Dialog>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { Dialog } from '@/components/Dialog'
|
import { Dialog } from '@/components/Dialog'
|
||||||
import { getAccessToken } from '@/utils/auth'
|
import { getAccessToken } from '@/utils/auth'
|
||||||
|
|
||||||
const { t } = useI18n() // 国际化
|
const { t } = useI18n() // 国际化
|
||||||
const message = useMessage() // 消息弹窗
|
const message = useMessage() // 消息弹窗
|
||||||
|
|
||||||
@ -45,11 +43,10 @@ const data = ref({ path: '' })
|
|||||||
const uploadRef = ref()
|
const uploadRef = ref()
|
||||||
|
|
||||||
/** 打开弹窗 */
|
/** 打开弹窗 */
|
||||||
const openModal = async () => {
|
const open = async () => {
|
||||||
dialogVisible.value = true
|
dialogVisible.value = true
|
||||||
dialogTitle.value = t('action.fileUpload')
|
|
||||||
}
|
}
|
||||||
defineExpose({ openModal }) // 提供 openModal 方法,用于打开弹窗
|
defineExpose({ open }) // 提供 open 方法,用于打开弹窗
|
||||||
|
|
||||||
/** 提交表单 */
|
/** 提交表单 */
|
||||||
const emit = defineEmits(['success']) // 定义 success 事件,用于操作成功后的回调
|
const emit = defineEmits(['success']) // 定义 success 事件,用于操作成功后的回调
|
@ -1,6 +1,8 @@
|
|||||||
<template>
|
<template>
|
||||||
|
<doc-alert title="上传下载" url="https://doc.iocoder.cn/file/"/>
|
||||||
|
|
||||||
<!-- 搜索 -->
|
<!-- 搜索 -->
|
||||||
<content-wrap>
|
<ContentWrap>
|
||||||
<el-form class="-mb-15px" :model="queryParams" ref="queryFormRef" :inline="true">
|
<el-form class="-mb-15px" :model="queryParams" ref="queryFormRef" :inline="true">
|
||||||
<el-form-item label="文件路径" prop="path">
|
<el-form-item label="文件路径" prop="path">
|
||||||
<el-input
|
<el-input
|
||||||
@ -31,16 +33,16 @@
|
|||||||
<el-form-item>
|
<el-form-item>
|
||||||
<el-button @click="handleQuery"><Icon icon="ep:search" class="mr-5px" /> 搜索</el-button>
|
<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 @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> 重置</el-button>
|
||||||
<el-button type="primary" @click="openModal">
|
<el-button type="primary" @click="openForm">
|
||||||
<Icon icon="ep:upload" class="mr-5px" /> 上传文件
|
<Icon icon="ep:upload" class="mr-5px" /> 上传文件
|
||||||
</el-button>
|
</el-button>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-form>
|
</el-form>
|
||||||
</content-wrap>
|
</ContentWrap>
|
||||||
|
|
||||||
<!-- 列表 -->
|
<!-- 列表 -->
|
||||||
<content-wrap>
|
<ContentWrap>
|
||||||
<el-table v-loading="loading" :data="list" align="center">
|
<el-table v-loading="loading" :data="list">
|
||||||
<el-table-column label="文件名" align="center" prop="name" :show-overflow-tooltip="true" />
|
<el-table-column label="文件名" align="center" prop="name" :show-overflow-tooltip="true" />
|
||||||
<el-table-column label="文件路径" align="center" prop="path" :show-overflow-tooltip="true" />
|
<el-table-column label="文件路径" align="center" prop="path" :show-overflow-tooltip="true" />
|
||||||
<el-table-column label="URL" align="center" prop="url" :show-overflow-tooltip="true" />
|
<el-table-column label="URL" align="center" prop="url" :show-overflow-tooltip="true" />
|
||||||
@ -79,16 +81,16 @@
|
|||||||
v-model:limit="queryParams.pageSize"
|
v-model:limit="queryParams.pageSize"
|
||||||
@pagination="getList"
|
@pagination="getList"
|
||||||
/>
|
/>
|
||||||
</content-wrap>
|
</ContentWrap>
|
||||||
|
|
||||||
<!-- 表单弹窗:添加/修改 -->
|
<!-- 表单弹窗:添加/修改 -->
|
||||||
<file-upload-form ref="modalRef" @success="getList" />
|
<FileForm ref="formRef" @success="getList" />
|
||||||
</template>
|
</template>
|
||||||
<script setup lang="ts" name="Config">
|
<script setup lang="ts" name="Config">
|
||||||
import { fileSizeFormatter } from '@/utils'
|
import { fileSizeFormatter } from '@/utils'
|
||||||
import { dateFormatter } from '@/utils/formatTime'
|
import { dateFormatter } from '@/utils/formatTime'
|
||||||
import * as FileApi from '@/api/infra/file'
|
import * as FileApi from '@/api/infra/file'
|
||||||
import FileUploadForm from './form.vue'
|
import FileUploadForm from './FileForm.vue'
|
||||||
const message = useMessage() // 消息弹窗
|
const message = useMessage() // 消息弹窗
|
||||||
const { t } = useI18n() // 国际化
|
const { t } = useI18n() // 国际化
|
||||||
|
|
||||||
@ -129,9 +131,9 @@ const resetQuery = () => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/** 添加/修改操作 */
|
/** 添加/修改操作 */
|
||||||
const modalRef = ref()
|
const formRef = ref()
|
||||||
const openModal = () => {
|
const openForm = () => {
|
||||||
modalRef.value.openModal()
|
formRef.value.open()
|
||||||
}
|
}
|
||||||
|
|
||||||
/** 删除按钮操作 */
|
/** 删除按钮操作 */
|
||||||
|
@ -101,7 +101,6 @@
|
|||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { DICT_TYPE, getDictOptions } from '@/utils/dict'
|
import { DICT_TYPE, getDictOptions } from '@/utils/dict'
|
||||||
import * as FileConfigApi from '@/api/infra/fileConfig'
|
import * as FileConfigApi from '@/api/infra/fileConfig'
|
||||||
|
|
||||||
const { t } = useI18n() // 国际化
|
const { t } = useI18n() // 国际化
|
||||||
const message = useMessage() // 消息弹窗
|
const message = useMessage() // 消息弹窗
|
||||||
|
|
||||||
@ -136,7 +135,7 @@ const formRules = reactive({
|
|||||||
const formRef = ref() // 表单 Ref
|
const formRef = ref() // 表单 Ref
|
||||||
|
|
||||||
/** 打开弹窗 */
|
/** 打开弹窗 */
|
||||||
const openModal = async (type: string, id?: number) => {
|
const open = async (type: string, id?: number) => {
|
||||||
dialogVisible.value = true
|
dialogVisible.value = true
|
||||||
dialogTitle.value = t('action.' + type)
|
dialogTitle.value = t('action.' + type)
|
||||||
formType.value = type
|
formType.value = type
|
||||||
@ -151,7 +150,7 @@ const openModal = async (type: string, id?: number) => {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
defineExpose({ openModal }) // 提供 openModal 方法,用于打开弹窗
|
defineExpose({ open }) // 提供 open 方法,用于打开弹窗
|
||||||
|
|
||||||
/** 提交表单 */
|
/** 提交表单 */
|
||||||
const emit = defineEmits(['success']) // 定义 success 事件,用于操作成功后的回调
|
const emit = defineEmits(['success']) // 定义 success 事件,用于操作成功后的回调
|
@ -1,6 +1,8 @@
|
|||||||
<template>
|
<template>
|
||||||
|
<doc-alert title="上传下载" url="https://doc.iocoder.cn/file/" />
|
||||||
|
|
||||||
<!-- 搜索 -->
|
<!-- 搜索 -->
|
||||||
<content-wrap>
|
<ContentWrap>
|
||||||
<el-form class="-mb-15px" :model="queryParams" ref="queryFormRef" :inline="true">
|
<el-form class="-mb-15px" :model="queryParams" ref="queryFormRef" :inline="true">
|
||||||
<el-form-item label="配置名" prop="name">
|
<el-form-item label="配置名" prop="name">
|
||||||
<el-input
|
<el-input
|
||||||
@ -13,10 +15,10 @@
|
|||||||
<el-form-item label="存储器" prop="storage">
|
<el-form-item label="存储器" prop="storage">
|
||||||
<el-select v-model="queryParams.storage" placeholder="请选择存储器" clearable>
|
<el-select v-model="queryParams.storage" placeholder="请选择存储器" clearable>
|
||||||
<el-option
|
<el-option
|
||||||
v-for="dict in getDictOptions(DICT_TYPE.INFRA_FILE_STORAGE)"
|
v-for="dict in getIntDictOptions(DICT_TYPE.INFRA_FILE_STORAGE)"
|
||||||
:key="parseInt(dict.value)"
|
:key="dict.value"
|
||||||
:label="dict.label"
|
:label="dict.label"
|
||||||
:value="parseInt(dict.value)"
|
:value="dict.value"
|
||||||
/>
|
/>
|
||||||
</el-select>
|
</el-select>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
@ -36,18 +38,18 @@
|
|||||||
<el-button
|
<el-button
|
||||||
type="primary"
|
type="primary"
|
||||||
plain
|
plain
|
||||||
@click="openModal('create')"
|
@click="openForm('create')"
|
||||||
v-hasPermi="['infra:file-config:create']"
|
v-hasPermi="['infra:file-config:create']"
|
||||||
>
|
>
|
||||||
<Icon icon="ep:plus" class="mr-5px" /> 新增
|
<Icon icon="ep:plus" class="mr-5px" /> 新增
|
||||||
</el-button>
|
</el-button>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-form>
|
</el-form>
|
||||||
</content-wrap>
|
</ContentWrap>
|
||||||
|
|
||||||
<!-- 列表 -->
|
<!-- 列表 -->
|
||||||
<content-wrap>
|
<ContentWrap>
|
||||||
<el-table v-loading="loading" :data="list" align="center">
|
<el-table v-loading="loading" :data="list">
|
||||||
<el-table-column label="编号" align="center" prop="id" />
|
<el-table-column label="编号" align="center" prop="id" />
|
||||||
<el-table-column label="配置名" align="center" prop="name" />
|
<el-table-column label="配置名" align="center" prop="name" />
|
||||||
<el-table-column label="存储器" align="center" prop="storage">
|
<el-table-column label="存储器" align="center" prop="storage">
|
||||||
@ -73,7 +75,7 @@
|
|||||||
<el-button
|
<el-button
|
||||||
link
|
link
|
||||||
type="primary"
|
type="primary"
|
||||||
@click="openModal('update', scope.row.id)"
|
@click="openForm('update', scope.row.id)"
|
||||||
v-hasPermi="['infra:file-config:update']"
|
v-hasPermi="['infra:file-config:update']"
|
||||||
>
|
>
|
||||||
编辑
|
编辑
|
||||||
@ -106,15 +108,15 @@
|
|||||||
v-model:limit="queryParams.pageSize"
|
v-model:limit="queryParams.pageSize"
|
||||||
@pagination="getList"
|
@pagination="getList"
|
||||||
/>
|
/>
|
||||||
</content-wrap>
|
</ContentWrap>
|
||||||
|
|
||||||
<!-- 表单弹窗:添加/修改 -->
|
<!-- 表单弹窗:添加/修改 -->
|
||||||
<file-config-form ref="modalRef" @success="getList" />
|
<FileConfigForm ref="formRef" @success="getList" />
|
||||||
</template>
|
</template>
|
||||||
<script setup lang="ts" name="Config">
|
<script setup lang="ts" name="Config">
|
||||||
import * as FileConfigApi from '@/api/infra/fileConfig'
|
import * as FileConfigApi from '@/api/infra/fileConfig'
|
||||||
import FileConfigForm from './form.vue'
|
import FileConfigForm from './FileConfigForm.vue'
|
||||||
import { DICT_TYPE, getDictOptions } from '@/utils/dict'
|
import { DICT_TYPE, getIntDictOptions } from '@/utils/dict'
|
||||||
import { dateFormatter } from '@/utils/formatTime'
|
import { dateFormatter } from '@/utils/formatTime'
|
||||||
const message = useMessage() // 消息弹窗
|
const message = useMessage() // 消息弹窗
|
||||||
const { t } = useI18n() // 国际化
|
const { t } = useI18n() // 国际化
|
||||||
@ -156,9 +158,9 @@ const resetQuery = () => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/** 添加/修改操作 */
|
/** 添加/修改操作 */
|
||||||
const modalRef = ref()
|
const formRef = ref()
|
||||||
const openModal = (type: string, id?: number) => {
|
const openForm = (type: string, id?: number) => {
|
||||||
modalRef.value.openModal(type, id)
|
formRef.value.open(type, id)
|
||||||
}
|
}
|
||||||
|
|
||||||
/** 删除按钮操作 */
|
/** 删除按钮操作 */
|
||||||
|
@ -1,5 +1,9 @@
|
|||||||
<template>
|
<template>
|
||||||
<content-wrap>
|
<doc-alert title="定时任务" url="https://doc.iocoder.cn/job/" />
|
||||||
|
<doc-alert title="异步任务" url="https://doc.iocoder.cn/async-task/" />
|
||||||
|
<doc-alert title="消息队列" url="https://doc.iocoder.cn/message-queue/" />
|
||||||
|
|
||||||
|
<ContentWrap>
|
||||||
<!-- 搜索工作栏 -->
|
<!-- 搜索工作栏 -->
|
||||||
<el-form
|
<el-form
|
||||||
class="-mb-15px"
|
class="-mb-15px"
|
||||||
@ -66,10 +70,10 @@
|
|||||||
</el-button>
|
</el-button>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-form>
|
</el-form>
|
||||||
</content-wrap>
|
</ContentWrap>
|
||||||
|
|
||||||
<!-- 列表 -->
|
<!-- 列表 -->
|
||||||
<content-wrap>
|
<ContentWrap>
|
||||||
<el-table v-loading="loading" :data="list">
|
<el-table v-loading="loading" :data="list">
|
||||||
<el-table-column label="任务编号" align="center" prop="id" />
|
<el-table-column label="任务编号" align="center" prop="id" />
|
||||||
<el-table-column label="任务名称" align="center" prop="name" />
|
<el-table-column label="任务名称" align="center" prop="name" />
|
||||||
@ -136,7 +140,7 @@
|
|||||||
v-model:limit="queryParams.pageSize"
|
v-model:limit="queryParams.pageSize"
|
||||||
@pagination="getList"
|
@pagination="getList"
|
||||||
/>
|
/>
|
||||||
</content-wrap>
|
</ContentWrap>
|
||||||
|
|
||||||
<!-- 表单弹窗:添加/修改 -->
|
<!-- 表单弹窗:添加/修改 -->
|
||||||
<JobForm ref="formRef" @success="getList" />
|
<JobForm ref="formRef" @success="getList" />
|
||||||
@ -271,7 +275,7 @@ const handleRun = async (row: JobApi.JobVO) => {
|
|||||||
// 二次确认
|
// 二次确认
|
||||||
await message.confirm('确认要立即执行一次' + row.name + '?', t('common.reminder'))
|
await message.confirm('确认要立即执行一次' + row.name + '?', t('common.reminder'))
|
||||||
// 提交执行
|
// 提交执行
|
||||||
await JobApi.runJobApi(row.id)
|
await JobApi.runJob(row.id)
|
||||||
message.success('执行成功')
|
message.success('执行成功')
|
||||||
// 刷新列表
|
// 刷新列表
|
||||||
await getList()
|
await getList()
|
||||||
@ -286,7 +290,7 @@ const openDetail = (id: number) => {
|
|||||||
|
|
||||||
/** 跳转执行日志 */
|
/** 跳转执行日志 */
|
||||||
const handleJobLog = (id: number) => {
|
const handleJobLog = (id: number) => {
|
||||||
if (id) {
|
if (id > 0) {
|
||||||
push('/job/job-log?id=' + id)
|
push('/job/job-log?id=' + id)
|
||||||
} else {
|
} else {
|
||||||
push('/job/job-log')
|
push('/job/job-log')
|
||||||
|
@ -1,5 +1,9 @@
|
|||||||
<template>
|
<template>
|
||||||
<content-wrap>
|
<doc-alert title="定时任务" url="https://doc.iocoder.cn/job/" />
|
||||||
|
<doc-alert title="异步任务" url="https://doc.iocoder.cn/async-task/" />
|
||||||
|
<doc-alert title="消息队列" url="https://doc.iocoder.cn/message-queue/" />
|
||||||
|
|
||||||
|
<ContentWrap>
|
||||||
<!-- 搜索工作栏 -->
|
<!-- 搜索工作栏 -->
|
||||||
<el-form
|
<el-form
|
||||||
class="-mb-15px"
|
class="-mb-15px"
|
||||||
@ -67,10 +71,10 @@
|
|||||||
</el-button>
|
</el-button>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-form>
|
</el-form>
|
||||||
</content-wrap>
|
</ContentWrap>
|
||||||
|
|
||||||
<!-- 列表 -->
|
<!-- 列表 -->
|
||||||
<content-wrap>
|
<ContentWrap>
|
||||||
<el-table v-loading="loading" :data="list">
|
<el-table v-loading="loading" :data="list">
|
||||||
<el-table-column label="日志编号" align="center" prop="id" />
|
<el-table-column label="日志编号" align="center" prop="id" />
|
||||||
<el-table-column label="任务编号" align="center" prop="jobId" />
|
<el-table-column label="任务编号" align="center" prop="jobId" />
|
||||||
@ -112,7 +116,7 @@
|
|||||||
v-model:limit="queryParams.pageSize"
|
v-model:limit="queryParams.pageSize"
|
||||||
@pagination="getList"
|
@pagination="getList"
|
||||||
/>
|
/>
|
||||||
</content-wrap>
|
</ContentWrap>
|
||||||
|
|
||||||
<!-- 表单弹窗:查看 -->
|
<!-- 表单弹窗:查看 -->
|
||||||
<JobLogDetail ref="detailRef" />
|
<JobLogDetail ref="detailRef" />
|
||||||
|
@ -1,6 +1,10 @@
|
|||||||
<template>
|
<template>
|
||||||
|
<doc-alert title="Redis 缓存" url="https://doc.iocoder.cn/redis-cache/" />
|
||||||
|
<doc-alert title="本地缓存" url="https://doc.iocoder.cn/local-cache/" />
|
||||||
|
|
||||||
<el-scrollbar height="calc(100vh - 88px - 40px - 50px)">
|
<el-scrollbar height="calc(100vh - 88px - 40px - 50px)">
|
||||||
<el-row>
|
<el-row>
|
||||||
|
<!-- 基本信息 -->
|
||||||
<el-col :span="24" class="card-box" shadow="hover">
|
<el-col :span="24" class="card-box" shadow="hover">
|
||||||
<el-card>
|
<el-card>
|
||||||
<el-descriptions title="基本信息" :column="6" border>
|
<el-descriptions title="基本信息" :column="6" border>
|
||||||
@ -44,106 +48,33 @@
|
|||||||
</el-descriptions>
|
</el-descriptions>
|
||||||
</el-card>
|
</el-card>
|
||||||
</el-col>
|
</el-col>
|
||||||
|
<!-- 命令统计 -->
|
||||||
<el-col :span="12" class="mt-3">
|
<el-col :span="12" class="mt-3">
|
||||||
<el-card :gutter="12" shadow="hover">
|
<el-card :gutter="12" shadow="hover">
|
||||||
<div ref="commandStatsRef" class="h-88"></div>
|
<div ref="commandStatsRef" class="h-88"></div>
|
||||||
</el-card>
|
</el-card>
|
||||||
</el-col>
|
</el-col>
|
||||||
|
<!-- 内存使用量统计 -->
|
||||||
<el-col :span="12" class="mt-3">
|
<el-col :span="12" class="mt-3">
|
||||||
<el-card class="ml-3" :gutter="12" shadow="hover">
|
<el-card class="ml-3" :gutter="12" shadow="hover">
|
||||||
<div ref="usedmemory" class="h-88"></div>
|
<div ref="usedmemory" class="h-88"></div>
|
||||||
</el-card>
|
</el-card>
|
||||||
</el-col>
|
</el-col>
|
||||||
</el-row>
|
</el-row>
|
||||||
<el-row class="mt-3">
|
|
||||||
<el-col :span="24" class="card-box" shadow="hover">
|
|
||||||
<el-card>
|
|
||||||
<el-table
|
|
||||||
v-loading="keyListLoad"
|
|
||||||
:data="keyList"
|
|
||||||
row-key="id"
|
|
||||||
@row-click="openKeyTemplate"
|
|
||||||
>
|
|
||||||
<el-table-column prop="keyTemplate" label="Key 模板" width="200" />
|
|
||||||
<el-table-column prop="keyType" label="Key 类型" width="100" />
|
|
||||||
<el-table-column prop="valueType" label="Value 类型" />
|
|
||||||
<el-table-column prop="timeoutType" label="超时时间" width="200">
|
|
||||||
<template #default="{ row }">
|
|
||||||
<DictTag :type="DICT_TYPE.INFRA_REDIS_TIMEOUT_TYPE" :value="row?.timeoutType" />
|
|
||||||
<span v-if="row?.timeout > 0">({{ row?.timeout / 1000 }} 秒)</span>
|
|
||||||
</template>
|
|
||||||
</el-table-column>
|
|
||||||
<el-table-column prop="memo" label="备注" />
|
|
||||||
</el-table>
|
|
||||||
</el-card>
|
|
||||||
</el-col>
|
|
||||||
</el-row>
|
|
||||||
</el-scrollbar>
|
</el-scrollbar>
|
||||||
<XModal v-model="dialogVisible" :title="keyTemplate + ' 模板'">
|
|
||||||
<el-row>
|
|
||||||
<el-col :span="14" class="mt-3">
|
|
||||||
<el-card shadow="always">
|
|
||||||
<template #header>
|
|
||||||
<div class="card-header">
|
|
||||||
<span>键名列表</span>
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
<el-table :data="cacheKeys" style="width: 100%" @row-click="handleKeyValue">
|
|
||||||
<el-table-column label="缓存键名" align="center" :show-overflow-tooltip="true">
|
|
||||||
<template #default="{ row }">
|
|
||||||
{{ row }}
|
|
||||||
</template>
|
|
||||||
</el-table-column>
|
|
||||||
<el-table-column label="操作" align="right" width="60">
|
|
||||||
<template #default="{ row }">
|
|
||||||
<XTextButton preIcon="ep:delete" @click="handleDeleteKey(row)" />
|
|
||||||
</template>
|
|
||||||
</el-table-column>
|
|
||||||
</el-table>
|
|
||||||
</el-card>
|
|
||||||
</el-col>
|
|
||||||
<el-col :span="10" class="mt-3">
|
|
||||||
<el-card shadow="always">
|
|
||||||
<template #header>
|
|
||||||
<div class="card-header">
|
|
||||||
<span>缓存内容</span>
|
|
||||||
<XTextButton
|
|
||||||
preIcon="ep:refresh"
|
|
||||||
title="清理全部"
|
|
||||||
@click="handleDeleteKeys(keyTemplate)"
|
|
||||||
class="float-right p-1"
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
<el-descriptions :column="1">
|
|
||||||
<el-descriptions-item label="缓存键名:">{{ cacheForm.key }}</el-descriptions-item>
|
|
||||||
<el-descriptions-item label="缓存内容:">{{ cacheForm.value }}</el-descriptions-item>
|
|
||||||
</el-descriptions>
|
|
||||||
</el-card>
|
|
||||||
</el-col>
|
|
||||||
</el-row>
|
|
||||||
</XModal>
|
|
||||||
</template>
|
</template>
|
||||||
<script setup lang="ts" name="Redis">
|
<script setup lang="ts" name="Redis">
|
||||||
import * as echarts from 'echarts'
|
import * as echarts from 'echarts'
|
||||||
import { DICT_TYPE } from '@/utils/dict'
|
|
||||||
|
|
||||||
import * as RedisApi from '@/api/infra/redis'
|
import * as RedisApi from '@/api/infra/redis'
|
||||||
import { RedisKeyInfo, RedisMonitorInfoVO } from '@/api/infra/redis/types'
|
import { RedisMonitorInfoVO } from '@/api/infra/redis/types'
|
||||||
|
|
||||||
const { t } = useI18n() // 国际化
|
|
||||||
const message = useMessage() // 消息弹窗
|
|
||||||
const cache = ref<RedisMonitorInfoVO>()
|
const cache = ref<RedisMonitorInfoVO>()
|
||||||
const keyListLoad = ref(true)
|
|
||||||
const keyList = ref<RedisKeyInfo[]>([])
|
|
||||||
// 基本信息
|
// 基本信息
|
||||||
const readRedisInfo = async () => {
|
const readRedisInfo = async () => {
|
||||||
const data = await RedisApi.getCacheApi()
|
const data = await RedisApi.getCache()
|
||||||
cache.value = data
|
cache.value = data
|
||||||
loadEchartOptions(data.commandStats)
|
loadEchartOptions(data.commandStats)
|
||||||
const redisKeysInfo = await RedisApi.getKeyDefineListApi()
|
|
||||||
keyList.value = redisKeysInfo
|
|
||||||
keyListLoad.value = false //加载完成
|
|
||||||
}
|
}
|
||||||
// 图表
|
// 图表
|
||||||
const commandStatsRef = ref<HTMLElement>()
|
const commandStatsRef = ref<HTMLElement>()
|
||||||
@ -238,40 +169,8 @@ const loadEchartOptions = (stats) => {
|
|||||||
]
|
]
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
const dialogVisible = ref(false)
|
|
||||||
const keyTemplate = ref('')
|
|
||||||
const cacheKeys = ref()
|
|
||||||
const cacheForm = ref<{
|
|
||||||
key: string
|
|
||||||
value: string
|
|
||||||
}>({
|
|
||||||
key: '',
|
|
||||||
value: ''
|
|
||||||
})
|
|
||||||
const openKeyTemplate = async (row: RedisKeyInfo) => {
|
|
||||||
keyTemplate.value = row.keyTemplate
|
|
||||||
cacheKeys.value = await RedisApi.getKeyListApi(row.keyTemplate)
|
|
||||||
dialogVisible.value = true
|
|
||||||
}
|
|
||||||
const handleDeleteKey = async (row) => {
|
|
||||||
RedisApi.deleteKeyApi(row)
|
|
||||||
message.success(t('common.delSuccess'))
|
|
||||||
}
|
|
||||||
const handleDeleteKeys = async (row) => {
|
|
||||||
RedisApi.deleteKeysApi(row)
|
|
||||||
message.success(t('common.delSuccess'))
|
|
||||||
}
|
|
||||||
const handleKeyValue = async (row) => {
|
|
||||||
const res = await RedisApi.getKeyValueApi(row)
|
|
||||||
cacheForm.value = res
|
|
||||||
}
|
|
||||||
onBeforeMount(() => {
|
onBeforeMount(() => {
|
||||||
readRedisInfo()
|
readRedisInfo()
|
||||||
})
|
})
|
||||||
</script>
|
</script>
|
||||||
<style scoped>
|
|
||||||
.redis {
|
|
||||||
height: 600px;
|
|
||||||
max-height: 860px;
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
<template>
|
<template>
|
||||||
|
<doc-alert title="服务监控" url="https://doc.iocoder.cn/server-monitor/" />
|
||||||
<ContentWrap>
|
<ContentWrap>
|
||||||
<IFrame :src="src" />
|
<IFrame :src="src" />
|
||||||
</ContentWrap>
|
</ContentWrap>
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
<template>
|
<template>
|
||||||
|
<doc-alert title="服务监控" url="https://doc.iocoder.cn/server-monitor/" />
|
||||||
<ContentWrap>
|
<ContentWrap>
|
||||||
<IFrame :src="src" />
|
<IFrame :src="src" />
|
||||||
</ContentWrap>
|
</ContentWrap>
|
||||||
|
@ -1,4 +1,6 @@
|
|||||||
<template>
|
<template>
|
||||||
|
<doc-alert title="接口文档" url="https://doc.iocoder.cn/api-doc/" />
|
||||||
|
|
||||||
<ContentWrap>
|
<ContentWrap>
|
||||||
<IFrame :src="src" />
|
<IFrame :src="src" />
|
||||||
</ContentWrap>
|
</ContentWrap>
|
||||||
|
@ -15,10 +15,8 @@
|
|||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-form>
|
</el-form>
|
||||||
<template #footer>
|
<template #footer>
|
||||||
<div class="dialog-footer">
|
<el-button @click="submitForm" type="primary" :disabled="formLoading">确 定</el-button>
|
||||||
<el-button @click="submitForm" type="primary" :disabled="formLoading">确 定</el-button>
|
<el-button @click="dialogVisible = false">取 消</el-button>
|
||||||
<el-button @click="dialogVisible = false">取 消</el-button>
|
|
||||||
</div>
|
|
||||||
</template>
|
</template>
|
||||||
</Dialog>
|
</Dialog>
|
||||||
</template>
|
</template>
|
||||||
|
@ -1,6 +1,8 @@
|
|||||||
<template>
|
<template>
|
||||||
|
<doc-alert title="公众号接入" url="https://doc.iocoder.cn/mp/account/" />
|
||||||
|
|
||||||
<!-- 搜索工作栏 -->
|
<!-- 搜索工作栏 -->
|
||||||
<content-wrap>
|
<ContentWrap>
|
||||||
<el-form
|
<el-form
|
||||||
class="-mb-15px"
|
class="-mb-15px"
|
||||||
:model="queryParams"
|
:model="queryParams"
|
||||||
@ -25,10 +27,10 @@
|
|||||||
</el-button>
|
</el-button>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-form>
|
</el-form>
|
||||||
</content-wrap>
|
</ContentWrap>
|
||||||
|
|
||||||
<!-- 列表 -->
|
<!-- 列表 -->
|
||||||
<content-wrap>
|
<ContentWrap>
|
||||||
<el-table v-loading="loading" :data="list">
|
<el-table v-loading="loading" :data="list">
|
||||||
<el-table-column label="名称" align="center" prop="name" />
|
<el-table-column label="名称" align="center" prop="name" />
|
||||||
<el-table-column label="微信号" align="center" prop="account" width="180" />
|
<el-table-column label="微信号" align="center" prop="account" width="180" />
|
||||||
@ -86,15 +88,14 @@
|
|||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
</el-table>
|
</el-table>
|
||||||
<!-- 分页组件 -->
|
<!-- 分页 -->
|
||||||
<pagination
|
<Pagination
|
||||||
v-show="total > 0"
|
|
||||||
:total="total"
|
:total="total"
|
||||||
v-model:page="queryParams.pageNo"
|
v-model:page="queryParams.pageNo"
|
||||||
v-model:limit="queryParams.pageSize"
|
v-model:limit="queryParams.pageSize"
|
||||||
@pagination="getList"
|
@pagination="getList"
|
||||||
/>
|
/>
|
||||||
</content-wrap>
|
</ContentWrap>
|
||||||
|
|
||||||
<!-- 对话框(添加 / 修改) -->
|
<!-- 对话框(添加 / 修改) -->
|
||||||
<AccountForm ref="formRef" @success="getList" />
|
<AccountForm ref="formRef" @success="getList" />
|
||||||
@ -102,7 +103,6 @@
|
|||||||
<script setup lang="ts" name="MpAccount">
|
<script setup lang="ts" name="MpAccount">
|
||||||
import * as AccountApi from '@/api/mp/account'
|
import * as AccountApi from '@/api/mp/account'
|
||||||
import AccountForm from './AccountForm.vue'
|
import AccountForm from './AccountForm.vue'
|
||||||
|
|
||||||
const message = useMessage() // 消息弹窗
|
const message = useMessage() // 消息弹窗
|
||||||
const { t } = useI18n() // 国际化
|
const { t } = useI18n() // 国际化
|
||||||
|
|
||||||
|
@ -1,6 +1,8 @@
|
|||||||
<template>
|
<template>
|
||||||
|
<doc-alert title="公众号图文" url="https://doc.iocoder.cn/mp/article/" />
|
||||||
|
|
||||||
<!-- 搜索工作栏 -->
|
<!-- 搜索工作栏 -->
|
||||||
<content-wrap>
|
<ContentWrap>
|
||||||
<el-form
|
<el-form
|
||||||
class="-mb-15px"
|
class="-mb-15px"
|
||||||
:model="queryParams"
|
:model="queryParams"
|
||||||
@ -23,10 +25,10 @@
|
|||||||
<el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> 重置</el-button>
|
<el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> 重置</el-button>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-form>
|
</el-form>
|
||||||
</content-wrap>
|
</ContentWrap>
|
||||||
|
|
||||||
<!-- 列表 -->
|
<!-- 列表 -->
|
||||||
<content-wrap>
|
<ContentWrap>
|
||||||
<div class="waterfall" v-loading="loading">
|
<div class="waterfall" v-loading="loading">
|
||||||
<div
|
<div
|
||||||
class="waterfall-item"
|
class="waterfall-item"
|
||||||
@ -54,7 +56,7 @@
|
|||||||
v-model:limit="queryParams.pageSize"
|
v-model:limit="queryParams.pageSize"
|
||||||
@pagination="getList"
|
@pagination="getList"
|
||||||
/>
|
/>
|
||||||
</content-wrap>
|
</ContentWrap>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup lang="ts" name="freePublish">
|
<script setup lang="ts" name="freePublish">
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
<template>
|
<template>
|
||||||
<!-- 搜索工作栏 -->
|
<!-- 搜索工作栏 -->
|
||||||
<content-wrap>
|
<ContentWrap>
|
||||||
<el-form class="-mb-15px" ref="queryForm" :inline="true" label-width="68px">
|
<el-form class="-mb-15px" ref="queryForm" :inline="true" label-width="68px">
|
||||||
<el-form-item label="公众号" prop="accountId">
|
<el-form-item label="公众号" prop="accountId">
|
||||||
<el-select v-model="accountId" @change="getSummary" class="!w-240px">
|
<el-select v-model="accountId" @change="getSummary" class="!w-240px">
|
||||||
@ -24,10 +24,10 @@
|
|||||||
/>
|
/>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-form>
|
</el-form>
|
||||||
</content-wrap>
|
</ContentWrap>
|
||||||
|
|
||||||
<!-- 图表 -->
|
<!-- 图表 -->
|
||||||
<content-wrap>
|
<ContentWrap>
|
||||||
<el-row>
|
<el-row>
|
||||||
<el-col :span="12" class="card-box">
|
<el-col :span="12" class="card-box">
|
||||||
<el-card>
|
<el-card>
|
||||||
@ -70,7 +70,7 @@
|
|||||||
</el-card>
|
</el-card>
|
||||||
</el-col>
|
</el-col>
|
||||||
</el-row>
|
</el-row>
|
||||||
</content-wrap>
|
</ContentWrap>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup lang="ts" name="MpStatistics">
|
<script setup lang="ts" name="MpStatistics">
|
||||||
|
@ -1,4 +1,6 @@
|
|||||||
<template>
|
<template>
|
||||||
|
<doc-alert title="公众号标签" url="https://doc.iocoder.cn/mp/tag/" />
|
||||||
|
|
||||||
<!-- 搜索工作栏 -->
|
<!-- 搜索工作栏 -->
|
||||||
<ContentWrap>
|
<ContentWrap>
|
||||||
<el-form
|
<el-form
|
||||||
|
@ -86,9 +86,9 @@ const message = useMessage() // 消息弹窗
|
|||||||
// 列表相关的变量
|
// 列表相关的变量
|
||||||
const [registerTable, { reload, deleteData, exportList }] = useXTable({
|
const [registerTable, { reload, deleteData, exportList }] = useXTable({
|
||||||
allSchemas: allSchemas,
|
allSchemas: allSchemas,
|
||||||
getListApi: AppApi.getAppPageApi,
|
getListApi: AppApi.getAppPage,
|
||||||
deleteApi: AppApi.deleteAppApi,
|
deleteApi: AppApi.deleteApp,
|
||||||
exportListApi: AppApi.exportAppApi
|
exportListApi: AppApi.exportApp
|
||||||
})
|
})
|
||||||
|
|
||||||
// ========== CRUD 相关 ==========
|
// ========== CRUD 相关 ==========
|
||||||
@ -115,14 +115,14 @@ const handleCreate = () => {
|
|||||||
const handleUpdate = async (rowId: number) => {
|
const handleUpdate = async (rowId: number) => {
|
||||||
setDialogTile('update')
|
setDialogTile('update')
|
||||||
// 设置数据
|
// 设置数据
|
||||||
const res = await AppApi.getAppApi(rowId)
|
const res = await AppApi.getApp(rowId)
|
||||||
unref(formRef)?.setValues(res)
|
unref(formRef)?.setValues(res)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 详情操作
|
// 详情操作
|
||||||
const handleDetail = async (rowId: number) => {
|
const handleDetail = async (rowId: number) => {
|
||||||
setDialogTile('detail')
|
setDialogTile('detail')
|
||||||
const res = await AppApi.getAppApi(rowId)
|
const res = await AppApi.getApp(rowId)
|
||||||
detailData.value = res
|
detailData.value = res
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -137,10 +137,10 @@ const submitForm = async () => {
|
|||||||
try {
|
try {
|
||||||
const data = unref(formRef)?.formModel as AppApi.AppVO
|
const data = unref(formRef)?.formModel as AppApi.AppVO
|
||||||
if (actionType.value === 'create') {
|
if (actionType.value === 'create') {
|
||||||
await AppApi.createAppApi(data)
|
await AppApi.createApp(data)
|
||||||
message.success(t('common.createSuccess'))
|
message.success(t('common.createSuccess'))
|
||||||
} else {
|
} else {
|
||||||
await AppApi.updateAppApi(data)
|
await AppApi.updateApp(data)
|
||||||
message.success(t('common.updateSuccess'))
|
message.success(t('common.updateSuccess'))
|
||||||
}
|
}
|
||||||
dialogVisible.value = false
|
dialogVisible.value = false
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
<template>
|
<template>
|
||||||
<content-wrap>
|
<ContentWrap>
|
||||||
<!-- 搜索工作栏 -->
|
<!-- 搜索工作栏 -->
|
||||||
<el-form
|
<el-form
|
||||||
class="-mb-15px"
|
class="-mb-15px"
|
||||||
@ -77,10 +77,10 @@
|
|||||||
</el-button>
|
</el-button>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-form>
|
</el-form>
|
||||||
</content-wrap>
|
</ContentWrap>
|
||||||
|
|
||||||
<!-- 列表 -->
|
<!-- 列表 -->
|
||||||
<content-wrap>
|
<ContentWrap>
|
||||||
<el-table v-loading="loading" :data="list">
|
<el-table v-loading="loading" :data="list">
|
||||||
<el-table-column label="商户编号" align="center" prop="id" />
|
<el-table-column label="商户编号" align="center" prop="id" />
|
||||||
<el-table-column label="商户号" align="center" prop="no" />
|
<el-table-column label="商户号" align="center" prop="no" />
|
||||||
@ -132,7 +132,7 @@
|
|||||||
v-model:limit="queryParams.pageSize"
|
v-model:limit="queryParams.pageSize"
|
||||||
@pagination="getList"
|
@pagination="getList"
|
||||||
/>
|
/>
|
||||||
</content-wrap>
|
</ContentWrap>
|
||||||
|
|
||||||
<!-- 表单弹窗:添加/修改 -->
|
<!-- 表单弹窗:添加/修改 -->
|
||||||
<MerchantForm ref="formRef" @success="getList" />
|
<MerchantForm ref="formRef" @success="getList" />
|
||||||
|
@ -49,8 +49,8 @@ const { t } = useI18n() // 国际化
|
|||||||
// 列表相关的变量
|
// 列表相关的变量
|
||||||
const [registerTable, { exportList }] = useXTable({
|
const [registerTable, { exportList }] = useXTable({
|
||||||
allSchemas: allSchemas,
|
allSchemas: allSchemas,
|
||||||
getListApi: OrderApi.getOrderPageApi,
|
getListApi: OrderApi.getOrderPage,
|
||||||
exportListApi: OrderApi.exportOrderApi
|
exportListApi: OrderApi.exportOrder
|
||||||
})
|
})
|
||||||
// ========== CRUD 相关 ==========
|
// ========== CRUD 相关 ==========
|
||||||
const actionLoading = ref(false) // 遮罩层
|
const actionLoading = ref(false) // 遮罩层
|
||||||
@ -73,7 +73,7 @@ const handleCreate = () => {
|
|||||||
// 详情操作
|
// 详情操作
|
||||||
const handleDetail = async (rowId: number) => {
|
const handleDetail = async (rowId: number) => {
|
||||||
setDialogTile('detail')
|
setDialogTile('detail')
|
||||||
const res = await OrderApi.getOrderApi(rowId)
|
const res = await OrderApi.getOrder(rowId)
|
||||||
detailData.value = res
|
detailData.value = res
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
@ -42,8 +42,8 @@ const { t } = useI18n() // 国际化
|
|||||||
// 列表相关的变量
|
// 列表相关的变量
|
||||||
const [registerTable, { exportList }] = useXTable({
|
const [registerTable, { exportList }] = useXTable({
|
||||||
allSchemas: allSchemas,
|
allSchemas: allSchemas,
|
||||||
getListApi: RefundApi.getRefundPageApi,
|
getListApi: RefundApi.getRefundPage,
|
||||||
exportListApi: RefundApi.exportRefundApi
|
exportListApi: RefundApi.exportRefund
|
||||||
})
|
})
|
||||||
|
|
||||||
// ========== CRUD 相关 ==========
|
// ========== CRUD 相关 ==========
|
||||||
@ -53,7 +53,7 @@ const detailData = ref() // 详情 Ref
|
|||||||
// 详情操作
|
// 详情操作
|
||||||
const handleDetail = async (rowId: number) => {
|
const handleDetail = async (rowId: number) => {
|
||||||
// 设置数据
|
// 设置数据
|
||||||
detailData.value = RefundApi.getRefundApi(rowId)
|
detailData.value = RefundApi.getRefund(rowId)
|
||||||
dialogVisible.value = true
|
dialogVisible.value = true
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
@ -36,11 +36,11 @@ const formRules = reactive({
|
|||||||
const formRef = ref() // 表单 Ref
|
const formRef = ref() // 表单 Ref
|
||||||
|
|
||||||
/** 打开弹窗 */
|
/** 打开弹窗 */
|
||||||
const openModal = async () => {
|
const open = async () => {
|
||||||
dialogVisible.value = true
|
dialogVisible.value = true
|
||||||
resetForm()
|
resetForm()
|
||||||
}
|
}
|
||||||
defineExpose({ openModal }) // 提供 openModal 方法,用于打开弹窗
|
defineExpose({ open }) // 提供 open 方法,用于打开弹窗
|
||||||
|
|
||||||
/** 提交表单 */
|
/** 提交表单 */
|
||||||
const submitForm = async () => {
|
const submitForm = async () => {
|
@ -1,13 +1,15 @@
|
|||||||
<template>
|
<template>
|
||||||
|
<doc-alert title="地区 & IP" url="https://doc.iocoder.cn/area-and-ip/" />
|
||||||
|
|
||||||
<!-- 操作栏 -->
|
<!-- 操作栏 -->
|
||||||
<content-wrap>
|
<ContentWrap>
|
||||||
<el-button type="primary" plain @click="openModal()">
|
<el-button type="primary" plain @click="openForm()">
|
||||||
<Icon icon="ep:plus" class="mr-5px" /> IP 查询
|
<Icon icon="ep:plus" class="mr-5px" /> IP 查询
|
||||||
</el-button>
|
</el-button>
|
||||||
</content-wrap>
|
</ContentWrap>
|
||||||
|
|
||||||
<!-- 列表 -->
|
<!-- 列表 -->
|
||||||
<content-wrap>
|
<ContentWrap>
|
||||||
<div style="width: 100%; height: 700px">
|
<div style="width: 100%; height: 700px">
|
||||||
<!-- AutoResizer 自动调节大小 -->
|
<!-- AutoResizer 自动调节大小 -->
|
||||||
<el-auto-resizer>
|
<el-auto-resizer>
|
||||||
@ -23,14 +25,14 @@
|
|||||||
</template>
|
</template>
|
||||||
</el-auto-resizer>
|
</el-auto-resizer>
|
||||||
</div>
|
</div>
|
||||||
</content-wrap>
|
</ContentWrap>
|
||||||
|
|
||||||
<!-- 表单弹窗:添加/修改 -->
|
<!-- 表单弹窗:添加/修改 -->
|
||||||
<area-form ref="modalRef" />
|
<AreaForm ref="formRef" />
|
||||||
</template>
|
</template>
|
||||||
<script setup lang="tsx" name="Area">
|
<script setup lang="tsx" name="Area">
|
||||||
import type { Column } from 'element-plus'
|
import type { Column } from 'element-plus'
|
||||||
import AreaForm from './form.vue'
|
import AreaForm from './AreaForm.vue'
|
||||||
import * as AreaApi from '@/api/system/area'
|
import * as AreaApi from '@/api/system/area'
|
||||||
|
|
||||||
// 表格的 column 字段
|
// 表格的 column 字段
|
||||||
@ -59,9 +61,9 @@ const getList = async () => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/** 添加/修改操作 */
|
/** 添加/修改操作 */
|
||||||
const modalRef = ref()
|
const formRef = ref()
|
||||||
const openModal = () => {
|
const openForm = () => {
|
||||||
modalRef.value.openModal()
|
formRef.value.open()
|
||||||
}
|
}
|
||||||
|
|
||||||
/** 初始化 **/
|
/** 初始化 **/
|
||||||
|
@ -11,7 +11,7 @@
|
|||||||
<el-tree-select
|
<el-tree-select
|
||||||
v-model="formData.parentId"
|
v-model="formData.parentId"
|
||||||
:data="deptTree"
|
:data="deptTree"
|
||||||
:props="{ value: 'id', label: 'name', children: 'children' }"
|
:props="defaultProps"
|
||||||
value-key="deptId"
|
value-key="deptId"
|
||||||
placeholder="请选择上级部门"
|
placeholder="请选择上级部门"
|
||||||
check-strictly
|
check-strictly
|
||||||
@ -25,12 +25,7 @@
|
|||||||
<el-input-number v-model="formData.sort" controls-position="right" :min="0" />
|
<el-input-number v-model="formData.sort" controls-position="right" :min="0" />
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="负责人" prop="leaderUserId">
|
<el-form-item label="负责人" prop="leaderUserId">
|
||||||
<el-select
|
<el-select v-model="formData.leaderUserId" placeholder="请输入负责人" clearable>
|
||||||
v-model="formData.leaderUserId"
|
|
||||||
placeholder="请输入负责人"
|
|
||||||
clearable
|
|
||||||
style="width: 100%"
|
|
||||||
>
|
|
||||||
<el-option
|
<el-option
|
||||||
v-for="item in userList"
|
v-for="item in userList"
|
||||||
:key="item.id"
|
:key="item.id"
|
||||||
@ -64,7 +59,7 @@
|
|||||||
</template>
|
</template>
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { DICT_TYPE, getIntDictOptions } from '@/utils/dict'
|
import { DICT_TYPE, getIntDictOptions } from '@/utils/dict'
|
||||||
import { handleTree } from '@/utils/tree'
|
import { handleTree, defaultProps } from '@/utils/tree'
|
||||||
import * as DeptApi from '@/api/system/dept'
|
import * as DeptApi from '@/api/system/dept'
|
||||||
import * as UserApi from '@/api/system/user'
|
import * as UserApi from '@/api/system/user'
|
||||||
import { CommonStatusEnum } from '@/utils/constants'
|
import { CommonStatusEnum } from '@/utils/constants'
|
||||||
@ -93,7 +88,8 @@ const formRules = reactive({
|
|||||||
email: [{ type: 'email', message: '请输入正确的邮箱地址', trigger: ['blur', 'change'] }],
|
email: [{ type: 'email', message: '请输入正确的邮箱地址', trigger: ['blur', 'change'] }],
|
||||||
phone: [
|
phone: [
|
||||||
{ pattern: /^1[3|4|5|6|7|8|9][0-9]\d{8}$/, message: '请输入正确的手机号码', trigger: 'blur' }
|
{ pattern: /^1[3|4|5|6|7|8|9][0-9]\d{8}$/, message: '请输入正确的手机号码', trigger: 'blur' }
|
||||||
]
|
],
|
||||||
|
status: [{ required: true, message: '状态不能为空', trigger: 'blur' }]
|
||||||
})
|
})
|
||||||
const formRef = ref() // 表单 Ref
|
const formRef = ref() // 表单 Ref
|
||||||
const deptTree = ref() // 树形结构
|
const deptTree = ref() // 树形结构
|
||||||
@ -109,7 +105,7 @@ const open = async (type: string, id?: number) => {
|
|||||||
if (id) {
|
if (id) {
|
||||||
formLoading.value = true
|
formLoading.value = true
|
||||||
try {
|
try {
|
||||||
formData.value = await DeptApi.getDeptApi(id)
|
formData.value = await DeptApi.getDept(id)
|
||||||
} finally {
|
} finally {
|
||||||
formLoading.value = false
|
formLoading.value = false
|
||||||
}
|
}
|
||||||
@ -133,10 +129,10 @@ const submitForm = async () => {
|
|||||||
try {
|
try {
|
||||||
const data = formData.value as unknown as DeptApi.DeptVO
|
const data = formData.value as unknown as DeptApi.DeptVO
|
||||||
if (formType.value === 'create') {
|
if (formType.value === 'create') {
|
||||||
await DeptApi.createDeptApi(data)
|
await DeptApi.createDept(data)
|
||||||
message.success(t('common.createSuccess'))
|
message.success(t('common.createSuccess'))
|
||||||
} else {
|
} else {
|
||||||
await DeptApi.updateDeptApi(data)
|
await DeptApi.updateDept(data)
|
||||||
message.success(t('common.updateSuccess'))
|
message.success(t('common.updateSuccess'))
|
||||||
}
|
}
|
||||||
dialogVisible.value = false
|
dialogVisible.value = false
|
||||||
|
@ -51,7 +51,13 @@
|
|||||||
|
|
||||||
<!-- 列表 -->
|
<!-- 列表 -->
|
||||||
<ContentWrap>
|
<ContentWrap>
|
||||||
<el-table v-loading="loading" :data="list" row-key="id" default-expand-all v-if="refreshTable">
|
<el-table
|
||||||
|
v-loading="loading"
|
||||||
|
:data="list"
|
||||||
|
row-key="id"
|
||||||
|
:default-expand-all="isExpandAll"
|
||||||
|
v-if="refreshTable"
|
||||||
|
>
|
||||||
<el-table-column prop="name" label="部门名称" width="260" />
|
<el-table-column prop="name" label="部门名称" width="260" />
|
||||||
<el-table-column prop="leader" label="负责人" width="120">
|
<el-table-column prop="leader" label="负责人" width="120">
|
||||||
<template #default="scope">
|
<template #default="scope">
|
||||||
@ -125,7 +131,7 @@ const userList = ref<UserApi.UserVO[]>([]) // 用户列表
|
|||||||
const getList = async () => {
|
const getList = async () => {
|
||||||
loading.value = true
|
loading.value = true
|
||||||
try {
|
try {
|
||||||
const data = await DeptApi.getDeptPageApi(queryParams)
|
const data = await DeptApi.getDeptPage(queryParams)
|
||||||
list.value = handleTree(data)
|
list.value = handleTree(data)
|
||||||
} finally {
|
} finally {
|
||||||
loading.value = false
|
loading.value = false
|
||||||
@ -136,7 +142,6 @@ const getList = async () => {
|
|||||||
const toggleExpandAll = () => {
|
const toggleExpandAll = () => {
|
||||||
refreshTable.value = false
|
refreshTable.value = false
|
||||||
isExpandAll.value = !isExpandAll.value
|
isExpandAll.value = !isExpandAll.value
|
||||||
console.log(isExpandAll.value)
|
|
||||||
nextTick(() => {
|
nextTick(() => {
|
||||||
refreshTable.value = true
|
refreshTable.value = true
|
||||||
})
|
})
|
||||||
@ -166,7 +171,7 @@ const handleDelete = async (id: number) => {
|
|||||||
// 删除的二次确认
|
// 删除的二次确认
|
||||||
await message.delConfirm()
|
await message.delConfirm()
|
||||||
// 发起删除
|
// 发起删除
|
||||||
await DeptApi.deleteDeptApi(id)
|
await DeptApi.deleteDept(id)
|
||||||
message.success(t('common.delSuccess'))
|
message.success(t('common.delSuccess'))
|
||||||
// 刷新列表
|
// 刷新列表
|
||||||
await getList()
|
await getList()
|
||||||
|
@ -20,14 +20,14 @@
|
|||||||
<el-form-item label="状态" prop="status">
|
<el-form-item label="状态" prop="status">
|
||||||
<el-radio-group v-model="formData.status">
|
<el-radio-group v-model="formData.status">
|
||||||
<el-radio
|
<el-radio
|
||||||
v-for="dict in getDictOptions(DICT_TYPE.COMMON_STATUS)"
|
v-for="dict in getIntDictOptions(DICT_TYPE.COMMON_STATUS)"
|
||||||
:key="parseInt(dict.value)"
|
:key="dict.value"
|
||||||
:label="parseInt(dict.value)"
|
:label="dict.value"
|
||||||
>{{ dict.label }}</el-radio
|
|
||||||
>
|
>
|
||||||
|
{{ dict.label }}
|
||||||
|
</el-radio>
|
||||||
</el-radio-group>
|
</el-radio-group>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
|
|
||||||
<el-form-item label="备注" prop="remark">
|
<el-form-item label="备注" prop="remark">
|
||||||
<el-input v-model="formData.remark" type="textarea" placeholder="请输入内容" />
|
<el-input v-model="formData.remark" type="textarea" placeholder="请输入内容" />
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
@ -39,10 +39,9 @@
|
|||||||
</Dialog>
|
</Dialog>
|
||||||
</template>
|
</template>
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { DICT_TYPE, getDictOptions } from '@/utils/dict'
|
import { DICT_TYPE, getIntDictOptions } from '@/utils/dict'
|
||||||
import * as DictTypeApi from '@/api/system/dict/dict.type'
|
import * as DictTypeApi from '@/api/system/dict/dict.type'
|
||||||
import { CommonStatusEnum } from '@/utils/constants'
|
import { CommonStatusEnum } from '@/utils/constants'
|
||||||
|
|
||||||
const { t } = useI18n() // 国际化
|
const { t } = useI18n() // 国际化
|
||||||
const message = useMessage() // 消息弹窗
|
const message = useMessage() // 消息弹窗
|
||||||
|
|
||||||
@ -64,7 +63,7 @@ const formRules = reactive({
|
|||||||
const formRef = ref() // 表单 Ref
|
const formRef = ref() // 表单 Ref
|
||||||
|
|
||||||
/** 打开弹窗 */
|
/** 打开弹窗 */
|
||||||
const openModal = async (type: string, id?: number) => {
|
const open = async (type: string, id?: number) => {
|
||||||
dialogVisible.value = true
|
dialogVisible.value = true
|
||||||
dialogTitle.value = t('action.' + type)
|
dialogTitle.value = t('action.' + type)
|
||||||
formType.value = type
|
formType.value = type
|
||||||
@ -79,7 +78,7 @@ const openModal = async (type: string, id?: number) => {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
defineExpose({ openModal }) // 提供 openModal 方法,用于打开弹窗
|
defineExpose({ open }) // 提供 open 方法,用于打开弹窗
|
||||||
|
|
||||||
/** 提交表单 */
|
/** 提交表单 */
|
||||||
const emit = defineEmits(['success']) // 定义 success 事件,用于操作成功后的回调
|
const emit = defineEmits(['success']) // 定义 success 事件,用于操作成功后的回调
|
@ -26,11 +26,12 @@
|
|||||||
<el-form-item label="状态" prop="status">
|
<el-form-item label="状态" prop="status">
|
||||||
<el-radio-group v-model="formData.status">
|
<el-radio-group v-model="formData.status">
|
||||||
<el-radio
|
<el-radio
|
||||||
v-for="dict in getDictOptions(DICT_TYPE.COMMON_STATUS)"
|
v-for="dict in getIntDictOptions(DICT_TYPE.COMMON_STATUS)"
|
||||||
:key="parseInt(dict.value)"
|
:key="dict.value"
|
||||||
:label="parseInt(dict.value)"
|
:label="dict.value"
|
||||||
>{{ dict.label }}</el-radio
|
|
||||||
>
|
>
|
||||||
|
{{ dict.label }}
|
||||||
|
</el-radio>
|
||||||
</el-radio-group>
|
</el-radio-group>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="颜色类型" prop="colorType">
|
<el-form-item label="颜色类型" prop="colorType">
|
||||||
@ -57,7 +58,7 @@
|
|||||||
</Dialog>
|
</Dialog>
|
||||||
</template>
|
</template>
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { DICT_TYPE, getDictOptions } from '@/utils/dict'
|
import { DICT_TYPE, getIntDictOptions } from '@/utils/dict'
|
||||||
import * as DictDataApi from '@/api/system/dict/dict.data'
|
import * as DictDataApi from '@/api/system/dict/dict.data'
|
||||||
import { CommonStatusEnum } from '@/utils/constants'
|
import { CommonStatusEnum } from '@/utils/constants'
|
||||||
const { t } = useI18n() // 国际化
|
const { t } = useI18n() // 国际化
|
||||||
@ -114,7 +115,7 @@ const colorTypeOptions = readonly([
|
|||||||
])
|
])
|
||||||
|
|
||||||
/** 打开弹窗 */
|
/** 打开弹窗 */
|
||||||
const openModal = async (type: string, id?: number) => {
|
const open = async (type: string, id?: number) => {
|
||||||
dialogVisible.value = true
|
dialogVisible.value = true
|
||||||
dialogTitle.value = t('action.' + type)
|
dialogTitle.value = t('action.' + type)
|
||||||
formType.value = type
|
formType.value = type
|
||||||
@ -129,7 +130,7 @@ const openModal = async (type: string, id?: number) => {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
defineExpose({ openModal }) // 提供 openModal 方法,用于打开弹窗
|
defineExpose({ open }) // 提供 open 方法,用于打开弹窗
|
||||||
|
|
||||||
/** 提交表单 */
|
/** 提交表单 */
|
||||||
const emit = defineEmits(['success']) // 定义 success 事件,用于操作成功后的回调
|
const emit = defineEmits(['success']) // 定义 success 事件,用于操作成功后的回调
|
@ -1,5 +1,5 @@
|
|||||||
<template>
|
<template>
|
||||||
<content-wrap>
|
<ContentWrap>
|
||||||
<el-form
|
<el-form
|
||||||
class="-mb-15px"
|
class="-mb-15px"
|
||||||
:model="queryParams"
|
:model="queryParams"
|
||||||
@ -9,7 +9,12 @@
|
|||||||
>
|
>
|
||||||
<el-form-item label="字典名称" prop="dictType">
|
<el-form-item label="字典名称" prop="dictType">
|
||||||
<el-select v-model="queryParams.dictType" class="!w-240px">
|
<el-select v-model="queryParams.dictType" class="!w-240px">
|
||||||
<el-option v-for="item in dicts" :key="item.type" :label="item.name" :value="item.type" />
|
<el-option
|
||||||
|
v-for="item in dictTypeList"
|
||||||
|
:key="item.type"
|
||||||
|
:label="item.name"
|
||||||
|
:value="item.type"
|
||||||
|
/>
|
||||||
</el-select>
|
</el-select>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="字典标签" prop="label">
|
<el-form-item label="字典标签" prop="label">
|
||||||
@ -24,7 +29,7 @@
|
|||||||
<el-form-item label="状态" prop="status">
|
<el-form-item label="状态" prop="status">
|
||||||
<el-select v-model="queryParams.status" placeholder="数据状态" clearable class="!w-240px">
|
<el-select v-model="queryParams.status" placeholder="数据状态" clearable class="!w-240px">
|
||||||
<el-option
|
<el-option
|
||||||
v-for="dict in getDictOptions(DICT_TYPE.COMMON_STATUS)"
|
v-for="dict in getIntDictOptions(DICT_TYPE.COMMON_STATUS)"
|
||||||
:key="dict.value"
|
:key="dict.value"
|
||||||
:label="dict.label"
|
:label="dict.label"
|
||||||
:value="dict.value"
|
:value="dict.value"
|
||||||
@ -34,7 +39,12 @@
|
|||||||
<el-form-item>
|
<el-form-item>
|
||||||
<el-button @click="handleQuery"><Icon icon="ep:search" class="mr-5px" /> 搜索</el-button>
|
<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 @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> 重置</el-button>
|
||||||
<el-button type="primary" @click="openModal('create')" v-hasPermi="['system:dict:create']">
|
<el-button
|
||||||
|
type="primary"
|
||||||
|
plain
|
||||||
|
@click="openForm('create')"
|
||||||
|
v-hasPermi="['system:dict:create']"
|
||||||
|
>
|
||||||
<Icon icon="ep:plus" class="mr-5px" /> 新增
|
<Icon icon="ep:plus" class="mr-5px" /> 新增
|
||||||
</el-button>
|
</el-button>
|
||||||
<el-button
|
<el-button
|
||||||
@ -48,10 +58,10 @@
|
|||||||
</el-button>
|
</el-button>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-form>
|
</el-form>
|
||||||
</content-wrap>
|
</ContentWrap>
|
||||||
|
|
||||||
<!-- 列表 -->
|
<!-- 列表 -->
|
||||||
<content-wrap>
|
<ContentWrap>
|
||||||
<el-table v-loading="loading" :data="list">
|
<el-table v-loading="loading" :data="list">
|
||||||
<el-table-column label="字典编码" align="center" prop="id" />
|
<el-table-column label="字典编码" align="center" prop="id" />
|
||||||
<el-table-column label="字典标签" align="center" prop="label" />
|
<el-table-column label="字典标签" align="center" prop="label" />
|
||||||
@ -77,7 +87,7 @@
|
|||||||
<el-button
|
<el-button
|
||||||
link
|
link
|
||||||
type="primary"
|
type="primary"
|
||||||
@click="openModal('update', scope.row.id)"
|
@click="openForm('update', scope.row.id)"
|
||||||
v-hasPermi="['system:dict:update']"
|
v-hasPermi="['system:dict:update']"
|
||||||
>
|
>
|
||||||
修改
|
修改
|
||||||
@ -100,18 +110,18 @@
|
|||||||
v-model:limit="queryParams.pageSize"
|
v-model:limit="queryParams.pageSize"
|
||||||
@pagination="getList"
|
@pagination="getList"
|
||||||
/>
|
/>
|
||||||
</content-wrap>
|
</ContentWrap>
|
||||||
|
|
||||||
<!-- 表单弹窗:添加/修改 -->
|
<!-- 表单弹窗:添加/修改 -->
|
||||||
<data-form ref="modalRef" @success="getList" />
|
<DictDataForm ref="formRef" @success="getList" />
|
||||||
</template>
|
</template>
|
||||||
<script setup lang="ts" name="Data">
|
<script setup lang="ts" name="DictData">
|
||||||
|
import { getIntDictOptions, DICT_TYPE } from '@/utils/dict'
|
||||||
|
import { dateFormatter } from '@/utils/formatTime'
|
||||||
|
import download from '@/utils/download'
|
||||||
import * as DictDataApi from '@/api/system/dict/dict.data'
|
import * as DictDataApi from '@/api/system/dict/dict.data'
|
||||||
import * as DictTypeApi from '@/api/system/dict/dict.type'
|
import * as DictTypeApi from '@/api/system/dict/dict.type'
|
||||||
import { getDictOptions, DICT_TYPE } from '@/utils/dict'
|
import DictDataForm from './DictDataForm.vue'
|
||||||
import download from '@/utils/download'
|
|
||||||
import { dateFormatter } from '@/utils/formatTime'
|
|
||||||
import DataForm from './data.form.vue'
|
|
||||||
const message = useMessage() // 消息弹窗
|
const message = useMessage() // 消息弹窗
|
||||||
const { t } = useI18n() // 国际化
|
const { t } = useI18n() // 国际化
|
||||||
const route = useRoute() // 路由
|
const route = useRoute() // 路由
|
||||||
@ -128,7 +138,7 @@ const queryParams = reactive({
|
|||||||
})
|
})
|
||||||
const queryFormRef = ref() // 搜索的表单
|
const queryFormRef = ref() // 搜索的表单
|
||||||
const exportLoading = ref(false) // 导出的加载中
|
const exportLoading = ref(false) // 导出的加载中
|
||||||
const dicts = ref<DictTypeApi.DictTypeVO[]>() // 字典类型的列表
|
const dictTypeList = ref<DictTypeApi.DictTypeVO[]>() // 字典类型的列表
|
||||||
|
|
||||||
/** 查询列表 */
|
/** 查询列表 */
|
||||||
const getList = async () => {
|
const getList = async () => {
|
||||||
@ -155,9 +165,9 @@ const resetQuery = () => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/** 添加/修改操作 */
|
/** 添加/修改操作 */
|
||||||
const modalRef = ref()
|
const formRef = ref()
|
||||||
const openModal = (type: string, id?: number) => {
|
const openForm = (type: string, id?: number) => {
|
||||||
modalRef.value.openModal(type, id)
|
formRef.value.open(type, id)
|
||||||
}
|
}
|
||||||
|
|
||||||
/** 删除按钮操作 */
|
/** 删除按钮操作 */
|
||||||
@ -188,15 +198,10 @@ const handleExport = async () => {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/** 查询字典(精简)列表 */
|
|
||||||
const getDictList = async () => {
|
|
||||||
dicts.value = await DictTypeApi.getSimpleDictTypeList()
|
|
||||||
}
|
|
||||||
|
|
||||||
/** 初始化 **/
|
/** 初始化 **/
|
||||||
onMounted(() => {
|
onMounted(async () => {
|
||||||
getList()
|
await getList()
|
||||||
// 查询字典(精简)列表
|
// 查询字典(精简)列表
|
||||||
getDictList()
|
dictTypeList.value = await DictTypeApi.getSimpleDictTypeList()
|
||||||
})
|
})
|
||||||
</script>
|
</script>
|
@ -1,6 +1,6 @@
|
|||||||
<template>
|
<template>
|
||||||
<!-- 搜索工作栏 -->
|
<!-- 搜索工作栏 -->
|
||||||
<content-wrap>
|
<ContentWrap>
|
||||||
<el-form
|
<el-form
|
||||||
class="-mb-15px"
|
class="-mb-15px"
|
||||||
:model="queryParams"
|
:model="queryParams"
|
||||||
@ -27,10 +27,15 @@
|
|||||||
/>
|
/>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="状态" prop="status">
|
<el-form-item label="状态" prop="status">
|
||||||
<el-select v-model="queryParams.status" placeholder="字典状态" clearable class="!w-240px">
|
<el-select
|
||||||
|
v-model="queryParams.status"
|
||||||
|
placeholder="请选择字典状态"
|
||||||
|
clearable
|
||||||
|
class="!w-240px"
|
||||||
|
>
|
||||||
<el-option
|
<el-option
|
||||||
v-for="dict in getDictOptions(DICT_TYPE.COMMON_STATUS)"
|
v-for="dict in getIntDictOptions(DICT_TYPE.COMMON_STATUS)"
|
||||||
:key="parseInt(dict.value)"
|
:key="dict.value"
|
||||||
:label="dict.label"
|
:label="dict.label"
|
||||||
:value="dict.value"
|
:value="dict.value"
|
||||||
/>
|
/>
|
||||||
@ -53,7 +58,7 @@
|
|||||||
<el-button
|
<el-button
|
||||||
type="primary"
|
type="primary"
|
||||||
plain
|
plain
|
||||||
@click="openModal('create')"
|
@click="openForm('create')"
|
||||||
v-hasPermi="['system:dict:create']"
|
v-hasPermi="['system:dict:create']"
|
||||||
>
|
>
|
||||||
<Icon icon="ep:plus" class="mr-5px" /> 新增
|
<Icon icon="ep:plus" class="mr-5px" /> 新增
|
||||||
@ -69,10 +74,10 @@
|
|||||||
</el-button>
|
</el-button>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-form>
|
</el-form>
|
||||||
</content-wrap>
|
</ContentWrap>
|
||||||
|
|
||||||
<!-- 列表 -->
|
<!-- 列表 -->
|
||||||
<content-wrap>
|
<ContentWrap>
|
||||||
<el-table v-loading="loading" :data="list">
|
<el-table v-loading="loading" :data="list">
|
||||||
<el-table-column label="字典编号" align="center" prop="id" />
|
<el-table-column label="字典编号" align="center" prop="id" />
|
||||||
<el-table-column label="字典名称" align="center" prop="name" show-overflow-tooltip />
|
<el-table-column label="字典名称" align="center" prop="name" show-overflow-tooltip />
|
||||||
@ -95,7 +100,7 @@
|
|||||||
<el-button
|
<el-button
|
||||||
link
|
link
|
||||||
type="primary"
|
type="primary"
|
||||||
@click="openModal('update', scope.row.id)"
|
@click="openForm('update', scope.row.id)"
|
||||||
v-hasPermi="['system:dict:update']"
|
v-hasPermi="['system:dict:update']"
|
||||||
>
|
>
|
||||||
修改
|
修改
|
||||||
@ -121,17 +126,17 @@
|
|||||||
v-model:limit="queryParams.pageSize"
|
v-model:limit="queryParams.pageSize"
|
||||||
@pagination="getList"
|
@pagination="getList"
|
||||||
/>
|
/>
|
||||||
</content-wrap>
|
</ContentWrap>
|
||||||
|
|
||||||
<!-- 表单弹窗:添加/修改 -->
|
<!-- 表单弹窗:添加/修改 -->
|
||||||
<dict-type-form ref="modalRef" @success="getList" />
|
<DictTypeForm ref="formRef" @success="getList" />
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup lang="ts" name="Dict">
|
<script setup lang="ts" name="DictType">
|
||||||
import { getDictOptions, DICT_TYPE } from '@/utils/dict'
|
import { getIntDictOptions, DICT_TYPE } from '@/utils/dict'
|
||||||
import { dateFormatter } from '@/utils/formatTime'
|
import { dateFormatter } from '@/utils/formatTime'
|
||||||
import * as DictTypeApi from '@/api/system/dict/dict.type'
|
import * as DictTypeApi from '@/api/system/dict/dict.type'
|
||||||
import DictTypeForm from './form.vue'
|
import DictTypeForm from './DictTypeForm.vue'
|
||||||
import download from '@/utils/download'
|
import download from '@/utils/download'
|
||||||
const message = useMessage() // 消息弹窗
|
const message = useMessage() // 消息弹窗
|
||||||
const { t } = useI18n() // 国际化
|
const { t } = useI18n() // 国际化
|
||||||
@ -175,9 +180,9 @@ const resetQuery = () => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/** 添加/修改操作 */
|
/** 添加/修改操作 */
|
||||||
const modalRef = ref()
|
const formRef = ref()
|
||||||
const openModal = (type: string, id?: number) => {
|
const openForm = (type: string, id?: number) => {
|
||||||
modalRef.value.openModal(type, id)
|
formRef.value.open(type, id)
|
||||||
}
|
}
|
||||||
|
|
||||||
/** 删除按钮操作 */
|
/** 删除按钮操作 */
|
||||||
|
@ -53,7 +53,7 @@ const formRules = reactive({
|
|||||||
const formRef = ref() // 表单 Ref
|
const formRef = ref() // 表单 Ref
|
||||||
|
|
||||||
/** 打开弹窗 */
|
/** 打开弹窗 */
|
||||||
const openModal = async (type: string, id?: number) => {
|
const open = async (type: string, id?: number) => {
|
||||||
dialogVisible.value = true
|
dialogVisible.value = true
|
||||||
dialogTitle.value = t('action.' + type)
|
dialogTitle.value = t('action.' + type)
|
||||||
formType.value = type
|
formType.value = type
|
||||||
@ -62,13 +62,13 @@ const openModal = async (type: string, id?: number) => {
|
|||||||
if (id) {
|
if (id) {
|
||||||
formLoading.value = true
|
formLoading.value = true
|
||||||
try {
|
try {
|
||||||
formData.value = await ErrorCodeApi.getErrorCodeApi(id)
|
formData.value = await ErrorCodeApi.getErrorCode(id)
|
||||||
} finally {
|
} finally {
|
||||||
formLoading.value = false
|
formLoading.value = false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
defineExpose({ openModal }) // 提供 openModal 方法,用于打开弹窗
|
defineExpose({ open }) // 提供 open 方法,用于打开弹窗
|
||||||
|
|
||||||
/** 提交表单 */
|
/** 提交表单 */
|
||||||
const emit = defineEmits(['success']) // 定义 success 事件,用于操作成功后的回调
|
const emit = defineEmits(['success']) // 定义 success 事件,用于操作成功后的回调
|
||||||
@ -82,10 +82,10 @@ const submitForm = async () => {
|
|||||||
try {
|
try {
|
||||||
const data = formData.value as ErrorCodeApi.ErrorCodeVO
|
const data = formData.value as ErrorCodeApi.ErrorCodeVO
|
||||||
if (formType.value === 'create') {
|
if (formType.value === 'create') {
|
||||||
await ErrorCodeApi.createErrorCodeApi(data)
|
await ErrorCodeApi.createErrorCode(data)
|
||||||
message.success(t('common.createSuccess'))
|
message.success(t('common.createSuccess'))
|
||||||
} else {
|
} else {
|
||||||
await ErrorCodeApi.updateErrorCodeApi(data)
|
await ErrorCodeApi.updateErrorCode(data)
|
||||||
message.success(t('common.updateSuccess'))
|
message.success(t('common.updateSuccess'))
|
||||||
}
|
}
|
||||||
dialogVisible.value = false
|
dialogVisible.value = false
|
@ -1,6 +1,8 @@
|
|||||||
<template>
|
<template>
|
||||||
|
<doc-alert title="异常处理(错误码)" url="https://doc.iocoder.cn/exception/" />
|
||||||
|
|
||||||
<!-- 搜索工作栏 -->
|
<!-- 搜索工作栏 -->
|
||||||
<content-wrap>
|
<ContentWrap>
|
||||||
<el-form
|
<el-form
|
||||||
class="-mb-15px"
|
class="-mb-15px"
|
||||||
:model="queryParams"
|
:model="queryParams"
|
||||||
@ -11,7 +13,7 @@
|
|||||||
<el-form-item label="错误码类型" prop="type">
|
<el-form-item label="错误码类型" prop="type">
|
||||||
<el-select v-model="queryParams.type" placeholder="请选择错误码类型" clearable>
|
<el-select v-model="queryParams.type" placeholder="请选择错误码类型" clearable>
|
||||||
<el-option
|
<el-option
|
||||||
v-for="dict in getDictOptions(DICT_TYPE.SYSTEM_ERROR_CODE_TYPE)"
|
v-for="dict in getIntDictOptions(DICT_TYPE.SYSTEM_ERROR_CODE_TYPE)"
|
||||||
:key="dict.value"
|
:key="dict.value"
|
||||||
:label="dict.label"
|
:label="dict.label"
|
||||||
:value="dict.value"
|
:value="dict.value"
|
||||||
@ -34,6 +36,7 @@
|
|||||||
placeholder="请输入错误码编码"
|
placeholder="请输入错误码编码"
|
||||||
clearable
|
clearable
|
||||||
@keyup.enter="handleQuery"
|
@keyup.enter="handleQuery"
|
||||||
|
class="!w-240px"
|
||||||
/>
|
/>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="错误码提示" prop="message">
|
<el-form-item label="错误码提示" prop="message">
|
||||||
@ -62,7 +65,7 @@
|
|||||||
<el-button
|
<el-button
|
||||||
type="primary"
|
type="primary"
|
||||||
plain
|
plain
|
||||||
@click="openModal('create')"
|
@click="openForm('create')"
|
||||||
v-hasPermi="['system:error-code:create']"
|
v-hasPermi="['system:error-code:create']"
|
||||||
>
|
>
|
||||||
<Icon icon="ep:plus" class="mr-5px" /> 新增
|
<Icon icon="ep:plus" class="mr-5px" /> 新增
|
||||||
@ -78,10 +81,10 @@
|
|||||||
</el-button>
|
</el-button>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-form>
|
</el-form>
|
||||||
</content-wrap>
|
</ContentWrap>
|
||||||
|
|
||||||
<!-- 列表 -->
|
<!-- 列表 -->
|
||||||
<content-wrap>
|
<ContentWrap>
|
||||||
<el-table v-loading="loading" :data="list">
|
<el-table v-loading="loading" :data="list">
|
||||||
<el-table-column label="编号" align="center" prop="id" />
|
<el-table-column label="编号" align="center" prop="id" />
|
||||||
<el-table-column label="类型" align="center" prop="type" width="80">
|
<el-table-column label="类型" align="center" prop="type" width="80">
|
||||||
@ -105,7 +108,7 @@
|
|||||||
<el-button
|
<el-button
|
||||||
link
|
link
|
||||||
type="primary"
|
type="primary"
|
||||||
@click="openModal('update', scope.row.id)"
|
@click="openForm('update', scope.row.id)"
|
||||||
v-hasPermi="['system:error-code:update']"
|
v-hasPermi="['system:error-code:update']"
|
||||||
>
|
>
|
||||||
编辑
|
编辑
|
||||||
@ -128,30 +131,25 @@
|
|||||||
v-model:limit="queryParams.pageSize"
|
v-model:limit="queryParams.pageSize"
|
||||||
@pagination="getList"
|
@pagination="getList"
|
||||||
/>
|
/>
|
||||||
</content-wrap>
|
</ContentWrap>
|
||||||
|
|
||||||
<!-- 表单弹窗:添加/修改 -->
|
<!-- 表单弹窗:添加/修改 -->
|
||||||
<error-code-form ref="modalRef" @success="getList" />
|
<ErrorCodeForm ref="formRef" @success="getList" />
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup lang="ts" name="ErrorCode">
|
<script setup lang="ts" name="ErrorCode">
|
||||||
import * as ErrorCodeApi from '@/api/system/errorCode'
|
import { DICT_TYPE, getIntDictOptions } from '@/utils/dict'
|
||||||
import { DICT_TYPE, getDictOptions } from '@/utils/dict'
|
|
||||||
import { dateFormatter } from '@/utils/formatTime'
|
import { dateFormatter } from '@/utils/formatTime'
|
||||||
import ErrorCodeForm from './form.vue'
|
|
||||||
import download from '@/utils/download'
|
import download from '@/utils/download'
|
||||||
|
import * as ErrorCodeApi from '@/api/system/errorCode'
|
||||||
|
import ErrorCodeForm from './ErrorCodeForm.vue'
|
||||||
const message = useMessage() // 消息弹窗
|
const message = useMessage() // 消息弹窗
|
||||||
const { t } = useI18n() // 国际化
|
const { t } = useI18n() // 国际化
|
||||||
|
|
||||||
// 遮罩层
|
const loading = ref(true) // 遮罩层
|
||||||
const loading = ref(true)
|
const exportLoading = ref(false) // 导出遮罩层
|
||||||
// 导出遮罩层
|
const total = ref(0) // 总条数
|
||||||
const exportLoading = ref(false)
|
const list = ref([]) // 错误码列表
|
||||||
// 总条数
|
|
||||||
const total = ref(0)
|
|
||||||
// 错误码列表
|
|
||||||
const list = ref([])
|
|
||||||
// 查询参数
|
|
||||||
const queryParams = reactive({
|
const queryParams = reactive({
|
||||||
pageNo: 1,
|
pageNo: 1,
|
||||||
pageSize: 10,
|
pageSize: 10,
|
||||||
@ -161,15 +159,13 @@ const queryParams = reactive({
|
|||||||
message: undefined,
|
message: undefined,
|
||||||
createTime: []
|
createTime: []
|
||||||
})
|
})
|
||||||
// 搜索的表单
|
const queryFormRef = ref() // 搜索的表单
|
||||||
const queryFormRef = ref()
|
|
||||||
|
|
||||||
/** 查询列表 */
|
/** 查询列表 */
|
||||||
const getList = async () => {
|
const getList = async () => {
|
||||||
loading.value = true
|
loading.value = true
|
||||||
// 执行查询
|
|
||||||
try {
|
try {
|
||||||
const data = await ErrorCodeApi.getErrorCodePageApi(queryParams)
|
const data = await ErrorCodeApi.getErrorCodePage(queryParams)
|
||||||
list.value = data.list
|
list.value = data.list
|
||||||
total.value = data.total
|
total.value = data.total
|
||||||
} finally {
|
} finally {
|
||||||
@ -190,9 +186,9 @@ const resetQuery = () => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/** 添加/修改操作 */
|
/** 添加/修改操作 */
|
||||||
const modalRef = ref()
|
const formRef = ref()
|
||||||
const openModal = (type: string, id?: number) => {
|
const openForm = (type: string, id?: number) => {
|
||||||
modalRef.value.openModal(type, id)
|
formRef.value.open(type, id)
|
||||||
}
|
}
|
||||||
|
|
||||||
/** 删除按钮操作 */
|
/** 删除按钮操作 */
|
||||||
@ -200,7 +196,7 @@ const handleDelete = async (id: number) => {
|
|||||||
try {
|
try {
|
||||||
// 删除的二次确认
|
// 删除的二次确认
|
||||||
await message.delConfirm()
|
await message.delConfirm()
|
||||||
await ErrorCodeApi.deleteErrorCodeApi(id)
|
await ErrorCodeApi.deleteErrorCode(id)
|
||||||
message.success(t('common.delSuccess'))
|
message.success(t('common.delSuccess'))
|
||||||
// 刷新列表
|
// 刷新列表
|
||||||
await getList()
|
await getList()
|
||||||
@ -214,7 +210,7 @@ const handleExport = async () => {
|
|||||||
await message.exportConfirm()
|
await message.exportConfirm()
|
||||||
// 发起导出
|
// 发起导出
|
||||||
exportLoading.value = true
|
exportLoading.value = true
|
||||||
const data = await ErrorCodeApi.excelErrorCodeApi(queryParams)
|
const data = await ErrorCodeApi.excelErrorCode(queryParams)
|
||||||
download.excel(data, '错误码.xls')
|
download.excel(data, '错误码.xls')
|
||||||
} catch {
|
} catch {
|
||||||
} finally {
|
} finally {
|
||||||
|
@ -1,5 +1,7 @@
|
|||||||
<template>
|
<template>
|
||||||
<content-wrap>
|
<doc-alert title="系统日志" url="https://doc.iocoder.cn/system-log/" />
|
||||||
|
|
||||||
|
<ContentWrap>
|
||||||
<!-- 搜索工作栏 -->
|
<!-- 搜索工作栏 -->
|
||||||
<el-form
|
<el-form
|
||||||
class="-mb-15px"
|
class="-mb-15px"
|
||||||
@ -51,10 +53,10 @@
|
|||||||
</el-button>
|
</el-button>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-form>
|
</el-form>
|
||||||
</content-wrap>
|
</ContentWrap>
|
||||||
|
|
||||||
<!-- 列表 -->
|
<!-- 列表 -->
|
||||||
<content-wrap>
|
<ContentWrap>
|
||||||
<el-table v-loading="loading" :data="list">
|
<el-table v-loading="loading" :data="list">
|
||||||
<el-table-column label="日志编号" align="center" prop="id" />
|
<el-table-column label="日志编号" align="center" prop="id" />
|
||||||
<el-table-column label="操作类型" align="center" prop="logType">
|
<el-table-column label="操作类型" align="center" prop="logType">
|
||||||
@ -97,7 +99,7 @@
|
|||||||
v-model:limit="queryParams.pageSize"
|
v-model:limit="queryParams.pageSize"
|
||||||
@pagination="getList"
|
@pagination="getList"
|
||||||
/>
|
/>
|
||||||
</content-wrap>
|
</ContentWrap>
|
||||||
|
|
||||||
<!-- 表单弹窗:详情 -->
|
<!-- 表单弹窗:详情 -->
|
||||||
<LoginLogDetail ref="detailRef" />
|
<LoginLogDetail ref="detailRef" />
|
||||||
|
26
src/views/system/mail/account/MailAccountDetail.vue
Normal file
26
src/views/system/mail/account/MailAccountDetail.vue
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
<template>
|
||||||
|
<Dialog title="详情" v-model="dialogVisible">
|
||||||
|
<Descriptions :schema="allSchemas.detailSchema" :data="detailData" />
|
||||||
|
</Dialog>
|
||||||
|
</template>
|
||||||
|
<script setup lang="ts">
|
||||||
|
import * as MailAccountApi from '@/api/system/mail/account'
|
||||||
|
import { allSchemas } from './account.data'
|
||||||
|
|
||||||
|
const dialogVisible = ref(false) // 弹窗的是否展示
|
||||||
|
const detailLoading = ref(false) // 表单的加载中
|
||||||
|
const detailData = ref() // 详情数据
|
||||||
|
|
||||||
|
/** 打开弹窗 */
|
||||||
|
const open = async (id: number) => {
|
||||||
|
dialogVisible.value = true
|
||||||
|
// 设置数据
|
||||||
|
detailLoading.value = true
|
||||||
|
try {
|
||||||
|
detailData.value = await MailAccountApi.getMailAccount(id)
|
||||||
|
} finally {
|
||||||
|
detailLoading.value = false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
defineExpose({ open }) // 提供 open 方法,用于打开弹窗
|
||||||
|
</script>
|
@ -10,7 +10,6 @@
|
|||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import * as MailAccountApi from '@/api/system/mail/account'
|
import * as MailAccountApi from '@/api/system/mail/account'
|
||||||
import { rules, allSchemas } from './account.data'
|
import { rules, allSchemas } from './account.data'
|
||||||
|
|
||||||
const { t } = useI18n() // 国际化
|
const { t } = useI18n() // 国际化
|
||||||
const message = useMessage() // 消息弹窗
|
const message = useMessage() // 消息弹窗
|
||||||
|
|
||||||
@ -21,7 +20,7 @@ const formType = ref('') // 表单的类型:create - 新增;update - 修改
|
|||||||
const formRef = ref() // 表单 Ref
|
const formRef = ref() // 表单 Ref
|
||||||
|
|
||||||
/** 打开弹窗 */
|
/** 打开弹窗 */
|
||||||
const openModal = async (type: string, id?: number) => {
|
const open = async (type: string, id?: number) => {
|
||||||
dialogVisible.value = true
|
dialogVisible.value = true
|
||||||
dialogTitle.value = t('action.' + type)
|
dialogTitle.value = t('action.' + type)
|
||||||
formType.value = type
|
formType.value = type
|
||||||
@ -36,7 +35,7 @@ const openModal = async (type: string, id?: number) => {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
defineExpose({ openModal }) // 提供 openModal 方法,用于打开弹窗
|
defineExpose({ open }) // 提供 open 方法,用于打开弹窗
|
||||||
|
|
||||||
/** 提交表单 */
|
/** 提交表单 */
|
||||||
const emit = defineEmits(['success']) // 定义 success 事件,用于操作成功后的回调
|
const emit = defineEmits(['success']) // 定义 success 事件,用于操作成功后的回调
|
@ -1,6 +1,5 @@
|
|||||||
import type { CrudSchema } from '@/hooks/web/useCrudSchemas'
|
import type { CrudSchema } from '@/hooks/web/useCrudSchemas'
|
||||||
import { dateFormatter } from '@/utils/formatTime'
|
import { dateFormatter } from '@/utils/formatTime'
|
||||||
|
|
||||||
const { t } = useI18n() // 国际化
|
const { t } = useI18n() // 国际化
|
||||||
|
|
||||||
// 表单校验
|
// 表单校验
|
||||||
@ -62,12 +61,16 @@ const crudSchemas = reactive<CrudSchema[]>([
|
|||||||
label: '创建时间',
|
label: '创建时间',
|
||||||
field: 'createTime',
|
field: 'createTime',
|
||||||
isForm: false,
|
isForm: false,
|
||||||
formatter: dateFormatter
|
formatter: dateFormatter,
|
||||||
|
detail: {
|
||||||
|
dateFormat: 'YYYY-MM-DD HH:mm:ss'
|
||||||
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: '操作',
|
label: '操作',
|
||||||
field: 'action',
|
field: 'action',
|
||||||
isForm: false
|
isForm: false,
|
||||||
|
isDetail: false
|
||||||
}
|
}
|
||||||
])
|
])
|
||||||
export const { allSchemas } = useCrudSchemas(crudSchemas)
|
export const { allSchemas } = useCrudSchemas(crudSchemas)
|
||||||
|
@ -1,23 +1,25 @@
|
|||||||
<template>
|
<template>
|
||||||
|
<doc-alert title="邮件配置" url="https://doc.iocoder.cn/mail" />
|
||||||
|
|
||||||
<!-- 搜索工作栏 -->
|
<!-- 搜索工作栏 -->
|
||||||
<content-wrap>
|
<ContentWrap>
|
||||||
<Search :schema="allSchemas.searchSchema" @search="setSearchParams" @reset="setSearchParams">
|
<Search :schema="allSchemas.searchSchema" @search="setSearchParams" @reset="setSearchParams">
|
||||||
<!-- 新增等操作按钮 -->
|
<!-- 新增等操作按钮 -->
|
||||||
<template #actionMore>
|
<template #actionMore>
|
||||||
<el-button
|
<el-button
|
||||||
type="primary"
|
type="primary"
|
||||||
plain
|
plain
|
||||||
@click="openModal('create')"
|
@click="openForm('create')"
|
||||||
v-hasPermi="['system:mail-account:create']"
|
v-hasPermi="['system:mail-account:create']"
|
||||||
>
|
>
|
||||||
<Icon icon="ep:plus" class="mr-5px" /> 新增
|
<Icon icon="ep:plus" class="mr-5px" /> 新增
|
||||||
</el-button>
|
</el-button>
|
||||||
</template>
|
</template>
|
||||||
</Search>
|
</Search>
|
||||||
</content-wrap>
|
</ContentWrap>
|
||||||
|
|
||||||
<!-- 列表 -->
|
<!-- 列表 -->
|
||||||
<content-wrap>
|
<ContentWrap>
|
||||||
<Table
|
<Table
|
||||||
:columns="allSchemas.tableColumns"
|
:columns="allSchemas.tableColumns"
|
||||||
:data="tableObject.tableList"
|
:data="tableObject.tableList"
|
||||||
@ -32,11 +34,19 @@
|
|||||||
<el-button
|
<el-button
|
||||||
link
|
link
|
||||||
type="primary"
|
type="primary"
|
||||||
@click="openModal('update', row.id)"
|
@click="openForm('update', row.id)"
|
||||||
v-hasPermi="['system:mail-account:update']"
|
v-hasPermi="['system:mail-account:update']"
|
||||||
>
|
>
|
||||||
编辑
|
编辑
|
||||||
</el-button>
|
</el-button>
|
||||||
|
<el-button
|
||||||
|
link
|
||||||
|
type="primary"
|
||||||
|
@click="openDetail(row.id)"
|
||||||
|
v-hasPermi="['system:mail-account:query']"
|
||||||
|
>
|
||||||
|
详情
|
||||||
|
</el-button>
|
||||||
<el-button
|
<el-button
|
||||||
link
|
link
|
||||||
type="danger"
|
type="danger"
|
||||||
@ -47,15 +57,18 @@
|
|||||||
</el-button>
|
</el-button>
|
||||||
</template>
|
</template>
|
||||||
</Table>
|
</Table>
|
||||||
</content-wrap>
|
</ContentWrap>
|
||||||
|
|
||||||
<!-- 表单弹窗:添加/修改 -->
|
<!-- 表单弹窗:添加/修改 -->
|
||||||
<mail-account-form ref="modalRef" @success="getList" />
|
<MailAccountForm ref="formRef" @success="getList" />
|
||||||
|
<!-- 详情弹窗 -->
|
||||||
|
<MailAccountDetail ref="detailRef" />
|
||||||
</template>
|
</template>
|
||||||
<script setup lang="ts" name="MailAccount">
|
<script setup lang="ts" name="MailAccount">
|
||||||
import { allSchemas } from './account.data'
|
import { allSchemas } from './account.data'
|
||||||
import * as MailAccountApi from '@/api/system/mail/account'
|
import * as MailAccountApi from '@/api/system/mail/account'
|
||||||
import MailAccountForm from './form.vue'
|
import MailAccountForm from './MailAccountForm.vue'
|
||||||
|
import MailAccountDetail from './MailAccountDetail.vue'
|
||||||
|
|
||||||
// tableObject:表格的属性对象,可获得分页大小、条数等属性
|
// tableObject:表格的属性对象,可获得分页大小、条数等属性
|
||||||
// tableMethods:表格的操作对象,可进行获得分页、删除记录等操作
|
// tableMethods:表格的操作对象,可进行获得分页、删除记录等操作
|
||||||
@ -68,9 +81,15 @@ const { tableObject, tableMethods } = useTable({
|
|||||||
const { getList, setSearchParams } = tableMethods
|
const { getList, setSearchParams } = tableMethods
|
||||||
|
|
||||||
/** 添加/修改操作 */
|
/** 添加/修改操作 */
|
||||||
const modalRef = ref()
|
const formRef = ref()
|
||||||
const openModal = (type: string, id?: number) => {
|
const openForm = (type: string, id?: number) => {
|
||||||
modalRef.value.openModal(type, id)
|
formRef.value.open(type, id)
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 详情操作 */
|
||||||
|
const detailRef = ref()
|
||||||
|
const openDetail = (id: number) => {
|
||||||
|
detailRef.value.open(id)
|
||||||
}
|
}
|
||||||
|
|
||||||
/** 删除按钮操作 */
|
/** 删除按钮操作 */
|
||||||
|
@ -17,7 +17,7 @@ const detailLoading = ref(false) // 表单的加载中
|
|||||||
const detailData = ref() // 详情数据
|
const detailData = ref() // 详情数据
|
||||||
|
|
||||||
/** 打开弹窗 */
|
/** 打开弹窗 */
|
||||||
const openModal = async (id: number) => {
|
const open = async (id: number) => {
|
||||||
dialogVisible.value = true
|
dialogVisible.value = true
|
||||||
// 设置数据
|
// 设置数据
|
||||||
detailLoading.value = true
|
detailLoading.value = true
|
||||||
@ -27,5 +27,5 @@ const openModal = async (id: number) => {
|
|||||||
detailLoading.value = false
|
detailLoading.value = false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
defineExpose({ openModal }) // 提供 openModal 方法,用于打开弹窗
|
defineExpose({ open }) // 提供 open 方法,用于打开弹窗
|
||||||
</script>
|
</script>
|
@ -1,11 +1,13 @@
|
|||||||
<template>
|
<template>
|
||||||
|
<doc-alert title="邮件配置" url="https://doc.iocoder.cn/mail" />
|
||||||
|
|
||||||
<!-- 搜索工作栏 -->
|
<!-- 搜索工作栏 -->
|
||||||
<content-wrap>
|
<ContentWrap>
|
||||||
<Search :schema="allSchemas.searchSchema" @search="setSearchParams" @reset="setSearchParams" />
|
<Search :schema="allSchemas.searchSchema" @search="setSearchParams" @reset="setSearchParams" />
|
||||||
</content-wrap>
|
</ContentWrap>
|
||||||
|
|
||||||
<!-- 列表 -->
|
<!-- 列表 -->
|
||||||
<content-wrap>
|
<ContentWrap>
|
||||||
<Table
|
<Table
|
||||||
:columns="allSchemas.tableColumns"
|
:columns="allSchemas.tableColumns"
|
||||||
:data="tableObject.tableList"
|
:data="tableObject.tableList"
|
||||||
@ -20,22 +22,22 @@
|
|||||||
<el-button
|
<el-button
|
||||||
link
|
link
|
||||||
type="primary"
|
type="primary"
|
||||||
@click="openModal(row.id)"
|
@click="openDetail(row.id)"
|
||||||
v-hasPermi="['system:mail-log:query']"
|
v-hasPermi="['system:mail-log:query']"
|
||||||
>
|
>
|
||||||
详情
|
详情
|
||||||
</el-button>
|
</el-button>
|
||||||
</template>
|
</template>
|
||||||
</Table>
|
</Table>
|
||||||
</content-wrap>
|
</ContentWrap>
|
||||||
|
|
||||||
<!-- 表单弹窗:详情 -->
|
<!-- 表单弹窗:详情 -->
|
||||||
<mail-log-detail ref="modalRef" />
|
<mail-log-detail ref="detailRef" />
|
||||||
</template>
|
</template>
|
||||||
<script setup lang="ts" name="MailLog">
|
<script setup lang="ts" name="MailLog">
|
||||||
import { allSchemas } from './log.data'
|
import { allSchemas } from './log.data'
|
||||||
import * as MailLogApi from '@/api/system/mail/log'
|
import * as MailLogApi from '@/api/system/mail/log'
|
||||||
import MailLogDetail from './detail.vue'
|
import MailLogDetail from './MailLogDetail.vue'
|
||||||
|
|
||||||
// tableObject:表格的属性对象,可获得分页大小、条数等属性
|
// tableObject:表格的属性对象,可获得分页大小、条数等属性
|
||||||
// tableMethods:表格的操作对象,可进行获得分页、删除记录等操作
|
// tableMethods:表格的操作对象,可进行获得分页、删除记录等操作
|
||||||
@ -47,9 +49,9 @@ const { tableObject, tableMethods } = useTable({
|
|||||||
const { getList, setSearchParams } = tableMethods
|
const { getList, setSearchParams } = tableMethods
|
||||||
|
|
||||||
/** 详情操作 */
|
/** 详情操作 */
|
||||||
const modalRef = ref()
|
const detailRef = ref()
|
||||||
const openModal = (id: number) => {
|
const openDetail = (id: number) => {
|
||||||
modalRef.value.openModal(id)
|
detailRef.value.open(id)
|
||||||
}
|
}
|
||||||
|
|
||||||
/** 初始化 **/
|
/** 初始化 **/
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user