Browse Source

文档逻辑

master
wangqi 2 months ago
parent
commit
cb95ff67f2
  1. 1
      .env
  2. 4
      .env.development
  3. 4
      .env.production
  4. 2
      auto-imports.d.ts
  5. 91
      src/api/module/eam/device/document.ts
  6. 3
      src/api/module/index.ts
  7. 4
      src/api/server/axiosInstance.ts
  8. 4
      src/api/server/config.ts
  9. 2
      src/components/dashboard/Edfs-exception.vue
  10. 153
      src/pages/fileDoc/components/markdownDrawer.vue
  11. 196
      src/pages/fileDoc/index.vue
  12. 156
      src/pages/fileDoc/list.json
  13. 37
      src/pages/fileDoc/test.vue
  14. 19
      src/pages/fileDoc/utils.ts
  15. 4
      src/pages/layout.vue
  16. 2
      src/pages/system/login/index.vue
  17. 180
      src/router/index.ts
  18. 13
      src/stores/permission.ts

1
.env

@ -1,5 +1,6 @@ @@ -1,5 +1,6 @@
VITE_BASE_API_SYSTEM = '/remote/admin-api/system'
VITE_BASE_API_EAM = '/remote/admin-api/eam'
VITE_BASE_API_INFRA = '/remote/admin-api/infra'
VITE_BASE_API_DOC= '/remote/admin-api/document'
VITE_DEVICE_INFO_INTERVAL = 35000

4
.env.development

@ -1,2 +1,2 @@ @@ -1,2 +1,2 @@
VITE_BASE_URL = 'http://192.168.1.3:48080'
VITE_SOCKET_SERVER = 'http://192.168.1.3:7080'
VITE_BASE_URL = 'http://192.168.1.17:48081'
VITE_SOCKET_SERVER = 'http://192.168.1.17:48081'

4
.env.production

@ -1,2 +1,2 @@ @@ -1,2 +1,2 @@
VITE_BASE_URL = 'http://192.168.1.3:48080'
VITE_SOCKET_SERVER = 'http://192.168.1.3:48080'
VITE_BASE_URL = 'http://192.168.1.17:10393'
VITE_SOCKET_SERVER = 'http://192.168.1.17:10393'

2
auto-imports.d.ts vendored

