diff --git a/.env b/.env index 4a80a21..495c925 100644 --- a/.env +++ b/.env @@ -29,4 +29,6 @@ VITE_PROXY = https://appnify.app.juetan.cn/ # API文档 说明:需返回符合 OPENAPI 规范的json内容 VITE_OPENAPI = http://127.0.0.1:3030/openapi.json # 文件后缀 说明:设为dev时会优先加载index.dev.vue文件,否则回退至index.vue文件 -VITE_EXTENSION = dev \ No newline at end of file +VITE_EXTENSION = dev +# 是否以离线模式启动,跳过登录 +VITE_OFFLINE = true \ No newline at end of file diff --git a/src/components/AnForm/components/FormModal.tsx b/src/components/AnForm/components/FormModal.tsx index dacd9ba..3ca862f 100644 --- a/src/components/AnForm/components/FormModal.tsx +++ b/src/components/AnForm/components/FormModal.tsx @@ -1,9 +1,9 @@ import { Button, ButtonInstance, FormInstance, Message, Modal } from '@arco-design/web-vue'; +import { useVModel } from '@vueuse/core'; import { InjectionKey, PropType, Ref } from 'vue'; +import { getModel, setModel } from '../utils/useFormModel'; import { AnForm, AnFormInstance, AnFormSubmit } from './Form'; import { AnFormItemProps } from './FormItem'; -import { useVModel } from '@vueuse/core'; -import { getModel, setModel } from '../utils/useFormModel'; export interface AnFormModalContext { visible: Ref; @@ -210,6 +210,8 @@ export const AnFormModal = defineComponent({ - {index !== 0 && } + {index !== 0 && } item.onClick?.(props)}> {{ default: () => item.text, diff --git a/src/components/breadcrumb/bread-page.vue b/src/components/breadcrumb/bread-page.vue index 3c0d5e5..984ee74 100644 --- a/src/components/breadcrumb/bread-page.vue +++ b/src/components/breadcrumb/bread-page.vue @@ -10,7 +10,7 @@ -
+
@@ -19,7 +19,14 @@ diff --git a/src/components/editor/components/Editor.vue b/src/components/editor/components/Editor.vue index 3a47326..b460977 100644 --- a/src/components/editor/components/Editor.vue +++ b/src/components/editor/components/Editor.vue @@ -1,5 +1,12 @@ @@ -228,8 +252,7 @@ const user = reactive({ "meta": { "sort": 30401, "title": "个人设置", - "icon": "icon-park-outline-config", - "auth": ["1"] + "icon": "icon-park-outline-config" } } diff --git a/src/router/guards/auth.ts b/src/router/guards/auth.ts index 1a87685..db3f902 100644 --- a/src/router/guards/auth.ts +++ b/src/router/guards/auth.ts @@ -1,4 +1,5 @@ import { api } from '@/api'; +import { env } from '@/config/env'; import { store, useUserStore } from '@/store'; import { useMenuStore } from '@/store/menu'; import { treeEach, treeFilter, treeFind } from '@/utils/listToTree'; @@ -7,7 +8,6 @@ import { Router } from 'vue-router'; import { menus } from '../menus'; import { APP_HOME_NAME } from '../routes/base'; import { APP_ROUTE_NAME, routes } from '../routes/page'; -import { env } from '@/config/env'; const WHITE_LIST = ['/:all(.*)*']; const UNSIGNIN_LIST = ['/login']; @@ -27,7 +27,6 @@ export function useAuthGuard(router: Router) { }; router.beforeEach(async function (to, from) { - console.log(to); const userStore = useUserStore(store); const menuStore = useMenuStore(store); diff --git a/src/router/menus/index.ts b/src/router/menus/index.ts index 2f4ff0e..ab0499b 100644 --- a/src/router/menus/index.ts +++ b/src/router/menus/index.ts @@ -13,6 +13,7 @@ export interface MenuItem { icon?: string; external?: boolean; name?: string; + only?: undefined | 'none' | 'dev'; keepAlive: boolean; children?: MenuItem[]; } @@ -25,13 +26,13 @@ function routesToItems(routes: RouteRecordRaw[]): MenuItem[] { const items: MenuItem[] = []; for (const route of routes) { - const { meta = {}, parentMeta, path } = route as any; - const { title, sort, icon, keepAlive = false, name } = meta; + const { meta = {}, parentMeta, only, path } = route as any; + const { title, sort, icon, keepAlive = false, name } = meta; let id = path; let paths = route.path.split('/'); let parentId = paths.slice(0, -1).join('/'); if (parentMeta) { - const { title, icon, sort } = parentMeta; + const { title, icon, sort, only } = parentMeta; id = `${path}/index`; parentId = path; items.push({ @@ -39,6 +40,7 @@ function routesToItems(routes: RouteRecordRaw[]): MenuItem[] { icon, sort, path, + only, id: path, keepAlive: false, parentId: paths.slice(0, -1).join('/'), @@ -49,7 +51,7 @@ function routesToItems(routes: RouteRecordRaw[]): MenuItem[] { parentId = p; } } - items.push({ id, title, parentId, path, icon, sort, keepAlive, name }); + items.push({ id, title, parentId, path, icon, sort, only, keepAlive, name }); } return items; diff --git a/src/router/routes/page.ts b/src/router/routes/page.ts index c18c486..3b8589e 100644 --- a/src/router/routes/page.ts +++ b/src/router/routes/page.ts @@ -1,5 +1,8 @@ import generatedRoutes from 'virtual:generated-pages'; import { RouteRecordRaw } from 'vue-router'; +import { routes as vroutes } from 'vue-router/auto/routes'; + +console.log({vroutes, generatedRoutes}); export const TOP_ROUTE_PREF = '_'; export const APP_ROUTE_NAME = '_layout'; diff --git a/src/store/app/index.ts b/src/store/app/index.ts index ac4cb0e..842e135 100644 --- a/src/store/app/index.ts +++ b/src/store/app/index.ts @@ -6,6 +6,7 @@ export const useAppStore = defineStore({ state: (): AppStore => ({ isDarkMode: false, title: env.title, + logo: "/favicon.ico", subtitle: env.subtitle, pageLoding: false, pageTags: [], @@ -74,6 +75,7 @@ export const useAppStore = defineStore({ }); interface AppStore { + logo: string; /** * 是否为暗模式 */ diff --git a/src/styles/css-arco.less b/src/styles/css-arco.less index 6c17bdd..0cc548d 100644 --- a/src/styles/css-arco.less +++ b/src/styles/css-arco.less @@ -132,7 +132,7 @@ body { margin-right: 0; } - .ani-form-modal .arco-modal-body { + .an-form-modal .arco-modal-body { padding-bottom: 8px; } } diff --git a/src/types/auto-component.d.ts b/src/types/auto-component.d.ts index 12bd2a7..0365d0e 100644 --- a/src/types/auto-component.d.ts +++ b/src/types/auto-component.d.ts @@ -22,7 +22,6 @@ declare module '@vue/runtime-core' { ADoption: typeof import('@arco-design/web-vue')['Doption'] ADrawer: typeof import('@arco-design/web-vue')['Drawer'] ADropdown: typeof import('@arco-design/web-vue')['Dropdown'] - ADropdownButton: typeof import('@arco-design/web-vue')['DropdownButton'] AEmpty: typeof import('@arco-design/web-vue')['Empty'] AForm: typeof import('@arco-design/web-vue')['Form'] AFormItem: typeof import('@arco-design/web-vue')['FormItem'] @@ -43,7 +42,6 @@ declare module '@vue/runtime-core' { AnEmpty: typeof import('./../components/AnEmpty/AnEmpty.vue')['default'] AnForbidden: typeof import('./../components/AnForbidden/AnForbidden.vue')['default'] AnToast: typeof import('./../components/AnToast/AnToast.vue')['default'] - AOption: typeof import('@arco-design/web-vue')['Option'] APagination: typeof import('@arco-design/web-vue')['Pagination'] APopover: typeof import('@arco-design/web-vue')['Popover'] AProgress: typeof import('@arco-design/web-vue')['Progress'] @@ -73,7 +71,6 @@ declare module '@vue/runtime-core' { EditorLeft: typeof import('./../components/editor/components/EditorLeft.vue')['default'] EditorMain: typeof import('./../components/editor/components/EditorMain.vue')['default'] EditorMainBlock: typeof import('./../components/editor/components/EditorMainBlock.vue')['default'] - EditorMainConfig: typeof import('./../components/editor/components/EditorMainConfig.vue')['default'] EditorMainHeader: typeof import('./../components/editor/components/EditorMainHeader.vue')['default'] EditorPreview: typeof import('./../components/editor/components/EditorPreview.vue')['default'] EditorRight: typeof import('./../components/editor/components/EditorRight.vue')['default'] @@ -84,13 +81,6 @@ declare module '@vue/runtime-core' { InputTexter: typeof import('./../components/editor/components/InputTexter.vue')['default'] Marquee: typeof import('./../components/editor/blocks/text/marquee.vue')['default'] Option: typeof import('./../components/editor/blocks/date/option.vue')['default'] - PanelHeader: typeof import('./../components/editor/components/PanelHeader.vue')['default'] - PanelLeft: typeof import('./../components/editor/components/PanelLeft.vue')['default'] - PanelMain: typeof import('./../components/editor/components/PanelMain.vue')['default'] - PanelMainBlock: typeof import('./../components/editor/components/PanelMainBlock.vue')['default'] - PanelMainConfig: typeof import('./../components/editor/components/PanelMainConfig.vue')['default'] - PanelMainHeader: typeof import('./../components/editor/components/PanelMainHeader.vue')['default'] - PanelRight: typeof import('./../components/editor/components/PanelRight.vue')['default'] Render: typeof import('./../components/editor/blocks/date/render.vue')['default'] RouterLink: typeof import('vue-router')['RouterLink'] RouterView: typeof import('vue-router')['RouterView'] diff --git a/src/types/auto-router.d.ts b/src/types/auto-router.d.ts index d50ae1f..18655e7 100644 --- a/src/types/auto-router.d.ts +++ b/src/types/auto-router.d.ts @@ -42,25 +42,24 @@ declare module 'vue-router/auto/routes' { '/_layout/': RouteRecordInfo<'/_layout/', '/_layout', Record, Record>, '/_login/': RouteRecordInfo<'/_login/', '/_login', Record, Record>, '/[..._all]/': RouteRecordInfo<'/[..._all]/', '/:_all(.*)', { _all: ParamValue }, { _all: ParamValue }>, - '/dev/openapi': RouteRecordInfo<'/dev/openapi', '/dev/openapi', Record, Record>, - '/home/demo': RouteRecordInfo<'/home/demo', '/home/demo', Record, Record>, - '/home/home': RouteRecordInfo<'/home/home', '/home/home', Record, Record>, - '/home/test': RouteRecordInfo<'/home/test', '/home/test', Record, Record>, - '/my/': RouteRecordInfo<'/my/', '/my', Record, Record>, - '/my/dev': RouteRecordInfo<'/my/dev', '/my/dev', Record, Record>, - '/my/editor': RouteRecordInfo<'/my/editor', '/my/editor', Record, Record>, - '/post/': RouteRecordInfo<'/post/', '/post', Record, Record>, - '/post/category/': RouteRecordInfo<'/post/category/', '/post/category', Record, Record>, - '/post/comment/': RouteRecordInfo<'/post/comment/', '/post/comment', Record, Record>, - '/post/media/': RouteRecordInfo<'/post/media/', '/post/media', Record, Record>, - '/post/post/': RouteRecordInfo<'/post/post/', '/post/post', Record, Record>, + '/content/': RouteRecordInfo<'/content/', '/content', Record, Record>, + '/content/category/': RouteRecordInfo<'/content/category/', '/content/category', Record, Record>, + '/content/comment/': RouteRecordInfo<'/content/comment/', '/content/comment', Record, Record>, + '/content/material/': RouteRecordInfo<'/content/material/', '/content/material', Record, Record>, + '/content/post/': RouteRecordInfo<'/content/post/', '/content/post', Record, Record>, + '/dev/': RouteRecordInfo<'/dev/', '/dev', Record, Record>, + '/dev/editor/': RouteRecordInfo<'/dev/editor/', '/dev/editor', Record, Record>, + '/dev/openapi/': RouteRecordInfo<'/dev/openapi/', '/dev/openapi', Record, Record>, + '/home/': RouteRecordInfo<'/home/', '/home', Record, Record>, + '/log/': RouteRecordInfo<'/log/', '/log', Record, Record>, + '/log/login/': RouteRecordInfo<'/log/login/', '/log/login', Record, Record>, + '/log/operation/': RouteRecordInfo<'/log/operation/', '/log/operation', Record, Record>, '/system/': RouteRecordInfo<'/system/', '/system', Record, Record>, - '/system/login-log/': RouteRecordInfo<'/system/login-log/', '/system/login-log', Record, Record>, + '/system/dict/': RouteRecordInfo<'/system/dict/', '/system/dict', Record, Record>, '/system/menu/': RouteRecordInfo<'/system/menu/', '/system/menu', Record, Record>, - '/system/operation-log/': RouteRecordInfo<'/system/operation-log/', '/system/operation-log', Record, Record>, - '/system/permission/': RouteRecordInfo<'/system/permission/', '/system/permission', Record, Record>, '/system/role/': RouteRecordInfo<'/system/role/', '/system/role', Record, Record>, '/system/user/': RouteRecordInfo<'/system/user/', '/system/user', Record, Record>, + '/user/': RouteRecordInfo<'/user/', '/user', Record, Record>, } } diff --git a/src/utils/delConfirm.ts b/src/utils/delConfirm.ts index c4479a1..788424a 100644 --- a/src/utils/delConfirm.ts +++ b/src/utils/delConfirm.ts @@ -4,6 +4,8 @@ import { merge } from 'lodash-es'; export type DelOptions = string | Partial>; export const delOptions: ModalConfig = { + maskAnimationName: '', + modalAnimationName: '', title: '提示', titleAlign: 'start', width: 432, diff --git a/vite.config.ts b/vite.config.ts index c63563c..b01b37d 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -1,18 +1,19 @@ -import Vue from "@vitejs/plugin-vue"; -import VueJsx from "@vitejs/plugin-vue-jsx"; -import { resolve } from "path"; -import { visualizer } from "rollup-plugin-visualizer"; -import { presetIcons, presetUno } from "unocss"; -import Unocss from "unocss/vite"; -import AutoImport from "unplugin-auto-import/vite"; -import { ArcoResolver } from "unplugin-vue-components/resolvers"; -import AutoComponent from "unplugin-vue-components/vite"; -import { defineConfig, loadEnv } from "vite"; -import Page from "vite-plugin-pages"; -import { arcoToUnoColor } from "./scripts/vite/color"; -import iconFile from "./scripts/vite/file.json"; -import iconFmt from "./scripts/vite/fmt.json"; -import plugin from "./scripts/vite/plugin"; +import Vue from '@vitejs/plugin-vue'; +import VueJsx from '@vitejs/plugin-vue-jsx'; +import { resolve } from 'path'; +import { visualizer } from 'rollup-plugin-visualizer'; +import { presetIcons, presetUno } from 'unocss'; +import Unocss from 'unocss/vite'; +import AutoImport from 'unplugin-auto-import/vite'; +import { ArcoResolver } from 'unplugin-vue-components/resolvers'; +import AutoComponent from 'unplugin-vue-components/vite'; +import router from 'unplugin-vue-router/vite'; +import { defineConfig, loadEnv } from 'vite'; +import Page from 'vite-plugin-pages'; +import { arcoToUnoColor } from './scripts/vite/color'; +import iconFile from './scripts/vite/file.json'; +import iconFmt from './scripts/vite/fmt.json'; +import plugin from './scripts/vite/plugin'; /** * vite 配置 @@ -20,12 +21,21 @@ import plugin from "./scripts/vite/plugin"; */ export default defineConfig(({ mode }) => { const env = loadEnv(mode, process.cwd()); - const base = env.VITE_BASE ?? "/"; - const host = env.VITE_HOST ?? "0.0.0.0"; + const base = env.VITE_BASE ?? '/'; + const host = env.VITE_HOST ?? '0.0.0.0'; const port = Number(env.VITE_PORT ?? 3020); return { base, plugins: [ + /** + * 提供路由自动生成 + * @see https://github.com/posva/unplugin-vue-router + */ + router({ + dts: 'src/types/auto-router.d.ts', + exclude: ['**/components/*'], + }), + /** * 提供 Vue 3 单文件组件支持 * @see https://github.com/vitejs/vite-plugin-vue/tree/main/packages/plugin-vue @@ -47,9 +57,9 @@ export default defineConfig(({ mode }) => { * @see https://github.com/antfu/unplugin-auto-import#readme */ AutoImport({ - imports: ["vue", "vue-router"], + dts: 'src/types/auto-import.d.ts', + imports: ['vue', 'vue-router'], resolvers: [ArcoResolver()], - dts: "./src/types/auto-import.d.ts", }), /** @@ -57,8 +67,8 @@ export default defineConfig(({ mode }) => { * @see https://github.com/antfu/unplugin-vue-components */ AutoComponent({ + dts: 'src/types/auto-component.d.ts', resolvers: [ArcoResolver({ sideEffect: false })], - dts: "./src/types/auto-component.d.ts", }), /** @@ -66,13 +76,13 @@ export default defineConfig(({ mode }) => { * @see https://github.com/hannoeru/vite-plugin-pages */ Page({ - exclude: ["**/components/*", "**/*.*.*"], - importMode: "async", + exclude: ['**/components/*', '**/*.*.*'], + importMode: 'async', onRoutesGenerated(routes) { - // if (env.DEV) { - // return routes; - // } - return routes.filter((route) => route.only !== "dev"); + if (mode === 'development') { + return routes.filter(route => route.only !== 'none'); + } + return routes.filter(route => !['none', 'dev'].includes(route.only)); }, }), @@ -83,17 +93,17 @@ export default defineConfig(({ mode }) => { Unocss({ theme: { colors: { - brand: arcoToUnoColor("primary"), + brand: arcoToUnoColor('primary'), }, }, - include: ["src/**/*.{vue,ts,tsx,css,scss,sass,less,styl}"], + include: ['src/**/*.{vue,ts,tsx,css,scss,sass,less,styl}'], presets: [ presetUno(), presetIcons({ - prefix: "", + prefix: '', collections: { - "icon-file": iconFile, - "icon-fmt": iconFmt, + 'icon-file': iconFile, + 'icon-fmt': iconFmt, }, }), ], @@ -105,7 +115,7 @@ export default defineConfig(({ mode }) => { */ visualizer({ title: `构建统计 | ${env.VITE_SUBTITLE}`, - filename: ".gitea/stat.html", + filename: '.gitea/stat.html', }), /** @@ -117,8 +127,8 @@ export default defineConfig(({ mode }) => { resolve: { alias: [ { - find: "@", - replacement: "/src", + find: '@', + replacement: '/src', }, ], }, @@ -126,10 +136,10 @@ export default defineConfig(({ mode }) => { host, port, proxy: { - "/api": { + '/api': { target: env.VITE_PROXY, }, - "/upload": { + '/upload': { target: env.VITE_PROXY, }, }, @@ -139,8 +149,8 @@ export default defineConfig(({ mode }) => { less: { javascriptEnabled: true, modifyVars: { - hack: `true; @import (reference) "${resolve("src/styles/css-arco.less")}";`, - arcoblue: "#66f", + hack: `true; @import (reference) "${resolve('src/styles/css-arco.less')}";`, + arcoblue: '#66f', }, }, },