diff --git a/apps/admin/src/locales/langs/en-us.ts b/apps/admin/src/locales/langs/en-us.ts index a162b49..f790b81 100644 --- a/apps/admin/src/locales/langs/en-us.ts +++ b/apps/admin/src/locales/langs/en-us.ts @@ -229,6 +229,10 @@ const local: App.I18n.Schema = { '500': 'Server Error', 'iframe-page': 'Iframe', 'home': 'Home', + 'competition': 'Competition', + 'competition_competition-add': 'Competition Add', + 'competition_competition-detail': 'Competition Detail', + 'competition_competition-list': 'Competition List', }, page: { login: { diff --git a/apps/admin/src/locales/langs/zh-cn.ts b/apps/admin/src/locales/langs/zh-cn.ts index 4987b16..516f495 100644 --- a/apps/admin/src/locales/langs/zh-cn.ts +++ b/apps/admin/src/locales/langs/zh-cn.ts @@ -225,6 +225,10 @@ const local: App.I18n.Schema = { '500': '服务器错误', 'iframe-page': '外链页面', 'home': '首页', + 'competition': '比赛', + 'competition_competition-add': '比赛添加', + 'competition_competition-detail': '比赛详情', + 'competition_competition-list': '比赛列表', }, page: { login: { diff --git a/apps/admin/src/router/elegant/imports.ts b/apps/admin/src/router/elegant/imports.ts index 89d8bb1..541cd60 100644 --- a/apps/admin/src/router/elegant/imports.ts +++ b/apps/admin/src/router/elegant/imports.ts @@ -20,6 +20,8 @@ export const views: Record Promise import("@/views/_builtin/500/index.vue"), "iframe-page": () => import("@/views/_builtin/iframe-page/[url].vue"), login: () => import("@/views/_builtin/login/index.vue"), - dashboard: () => import("@/views/dashboard/index.vue"), + "competition_competition-add": () => import("@/views/competition/competition-add/index.vue"), + "competition_competition-detail": () => import("@/views/competition/competition-detail/index.vue"), + "competition_competition-list": () => import("@/views/competition/competition-list/index.vue"), home: () => import("@/views/home/index.vue"), }; diff --git a/apps/admin/src/router/elegant/routes.ts b/apps/admin/src/router/elegant/routes.ts index 2ac2bb5..a48541a 100644 --- a/apps/admin/src/router/elegant/routes.ts +++ b/apps/admin/src/router/elegant/routes.ts @@ -40,13 +40,46 @@ export const generatedRoutes: GeneratedRoute[] = [ } }, { - name: 'dashboard', - path: '/dashboard', - component: 'layout.base$view.dashboard', + name: 'competition', + path: '/competition', + component: 'layout.base', meta: { - title: 'dashboard', - i18nKey: 'route.dashboard' - } + title: 'competition', + i18nKey: 'route.competition' + }, + children: [ + { + name: 'competition_competition-add', + path: '/competition/competition-add', + component: 'view.competition_competition-add', + meta: { + title: 'competition_competition-add', + i18nKey: 'route.competition_competition-add', + multiTab: true,// 新增选项卡 + hideInMenu: true,// 隐藏在菜单中 + } + }, + { + name: 'competition_competition-detail', + path: '/competition/competition-detail', + component: 'view.competition_competition-detail', + meta: { + title: 'competition_competition-detail', + i18nKey: 'route.competition_competition-detail', + multiTab: true,// 新增选项卡 + hideInMenu: true,// 隐藏在菜单中 + } + }, + { + name: 'competition_competition-list', + path: '/competition/competition-list', + component: 'view.competition_competition-list', + meta: { + title: 'competition_competition-list', + i18nKey: 'route.competition_competition-list' + } + } + ] }, { name: 'home', diff --git a/apps/admin/src/router/elegant/transform.ts b/apps/admin/src/router/elegant/transform.ts index f8cf48d..84d1462 100644 --- a/apps/admin/src/router/elegant/transform.ts +++ b/apps/admin/src/router/elegant/transform.ts @@ -166,7 +166,10 @@ const routeMap: RouteMap = { "403": "/403", "404": "/404", "500": "/500", - "dashboard": "/dashboard", + "competition": "/competition", + "competition_competition-add": "/competition/competition-add", + "competition_competition-detail": "/competition/competition-detail", + "competition_competition-list": "/competition/competition-list", "home": "/home", "iframe-page": "/iframe-page/:url", "login": "/login/:module(pwd-login|code-login|register|reset-pwd|bind-wechat)?" diff --git a/apps/admin/src/typings/elegant-router.d.ts b/apps/admin/src/typings/elegant-router.d.ts index c8ad65f..9b33d6d 100644 --- a/apps/admin/src/typings/elegant-router.d.ts +++ b/apps/admin/src/typings/elegant-router.d.ts @@ -20,7 +20,10 @@ declare module "@elegant-router/types" { "403": "/403"; "404": "/404"; "500": "/500"; - "dashboard": "/dashboard"; + "competition": "/competition"; + "competition_competition-add": "/competition/competition-add"; + "competition_competition-detail": "/competition/competition-detail"; + "competition_competition-list": "/competition/competition-list"; "home": "/home"; "iframe-page": "/iframe-page/:url"; "login": "/login/:module(pwd-login|code-login|register|reset-pwd|bind-wechat)?"; @@ -58,7 +61,7 @@ declare module "@elegant-router/types" { | "403" | "404" | "500" - | "dashboard" + | "competition" | "home" | "iframe-page" | "login" @@ -83,7 +86,9 @@ declare module "@elegant-router/types" { | "500" | "iframe-page" | "login" - | "dashboard" + | "competition_competition-add" + | "competition_competition-detail" + | "competition_competition-list" | "home" >; diff --git a/apps/admin/src/views/competition/competition-add/index.vue b/apps/admin/src/views/competition/competition-add/index.vue new file mode 100644 index 0000000..6c4e715 --- /dev/null +++ b/apps/admin/src/views/competition/competition-add/index.vue @@ -0,0 +1,19 @@ + + + + + diff --git a/apps/admin/src/views/competition/competition-detail/index.vue b/apps/admin/src/views/competition/competition-detail/index.vue new file mode 100644 index 0000000..f2ef503 --- /dev/null +++ b/apps/admin/src/views/competition/competition-detail/index.vue @@ -0,0 +1,5 @@ + diff --git a/apps/admin/src/views/dashboard/index.vue b/apps/admin/src/views/competition/competition-list/index.vue similarity index 100% rename from apps/admin/src/views/dashboard/index.vue rename to apps/admin/src/views/competition/competition-list/index.vue diff --git a/apps/admin/src/views/dashboard/modules/competition-card.vue b/apps/admin/src/views/competition/competition-list/modules/competition-card.vue similarity index 100% rename from apps/admin/src/views/dashboard/modules/competition-card.vue rename to apps/admin/src/views/competition/competition-list/modules/competition-card.vue diff --git a/apps/admin/src/views/dashboard/modules/data.ts b/apps/admin/src/views/competition/competition-list/modules/data.ts similarity index 100% rename from apps/admin/src/views/dashboard/modules/data.ts rename to apps/admin/src/views/competition/competition-list/modules/data.ts diff --git a/apps/user/build/config/index.ts b/apps/user/build/config/index.ts deleted file mode 100644 index 7b3964b..0000000 --- a/apps/user/build/config/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from './proxy' -export * from './time' diff --git a/apps/user/build/config/proxy.ts b/apps/user/build/config/proxy.ts deleted file mode 100644 index 4e83860..0000000 --- a/apps/user/build/config/proxy.ts +++ /dev/null @@ -1,58 +0,0 @@ -import type { ProxyOptions } from 'vite' -import { consola } from 'consola' -import { bgRed, bgYellow, green, lightBlue } from 'kolorist' -import { createServiceConfig } from '../../src/utils/service' - -/** - * Set http proxy - * - * @param env - The current env - * @param enable - If enable http proxy - */ -export function createViteProxy(env: Env.ImportMeta, enable: boolean) { - const isEnableHttpProxy = enable && env.VITE_HTTP_PROXY === 'Y' - - if (!isEnableHttpProxy) - return undefined - - const isEnableProxyLog = env.VITE_PROXY_LOG === 'Y' - - const { baseURL, proxyPattern, other } = createServiceConfig(env) - - const proxy: Record = createProxyItem({ baseURL, proxyPattern }, isEnableProxyLog) - - other.forEach((item) => { - Object.assign(proxy, createProxyItem(item, isEnableProxyLog)) - }) - - return proxy -} - -function createProxyItem(item: App.Service.ServiceConfigItem, enableLog: boolean) { - const proxy: Record = {} - - proxy[item.proxyPattern] = { - target: item.baseURL, - changeOrigin: true, - configure: (_proxy, options) => { - _proxy.on('proxyReq', (_proxyReq, req, _res) => { - if (!enableLog) - return - - const requestUrl = `${lightBlue('[proxy url]')}: ${bgYellow(` ${req.method} `)} ${green(`${item.proxyPattern}${req.url}`)}` - - const proxyUrl = `${lightBlue('[real request url]')}: ${green(`${options.target}${req.url}`)}` - - consola.log(`${requestUrl}\n${proxyUrl}`) - }) - _proxy.on('error', (_err, req, _res) => { - if (!enableLog) - return - consola.log(bgRed(`Error: ${req.method} `), green(`${options.target}${req.url}`)) - }) - }, - rewrite: path => path.replace(new RegExp(`^${item.proxyPattern}`), ''), - } - - return proxy -} diff --git a/apps/user/build/config/time.ts b/apps/user/build/config/time.ts deleted file mode 100644 index cbdefdb..0000000 --- a/apps/user/build/config/time.ts +++ /dev/null @@ -1,12 +0,0 @@ -import dayjs from 'dayjs' -import timezone from 'dayjs/plugin/timezone' -import utc from 'dayjs/plugin/utc' - -export function getBuildTime() { - dayjs.extend(utc) - dayjs.extend(timezone) - - const buildTime = dayjs.tz(Date.now(), 'Asia/Shanghai').format('YYYY-MM-DD HH:mm:ss') - - return buildTime -} diff --git a/apps/user/build/plugins/devtools.ts b/apps/user/build/plugins/devtools.ts deleted file mode 100644 index 6687d12..0000000 --- a/apps/user/build/plugins/devtools.ts +++ /dev/null @@ -1,9 +0,0 @@ -import VueDevtools from 'vite-plugin-vue-devtools' - -export function setupDevtoolsPlugin(viteEnv: Env.ImportMeta) { - const { VITE_DEVTOOLS_LAUNCH_EDITOR } = viteEnv - - return VueDevtools({ - launchEditor: VITE_DEVTOOLS_LAUNCH_EDITOR, - }) -} diff --git a/apps/user/build/plugins/html.ts b/apps/user/build/plugins/html.ts deleted file mode 100644 index c98b13b..0000000 --- a/apps/user/build/plugins/html.ts +++ /dev/null @@ -1,13 +0,0 @@ -import type { Plugin } from 'vite' - -export function setupHtmlPlugin(buildTime: string) { - const plugin: Plugin = { - name: 'html-plugin', - apply: 'build', - transformIndexHtml(html) { - return html.replace('', `\n `) - }, - } - - return plugin -} diff --git a/apps/user/build/plugins/index.ts b/apps/user/build/plugins/index.ts deleted file mode 100644 index 5f6d7cf..0000000 --- a/apps/user/build/plugins/index.ts +++ /dev/null @@ -1,24 +0,0 @@ -import type { PluginOption } from 'vite' -import vue from '@vitejs/plugin-vue' -import vueJsx from '@vitejs/plugin-vue-jsx' -import progress from 'vite-plugin-progress' -import { setupDevtoolsPlugin } from './devtools' -import { setupHtmlPlugin } from './html' -import { setupElegantRouter } from './router' -import { setupUnocss } from './unocss' -import { setupUnplugin } from './unplugin' - -export function setupVitePlugins(viteEnv: Env.ImportMeta, buildTime: string) { - const plugins: PluginOption = [ - vue(), - vueJsx(), - setupDevtoolsPlugin(viteEnv), - setupElegantRouter(), - setupUnocss(viteEnv), - ...setupUnplugin(viteEnv), - progress(), - setupHtmlPlugin(buildTime), - ] - - return plugins -} diff --git a/apps/user/build/plugins/router.ts b/apps/user/build/plugins/router.ts deleted file mode 100644 index cceb719..0000000 --- a/apps/user/build/plugins/router.ts +++ /dev/null @@ -1,41 +0,0 @@ -import type { RouteKey } from '@elegant-router/types' -import type { RouteMeta } from 'vue-router' -import ElegantVueRouter from '@elegant-router/vue/vite' - -export function setupElegantRouter() { - return ElegantVueRouter({ - layouts: { - base: 'src/layouts/base-layout/index.vue', - blank: 'src/layouts/blank-layout/index.vue', - }, - routePathTransformer(routeName, routePath) { - const key = routeName as RouteKey - - if (key === 'login') { - const modules: UnionKey.LoginModule[] = ['pwd-login', 'code-login', 'register', 'reset-pwd', 'bind-wechat'] - - const moduleReg = modules.join('|') - - return `/login/:module(${moduleReg})?` - } - - return routePath - }, - onRouteMetaGen(routeName) { - const key = routeName as RouteKey - - const constantRoutes: RouteKey[] = ['login', '403', '404', '500'] - - const meta: Partial = { - title: key, - i18nKey: `route.${key}` as App.I18n.I18nKey, - } - - if (constantRoutes.includes(key)) { - meta.constant = true - } - - return meta - }, - }) -} diff --git a/apps/user/build/plugins/unocss.ts b/apps/user/build/plugins/unocss.ts deleted file mode 100644 index da64b69..0000000 --- a/apps/user/build/plugins/unocss.ts +++ /dev/null @@ -1,31 +0,0 @@ -import path from 'node:path' -import process from 'node:process' -import { FileSystemIconLoader } from '@iconify/utils/lib/loader/node-loaders' -import presetIcons from '@unocss/preset-icons' -import unocss from '@unocss/vite' - -export function setupUnocss(viteEnv: Env.ImportMeta) { - const { VITE_ICON_PREFIX, VITE_ICON_LOCAL_PREFIX } = viteEnv - - const localIconPath = path.join(process.cwd(), 'src/assets/svg-icon') - - /** The name of the local icon collection */ - const collectionName = VITE_ICON_LOCAL_PREFIX.replace(`${VITE_ICON_PREFIX}-`, '') - - return unocss({ - presets: [ - presetIcons({ - prefix: `${VITE_ICON_PREFIX}-`, - scale: 1, - extraProperties: { - display: 'inline-block', - }, - collections: { - [collectionName]: FileSystemIconLoader(localIconPath, svg => - svg.replace(/^ - svg.replace(/^ - - - - - - - %VITE_APP_TITLE% - - -
- - - diff --git a/apps/user/package.json b/apps/user/package.json deleted file mode 100644 index 06b60a9..0000000 --- a/apps/user/package.json +++ /dev/null @@ -1,109 +0,0 @@ -{ - "name": "@reader-star/user", - "type": "module", - "version": "2.0.2", - "description": "A fresh and elegant admin template, based on Vue3、Vite7、TypeScript、NaiveUI and UnoCSS. 一个基于Vue3、Vite7、TypeScript、NaiveUI and UnoCSS的清新优雅的中后台模版。", - "author": { - "name": "reader-star", - "email": "reader-star@outlook.com", - "url": "https://github.com/reader-star" - }, - "license": "MIT", - "homepage": "https://github.com/reader-star/reader-star-admin", - "repository": { - "url": "https://github.com/reader-star/reader-star-admin.git" - }, - "bugs": { - "url": "https://github.com/reader-star/reader-star-admin/issues" - }, - "keywords": [ - "Vue3 admin ", - "vue-admin-template", - "Vite7", - "TypeScript", - "naive-ui", - "naive-ui-admin", - "ant-design-vue v4", - "UnoCSS" - ], - "engines": { - "node": ">=20.19.0", - "pnpm": ">=10.5.0" - }, - "scripts": { - "build": "vite build --mode prod", - "build:test": "vite build --mode test", - "cleanup": "sa cleanup", - "commit": "sa git-commit", - "commit:zh": "sa git-commit -l=zh-cn", - "dev": "vite --mode test", - "dev:prod": "vite --mode prod", - "gen-route": "sa gen-route", - "lint": "eslint . --fix", - "prepare": "simple-git-hooks", - "preview": "vite preview", - "release": "sa release", - "typecheck": "vue-tsc --noEmit --skipLibCheck", - "update-pkg": "sa update-pkg" - }, - "dependencies": { - "@better-scroll/core": "2.5.1", - "@iconify/vue": "5.0.0", - "@sa/axios": "workspace:*", - "@sa/color": "workspace:*", - "@sa/hooks": "workspace:*", - "@sa/materials": "workspace:*", - "@sa/utils": "workspace:*", - "@vueuse/core": "14.1.0", - "clipboard": "2.0.11", - "dayjs": "1.11.19", - "defu": "6.1.4", - "echarts": "6.0.0", - "json5": "2.2.3", - "naive-ui": "2.43.2", - "nprogress": "0.2.0", - "pinia": "3.0.4", - "tailwind-merge": "3.4.0", - "vue": "3.5.26", - "vue-draggable-plus": "0.6.0", - "vue-i18n": "11.2.7", - "vue-router": "4.6.4" - }, - "devDependencies": { - "@elegant-router/vue": "0.3.8", - "@iconify/json": "2.2.417", - "@sa/scripts": "workspace:*", - "@sa/uno-preset": "workspace:*", - "@types/node": "25.0.3", - "@types/nprogress": "0.2.3", - "@unocss/eslint-config": "66.5.10", - "@unocss/preset-icons": "66.5.10", - "@unocss/preset-uno": "66.5.10", - "@unocss/transformer-directives": "66.5.10", - "@unocss/transformer-variant-group": "66.5.10", - "@unocss/vite": "66.5.10", - "@vitejs/plugin-vue": "6.0.3", - "@vitejs/plugin-vue-jsx": "5.1.3", - "consola": "3.4.2", - "eslint": "9.39.2", - "eslint-plugin-vue": "10.6.2", - "kolorist": "1.8.0", - "sass": "1.97.1", - "simple-git-hooks": "2.13.1", - "tsx": "4.21.0", - "typescript": "5.9.3", - "unplugin-icons": "22.5.0", - "unplugin-vue-components": "30.0.0", - "vite": "7.3.0", - "vite-plugin-progress": "0.0.7", - "vite-plugin-svg-icons": "2.0.1", - "vite-plugin-vue-devtools": "8.0.5", - "vue-eslint-parser": "10.2.0", - "vue-tsc": "3.2.1" - }, - "simple-git-hooks": { - "commit-msg": "pnpm sa git-commit-verify", - "pre-commit": "pnpm typecheck && pnpm lint && git diff --exit-code" - }, - "website": "https://admin.reader-star.cn" -} diff --git a/apps/user/public/favicon.svg b/apps/user/public/favicon.svg deleted file mode 100644 index dfaa6c8..0000000 --- a/apps/user/public/favicon.svg +++ /dev/null @@ -1,60 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/apps/user/src/App.vue b/apps/user/src/App.vue deleted file mode 100644 index 089e43b..0000000 --- a/apps/user/src/App.vue +++ /dev/null @@ -1,58 +0,0 @@ - - - - - diff --git a/apps/user/src/assets/imgs/soybean.jpg b/apps/user/src/assets/imgs/soybean.jpg deleted file mode 100644 index 75457d5..0000000 Binary files a/apps/user/src/assets/imgs/soybean.jpg and /dev/null differ diff --git a/apps/user/src/assets/svg-icon/activity.svg b/apps/user/src/assets/svg-icon/activity.svg deleted file mode 100644 index abe892f..0000000 --- a/apps/user/src/assets/svg-icon/activity.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/apps/user/src/assets/svg-icon/at-sign.svg b/apps/user/src/assets/svg-icon/at-sign.svg deleted file mode 100644 index 625214d..0000000 --- a/apps/user/src/assets/svg-icon/at-sign.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/apps/user/src/assets/svg-icon/avatar.svg b/apps/user/src/assets/svg-icon/avatar.svg deleted file mode 100644 index 66fe6f2..0000000 --- a/apps/user/src/assets/svg-icon/avatar.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/apps/user/src/assets/svg-icon/banner.svg b/apps/user/src/assets/svg-icon/banner.svg deleted file mode 100644 index 192b637..0000000 --- a/apps/user/src/assets/svg-icon/banner.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/apps/user/src/assets/svg-icon/cast.svg b/apps/user/src/assets/svg-icon/cast.svg deleted file mode 100644 index 4f008d3..0000000 --- a/apps/user/src/assets/svg-icon/cast.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/apps/user/src/assets/svg-icon/chrome.svg b/apps/user/src/assets/svg-icon/chrome.svg deleted file mode 100644 index 6314173..0000000 --- a/apps/user/src/assets/svg-icon/chrome.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/apps/user/src/assets/svg-icon/copy.svg b/apps/user/src/assets/svg-icon/copy.svg deleted file mode 100644 index ab25601..0000000 --- a/apps/user/src/assets/svg-icon/copy.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/apps/user/src/assets/svg-icon/custom-icon.svg b/apps/user/src/assets/svg-icon/custom-icon.svg deleted file mode 100644 index b33a43f..0000000 --- a/apps/user/src/assets/svg-icon/custom-icon.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/apps/user/src/assets/svg-icon/empty-data.svg b/apps/user/src/assets/svg-icon/empty-data.svg deleted file mode 100644 index 293486c..0000000 --- a/apps/user/src/assets/svg-icon/empty-data.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/apps/user/src/assets/svg-icon/expectation.svg b/apps/user/src/assets/svg-icon/expectation.svg deleted file mode 100644 index 1d87d5e..0000000 --- a/apps/user/src/assets/svg-icon/expectation.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/apps/user/src/assets/svg-icon/heart.svg b/apps/user/src/assets/svg-icon/heart.svg deleted file mode 100644 index 56e59b4..0000000 --- a/apps/user/src/assets/svg-icon/heart.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/apps/user/src/assets/svg-icon/logo.svg b/apps/user/src/assets/svg-icon/logo.svg deleted file mode 100644 index 341675d..0000000 --- a/apps/user/src/assets/svg-icon/logo.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/apps/user/src/assets/svg-icon/network-error.svg b/apps/user/src/assets/svg-icon/network-error.svg deleted file mode 100644 index 52f97ab..0000000 --- a/apps/user/src/assets/svg-icon/network-error.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/apps/user/src/assets/svg-icon/no-icon.svg b/apps/user/src/assets/svg-icon/no-icon.svg deleted file mode 100644 index f6dcdd0..0000000 --- a/apps/user/src/assets/svg-icon/no-icon.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/apps/user/src/assets/svg-icon/no-permission.svg b/apps/user/src/assets/svg-icon/no-permission.svg deleted file mode 100644 index 4c408ca..0000000 --- a/apps/user/src/assets/svg-icon/no-permission.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/apps/user/src/assets/svg-icon/not-found.svg b/apps/user/src/assets/svg-icon/not-found.svg deleted file mode 100644 index a513656..0000000 --- a/apps/user/src/assets/svg-icon/not-found.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/apps/user/src/assets/svg-icon/service-error.svg b/apps/user/src/assets/svg-icon/service-error.svg deleted file mode 100644 index 0120f1e..0000000 --- a/apps/user/src/assets/svg-icon/service-error.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/apps/user/src/assets/svg-icon/wind.svg b/apps/user/src/assets/svg-icon/wind.svg deleted file mode 100644 index 7c90590..0000000 --- a/apps/user/src/assets/svg-icon/wind.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/apps/user/src/components/advanced/table-column-setting.vue b/apps/user/src/components/advanced/table-column-setting.vue deleted file mode 100644 index c262375..0000000 --- a/apps/user/src/components/advanced/table-column-setting.vue +++ /dev/null @@ -1,45 +0,0 @@ - - - - - diff --git a/apps/user/src/components/advanced/table-header-operation.vue b/apps/user/src/components/advanced/table-header-operation.vue deleted file mode 100644 index 4e699fa..0000000 --- a/apps/user/src/components/advanced/table-header-operation.vue +++ /dev/null @@ -1,74 +0,0 @@ - - - - - diff --git a/apps/user/src/components/common/app-provider.vue b/apps/user/src/components/common/app-provider.vue deleted file mode 100644 index 810afe5..0000000 --- a/apps/user/src/components/common/app-provider.vue +++ /dev/null @@ -1,39 +0,0 @@ - - - - - diff --git a/apps/user/src/components/common/dark-mode-container.vue b/apps/user/src/components/common/dark-mode-container.vue deleted file mode 100644 index f2fdb0a..0000000 --- a/apps/user/src/components/common/dark-mode-container.vue +++ /dev/null @@ -1,17 +0,0 @@ - - - - - diff --git a/apps/user/src/components/common/exception-base.vue b/apps/user/src/components/common/exception-base.vue deleted file mode 100644 index e1f7c45..0000000 --- a/apps/user/src/components/common/exception-base.vue +++ /dev/null @@ -1,45 +0,0 @@ - - - - - diff --git a/apps/user/src/components/common/full-screen.vue b/apps/user/src/components/common/full-screen.vue deleted file mode 100644 index 8380c68..0000000 --- a/apps/user/src/components/common/full-screen.vue +++ /dev/null @@ -1,22 +0,0 @@ - - - - - diff --git a/apps/user/src/components/common/icon-tooltip.vue b/apps/user/src/components/common/icon-tooltip.vue deleted file mode 100644 index 0dc422b..0000000 --- a/apps/user/src/components/common/icon-tooltip.vue +++ /dev/null @@ -1,42 +0,0 @@ - - - diff --git a/apps/user/src/components/common/lang-switch.vue b/apps/user/src/components/common/lang-switch.vue deleted file mode 100644 index ae8295d..0000000 --- a/apps/user/src/components/common/lang-switch.vue +++ /dev/null @@ -1,62 +0,0 @@ - - - - - diff --git a/apps/user/src/components/common/menu-toggler.vue b/apps/user/src/components/common/menu-toggler.vue deleted file mode 100644 index 3cc85e2..0000000 --- a/apps/user/src/components/common/menu-toggler.vue +++ /dev/null @@ -1,53 +0,0 @@ - - - - - diff --git a/apps/user/src/components/common/pin-toggler.vue b/apps/user/src/components/common/pin-toggler.vue deleted file mode 100644 index c19e8db..0000000 --- a/apps/user/src/components/common/pin-toggler.vue +++ /dev/null @@ -1,26 +0,0 @@ - - - - - diff --git a/apps/user/src/components/common/reload-button.vue b/apps/user/src/components/common/reload-button.vue deleted file mode 100644 index e1242c6..0000000 --- a/apps/user/src/components/common/reload-button.vue +++ /dev/null @@ -1,21 +0,0 @@ - - - - - diff --git a/apps/user/src/components/common/system-logo.vue b/apps/user/src/components/common/system-logo.vue deleted file mode 100644 index 7777825..0000000 --- a/apps/user/src/components/common/system-logo.vue +++ /dev/null @@ -1,160 +0,0 @@ - - - diff --git a/apps/user/src/components/common/theme-schema-switch.vue b/apps/user/src/components/common/theme-schema-switch.vue deleted file mode 100644 index a928b81..0000000 --- a/apps/user/src/components/common/theme-schema-switch.vue +++ /dev/null @@ -1,57 +0,0 @@ - - - - - diff --git a/apps/user/src/components/custom/better-scroll.vue b/apps/user/src/components/custom/better-scroll.vue deleted file mode 100644 index c16f8ad..0000000 --- a/apps/user/src/components/custom/better-scroll.vue +++ /dev/null @@ -1,54 +0,0 @@ - - - - - diff --git a/apps/user/src/components/custom/button-icon.vue b/apps/user/src/components/custom/button-icon.vue deleted file mode 100644 index c8a6f32..0000000 --- a/apps/user/src/components/custom/button-icon.vue +++ /dev/null @@ -1,48 +0,0 @@ - - - - - diff --git a/apps/user/src/components/custom/count-to.vue b/apps/user/src/components/custom/count-to.vue deleted file mode 100644 index 3a6ad43..0000000 --- a/apps/user/src/components/custom/count-to.vue +++ /dev/null @@ -1,88 +0,0 @@ - - - - - diff --git a/apps/user/src/components/custom/look-forward.vue b/apps/user/src/components/custom/look-forward.vue deleted file mode 100644 index 7229b73..0000000 --- a/apps/user/src/components/custom/look-forward.vue +++ /dev/null @@ -1,22 +0,0 @@ - - - - - diff --git a/apps/user/src/components/custom/soybean-avatar.vue b/apps/user/src/components/custom/soybean-avatar.vue deleted file mode 100644 index dd383e1..0000000 --- a/apps/user/src/components/custom/soybean-avatar.vue +++ /dev/null @@ -1,13 +0,0 @@ - - - - - diff --git a/apps/user/src/components/custom/svg-icon.vue b/apps/user/src/components/custom/svg-icon.vue deleted file mode 100644 index a64c508..0000000 --- a/apps/user/src/components/custom/svg-icon.vue +++ /dev/null @@ -1,54 +0,0 @@ - - - - - diff --git a/apps/user/src/components/custom/wave-bg.vue b/apps/user/src/components/custom/wave-bg.vue deleted file mode 100644 index 9587de5..0000000 --- a/apps/user/src/components/custom/wave-bg.vue +++ /dev/null @@ -1,61 +0,0 @@ - - - - - diff --git a/apps/user/src/constants/app.ts b/apps/user/src/constants/app.ts deleted file mode 100644 index e7eb6b9..0000000 --- a/apps/user/src/constants/app.ts +++ /dev/null @@ -1,71 +0,0 @@ -import { transformRecordToOption } from '@/utils/common' - -export const GLOBAL_HEADER_MENU_ID = '__GLOBAL_HEADER_MENU__' - -export const GLOBAL_SIDER_MENU_ID = '__GLOBAL_SIDER_MENU__' - -export const themeSchemaRecord: Record = { - light: 'theme.appearance.themeSchema.light', - dark: 'theme.appearance.themeSchema.dark', - auto: 'theme.appearance.themeSchema.auto', -} - -export const themeSchemaOptions = transformRecordToOption(themeSchemaRecord) - -export const loginModuleRecord: Record = { - 'pwd-login': 'page.login.pwdLogin.title', - 'code-login': 'page.login.codeLogin.title', - 'register': 'page.login.register.title', - 'reset-pwd': 'page.login.resetPwd.title', - 'bind-wechat': 'page.login.bindWeChat.title', -} - -export const themeLayoutModeRecord: Record = { - 'vertical': 'theme.layout.layoutMode.vertical', - 'vertical-mix': 'theme.layout.layoutMode.vertical-mix', - 'vertical-hybrid-header-first': 'theme.layout.layoutMode.vertical-hybrid-header-first', - 'horizontal': 'theme.layout.layoutMode.horizontal', - 'top-hybrid-sidebar-first': 'theme.layout.layoutMode.top-hybrid-sidebar-first', - 'top-hybrid-header-first': 'theme.layout.layoutMode.top-hybrid-header-first', -} - -export const themeLayoutModeOptions = transformRecordToOption(themeLayoutModeRecord) - -export const themeScrollModeRecord: Record = { - wrapper: 'theme.layout.content.scrollMode.wrapper', - content: 'theme.layout.content.scrollMode.content', -} - -export const themeScrollModeOptions = transformRecordToOption(themeScrollModeRecord) - -export const themeTabModeRecord: Record = { - chrome: 'theme.layout.tab.mode.chrome', - button: 'theme.layout.tab.mode.button', - slider: 'theme.layout.tab.mode.slider', -} - -export const themeTabModeOptions = transformRecordToOption(themeTabModeRecord) - -export const themePageAnimationModeRecord: Record = { - 'fade-slide': 'theme.layout.content.page.mode.fade-slide', - 'fade': 'theme.layout.content.page.mode.fade', - 'fade-bottom': 'theme.layout.content.page.mode.fade-bottom', - 'fade-scale': 'theme.layout.content.page.mode.fade-scale', - 'zoom-fade': 'theme.layout.content.page.mode.zoom-fade', - 'zoom-out': 'theme.layout.content.page.mode.zoom-out', - 'none': 'theme.layout.content.page.mode.none', -} - -export const themePageAnimationModeOptions = transformRecordToOption(themePageAnimationModeRecord) - -export const DARK_CLASS = 'dark' - -export const watermarkTimeFormatOptions = [ - { label: 'YYYY-MM-DD HH:mm', value: 'YYYY-MM-DD HH:mm' }, - { label: 'YYYY-MM-DD HH:mm:ss', value: 'YYYY-MM-DD HH:mm:ss' }, - { label: 'YYYY/MM/DD HH:mm', value: 'YYYY/MM/DD HH:mm' }, - { label: 'YYYY/MM/DD HH:mm:ss', value: 'YYYY/MM/DD HH:mm:ss' }, - { label: 'HH:mm', value: 'HH:mm' }, - { label: 'HH:mm:ss', value: 'HH:mm:ss' }, - { label: 'MM-DD HH:mm', value: 'MM-DD HH:mm' }, -] diff --git a/apps/user/src/constants/common.ts b/apps/user/src/constants/common.ts deleted file mode 100644 index 2c52dfa..0000000 --- a/apps/user/src/constants/common.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { transformRecordToOption } from '@/utils/common' - -export const yesOrNoRecord: Record = { - Y: 'common.yesOrNo.yes', - N: 'common.yesOrNo.no', -} - -export const yesOrNoOptions = transformRecordToOption(yesOrNoRecord) diff --git a/apps/user/src/constants/reg.ts b/apps/user/src/constants/reg.ts deleted file mode 100644 index c568296..0000000 --- a/apps/user/src/constants/reg.ts +++ /dev/null @@ -1,25 +0,0 @@ -export const REG_USER_NAME = /^[\u4E00-\u9FA5\w-]{4,16}$/ - -/** Phone reg */ -export const REG_PHONE - = /^1((3\d)|(4[014-9])|(5[0-35-9])|(6[2567])|(7[0-8])|(8\d)|(9[0-35-9]))\d{8}$/ - -/** - * Password reg - * - * 6-18 characters, including letters, numbers, and underscores - */ -export const REG_PWD = /^\w{6,18}$/ - -/** Email reg */ -export const REG_EMAIL = /^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/ - -/** Six digit code reg */ -export const REG_CODE_SIX = /^\d{6}$/ - -/** Four digit code reg */ -export const REG_CODE_FOUR = /^\d{4}$/ - -/** Url reg */ -export const REG_URL - = /(((^https?:(?:\/\/)?)(?:[-;:&=+$,\w]+@)?[A-Za-z0-9.-]+(?::\d+)?|(?:www.|[-;:&=+$,\w]+@)[A-Za-z0-9.-]+)((?:\/[+~%/.\w-]*)?\??[-+=&;%@.\w]*(?:#\w*)?)?)$/ diff --git a/apps/user/src/enum/index.ts b/apps/user/src/enum/index.ts deleted file mode 100644 index 7338a60..0000000 --- a/apps/user/src/enum/index.ts +++ /dev/null @@ -1,7 +0,0 @@ -export enum SetupStoreId { - App = 'app-store', - Theme = 'theme-store', - Auth = 'auth-store', - Route = 'route-store', - Tab = 'tab-store', -} diff --git a/apps/user/src/hooks/business/auth.ts b/apps/user/src/hooks/business/auth.ts deleted file mode 100644 index 798c5d8..0000000 --- a/apps/user/src/hooks/business/auth.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { useAuthStore } from '@/store/modules/auth' - -export function useAuth() { - const authStore = useAuthStore() - - function hasAuth(codes: string | string[]) { - if (!authStore.isLogin) { - return false - } - - if (typeof codes === 'string') { - return authStore.userInfo.buttons.includes(codes) - } - - return codes.some(code => authStore.userInfo.buttons.includes(code)) - } - - return { - hasAuth, - } -} diff --git a/apps/user/src/hooks/business/captcha.ts b/apps/user/src/hooks/business/captcha.ts deleted file mode 100644 index a4b7d3b..0000000 --- a/apps/user/src/hooks/business/captcha.ts +++ /dev/null @@ -1,71 +0,0 @@ -import { useCountDown, useLoading } from '@sa/hooks' -import { computed } from 'vue' -import { REG_PHONE } from '@/constants/reg' -import { $t } from '@/locales' - -export function useCaptcha() { - const { loading, startLoading, endLoading } = useLoading() - const { count, start, stop, isCounting } = useCountDown(10) - - const label = computed(() => { - let text = $t('page.login.codeLogin.getCode') - - const countingLabel = $t('page.login.codeLogin.reGetCode', { time: count.value }) - - if (loading.value) { - text = '' - } - - if (isCounting.value) { - text = countingLabel - } - - return text - }) - - function isPhoneValid(phone: string) { - if (phone.trim() === '') { - window.$message?.error?.($t('form.phone.required')) - - return false - } - - if (!REG_PHONE.test(phone)) { - window.$message?.error?.($t('form.phone.invalid')) - - return false - } - - return true - } - - async function getCaptcha(phone: string) { - const valid = isPhoneValid(phone) - - if (!valid || loading.value) { - return - } - - startLoading() - - // request - await new Promise((resolve) => { - setTimeout(resolve, 500) - }) - - window.$message?.success?.($t('page.login.codeLogin.sendCodeSuccess')) - - start() - - endLoading() - } - - return { - label, - start, - stop, - isCounting, - loading, - getCaptcha, - } -} diff --git a/apps/user/src/hooks/common/echarts.ts b/apps/user/src/hooks/common/echarts.ts deleted file mode 100644 index fadbb11..0000000 --- a/apps/user/src/hooks/common/echarts.ts +++ /dev/null @@ -1,233 +0,0 @@ -import type { - BarSeriesOption, - GaugeSeriesOption, - LineSeriesOption, - PictorialBarSeriesOption, - PieSeriesOption, - RadarSeriesOption, - ScatterSeriesOption, -} from 'echarts/charts' -import type { - DatasetComponentOption, - GridComponentOption, - LegendComponentOption, - TitleComponentOption, - ToolboxComponentOption, - TooltipComponentOption, -} from 'echarts/components' -import { useElementSize } from '@vueuse/core' -import { BarChart, GaugeChart, LineChart, PictorialBarChart, PieChart, RadarChart, ScatterChart } from 'echarts/charts' -import { - DatasetComponent, - GridComponent, - LegendComponent, - TitleComponent, - ToolboxComponent, - TooltipComponent, - TransformComponent, -} from 'echarts/components' -import * as echarts from 'echarts/core' -import { LabelLayout, UniversalTransition } from 'echarts/features' -import { CanvasRenderer } from 'echarts/renderers' -import { computed, effectScope, nextTick, onScopeDispose, shallowRef, watch } from 'vue' -import { useThemeStore } from '@/store/modules/theme' - -export type ECOption = echarts.ComposeOption< - | BarSeriesOption - | LineSeriesOption - | PieSeriesOption - | ScatterSeriesOption - | PictorialBarSeriesOption - | RadarSeriesOption - | GaugeSeriesOption - | TitleComponentOption - | LegendComponentOption - | TooltipComponentOption - | GridComponentOption - | ToolboxComponentOption - | DatasetComponentOption -> - -echarts.use([ - TitleComponent, - LegendComponent, - TooltipComponent, - GridComponent, - DatasetComponent, - TransformComponent, - ToolboxComponent, - BarChart, - LineChart, - PieChart, - ScatterChart, - PictorialBarChart, - RadarChart, - GaugeChart, - LabelLayout, - UniversalTransition, - CanvasRenderer, -]) - -interface ChartHooks { - onRender?: (chart: echarts.ECharts) => void | Promise - onUpdated?: (chart: echarts.ECharts) => void | Promise - onDestroy?: (chart: echarts.ECharts) => void | Promise -} - -/** - * use echarts - * - * @param optionsFactory echarts options factory function - * @param darkMode dark mode - */ -export function useEcharts(optionsFactory: () => T, hooks: ChartHooks = {}) { - const scope = effectScope() - - const themeStore = useThemeStore() - const darkMode = computed(() => themeStore.darkMode) - - const domRef = shallowRef(null) - const initialSize = { width: 0, height: 0 } - const { width, height } = useElementSize(domRef, initialSize) - - const chart = shallowRef(null) - const chartOptions: T = optionsFactory() - - const { - onRender = (instance) => { - const textColor = darkMode.value ? 'rgb(224, 224, 224)' : 'rgb(31, 31, 31)' - const maskColor = darkMode.value ? 'rgba(0, 0, 0, 0.4)' : 'rgba(255, 255, 255, 0.8)' - - instance.showLoading({ - color: themeStore.themeColor, - textColor, - fontSize: 14, - maskColor, - }) - }, - onUpdated = (instance) => { - instance.hideLoading() - }, - onDestroy, - } = hooks - - /** is chart rendered */ - function isRendered() { - return Boolean(domRef.value && chart.value) - } - - /** - * update chart options - * - * @param callback callback function - */ - async function updateOptions(callback: (opts: T, optsFactory: () => T) => ECOption = () => chartOptions) { - const updatedOpts = callback(chartOptions, optionsFactory) - - Object.assign(chartOptions, updatedOpts) - - await nextTick() - - if (!isRendered()) - return - - if (isRendered()) { - chart.value?.clear() - } - - chart.value?.setOption({ ...updatedOpts, backgroundColor: 'transparent' }) - - await onUpdated?.(chart.value!) - } - - function setOptions(options: T) { - chart.value?.setOption(options) - } - - /** render chart */ - async function render() { - if (isRendered()) - return - - const chartTheme = darkMode.value ? 'dark' : 'light' - - chart.value = echarts.init(domRef.value, chartTheme) - - chart.value?.setOption({ ...chartOptions, backgroundColor: 'transparent' }) - - await onRender?.(chart.value!) - } - - /** resize chart */ - function resize() { - chart.value?.resize() - } - - /** destroy chart */ - async function destroy() { - if (!chart.value) - return - - await onDestroy?.(chart.value) - chart.value?.dispose() - chart.value = null - } - - /** change chart theme */ - async function changeTheme() { - await destroy() - await render() - await onUpdated?.(chart.value!) - } - - /** - * render chart by size - * - * @param w width - * @param h height - */ - async function renderChartBySize(w: number, h: number) { - initialSize.width = w - initialSize.height = h - - // resize chart - if (isRendered()) { - resize() - - return - } - - // render chart - await render() - - if (chart.value) { - await onUpdated?.(chart.value) - } - } - - scope.run(() => { - watch( - [width, height], - ([newWidth, newHeight]) => { - renderChartBySize(newWidth, newHeight) - }, - { flush: 'post' }, - ) - - watch(darkMode, () => { - changeTheme() - }) - }) - - onScopeDispose(() => { - destroy() - scope.stop() - }) - - return { - domRef, - chart, - updateOptions, - setOptions, - } -} diff --git a/apps/user/src/hooks/common/form.ts b/apps/user/src/hooks/common/form.ts deleted file mode 100644 index 4d668d8..0000000 --- a/apps/user/src/hooks/common/form.ts +++ /dev/null @@ -1,97 +0,0 @@ -import type { FormInst } from 'naive-ui' -import type { ComputedRef, Ref } from 'vue' -import { ref, toValue } from 'vue' -import { REG_CODE_SIX, REG_EMAIL, REG_PHONE, REG_PWD, REG_USER_NAME } from '@/constants/reg' -import { $t } from '@/locales' - -export function useFormRules() { - const patternRules = { - userName: { - pattern: REG_USER_NAME, - message: $t('form.userName.invalid'), - trigger: 'change', - }, - phone: { - pattern: REG_PHONE, - message: $t('form.phone.invalid'), - trigger: 'change', - }, - pwd: { - pattern: REG_PWD, - message: $t('form.pwd.invalid'), - trigger: 'change', - }, - code: { - pattern: REG_CODE_SIX, - message: $t('form.code.invalid'), - trigger: 'change', - }, - email: { - pattern: REG_EMAIL, - message: $t('form.email.invalid'), - trigger: 'change', - }, - } satisfies Record - - const formRules = { - userName: [createRequiredRule($t('form.userName.required')), patternRules.userName], - phone: [createRequiredRule($t('form.phone.required')), patternRules.phone], - pwd: [createRequiredRule($t('form.pwd.required')), patternRules.pwd], - code: [createRequiredRule($t('form.code.required')), patternRules.code], - email: [createRequiredRule($t('form.email.required')), patternRules.email], - } satisfies Record - - /** the default required rule */ - const defaultRequiredRule = createRequiredRule($t('form.required')) - - function createRequiredRule(message: string): App.Global.FormRule { - return { - required: true, - message, - } - } - - /** create a rule for confirming the password */ - function createConfirmPwdRule(pwd: string | Ref | ComputedRef) { - const confirmPwdRule: App.Global.FormRule[] = [ - { required: true, message: $t('form.confirmPwd.required') }, - { - asyncValidator: (rule, value) => { - if (value.trim() !== '' && value !== toValue(pwd)) { - return Promise.reject(rule.message) - } - return Promise.resolve() - }, - message: $t('form.confirmPwd.invalid'), - trigger: 'input', - }, - ] - return confirmPwdRule - } - - return { - patternRules, - formRules, - defaultRequiredRule, - createRequiredRule, - createConfirmPwdRule, - } -} - -export function useNaiveForm() { - const formRef = ref(null) - - async function validate() { - await formRef.value?.validate() - } - - async function restoreValidation() { - formRef.value?.restoreValidation() - } - - return { - formRef, - validate, - restoreValidation, - } -} diff --git a/apps/user/src/hooks/common/icon.ts b/apps/user/src/hooks/common/icon.ts deleted file mode 100644 index 795ae6b..0000000 --- a/apps/user/src/hooks/common/icon.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { useSvgIconRender } from '@sa/hooks' -import SvgIcon from '@/components/custom/svg-icon.vue' - -export function useSvgIcon() { - const { SvgIconVNode } = useSvgIconRender(SvgIcon) - - return { - SvgIconVNode, - } -} diff --git a/apps/user/src/hooks/common/router.ts b/apps/user/src/hooks/common/router.ts deleted file mode 100644 index 0efd913..0000000 --- a/apps/user/src/hooks/common/router.ts +++ /dev/null @@ -1,116 +0,0 @@ -import type { RouteKey } from '@elegant-router/types' -import type { RouteLocationRaw } from 'vue-router' -import { useRouter } from 'vue-router' -import { router as globalRouter } from '@/router' - -/** - * Router push - * - * Jump to the specified route, it can replace function router.push - * - * @param inSetup Whether is in vue script setup - */ -export function useRouterPush(inSetup = true) { - const router = inSetup ? useRouter() : globalRouter - const route = globalRouter.currentRoute - - const routerPush = router.push - - const routerBack = router.back - - async function routerPushByKey(key: RouteKey, options?: App.Global.RouterPushOptions) { - const { query, params } = options || {} - - const routeLocation: RouteLocationRaw = { - name: key, - } - - if (Object.keys(query || {}).length) { - routeLocation.query = query - } - - if (Object.keys(params || {}).length) { - routeLocation.params = params - } - - return routerPush(routeLocation) - } - - function routerPushByKeyWithMetaQuery(key: RouteKey) { - const allRoutes = router.getRoutes() - const meta = allRoutes.find(item => item.name === key)?.meta || null - - const query: Record = {} - - meta?.query?.forEach((item) => { - query[item.key] = item.value - }) - - return routerPushByKey(key, { query }) - } - - async function toHome() { - return routerPushByKey('root') - } - - /** - * Navigate to login page - * - * @param loginModule The login module - * @param redirectUrl The redirect url, if not specified, it will be the current route fullPath - */ - async function toLogin(loginModule?: UnionKey.LoginModule, redirectUrl?: string) { - const module = loginModule || 'pwd-login' - - const options: App.Global.RouterPushOptions = { - params: { - module, - }, - } - - const redirect = redirectUrl || route.value.fullPath - - options.query = { - redirect, - } - - return routerPushByKey('login', options) - } - - /** - * Toggle login module - * - * @param module - */ - async function toggleLoginModule(module: UnionKey.LoginModule) { - const query = route.value.query as Record - - return routerPushByKey('login', { query, params: { module } }) - } - - /** - * Redirect from login - * - * @param [needRedirect] Whether to redirect after login. Default is `true` - */ - async function redirectFromLogin(needRedirect = true) { - const redirect = route.value.query?.redirect as string - - if (needRedirect && redirect) { - await routerPush(redirect) - } - else { - await toHome() - } - } - - return { - routerPush, - routerBack, - routerPushByKey, - routerPushByKeyWithMetaQuery, - toLogin, - toggleLoginModule, - redirectFromLogin, - } -} diff --git a/apps/user/src/hooks/common/table.ts b/apps/user/src/hooks/common/table.ts deleted file mode 100644 index d670e70..0000000 --- a/apps/user/src/hooks/common/table.ts +++ /dev/null @@ -1,315 +0,0 @@ -import type { FlatResponseData } from '@sa/axios' -import type { PaginationData, TableColumnCheck, UseTableOptions } from '@sa/hooks' -import type { PaginationProps } from 'naive-ui' -import type { Ref } from 'vue' -import { useBoolean, useTable } from '@sa/hooks' -import { jsonClone } from '@sa/utils' -import { computed, effectScope, onScopeDispose, reactive, shallowRef, watch } from 'vue' -import { $t } from '@/locales' -import { useAppStore } from '@/store/modules/app' - -export type UseNaiveTableOptions = Omit< - UseTableOptions, Pagination>, - 'pagination' | 'getColumnChecks' | 'getColumns' -> & { - /** - * get column visible - * - * @param column - * - * @default true - * - * @returns true if the column is visible, false otherwise - */ - getColumnVisible?: (column: NaiveUI.TableColumn) => boolean -} - -const SELECTION_KEY = '__selection__' - -const EXPAND_KEY = '__expand__' - -export function useNaiveTable(options: UseNaiveTableOptions) { - const scope = effectScope() - const appStore = useAppStore() - - const result = useTable, false>({ - ...options, - getColumnChecks: cols => getColumnChecks(cols, options.getColumnVisible), - getColumns, - }) - - // calculate the total width of the table this is used for horizontal scrolling - const scrollX = computed(() => { - return result.columns.value.reduce((acc, column) => { - return acc + Number(column.width ?? column.minWidth ?? 120) - }, 0) - }) - - scope.run(() => { - watch( - () => appStore.locale, - () => { - result.reloadColumns() - }, - ) - }) - - onScopeDispose(() => { - scope.stop() - }) - - return { - ...result, - scrollX, - } -} - -type PaginationParams = Pick - -type UseNaivePaginatedTableOptions = UseNaiveTableOptions & { - paginationProps?: Omit - /** - * whether to show the total count of the table - * - * @default true - */ - showTotal?: boolean - onPaginationParamsChange?: (params: PaginationParams) => void | Promise -} - -export function useNaivePaginatedTable( - options: UseNaivePaginatedTableOptions, -) { - const scope = effectScope() - const appStore = useAppStore() - - const isMobile = computed(() => appStore.isMobile) - - const showTotal = computed(() => options.showTotal ?? true) - - const pagination = reactive({ - page: 1, - pageSize: 10, - itemCount: 0, - showSizePicker: true, - pageSizes: [10, 15, 20, 25, 30], - prefix: showTotal.value ? page => $t('datatable.itemCount', { total: page.itemCount }) : undefined, - onUpdatePage(page) { - pagination.page = page - }, - onUpdatePageSize(pageSize) { - pagination.pageSize = pageSize - pagination.page = 1 - }, - ...options.paginationProps, - }) as PaginationProps - - // this is for mobile, if the system does not support mobile, you can use `pagination` directly - const mobilePagination = computed(() => { - const p: PaginationProps = { - ...pagination, - pageSlot: isMobile.value ? 3 : 9, - prefix: !isMobile.value && showTotal.value ? pagination.prefix : undefined, - } - - return p - }) - - const paginationParams = computed(() => { - const { page, pageSize } = pagination - - return { - page, - pageSize, - } - }) - - const result = useTable, true>({ - ...options, - pagination: true, - getColumnChecks: cols => getColumnChecks(cols, options.getColumnVisible), - getColumns, - onFetched: (data) => { - pagination.itemCount = data.total - pagination.pageSize = data.pageSize - }, - }) - - async function getDataByPage(page: number = 1) { - if (page !== pagination.page) { - pagination.page = page - - return - } - - await result.getData() - } - - scope.run(() => { - watch( - () => appStore.locale, - () => { - result.reloadColumns() - }, - ) - - watch(paginationParams, async (newVal) => { - await options.onPaginationParamsChange?.(newVal) - - await result.getData() - }) - }) - - onScopeDispose(() => { - scope.stop() - }) - - return { - ...result, - getDataByPage, - pagination, - mobilePagination, - } -} - -export function useTableOperate( - data: Ref, - idKey: keyof TableData, - getData: () => Promise, -) { - const { bool: drawerVisible, setTrue: openDrawer, setFalse: closeDrawer } = useBoolean() - - const operateType = shallowRef('add') - - function handleAdd() { - operateType.value = 'add' - openDrawer() - } - - /** the editing row data */ - const editingData = shallowRef(null) - - function handleEdit(id: TableData[keyof TableData]) { - operateType.value = 'edit' - const findItem = data.value.find(item => item[idKey] === id) || null - editingData.value = jsonClone(findItem) - - openDrawer() - } - - /** the checked row keys of table */ - const checkedRowKeys = shallowRef([]) - - /** the hook after the batch delete operation is completed */ - async function onBatchDeleted() { - window.$message?.success($t('common.deleteSuccess')) - - checkedRowKeys.value = [] - - await getData() - } - - /** the hook after the delete operation is completed */ - async function onDeleted() { - window.$message?.success($t('common.deleteSuccess')) - - await getData() - } - - return { - drawerVisible, - openDrawer, - closeDrawer, - operateType, - handleAdd, - editingData, - handleEdit, - checkedRowKeys, - onBatchDeleted, - onDeleted, - } -} - -export function defaultTransform( - response: FlatResponseData>, -): PaginationData { - const { data, error } = response - - if (!error) { - const { records, current, size, total } = data - - return { - data: records, - pageNum: current, - pageSize: size, - total, - } - } - - return { - data: [], - pageNum: 1, - pageSize: 10, - total: 0, - } -} - -function getColumnChecks>( - cols: Column[], - getColumnVisible?: (column: Column) => boolean, -) { - const checks: TableColumnCheck[] = [] - - cols.forEach((column) => { - if (isTableColumnHasKey(column)) { - checks.push({ - key: column.key as string, - title: column.title!, - checked: true, - visible: getColumnVisible?.(column) ?? true, - }) - } - else if (column.type === 'selection') { - checks.push({ - key: SELECTION_KEY, - title: $t('common.check'), - checked: true, - visible: getColumnVisible?.(column) ?? false, - }) - } - else if (column.type === 'expand') { - checks.push({ - key: EXPAND_KEY, - title: $t('common.expandColumn'), - checked: true, - visible: getColumnVisible?.(column) ?? false, - }) - } - }) - - return checks -} - -function getColumns>(cols: Column[], checks: TableColumnCheck[]) { - const columnMap = new Map() - - cols.forEach((column) => { - if (isTableColumnHasKey(column)) { - columnMap.set(column.key as string, column) - } - else if (column.type === 'selection') { - columnMap.set(SELECTION_KEY, column) - } - else if (column.type === 'expand') { - columnMap.set(EXPAND_KEY, column) - } - }) - - const filteredColumns = checks.filter(item => item.checked).map(check => columnMap.get(check.key) as Column) - - return filteredColumns -} - -export function isTableColumnHasKey(column: NaiveUI.TableColumn): column is NaiveUI.TableColumnWithKey { - return Boolean((column as NaiveUI.TableColumnWithKey).key) -} diff --git a/apps/user/src/layouts/base-layout/index.vue b/apps/user/src/layouts/base-layout/index.vue deleted file mode 100644 index c212c6f..0000000 --- a/apps/user/src/layouts/base-layout/index.vue +++ /dev/null @@ -1,162 +0,0 @@ - - - - - diff --git a/apps/user/src/layouts/blank-layout/index.vue b/apps/user/src/layouts/blank-layout/index.vue deleted file mode 100644 index 1ced20e..0000000 --- a/apps/user/src/layouts/blank-layout/index.vue +++ /dev/null @@ -1,13 +0,0 @@ - - - - - diff --git a/apps/user/src/layouts/modules/global-breadcrumb/index.vue b/apps/user/src/layouts/modules/global-breadcrumb/index.vue deleted file mode 100644 index 8349ecb..0000000 --- a/apps/user/src/layouts/modules/global-breadcrumb/index.vue +++ /dev/null @@ -1,47 +0,0 @@ - - - - - diff --git a/apps/user/src/layouts/modules/global-content/index.vue b/apps/user/src/layouts/modules/global-content/index.vue deleted file mode 100644 index dcd33ed..0000000 --- a/apps/user/src/layouts/modules/global-content/index.vue +++ /dev/null @@ -1,58 +0,0 @@ - - - - - diff --git a/apps/user/src/layouts/modules/global-footer/index.vue b/apps/user/src/layouts/modules/global-footer/index.vue deleted file mode 100644 index 5a9682f..0000000 --- a/apps/user/src/layouts/modules/global-footer/index.vue +++ /dev/null @@ -1,15 +0,0 @@ - - - - - diff --git a/apps/user/src/layouts/modules/global-header/components/theme-button.vue b/apps/user/src/layouts/modules/global-header/components/theme-button.vue deleted file mode 100644 index 308e2db..0000000 --- a/apps/user/src/layouts/modules/global-header/components/theme-button.vue +++ /dev/null @@ -1,20 +0,0 @@ - - - - - diff --git a/apps/user/src/layouts/modules/global-header/components/user-avatar.vue b/apps/user/src/layouts/modules/global-header/components/user-avatar.vue deleted file mode 100644 index 6711b76..0000000 --- a/apps/user/src/layouts/modules/global-header/components/user-avatar.vue +++ /dev/null @@ -1,83 +0,0 @@ - - - - - diff --git a/apps/user/src/layouts/modules/global-header/index.vue b/apps/user/src/layouts/modules/global-header/index.vue deleted file mode 100644 index 1ac88f0..0000000 --- a/apps/user/src/layouts/modules/global-header/index.vue +++ /dev/null @@ -1,60 +0,0 @@ - - - - - diff --git a/apps/user/src/layouts/modules/global-logo/index.vue b/apps/user/src/layouts/modules/global-logo/index.vue deleted file mode 100644 index be617d4..0000000 --- a/apps/user/src/layouts/modules/global-logo/index.vue +++ /dev/null @@ -1,27 +0,0 @@ - - - - - diff --git a/apps/user/src/layouts/modules/global-menu/components/first-level-menu.vue b/apps/user/src/layouts/modules/global-menu/components/first-level-menu.vue deleted file mode 100644 index 2bad193..0000000 --- a/apps/user/src/layouts/modules/global-menu/components/first-level-menu.vue +++ /dev/null @@ -1,109 +0,0 @@ - - - - - diff --git a/apps/user/src/layouts/modules/global-menu/context/index.ts b/apps/user/src/layouts/modules/global-menu/context/index.ts deleted file mode 100644 index c223dd2..0000000 --- a/apps/user/src/layouts/modules/global-menu/context/index.ts +++ /dev/null @@ -1,185 +0,0 @@ -import type { RouteKey } from '@elegant-router/types' -import { useContext } from '@sa/hooks' -import { computed, ref, watch } from 'vue' -import { useRoute } from 'vue-router' -import { useRouterPush } from '@/hooks/common/router' -import { useRouteStore } from '@/store/modules/route' -import { useThemeStore } from '@/store/modules/theme' - -export const [provideMixMenuContext, useMixMenuContext] = useContext('MixMenu', useMixMenu) - -function useMixMenu() { - const route = useRoute() - const routeStore = useRouteStore() - const themeStore = useThemeStore() - const { selectedKey } = useMenu() - const { routerPushByKeyWithMetaQuery } = useRouterPush() - - const allMenus = computed(() => routeStore.menus) - - const firstLevelMenus = computed(() => - routeStore.menus.map((menu) => { - const { children: _, ...rest } = menu - - return rest - }), - ) - - const activeFirstLevelMenuKey = ref('') - - function setActiveFirstLevelMenuKey(key: string) { - activeFirstLevelMenuKey.value = key - } - - function getActiveFirstLevelMenuKey() { - const [firstLevelRouteName] = selectedKey.value.split('_') - - setActiveFirstLevelMenuKey(firstLevelRouteName) - } - - const isActiveFirstLevelMenuHasChildren = computed(() => { - if (!activeFirstLevelMenuKey.value) { - return false - } - - const findItem = allMenus.value.find(item => item.key === activeFirstLevelMenuKey.value) - - return Boolean(findItem?.children?.length) - }) - - function handleSelectFirstLevelMenu(key: RouteKey) { - setActiveFirstLevelMenuKey(key) - - if (!isActiveFirstLevelMenuHasChildren.value) { - routerPushByKeyWithMetaQuery(key) - } - } - - const secondLevelMenus = computed( - () => allMenus.value.find(menu => menu.key === activeFirstLevelMenuKey.value)?.children || [], - ) - - const activeSecondLevelMenuKey = ref('') - - function setActiveSecondLevelMenuKey(key: string) { - activeSecondLevelMenuKey.value = key - } - - function getActiveSecondLevelMenuKey() { - const keys = selectedKey.value.split('_') - - if (keys.length < 2) { - setActiveSecondLevelMenuKey('') - return - } - - const [firstLevelRouteName, level2SuffixName] = keys - - const secondLevelRouteName = `${firstLevelRouteName}_${level2SuffixName}` - - setActiveSecondLevelMenuKey(secondLevelRouteName) - } - - const isActiveSecondLevelMenuHasChildren = computed(() => { - if (!activeSecondLevelMenuKey.value) { - return false - } - - const findItem = secondLevelMenus.value.find(item => item.key === activeSecondLevelMenuKey.value) - - return Boolean(findItem?.children?.length) - }) - - function handleSelectSecondLevelMenu(key: RouteKey) { - setActiveSecondLevelMenuKey(key) - - if (!isActiveSecondLevelMenuHasChildren.value) { - routerPushByKeyWithMetaQuery(key) - } - } - - const childLevelMenus = computed( - () => secondLevelMenus.value.find(menu => menu.key === activeSecondLevelMenuKey.value)?.children || [], - ) - - const hasChildLevelMenus = computed(() => childLevelMenus.value.length > 0) - - function getDeepestLevelMenuKey(): RouteKey | null { - if (!secondLevelMenus.value.length || !themeStore.sider.autoSelectFirstMenu) { - return null - } - - const secondLevelFirstMenu = secondLevelMenus.value[0] - - if (!secondLevelFirstMenu) { - return null - } - - function findDeepest(menu: App.Global.Menu): RouteKey { - if (!menu.children?.length) { - return menu.routeKey - } - - return findDeepest(menu.children[0]) - } - - return findDeepest(secondLevelFirstMenu) - } - - function activeDeepestLevelMenuKey() { - const deepestLevelMenuKey = getDeepestLevelMenuKey() - if (!deepestLevelMenuKey) - return - - // select the deepest second level menu - handleSelectSecondLevelMenu(deepestLevelMenuKey) - } - - watch( - () => route.name, - () => { - getActiveFirstLevelMenuKey() - // if there are child level menus, get the active second level menu key - if (hasChildLevelMenus.value) { - getActiveSecondLevelMenuKey() - } - }, - { immediate: true }, - ) - - return { - firstLevelMenus, - activeFirstLevelMenuKey, - setActiveFirstLevelMenuKey, - isActiveFirstLevelMenuHasChildren, - handleSelectFirstLevelMenu, - getActiveFirstLevelMenuKey, - secondLevelMenus, - activeSecondLevelMenuKey, - setActiveSecondLevelMenuKey, - isActiveSecondLevelMenuHasChildren, - handleSelectSecondLevelMenu, - getActiveSecondLevelMenuKey, - childLevelMenus, - hasChildLevelMenus, - getDeepestLevelMenuKey, - activeDeepestLevelMenuKey, - } -} - -export function useMenu() { - const route = useRoute() - - const selectedKey = computed(() => { - const { hideInMenu, activeMenu } = route.meta - const name = route.name as string - - const routeName = (hideInMenu ? activeMenu : name) || name - - return routeName - }) - - return { - selectedKey, - } -} diff --git a/apps/user/src/layouts/modules/global-menu/index.vue b/apps/user/src/layouts/modules/global-menu/index.vue deleted file mode 100644 index d6507d2..0000000 --- a/apps/user/src/layouts/modules/global-menu/index.vue +++ /dev/null @@ -1,40 +0,0 @@ - - - - - diff --git a/apps/user/src/layouts/modules/global-menu/modules/horizontal-menu.vue b/apps/user/src/layouts/modules/global-menu/modules/horizontal-menu.vue deleted file mode 100644 index 1587b83..0000000 --- a/apps/user/src/layouts/modules/global-menu/modules/horizontal-menu.vue +++ /dev/null @@ -1,29 +0,0 @@ - - - - - diff --git a/apps/user/src/layouts/modules/global-menu/modules/top-hybrid-header-first.vue b/apps/user/src/layouts/modules/global-menu/modules/top-hybrid-header-first.vue deleted file mode 100644 index 5097662..0000000 --- a/apps/user/src/layouts/modules/global-menu/modules/top-hybrid-header-first.vue +++ /dev/null @@ -1,89 +0,0 @@ - - - - - diff --git a/apps/user/src/layouts/modules/global-menu/modules/top-hybrid-sidebar-first.vue b/apps/user/src/layouts/modules/global-menu/modules/top-hybrid-sidebar-first.vue deleted file mode 100644 index ac7c0f7..0000000 --- a/apps/user/src/layouts/modules/global-menu/modules/top-hybrid-sidebar-first.vue +++ /dev/null @@ -1,64 +0,0 @@ - - - - - diff --git a/apps/user/src/layouts/modules/global-menu/modules/vertical-hybrid-header-first.vue b/apps/user/src/layouts/modules/global-menu/modules/vertical-hybrid-header-first.vue deleted file mode 100644 index 660251c..0000000 --- a/apps/user/src/layouts/modules/global-menu/modules/vertical-hybrid-header-first.vue +++ /dev/null @@ -1,175 +0,0 @@ - - - - - diff --git a/apps/user/src/layouts/modules/global-menu/modules/vertical-menu.vue b/apps/user/src/layouts/modules/global-menu/modules/vertical-menu.vue deleted file mode 100644 index 735d413..0000000 --- a/apps/user/src/layouts/modules/global-menu/modules/vertical-menu.vue +++ /dev/null @@ -1,63 +0,0 @@ - - - - - diff --git a/apps/user/src/layouts/modules/global-menu/modules/vertical-mix-menu.vue b/apps/user/src/layouts/modules/global-menu/modules/vertical-mix-menu.vue deleted file mode 100644 index 301c543..0000000 --- a/apps/user/src/layouts/modules/global-menu/modules/vertical-mix-menu.vue +++ /dev/null @@ -1,129 +0,0 @@ - - - - - diff --git a/apps/user/src/layouts/modules/global-search/components/search-footer.vue b/apps/user/src/layouts/modules/global-search/components/search-footer.vue deleted file mode 100644 index ac71f59..0000000 --- a/apps/user/src/layouts/modules/global-search/components/search-footer.vue +++ /dev/null @@ -1,36 +0,0 @@ - - - - - diff --git a/apps/user/src/layouts/modules/global-search/components/search-modal.vue b/apps/user/src/layouts/modules/global-search/components/search-modal.vue deleted file mode 100644 index 395efde..0000000 --- a/apps/user/src/layouts/modules/global-search/components/search-modal.vue +++ /dev/null @@ -1,130 +0,0 @@ - - - - - diff --git a/apps/user/src/layouts/modules/global-search/components/search-result.vue b/apps/user/src/layouts/modules/global-search/components/search-result.vue deleted file mode 100644 index e51ebf8..0000000 --- a/apps/user/src/layouts/modules/global-search/components/search-result.vue +++ /dev/null @@ -1,56 +0,0 @@ - - - - - diff --git a/apps/user/src/layouts/modules/global-search/index.vue b/apps/user/src/layouts/modules/global-search/index.vue deleted file mode 100644 index a60512b..0000000 --- a/apps/user/src/layouts/modules/global-search/index.vue +++ /dev/null @@ -1,18 +0,0 @@ - - - - - diff --git a/apps/user/src/layouts/modules/global-sider/index.vue b/apps/user/src/layouts/modules/global-sider/index.vue deleted file mode 100644 index ba2366a..0000000 --- a/apps/user/src/layouts/modules/global-sider/index.vue +++ /dev/null @@ -1,36 +0,0 @@ - - - - - diff --git a/apps/user/src/layouts/modules/global-tab/context-menu.vue b/apps/user/src/layouts/modules/global-tab/context-menu.vue deleted file mode 100644 index cb746b6..0000000 --- a/apps/user/src/layouts/modules/global-tab/context-menu.vue +++ /dev/null @@ -1,147 +0,0 @@ - - - - - diff --git a/apps/user/src/layouts/modules/global-tab/index.vue b/apps/user/src/layouts/modules/global-tab/index.vue deleted file mode 100644 index ab2a332..0000000 --- a/apps/user/src/layouts/modules/global-tab/index.vue +++ /dev/null @@ -1,237 +0,0 @@ - - - - - diff --git a/apps/user/src/layouts/modules/theme-drawer/components/layout-mode-card.vue b/apps/user/src/layouts/modules/theme-drawer/components/layout-mode-card.vue deleted file mode 100644 index 7fe6ce0..0000000 --- a/apps/user/src/layouts/modules/theme-drawer/components/layout-mode-card.vue +++ /dev/null @@ -1,104 +0,0 @@ - - - - - diff --git a/apps/user/src/layouts/modules/theme-drawer/components/setting-item.vue b/apps/user/src/layouts/modules/theme-drawer/components/setting-item.vue deleted file mode 100644 index a4ad081..0000000 --- a/apps/user/src/layouts/modules/theme-drawer/components/setting-item.vue +++ /dev/null @@ -1,24 +0,0 @@ - - - - - diff --git a/apps/user/src/layouts/modules/theme-drawer/index.vue b/apps/user/src/layouts/modules/theme-drawer/index.vue deleted file mode 100644 index 9f4aa9d..0000000 --- a/apps/user/src/layouts/modules/theme-drawer/index.vue +++ /dev/null @@ -1,66 +0,0 @@ - - - - - diff --git a/apps/user/src/layouts/modules/theme-drawer/modules/appearance/index.vue b/apps/user/src/layouts/modules/theme-drawer/modules/appearance/index.vue deleted file mode 100644 index d711136..0000000 --- a/apps/user/src/layouts/modules/theme-drawer/modules/appearance/index.vue +++ /dev/null @@ -1,19 +0,0 @@ - - - - - diff --git a/apps/user/src/layouts/modules/theme-drawer/modules/appearance/modules/theme-color.vue b/apps/user/src/layouts/modules/theme-drawer/modules/appearance/modules/theme-color.vue deleted file mode 100644 index 2d66c5f..0000000 --- a/apps/user/src/layouts/modules/theme-drawer/modules/appearance/modules/theme-color.vue +++ /dev/null @@ -1,83 +0,0 @@ - - - - - diff --git a/apps/user/src/layouts/modules/theme-drawer/modules/appearance/modules/theme-radius.vue b/apps/user/src/layouts/modules/theme-drawer/modules/appearance/modules/theme-radius.vue deleted file mode 100644 index e6dda71..0000000 --- a/apps/user/src/layouts/modules/theme-drawer/modules/appearance/modules/theme-radius.vue +++ /dev/null @@ -1,22 +0,0 @@ - - - - - diff --git a/apps/user/src/layouts/modules/theme-drawer/modules/appearance/modules/theme-schema.vue b/apps/user/src/layouts/modules/theme-drawer/modules/appearance/modules/theme-schema.vue deleted file mode 100644 index 6ccf007..0000000 --- a/apps/user/src/layouts/modules/theme-drawer/modules/appearance/modules/theme-schema.vue +++ /dev/null @@ -1,76 +0,0 @@ - - - - - diff --git a/apps/user/src/layouts/modules/theme-drawer/modules/config-operation.vue b/apps/user/src/layouts/modules/theme-drawer/modules/config-operation.vue deleted file mode 100644 index 0764e97..0000000 --- a/apps/user/src/layouts/modules/theme-drawer/modules/config-operation.vue +++ /dev/null @@ -1,63 +0,0 @@ - - -