@ -6,9 +6,7 @@ @@ -6,9 +6,7 @@
export {}
declare global {
const EffectScope: typeof import('vue')['EffectScope']
const ElLoading: typeof import('element-plus/es')['ElLoading']
const ElMessageBox: typeof import('element-plus/es')['ElMessageBox']
const ElNotification: typeof import('element-plus/es')['ElNotification']
const computed: typeof import('vue')['computed']
const createApp: typeof import('vue')['createApp']
const customRef: typeof import('vue')['customRef']

91
src/api/module/eam/device/document.ts

@ -0,0 +1,91 @@ @@ -0,0 +1,91 @@
import { documentServer } from '../../index'
export function getFileList(params: { parentId: number }) {
return documentServer({
url: '/folder/list-children',
method: 'get',
params: params,
})
}
interface DocFileVO {
id: number
name: string
parentId: number
}
export function createFolder(data: Omit<DocFileVO, 'id'>) {
return documentServer({
url: '/folder/add-folder',
method: 'post',
data: data,
})
}
export function updateFolder(data: DocFileVO) {
return documentServer({
url: '/folder/update-folder',
method: 'put',
data: data,
})
}
export function deleteFolder(params: { id: number }) {
return documentServer({
url: '/folder/delete-folder',
method: 'delete',
params: params,
})
}
export function createdFile(data: Omit<DocFileVO, 'id'>) {
return documentServer({
url: '/folder/add-file',
method: 'post',
data: data,
})
}
export function updateFile(data: DocFileVO) {
return documentServer({
url: '/folder/update-file',
method: 'put',
data: data,
})
}
export function deleteFile(params: { id: number }) {
return documentServer({
url: '/folder/delete-file',
method: 'delete',
params: params,
})
}
interface MarkdownVO {
folderId: number
content: string
id: number
isDraft: 0 | 1 // 0: 文章 1: 草稿
}
export interface ContentType {
content: string
createTime: number
description: string
id: number
title: string
}
export function getMarkdown(params: Pick<MarkdownVO, 'folderId'>) {
return documentServer({
url: '/article/get-by-folder-id',
method: 'get',
params: params,
})
}
export function updateMarkdown(data: MarkdownVO) {
return documentServer<ContentType>({
url: '/article/edit',
method: 'put',
data: data,
})
}

3
src/api/module/index.ts

@ -4,5 +4,6 @@ import { API_Config } from '@/api/server/config' @@ -4,5 +4,6 @@ import { API_Config } from '@/api/server/config'
const systemServer = axiosInstance('system', API_Config.system)
const eamServer = axiosInstance('eam', API_Config.eam)
const infraServer = axiosInstance('infra', API_Config.infra)
const documentServer = axiosInstance('document', API_Config.document)
export { systemServer, eamServer, infraServer }
export { systemServer, eamServer, infraServer, documentServer }

4
src/api/server/axiosInstance.ts

@ -183,7 +183,7 @@ const createAxiosInstance = (module: APIConfigKeys, config: Config) => { @@ -183,7 +183,7 @@ const createAxiosInstance = (module: APIConfigKeys, config: Config) => {
const unKnowError = `连接出错(${error.response.status})!`
if (status === 401) {
localStorage.removeItem(Keys.STORAGE_TOKEN)
router.push('/login')
router.push('/file/document')
}
const msg = networkErrMap[status] ? networkErrMap[status] : unKnowError
@ -229,7 +229,7 @@ async function logout() { @@ -229,7 +229,7 @@ async function logout() {
removeToken()
isShowLogout = false
deleteUserCache()
window.location.href = '/login'
window.location.href = '/file/document'
}
export default createAxiosInstance

4
src/api/server/config.ts

@ -2,6 +2,7 @@ export interface APIConfig { @@ -2,6 +2,7 @@ export interface APIConfig {
system: Config
eam: Config
infra: Config
document: Config
}
interface Config {
@ -19,6 +20,9 @@ const API_Config: APIConfig = { @@ -19,6 +20,9 @@ const API_Config: APIConfig = {
infra: {
baseAPI: import.meta.env.VITE_BASE_API_INFRA,
},
document: {
baseAPI: import.meta.env.VITE_BASE_API_DOC,
}
}
export type APIConfigKeys = keyof typeof API_Config

2
src/components/dashboard/Edfs-exception.vue

@ -10,7 +10,7 @@ @@ -10,7 +10,7 @@
type="primary"
@click="
() => {
router.push('/home')
router.push('/file/document')
}
"
>返回首页</el-button

153
src/pages/fileDoc/components/markdownDrawer.vue

@ -0,0 +1,153 @@ @@ -0,0 +1,153 @@
<template>
<el-drawer
class="markdown-drawer"
v-model="mdDrawer"
direction="btt"
size="100%"
:before-close="handleBeforeClose"
@close="handleClose"
>
<template #header>
<div class="header">
<span>{{ data.title }}</span>
<div>
<EDFSButton innerText="保存为草稿" type="info" @click="onSave(1)" />
<EDFSButton innerText="发布文章" type="primary" @click="onSave(0)" />
</div>
</div>
</template>
<div class="drawer-box">
<div id="vditor"></div>
</div>
</el-drawer>
</template>
<script setup lang="ts">
import { isResError, useMessage } from '@/hooks/useMessage'
import { cloneDeep } from 'lodash'
import EDFSButton from '@/components/dashboard/Edfs-button/index.vue'
import Vditor from 'vditor'
import { type ContentType } from '@/api/module/eam/device/document'
import 'vditor/dist/index.css'
interface Props {
data: ContentType
}
const emits = defineEmits(['on-save'])
const props = withDefaults(defineProps<Props>(), {})
const mdDrawer = defineModel<boolean>()
const message = useMessage()
watch(
() => mdDrawer.value,
val => {
if (val) {
}
}
)
function handleClose() {
mdDrawer.value = false
}
function handleBeforeClose(done: () => void) {
message.confirm('你确定要关闭吗?').then(() => {
done()
})
}
const contentEditor = ref<Vditor | null>(null)
function initEditor() {
contentEditor.value = new Vditor('vditor', {
height: '100%',
toolbarConfig: {
pin: true,
},
mode: 'wysiwyg', // "wysiwyg" | "sv" | "ir" // wysiwyg: sv: ir:
toolbar: [
'edit-mode',
'headings',
'bold',
'italic',
'strike',
'emoji',
'line',
'quote',
'list',
'ordered-list',
'check',
'outdent',
'indent',
'table',
'code',
'inline-code',
'insert-after',
'insert-before',
'link',
'both',
'outline',
'code-theme',
'export',
'undo',
'redo',
'fullscreen',
],
counter: {
enable: true,
},
outline: {
enable: true,
position: 'left',
}, //
cache: {
enable: false,
},
after: () => {
contentEditor.value?.setValue(props?.data?.content ?? '')
console.log(contentEditor.value?.getValue()) //
setTimeout(() => {
console.log(contentEditor.value?.getValue()) //
}, 10000) //
},
})
}
function onSave(isDraft: 0 | 1) {
emits('on-save', isDraft, contentEditor.value?.getValue())
}
onMounted(async () => {
await nextTick()
initEditor()
})
</script>
<style lang="scss">
.markdown-drawer {
.el-drawer__header {
color: var(--label-color);
margin-bottom: 0;
}
}
</style>
<style scoped lang="scss">
.markdown-drawer {
.header {
display: flex;
justify-content: space-between;
align-items: center;
padding-right: 20px;
}
.drawer-box {
width: 100%;
height: 100%;
padding-top: 10px;
// .footer {
// display: flex;
// justify-content: end;
// }
}
}
</style>

196
src/pages/fileDoc/index.vue

@ -6,7 +6,7 @@ @@ -6,7 +6,7 @@
<template v-for="(item, index) in breadcrumbList" :key="index">
<el-breadcrumb-item
:class="{ active: index + 1 < breadcrumbList.length }"
@click="onCrumb"
@click="onCrumb(item)"
>{{ item.name }}</el-breadcrumb-item
>
</template>
@ -18,7 +18,7 @@ @@ -18,7 +18,7 @@
@visibleChange="onVisibleChange"
ref="contextMenuRef"
>
<div class="file-list">
<div class="file-list" v-if="loading">
<div v-for="item in dataList" :key="item.id" @click="onFileOpen(item)">
<div class="item SourceClass" v-setItem="item">
<div class="file-header">
@ -30,18 +30,22 @@ @@ -30,18 +30,22 @@
></Icon>
</div>
<div class="file-icon">
<img :src="item.type === 'folder' ? Folder : Document" />
<!-- {{ !!item.isEdit }} -->
<img :src="item.type === floeType.folder ? Folder : Document" />
</div>
<div class="file-name">
<el-input
class="edit-input"
@click.stop="() => {}"
v-show="item?.isEdit"
v-if="!!item?.isEdit"
v-model="editFileName"
:key="item.id + '_edit'"
:ref="el => setInputRefs(el, item.id)"
@blur="onSaveRename(item)"
@keyup.enter="onSaveRename(item)"
/>
<span v-show="!item?.isEdit">{{ item.name }}</span>
<span v-else>{{ item.name }}</span>
</div>
</div>
</div>
@ -66,33 +70,42 @@ @@ -66,33 +70,42 @@
</EdfsContextMenu>
</EdfsWrap>
</div>
<markdownDrawer
v-model="isShowMdDrawer"
v-if="isShowMdDrawer"
:data="curMarkdown"
@onSave="onSaveMd"
/>
</template>
<script setup lang="ts">
import {
floeType,
operationDropdownMenu,
breadcrumbList,
fileDropdownMenu,
} from './utils'
import EdfsWrap from '@/components/dashboard/Edfs-wrap.vue'
import { deleteFirmware, getFirmwareList } from '@/api/module/eam/device/firmware'
import {
getFileList,
createFolder,
updateFolder,
createdFile,
updateFile,
deleteFolder,
deleteFile,
getMarkdown,
updateMarkdown,
type ContentType,
} from '@/api/module/eam/device/document'
import { isResError, useMessage } from '@/hooks/useMessage.js'
import { ArrowRight } from '@element-plus/icons-vue'
import ListJson from './list.json'
import Folder from '@/assets/image/dashboard/file/folder.svg'
import Upload from '@/assets/image/dashboard/file/upload.svg'
import Document from '@/assets/image/dashboard/file/document.svg'
import { Icon } from '@/components/dashboard/Icon'
import EdfsContextMenu from '@/components/dashboard/Edfs-context-menu/index.vue'
import { color } from 'echarts'
const breadcrumbList = ref([{ name: '全部文件', id: 'all' }])
const fileDropdownMenu = [
{ command: 'open', label: '打开' },
{ command: 'rename', label: '重命名' },
{ command: 'delete', label: '删除' },
]
const operationDropdownMenu = [
{ command: 'newFolder', label: '新建文件夹', icon: Folder },
// { command: 'upload', label: '', icon: Upload },
{ command: 'newMarkdown', label: '新建文档', icon: Document },
]
import markdownDrawer from './components/markdownDrawer.vue'
const dropdownMenu = computed(() => {
return menuTarget.value ? fileDropdownMenu : operationDropdownMenu
@ -100,17 +113,41 @@ const dropdownMenu = computed(() => { @@ -100,17 +113,41 @@ const dropdownMenu = computed(() => {
const message = useMessage()
const dataList = ref<any>(ListJson)
const currentId = ref(0)
watch(breadcrumbList.value, () => {
currentId.value = breadcrumbList.value[breadcrumbList.value.length - 1].id
})
async function loadData() {}
const dataList = ref<any>([])
const loading = ref(false)
async function loadData(id: number = 0) {
loading.value = true
const res = await getFileList({
parentId: id,
})
if (isResError(res)) return
dataList.value = res.data.map((item: any) => ({
...item,
isEdit: false,
}))
loading.value = true
}
async function onDelete(id: string) {
async function onDelete(item: any) {
try {
let res
await message.delConfirm()
const res = await deleteFirmware(id)
switch (item.type) {
case floeType.folder:
res = await deleteFolder(item.id)
break
case floeType.file:
res = await deleteFile(item.id)
break
}
if (isResError(res)) return
message.success('删除成功')
loadData()
loadData(currentId.value)
} catch (error) {}
}
@ -121,9 +158,8 @@ function onFile(e: any) { @@ -121,9 +158,8 @@ function onFile(e: any) {
function onNewFolder() {
const folder = {
id: dataList.value.length + 1,
name: '新建文件夹',
type: 'folder',
type: floeType.folder,
isEdit: true,
}
dataList.value.push(folder)
@ -132,9 +168,8 @@ function onNewFolder() { @@ -132,9 +168,8 @@ function onNewFolder() {
function onNewMarkdown() {
const markdown = {
id: dataList.value.length + 1,
name: '新建文档',
type: 'markdown',
type: floeType.file,
isEdit: true,
}
dataList.value.push(markdown)
@ -144,7 +179,7 @@ function onNewMarkdown() { @@ -144,7 +179,7 @@ function onNewMarkdown() {
function onCommand(command: string, item: any) {
switch (command) {
case 'delete':
// onDelete()
onDelete(item)
break
case 'rename':
onRename(item)
@ -168,16 +203,22 @@ function onVisibleChange(visible: boolean, currentElement: HTMLElement | null) { @@ -168,16 +203,22 @@ function onVisibleChange(visible: boolean, currentElement: HTMLElement | null) {
menuTarget.value = currentElement
}
function onCrumb() {}
function onCrumb(item: any) {
const isLast = breadcrumbList.value[breadcrumbList.value.length - 1].id === item.id
if (isLast) return
const index = breadcrumbList.value.findIndex(v => v.id === item.id)
breadcrumbList.value = breadcrumbList.value.slice(0, index + 1)
loadData(item.id)
}
function onFileOpen(item: any) {
if (item.isEdit) return
if (item.type === 'folder') {
breadcrumbList.value.push({ name: item.name, id: item.id })
loadData()
if (item.type === floeType.folder) {
breadcrumbList.value.push(item)
loadData(item.id)
}
if (item.type === 'markdown') {
console.log('open markdown')
if (item.type === floeType.file) {
onOpenMarkdownDrawer(item.id)
}
}
@ -189,18 +230,97 @@ function setInputRefs(el: any, id: number) { @@ -189,18 +230,97 @@ function setInputRefs(el: any, id: number) {
}
const editFileName = ref('')
function onSaveRename(item: any) {
async function onSaveRename(item: any) {
if (!item.isEdit) return
item.name = editFileName.value
await nextTick()
item.isEdit = false
await nextTick()
await onSaveFile(item)
editFileName.value = ''
}
async function onRename(item: any) {
if (!item) return
item.isEdit = true
await nextTick()
editFileName.value = item.name
await nextTick()
editInputRefs.value[`editInputRef_${item.id}`].focus()
editInputRefs.value[`editInputRef_${item.id}`].select()
}
async function onSaveFile(item: any) {
const isAdd = !item.id
switch (item.type) {
case floeType.folder:
await saveFolder(isAdd, item)
break
case floeType.file:
await saveFile(isAdd, item)
break
}
loadData(currentId.value)
}
async function saveFolder(isAdd: boolean, item: any) {
let res
if (isAdd) {
res = await createFolder({
name: item.name,
parentId: currentId.value,
})
} else {
res = await updateFolder({
id: item.id,
name: item.name,
parentId: currentId.value,
})
}
if (isResError(res)) return
}
async function saveFile(isAdd: boolean, item: any) {
let res
if (isAdd) {
res = await createdFile({
name: item.name + '.md',
parentId: currentId.value,
})
} else {
res = await updateFile({
id: item.id,
name: item.name,
parentId: currentId.value,
})
}
if (isResError(res)) return
}
// markdown
const curMarkdown = ref() as Ref<ContentType>
const isShowMdDrawer = ref(false)
async function onOpenMarkdownDrawer(id: number) {
const res = await getMarkdown({ folderId: id })
if (isResError(res)) return
curMarkdown.value = res?.data
isShowMdDrawer.value = true
}
async function onSaveMd(isDraft: 0 | 1, data: string) {
const res = await updateMarkdown({
content: data,
folderId: currentId.value,
id: curMarkdown.value?.id,
isDraft,
})
if (isResError(res)) return
message.success(isDraft === 1 ? '保存成功' : '发布成功')
isShowMdDrawer.value = false
curMarkdown.value = null as any
loadData(currentId.value)
}
onMounted(() => {
loadData()
})

156
src/pages/fileDoc/list.json

@ -1,156 +0,0 @@ @@ -1,156 +0,0 @@
[
{
"id": 1,
"pid": 0,
"pids": "",
"cid": 0,
"name": "点表文件",
"type": "folder",
"ext": "",
"size": 0,
"userid": 1,
"share": 1,
"created_id": 1,
"created_at": "2024-03-05 07:53:24",
"updated_at": "2024-04-10 14:22:23",
"deleted_at": null,
"permission": 1
},
{
"id": 13,
"pid": 0,
"pids": "",
"cid": 0,
"name": "项目管理",
"type": "folder",
"ext": "",
"size": 0,
"userid": 1,
"share": 1,
"created_id": 1,
"created_at": "2024-03-05 10:00:03",
"updated_at": "2024-03-05 10:00:03",
"deleted_at": null,
"permission": 1
},
{
"id": 18,
"pid": 0,
"pids": "",
"cid": 0,
"name": "后端服务接口文档",
"type": "folder",
"ext": "",
"size": 0,
"userid": 6,
"share": 1,
"created_id": 6,
"created_at": "2024-03-07 16:35:35",
"updated_at": "2024-03-08 14:19:51",
"deleted_at": null,
"permission": 1
},
{
"id": 22,
"pid": 0,
"pids": "",
"cid": 0,
"name": "后台服务",
"type": "folder",
"ext": "",
"size": 0,
"userid": 6,
"share": 1,
"created_id": 6,
"created_at": "2024-03-13 10:13:41",
"updated_at": "2024-05-18 13:50:20",
"deleted_at": null,
"permission": 1
},
{
"id": 32,
"pid": 0,
"pids": "",
"cid": 0,
"name": "3568",
"type": "folder",
"ext": "",
"size": 0,
"userid": 4,
"share": 1,
"created_id": 4,
"created_at": "2024-04-10 10:51:40",
"updated_at": "2024-04-10 11:06:58",
"deleted_at": null,
"permission": 0
},
{
"id": 241,
"pid": 0,
"pids": ",240,",
"cid": 0,
"name": "EMS1.0点表",
"type": "folder",
"ext": "",
"size": 0,
"userid": 3,
"share": 1,
"created_id": 3,
"created_at": "2024-06-29 11:08:12",
"updated_at": "2024-06-29 11:09:29",
"deleted_at": null,
"permission": 1
},
{
"id": 297,
"pid": 0,
"pids": "",
"cid": 0,
"name": "T113",
"type": "folder",
"ext": "",
"size": 0,
"userid": 5,
"share": 1,
"created_id": 5,
"created_at": "2024-09-20 18:39:55",
"updated_at": "2024-09-20 18:40:08",
"deleted_at": null,
"permission": 1
},
{
"id": 306,
"pid": 0,
"pids": "",
"cid": 0,
"name": "微网控制器云端标准点表",
"type": "folder",
"ext": "",
"size": 0,
"userid": 4,
"share": 1,
"created_id": 4,
"created_at": "2024-09-29 15:58:52",
"updated_at": "2024-09-29 15:59:49",
"deleted_at": null,
"permission": 0
},
{
"id": 592,
"pid": 0,
"pids": "",
"cid": 0,
"name": "前后端通用协议",
"type": "folder",
"ext": "",
"size": 0,
"userid": 3,
"share": 1,
"created_id": 3,
"created_at": "2024-12-05 18:04:36",
"updated_at": "2024-12-05 18:05:26",
"deleted_at": null,
"permission": 1
}
]

37
src/pages/fileDoc/test.vue

@ -1,37 +0,0 @@ @@ -1,37 +0,0 @@
<template>
<div class="md-editor">
<Editor
:value="value"
style="width: 100%; height: 100%"
:plugins="plugins"
@change="handleChange"
/>
</div>
</template>
<script setup lang="ts">
import gfm from '@bytemd/plugin-gfm'
import hightlight from '@bytemd/plugin-highlight'
import { Editor, Viewer } from '@bytemd/vue-next'
import gemoji from '@bytemd/plugin-gemoji'
import 'highlight.js/styles/vs2015.css'
import 'bytemd/dist/index.css'
import zh from 'bytemd/lib/locales/zh_Hans.json'
import { ref } from 'vue'
const plugins = [gfm(), gemoji(), hightlight()]
const value = ref('')
const handleChange = (v: string) => {
value.value = v
}
</script>
<style scoped lang="scss">
.md-editor {
width: 100%;
height: 100%;
:deep(.bytemd) {
width: 100%;
height: 100%;
}
}
</style>

19
src/pages/fileDoc/utils.ts

@ -0,0 +1,19 @@ @@ -0,0 +1,19 @@
import Folder from '@/assets/image/dashboard/file/folder.svg'
import Upload from '@/assets/image/dashboard/file/upload.svg'
import Document from '@/assets/image/dashboard/file/document.svg'
export enum floeType {
folder,
file,
}
export const breadcrumbList = ref([{ name: '全部文件', id: 0 }])
export const fileDropdownMenu = [
{ command: 'open', label: '打开', icon: '' },
{ command: 'rename', label: '重命名', icon: '' },
{ command: 'delete', label: '删除', icon: '' },
]
export const operationDropdownMenu = [
{ command: 'newFolder', label: '新建文件夹', icon: Folder },
// { command: 'upload', label: '上传', icon: Upload },
{ command: 'newMarkdown', label: '新建文档', icon: Document },
]

4
src/pages/layout.vue

@ -91,7 +91,7 @@ @@ -91,7 +91,7 @@
<el-config-provider :locale="zhCn">
<RouterView />
</el-config-provider>
<!-- </div> -->
</main>
</div>
</div>
@ -232,7 +232,7 @@ async function loginOut() { @@ -232,7 +232,7 @@ async function loginOut() {
type: 'warning',
})
await userStore.loginout()
push('/login')
push('/file/document')
} catch {}
}

2
src/pages/system/login/index.vue

@ -83,7 +83,7 @@ async function onLogin() { @@ -83,7 +83,7 @@ async function onLogin() {
}
isLoading.value = false
router.push('/home')
router.push('/file/document')
}
async function loginByAccount() {

180
src/router/index.ts

@ -6,16 +6,6 @@ import { useDictStore } from '@/stores/dict' @@ -6,16 +6,6 @@ import { useDictStore } from '@/stores/dict'
import { getToken } from '@/utils/auth'
export const defaultRoute = [
{
path: '/login',
component: () => import('@/pages/system/login/index.vue'),
name: 'Login',
meta: {
hidden: true,
title: '登录',
noTagsView: true,
},
},
{
path: '/404',
name: 'NoFound',
@ -25,28 +15,7 @@ export const defaultRoute = [ @@ -25,28 +15,7 @@ export const defaultRoute = [
title: '404',
},
},
{
path: '/user',
component: () => import('@/pages/layout.vue'),
name: 'UserInfo',
meta: {
hidden: true,
},
children: [
{
path: 'profile',
component: () => import('@/pages/Profile/index.vue'),
name: 'Profile',
meta: {
canTo: true,
hidden: true,
noTagsView: false,
icon: 'ep:user',
title: '个人中心',
},
},
],
},
{
path: '/file',
component: () => import('@/pages/layout.vue'),
@ -68,94 +37,8 @@ export const defaultRoute = [ @@ -68,94 +37,8 @@ export const defaultRoute = [
title: '文档管理',
},
},
{
path:'test',
component:()=>import('@/pages/fileDoc/test.vue'),
name:'Test',
meta:{
icon:'ep:user',
title:'测试'
}
}
],
},
// {
// path: '/device',
// component: () => import('@/pages/layout.vue'),
// name: 'UserInfo',
// meta: {
// canTo: true,
// hidden: true,
// noTagsView: false,
// icon: 'ep:user',
// title: '系统管理',
// },
// children: [
// {
// path: 'deviceOperation',
// component: () => import('@/pages/deviceInfo/info.vue'),
// name: 'deviceOperation',
// meta: {
// icon: 'ep:user',
// hidden: true,
// title: '设备xx',
// },
// },
// ],
// },
// {
// path: '/user',
// component: () => import('@/pages/layout.vue'),
// name: 'UserInfo',
// meta: {
// canTo: true,
// hidden: false,
// noTagsView: false,
// icon: 'ep:user',
// title: '系统管理',
// },
// children: [
// {
// path: 'deviceField',
// component: () => import('@/pages/system/deviceField/index.vue'),
// name: 'DeviceField',
// meta: {
// icon: 'ep:user',
// title: '字段管理',
// },
// },
// {
// path: 'device',
// component: () => import('@/pages/deviceInfo/index.vue'),
// name: 'Device',
// meta: {
// icon: 'ep:user',
// title: '设备管理',
// },
// },
// },
// {
// path: 'manufacturer',
// component: () => import('@/pages/system/manufacturer/index.vue'),
// name: 'Manufacturer',
// meta: {
// icon: 'ep:user',
// title: '厂商管理',
// },
// },
// {
// path: 'deviceTemplate',
// component: () => import('@/pages/deviceTest/testPlan/index.vue'),
// name: 'DeviceTemplate',
// meta: {
// icon: 'ep:user',
// title: '模板管理',
// },
// }
// ],
// },
]
const router = createRouter({
@ -166,43 +49,48 @@ const router = createRouter({ @@ -166,43 +49,48 @@ const router = createRouter({
const whiteList = ['/login']
router.beforeEach(async (to, from, next) => {
if (!getToken()) {
if (whiteList.indexOf(to.path) !== -1) {
next()
} else {
next('/login')
}
// if (!getToken()) {
// if (whiteList.indexOf(to.path) !== -1) {
// next()
// } else {
// next('/file/document')
// }
// return
// }
if (to.path === '/') {
next('/file/document')
return
}
if (to.path === '/login' || to.path === '/') {
next('/home')
return
}
const userStore = useUserStore()
// if (to.path === '/login' || to.path === '/') {
// next('/file/document')
// return
// }
// const userStore = useUserStore()
const permissionStore = usePermissionStore()
const dictStore = useDictStore()
if (!dictStore.getIsSetDict) {
await dictStore.setDictMap()
}
// const dictStore = useDictStore()
// if (!dictStore.getIsSetDict) {
// await dictStore.setDictMap()
// }
if (!userStore.getIsSetUser) {
await userStore.setUserInfoAction()
// 后端过滤菜单
// if (!userStore.getIsSetUser) {
// await userStore.setUserInfoAction()
// // 后端过滤菜单
await permissionStore.generateRoutes()
permissionStore.getAddRouters.forEach(route => {
router.addRoute(route as unknown as RouteRecordRaw) // 动态添加可访问路由表
})
const redirectPath = from.query.redirect || to.path
// 修复跳转时不带参数的问题
const redirect = decodeURIComponent(redirectPath as string)
const { basePath, paramsObject: query } = parseURL(redirect)
const nextData =
to.path === redirect ? { ...to, replace: true } : { path: redirect, query }
next(nextData)
} else {
next()
}
// const redirectPath = from.query.redirect || to.path
// // 修复跳转时不带参数的问题
// const redirect = decodeURIComponent(redirectPath as string)
// const { basePath, paramsObject: query } = parseURL(redirect)
// const nextData =
// to.path === redirect ? { ...to, replace: true } : { path: redirect, query }
// next(nextData)
// } else {
// next()
// }
next()
})
export default router

13
src/stores/permission.ts

@ -13,7 +13,7 @@ export interface PermissionState { @@ -13,7 +13,7 @@ export interface PermissionState {
}
export const usePermissionStore = defineStore('permission', () => {
const routers = ref([])
const routers = ref<RouteRecordRaw[]>([])
const addRouters = ref<any>([])
const menuTabRouters = ref([])
@ -25,11 +25,12 @@ export const usePermissionStore = defineStore('permission', () => { @@ -25,11 +25,12 @@ export const usePermissionStore = defineStore('permission', () => {
return new Promise<void>(async resolve => {
let res = []
const roleRouters = getRoleRouters()
if (roleRouters.length > 0) {
res = roleRouters
}
const routerMap = generateRoute(res)
// const roleRouters = getRoleRouters()
// if (roleRouters.length > 0) {
// res = roleRouters
// }
// const routerMap = generateRoute(res)
const routerMap = generateRoute([])
addRouters.value = routerMap.concat([
{
path: '/:path(.*)*',

Loading…
Cancel
Save