mirror of
https://github.com/likeshop-github/likeadmin_go.git
synced 2025-12-24 13:07:57 +08:00
前端框架部分修改
This commit is contained in:
@@ -1,4 +0,0 @@
|
||||
NODE_ENV = 'production'
|
||||
|
||||
# 请求域名
|
||||
VITE_APP_BASE_URL=''
|
||||
@@ -47,6 +47,8 @@ watch(
|
||||
immediate: true
|
||||
}
|
||||
)
|
||||
console.log(import.meta.env);
|
||||
|
||||
</script>
|
||||
|
||||
<template>
|
||||
|
||||
@@ -2,10 +2,10 @@ import request from '@/utils/request'
|
||||
|
||||
// 配置
|
||||
export function getConfig() {
|
||||
return request.get({ url: '/index/config' })
|
||||
return request.get({ url: '/common/index/config' })
|
||||
}
|
||||
|
||||
// 工作台主页
|
||||
export function getWorkbench() {
|
||||
return request.get({ url: '/index/console' })
|
||||
return request.get({ url: '/common/index/console' })
|
||||
}
|
||||
|
||||
@@ -1,39 +1,39 @@
|
||||
import request from '@/utils/request'
|
||||
|
||||
export function fileCateAdd(params: Record<string, any>) {
|
||||
return request.post({ url: '/albums/cateAdd', params })
|
||||
return request.post({ url: '/common/album/cateAdd', params })
|
||||
}
|
||||
|
||||
export function fileCateEdit(params: Record<string, any>) {
|
||||
return request.post({ url: '/albums/cateRename', params })
|
||||
return request.post({ url: '/common/album/cateRename', params })
|
||||
}
|
||||
|
||||
// 文件分类删除
|
||||
export function fileCateDelete(params: Record<string, any>) {
|
||||
return request.post({ url: '/albums/cateDel', params })
|
||||
return request.post({ url: '/common/album/cateDel', params })
|
||||
}
|
||||
|
||||
// 文件分类列表
|
||||
export function fileCateLists(params: Record<string, any>) {
|
||||
return request.get({ url: '/albums/cateList', params })
|
||||
return request.get({ url: '/common/album/cateList', params })
|
||||
}
|
||||
|
||||
// 文件列表
|
||||
export function fileList(params: Record<string, any>) {
|
||||
return request.get({ url: '/albums/albumList', params })
|
||||
return request.get({ url: '/common/album/albumList', params })
|
||||
}
|
||||
|
||||
// 文件删除
|
||||
export function fileDelete(params: Record<string, any>) {
|
||||
return request.post({ url: '/albums/albumDel', params })
|
||||
return request.post({ url: '/common/album/albumDel', params })
|
||||
}
|
||||
|
||||
// 文件移动
|
||||
export function fileMove(params: Record<string, any>) {
|
||||
return request.post({ url: '/albums/albumMove', params })
|
||||
return request.post({ url: '/common/album/albumMove', params })
|
||||
}
|
||||
|
||||
// 文件重命名
|
||||
export function fileRename(params: { id: number; name: string }) {
|
||||
return request.post({ url: '/albums/albumRename', params })
|
||||
return request.post({ url: '/common/album/albumRename', params })
|
||||
}
|
||||
|
||||
@@ -14,28 +14,3 @@ export function systemLogLists(params: any) {
|
||||
export function systemCache() {
|
||||
return request.get({ url: '/monitor/cache' })
|
||||
}
|
||||
|
||||
// 定时任务列表
|
||||
export function crontabLists(params: any) {
|
||||
return request.get({ url: '/crontab/list', params })
|
||||
}
|
||||
|
||||
// 添加定时任务
|
||||
export function crontabAdd(params: any) {
|
||||
return request.post({ url: '/crontab/add', params })
|
||||
}
|
||||
|
||||
// 定时任务详情
|
||||
export function crontabDetail(params: any) {
|
||||
return request.get({ url: '/crontab/detail', params })
|
||||
}
|
||||
|
||||
// 编辑定时任务
|
||||
export function crontabEdit(params: any) {
|
||||
return request.post({ url: '/crontab/edit', params })
|
||||
}
|
||||
|
||||
// 删除定时任务
|
||||
export function crontabDel(params: any) {
|
||||
return request.post({ url: '/crontab/del', params })
|
||||
}
|
||||
|
||||
@@ -28,14 +28,14 @@ export function useCate(type: number) {
|
||||
type
|
||||
})
|
||||
const item: any[] = [
|
||||
{
|
||||
name: '全部',
|
||||
id: ''
|
||||
},
|
||||
{
|
||||
name: '未分组',
|
||||
id: 0
|
||||
}
|
||||
// {
|
||||
// name: '全部',
|
||||
// id: ''
|
||||
// },
|
||||
// {
|
||||
// name: '未分组',
|
||||
// id: 0
|
||||
// }
|
||||
]
|
||||
cateLists.value = data
|
||||
cateLists.value.unshift(...item)
|
||||
|
||||
@@ -24,7 +24,10 @@
|
||||
<overflow-tooltip :content="data.name" />
|
||||
</span>
|
||||
<el-dropdown
|
||||
v-perms="['albums:cateRename', 'albums:cateDel']"
|
||||
v-perms="[
|
||||
'common:album:cateRename',
|
||||
'common:album:cateDel'
|
||||
]"
|
||||
v-if="data.id > 0"
|
||||
:hide-on-click="false"
|
||||
>
|
||||
@@ -32,7 +35,7 @@
|
||||
<template #dropdown>
|
||||
<el-dropdown-menu>
|
||||
<popover-input
|
||||
v-perms="['albums:cateRename']"
|
||||
v-perms="['common:album:cateRename']"
|
||||
@confirm="handleEditCate($event, data.id)"
|
||||
size="default"
|
||||
:value="data.name"
|
||||
@@ -48,7 +51,7 @@
|
||||
</div>
|
||||
</popover-input>
|
||||
<div
|
||||
v-perms="['albums:cateDel']"
|
||||
v-perms="['common:album:cateDel']"
|
||||
@click="handleDeleteCate(data.id)"
|
||||
>
|
||||
<el-dropdown-item>删除分组</el-dropdown-item>
|
||||
@@ -65,7 +68,7 @@
|
||||
|
||||
<div class="flex justify-center p-2 border-t border-br">
|
||||
<popover-input
|
||||
v-perms="['albums:cateAdd']"
|
||||
v-perms="['common:album:cateAdd']"
|
||||
@confirm="handleAddCate"
|
||||
size="default"
|
||||
width="400px"
|
||||
@@ -82,7 +85,7 @@
|
||||
<div class="flex-1 flex">
|
||||
<upload
|
||||
v-if="type == 'image'"
|
||||
v-perms="['upload:image']"
|
||||
v-perms="['common:upload:image']"
|
||||
class="mr-3"
|
||||
:data="{ cid: cateId }"
|
||||
:type="type"
|
||||
@@ -93,7 +96,7 @@
|
||||
</upload>
|
||||
<upload
|
||||
v-if="type == 'video'"
|
||||
v-perms="['upload:video']"
|
||||
v-perms="['common:upload:video']"
|
||||
class="mr-3"
|
||||
:data="{ cid: cateId }"
|
||||
:type="type"
|
||||
@@ -103,7 +106,7 @@
|
||||
<el-button type="primary">本地上传</el-button>
|
||||
</upload>
|
||||
<el-button
|
||||
v-perms="['albums:albumDel']"
|
||||
v-perms="['common:album:albumDel']"
|
||||
v-if="mode == 'page'"
|
||||
:disabled="!select.length"
|
||||
@click.stop="batchFileDelete()"
|
||||
@@ -112,7 +115,7 @@
|
||||
</el-button>
|
||||
|
||||
<popup
|
||||
v-perms="['albums:albumMove']"
|
||||
v-perms="['common:album:albumMove']"
|
||||
v-if="mode == 'page'"
|
||||
class="ml-3"
|
||||
@confirm="batchFileMove"
|
||||
@@ -211,7 +214,7 @@
|
||||
<overflow-tooltip class="mt-1" :content="item.name" />
|
||||
<div class="operation-btns flex items-center">
|
||||
<popover-input
|
||||
v-perms="['albums:albumRename']"
|
||||
v-perms="['common:album:albumRename']"
|
||||
@confirm="handleFileRename($event, item.id)"
|
||||
size="default"
|
||||
:value="item.name"
|
||||
@@ -260,7 +263,7 @@
|
||||
<el-table-column prop="createTime" label="上传时间" min-width="100" />
|
||||
<el-table-column label="操作" width="150" fixed="right">
|
||||
<template #default="{ row }">
|
||||
<div class="inline-block" v-perms="['albums:albumRename']">
|
||||
<div class="inline-block" v-perms="['common:album:albumRename']">
|
||||
<popover-input
|
||||
@confirm="handleFileRename($event, row.id)"
|
||||
size="default"
|
||||
@@ -278,7 +281,7 @@
|
||||
查看
|
||||
</el-button>
|
||||
</div>
|
||||
<div class="inline-block" v-perms="['albums:albumDel']">
|
||||
<div class="inline-block" v-perms="['common:album:albumDel']">
|
||||
<el-button
|
||||
type="primary"
|
||||
link
|
||||
@@ -312,14 +315,14 @@
|
||||
</el-checkbox>
|
||||
</span>
|
||||
<el-button
|
||||
v-perms="['albums:albumDel']"
|
||||
v-perms="['common:album:albumDel']"
|
||||
:disabled="!select.length"
|
||||
@click="batchFileDelete()"
|
||||
>
|
||||
删除
|
||||
</el-button>
|
||||
<popup
|
||||
v-perms="['albums:albumMove']"
|
||||
v-perms="['common:album:albumMove']"
|
||||
class="ml-3 inline"
|
||||
@confirm="batchFileMove"
|
||||
:disabled="!select.length"
|
||||
|
||||
@@ -79,9 +79,9 @@ export default defineComponent({
|
||||
setup(props, { emit }) {
|
||||
const userStore = useUserStore()
|
||||
const uploadRefs = shallowRef<InstanceType<typeof ElUpload>>()
|
||||
const action = ref(`${config.baseUrl}${config.urlPrefix}/upload/${props.type}`)
|
||||
const action = ref(`${config.baseUrl}${config.urlPrefix}/common/upload/${props.type}`)
|
||||
const headers = computed(() => ({
|
||||
['like-admin']: userStore.token,
|
||||
token: userStore.token,
|
||||
version: config.version
|
||||
}))
|
||||
const visible = ref(false)
|
||||
|
||||
@@ -21,6 +21,7 @@ const tabsStore = useTabsStore()
|
||||
const settingStore = useSettingStore()
|
||||
const isRouteShow = computed(() => appStore.isRouteShow)
|
||||
const includeList = computed(() => (settingStore.openMultipleTabs ? tabsStore.getCacheTabList : []))
|
||||
|
||||
</script>
|
||||
|
||||
<style></style>
|
||||
|
||||
11
admin/src/likeadmin_python.code-workspace
Normal file
11
admin/src/likeadmin_python.code-workspace
Normal file
@@ -0,0 +1,11 @@
|
||||
{
|
||||
"folders": [
|
||||
{
|
||||
"path": "../.."
|
||||
},
|
||||
{
|
||||
"path": "../../../../study"
|
||||
}
|
||||
],
|
||||
"settings": {}
|
||||
}
|
||||
@@ -21,7 +21,7 @@ const axiosHooks: AxiosHooks = {
|
||||
// 添加token
|
||||
if (withToken) {
|
||||
const token = getToken()
|
||||
headers['like-admin'] = token
|
||||
headers.token = token
|
||||
}
|
||||
// POST请求下如果无data,则将params视为data
|
||||
if (
|
||||
|
||||
@@ -1,36 +1,37 @@
|
||||
<template>
|
||||
<div>
|
||||
<div>
|
||||
<draggable class="draggable" v-model="navLists" animation="300">
|
||||
<template v-slot:item="{ element: item, index }">
|
||||
<del-wrap class="max-w-[400px]" :key="index" @close="handleDelete(index)">
|
||||
<div class="bg-fill-light flex items-center w-full p-4 mb-4 cursor-move">
|
||||
<material-picker
|
||||
v-model="item.image"
|
||||
upload-class="bg-body"
|
||||
size="60px"
|
||||
exclude-domain
|
||||
>
|
||||
<template #upload>
|
||||
<div class="upload-btn w-[60px] h-[60px]">
|
||||
<icon name="el-icon-Plus" :size="20" />
|
||||
</div>
|
||||
</template>
|
||||
</material-picker>
|
||||
<div class="ml-3 flex-1">
|
||||
<div class="flex">
|
||||
<span class="text-tx-regular flex-none mr-3">名称</span>
|
||||
<el-input v-model="item.name" placeholder="请输入名称" />
|
||||
</div>
|
||||
<div class="flex mt-[18px]">
|
||||
<span class="text-tx-regular flex-none mr-3">链接</span>
|
||||
<link-picker v-model="item.link" />
|
||||
</div>
|
||||
<del-wrap
|
||||
class="max-w-[400px]"
|
||||
v-for="(item, index) in modelValue"
|
||||
:key="index"
|
||||
@close="handleDelete(index)"
|
||||
>
|
||||
<div class="bg-fill-light flex items-center w-full p-4 mb-4">
|
||||
<material-picker
|
||||
v-model="item.image"
|
||||
upload-class="bg-body"
|
||||
size="60px"
|
||||
exclude-domain
|
||||
>
|
||||
<template #upload>
|
||||
<div class="upload-btn w-[60px] h-[60px]">
|
||||
<icon name="el-icon-Plus" :size="20" />
|
||||
</div>
|
||||
</template>
|
||||
</material-picker>
|
||||
<div class="ml-3 flex-1">
|
||||
<div class="flex">
|
||||
<span class="text-tx-regular flex-none mr-3">名称</span>
|
||||
<el-input v-model="item.name" placeholder="请输入名称" />
|
||||
</div>
|
||||
</del-wrap>
|
||||
</template>
|
||||
</draggable>
|
||||
<div class="flex mt-[18px]">
|
||||
<span class="text-tx-regular flex-none mr-3">链接</span>
|
||||
<link-picker v-model="item.link" />
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</del-wrap>
|
||||
</div>
|
||||
<div>
|
||||
<el-button type="primary" @click="handleAdd">添加</el-button>
|
||||
@@ -40,7 +41,7 @@
|
||||
<script lang="ts" setup>
|
||||
import feedback from '@/utils/feedback'
|
||||
import type { PropType } from 'vue'
|
||||
import Draggable from 'vuedraggable'
|
||||
|
||||
const props = defineProps({
|
||||
modelValue: {
|
||||
type: Array as PropType<any[]>,
|
||||
@@ -56,19 +57,9 @@ const props = defineProps({
|
||||
}
|
||||
})
|
||||
|
||||
const emit = defineEmits(['update:modelValue'])
|
||||
const navLists = computed({
|
||||
get() {
|
||||
return props.modelValue
|
||||
},
|
||||
set(value) {
|
||||
emit('update:modelValue', value)
|
||||
}
|
||||
})
|
||||
|
||||
const handleAdd = () => {
|
||||
if (props.modelValue?.length < props.max) {
|
||||
navLists.value.push({
|
||||
props.modelValue.push({
|
||||
image: '',
|
||||
name: '导航名称',
|
||||
link: {}
|
||||
@@ -81,7 +72,7 @@ const handleDelete = (index: number) => {
|
||||
if (props.modelValue?.length <= props.min) {
|
||||
return feedback.msgError(`最少保留${props.min}个`)
|
||||
}
|
||||
navLists.value.splice(index, 1)
|
||||
props.modelValue.splice(index, 1)
|
||||
}
|
||||
</script>
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
<template>
|
||||
<div>
|
||||
<el-form label-width="70px">
|
||||
<el-form-item label="是否启用" v-if="type == 'mobile'">
|
||||
<el-form-item label="是否启用">
|
||||
<el-radio-group v-model="content.enabled">
|
||||
<el-radio :label="1">开启</el-radio>
|
||||
<el-radio :label="0">停用</el-radio>
|
||||
@@ -10,36 +10,28 @@
|
||||
<el-form-item label="图片设置">
|
||||
<div class="flex-1">
|
||||
<div class="form-tips">最多添加5张,建议图片尺寸:750px*340px</div>
|
||||
<draggable class="draggable" v-model="content.data" animation="300">
|
||||
<template v-slot:item="{ element: item, index }">
|
||||
<del-wrap
|
||||
:key="index"
|
||||
@close="handleDelete(index)"
|
||||
class="max-w-[400px]"
|
||||
>
|
||||
<div
|
||||
class="bg-fill-light flex items-center w-full p-4 mt-4 cursor-move"
|
||||
>
|
||||
<material-picker
|
||||
v-model="item.image"
|
||||
upload-class="bg-body"
|
||||
exclude-domain
|
||||
/>
|
||||
<div class="ml-3 flex-1">
|
||||
<el-form-item label="图片名称">
|
||||
<el-input
|
||||
v-model="item.name"
|
||||
placeholder="请输入名称"
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item class="mt-[18px]" label="图片链接">
|
||||
<link-picker v-model="item.link" />
|
||||
</el-form-item>
|
||||
</div>
|
||||
</div>
|
||||
</del-wrap>
|
||||
</template>
|
||||
</draggable>
|
||||
<del-wrap
|
||||
v-for="(item, index) in content.data"
|
||||
:key="index"
|
||||
@close="handleDelete(index)"
|
||||
class="max-w-[400px]"
|
||||
>
|
||||
<div class="bg-fill-light flex items-center w-full p-4 mt-4">
|
||||
<material-picker
|
||||
v-model="item.image"
|
||||
upload-class="bg-body"
|
||||
exclude-domain
|
||||
/>
|
||||
<div class="ml-3 flex-1">
|
||||
<el-form-item label="图片名称">
|
||||
<el-input v-model="item.name" placeholder="请输入名称" />
|
||||
</el-form-item>
|
||||
<el-form-item class="mt-[18px]" label="图片链接">
|
||||
<link-picker v-model="item.link" />
|
||||
</el-form-item>
|
||||
</div>
|
||||
</div>
|
||||
</del-wrap>
|
||||
</div>
|
||||
</el-form-item>
|
||||
<el-form-item v-if="content.data?.length < limit">
|
||||
@@ -52,7 +44,6 @@
|
||||
import feedback from '@/utils/feedback'
|
||||
import type { PropType } from 'vue'
|
||||
import type options from './options'
|
||||
import Draggable from 'vuedraggable'
|
||||
const limit = 5
|
||||
type OptionsType = ReturnType<typeof options>
|
||||
const props = defineProps({
|
||||
|
||||
@@ -10,36 +10,28 @@
|
||||
<el-form-item label="图片设置">
|
||||
<div class="flex-1">
|
||||
<div class="form-tips">最多添加5张,建议图片尺寸:750px*200px</div>
|
||||
<draggable class="draggable" v-model="content.data" animation="300">
|
||||
<template v-slot:item="{ element: item, index }">
|
||||
<del-wrap
|
||||
:key="index"
|
||||
@close="handleDelete(index)"
|
||||
class="max-w-[400px]"
|
||||
>
|
||||
<div
|
||||
class="bg-fill-light flex items-center w-full p-4 mt-4 cursor-move"
|
||||
>
|
||||
<material-picker
|
||||
v-model="item.image"
|
||||
upload-class="bg-body"
|
||||
exclude-domain
|
||||
/>
|
||||
<div class="ml-3 flex-1">
|
||||
<el-form-item label="图片名称">
|
||||
<el-input
|
||||
v-model="item.name"
|
||||
placeholder="请输入名称"
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item class="mt-[18px]" label="图片链接">
|
||||
<link-picker v-model="item.link" />
|
||||
</el-form-item>
|
||||
</div>
|
||||
</div>
|
||||
</del-wrap>
|
||||
</template>
|
||||
</draggable>
|
||||
<del-wrap
|
||||
v-for="(item, index) in content.data"
|
||||
:key="index"
|
||||
@close="handleDelete(index)"
|
||||
class="max-w-[400px]"
|
||||
>
|
||||
<div class="bg-fill-light flex items-center w-full p-4 mt-4">
|
||||
<material-picker
|
||||
v-model="item.image"
|
||||
upload-class="bg-body"
|
||||
exclude-domain
|
||||
/>
|
||||
<div class="ml-3 flex-1">
|
||||
<el-form-item label="图片名称">
|
||||
<el-input v-model="item.name" placeholder="请输入名称" />
|
||||
</el-form-item>
|
||||
<el-form-item class="mt-[18px]" label="图片链接">
|
||||
<link-picker v-model="item.link" />
|
||||
</el-form-item>
|
||||
</div>
|
||||
</div>
|
||||
</del-wrap>
|
||||
</div>
|
||||
</el-form-item>
|
||||
<el-form-item v-if="content.data?.length < limit">
|
||||
@@ -52,7 +44,6 @@
|
||||
import feedback from '@/utils/feedback'
|
||||
import type { PropType } from 'vue'
|
||||
import type options from './options'
|
||||
import Draggable from 'vuedraggable'
|
||||
const limit = 5
|
||||
type OptionsType = ReturnType<typeof options>
|
||||
const props = defineProps({
|
||||
|
||||
@@ -188,7 +188,7 @@ const onMove = (e: any) => {
|
||||
|
||||
const getData = async () => {
|
||||
const data = await getDecorateTabbar()
|
||||
tabbar.list = data.list
|
||||
tabbar.list = data.list.map((item: any) => ({ ...item, link: JSON.parse(item.link) }))
|
||||
tabbar.style = data.style
|
||||
}
|
||||
const setData = async () => {
|
||||
|
||||
@@ -1,388 +1,422 @@
|
||||
<template>
|
||||
<div class="code-edit">
|
||||
<el-card class="!border-none" shadow="never">
|
||||
<el-page-header content="编辑数据表" @back="$router.back()" />
|
||||
</el-card>
|
||||
<el-card class="mt-4 !border-none" shadow="never">
|
||||
<el-form
|
||||
ref="formRef"
|
||||
class="ls-form"
|
||||
:model="formData"
|
||||
label-width="100px"
|
||||
:rules="rules"
|
||||
>
|
||||
<el-tabs v-model="activeName">
|
||||
<el-tab-pane label="基础信息" name="base">
|
||||
<el-form-item label="表名称" prop="base.tableName">
|
||||
<div class="w-80">
|
||||
<el-input
|
||||
v-model="formData.base.tableName"
|
||||
placeholder="请输入表名称"
|
||||
clearable
|
||||
/>
|
||||
</div>
|
||||
</el-form-item>
|
||||
<el-form-item label="表描述" prop="base.tableComment">
|
||||
<div class="w-80">
|
||||
<el-input
|
||||
v-model="formData.base.tableComment"
|
||||
placeholder="请输入表描述"
|
||||
clearable
|
||||
/>
|
||||
</div>
|
||||
</el-form-item>
|
||||
<el-form-item label="实体类名称" prop="base.entityName">
|
||||
<div class="w-80">
|
||||
<el-input
|
||||
v-model="formData.base.entityName"
|
||||
placeholder="请输入实体类名称"
|
||||
clearable
|
||||
/>
|
||||
</div>
|
||||
</el-form-item>
|
||||
<div class="code-edit">
|
||||
<el-card class="!border-none" shadow="never">
|
||||
<el-page-header content="编辑数据表" @back="$router.back()" />
|
||||
</el-card>
|
||||
<el-card class="mt-4 !border-none" shadow="never">
|
||||
<el-form
|
||||
ref="formRef"
|
||||
class="ls-form"
|
||||
:model="formData"
|
||||
label-width="100px"
|
||||
:rules="rules"
|
||||
>
|
||||
<el-tabs v-model="activeName">
|
||||
<el-tab-pane label="基础信息" name="base">
|
||||
<el-form-item label="表名称" prop="base.tableName">
|
||||
<div class="w-80">
|
||||
<el-input
|
||||
v-model="formData.base.tableName"
|
||||
placeholder="请输入表名称"
|
||||
clearable
|
||||
/>
|
||||
</div>
|
||||
</el-form-item>
|
||||
<el-form-item label="表描述" prop="base.tableComment">
|
||||
<div class="w-80">
|
||||
<el-input
|
||||
v-model="formData.base.tableComment"
|
||||
placeholder="请输入表描述"
|
||||
clearable
|
||||
/>
|
||||
</div>
|
||||
</el-form-item>
|
||||
<el-form-item label="实体类名称" prop="base.entityName">
|
||||
<div class="w-80">
|
||||
<el-input
|
||||
v-model="formData.base.entityName"
|
||||
placeholder="请输入实体类名称"
|
||||
clearable
|
||||
/>
|
||||
</div>
|
||||
</el-form-item>
|
||||
|
||||
<el-form-item label="作者" prop="base.authorName">
|
||||
<div class="w-80">
|
||||
<el-input
|
||||
v-model="formData.base.authorName"
|
||||
placeholder="请输入作者"
|
||||
clearable
|
||||
/>
|
||||
</div>
|
||||
</el-form-item>
|
||||
<el-form-item label="备注">
|
||||
<div class="w-80">
|
||||
<el-input
|
||||
v-model="formData.base.remarks"
|
||||
class="w-full"
|
||||
type="textarea"
|
||||
:autosize="{ minRows: 4, maxRows: 4 }"
|
||||
maxlength="200"
|
||||
show-word-limit
|
||||
clearable
|
||||
/>
|
||||
</div>
|
||||
</el-form-item>
|
||||
</el-tab-pane>
|
||||
<el-tab-pane label="字段管理" name="column">
|
||||
<el-table :data="formData.column">
|
||||
<el-table-column label="字段列名" prop="columnName" />
|
||||
<el-table-column label="字段描述" prop="columnComment" min-width="120">
|
||||
<template v-slot="{ row }">
|
||||
<el-input v-model="row.columnComment"></el-input>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="物理类型" prop="columnType" min-width="100" />
|
||||
<el-table-column label="Java类型" min-width="100">
|
||||
<template v-slot="{ row }">
|
||||
<el-select v-model="row.javaType">
|
||||
<el-option label="Long" value="Long" />
|
||||
<el-option label="String" value="String" />
|
||||
<el-option label="Integer" value="Integer" />
|
||||
<el-option label="Double" value="Double" />
|
||||
<el-option label="BigDecimal" value="BigDecimal" />
|
||||
<el-option label="Date" value="Date" />
|
||||
<el-option label="Boolean" value="Boolean" />
|
||||
</el-select>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="Java属性" min-width="100">
|
||||
<template v-slot="{ row }">
|
||||
<el-input v-model="row.javaField" />
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="必填" width="80">
|
||||
<template v-slot="{ row }">
|
||||
<el-checkbox
|
||||
v-model="row.isRequired"
|
||||
:true-label="1"
|
||||
:false-label="0"
|
||||
/>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="插入" width="80">
|
||||
<template v-slot="{ row }">
|
||||
<el-checkbox
|
||||
v-model="row.isInsert"
|
||||
:true-label="1"
|
||||
:false-label="0"
|
||||
/>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="编辑" width="80">
|
||||
<template v-slot="{ row }">
|
||||
<el-checkbox
|
||||
v-model="row.isEdit"
|
||||
:true-label="1"
|
||||
:false-label="0"
|
||||
/>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="列表" width="80">
|
||||
<template v-slot="{ row }">
|
||||
<el-checkbox
|
||||
v-model="row.isList"
|
||||
:true-label="1"
|
||||
:false-label="0"
|
||||
/>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="查询" width="80">
|
||||
<template v-slot="{ row }">
|
||||
<el-checkbox
|
||||
v-model="row.isQuery"
|
||||
:true-label="1"
|
||||
:false-label="0"
|
||||
/>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="查询方式">
|
||||
<template v-slot="{ row }">
|
||||
<el-select v-model="row.queryType">
|
||||
<el-option label="=" value="EQ" />
|
||||
<el-option label="!=" value="NE" />
|
||||
<el-option label=">" value="GT" />
|
||||
<el-option label=">=" value="GTE" />
|
||||
<el-option label="<" value="LT" />
|
||||
<el-option label="<=" value="LTE" />
|
||||
<el-option label="LIKE" value="LIKE" />
|
||||
<el-option label="BETWEEN" value="BETWEEN" />
|
||||
</el-select>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="显示类型" min-width="120">
|
||||
<template v-slot="{ row }">
|
||||
<el-select v-model="row.htmlType">
|
||||
<el-option label="文本框" value="input" />
|
||||
<el-option label="数字框" value="number" />
|
||||
<el-option label="文本域" value="textarea" />
|
||||
<el-option label="下拉框" value="select" />
|
||||
<el-option label="单选框" value="radio" />
|
||||
<el-option label="复选框" value="checkbox" />
|
||||
<el-option label="日期控件" value="datetime" />
|
||||
<el-option label="图片选择控件" value="imageUpload" />
|
||||
<el-option label="富文本控件" value="editor" />
|
||||
</el-select>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="字典类型" min-width="120">
|
||||
<template v-slot="{ row }">
|
||||
<el-select
|
||||
v-model="row.dictType"
|
||||
clearable
|
||||
:disabled="
|
||||
!(
|
||||
row.htmlType == 'select' ||
|
||||
row.htmlType == 'radio' ||
|
||||
row.htmlType == 'checkbox'
|
||||
)
|
||||
"
|
||||
placeholder="字典类型"
|
||||
>
|
||||
<el-option
|
||||
v-for="(item, index) in optionsData.dictType"
|
||||
:key="index"
|
||||
:label="item.dictName"
|
||||
:value="item.dictType"
|
||||
:disabled="!item.dictStatus"
|
||||
/>
|
||||
</el-select>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
</el-tab-pane>
|
||||
<el-tab-pane label="生成配置" name="config">
|
||||
<el-form-item label="模板类型" prop="gen.genTpl" required>
|
||||
<el-radio-group v-model="formData.gen.genTpl">
|
||||
<el-radio :label="GenTpl.CRUD">单表(增删改查)</el-radio>
|
||||
<el-radio :label="GenTpl.TREE">树表(增删改查)</el-radio>
|
||||
</el-radio-group>
|
||||
</el-form-item>
|
||||
<el-form-item label="模块名" prop="gen.moduleName">
|
||||
<div class="w-80">
|
||||
<el-input
|
||||
v-model="formData.gen.moduleName"
|
||||
placeholder="请输入模块名"
|
||||
clearable
|
||||
/>
|
||||
<div class="form-tips">生成文件所在模块名</div>
|
||||
</div>
|
||||
</el-form-item>
|
||||
<el-form-item label="功能名称" prop="gen.functionName">
|
||||
<div class="w-80">
|
||||
<el-input
|
||||
v-model="formData.gen.functionName"
|
||||
placeholder="请输入功能名称"
|
||||
clearable
|
||||
/>
|
||||
</div>
|
||||
</el-form-item>
|
||||
<el-form-item label="生成方式" prop="gen.genType">
|
||||
<el-radio-group v-model="formData.gen.genType">
|
||||
<el-radio :label="GenType.ZIP">压缩包下载</el-radio>
|
||||
<el-radio :label="GenType.CUSTOM_PATH">自定义路径</el-radio>
|
||||
</el-radio-group>
|
||||
</el-form-item>
|
||||
<el-form-item
|
||||
v-if="formData.gen.genType == GenType.CUSTOM_PATH"
|
||||
label="自定义路径"
|
||||
prop="gen.genPath"
|
||||
>
|
||||
<div class="w-80">
|
||||
<el-input
|
||||
v-model="formData.gen.genPath"
|
||||
placeholder="请输入自定义路径"
|
||||
clearable
|
||||
/>
|
||||
</div>
|
||||
</el-form-item>
|
||||
<template v-if="formData.gen.genTpl == GenTpl.TREE">
|
||||
<el-form-item label="树主键字段" prop="gen.treePrimary">
|
||||
<el-select
|
||||
class="w-80"
|
||||
v-model="formData.gen.treePrimary"
|
||||
clearable
|
||||
>
|
||||
<el-option
|
||||
v-for="item in formData.column"
|
||||
:key="item.id"
|
||||
:value="item.columnName"
|
||||
:label="`${item.columnName}:${item.columnComment}`"
|
||||
/>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="树父级字段" prop="gen.treeParent">
|
||||
<el-select class="w-80" v-model="formData.gen.treeParent" clearable>
|
||||
<el-option
|
||||
v-for="item in formData.column"
|
||||
:key="item.id"
|
||||
:value="item.columnName"
|
||||
:label="`${item.columnName}:${item.columnComment}`"
|
||||
/>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="树名称字段" prop="gen.treeName">
|
||||
<el-select class="w-80" v-model="formData.gen.treeName" clearable>
|
||||
<el-option
|
||||
v-for="item in formData.column"
|
||||
:key="item.id"
|
||||
:value="item.columnName"
|
||||
:label="`${item.columnName}:${item.columnComment}`"
|
||||
/>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
</template>
|
||||
</el-tab-pane>
|
||||
</el-tabs>
|
||||
</el-form>
|
||||
</el-card>
|
||||
<footer-btns>
|
||||
<el-button type="primary" @click="handleSave">保存</el-button>
|
||||
</footer-btns>
|
||||
</div>
|
||||
<el-form-item label="作者" prop="base.authorName">
|
||||
<div class="w-80">
|
||||
<el-input
|
||||
v-model="formData.base.authorName"
|
||||
placeholder="请输入作者"
|
||||
clearable
|
||||
/>
|
||||
</div>
|
||||
</el-form-item>
|
||||
<el-form-item label="备注">
|
||||
<div class="w-80">
|
||||
<el-input
|
||||
v-model="formData.base.remarks"
|
||||
class="w-full"
|
||||
type="textarea"
|
||||
:autosize="{ minRows: 4, maxRows: 4 }"
|
||||
maxlength="200"
|
||||
show-word-limit
|
||||
clearable
|
||||
/>
|
||||
</div>
|
||||
</el-form-item>
|
||||
</el-tab-pane>
|
||||
<el-tab-pane label="字段管理" name="column">
|
||||
<el-table :data="formData.column">
|
||||
<el-table-column label="字段列名" prop="columnName" />
|
||||
<el-table-column
|
||||
label="字段描述"
|
||||
prop="columnComment"
|
||||
min-width="120"
|
||||
>
|
||||
<template v-slot="{ row }">
|
||||
<el-input v-model="row.columnComment"></el-input>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column
|
||||
label="物理类型"
|
||||
prop="columnType"
|
||||
min-width="100"
|
||||
/>
|
||||
<el-table-column label="python类型" min-width="100">
|
||||
<template v-slot="{ row }">
|
||||
<el-select v-model="row.pyType">
|
||||
<el-option label="Long" value="Long" />
|
||||
<el-option label="String" value="String" />
|
||||
<el-option label="Integer" value="Integer" />
|
||||
<el-option label="Double" value="Double" />
|
||||
<el-option label="BigDecimal" value="BigDecimal" />
|
||||
<el-option label="Date" value="Date" />
|
||||
<el-option label="Boolean" value="Boolean" />
|
||||
</el-select>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="python属性" min-width="100">
|
||||
<template v-slot="{ row }">
|
||||
<el-input v-model="row.pyField" />
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="必填" width="80">
|
||||
<template v-slot="{ row }">
|
||||
<el-checkbox
|
||||
v-model="row.isRequired"
|
||||
:true-label="1"
|
||||
:false-label="0"
|
||||
/>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="插入" width="80">
|
||||
<template v-slot="{ row }">
|
||||
<el-checkbox
|
||||
v-model="row.isInsert"
|
||||
:true-label="1"
|
||||
:false-label="0"
|
||||
/>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="编辑" width="80">
|
||||
<template v-slot="{ row }">
|
||||
<el-checkbox
|
||||
v-model="row.isEdit"
|
||||
:true-label="1"
|
||||
:false-label="0"
|
||||
/>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="列表" width="80">
|
||||
<template v-slot="{ row }">
|
||||
<el-checkbox
|
||||
v-model="row.isList"
|
||||
:true-label="1"
|
||||
:false-label="0"
|
||||
/>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="查询" width="80">
|
||||
<template v-slot="{ row }">
|
||||
<el-checkbox
|
||||
v-model="row.isQuery"
|
||||
:true-label="1"
|
||||
:false-label="0"
|
||||
/>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="查询方式">
|
||||
<template v-slot="{ row }">
|
||||
<el-select v-model="row.queryType">
|
||||
<el-option label="=" value="EQ" />
|
||||
<el-option label="!=" value="NE" />
|
||||
<el-option label=">" value="GT" />
|
||||
<el-option label=">=" value="GTE" />
|
||||
<el-option label="<" value="LT" />
|
||||
<el-option label="<=" value="LTE" />
|
||||
<el-option label="LIKE" value="LIKE" />
|
||||
<el-option label="BETWEEN" value="BETWEEN" />
|
||||
</el-select>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="显示类型" min-width="120">
|
||||
<template v-slot="{ row }">
|
||||
<el-select v-model="row.htmlType">
|
||||
<el-option label="文本框" value="input" />
|
||||
<el-option label="数字框" value="number" />
|
||||
<el-option label="文本域" value="textarea" />
|
||||
<el-option label="下拉框" value="select" />
|
||||
<el-option label="单选框" value="radio" />
|
||||
<el-option label="复选框" value="checkbox" />
|
||||
<el-option label="日期控件" value="datetime" />
|
||||
<el-option label="图片选择控件" value="imageUpload" />
|
||||
<el-option label="富文本控件" value="editor" />
|
||||
</el-select>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="字典类型" min-width="120">
|
||||
<template v-slot="{ row }">
|
||||
<el-select
|
||||
v-model="row.dictType"
|
||||
clearable
|
||||
:disabled="
|
||||
!(
|
||||
row.htmlType == 'select' ||
|
||||
row.htmlType == 'radio' ||
|
||||
row.htmlType == 'checkbox'
|
||||
)
|
||||
"
|
||||
placeholder="字典类型"
|
||||
>
|
||||
<el-option
|
||||
v-for="(item, index) in optionsData.dictType"
|
||||
:key="index"
|
||||
:label="item.dictName"
|
||||
:value="item.dictType"
|
||||
:disabled="!item.dictStatus"
|
||||
/>
|
||||
</el-select>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
</el-tab-pane>
|
||||
<el-tab-pane label="生成配置" name="config">
|
||||
<el-form-item label="模板类型" prop="gen.genTpl" required>
|
||||
<el-radio-group v-model="formData.gen.genTpl">
|
||||
<el-radio :label="GenTpl.CRUD">单表(增删改查)</el-radio>
|
||||
<el-radio :label="GenTpl.TREE">树表(增删改查)</el-radio>
|
||||
</el-radio-group>
|
||||
</el-form-item>
|
||||
<el-form-item label="模块名" prop="gen.moduleName">
|
||||
<div class="w-80">
|
||||
<el-input
|
||||
v-model="formData.gen.moduleName"
|
||||
placeholder="请输入模块名"
|
||||
clearable
|
||||
/>
|
||||
<div class="form-tips">生成文件所在模块名</div>
|
||||
</div>
|
||||
</el-form-item>
|
||||
<el-form-item label="功能名称" prop="gen.functionName">
|
||||
<div class="w-80">
|
||||
<el-input
|
||||
v-model="formData.gen.functionName"
|
||||
placeholder="请输入功能名称"
|
||||
clearable
|
||||
/>
|
||||
</div>
|
||||
</el-form-item>
|
||||
<el-form-item label="生成方式" prop="gen.genType">
|
||||
<el-radio-group v-model="formData.gen.genType">
|
||||
<el-radio :label="GenType.ZIP">压缩包下载</el-radio>
|
||||
<el-radio :label="GenType.CUSTOM_PATH">自定义路径</el-radio>
|
||||
</el-radio-group>
|
||||
</el-form-item>
|
||||
<el-form-item
|
||||
v-if="formData.gen.genType == GenType.CUSTOM_PATH"
|
||||
label="自定义路径"
|
||||
prop="gen.genPath"
|
||||
>
|
||||
<div class="w-80">
|
||||
<el-input
|
||||
v-model="formData.gen.genPath"
|
||||
placeholder="请输入自定义路径"
|
||||
clearable
|
||||
/>
|
||||
</div>
|
||||
</el-form-item>
|
||||
<template v-if="formData.gen.genTpl == GenTpl.TREE">
|
||||
<el-form-item label="树主键字段" prop="gen.treePrimary">
|
||||
<el-select
|
||||
class="w-80"
|
||||
v-model="formData.gen.treePrimary"
|
||||
clearable
|
||||
>
|
||||
<el-option
|
||||
v-for="item in formData.column"
|
||||
:key="item.id"
|
||||
:value="item.columnName"
|
||||
:label="`${item.columnName}:${item.columnComment}`"
|
||||
/>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="树父级字段" prop="gen.treeParent">
|
||||
<el-select
|
||||
class="w-80"
|
||||
v-model="formData.gen.treeParent"
|
||||
clearable
|
||||
>
|
||||
<el-option
|
||||
v-for="item in formData.column"
|
||||
:key="item.id"
|
||||
:value="item.columnName"
|
||||
:label="`${item.columnName}:${item.columnComment}`"
|
||||
/>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="树名称字段" prop="gen.treeName">
|
||||
<el-select
|
||||
class="w-80"
|
||||
v-model="formData.gen.treeName"
|
||||
clearable
|
||||
>
|
||||
<el-option
|
||||
v-for="item in formData.column"
|
||||
:key="item.id"
|
||||
:value="item.columnName"
|
||||
:label="`${item.columnName}:${item.columnComment}`"
|
||||
/>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
</template>
|
||||
</el-tab-pane>
|
||||
</el-tabs>
|
||||
</el-form>
|
||||
</el-card>
|
||||
<footer-btns>
|
||||
<el-button type="primary" @click="handleSave">保存</el-button>
|
||||
</footer-btns>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script lang="ts" setup name="tableEdit">
|
||||
import { generateEdit, tableDetail } from '@/api/tools/code'
|
||||
import { dictTypeAll } from '@/api/setting/dict'
|
||||
import type { FormInstance } from 'element-plus'
|
||||
import feedback from '@/utils/feedback'
|
||||
import { menuLists } from '@/api/perms/menu'
|
||||
import { useDictOptions } from '@/hooks/useDictOptions'
|
||||
import useMultipleTabs from '@/hooks/useMultipleTabs'
|
||||
import { generateEdit, tableDetail } from "@/api/tools/code";
|
||||
import { dictTypeAll } from "@/api/setting/dict";
|
||||
import type { FormInstance } from "element-plus";
|
||||
import feedback from "@/utils/feedback";
|
||||
import { menuLists } from "@/api/perms/menu";
|
||||
import { useDictOptions } from "@/hooks/useDictOptions";
|
||||
import useMultipleTabs from "@/hooks/useMultipleTabs";
|
||||
enum GenTpl {
|
||||
CRUD = 'crud',
|
||||
TREE = 'tree'
|
||||
CRUD = "crud",
|
||||
TREE = "tree",
|
||||
}
|
||||
|
||||
enum GenType {
|
||||
ZIP,
|
||||
CUSTOM_PATH
|
||||
ZIP,
|
||||
CUSTOM_PATH,
|
||||
}
|
||||
|
||||
const route = useRoute()
|
||||
const router = useRouter()
|
||||
const { removeTab } = useMultipleTabs()
|
||||
const activeName = ref('column')
|
||||
const route = useRoute();
|
||||
const router = useRouter();
|
||||
const { removeTab } = useMultipleTabs();
|
||||
const activeName = ref("column");
|
||||
const formData = reactive({
|
||||
base: {
|
||||
id: '',
|
||||
tableName: '',
|
||||
tableComment: '',
|
||||
entityName: '',
|
||||
authorName: '',
|
||||
remarks: ''
|
||||
},
|
||||
column: [] as any[],
|
||||
gen: {
|
||||
functionName: '',
|
||||
genPath: '',
|
||||
genTpl: '',
|
||||
genType: 0,
|
||||
moduleName: '',
|
||||
subTableFk: '',
|
||||
subTableName: '',
|
||||
treeParent: '',
|
||||
treePrimary: '',
|
||||
treeName: ''
|
||||
}
|
||||
})
|
||||
base: {
|
||||
id: "",
|
||||
tableName: "",
|
||||
tableComment: "",
|
||||
entityName: "",
|
||||
authorName: "",
|
||||
remarks: "",
|
||||
},
|
||||
column: [] as any[],
|
||||
gen: {
|
||||
functionName: "",
|
||||
genPath: "",
|
||||
genTpl: "",
|
||||
genType: 0,
|
||||
moduleName: "",
|
||||
subTableFk: "",
|
||||
subTableName: "",
|
||||
treeParent: "",
|
||||
treePrimary: "",
|
||||
treeName: "",
|
||||
},
|
||||
});
|
||||
|
||||
const formRef = shallowRef<FormInstance>()
|
||||
const formRef = shallowRef<FormInstance>();
|
||||
const rules = reactive({
|
||||
['base.tableName']: [{ required: true, message: '请输入表名称', trigger: 'blur' }],
|
||||
['base.tableComment']: [{ required: true, message: '请输入表描述', trigger: 'blur' }],
|
||||
['base.entityName']: [{ required: true, message: '请输入实体类名称', trigger: 'blur' }],
|
||||
['base.authorName']: [{ required: true, message: '请输入作者', trigger: 'blur' }],
|
||||
['gen.moduleName']: [{ required: true, message: '请输入模块名', trigger: 'blur' }],
|
||||
['gen.functionName']: [{ required: true, message: '请输入功能名称', trigger: 'blur' }],
|
||||
['gen.treePrimary']: [{ required: true, message: '请选择树主键字段', trigger: 'blur' }],
|
||||
['gen.treeParent']: [{ required: true, message: '请选择树父级字段', trigger: 'blur' }],
|
||||
['gen.treeName']: [{ required: true, message: '请选择树名称字段', trigger: 'blur' }]
|
||||
})
|
||||
["base.tableName"]: [
|
||||
{ required: true, message: "请输入表名称", trigger: "blur" },
|
||||
],
|
||||
["base.tableComment"]: [
|
||||
{ required: true, message: "请输入表描述", trigger: "blur" },
|
||||
],
|
||||
["base.entityName"]: [
|
||||
{ required: true, message: "请输入实体类名称", trigger: "blur" },
|
||||
],
|
||||
["base.authorName"]: [
|
||||
{ required: true, message: "请输入作者", trigger: "blur" },
|
||||
],
|
||||
["gen.moduleName"]: [
|
||||
{ required: true, message: "请输入模块名", trigger: "blur" },
|
||||
],
|
||||
["gen.functionName"]: [
|
||||
{ required: true, message: "请输入功能名称", trigger: "blur" },
|
||||
],
|
||||
["gen.treePrimary"]: [
|
||||
{ required: true, message: "请选择树主键字段", trigger: "blur" },
|
||||
],
|
||||
["gen.treeParent"]: [
|
||||
{ required: true, message: "请选择树父级字段", trigger: "blur" },
|
||||
],
|
||||
["gen.treeName"]: [
|
||||
{ required: true, message: "请选择树名称字段", trigger: "blur" },
|
||||
],
|
||||
});
|
||||
|
||||
const getDetails = async () => {
|
||||
const data = await tableDetail({
|
||||
id: route.query.id
|
||||
})
|
||||
Object.keys(formData).forEach((key) => {
|
||||
//@ts-ignore
|
||||
formData[key] = data[key]
|
||||
})
|
||||
}
|
||||
const data = await tableDetail({
|
||||
id: route.query.id,
|
||||
});
|
||||
Object.keys(formData).forEach((key) => {
|
||||
//@ts-ignore
|
||||
formData[key] = data[key];
|
||||
});
|
||||
};
|
||||
|
||||
const { optionsData } = useDictOptions<{
|
||||
dictType: any[]
|
||||
menu: any[]
|
||||
dictType: any[];
|
||||
menu: any[];
|
||||
}>({
|
||||
dictType: {
|
||||
api: dictTypeAll
|
||||
dictType: {
|
||||
api: dictTypeAll,
|
||||
},
|
||||
menu: {
|
||||
api: menuLists,
|
||||
transformData(data: any) {
|
||||
const menu = { id: 0, name: "顶级", children: [] };
|
||||
menu.children = data;
|
||||
return menu;
|
||||
},
|
||||
menu: {
|
||||
api: menuLists,
|
||||
transformData(data: any) {
|
||||
const menu = { id: 0, name: '顶级', children: [] }
|
||||
menu.children = data
|
||||
return menu
|
||||
}
|
||||
}
|
||||
})
|
||||
},
|
||||
});
|
||||
|
||||
const handleSave = async () => {
|
||||
try {
|
||||
await formRef.value?.validate()
|
||||
const { base, column, gen } = formData
|
||||
await generateEdit({ ...base, ...gen, column })
|
||||
feedback.msgSuccess('操作成功')
|
||||
removeTab()
|
||||
router.back()
|
||||
} catch (error: any) {
|
||||
for (const err in error) {
|
||||
const isInRules = Object.keys(rules).includes(err)
|
||||
isInRules && feedback.msgError(error[err][0]?.message)
|
||||
}
|
||||
try {
|
||||
await formRef.value?.validate();
|
||||
const { base, column, gen } = formData;
|
||||
await generateEdit({ ...base, ...gen, columns: column });
|
||||
feedback.msgSuccess("操作成功");
|
||||
removeTab();
|
||||
router.back();
|
||||
} catch (error: any) {
|
||||
for (const err in error) {
|
||||
const isInRules = Object.keys(rules).includes(err);
|
||||
isInRules && feedback.msgError(error[err][0]?.message);
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
getDetails()
|
||||
getDetails();
|
||||
</script>
|
||||
|
||||
@@ -149,18 +149,24 @@ const open = (type = 'add') => {
|
||||
}
|
||||
|
||||
const setFormData = (data: Record<any, any>) => {
|
||||
for (const key in formData) {
|
||||
for (const key in formData) {
|
||||
if (data[key] != null && data[key] != undefined) {
|
||||
//@ts-ignore
|
||||
//@ts-ignore
|
||||
formData[key] = data[key]
|
||||
}
|
||||
//TODO:因为后端返回字段为is_stop
|
||||
else{
|
||||
//@ts-ignore
|
||||
formData[key] = data['is_stop']
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
const getDetail = async (row: Record<string, any>) => {
|
||||
const data = await deptDetail({
|
||||
id: row.id
|
||||
})
|
||||
})
|
||||
setFormData(data)
|
||||
}
|
||||
|
||||
|
||||
@@ -100,6 +100,11 @@ const setFormData = (data: Record<any, any>) => {
|
||||
//@ts-ignore
|
||||
formData[key] = data[key]
|
||||
}
|
||||
//TODO:因为后端返回字段为is_stop
|
||||
else{
|
||||
//@ts-ignore
|
||||
formData[key] = data['is_stop']
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -28,14 +28,13 @@
|
||||
<el-form-item label="名称" prop="nickname">
|
||||
<el-input v-model="formData.nickname" placeholder="请输入名称" clearable />
|
||||
</el-form-item>
|
||||
<el-form-item label="归属部门" prop="deptIds">
|
||||
<el-form-item label="归属部门" prop="deptId">
|
||||
<el-tree-select
|
||||
class="flex-1"
|
||||
v-model="formData.deptIds"
|
||||
v-model="formData.deptId"
|
||||
:data="optionsData.dept"
|
||||
clearable
|
||||
node-key="id"
|
||||
multiple
|
||||
:props="{
|
||||
value: 'id',
|
||||
label: 'name',
|
||||
@@ -48,12 +47,11 @@
|
||||
placeholder="请选择上级部门"
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item label="岗位" prop="postIds">
|
||||
<el-form-item label="岗位" prop="postId">
|
||||
<el-select
|
||||
class="flex-1"
|
||||
clearable
|
||||
multiple
|
||||
v-model="formData.postIds"
|
||||
v-model="formData.postId"
|
||||
placeholder="请选择岗位"
|
||||
>
|
||||
<el-option
|
||||
@@ -65,11 +63,10 @@
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
|
||||
<el-form-item label="角色" prop="roleIds">
|
||||
<el-form-item label="角色" prop="role">
|
||||
<el-select
|
||||
v-model="formData.roleIds"
|
||||
v-model="formData.role"
|
||||
:disabled="isRoot"
|
||||
multiple
|
||||
class="flex-1"
|
||||
clearable
|
||||
placeholder="请选择角色"
|
||||
@@ -79,7 +76,7 @@
|
||||
v-for="(item, index) in optionsData.role"
|
||||
:key="index"
|
||||
:label="item.name"
|
||||
:value="item.id"
|
||||
:value="String(item.id)"
|
||||
/>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
@@ -138,21 +135,23 @@ const popupTitle = computed(() => {
|
||||
})
|
||||
|
||||
const formData = reactive({
|
||||
id: 0,
|
||||
id: '',
|
||||
username: '',
|
||||
nickname: '',
|
||||
deptIds: [],
|
||||
postIds: [],
|
||||
roleIds: [],
|
||||
deptId: '',
|
||||
postId: '',
|
||||
role: '',
|
||||
avatar: '',
|
||||
password: '',
|
||||
passwordConfirm: '',
|
||||
isDisable: 0,
|
||||
isMultipoint: 1
|
||||
isMultipoint: 1,
|
||||
//服务端为必传参数,先给默认值
|
||||
sort:'1'
|
||||
})
|
||||
|
||||
const isRoot = computed(() => {
|
||||
return formData.id == 1
|
||||
return formData.role == '0'
|
||||
})
|
||||
|
||||
const passwordConfirmValidator = (rule: object, value: string, callback: any) => {
|
||||
@@ -177,14 +176,27 @@ const formRules = reactive({
|
||||
trigger: ['blur']
|
||||
}
|
||||
],
|
||||
roleIds: [
|
||||
role: [
|
||||
{
|
||||
type: 'array',
|
||||
required: true,
|
||||
message: '请选择角色',
|
||||
trigger: ['blur']
|
||||
}
|
||||
],
|
||||
deptId:[
|
||||
{
|
||||
required: true,
|
||||
message: '请输入名称',
|
||||
trigger: ['blur']
|
||||
}
|
||||
],
|
||||
postId:[
|
||||
{
|
||||
required: true,
|
||||
message: '请输入名称',
|
||||
trigger: ['blur']
|
||||
}
|
||||
],
|
||||
password: [
|
||||
{
|
||||
required: true,
|
||||
@@ -235,13 +247,6 @@ const open = (type = 'add') => {
|
||||
}
|
||||
|
||||
const setFormData = async (row: any) => {
|
||||
formRules.password = []
|
||||
formRules.passwordConfirm = [
|
||||
{
|
||||
validator: passwordConfirmValidator,
|
||||
trigger: 'blur'
|
||||
}
|
||||
]
|
||||
const data = await adminDetail({
|
||||
id: row.id
|
||||
})
|
||||
@@ -250,7 +255,16 @@ const setFormData = async (row: any) => {
|
||||
//@ts-ignore
|
||||
formData[key] = data[key]
|
||||
}
|
||||
Number(formData.deptId) == 0 && (formData.deptId = '')
|
||||
Number(formData.postId) == 0 && (formData.postId = '')
|
||||
}
|
||||
formRules.password = []
|
||||
formRules.passwordConfirm = [
|
||||
{
|
||||
validator: passwordConfirmValidator,
|
||||
trigger: 'blur'
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
const handleClose = () => {
|
||||
|
||||
@@ -52,18 +52,8 @@
|
||||
</el-table-column>
|
||||
<el-table-column label="账号" prop="username" min-width="100" />
|
||||
<el-table-column label="名称" prop="nickname" min-width="100" />
|
||||
<el-table-column
|
||||
label="角色"
|
||||
prop="role"
|
||||
show-tooltip-when-overflow
|
||||
min-width="100"
|
||||
/>
|
||||
<el-table-column
|
||||
label="部门"
|
||||
prop="dept"
|
||||
show-tooltip-when-overflow
|
||||
min-width="100"
|
||||
/>
|
||||
<el-table-column label="角色" prop="role" min-width="100" />
|
||||
<el-table-column label="部门" prop="dept" min-width="100" />
|
||||
<el-table-column label="创建时间" prop="createTime" min-width="180" />
|
||||
<el-table-column label="最近登录时间" prop="lastLoginTime" min-width="180" />
|
||||
<el-table-column label="最近登录IP" prop="lastLoginIp" min-width="120" />
|
||||
|
||||
@@ -224,7 +224,7 @@ const formData = reactive({
|
||||
//路由参数
|
||||
params: '',
|
||||
//是否缓存 0=否, 1=是
|
||||
isCache: 0,
|
||||
isCache: 1,
|
||||
//是否显示 0=否, 1=是
|
||||
isShow: 1,
|
||||
//是否禁用 0=否, 1=是
|
||||
|
||||
@@ -1,39 +1,27 @@
|
||||
<template>
|
||||
<div class="storage">
|
||||
<el-card class="!border-none" shadow="never">
|
||||
<el-alert
|
||||
type="warning"
|
||||
title="温馨提示:1.切换存储方式后,需要将资源文件传输至新的存储端;2.请勿随意切换存储方式,可能导致图片无法查看"
|
||||
:closable="false"
|
||||
show-icon
|
||||
></el-alert>
|
||||
</el-card>
|
||||
<el-card class="!border-none mt-4" shadow="never" v-loading="state.loading">
|
||||
<el-table size="large" :data="state.lists">
|
||||
<el-table-column label="储存方式" prop="name" min-width="120" />
|
||||
<el-table-column label="储存位置" prop="describe" min-width="160" />
|
||||
<el-table-column label="状态" min-width="80">
|
||||
<template #default="{ row }">
|
||||
<el-tag v-if="row.status == 1">开启</el-tag>
|
||||
<el-tag type="danger" v-else>关闭</el-tag>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="操作" min-width="80" fixed="right">
|
||||
<template #default="{ row }">
|
||||
<el-button
|
||||
v-perms="['setting:storage:edit']"
|
||||
type="primary"
|
||||
link
|
||||
@click="handleSet(row.alias)"
|
||||
>
|
||||
设置
|
||||
</el-button>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
</el-card>
|
||||
<edit-popup ref="editRef" @success="getLists" />
|
||||
</div>
|
||||
<div class="storage">
|
||||
<el-card class="!border-none" shadow="never">
|
||||
<el-alert type="warning" title="温馨提示:1.切换存储方式后,需要将资源文件传输至新的存储端;2.请勿随意切换存储方式,可能导致图片无法查看" :closable="false" show-icon></el-alert>
|
||||
</el-card>
|
||||
<el-card class="!border-none mt-4" shadow="never" v-loading="state.loading">
|
||||
<el-table size="large" :data="state.lists">
|
||||
<el-table-column label="储存方式" prop="alias" min-width="120" />
|
||||
<el-table-column label="储存位置" prop="describe" min-width="160" />
|
||||
<el-table-column label="状态" min-width="80">
|
||||
<template #default="{ row }">
|
||||
<el-tag v-if="row.status == 1">开启</el-tag>
|
||||
<el-tag type="danger" v-else>关闭</el-tag>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="操作" min-width="80" fixed="right">
|
||||
<template #default="{ row }">
|
||||
<el-button v-perms="['setting:storage:edit']" type="primary" link @click="handleSet(row.alias)"> 设置 </el-button>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
</el-card>
|
||||
<edit-popup ref="editRef" @success="getLists" />
|
||||
</div>
|
||||
</template>
|
||||
<script lang="ts" setup name="storage">
|
||||
import { storageLists } from '@/api/setting/storage'
|
||||
@@ -42,23 +30,23 @@ const editRef = shallowRef<InstanceType<typeof EditPopup>>()
|
||||
|
||||
// 列表数据
|
||||
const state = reactive({
|
||||
loading: false,
|
||||
lists: []
|
||||
loading: false,
|
||||
lists: []
|
||||
})
|
||||
|
||||
// 获取存储引擎列表数据
|
||||
const getLists = async () => {
|
||||
try {
|
||||
state.loading = true
|
||||
state.lists = await storageLists()
|
||||
state.loading = false
|
||||
} catch (error) {
|
||||
state.loading = false
|
||||
}
|
||||
try {
|
||||
state.loading = true
|
||||
state.lists = await storageLists()
|
||||
state.loading = false
|
||||
} catch (error) {
|
||||
state.loading = false
|
||||
}
|
||||
}
|
||||
|
||||
const handleSet = (alias: string) => {
|
||||
editRef.value?.open(alias)
|
||||
editRef.value?.open(alias)
|
||||
}
|
||||
|
||||
getLists()
|
||||
|
||||
@@ -1,142 +0,0 @@
|
||||
<template>
|
||||
<div class="article-edit">
|
||||
<el-card class="!border-none" shadow="never">
|
||||
<el-page-header :content="$route.meta.title" @back="$router.back()" />
|
||||
</el-card>
|
||||
<el-card class="mt-4 !border-none" shadow="never">
|
||||
<el-form
|
||||
ref="formRef"
|
||||
class="ls-form"
|
||||
:model="formData"
|
||||
label-width="96px"
|
||||
:rules="rules"
|
||||
>
|
||||
<el-form-item label="任务名称" prop="name">
|
||||
<div class="w-80">
|
||||
<el-input
|
||||
v-model="formData.name"
|
||||
placeholder="请输入任务名称"
|
||||
maxlength="30"
|
||||
clearable
|
||||
/>
|
||||
</div>
|
||||
</el-form-item>
|
||||
<el-form-item label="任务分组" prop="groups">
|
||||
<el-select
|
||||
class="w-80"
|
||||
v-model="formData.groups"
|
||||
clearable
|
||||
placeholder="请选择任务分组"
|
||||
>
|
||||
<el-option label="默认" value="default" />
|
||||
<el-option label="系统" value="system" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="调用方法" prop="command">
|
||||
<div class="w-80">
|
||||
<el-input
|
||||
v-model="formData.command"
|
||||
placeholder="请输入调用目标字符串"
|
||||
clearable
|
||||
/>
|
||||
</div>
|
||||
</el-form-item>
|
||||
|
||||
<el-form-item label="cron表达式" prop="rules">
|
||||
<div class="w-80">
|
||||
<el-input v-model="formData.rules" placeholder="请输入cron执行表达式" />
|
||||
</div>
|
||||
</el-form-item>
|
||||
|
||||
<el-form-item label="备注" prop="remark">
|
||||
<div class="w-80">
|
||||
<el-input
|
||||
v-model="formData.remark"
|
||||
type="textarea"
|
||||
:autosize="{ minRows: 3, maxRows: 6 }"
|
||||
:maxlength="200"
|
||||
show-word-limit
|
||||
clearable
|
||||
/>
|
||||
</div>
|
||||
</el-form-item>
|
||||
<el-form-item label="执行策略" prop="groups">
|
||||
<el-radio-group v-model="formData.strategy">
|
||||
<el-radio :label="1"> 立即执行 </el-radio>
|
||||
<el-radio :label="2"> 执行一次 </el-radio>
|
||||
<el-radio :label="3"> 放弃执行 </el-radio>
|
||||
</el-radio-group>
|
||||
</el-form-item>
|
||||
<el-form-item label="是否并发" prop="concurrent">
|
||||
<el-radio-group v-model="formData.concurrent">
|
||||
<el-radio :label="1"> 允许 </el-radio>
|
||||
<el-radio :label="0"> 禁止 </el-radio>
|
||||
</el-radio-group>
|
||||
</el-form-item>
|
||||
<el-form-item label="状态">
|
||||
<el-switch v-model="formData.status" :active-value="1" :inactive-value="2" />
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
</el-card>
|
||||
<footer-btns>
|
||||
<el-button type="primary" @click="handleSave">保存</el-button>
|
||||
</footer-btns>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script lang="ts" setup name="scheduledTaskEdit">
|
||||
import type { FormInstance } from 'element-plus'
|
||||
import { crontabAdd, crontabEdit, crontabDetail } from '@/api/setting/system'
|
||||
import useMultipleTabs from '@/hooks/useMultipleTabs'
|
||||
import feedback from '@/utils/feedback'
|
||||
|
||||
const route = useRoute()
|
||||
const router = useRouter()
|
||||
const formData = reactive({
|
||||
id: '',
|
||||
name: '',
|
||||
groups: '',
|
||||
command: '',
|
||||
rules: '',
|
||||
status: 1,
|
||||
strategy: 1,
|
||||
concurrent: 0,
|
||||
remark: ''
|
||||
})
|
||||
|
||||
const { removeTab } = useMultipleTabs()
|
||||
const formRef = shallowRef<FormInstance>()
|
||||
const rules = reactive({
|
||||
name: [{ required: true, message: '请输入任务名称' }],
|
||||
command: [{ required: true, message: '请输入调用目标字符串' }],
|
||||
rules: [{ required: true, message: '请输入cron执行表达式' }]
|
||||
})
|
||||
|
||||
const getDetails = async () => {
|
||||
const data = await crontabDetail({
|
||||
id: route.query.id
|
||||
})
|
||||
Object.keys(formData).forEach((key) => {
|
||||
//@ts-ignore
|
||||
formData[key] = data[key]
|
||||
})
|
||||
}
|
||||
|
||||
const handleSave = async () => {
|
||||
await formRef.value?.validate()
|
||||
if (route.query.id) {
|
||||
await crontabEdit(formData)
|
||||
} else {
|
||||
await crontabAdd(formData)
|
||||
}
|
||||
feedback.msgSuccess('操作成功')
|
||||
removeTab()
|
||||
router.back()
|
||||
}
|
||||
onMounted(async () => {
|
||||
if (!route.query.id) {
|
||||
return
|
||||
}
|
||||
await getDetails()
|
||||
})
|
||||
</script>
|
||||
@@ -1,111 +0,0 @@
|
||||
<template>
|
||||
<div>
|
||||
<el-card shadow="never" class="!border-none">
|
||||
<router-link
|
||||
v-perms="['crontab/add', 'crontab/add:edit']"
|
||||
:to="getRoutePath('crontab/add:edit')"
|
||||
>
|
||||
<el-button type="primary" class="mb-[16px]">
|
||||
<template #icon>
|
||||
<icon name="el-icon-Plus" />
|
||||
</template>
|
||||
新增
|
||||
</el-button>
|
||||
</router-link>
|
||||
|
||||
<el-table
|
||||
ref="paneTable"
|
||||
class="m-t-24"
|
||||
:data="pager.lists"
|
||||
v-loading="pager.loading"
|
||||
style="width: 100%"
|
||||
>
|
||||
<el-table-column prop="name" label="名称" min-width="120" />
|
||||
<el-table-column prop="groups" label="分组" min-width="100">
|
||||
<template #default="{ row }">
|
||||
<dict-value
|
||||
:value="row.groups"
|
||||
:options="[
|
||||
{
|
||||
name: '默认',
|
||||
value: 'default'
|
||||
},
|
||||
{
|
||||
name: '系统',
|
||||
value: 'system'
|
||||
}
|
||||
]"
|
||||
/>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="command" label="调用目标字符串" min-width="100" />
|
||||
<el-table-column prop="rules" label="cron表达式" min-width="100" />
|
||||
<el-table-column prop="status" label="状态" min-width="100">
|
||||
<template #default="{ row }">
|
||||
<el-tag v-if="row.status == 1" type="success">运行中</el-tag>
|
||||
<el-tag v-if="row.status == 2" type="info">已停止</el-tag>
|
||||
<el-tag v-if="row.status == 3" type="danger">错误</el-tag>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="error" label="错误信息" min-width="120" />
|
||||
<el-table-column label="最后执行时间" prop="endTime" min-width="180" />
|
||||
<el-table-column prop="taskTime" label="执行耗时(ms)" min-width="100" />
|
||||
|
||||
<el-table-column label="操作" width="120" fixed="right">
|
||||
<template #default="{ row }">
|
||||
<div class="flex">
|
||||
<el-button type="primary" link>
|
||||
<router-link
|
||||
v-perms="['crontab/edit', 'crontab/add:edit']"
|
||||
:to="{
|
||||
path: getRoutePath('crontab/add:edit'),
|
||||
query: {
|
||||
id: row.id
|
||||
}
|
||||
}"
|
||||
>
|
||||
<el-button type="primary" link> 编辑 </el-button>
|
||||
</router-link>
|
||||
</el-button>
|
||||
<el-button
|
||||
v-perms="['crontab/delete']"
|
||||
type="danger"
|
||||
link
|
||||
@click="handleDelete(row.id)"
|
||||
>
|
||||
删除
|
||||
</el-button>
|
||||
</div>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
|
||||
<div class="flex justify-end mt-4">
|
||||
<pagination v-model="pager" @change="getLists" />
|
||||
</div>
|
||||
</el-card>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script lang="ts" setup name="scheduledTask">
|
||||
import { crontabLists, crontabDel } from '@/api/setting/system'
|
||||
import { usePaging } from '@/hooks/usePaging'
|
||||
import { getRoutePath } from '@/router'
|
||||
import feedback from '@/utils/feedback'
|
||||
|
||||
const { pager, getLists } = usePaging({
|
||||
fetchFun: crontabLists,
|
||||
params: {}
|
||||
})
|
||||
|
||||
const handleDelete = async (id: number) => {
|
||||
await feedback.confirm('确定要删除?')
|
||||
await crontabDel({ id })
|
||||
feedback.msgSuccess('删除成功')
|
||||
getLists()
|
||||
}
|
||||
|
||||
getLists()
|
||||
</script>
|
||||
|
||||
<style lang="scss"></style>
|
||||
@@ -84,9 +84,7 @@ const handleDelete = (index: number) => {
|
||||
|
||||
// 设置备案信息
|
||||
const handleSubmit = async () => {
|
||||
await setCopyright({
|
||||
list: formData.value
|
||||
})
|
||||
await setCopyright(formData.value)
|
||||
feedback.msgSuccess('操作成功')
|
||||
getData()
|
||||
}
|
||||
|
||||
BIN
admin/src/views/workbench/image/customer_service.png
Normal file
BIN
admin/src/views/workbench/image/customer_service.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 84 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 42 KiB |
BIN
admin/src/views/workbench/image/qq_group.png
Normal file
BIN
admin/src/views/workbench/image/qq_group.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 33 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 486 KiB |
@@ -141,8 +141,8 @@ import menu_generator from './image/menu_generator.png'
|
||||
import menu_file from './image/menu_file.png'
|
||||
import menu_auth from './image/menu_auth.png'
|
||||
import menu_web from './image/menu_web.png'
|
||||
import oa_code from './image/oa_code.png'
|
||||
import service_code from './image/service_code.png'
|
||||
import qq_group from './image/qq_group.png'
|
||||
import customer_service from './image/customer_service.png'
|
||||
// 表单数据
|
||||
const workbenchData: any = reactive({
|
||||
version: {
|
||||
@@ -156,12 +156,12 @@ const workbenchData: any = reactive({
|
||||
},
|
||||
support: [
|
||||
{
|
||||
image: oa_code,
|
||||
title: '官方公众号',
|
||||
desc: '关注官方公众号'
|
||||
image: qq_group,
|
||||
title: '扫码进入QQ交流群',
|
||||
desc: '疑难疑点 进入QQ群'
|
||||
},
|
||||
{
|
||||
image: service_code,
|
||||
image: customer_service,
|
||||
title: '添加企业客服微信',
|
||||
desc: '想了解更多请添加客服'
|
||||
}
|
||||
|
||||
@@ -13,7 +13,7 @@ import vueSetupExtend from 'vite-plugin-vue-setup-extend'
|
||||
export default defineConfig({
|
||||
// base: '/admin/',
|
||||
server: {
|
||||
host: '0.0.0.0'
|
||||
host: '0.0.0.0',
|
||||
},
|
||||
plugins: [
|
||||
vue(),
|
||||
|
||||
Reference in New Issue
Block a user