提交 d352d4aa 作者: 方治民

Merge branch '3.x' of https://gitlab.yiring.com/basic/basic-vue-admin into tauri

...@@ -14,11 +14,12 @@ VITE_DROP_CONSOLE = false ...@@ -14,11 +14,12 @@ VITE_DROP_CONSOLE = false
# Basic interface address SPA # Basic interface address SPA
VITE_GLOB_API_URL=/basic-api VITE_GLOB_API_URL=/basic-api
# VITE_GLOB_API_URL=http://192.168.0.156:8081 # VITE_GLOB_API_URL=http://127.0.0.1:8081
# Interface prefix # Interface prefix
VITE_GLOB_API_URL_PREFIX= VITE_GLOB_API_URL_PREFIX=
# VITE_GLOB_API_URL_PREFIX=/api # VITE_GLOB_API_URL_PREFIX=/api
# File upload address, optional # File upload address, optional
VITE_GLOB_UPLOAD_URL=/upload # VITE_GLOB_UPLOAD_URL=/upload
VITE_GLOB_UPLOAD_URL=/common/file/upload
...@@ -15,7 +15,12 @@ module.exports = { ...@@ -15,7 +15,12 @@ module.exports = {
jsx: true, jsx: true,
}, },
}, },
extends: ['plugin:vue/vue3-recommended', 'plugin:@typescript-eslint/recommended', 'plugin:prettier/recommended'], extends: [
'@antfu',
'plugin:vue/vue3-recommended',
'plugin:@typescript-eslint/recommended',
'plugin:prettier/recommended',
],
rules: { rules: {
'vue/script-setup-uses-vars': 'error', 'vue/script-setup-uses-vars': 'error',
'@typescript-eslint/ban-ts-ignore': 'off', '@typescript-eslint/ban-ts-ignore': 'off',
...@@ -69,5 +74,9 @@ module.exports = { ...@@ -69,5 +74,9 @@ module.exports = {
], ],
'vue/multi-word-component-names': 'off', 'vue/multi-word-component-names': 'off',
'vue/no-reserved-component-names': 'off', 'vue/no-reserved-component-names': 'off',
'vue/no-constant-condition': 'off',
'no-console': 'off',
'antfu/if-newline': 'off',
'symbol-description': 'off',
}, },
} }
{ {
"recommendations": [ "recommendations": [
"vue.volar", "vue.volar",
"dbaeumer.vscode-eslint", "dbaeumer.vscode-eslint",
"stylelint.vscode-stylelint", "stylelint.vscode-stylelint",
"DavidAnson.vscode-markdownlint",
"esbenp.prettier-vscode", "esbenp.prettier-vscode",
"mrmlnc.vscode-less", "EditorConfig.EditorConfig",
"lokalise.i18n-ally",
"antfu.unocss",
"antfu.iconify", "antfu.iconify",
"lokalise.i18n-ally",
"mrmlnc.vscode-less",
"heybourn.headwind",
"aaron-bond.better-comments",
"shardulm94.trailing-spaces",
"formulahendry.auto-close-tag",
"formulahendry.auto-rename-tag",
"vincaslt.highlight-matching-tag",
"ChakrounAnas.turbo-console-log",
"mikestead.dotenv", "mikestead.dotenv",
"heybourn.headwind" "redhat.vscode-yaml",
"eamodio.gitlens",
"christian-kohler.path-intellisense",
"IBM.output-colorizer",
"PKief.material-icon-theme"
] ]
} }
{ {
"typescript.tsdk": "./node_modules/typescript/lib", "typescript.tsdk": "./node_modules/typescript/lib",
"volar.tsPlugin": true,
"volar.tsPluginStatus": false,
"npm.packageManager": "pnpm", "npm.packageManager": "pnpm",
"editor.tabSize": 2, "editor.tabSize": 4,
"editor.defaultFormatter": "esbenp.prettier-vscode",
"files.eol": "\n", "files.eol": "\n",
"editor.defaultFormatter": "esbenp.prettier-vscode",
"i18n-ally.localesPaths": ["src/locales/lang"],
"i18n-ally.keystyle": "nested",
"i18n-ally.readonly": true,
"i18n-ally.sortKeys": true,
"i18n-ally.namespace": true,
"i18n-ally.pathMatcher": "{locale}/{namespaces}.{ext}",
"i18n-ally.enabledParsers": ["ts", "json"],
"i18n-ally.sourceLanguage": "en",
"i18n-ally.displayLanguage": "zh-Hans",
"i18n-ally.enabledFrameworks": ["vue", "react"],
"stylelint.enable": true,
"stylelint.validate": ["css", "less", "postcss", "scss", "vue", "sass"],
"path-intellisense.mappings": {
"/@/": "${workspaceRoot}/src"
},
"[javascriptreact]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"[typescript]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"[typescriptreact]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"[html]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"[css]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"[less]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"[scss]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"[markdown]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"editor.codeActionsOnSave": {
"source.fixAll.eslint": true
},
"[vue]": {
"editor.codeActionsOnSave": {
"source.fixAll.eslint": true,
"source.fixAll.stylelint": true
}
},
"search.exclude": { "search.exclude": {
"**/node_modules": true, "**/node_modules": true,
"**/*.log": true, "**/*.log": true,
...@@ -29,7 +81,8 @@ ...@@ -29,7 +81,8 @@
"res": true, "res": true,
"screenshots": true, "screenshots": true,
"yarn-error.log": true, "yarn-error.log": true,
"**/.yarn": true "**/.yarn": true,
"**/.pnpm": true
}, },
"files.exclude": { "files.exclude": {
"**/.cache": true, "**/.cache": true,
...@@ -52,95 +105,7 @@ ...@@ -52,95 +105,7 @@
"**/tmp/**": true, "**/tmp/**": true,
"**/bower_components/**": true, "**/bower_components/**": true,
"**/dist/**": true, "**/dist/**": true,
"**/yarn.lock": true "**/yarn.lock": true,
}, "**/pnpm-lock.yaml": true
"stylelint.enable": true, }
"stylelint.validate": ["css", "less", "postcss", "scss", "vue", "sass"],
"path-intellisense.mappings": {
"/@/": "${workspaceRoot}/src"
},
"[javascriptreact]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"[typescript]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"[typescriptreact]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"[html]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"[css]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"[less]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"[scss]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"[markdown]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"editor.codeActionsOnSave": {
"source.fixAll.eslint": true
},
"[vue]": {
"editor.codeActionsOnSave": {
"source.fixAll.eslint": true,
"source.fixAll.stylelint": true
}
},
"i18n-ally.localesPaths": ["src/locales/lang"],
"i18n-ally.keystyle": "nested",
"i18n-ally.sortKeys": true,
"i18n-ally.namespace": true,
"i18n-ally.pathMatcher": "{locale}/{namespaces}.{ext}",
"i18n-ally.enabledParsers": ["ts"],
"i18n-ally.sourceLanguage": "en",
"i18n-ally.displayLanguage": "zh-CN",
"i18n-ally.enabledFrameworks": ["vue", "react"],
"cSpell.words": [
"vben",
"windi",
"browserslist",
"tailwindcss",
"esnext",
"antv",
"tinymce",
"qrcode",
"sider",
"pinia",
"sider",
"nprogress",
"INTLIFY",
"stylelint",
"esno",
"vitejs",
"sortablejs",
"mockjs",
"codemirror",
"iconify",
"commitlint",
"vditor",
"echarts",
"cropperjs",
"logicflow",
"vueuse",
"zxcvbn",
"lintstagedrc",
"brotli",
"tailwindcss",
"sider",
"pnpm",
"antd"
],
"vetur.format.scriptInitialIndent": true,
"vetur.format.styleInitialIndent": true,
"vetur.validation.script": false,
"[rust]": {
"editor.defaultFormatter": "rust-lang.rust-analyzer"
},
"svg.preview.background": "transparent"
} }
...@@ -30,12 +30,7 @@ export function getThemeColors(color?: string) { ...@@ -30,12 +30,7 @@ export function getThemeColors(color?: string) {
return [...lightColors, ...modeColors] return [...lightColors, ...modeColors]
} }
export function generateColors({ export function generateColors({ color = primaryColor, mixLighten, mixDarken, tinycolor }: GenerateColorsParams) {
color = primaryColor,
mixLighten,
mixDarken,
tinycolor,
}: GenerateColorsParams) {
const arr = new Array(19).fill(0) const arr = new Array(19).fill(0)
const lightens = arr.map((_t, i) => { const lightens = arr.map((_t, i) => {
return mixLighten(color, i / 5) return mixLighten(color, i / 5)
......
...@@ -2,5 +2,3 @@ ...@@ -2,5 +2,3 @@
* The name of the configuration file entered in the production environment * The name of the configuration file entered in the production environment
*/ */
export const GLOB_CONFIG_FILE_NAME = '_app.config.js' export const GLOB_CONFIG_FILE_NAME = '_app.config.js'
export const OUTPUT_DIR = 'dist'
import { resolve } from 'node:path'
import { getThemeVariables } from 'ant-design-vue/dist/theme.js'
import { generateAntColors, primaryColor } from '../config/themeConfig' import { generateAntColors, primaryColor } from '../config/themeConfig'
import { getThemeVariables } from 'ant-design-vue/dist/theme'
import { resolve } from 'path'
/** /**
* less global variable * less global variable
...@@ -28,7 +28,7 @@ export function generateModifyVars(dark = false) { ...@@ -28,7 +28,7 @@ export function generateModifyVars(dark = false) {
'success-color': '#55D187', // Success color 'success-color': '#55D187', // Success color
'error-color': '#ED6F6F', // False color 'error-color': '#ED6F6F', // False color
'warning-color': '#EFBD47', // Warning color 'warning-color': '#EFBD47', // Warning color
//'border-color-base': '#EEEEEE', // 'border-color-base': '#EEEEEE',
'font-size-base': '14px', // Main font size 'font-size-base': '14px', // Main font size
'border-radius-base': '2px', // Component/float fillet 'border-radius-base': '2px', // Component/float fillet
'link-color': primary, // Link color 'link-color': primary, // Link color
......
import path from 'path' import path from 'node:path'
import fs from 'fs-extra' import fs from 'fs-extra'
import inquirer from 'inquirer' import inquirer from 'inquirer'
import colors from 'picocolors' import colors from 'picocolors'
...@@ -30,7 +30,7 @@ async function generateIcon() { ...@@ -30,7 +30,7 @@ async function generateIcon() {
{ {
type: 'list', type: 'list',
name: 'iconSet', name: 'iconSet',
choices: choices, choices,
message: 'Select the icon set that needs to be generated?', message: 'Select the icon set that needs to be generated?',
}, },
{ {
...@@ -51,25 +51,17 @@ async function generateIcon() { ...@@ -51,25 +51,17 @@ async function generateIcon() {
if (data) { if (data) {
const { prefix } = data const { prefix } = data
const isLocal = useType === 'local' const isLocal = useType === 'local'
const icons = Object.keys(data.icons).map( const icons = Object.keys(data.icons).map((item) => `${isLocal ? `${prefix}:` : ''}${item}`)
(item) => `${isLocal ? prefix + ':' : ''}${item}`,
)
await fs.writeFileSync( await fs.writeFileSync(
path.join(output, `icons.data.ts`), path.join(output, `icons.data.ts`),
`export default ${ `export default ${isLocal ? JSON.stringify(icons) : JSON.stringify({ prefix, icons })}`,
isLocal ? JSON.stringify(icons) : JSON.stringify({ prefix, icons })
}`,
) )
prefixSet.push(prefix) prefixSet.push(prefix)
} }
} }
fs.emptyDir(path.join(process.cwd(), 'node_modules/.vite')) fs.emptyDir(path.join(process.cwd(), 'node_modules/.vite'))
console.log( console.log(`✨ ${colors.cyan(`[${pkg.name}]`)}` + ' - Icon generated successfully:' + `[${prefixSet}]`)
`✨ ${colors.cyan(`[${pkg.name}]`)}` +
' - Icon generated successfully:' +
`[${prefixSet}]`,
)
}) })
} }
......
/**
* Generate additional configuration files when used for packaging. The file can be configured with some global variables, so that it can be changed directly externally without repackaging
*/
import { GLOB_CONFIG_FILE_NAME, OUTPUT_DIR } from '../constant'
import fs, { writeFileSync } from 'fs-extra'
import colors from 'picocolors'
import { getEnvConfig, getRootPath } from '../utils'
import { getConfigFileName } from '../getConfigFileName'
import pkg from '../../package.json'
interface CreateConfigParams {
configName: string
config: any
configFileName?: string
}
function createConfig(params: CreateConfigParams) {
const { configName, config, configFileName } = params
try {
const windowConf = `window.${configName}`
// Ensure that the variable will not be modified
let configStr = `${windowConf}=${JSON.stringify(config)};`
configStr += `
Object.freeze(${windowConf});
Object.defineProperty(window, "${configName}", {
configurable: false,
writable: false,
});
`.replace(/\s/g, '')
fs.mkdirp(getRootPath(OUTPUT_DIR))
writeFileSync(getRootPath(`${OUTPUT_DIR}/${configFileName}`), configStr)
console.log(colors.cyan(`✨ [${pkg.name}]`) + ` - configuration file is build successfully:`)
console.log(colors.gray(OUTPUT_DIR + '/' + colors.green(configFileName)) + '\n')
} catch (error) {
console.log(colors.red('configuration file configuration file failed to package:\n' + error))
}
}
export function runBuildConfig() {
const config = getEnvConfig()
const configFileName = getConfigFileName(config)
createConfig({ config, configName: configFileName, configFileName: GLOB_CONFIG_FILE_NAME })
}
// #!/usr/bin/env node
import { runBuildConfig } from './buildConf'
import colors from 'picocolors'
import pkg from '../../package.json'
export const runBuild = async () => {
try {
const argvList = process.argv.splice(2)
// Generate configuration file
if (!argvList.includes('disabled-config')) {
runBuildConfig()
}
console.log(`✨ ${colors.cyan(`[${pkg.name}]`)}` + ' - build successfully!')
} catch (error) {
console.log(colors.red('vite build error:\n' + error))
process.exit(1)
}
}
runBuild()
import fs from 'fs' import fs from 'node:fs'
import path from 'path' import path from 'node:path'
import dotenv from 'dotenv' import dotenv from 'dotenv'
export function isDevFn(mode: string): boolean { export function isDevFn(mode: string): boolean {
...@@ -50,7 +50,7 @@ export function wrapperEnv(envConf: Recordable): ViteEnv { ...@@ -50,7 +50,7 @@ export function wrapperEnv(envConf: Recordable): ViteEnv {
*/ */
function getConfFiles() { function getConfFiles() {
const script = process.env.npm_lifecycle_script const script = process.env.npm_lifecycle_script
const reg = new RegExp('--mode ([a-z_\\d]+)') const reg = /--mode ([a-z_\d]+)/
const result = reg.exec(script as string) as any const result = reg.exec(script as string) as any
if (result) { if (result) {
const mode = result[1] as string const mode = result[1] as string
......
import path from 'node:path'
import fs from 'node:fs'
import colors from 'picocolors'
import type { Plugin, ResolvedConfig } from 'vite'
import { getEnvConfig, getRootPath } from '../../utils'
import { getConfigFileName } from '../../getConfigFileName'
import { GLOB_CONFIG_FILE_NAME } from '../../constant'
import pkg from '../../../package.json'
export function configBuildPlugin(): Plugin {
let outputPath: string
let config: ResolvedConfig
return {
name: 'vite:app:config',
apply: 'build',
enforce: 'post',
configResolved(resolvedConfig: ResolvedConfig) {
config = resolvedConfig
outputPath = path.isAbsolute(config.build.outDir)
? config.build.outDir
: path.join(config.root, config.build.outDir)
},
async closeBundle() {
const config = getEnvConfig()
const configName = getConfigFileName(config)
const windowConf = `window.${configName}`
// Ensure that the variable will not be modified
let configStr = `${windowConf}=${JSON.stringify(config)};`
configStr += `
Object.freeze(${windowConf});
Object.defineProperty(window, "${configName}", {
configurable: false,
writable: false,
});
`.replace(/\s/g, '')
fs.writeFileSync(getRootPath(`${outputPath}/${GLOB_CONFIG_FILE_NAME}`), configStr)
console.log(`${colors.cyan(`✨ [${pkg.name}]`)} configuration file is build successfully:`)
console.log(`${colors.gray(`${outputPath}/${colors.green(GLOB_CONFIG_FILE_NAME)}`)}\n`)
},
} as Plugin
}
import { PluginOption } from 'vite' import type { PluginOption } from 'vite'
import vue from '@vitejs/plugin-vue' import vue from '@vitejs/plugin-vue'
import vueJsx from '@vitejs/plugin-vue-jsx' import vueJsx from '@vitejs/plugin-vue-jsx'
import legacy from '@vitejs/plugin-legacy' import legacy from '@vitejs/plugin-legacy'
...@@ -15,6 +15,7 @@ import { configVisualizerConfig } from './visualizer' ...@@ -15,6 +15,7 @@ import { configVisualizerConfig } from './visualizer'
import { configThemePlugin } from './theme' import { configThemePlugin } from './theme'
import { configSvgIconsPlugin } from './svgSprite' import { configSvgIconsPlugin } from './svgSprite'
import { configAutoImportPlugin } from './autoImport' import { configAutoImportPlugin } from './autoImport'
import { configBuildPlugin } from './config'
export function createVitePlugins(viteEnv: ViteEnv, isBuild: boolean) { export function createVitePlugins(viteEnv: ViteEnv, isBuild: boolean) {
const { VITE_USE_MOCK, VITE_LEGACY, VITE_BUILD_COMPRESS, VITE_BUILD_COMPRESS_DELETE_ORIGIN_FILE } = viteEnv const { VITE_USE_MOCK, VITE_LEGACY, VITE_BUILD_COMPRESS, VITE_BUILD_COMPRESS_DELETE_ORIGIN_FILE } = viteEnv
...@@ -63,13 +64,16 @@ export function createVitePlugins(viteEnv: ViteEnv, isBuild: boolean) { ...@@ -63,13 +64,16 @@ export function createVitePlugins(viteEnv: ViteEnv, isBuild: boolean) {
// The following plugins only work in the production environment // The following plugins only work in the production environment
if (isBuild) { if (isBuild) {
// vite-plugin-imagemin // config
vitePlugins.push(configBuildPlugin())
// rollup-plugin-gzip if (process.env.RUNTIME !== 'electron') {
vitePlugins.push(configCompressPlugin(VITE_BUILD_COMPRESS, VITE_BUILD_COMPRESS_DELETE_ORIGIN_FILE)) // rollup-plugin-gzip
vitePlugins.push(configCompressPlugin(VITE_BUILD_COMPRESS, VITE_BUILD_COMPRESS_DELETE_ORIGIN_FILE))
// vite-plugin-pwa // vite-plugin-pwa
vitePlugins.push(configPwaConfig(viteEnv)) vitePlugins.push(configPwaConfig(viteEnv))
}
} }
return vitePlugins return vitePlugins
......
...@@ -70,7 +70,7 @@ export function configStyleImportPlugin(_isBuild: boolean) { ...@@ -70,7 +70,7 @@ export function configStyleImportPlugin(_isBuild: boolean) {
return ignoreList.includes(name) return ignoreList.includes(name)
? '' ? ''
: replaceList.hasOwnProperty(name) : Object.prototype.hasOwnProperty.call(replaceList, name)
? `ant-design-vue/es/${replaceList[name]}/style/index` ? `ant-design-vue/es/${replaceList[name]}/style/index`
: `ant-design-vue/es/${name}/style/index` : `ant-design-vue/es/${name}/style/index`
}, },
......
...@@ -3,8 +3,8 @@ ...@@ -3,8 +3,8 @@
* https://github.com/anncwb/vite-plugin-svg-icons * https://github.com/anncwb/vite-plugin-svg-icons
*/ */
import path from 'node:path'
import { createSvgIconsPlugin } from 'vite-plugin-svg-icons' import { createSvgIconsPlugin } from 'vite-plugin-svg-icons'
import path from 'path'
export function configSvgIconsPlugin(isBuild: boolean) { export function configSvgIconsPlugin(isBuild: boolean) {
const svgIconsPlugin = createSvgIconsPlugin({ const svgIconsPlugin = createSvgIconsPlugin({
......
...@@ -2,16 +2,10 @@ ...@@ -2,16 +2,10 @@
* Vite plugin for website theme color switching * Vite plugin for website theme color switching
* https://github.com/anncwb/vite-plugin-theme * https://github.com/anncwb/vite-plugin-theme
*/ */
import path from 'node:path'
import type { PluginOption } from 'vite' import type { PluginOption } from 'vite'
import path from 'path' import { antdDarkThemePlugin, mixDarken, mixLighten, tinycolor, viteThemePlugin } from 'vite-plugin-theme'
import { import { generateColors, getThemeColors } from '../../config/themeConfig'
viteThemePlugin,
antdDarkThemePlugin,
mixLighten,
mixDarken,
tinycolor,
} from 'vite-plugin-theme'
import { getThemeColors, generateColors } from '../../config/themeConfig'
import { generateModifyVars } from '../../generate/generateModifyVars' import { generateModifyVars } from '../../generate/generateModifyVars'
export function configThemePlugin(isBuild: boolean): PluginOption[] { export function configThemePlugin(isBuild: boolean): PluginOption[] {
...@@ -48,7 +42,7 @@ export function configThemePlugin(isBuild: boolean): PluginOption[] { ...@@ -48,7 +42,7 @@ export function configThemePlugin(isBuild: boolean): PluginOption[] {
antdDarkThemePlugin({ antdDarkThemePlugin({
preloadFiles: [ preloadFiles: [
path.resolve(process.cwd(), 'node_modules/ant-design-vue/dist/antd.less'), path.resolve(process.cwd(), 'node_modules/ant-design-vue/dist/antd.less'),
//path.resolve(process.cwd(), 'node_modules/ant-design-vue/dist/antd.dark.less'), // path.resolve(process.cwd(), 'node_modules/ant-design-vue/dist/antd.dark.less'),
path.resolve(process.cwd(), 'src/design/index.less'), path.resolve(process.cwd(), 'src/design/index.less'),
], ],
filter: (id) => (isBuild ? !id.endsWith('antd.less') : true), filter: (id) => (isBuild ? !id.endsWith('antd.less') : true),
......
...@@ -22,7 +22,7 @@ export function createProxy(list: ProxyList = []) { ...@@ -22,7 +22,7 @@ export function createProxy(list: ProxyList = []) {
// https://github.com/http-party/node-http-proxy#options // https://github.com/http-party/node-http-proxy#options
ret[prefix] = { ret[prefix] = {
target: target, target,
changeOrigin: true, changeOrigin: true,
ws: true, ws: true,
rewrite: (path) => path.replace(new RegExp(`^${prefix}`), ''), rewrite: (path) => path.replace(new RegExp(`^${prefix}`), ''),
......
...@@ -8,14 +8,14 @@ ...@@ -8,14 +8,14 @@
name="viewport" name="viewport"
content="width=device-width,initial-scale=1.0,minimum-scale=1.0,maximum-scale=1.0,user-scalable=0" content="width=device-width,initial-scale=1.0,minimum-scale=1.0,maximum-scale=1.0,user-scalable=0"
/> />
<title><%= title %></title> <title>%VITE_GLOB_APP_TITLE%</title>
<link rel="icon" href="/favicon.ico" /> <link rel="icon" href="/favicon.ico" />
</head> </head>
<body> <body>
<script> <script>
;(() => { ;(() => {
var htmlRoot = document.getElementById('htmlRoot') let htmlRoot = document.getElementById('htmlRoot')
var theme = window.localStorage.getItem('__APP__DARK__MODE__') let theme = window.localStorage.getItem('__APP__DARK__MODE__')
if (htmlRoot && theme) { if (htmlRoot && theme) {
htmlRoot.setAttribute('data-theme', theme) htmlRoot.setAttribute('data-theme', theme)
theme = htmlRoot = null theme = htmlRoot = null
...@@ -150,7 +150,7 @@ ...@@ -150,7 +150,7 @@
<div class="app-loading-dots"> <div class="app-loading-dots">
<span class="dot dot-spin"><i></i><i></i><i></i><i></i></span> <span class="dot dot-spin"><i></i><i></i><i></i><i></i></span>
</div> </div>
<div class="app-loading-title"><%= title %></div> <div class="app-loading-title">%VITE_GLOB_APP_TITLE%</div>
</div> </div>
</div> </div>
</div> </div>
......
import dayjs from 'dayjs' import dayjs from 'dayjs'
import { MockMethod } from 'vite-plugin-mock' import type { MockMethod } from 'vite-plugin-mock'
/** /**
* 构建 URL 请求地址 * 构建 URL 请求地址
...@@ -68,7 +68,7 @@ export class Response { ...@@ -68,7 +68,7 @@ export class Response {
export class Request { export class Request {
method: string method: string
body: any body: any
headers?: { authorization?: string } headers?: { ['app-token']?: string }
query: any query: any
/** /**
...@@ -77,6 +77,6 @@ export class Request { ...@@ -77,6 +77,6 @@ export class Request {
* @returns token * @returns token
*/ */
static getRequestToken({ headers }: Request): string | undefined { static getRequestToken({ headers }: Request): string | undefined {
return headers?.authorization return headers?.['app-token']
} }
} }
import { MockMethod } from 'vite-plugin-mock' import type { MockMethod } from 'vite-plugin-mock'
import { Response } from '../_util' import { Response } from '../_util'
import * as HTTP from '../../src/api/types' import * as HTTP from '../../src/api/types'
......
import { MockMethod } from 'vite-plugin-mock' import type { MockMethod } from 'vite-plugin-mock'
import { Response } from '../_util' import { Response } from '../_util'
const areaList: any[] = [ const areaList: any[] = [
......
import { MockMethod } from 'vite-plugin-mock' import type { MockMethod } from 'vite-plugin-mock'
import { Response } from '../_util' import { Response } from '../_util'
const demoList = (keyword, count = 20) => { const demoList = (keyword, count = 20) => {
......
import { MockMethod } from 'vite-plugin-mock' import type { MockMethod } from 'vite-plugin-mock'
import { Response } from '../_util' import { Response } from '../_util'
const accountList = (() => { const accountList = (() => {
...@@ -101,12 +101,11 @@ const menuList = (() => { ...@@ -101,12 +101,11 @@ const menuList = (() => {
children.push({ children.push({
id: `${index}-${j}-${k}`, id: `${index}-${j}-${k}`,
type: '2', type: '2',
menuName: '按钮' + (j + 1) + '-' + (k + 1), menuName: `按钮${j + 1}-${k + 1}`,
icon: '', icon: '',
permission: permission: `${
['menu1:view', 'menu2:add', 'menu3:update', 'menu4:del'][index] + ['menu1:view', 'menu2:add', 'menu3:update', 'menu4:del'][index]
':btn' + }:btn${k + 1}`,
(k + 1),
component: [ component: [
'/dashboard/welcome/index', '/dashboard/welcome/index',
'/dashboard/workbench/index', '/dashboard/workbench/index',
...@@ -192,7 +191,7 @@ export default [ ...@@ -192,7 +191,7 @@ export default [
method: 'post', method: 'post',
response: ({ body }) => { response: ({ body }) => {
const { account } = body || {} const { account } = body || {}
if (account && account.indexOf('admin') !== -1) { if (account && account.includes('admin')) {
return Response.no('该字段不能包含admin') return Response.no('该字段不能包含admin')
} else { } else {
return Response.ok(`${account} can use`) return Response.ok(`${account} can use`)
......
import { MockMethod } from 'vite-plugin-mock' import type { MockMethod } from 'vite-plugin-mock'
import { Random } from 'mockjs' import { Random } from 'mockjs'
import { Response } from '../_util' import { Response } from '../_util'
......
import { MockMethod } from 'vite-plugin-mock' import type { MockMethod } from 'vite-plugin-mock'
import { Response } from '../_util' import { Response } from '../_util'
const demoTreeList = (keyword) => { const demoTreeList = (keyword) => {
......
import { MockMethod } from 'vite-plugin-mock' import type { MockMethod } from 'vite-plugin-mock'
import { Request, Response } from '../_util'
import { createFakeUserList } from './user' import { createFakeUserList } from './user'
import { Response, Request } from '../_util'
// single // single
const dashboardRoute = { const dashboardRoute = {
...@@ -241,11 +241,11 @@ export default [ ...@@ -241,11 +241,11 @@ export default [
let menu: Object[] let menu: Object[]
switch (id) { switch (id) {
case '1': case '1':
dashboardRoute.redirect = dashboardRoute.path + '/' + dashboardRoute.children[0].path dashboardRoute.redirect = `${dashboardRoute.path}/${dashboardRoute.children[0].path}`
menu = [dashboardRoute, authRoute, levelRoute, sysRoute, linkRoute] menu = [dashboardRoute, authRoute, levelRoute, sysRoute, linkRoute]
break break
case '2': case '2':
dashboardRoute.redirect = dashboardRoute.path + '/' + dashboardRoute.children[1].path dashboardRoute.redirect = `${dashboardRoute.path}/${dashboardRoute.children[1].path}`
menu = [dashboardRoute, authRoute, levelRoute, linkRoute] menu = [dashboardRoute, authRoute, levelRoute, linkRoute]
break break
default: default:
......
import { IncomingMessage } from 'http' import type { IncomingMessage } from 'node:http'
import Mock from 'mockjs' import Mock from 'mockjs'
import qs from 'qs' import qs from 'qs'
import { MockMethod } from 'vite-plugin-mock' import type { MockMethod } from 'vite-plugin-mock'
import { Response, Request } from '../_util' import { Request, Response } from '../_util'
const parseFormParams = (req: IncomingMessage): Promise<Recordable> => { const parseFormParams = (req: IncomingMessage): Promise<Recordable> => {
return new Promise((resolve) => { return new Promise((resolve) => {
...@@ -12,7 +12,6 @@ const parseFormParams = (req: IncomingMessage): Promise<Recordable> => { ...@@ -12,7 +12,6 @@ const parseFormParams = (req: IncomingMessage): Promise<Recordable> => {
}) })
req.on('end', function () { req.on('end', function () {
resolve(qs.parse(body) as any) resolve(qs.parse(body) as any)
return
}) })
}) })
} }
......
{ {
"name": "basic-vue-admin", "name": "basic-vue-admin",
"version": "3.0.1", "version": "3.0.2",
"description": "Basic Vue Admin (Template)", "description": "Basic Vue Admin (Template)",
"keywords": [ "keywords": [
"vue", "vue",
...@@ -25,9 +25,11 @@ ...@@ -25,9 +25,11 @@
"bootstrap": "pnpm install", "bootstrap": "pnpm install",
"serve": "npm run dev", "serve": "npm run dev",
"dev": "vite", "dev": "vite",
"build": "cross-env NODE_ENV=production vite build && esno ./build/script/postBuild.ts", "dev:app": "tauri dev",
"build:test": "cross-env vite build --mode test && esno ./build/script/postBuild.ts", "build:app": "tauri build",
"build:preview": "cross-env vite build --mode preview && esno ./build/script/postBuild.ts", "build": "vite build",
"build:test": "vite build --mode test",
"build:preview": "vite build --mode preview",
"build:no-cache": "pnpm clean:cache && npm run build", "build:no-cache": "pnpm clean:cache && npm run build",
"report": "cross-env REPORT=true npm run build", "report": "cross-env REPORT=true npm run build",
"type:check": "vue-tsc --noEmit --skipLibCheck", "type:check": "vue-tsc --noEmit --skipLibCheck",
...@@ -54,130 +56,136 @@ ...@@ -54,130 +56,136 @@
} }
}, },
"dependencies": { "dependencies": {
"@ant-design/colors": "^6.0.0", "@ant-design/colors": "^7.0.0",
"@ant-design/icons-vue": "^6.1.0", "@ant-design/icons-vue": "^6.1.0",
"@iconify/iconify": "^2.2.1", "@iconify/iconify": "^3.1.0",
"@logicflow/core": "^1.1.31", "@logicflow/core": "^1.2.1",
"@logicflow/extension": "^1.1.31", "@logicflow/extension": "^1.2.1",
"@stomp/stompjs": "^6.1.2", "@stomp/stompjs": "^7.0.0",
"@tauri-apps/api": "^1.2.0", "@tauri-apps/api": "^1.2.0",
"@vue/runtime-core": "^3.2.45", "@vue/runtime-core": "^3.2.47",
"@vue/shared": "^3.2.45", "@vue/shared": "^3.2.47",
"@vueuse/core": "^9.5.0", "@vueuse/core": "^9.13.0",
"@vueuse/shared": "^9.5.0", "@vueuse/shared": "^9.13.0",
"@zxcvbn-ts/core": "^2.1.0", "@zxcvbn-ts/core": "^2.2.1",
"ant-design-vue": "^3.2.15", "ant-design-vue": "^3.2.16",
"axios": "^0.26.1", "axios": "^0.26.1",
"codemirror": "^6.0.1", "codemirror": "^6.0.1",
"cropperjs": "^1.5.12", "cropperjs": "^1.5.13",
"crypto-js": "^4.1.1", "crypto-js": "^4.1.1",
"dayjs": "^1.11.6", "dayjs": "^1.11.7",
"echarts": "^5.4.0", "default-passive-events": "^2.0.0",
"intro.js": "^5.1.0", "echarts": "^5.4.2",
"intro.js": "^6.0.0",
"js-file-download": "^0.4.12",
"lodash-es": "^4.17.21", "lodash-es": "^4.17.21",
"mockjs": "^1.1.0", "mockjs": "^1.1.0",
"nanoid": "^4.0.0", "nanoid": "^4.0.2",
"nprogress": "^0.2.0", "nprogress": "^0.2.0",
"path-to-regexp": "^6.2.1", "path-to-regexp": "^6.2.1",
"pinia": "^2.0.23", "pinia": "^2.0.33",
"print-js": "^1.6.0", "print-js": "^1.6.0",
"qrcode": "^1.5.1", "qrcode": "^1.5.1",
"qs": "^6.11.0", "qs": "^6.11.1",
"resize-observer-polyfill": "^1.5.1", "resize-observer-polyfill": "^1.5.1",
"showdown": "^2.1.0", "showdown": "^2.1.0",
"sockjs-client": "^1.6.1", "sockjs-client": "^1.6.1",
"sortablejs": "^1.15.0", "sortablejs": "^1.15.0",
"stompjs": "^2.3.3", "stompjs": "^2.3.3",
"tinymce": "^5.10.6", "tinymce": "^5.10.7",
"vditor": "^3.8.18", "vditor": "^3.9.1",
"vue": "^3.2.45", "vue": "^3.2.47",
"vue-i18n": "^9.2.2", "vue-i18n": "^9.2.2",
"vue-json-pretty": "^2.2.3", "vue-json-pretty": "^2.2.4",
"vue-router": "^4.1.6", "vue-router": "^4.1.6",
"vue-types": "^4.2.1", "vue-types": "^5.0.2",
"xlsx": "^0.18.5" "xlsx": "^0.18.5"
}, },
"devDependencies": { "devDependencies": {
"@commitlint/cli": "^17.2.0", "@antfu/eslint-config": "^0.37.0",
"@commitlint/config-conventional": "^17.2.0", "@commitlint/cli": "^17.5.1",
"@iconify/json": "^2.1.137", "@commitlint/config-conventional": "^17.4.4",
"@purge-icons/generated": "^0.8.1", "@iconify/json": "^2.2.42",
"@tauri-apps/cli": "^1.2.0", "@purge-icons/generated": "^0.9.0",
"@types/codemirror": "^5.60.5", "@tauri-apps/cli": "^1.2.3",
"@types/codemirror": "^5.60.7",
"@types/crypto-js": "^4.1.1", "@types/crypto-js": "^4.1.1",
"@types/fs-extra": "^9.0.13", "@types/fs-extra": "^11.0.1",
"@types/inquirer": "^9.0.3", "@types/inquirer": "^9.0.3",
"@types/intro.js": "^3.0.2", "@types/intro.js": "^5.1.1",
"@types/lodash-es": "^4.17.6", "@types/lodash": "^4.14.192",
"@types/lodash-es": "^4.17.7",
"@types/mockjs": "^1.0.7", "@types/mockjs": "^1.0.7",
"@types/node": "^18.11.9", "@types/node": "^18.15.11",
"@types/nprogress": "^0.2.0", "@types/nprogress": "^0.2.0",
"@types/qrcode": "^1.5.0", "@types/qrcode": "^1.5.0",
"@types/qs": "^6.9.7", "@types/qs": "^6.9.7",
"@types/showdown": "^1.9.4", "@types/showdown": "^2.0.0",
"@types/sockjs-client": "^1.5.1", "@types/sockjs-client": "^1.5.1",
"@types/sortablejs": "^1.15.0", "@types/sortablejs": "^1.15.1",
"@types/stompjs": "^2.3.5", "@types/stompjs": "^2.3.5",
"@typescript-eslint/eslint-plugin": "^5.42.1", "@typescript-eslint/eslint-plugin": "^5.57.0",
"@typescript-eslint/parser": "^5.42.1", "@typescript-eslint/parser": "^5.57.0",
"@vitejs/plugin-legacy": "^2.3.1", "@vitejs/plugin-legacy": "^4.0.2",
"@vitejs/plugin-vue": "^3.2.0", "@vitejs/plugin-vue": "^4.1.0",
"@vitejs/plugin-vue-jsx": "^1.3.10", "@vitejs/plugin-vue-jsx": "^3.0.1",
"@vue/compiler-sfc": "3.2.31", "@vue/compiler-dom": "^3.2.47",
"@vue/test-utils": "^2.2.2", "@vue/compiler-sfc": "^3.2.47",
"autoprefixer": "^10.4.13", "@vue/test-utils": "^2.3.2",
"commitizen": "^4.2.5", "autoprefixer": "^10.4.14",
"commitizen": "^4.3.0",
"conventional-changelog-cli": "^2.2.2", "conventional-changelog-cli": "^2.2.2",
"cross-env": "^7.0.3", "cross-env": "^7.0.3",
"cz-conventional-changelog": "^3.3.0", "cz-conventional-changelog": "^3.3.0",
"cz-git": "^1.3.12", "cz-git": "^1.6.1",
"czg": "^1.3.12", "czg": "^1.6.1",
"dotenv": "^16.0.3", "dotenv": "^16.0.3",
"eslint": "^8.27.0", "eslint": "^8.37.0",
"eslint-config-prettier": "^8.5.0", "eslint-config-prettier": "^8.8.0",
"eslint-plugin-prettier": "^4.2.1", "eslint-plugin-prettier": "^4.2.1",
"eslint-plugin-vue": "^9.7.0", "eslint-plugin-vue": "^9.10.0",
"esno": "^0.14.1", "esno": "^0.16.3",
"fs-extra": "^10.1.0", "fs-extra": "^11.1.1",
"husky": "^7.0.4", "husky": "^8.0.3",
"inquirer": "^9.1.4", "inquirer": "^9.1.5",
"less": "^4.1.3", "less": "^4.1.3",
"lint-staged": "12.3.7", "lint-staged": "^13.2.0",
"lodash": "^4.17.21",
"npm-run-all": "^4.1.5", "npm-run-all": "^4.1.5",
"picocolors": "^1.0.0", "picocolors": "^1.0.0",
"pont-engine": "^1.5.3", "pont-engine": "^1.5.7",
"postcss": "^8.4.19", "postcss": "^8.4.21",
"postcss-html": "^1.5.0", "postcss-html": "^1.5.0",
"postcss-less": "^6.0.0", "postcss-less": "^6.0.0",
"prettier": "^2.7.1", "prettier": "^2.8.7",
"rimraf": "^3.0.2", "rimraf": "^4.4.1",
"rollup": "^2.79.1", "rollup": "^2.79.1",
"rollup-plugin-visualizer": "^5.8.3", "rollup-plugin-visualizer": "^5.9.0",
"sort-package-json": "^1.57.0", "sort-package-json": "^2.4.1",
"stylelint": "^14.15.0", "stylelint": "^14.16.1",
"stylelint-config-prettier": "^9.0.4", "stylelint-config-prettier": "^9.0.5",
"stylelint-config-recommended": "^9.0.0", "stylelint-config-recommended": "^9.0.0",
"stylelint-config-recommended-vue": "^1.4.0", "stylelint-config-recommended-vue": "^1.4.0",
"stylelint-config-standard": "^29.0.0", "stylelint-config-standard": "^29.0.0",
"stylelint-order": "^5.0.0", "stylelint-order": "^5.0.0",
"terser": "^5.15.1", "terser": "^5.16.8",
"ts-node": "^10.9.1", "ts-node": "^10.9.1",
"typescript": "^4.8.4", "typescript": "^4.9.5",
"unplugin-auto-import": "^0.11.4", "unplugin-auto-import": "^0.12.2",
"vite": "^3.2.3", "vite": "^4.2.1",
"vite-plugin-compression": "^0.5.1", "vite-plugin-compression": "^0.5.1",
"vite-plugin-html": "^3.2.0", "vite-plugin-html": "^3.2.0",
"vite-plugin-mkcert": "^1.10.1", "vite-plugin-mkcert": "^1.14.0",
"vite-plugin-mock": "^2.9.6", "vite-plugin-mock": "^2.9.6",
"vite-plugin-purge-icons": "^0.9.1", "vite-plugin-purge-icons": "^0.9.2",
"vite-plugin-pwa": "^0.13.3", "vite-plugin-pwa": "^0.14.7",
"vite-plugin-style-import": "^2.0.0", "vite-plugin-style-import": "^2.0.0",
"vite-plugin-svg-icons": "^2.0.1", "vite-plugin-svg-icons": "^2.0.1",
"vite-plugin-theme": "^0.8.6", "vite-plugin-theme": "^0.8.6",
"vite-plugin-vue-setup-extend": "^0.4.0", "vite-plugin-vue-setup-extend": "^0.4.0",
"vite-plugin-windicss": "^1.8.8", "vite-plugin-windicss": "^1.8.10",
"vue-eslint-parser": "^9.1.0", "vue-eslint-parser": "^9.1.1",
"vue-tsc": "^1.0.9" "vue-tsc": "^1.2.0"
}, },
"engines": { "engines": {
"node": ">=14" "node": ">=14"
......
This source diff could not be displayed because it is too large. You can view the blob instead.
{ {
"originType": "SwaggerV2", "originType": "SwaggerV3",
"originUrl": "http://127.0.0.1:8081/api/v2/api-docs", "originUrl": "http://127.0.0.1:8081/api/v3/api-docs",
"templateType": "fetch", "templateType": "fetch",
"templatePath": "./pont-template", "templatePath": "./pont-template",
"transformPath": "./pont-transform", "transformPath": "./pont-transform",
"outDir": "./src/api/services", "outDir": "./src/api/services",
"surrounding": "typeScript", "surrounding": "typeScript",
"usingOperationId": true,
"mocks": { "mocks": {
"enable": true, "enable": true,
"basePath": "", "basePath": "",
......
import * as Pont from 'pont-engine' // import * as Pont from 'pont-engine'
import { Interface, BaseClass, Property, CodeGenerator } from 'pont-engine' import type { BaseClass, Interface } from 'pont-engine'
import { CodeGenerator, Property } from 'pont-engine'
// 接口 API 前缀 // 接口 API 前缀
// 通常与项目的 env 配置中的 VITE_GLOB_API_URL_PREFIX 相同 // 通常与项目的 env 配置中的 VITE_GLOB_API_URL_PREFIX 相同
const API_URL_PREFIX = '/api' const API_URL_PREFIX = '/api'
export class FileStructures extends Pont.FileStructures {
getModsDeclaration(originCode: string): string {
return originCode
}
}
export default class BasicGenerator extends CodeGenerator { export default class BasicGenerator extends CodeGenerator {
checkJsonParam(inter: Interface, paramsCode: string): boolean { isRequestBody(inter: Interface, paramsCode: string): boolean {
const prettier = require('prettier') const prettier = require('prettier')
const requestParams = inter.getRequestParams(this.surrounding) const requestParams = inter.getRequestParams(this.surrounding)
const code = prettier.format(paramsCode, { parser: 'typescript' }) const code = prettier.format(paramsCode, { parser: 'typescript' })
return code.includes('{}') && requestParams.includes('body') return code.includes('{}') && requestParams.includes('body')
} }
// 认为没有返回值的接口表示下载(通常是)
isDownload(inter: Interface): boolean {
return inter.responseType === 'any'
}
// 认为包含 form 参数的接口表示带有上传功能 // 认为包含 form 参数的接口表示带有上传功能
isUpload(inter: Interface): boolean { isUpload(inter: Interface): boolean {
return inter.getRequestParams(this.surrounding).includes('form') return inter.getRequestParams(this.surrounding).includes('form')
...@@ -40,15 +30,16 @@ export default class BasicGenerator extends CodeGenerator { ...@@ -40,15 +30,16 @@ export default class BasicGenerator extends CodeGenerator {
} }
if (requestParams.includes('body')) { if (requestParams.includes('body')) {
requestParams = requestParams.replace('params?: Params, ', '')
bodyTypeDef = requestParams.replace(/^.*body: (.*),.*$/gi, '$1') bodyTypeDef = requestParams.replace(/^.*body: (.*),.*$/gi, '$1')
requestParams = requestParams.replace('params?: Params, ', '')
requestParams = requestParams.replace('body:', 'body?:')
} }
} }
return `${requestParams.replace( return `${requestParams.replace(
'options?: any', 'options?: any',
`config?: http.RequestConfig<${ `config?: http.RequestConfig<${
bodyTypeDef ? bodyTypeDef : `Params${requestParams.includes('form') ? ' | FormData' : ''}` bodyTypeDef || `Params${requestParams.includes('form') ? ' | FormData' : ''}`
}>`, }>`,
)}, options?: http.RequestOptions` )}, options?: http.RequestOptions`
} }
...@@ -56,11 +47,18 @@ export default class BasicGenerator extends CodeGenerator { ...@@ -56,11 +47,18 @@ export default class BasicGenerator extends CodeGenerator {
getInterfaceContentInDeclaration(inter: Interface) { getInterfaceContentInDeclaration(inter: Interface) {
const paramsCode = inter.getParamsCode('Params') const paramsCode = inter.getParamsCode('Params')
const requestParams = this.getParams(inter, paramsCode) const requestParams = this.getParams(inter, paramsCode)
const sourceResponseType = inter.responseType
const targetResponseType =
sourceResponseType === 'File'
? 'void'
: sourceResponseType === 'defs.ResultString'
? 'string'
: sourceResponseType.replace(/defs.Result(.*)/, 'defs.$1')
return ` return `
export ${paramsCode} export ${paramsCode}
export type Response = ${inter.responseType.replace(/defs.Result\<(.*)\>/, '$1')}; export type Response = ${targetResponseType};
export const init: Response; export const init: Response;
...@@ -88,8 +86,10 @@ export default class BasicGenerator extends CodeGenerator { ...@@ -88,8 +86,10 @@ export default class BasicGenerator extends CodeGenerator {
const method = inter.method.toUpperCase() const method = inter.method.toUpperCase()
const paramsCode = inter.getParamsCode('Params', this.surrounding) const paramsCode = inter.getParamsCode('Params', this.surrounding)
const requestParams = this.getParams(inter, paramsCode) const requestParams = this.getParams(inter, paramsCode)
const isBody = this.checkJsonParam(inter, paramsCode) const initValue = inter.response.getInitialValue(true)
const responseType = `Promise<${inter.responseType.replace(/defs.Result\<(.*)\>/, '$1') || 'any'}>` const undef = initValue === 'undefined' || initValue === `''`
const isBody = this.isRequestBody(inter, paramsCode)
const isDownload = inter.responseType === 'File'
// TODO // TODO
// 扩展 hooks mode // 扩展 hooks mode
...@@ -99,11 +99,15 @@ export default class BasicGenerator extends CodeGenerator { ...@@ -99,11 +99,15 @@ export default class BasicGenerator extends CodeGenerator {
/** /**
* @desc ${inter.description} * @desc ${inter.description}
*/ */
${undef ? '' : `import * as defs from '../../baseClass';`}
import { defHttp } from '/@/utils/http/axios' import { defHttp } from '/@/utils/http/axios'
${isBody ? '' : `export ${paramsCode}`} ${isBody ? '' : `export ${paramsCode}`}
export function request(${requestParams}): ${responseType} { ${undef ? '' : `export const init = ${initValue};`}
export function request(${requestParams}) {
return defHttp.request({ return defHttp.request({
url: "${inter.path.replace(API_URL_PREFIX, '')}", url: "${inter.path.replace(API_URL_PREFIX, '')}",
method: '${method}', method: '${method}',
...@@ -116,12 +120,24 @@ export default class BasicGenerator extends CodeGenerator { ...@@ -116,12 +120,24 @@ export default class BasicGenerator extends CodeGenerator {
requestParams.includes('form') requestParams.includes('form')
? `headers: { 'Content-Type': 'multipart/form-data;charset=UTF-8' },` ? `headers: { 'Content-Type': 'multipart/form-data;charset=UTF-8' },`
: isBody : isBody
? `headers: { 'Content-Type': 'application/json;charset=UTF-8' },` ? `headers: { 'Content-Type': 'application/json' },`
: ''
}
${
isDownload
? `
responseType: 'blob',
timeout: 0,
`
: '' : ''
} }
...config, ...config,
}, options); }, {
${isDownload ? `download: true,` : ''}
...options,
});
} }
` `
} }
......
import { StandardDataSource } from 'pont-engine' import type { StandardDataSource } from 'pont-engine'
export default function (dataSource: StandardDataSource): StandardDataSource { export default function transform(dataSource: StandardDataSource): StandardDataSource {
console.log(dataSource)
return dataSource return dataSource
} }
...@@ -3,88 +3,8 @@ ...@@ -3,88 +3,8 @@
windows_subsystem = "windows" windows_subsystem = "windows"
)] )]
// 标准库
use std::collections::BTreeMap;
use std::process::Command;
// 系统信息库
use sysinfo::{DiskExt, System, SystemExt};
// 异步编程库: https://github.com/tokio-rs/tokio
use tokio::time::{self, Duration};
// 时间函数库: https://github.com/chronotope/chrono
// use chrono::prelude::*;
// JSON 序列化库
// use serde::{Deserialize, Serialize};
fn find() -> BTreeMap<String, String> {
let system = System::new_all();
let mut devices: BTreeMap<String, String> = BTreeMap::new();
for disk in system.disks() {
let point = disk
.mount_point()
.to_str()
.map(str::to_string)
.clone()
.unwrap();
let name = disk.name().to_str().map(str::to_string).clone().unwrap();
devices.insert(point, name);
}
return devices;
}
async fn loop_find(mut devices: BTreeMap<String, String>) {
let mut interval = time::interval(Duration::from_millis(500));
println!("");
println!("===========================================");
println!("{:?}", devices);
println!("===========================================");
println!("");
loop {
interval.tick().await;
let latest_devices = find();
let size = devices.len();
let latest_size = latest_devices.len();
if size != latest_size {
for (k, v) in &latest_devices {
if !devices.contains_key(k) {
println!("attach: {:?}, {:?}", v, k);
// 打开文件夹
Command::new("EXPLORER").arg(k).spawn().unwrap();
}
}
for (k, v) in &devices {
if !latest_devices.contains_key(k) {
println!("detach: {:?}, {:?}", v, k);
}
}
devices = latest_devices;
}
}
}
fn main() { fn main() {
tauri::Builder::default() tauri::Builder::default()
.setup(|_app| {
// let app_handle = app.handle();
let devices = find();
tauri::async_runtime::spawn(async move {
// A loop that takes output from the async process and sends it
// to the webview via a Tauri Event
loop_find(devices).await
});
Ok(())
})
.run(tauri::generate_context!()) .run(tauri::generate_context!())
.expect("error while running tauri application"); .expect("error while running tauri application");
} }
<template>
<ConfigProvider :locale="getAntdLocale">
<AppProvider>
<RouterView />
</AppProvider>
</ConfigProvider>
</template>
<script lang="ts" setup> <script lang="ts" setup>
import { ConfigProvider } from 'ant-design-vue' import { ConfigProvider } from 'ant-design-vue'
import { AppProvider } from '/@/components/Application' import { AppProvider } from '/@/components/Application'
...@@ -19,3 +11,11 @@ ...@@ -19,3 +11,11 @@
// Listening to page changes and dynamically changing site titles // Listening to page changes and dynamically changing site titles
useTitle() useTitle()
</script> </script>
<template>
<ConfigProvider :locale="getAntdLocale">
<AppProvider>
<RouterView />
</AppProvider>
</ConfigProvider>
</template>
This source diff could not be displayed because it is too large. You can view the blob instead.
/** /**
* @desc 登录 * @desc 登录
*/ */
import * as defs from '../../baseClass'
import { defHttp } from '/@/utils/http/axios' import { defHttp } from '/@/utils/http/axios'
export class Params { export class Params {
...@@ -10,11 +12,9 @@ export class Params { ...@@ -10,11 +12,9 @@ export class Params {
password: string password: string
} }
export function request( export const init = new defs.ResultLoginVo()
params: Params,
config?: http.RequestConfig<Params>, export function request(params: Params, config?: http.RequestConfig<Params>, options?: http.RequestOptions) {
options?: http.RequestOptions,
): Promise<defs.LoginVo> {
return defHttp.request( return defHttp.request(
{ {
url: '/auth/login', url: '/auth/login',
...@@ -23,6 +23,8 @@ export function request( ...@@ -23,6 +23,8 @@ export function request(
...config, ...config,
}, },
options, {
...options,
},
) )
} }
/** /**
* @desc 登出 * @desc 登出
*/ */
import * as defs from '../../baseClass'
import { defHttp } from '/@/utils/http/axios' import { defHttp } from '/@/utils/http/axios'
export class Params {} export class Params {}
export function request( export const init = new defs.ResultString()
params?: Params,
config?: http.RequestConfig<Params>, export function request(params?: Params, config?: http.RequestConfig<Params>, options?: http.RequestOptions) {
options?: http.RequestOptions,
): Promise<string> {
return defHttp.request( return defHttp.request(
{ {
url: '/auth/logout', url: '/auth/logout',
...@@ -18,6 +18,8 @@ export function request( ...@@ -18,6 +18,8 @@ export function request(
...config, ...config,
}, },
options, {
...options,
},
) )
} }
/** /**
* @desc 注册 * @desc 注册
*/ */
import * as defs from '../../baseClass'
import { defHttp } from '/@/utils/http/axios' import { defHttp } from '/@/utils/http/axios'
export class Params { export class Params {
/** 用户名 */
username: string
/** 密码 */
password: string
/** 真实姓名 */
realName: string
/** 手机号 */
mobile: string
/** 头像 */ /** 头像 */
avatar?: string avatar?: string
/** 邮箱 */ /** 邮箱 */
email?: string email?: string
/** 是否启用 */ /** 是否启用 */
enable?: boolean enable?: boolean
/** 简介 */
introduction?: string
/** 手机号 */
mobile: string
/** 密码 */
password: string
/** 真实姓名 */
realName: string
/** 用户名 */
username: string
} }
export function request( export const init = new defs.ResultString()
params: Params,
config?: http.RequestConfig<Params>, export function request(params: Params, config?: http.RequestConfig<Params>, options?: http.RequestOptions) {
options?: http.RequestOptions,
): Promise<string> {
return defHttp.request( return defHttp.request(
{ {
url: '/auth/register', url: '/auth/register',
...@@ -35,6 +33,8 @@ export function request( ...@@ -35,6 +33,8 @@ export function request(
...config, ...config,
}, },
options, {
...options,
},
) )
} }
/** /**
* @desc 安全校验 * @desc 安全验证
*/ */
import * as defs from '../../baseClass'
import { defHttp } from '/@/utils/http/axios' import { defHttp } from '/@/utils/http/axios'
export class Params { export class Params {
...@@ -8,11 +10,9 @@ export class Params { ...@@ -8,11 +10,9 @@ export class Params {
password: string password: string
} }
export function request( export const init = new defs.ResultString()
params: Params,
config?: http.RequestConfig<Params>, export function request(params: Params, config?: http.RequestConfig<Params>, options?: http.RequestOptions) {
options?: http.RequestOptions,
): Promise<string> {
return defHttp.request( return defHttp.request(
{ {
url: '/auth/safe', url: '/auth/safe',
...@@ -21,6 +21,8 @@ export function request( ...@@ -21,6 +21,8 @@ export function request(
...config, ...config,
}, },
options, {
...options,
},
) )
} }
/** /**
* @desc 检查登录 * @desc 检查登录
*/ */
import * as defs from '../../baseClass'
import { defHttp } from '/@/utils/http/axios' import { defHttp } from '/@/utils/http/axios'
export class Params {} export class Params {}
export function request( export const init = new defs.ResultBoolean()
params?: Params,
config?: http.RequestConfig<Params>, export function request(params?: Params, config?: http.RequestConfig<Params>, options?: http.RequestOptions) {
options?: http.RequestOptions,
): Promise<boolean> {
return defHttp.request( return defHttp.request(
{ {
url: '/auth/valid', url: '/auth/valid',
...@@ -18,6 +18,8 @@ export function request( ...@@ -18,6 +18,8 @@ export function request(
...config, ...config,
}, },
options, {
...options,
},
) )
} }
/**
* @desc 新增
*/
import * as defs from '../../baseClass'
import { defHttp } from '/@/utils/http/axios'
export class Params {
/** id */
id: string
/** 字典名称 */
name: string
/** 字典编号 */
code: string
/** 字典描述 */
description?: string
}
export const init = new defs.ResultString()
export function request(params: Params, config?: http.RequestConfig<Params>, options?: http.RequestOptions) {
return defHttp.request(
{
url: '/sys/dict/add',
method: 'POST',
data: params,
...config,
},
{
...options,
},
)
}
/**
* @desc 查询
*/
import * as defs from '../../baseClass'
import { defHttp } from '/@/utils/http/axios'
export class Params {
/** id */
id: string
}
export const init = new defs.ResultDictVo()
export function request(params: Params, config?: http.RequestConfig<Params>, options?: http.RequestOptions) {
return defHttp.request(
{
url: '/sys/dict/find',
method: 'GET',
params,
...config,
},
{
...options,
},
)
}
/**
* @description 字典管理
*/
import * as add from './add'
import * as find from './find'
import * as modify from './modify'
import * as page from './page'
import * as remove from './remove'
import * as selector from './selector'
export { add, find, modify, page, remove, selector }
/**
* @desc 修改
*/
import * as defs from '../../baseClass'
import { defHttp } from '/@/utils/http/axios'
export class Params {
/** id */
id: string
/** 字典名称 */
name: string
/** 字典编号 */
code: string
/** 字典描述 */
description?: string
}
export const init = new defs.ResultString()
export function request(params: Params, config?: http.RequestConfig<Params>, options?: http.RequestOptions) {
return defHttp.request(
{
url: '/sys/dict/modify',
method: 'POST',
data: params,
...config,
},
{
...options,
},
)
}
/**
* @desc 分页查询
*/
import * as defs from '../../baseClass'
import { defHttp } from '/@/utils/http/axios'
export class Params {
/** 分页条数 */
pageSize: number
/** 当前页数 */
pageNo: number
/** 排序字段 */
sortField?: string
/** 排序方向(ASC|DESC) */
sortOrder?: string
}
export const init = new defs.ResultPageVoDictVo()
export function request(params: Params, config?: http.RequestConfig<Params>, options?: http.RequestOptions) {
return defHttp.request(
{
url: '/sys/dict/page',
method: 'GET',
params,
...config,
},
{
...options,
},
)
}
/** /**
* @desc 删除 * @desc 删除
*/ */
import * as defs from '../../baseClass'
import { defHttp } from '/@/utils/http/axios' import { defHttp } from '/@/utils/http/axios'
export class Params { export class Params {
...@@ -8,19 +10,19 @@ export class Params { ...@@ -8,19 +10,19 @@ export class Params {
ids: string ids: string
} }
export function request( export const init = new defs.ResultString()
params: Params,
config?: http.RequestConfig<Params>, export function request(params: Params, config?: http.RequestConfig<Params>, options?: http.RequestOptions) {
options?: http.RequestOptions,
): Promise<string> {
return defHttp.request( return defHttp.request(
{ {
url: '/sys/role/deleted', url: '/sys/dict/remove',
method: 'POST', method: 'POST',
data: params, data: params,
...config, ...config,
}, },
options, {
...options,
},
) )
} }
/**
* @desc 选项查询
*/
import * as defs from '../../baseClass'
import { defHttp } from '/@/utils/http/axios'
export class Params {}
export const init = new defs.ResultArrayListKeyValueVo()
export function request(params?: Params, config?: http.RequestConfig<Params>, options?: http.RequestOptions) {
return defHttp.request(
{
url: '/sys/dict/selector',
method: 'GET',
params,
...config,
},
{
...options,
},
)
}
/**
* @desc 新增
*/
import * as defs from '../../baseClass'
import { defHttp } from '/@/utils/http/axios'
export class Params {
/** id */
id: string
/** 字典 ID */
dictId: string
/** 字典选项名称 */
name: string
/** 字典选项值 */
value: string
/** 字典选项描述 */
description?: string
/** 字典选项排序序号 */
serial?: number
/** 字典选项是否启用 */
enable: boolean
}
export const init = new defs.ResultString()
export function request(params: Params, config?: http.RequestConfig<Params>, options?: http.RequestOptions) {
return defHttp.request(
{
url: '/sys/dict/item/add',
method: 'POST',
data: params,
...config,
},
{
...options,
},
)
}
/**
* @desc 查询
*/
import * as defs from '../../baseClass'
import { defHttp } from '/@/utils/http/axios'
export class Params {
/** id */
id: string
}
export const init = new defs.ResultDictItemVo()
export function request(params: Params, config?: http.RequestConfig<Params>, options?: http.RequestOptions) {
return defHttp.request(
{
url: '/sys/dict/item/find',
method: 'GET',
params,
...config,
},
{
...options,
},
)
}
/**
* @description 字典选项管理
*/
import * as add from './add'
import * as find from './find'
import * as modify from './modify'
import * as page from './page'
import * as remove from './remove'
import * as selector from './selector'
export { add, find, modify, page, remove, selector }
/**
* @desc 修改
*/
import * as defs from '../../baseClass'
import { defHttp } from '/@/utils/http/axios'
export class Params {
/** id */
id: string
/** 字典 ID */
dictId: string
/** 字典选项名称 */
name: string
/** 字典选项值 */
value: string
/** 字典选项描述 */
description?: string
/** 字典选项排序序号 */
serial?: number
/** 字典选项是否启用 */
enable: boolean
}
export const init = new defs.ResultString()
export function request(params: Params, config?: http.RequestConfig<Params>, options?: http.RequestOptions) {
return defHttp.request(
{
url: '/sys/dict/item/modify',
method: 'POST',
data: params,
...config,
},
{
...options,
},
)
}
/**
* @desc 分页查询
*/
import * as defs from '../../baseClass'
import { defHttp } from '/@/utils/http/axios'
export class Params {
/** 分页条数 */
pageSize: number
/** 当前页数 */
pageNo: number
/** 排序字段 */
sortField?: string
/** 排序方向(ASC|DESC) */
sortOrder?: string
}
export const init = new defs.ResultPageVoDictItemVo()
export function request(params: Params, config?: http.RequestConfig<Params>, options?: http.RequestOptions) {
return defHttp.request(
{
url: '/sys/dict/item/page',
method: 'GET',
params,
...config,
},
{
...options,
},
)
}
/**
* @desc 删除
*/
import * as defs from '../../baseClass'
import { defHttp } from '/@/utils/http/axios'
export class Params {
/** ids 多个以逗号分割 */
ids: string
}
export const init = new defs.ResultString()
export function request(params: Params, config?: http.RequestConfig<Params>, options?: http.RequestOptions) {
return defHttp.request(
{
url: '/sys/dict/item/remove',
method: 'POST',
data: params,
...config,
},
{
...options,
},
)
}
/**
* @desc 选项查询
*/
import * as defs from '../../baseClass'
import { defHttp } from '/@/utils/http/axios'
export class Params {
/** 字典 ID */
dictId?: string
/** 字典 ID */
dictCode?: string
/** 字典选项是否启用 */
enable?: boolean
}
export const init = new defs.ResultArrayListKeyValueVo()
export function request(params: Params, config?: http.RequestConfig<Params>, options?: http.RequestOptions) {
return defHttp.request(
{
url: '/sys/dict/item/selector',
method: 'GET',
params,
...config,
},
{
...options,
},
)
}
/** /**
* @desc 文件下载 * @desc 文件下载
*/ */
import { defHttp } from '/@/utils/http/axios' import { defHttp } from '/@/utils/http/axios'
export class Params {} export class Params {}
export function request( export function request(params?: Params, config?: http.RequestConfig<Params>, options?: http.RequestOptions) {
params?: Params,
config?: http.RequestConfig<Params>,
options?: http.RequestOptions,
): Promise<any> {
return defHttp.request( return defHttp.request(
{ {
url: '/example/download', url: '/example/download',
method: 'GET', method: 'GET',
params, params,
responseType: 'blob',
timeout: 0,
...config, ...config,
}, },
options, {
download: true,
...options,
},
) )
} }
/** /**
* @desc 测试失败 * @desc 测试失败
*/ */
import * as defs from '../../baseClass'
import { defHttp } from '/@/utils/http/axios' import { defHttp } from '/@/utils/http/axios'
export class Params {} export class Params {}
export function request( export const init = new defs.ResultString()
params?: Params,
config?: http.RequestConfig<Params>, export function request(params?: Params, config?: http.RequestConfig<Params>, options?: http.RequestOptions) {
options?: http.RequestOptions,
): Promise<string> {
return defHttp.request( return defHttp.request(
{ {
url: '/example/fail', url: '/example/fail',
...@@ -18,6 +18,8 @@ export function request( ...@@ -18,6 +18,8 @@ export function request(
...config, ...config,
}, },
options, {
...options,
},
) )
} }
/** /**
* @desc 查询用户属性 * @desc 查询用户属性
*/ */
import * as defs from '../../baseClass'
import { defHttp } from '/@/utils/http/axios' import { defHttp } from '/@/utils/http/axios'
export class Params {} export class Params {}
export function request( export const init = new defs.ResultUserExtensionVo()
params?: Params,
config?: http.RequestConfig<Params>, export function request(params?: Params, config?: http.RequestConfig<Params>, options?: http.RequestOptions) {
options?: http.RequestOptions,
): Promise<defs.UserExtensionVo> {
return defHttp.request( return defHttp.request(
{ {
url: '/example/findUserExtensionInfo', url: '/example/findUserExtensionInfo',
...@@ -18,6 +18,8 @@ export function request( ...@@ -18,6 +18,8 @@ export function request(
...config, ...config,
}, },
options, {
...options,
},
) )
} }
/** /**
* @desc Hello World * @desc Hello World
*/ */
import * as defs from '../../baseClass'
import { defHttp } from '/@/utils/http/axios' import { defHttp } from '/@/utils/http/axios'
export class Params {} export class Params {}
export function request( export const init = new defs.ResultString()
params?: Params,
config?: http.RequestConfig<Params>, export function request(params?: Params, config?: http.RequestConfig<Params>, options?: http.RequestOptions) {
options?: http.RequestOptions,
): Promise<string> {
return defHttp.request( return defHttp.request(
{ {
url: '/example/', url: '/example/',
...@@ -18,6 +18,8 @@ export function request( ...@@ -18,6 +18,8 @@ export function request(
...config, ...config,
}, },
options, {
...options,
},
) )
} }
...@@ -7,5 +7,6 @@ import * as fail from './fail' ...@@ -7,5 +7,6 @@ import * as fail from './fail'
import * as findUserExtensionInfo from './findUserExtensionInfo' import * as findUserExtensionInfo from './findUserExtensionInfo'
import * as json from './json' import * as json from './json'
import * as page from './page' import * as page from './page'
import * as upload from './upload'
export { hello, download, fail, findUserExtensionInfo, json, page } export { hello, download, fail, findUserExtensionInfo, json, page, upload }
/** /**
* @desc JSON 传参 * @desc JSON 传参
*/ */
import * as defs from '../../baseClass'
import { defHttp } from '/@/utils/http/axios' import { defHttp } from '/@/utils/http/axios'
export const init = new defs.ResultPageVoString()
export function request( export function request(
body: defs.PageParam, body?: defs.PageParam,
config?: http.RequestConfig<defs.PageParam>, config?: http.RequestConfig<defs.PageParam>,
options?: http.RequestOptions, options?: http.RequestOptions,
): Promise<defs.PageVo<string>> { ) {
return defHttp.request( return defHttp.request(
{ {
url: '/example/json', url: '/example/json',
...@@ -17,6 +21,8 @@ export function request( ...@@ -17,6 +21,8 @@ export function request(
...config, ...config,
}, },
options, {
...options,
},
) )
} }
/** /**
* @desc 分页条件查询 * @desc 分页条件查询
*/ */
import * as defs from '../../baseClass'
import { defHttp } from '/@/utils/http/axios' import { defHttp } from '/@/utils/http/axios'
export class Params { export class Params {
/** 当前页数 */
pageNo: number
/** 分页条数 */ /** 分页条数 */
pageSize: number pageSize: number
/** 当前页数 */
pageNo: number
/** 排序字段 */ /** 排序字段 */
sortField?: string sortField?: string
/** 排序方向(ASC|DESC) */ /** 排序方向(ASC|DESC) */
sortOrder?: 'ASC' | 'DESC' sortOrder?: string
} }
export function request( export const init = new defs.ResultPageVoString()
params: Params,
config?: http.RequestConfig<Params>, export function request(params: Params, config?: http.RequestConfig<Params>, options?: http.RequestOptions) {
options?: http.RequestOptions,
): Promise<defs.PageVo<string>> {
return defHttp.request( return defHttp.request(
{ {
url: '/example/page', url: '/example/page',
...@@ -27,6 +27,8 @@ export function request( ...@@ -27,6 +27,8 @@ export function request(
...config, ...config,
}, },
options, {
...options,
},
) )
} }
/**
* @desc 文件上传
*/
import * as defs from '../../baseClass'
import { defHttp } from '/@/utils/http/axios'
export const init = new defs.ResultString()
export function request(body?: object, config?: http.RequestConfig<object>, options?: http.RequestOptions) {
return defHttp.request(
{
url: '/example/upload',
method: 'POST',
data: body,
headers: { 'Content-Type': 'application/json' },
...config,
},
{
...options,
},
)
}
/** /**
* @desc 文件下载 * @desc 文件下载
*/ */
import { defHttp } from '/@/utils/http/axios' import { defHttp } from '/@/utils/http/axios'
export class Params { export class Params {
...@@ -10,19 +11,22 @@ export class Params { ...@@ -10,19 +11,22 @@ export class Params {
object: string object: string
} }
export function request( export function request(params: Params, config?: http.RequestConfig<Params>, options?: http.RequestOptions) {
params: Params,
config?: http.RequestConfig<Params>,
options?: http.RequestOptions,
): Promise<any> {
return defHttp.request( return defHttp.request(
{ {
url: '/common/file/download', url: '/common/file/download',
method: 'GET', method: 'GET',
params, params,
responseType: 'blob',
timeout: 0,
...config, ...config,
}, },
options, {
download: true,
...options,
},
) )
} }
/** /**
* @desc 文件上传 * @desc 文件上传
*/ */
import * as defs from '../../baseClass'
import { defHttp } from '/@/utils/http/axios' import { defHttp } from '/@/utils/http/axios'
export class Params {} export const init = new defs.ResultString()
export function request( export function request(body?: object, config?: http.RequestConfig<object>, options?: http.RequestOptions) {
params: Params,
form: FormData,
config?: http.RequestConfig<Params | FormData>,
options?: http.RequestOptions,
): Promise<string> {
return defHttp.request( return defHttp.request(
{ {
url: '/common/file/upload', url: '/common/file/upload',
method: 'POST', method: 'POST',
data: form || params, data: body,
headers: { 'Content-Type': 'multipart/form-data;charset=UTF-8' }, headers: { 'Content-Type': 'application/json' },
...config, ...config,
}, },
options, {
...options,
},
) )
} }
/** /**
* @desc Base64 图片上传 * @desc Base64 图片上传
*/ */
import * as defs from '../../baseClass'
import { defHttp } from '/@/utils/http/axios' import { defHttp } from '/@/utils/http/axios'
export class Params { export const init = new defs.ResultString()
/** Base64 图片信息 */
base64Image: string
}
export function request( export function request(body?: string, config?: http.RequestConfig<string>, options?: http.RequestOptions) {
params: Params,
config?: http.RequestConfig<Params>,
options?: http.RequestOptions,
): Promise<string> {
return defHttp.request( return defHttp.request(
{ {
url: '/common/file/uploadBase64Image', url: '/common/file/uploadBase64Image',
method: 'POST', method: 'POST',
data: params, data: body,
headers: { 'Content-Type': 'application/json' },
...config, ...config,
}, },
options, {
...options,
},
) )
} }
import * as auth from './auth' import * as auth from './auth'
import * as dict from './dict'
import * as dictItem from './dictItem'
import * as example from './example' import * as example from './example'
import * as file from './file' import * as file from './file'
import * as permission from './permission' import * as permission from './permission'
...@@ -8,6 +10,8 @@ import * as userView from './userView' ...@@ -8,6 +10,8 @@ import * as userView from './userView'
export const API = { export const API = {
auth, auth,
dict,
dictItem,
example, example,
file, file,
permission, permission,
......
/** /**
* @desc 新增 * @desc 新增
*/ */
import * as defs from '../../baseClass'
import { defHttp } from '/@/utils/http/axios' import { defHttp } from '/@/utils/http/axios'
export class Params { export const init = new defs.ResultString()
/** 组件 */
component?: string
/** 是否启用 */
enable?: boolean
/** 是否隐藏 */
hidden?: boolean
/** 图标 */
icon?: string
/** 元数据 */
meta?: string
/** 名称 */
name: string
/** 路径 */
path?: string
/** 父级ID */
pid?: string
/** 重定向 */
redirect?: string
/** 序号 */
serial?: number
/** 权限类型 */
type: 'DIR' | 'MENU' | 'BUTTON'
/** 标识 */
uid: string
}
export function request( export function request(
params: Params, body?: defs.PermissionParam,
config?: http.RequestConfig<Params>, config?: http.RequestConfig<defs.PermissionParam>,
options?: http.RequestOptions, options?: http.RequestOptions,
): Promise<string> { ) {
return defHttp.request( return defHttp.request(
{ {
url: '/sys/permission/add', url: '/sys/permission/add',
method: 'POST', method: 'POST',
data: params, data: body,
headers: { 'Content-Type': 'application/json' },
...config, ...config,
}, },
options, {
...options,
},
) )
} }
/** /**
* @desc 查询 * @desc 查询
*/ */
import * as defs from '../../baseClass'
import { defHttp } from '/@/utils/http/axios' import { defHttp } from '/@/utils/http/axios'
export class Params { export class Params {
...@@ -8,11 +10,9 @@ export class Params { ...@@ -8,11 +10,9 @@ export class Params {
id: string id: string
} }
export function request( export const init = new defs.ResultPermissionVo()
params: Params,
config?: http.RequestConfig<Params>, export function request(params: Params, config?: http.RequestConfig<Params>, options?: http.RequestOptions) {
options?: http.RequestOptions,
): Promise<defs.PermissionVo> {
return defHttp.request( return defHttp.request(
{ {
url: '/sys/permission/find', url: '/sys/permission/find',
...@@ -21,6 +21,8 @@ export function request( ...@@ -21,6 +21,8 @@ export function request(
...config, ...config,
}, },
options, {
...options,
},
) )
} }
...@@ -2,10 +2,10 @@ ...@@ -2,10 +2,10 @@
* @description 权限管理 * @description 权限管理
*/ */
import * as add from './add' import * as add from './add'
import * as deleted from './deleted'
import * as find from './find' import * as find from './find'
import * as modify from './modify' import * as modify from './modify'
import * as page from './page' import * as page from './page'
import * as remove from './remove'
import * as tree from './tree' import * as tree from './tree'
export { add, deleted, find, modify, page, tree } export { add, find, modify, page, remove, tree }
/** /**
* @desc 修改 * @desc 修改
*/ */
import * as defs from '../../baseClass'
import { defHttp } from '/@/utils/http/axios' import { defHttp } from '/@/utils/http/axios'
export class Params { export const init = new defs.ResultString()
/** 组件 */
component?: string
/** 是否启用 */
enable?: boolean
/** 是否隐藏 */
hidden?: boolean
/** 图标 */
icon?: string
/** id */
id: string
/** 元数据 */
meta?: string
/** 名称 */
name: string
/** 路径 */
path?: string
/** 父级ID */
pid?: string
/** 重定向 */
redirect?: string
/** 序号 */
serial?: number
/** 权限类型 */
type: 'DIR' | 'MENU' | 'BUTTON'
/** 标识 */
uid: string
}
export function request( export function request(
params: Params, body?: defs.PermissionParam,
config?: http.RequestConfig<Params>, config?: http.RequestConfig<defs.PermissionParam>,
options?: http.RequestOptions, options?: http.RequestOptions,
): Promise<string> { ) {
return defHttp.request( return defHttp.request(
{ {
url: '/sys/permission/modify', url: '/sys/permission/modify',
method: 'POST', method: 'POST',
data: params, data: body,
headers: { 'Content-Type': 'application/json' },
...config, ...config,
}, },
options, {
...options,
},
) )
} }
/** /**
* @desc 分页查询 * @desc 分页查询
*/ */
import * as defs from '../../baseClass'
import { defHttp } from '/@/utils/http/axios' import { defHttp } from '/@/utils/http/axios'
export class Params { export class Params {
/** 当前页数 */
pageNo: number
/** 分页条数 */ /** 分页条数 */
pageSize: number pageSize: number
/** 当前页数 */
pageNo: number
/** 排序字段 */ /** 排序字段 */
sortField?: string sortField?: string
/** 排序方向(ASC|DESC) */ /** 排序方向(ASC|DESC) */
sortOrder?: 'ASC' | 'DESC' sortOrder?: string
} }
export function request( export const init = new defs.ResultPageVoPermissionVo()
params: Params,
config?: http.RequestConfig<Params>, export function request(params: Params, config?: http.RequestConfig<Params>, options?: http.RequestOptions) {
options?: http.RequestOptions,
): Promise<defs.PageVo<defs.PermissionVo>> {
return defHttp.request( return defHttp.request(
{ {
url: '/sys/permission/page', url: '/sys/permission/page',
...@@ -27,6 +27,8 @@ export function request( ...@@ -27,6 +27,8 @@ export function request(
...config, ...config,
}, },
options, {
...options,
},
) )
} }
/** /**
* @desc 删除 * @desc 删除
*/ */
import * as defs from '../../baseClass'
import { defHttp } from '/@/utils/http/axios' import { defHttp } from '/@/utils/http/axios'
export class Params { export class Params {
...@@ -8,19 +10,19 @@ export class Params { ...@@ -8,19 +10,19 @@ export class Params {
id: string id: string
} }
export function request( export const init = new defs.ResultString()
params: Params,
config?: http.RequestConfig<Params>, export function request(params: Params, config?: http.RequestConfig<Params>, options?: http.RequestOptions) {
options?: http.RequestOptions,
): Promise<string> {
return defHttp.request( return defHttp.request(
{ {
url: '/sys/permission/deleted', url: '/sys/permission/remove',
method: 'POST', method: 'POST',
data: params, data: params,
...config, ...config,
}, },
options, {
...options,
},
) )
} }
/** /**
* @desc 树结构查询 * @desc 树结构查询
*/ */
import * as defs from '../../baseClass'
import { defHttp } from '/@/utils/http/axios' import { defHttp } from '/@/utils/http/axios'
export class Params { export class Params {
/** pid */ /** pid */
pid?: string pid: string
} }
export function request( export const init = new defs.ResultArrayListPermissionVo()
params: Params,
config?: http.RequestConfig<Params>, export function request(params: Params, config?: http.RequestConfig<Params>, options?: http.RequestOptions) {
options?: http.RequestOptions,
): Promise<Array<defs.PermissionVo>> {
return defHttp.request( return defHttp.request(
{ {
url: '/sys/permission/tree', url: '/sys/permission/tree',
...@@ -21,6 +21,8 @@ export function request( ...@@ -21,6 +21,8 @@ export function request(
...config, ...config,
}, },
options, {
...options,
},
) )
} }
/** /**
* @desc 新增 * @desc 新增
*/ */
import * as defs from '../../baseClass'
import { defHttp } from '/@/utils/http/axios' import { defHttp } from '/@/utils/http/axios'
export class Params { export class Params {
/** 名称 */ /** id */
name: string id: string
/** 标识 */ /** 标识 */
uid: string uid: string
/** 名称 */
name: string
} }
export function request( export const init = new defs.ResultString()
params: Params,
config?: http.RequestConfig<Params>, export function request(params: Params, config?: http.RequestConfig<Params>, options?: http.RequestOptions) {
options?: http.RequestOptions,
): Promise<string> {
return defHttp.request( return defHttp.request(
{ {
url: '/sys/role/add', url: '/sys/role/add',
...@@ -23,6 +25,8 @@ export function request( ...@@ -23,6 +25,8 @@ export function request(
...config, ...config,
}, },
options, {
...options,
},
) )
} }
/** /**
* @desc 分配权限 * @desc 分配权限
*/ */
import * as defs from '../../baseClass'
import { defHttp } from '/@/utils/http/axios' import { defHttp } from '/@/utils/http/axios'
export class Params { export class Params {
...@@ -10,11 +12,9 @@ export class Params { ...@@ -10,11 +12,9 @@ export class Params {
ids: string ids: string
} }
export function request( export const init = new defs.ResultString()
params: Params,
config?: http.RequestConfig<Params>, export function request(params: Params, config?: http.RequestConfig<Params>, options?: http.RequestOptions) {
options?: http.RequestOptions,
): Promise<string> {
return defHttp.request( return defHttp.request(
{ {
url: '/sys/role/assign', url: '/sys/role/assign',
...@@ -23,6 +23,8 @@ export function request( ...@@ -23,6 +23,8 @@ export function request(
...config, ...config,
}, },
options, {
...options,
},
) )
} }
/** /**
* @desc 查询 * @desc 查询
*/ */
import * as defs from '../../baseClass'
import { defHttp } from '/@/utils/http/axios' import { defHttp } from '/@/utils/http/axios'
export class Params { export class Params {
...@@ -8,11 +10,9 @@ export class Params { ...@@ -8,11 +10,9 @@ export class Params {
id: string id: string
} }
export function request( export const init = new defs.ResultRoleVo()
params: Params,
config?: http.RequestConfig<Params>, export function request(params: Params, config?: http.RequestConfig<Params>, options?: http.RequestOptions) {
options?: http.RequestOptions,
): Promise<defs.RoleVo> {
return defHttp.request( return defHttp.request(
{ {
url: '/sys/role/find', url: '/sys/role/find',
...@@ -21,6 +21,8 @@ export function request( ...@@ -21,6 +21,8 @@ export function request(
...config, ...config,
}, },
options, {
...options,
},
) )
} }
...@@ -3,10 +3,10 @@ ...@@ -3,10 +3,10 @@
*/ */
import * as add from './add' import * as add from './add'
import * as assign from './assign' import * as assign from './assign'
import * as deleted from './deleted'
import * as find from './find' import * as find from './find'
import * as modify from './modify' import * as modify from './modify'
import * as page from './page' import * as page from './page'
import * as remove from './remove'
import * as selector from './selector' import * as selector from './selector'
export { add, assign, deleted, find, modify, page, selector } export { add, assign, find, modify, page, remove, selector }
/** /**
* @desc 修改 * @desc 修改
*/ */
import * as defs from '../../baseClass'
import { defHttp } from '/@/utils/http/axios' import { defHttp } from '/@/utils/http/axios'
export class Params { export class Params {
/** id */ /** id */
id: string id: string
/** 名称 */
name: string
/** 标识 */ /** 标识 */
uid: string uid: string
/** 名称 */
name: string
} }
export function request( export const init = new defs.ResultString()
params: Params,
config?: http.RequestConfig<Params>, export function request(params: Params, config?: http.RequestConfig<Params>, options?: http.RequestOptions) {
options?: http.RequestOptions,
): Promise<string> {
return defHttp.request( return defHttp.request(
{ {
url: '/sys/role/modify', url: '/sys/role/modify',
...@@ -25,6 +25,8 @@ export function request( ...@@ -25,6 +25,8 @@ export function request(
...config, ...config,
}, },
options, {
...options,
},
) )
} }
/** /**
* @desc 分页查询 * @desc 分页查询
*/ */
import * as defs from '../../baseClass'
import { defHttp } from '/@/utils/http/axios' import { defHttp } from '/@/utils/http/axios'
export class Params { export class Params {
/** 当前页数 */
pageNo: number
/** 分页条数 */ /** 分页条数 */
pageSize: number pageSize: number
/** 当前页数 */
pageNo: number
/** 排序字段 */ /** 排序字段 */
sortField?: string sortField?: string
/** 排序方向(ASC|DESC) */ /** 排序方向(ASC|DESC) */
sortOrder?: 'ASC' | 'DESC' sortOrder?: string
} }
export function request( export const init = new defs.ResultPageVoRoleVo()
params: Params,
config?: http.RequestConfig<Params>, export function request(params: Params, config?: http.RequestConfig<Params>, options?: http.RequestOptions) {
options?: http.RequestOptions,
): Promise<defs.PageVo<defs.RoleVo>> {
return defHttp.request( return defHttp.request(
{ {
url: '/sys/role/page', url: '/sys/role/page',
...@@ -27,6 +27,8 @@ export function request( ...@@ -27,6 +27,8 @@ export function request(
...config, ...config,
}, },
options, {
...options,
},
) )
} }
/**
* @desc 删除
*/
import * as defs from '../../baseClass'
import { defHttp } from '/@/utils/http/axios'
export class Params {
/** ids 多个以逗号分割 */
ids: string
}
export const init = new defs.ResultString()
export function request(params: Params, config?: http.RequestConfig<Params>, options?: http.RequestOptions) {
return defHttp.request(
{
url: '/sys/role/remove',
method: 'POST',
data: params,
...config,
},
{
...options,
},
)
}
/** /**
* @desc 选项查询 * @desc 选项查询
*/ */
import * as defs from '../../baseClass'
import { defHttp } from '/@/utils/http/axios' import { defHttp } from '/@/utils/http/axios'
export class Params {} export class Params {}
export function request( export const init = new defs.ResultArrayListRoleVo()
params?: Params,
config?: http.RequestConfig<Params>, export function request(params?: Params, config?: http.RequestConfig<Params>, options?: http.RequestOptions) {
options?: http.RequestOptions,
): Promise<Array<defs.RoleVo>> {
return defHttp.request( return defHttp.request(
{ {
url: '/sys/role/selector', url: '/sys/role/selector',
...@@ -18,6 +18,8 @@ export function request( ...@@ -18,6 +18,8 @@ export function request(
...config, ...config,
}, },
options, {
...options,
},
) )
} }
/** /**
* @desc 分配角色 * @desc 分配角色
*/ */
import * as defs from '../../baseClass'
import { defHttp } from '/@/utils/http/axios' import { defHttp } from '/@/utils/http/axios'
export class Params { export class Params {
...@@ -10,11 +12,9 @@ export class Params { ...@@ -10,11 +12,9 @@ export class Params {
ids: string ids: string
} }
export function request( export const init = new defs.ResultString()
params: Params,
config?: http.RequestConfig<Params>, export function request(params: Params, config?: http.RequestConfig<Params>, options?: http.RequestOptions) {
options?: http.RequestOptions,
): Promise<string> {
return defHttp.request( return defHttp.request(
{ {
url: '/sys/user/assign', url: '/sys/user/assign',
...@@ -23,6 +23,8 @@ export function request( ...@@ -23,6 +23,8 @@ export function request(
...config, ...config,
}, },
options, {
...options,
},
) )
} }
/** /**
* @desc 分页查询 * @desc 分页查询
*/ */
import * as defs from '../../baseClass'
import { defHttp } from '/@/utils/http/axios' import { defHttp } from '/@/utils/http/axios'
export class Params { export class Params {
/** 当前页数 */
pageNo: number
/** 分页条数 */ /** 分页条数 */
pageSize: number pageSize: number
/** 当前页数 */
pageNo: number
/** 排序字段 */ /** 排序字段 */
sortField?: string sortField?: string
/** 排序方向(ASC|DESC) */ /** 排序方向(ASC|DESC) */
sortOrder?: 'ASC' | 'DESC' sortOrder?: string
} }
export function request( export const init = new defs.ResultPageVoUserVo()
params: Params,
config?: http.RequestConfig<Params>, export function request(params: Params, config?: http.RequestConfig<Params>, options?: http.RequestOptions) {
options?: http.RequestOptions,
): Promise<defs.PageVo<defs.UserVo>> {
return defHttp.request( return defHttp.request(
{ {
url: '/sys/user/page', url: '/sys/user/page',
...@@ -27,6 +27,8 @@ export function request( ...@@ -27,6 +27,8 @@ export function request(
...config, ...config,
}, },
options, {
...options,
},
) )
} }
/** /**
* @desc 获取用户菜单 * @desc 获取用户菜单
*/ */
import * as defs from '../../baseClass'
import { defHttp } from '/@/utils/http/axios' import { defHttp } from '/@/utils/http/axios'
export class Params {} export class Params {}
export function request( export const init = new defs.ResultArrayListMenuVo()
params?: Params,
config?: http.RequestConfig<Params>, export function request(params?: Params, config?: http.RequestConfig<Params>, options?: http.RequestOptions) {
options?: http.RequestOptions,
): Promise<Array<defs.MenuVo>> {
return defHttp.request( return defHttp.request(
{ {
url: '/user/getMenuList', url: '/user/getMenuList',
...@@ -18,6 +18,8 @@ export function request( ...@@ -18,6 +18,8 @@ export function request(
...config, ...config,
}, },
options, {
...options,
},
) )
} }
/** /**
* @desc 获取用户权限 * @desc 获取用户权限
*/ */
import * as defs from '../../baseClass'
import { defHttp } from '/@/utils/http/axios' import { defHttp } from '/@/utils/http/axios'
export class Params {} export class Params {}
export function request( export const init = new defs.ResultArrayListString()
params?: Params,
config?: http.RequestConfig<Params>, export function request(params?: Params, config?: http.RequestConfig<Params>, options?: http.RequestOptions) {
options?: http.RequestOptions,
): Promise<Array<string>> {
return defHttp.request( return defHttp.request(
{ {
url: '/user/getPermCode', url: '/user/getPermCode',
...@@ -18,6 +18,8 @@ export function request( ...@@ -18,6 +18,8 @@ export function request(
...config, ...config,
}, },
options, {
...options,
},
) )
} }
/** /**
* @desc 获取登录用户信息 * @desc 获取登录用户信息
*/ */
import * as defs from '../../baseClass'
import { defHttp } from '/@/utils/http/axios' import { defHttp } from '/@/utils/http/axios'
export class Params {} export class Params {}
export function request( export const init = new defs.ResultUserInfo()
params?: Params,
config?: http.RequestConfig<Params>, export function request(params?: Params, config?: http.RequestConfig<Params>, options?: http.RequestOptions) {
options?: http.RequestOptions,
): Promise<defs.UserInfo> {
return defHttp.request( return defHttp.request(
{ {
url: '/user/getUserInfo', url: '/user/getUserInfo',
...@@ -18,6 +18,8 @@ export function request( ...@@ -18,6 +18,8 @@ export function request(
...config, ...config,
}, },
options, {
...options,
},
) )
} }
import { defHttp } from '/@/utils/http/axios' import { defHttp } from '/@/utils/http/axios'
import { getMenuListResultModel } from './model/menuModel' import type { getMenuListResultModel } from './model/menuModel'
enum Api { enum Api {
GetMenuList = '/user/getMenuList', GetMenuList = '/user/getMenuList',
......
import { UploadApiResult } from './model/uploadModel' import type { UploadApiResult } from './model/uploadModel'
import { defHttp } from '/@/utils/http/axios' import { defHttp } from '/@/utils/http/axios'
import { UploadFileParams } from '/#/axios' import type { UploadFileParams } from '/#/axios'
import { useGlobSetting } from '/@/hooks/setting' import { useGlobSetting } from '/@/hooks/setting'
const { uploadUrl = '' } = useGlobSetting() const { uploadUrl = '' } = useGlobSetting()
......
import { defHttp } from '/@/utils/http/axios' import { defHttp } from '/@/utils/http/axios'
import { LoginParams, LoginResultModel, GetUserInfoModel } from './model/userModel' import type { GetUserInfoModel, LoginParams, LoginResultModel } from './model/userModel'
import { ErrorMessageMode } from '/#/axios' import type { ErrorMessageMode } from '/#/axios'
enum Api { enum Api {
Login = '/auth/login', Login = '/auth/login',
......
<template>
<div v-if="getShowDarkModeToggle" :class="getClass" @click="toggleDarkMode">
<div :class="`${prefixCls}-inner`"></div>
<SvgIcon size="14" name="sun" />
<SvgIcon size="14" name="moon" />
</div>
</template>
<script lang="ts" setup> <script lang="ts" setup>
import { computed, unref } from 'vue' import { computed, unref } from 'vue'
import { SvgIcon } from '/@/components/Icon' import { SvgIcon } from '/@/components/Icon'
...@@ -34,6 +27,15 @@ ...@@ -34,6 +27,15 @@
updateSidebarBgColor() updateSidebarBgColor()
} }
</script> </script>
<template>
<div v-if="getShowDarkModeToggle" :class="getClass" @click="toggleDarkMode">
<div :class="`${prefixCls}-inner`"></div>
<SvgIcon size="14" name="sun" />
<SvgIcon size="14" name="moon" />
</div>
</template>
<style lang="less" scoped> <style lang="less" scoped>
@prefix-cls: ~'@{namespace}-dark-switch'; @prefix-cls: ~'@{namespace}-dark-switch';
......
...@@ -2,25 +2,10 @@ ...@@ -2,25 +2,10 @@
* @Author: Vben * @Author: Vben
* @Description: Multi-language switching component * @Description: Multi-language switching component
--> -->
<template>
<Dropdown
placement="bottom"
:trigger="['click']"
:dropMenuList="localeList"
:selectedKeys="selectedKeys"
@menu-event="handleMenuEvent"
overlayClassName="app-locale-picker-overlay"
>
<span class="cursor-pointer flex items-center">
<Icon icon="ion:language" />
<span v-if="showText" class="ml-1">{{ getLocaleText }}</span>
</span>
</Dropdown>
</template>
<script lang="ts" setup> <script lang="ts" setup>
import type { LocaleType } from '/#/config' import type { LocaleType } from '/#/config'
import type { DropMenu } from '/@/components/Dropdown' import type { DropMenu } from '/@/components/Dropdown'
import { ref, watchEffect, unref, computed } from 'vue' import { computed, ref, unref, watchEffect } from 'vue'
import { Dropdown } from '/@/components/Dropdown' import { Dropdown } from '/@/components/Dropdown'
import { Icon } from '/@/components/Icon' import { Icon } from '/@/components/Icon'
import { useLocale } from '/@/locales/useLocale' import { useLocale } from '/@/locales/useLocale'
...@@ -67,6 +52,22 @@ ...@@ -67,6 +52,22 @@
} }
</script> </script>
<template>
<Dropdown
placement="bottom"
:trigger="['click']"
:dropMenuList="localeList"
:selectedKeys="selectedKeys"
@menu-event="handleMenuEvent"
overlayClassName="app-locale-picker-overlay"
>
<span class="cursor-pointer flex items-center">
<Icon icon="ion:language" />
<span v-if="showText" class="ml-1">{{ getLocaleText }}</span>
</span>
</Dropdown>
</template>
<style lang="less"> <style lang="less">
.app-locale-picker-overlay { .app-locale-picker-overlay {
.ant-dropdown-menu-item { .ant-dropdown-menu-item {
......
...@@ -2,14 +2,6 @@ ...@@ -2,14 +2,6 @@
* @Author: Vben * @Author: Vben
* @Description: logo component * @Description: logo component
--> -->
<template>
<div class="anticon" :class="getAppLogoClass" @click="goHome" :title="version">
<img src="../../../assets/images/logo.png" />
<div class="ml-2 truncate md:opacity-100" :class="getTitleClass" v-show="showTitle">
{{ title }}
</div>
</div>
</template>
<script lang="ts" setup> <script lang="ts" setup>
import { computed, unref } from 'vue' import { computed, unref } from 'vue'
import { useGlobSetting } from '/@/hooks/setting' import { useGlobSetting } from '/@/hooks/setting'
...@@ -60,6 +52,16 @@ ...@@ -60,6 +52,16 @@
go(userStore.getUserInfo.homePath || PageEnum.BASE_HOME) go(userStore.getUserInfo.homePath || PageEnum.BASE_HOME)
} }
</script> </script>
<template>
<div class="anticon" :class="getAppLogoClass" @click="goHome" :title="version">
<img src="../../../assets/images/logo.png" />
<div class="ml-2 truncate md:opacity-100" :class="getTitleClass" v-show="showTitle">
{{ title }}
</div>
</div>
</template>
<style lang="less" scoped> <style lang="less" scoped>
@prefix-cls: ~'@{namespace}-app-logo'; @prefix-cls: ~'@{namespace}-app-logo';
......
<script lang="ts"> <script lang="ts">
import { defineComponent, toRefs, ref, unref } from 'vue' import { defineComponent, ref, toRefs, unref } from 'vue'
import { createAppProviderContext } from './useAppContext' import { createAppProviderContext } from './useAppContext'
import { createBreakpointListen } from '/@/hooks/event/useBreakpoint' import { createBreakpointListen } from '/@/hooks/event/useBreakpoint'
import { prefixCls } from '/@/settings/designSetting' import { prefixCls } from '/@/settings/designSetting'
......
<script lang="ts" setup>
import AppSearchKeyItem from './AppSearchKeyItem.vue'
import { useDesign } from '/@/hooks/web/useDesign'
import { useI18n } from '/@/hooks/web/useI18n'
const { prefixCls } = useDesign('app-search-footer')
const { t } = useI18n()
</script>
<template> <template>
<div :class="`${prefixCls}`"> <div :class="`${prefixCls}`">
<AppSearchKeyItem :class="`${prefixCls}-item`" icon="ant-design:enter-outlined" /> <AppSearchKeyItem :class="`${prefixCls}-item`" icon="ant-design:enter-outlined" />
...@@ -10,13 +18,6 @@ ...@@ -10,13 +18,6 @@
</div> </div>
</template> </template>
<script lang="ts" setup>
import AppSearchKeyItem from './AppSearchKeyItem.vue'
import { useDesign } from '/@/hooks/web/useDesign'
import { useI18n } from '/@/hooks/web/useI18n'
const { prefixCls } = useDesign('app-search-footer')
const { t } = useI18n()
</script>
<style lang="less" scoped> <style lang="less" scoped>
@prefix-cls: ~'@{namespace}-app-search-footer'; @prefix-cls: ~'@{namespace}-app-search-footer';
......
<template>
<span :class="$attrs.class">
<Icon :icon="icon" />
</span>
</template>
<script lang="ts" setup> <script lang="ts" setup>
import { Icon } from '/@/components/Icon' import { Icon } from '/@/components/Icon'
defineProps({ defineProps({
icon: String, icon: String,
}) })
</script> </script>
<template>
<span :class="$attrs.class">
<Icon :icon="icon" />
</span>
</template>
<script lang="ts" setup>
import { computed, nextTick, ref, unref, watch } from 'vue'
import { SearchOutlined } from '@ant-design/icons-vue'
import AppSearchFooter from './AppSearchFooter.vue'
import Icon from '/@/components/Icon'
// @ts-expect-error
import vClickOutside from '/@/directives/clickOutside'
import { useDesign } from '/@/hooks/web/useDesign'
import { useRefs } from '/@/hooks/core/useRefs'
import { useMenuSearch } from './useMenuSearch'
import { useI18n } from '/@/hooks/web/useI18n'
import { useAppInject } from '/@/hooks/web/useAppInject'
const props = defineProps({
visible: { type: Boolean },
})
const emit = defineEmits(['close'])
const scrollWrap = ref(null)
const inputRef = ref<Nullable<HTMLElement>>(null)
const { t } = useI18n()
const { prefixCls } = useDesign('app-search-modal')
const [refs, setRefs] = useRefs()
const { getIsMobile } = useAppInject()
const { handleSearch, searchResult, keyword, activeIndex, handleEnter, handleMouseenter } = useMenuSearch(
refs,
scrollWrap,
emit,
)
const getIsNotData = computed(() => !keyword || unref(searchResult).length === 0)
const getClass = computed(() => {
return [
prefixCls,
{
[`${prefixCls}--mobile`]: unref(getIsMobile),
},
]
})
watch(
() => props.visible,
(visible: boolean) => {
visible &&
nextTick(() => {
unref(inputRef)?.focus()
})
},
)
function handleClose() {
searchResult.value = []
emit('close')
}
</script>
<template> <template>
<Teleport to="body"> <Teleport to="body">
<transition name="zoom-fade" mode="out-in"> <transition name="zoom-fade" mode="out-in">
...@@ -57,65 +117,6 @@ ...@@ -57,65 +117,6 @@
</Teleport> </Teleport>
</template> </template>
<script lang="ts" setup>
import { computed, unref, ref, watch, nextTick } from 'vue'
import { SearchOutlined } from '@ant-design/icons-vue'
import AppSearchFooter from './AppSearchFooter.vue'
import Icon from '/@/components/Icon'
// @ts-ignore
import vClickOutside from '/@/directives/clickOutside'
import { useDesign } from '/@/hooks/web/useDesign'
import { useRefs } from '/@/hooks/core/useRefs'
import { useMenuSearch } from './useMenuSearch'
import { useI18n } from '/@/hooks/web/useI18n'
import { useAppInject } from '/@/hooks/web/useAppInject'
const props = defineProps({
visible: { type: Boolean },
})
const emit = defineEmits(['close'])
const scrollWrap = ref(null)
const inputRef = ref<Nullable<HTMLElement>>(null)
const { t } = useI18n()
const { prefixCls } = useDesign('app-search-modal')
const [refs, setRefs] = useRefs()
const { getIsMobile } = useAppInject()
const { handleSearch, searchResult, keyword, activeIndex, handleEnter, handleMouseenter } = useMenuSearch(
refs,
scrollWrap,
emit,
)
const getIsNotData = computed(() => !keyword || unref(searchResult).length === 0)
const getClass = computed(() => {
return [
prefixCls,
{
[`${prefixCls}--mobile`]: unref(getIsMobile),
},
]
})
watch(
() => props.visible,
(visible: boolean) => {
visible &&
nextTick(() => {
unref(inputRef)?.focus()
})
},
)
function handleClose() {
searchResult.value = []
emit('close')
}
</script>
<style lang="less" scoped> <style lang="less" scoped>
@prefix-cls: ~'@{namespace}-app-search-modal'; @prefix-cls: ~'@{namespace}-app-search-modal';
@footer-prefix-cls: ~'@{namespace}-app-search-footer'; @footer-prefix-cls: ~'@{namespace}-app-search-footer';
......
import type { Menu } from '/@/router/types' import type { Menu } from '/@/router/types'
import { ref, onBeforeMount, unref, Ref, nextTick } from 'vue' import type { Ref } from 'vue'
import { nextTick, onBeforeMount, ref, unref } from 'vue'
import { getMenus } from '/@/router/menus' import { getMenus } from '/@/router/menus'
import { cloneDeep } from 'lodash-es' import { cloneDeep } from 'lodash-es'
import { filter, forEach } from '/@/utils/helper/treeHelper' import { filter, forEach } from '/@/utils/helper/treeHelper'
......
import { InjectionKey, Ref } from 'vue' import type { InjectionKey, Ref } from 'vue'
import { createContext, useContext } from '/@/hooks/core/useContext' import { createContext, useContext } from '/@/hooks/core/useContext'
export interface AppProviderContextProps { export interface AppProviderContextProps {
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论