提交 d352d4aa 作者: 方治民

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

......@@ -14,11 +14,12 @@ VITE_DROP_CONSOLE = false
# Basic interface address SPA
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
VITE_GLOB_API_URL_PREFIX=
# VITE_GLOB_API_URL_PREFIX=/api
# 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 = {
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: {
'vue/script-setup-uses-vars': 'error',
'@typescript-eslint/ban-ts-ignore': 'off',
......@@ -69,5 +74,9 @@ module.exports = {
],
'vue/multi-word-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": [
"vue.volar",
"dbaeumer.vscode-eslint",
"stylelint.vscode-stylelint",
"DavidAnson.vscode-markdownlint",
"esbenp.prettier-vscode",
"mrmlnc.vscode-less",
"lokalise.i18n-ally",
"EditorConfig.EditorConfig",
"antfu.unocss",
"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",
"heybourn.headwind"
"redhat.vscode-yaml",
"eamodio.gitlens",
"christian-kohler.path-intellisense",
"IBM.output-colorizer",
"PKief.material-icon-theme"
]
}
{
"typescript.tsdk": "./node_modules/typescript/lib",
"volar.tsPlugin": true,
"volar.tsPluginStatus": false,
"npm.packageManager": "pnpm",
"editor.tabSize": 2,
"editor.defaultFormatter": "esbenp.prettier-vscode",
"editor.tabSize": 4,
"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": {
"**/node_modules": true,
"**/*.log": true,
......@@ -29,7 +81,8 @@
"res": true,
"screenshots": true,
"yarn-error.log": true,
"**/.yarn": true
"**/.yarn": true,
"**/.pnpm": true
},
"files.exclude": {
"**/.cache": true,
......@@ -52,95 +105,7 @@
"**/tmp/**": true,
"**/bower_components/**": true,
"**/dist/**": true,
"**/yarn.lock": 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
"**/yarn.lock": true,
"**/pnpm-lock.yaml": 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) {
return [...lightColors, ...modeColors]
}
export function generateColors({
color = primaryColor,
mixLighten,
mixDarken,
tinycolor,
}: GenerateColorsParams) {
export function generateColors({ color = primaryColor, mixLighten, mixDarken, tinycolor }: GenerateColorsParams) {
const arr = new Array(19).fill(0)
const lightens = arr.map((_t, i) => {
return mixLighten(color, i / 5)
......
......@@ -2,5 +2,3 @@
* The name of the configuration file entered in the production environment
*/
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 { getThemeVariables } from 'ant-design-vue/dist/theme'
import { resolve } from 'path'
/**
* less global variable
......@@ -28,7 +28,7 @@ export function generateModifyVars(dark = false) {
'success-color': '#55D187', // Success color
'error-color': '#ED6F6F', // False color
'warning-color': '#EFBD47', // Warning color
//'border-color-base': '#EEEEEE',
// 'border-color-base': '#EEEEEE',
'font-size-base': '14px', // Main font size
'border-radius-base': '2px', // Component/float fillet
'link-color': primary, // Link color
......
import path from 'path'
import path from 'node:path'
import fs from 'fs-extra'
import inquirer from 'inquirer'
import colors from 'picocolors'
......@@ -30,7 +30,7 @@ async function generateIcon() {
{
type: 'list',
name: 'iconSet',
choices: choices,
choices,
message: 'Select the icon set that needs to be generated?',
},
{
......@@ -51,25 +51,17 @@ async function generateIcon() {
if (data) {
const { prefix } = data
const isLocal = useType === 'local'
const icons = Object.keys(data.icons).map(
(item) => `${isLocal ? prefix + ':' : ''}${item}`,
)
const icons = Object.keys(data.icons).map((item) => `${isLocal ? `${prefix}:` : ''}${item}`)
await fs.writeFileSync(
path.join(output, `icons.data.ts`),
`export default ${
isLocal ? JSON.stringify(icons) : JSON.stringify({ prefix, icons })
}`,
`export default ${isLocal ? JSON.stringify(icons) : JSON.stringify({ prefix, icons })}`,
)
prefixSet.push(prefix)
}
}
fs.emptyDir(path.join(process.cwd(), 'node_modules/.vite'))
console.log(
`✨ ${colors.cyan(`[${pkg.name}]`)}` +
' - Icon generated successfully:' +
`[${prefixSet}]`,
)
console.log(`✨ ${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 path from 'path'
import fs from 'node:fs'
import path from 'node:path'
import dotenv from 'dotenv'
export function isDevFn(mode: string): boolean {
......@@ -50,7 +50,7 @@ export function wrapperEnv(envConf: Recordable): ViteEnv {
*/
function getConfFiles() {
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
if (result) {
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 vueJsx from '@vitejs/plugin-vue-jsx'
import legacy from '@vitejs/plugin-legacy'
......@@ -15,6 +15,7 @@ import { configVisualizerConfig } from './visualizer'
import { configThemePlugin } from './theme'
import { configSvgIconsPlugin } from './svgSprite'
import { configAutoImportPlugin } from './autoImport'
import { configBuildPlugin } from './config'
export function createVitePlugins(viteEnv: ViteEnv, isBuild: boolean) {
const { VITE_USE_MOCK, VITE_LEGACY, VITE_BUILD_COMPRESS, VITE_BUILD_COMPRESS_DELETE_ORIGIN_FILE } = viteEnv
......@@ -63,14 +64,17 @@ export function createVitePlugins(viteEnv: ViteEnv, isBuild: boolean) {
// The following plugins only work in the production environment
if (isBuild) {
// vite-plugin-imagemin
// config
vitePlugins.push(configBuildPlugin())
if (process.env.RUNTIME !== 'electron') {
// rollup-plugin-gzip
vitePlugins.push(configCompressPlugin(VITE_BUILD_COMPRESS, VITE_BUILD_COMPRESS_DELETE_ORIGIN_FILE))
// vite-plugin-pwa
vitePlugins.push(configPwaConfig(viteEnv))
}
}
return vitePlugins
}
......@@ -70,7 +70,7 @@ export function configStyleImportPlugin(_isBuild: boolean) {
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/${name}/style/index`
},
......
......@@ -3,8 +3,8 @@
* https://github.com/anncwb/vite-plugin-svg-icons
*/
import path from 'node:path'
import { createSvgIconsPlugin } from 'vite-plugin-svg-icons'
import path from 'path'
export function configSvgIconsPlugin(isBuild: boolean) {
const svgIconsPlugin = createSvgIconsPlugin({
......
......@@ -2,16 +2,10 @@
* Vite plugin for website theme color switching
* https://github.com/anncwb/vite-plugin-theme
*/
import path from 'node:path'
import type { PluginOption } from 'vite'
import path from 'path'
import {
viteThemePlugin,
antdDarkThemePlugin,
mixLighten,
mixDarken,
tinycolor,
} from 'vite-plugin-theme'
import { getThemeColors, generateColors } from '../../config/themeConfig'
import { antdDarkThemePlugin, mixDarken, mixLighten, tinycolor, viteThemePlugin } from 'vite-plugin-theme'
import { generateColors, getThemeColors } from '../../config/themeConfig'
import { generateModifyVars } from '../../generate/generateModifyVars'
export function configThemePlugin(isBuild: boolean): PluginOption[] {
......@@ -48,7 +42,7 @@ export function configThemePlugin(isBuild: boolean): PluginOption[] {
antdDarkThemePlugin({
preloadFiles: [
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'),
],
filter: (id) => (isBuild ? !id.endsWith('antd.less') : true),
......
......@@ -22,7 +22,7 @@ export function createProxy(list: ProxyList = []) {
// https://github.com/http-party/node-http-proxy#options
ret[prefix] = {
target: target,
target,
changeOrigin: true,
ws: true,
rewrite: (path) => path.replace(new RegExp(`^${prefix}`), ''),
......
......@@ -8,14 +8,14 @@
name="viewport"
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" />
</head>
<body>
<script>
;(() => {
var htmlRoot = document.getElementById('htmlRoot')
var theme = window.localStorage.getItem('__APP__DARK__MODE__')
let htmlRoot = document.getElementById('htmlRoot')
let theme = window.localStorage.getItem('__APP__DARK__MODE__')
if (htmlRoot && theme) {
htmlRoot.setAttribute('data-theme', theme)
theme = htmlRoot = null
......@@ -150,7 +150,7 @@
<div class="app-loading-dots">
<span class="dot dot-spin"><i></i><i></i><i></i><i></i></span>
</div>
<div class="app-loading-title"><%= title %></div>
<div class="app-loading-title">%VITE_GLOB_APP_TITLE%</div>
</div>
</div>
</div>
......
import dayjs from 'dayjs'
import { MockMethod } from 'vite-plugin-mock'
import type { MockMethod } from 'vite-plugin-mock'
/**
* 构建 URL 请求地址
......@@ -68,7 +68,7 @@ export class Response {
export class Request {
method: string
body: any
headers?: { authorization?: string }
headers?: { ['app-token']?: string }
query: any
/**
......@@ -77,6 +77,6 @@ export class Request {
* @returns token
*/
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 * as HTTP from '../../src/api/types'
......
import { MockMethod } from 'vite-plugin-mock'
import type { MockMethod } from 'vite-plugin-mock'
import { Response } from '../_util'
const areaList: any[] = [
......
import { MockMethod } from 'vite-plugin-mock'
import type { MockMethod } from 'vite-plugin-mock'
import { Response } from '../_util'
const demoList = (keyword, count = 20) => {
......
import { MockMethod } from 'vite-plugin-mock'
import type { MockMethod } from 'vite-plugin-mock'
import { Response } from '../_util'
const accountList = (() => {
......@@ -101,12 +101,11 @@ const menuList = (() => {
children.push({
id: `${index}-${j}-${k}`,
type: '2',
menuName: '按钮' + (j + 1) + '-' + (k + 1),
menuName: `按钮${j + 1}-${k + 1}`,
icon: '',
permission:
['menu1:view', 'menu2:add', 'menu3:update', 'menu4:del'][index] +
':btn' +
(k + 1),
permission: `${
['menu1:view', 'menu2:add', 'menu3:update', 'menu4:del'][index]
}:btn${k + 1}`,
component: [
'/dashboard/welcome/index',
'/dashboard/workbench/index',
......@@ -192,7 +191,7 @@ export default [
method: 'post',
response: ({ body }) => {
const { account } = body || {}
if (account && account.indexOf('admin') !== -1) {
if (account && account.includes('admin')) {
return Response.no('该字段不能包含admin')
} else {
return Response.ok(`${account} can use`)
......
import { MockMethod } from 'vite-plugin-mock'
import type { MockMethod } from 'vite-plugin-mock'
import { Random } from 'mockjs'
import { Response } from '../_util'
......
import { MockMethod } from 'vite-plugin-mock'
import type { MockMethod } from 'vite-plugin-mock'
import { Response } from '../_util'
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 { Response, Request } from '../_util'
// single
const dashboardRoute = {
......@@ -241,11 +241,11 @@ export default [
let menu: Object[]
switch (id) {
case '1':
dashboardRoute.redirect = dashboardRoute.path + '/' + dashboardRoute.children[0].path
dashboardRoute.redirect = `${dashboardRoute.path}/${dashboardRoute.children[0].path}`
menu = [dashboardRoute, authRoute, levelRoute, sysRoute, linkRoute]
break
case '2':
dashboardRoute.redirect = dashboardRoute.path + '/' + dashboardRoute.children[1].path
dashboardRoute.redirect = `${dashboardRoute.path}/${dashboardRoute.children[1].path}`
menu = [dashboardRoute, authRoute, levelRoute, linkRoute]
break
default:
......
import { IncomingMessage } from 'http'
import type { IncomingMessage } from 'node:http'
import Mock from 'mockjs'
import qs from 'qs'
import { MockMethod } from 'vite-plugin-mock'
import { Response, Request } from '../_util'
import type { MockMethod } from 'vite-plugin-mock'
import { Request, Response } from '../_util'
const parseFormParams = (req: IncomingMessage): Promise<Recordable> => {
return new Promise((resolve) => {
......@@ -12,7 +12,6 @@ const parseFormParams = (req: IncomingMessage): Promise<Recordable> => {
})
req.on('end', function () {
resolve(qs.parse(body) as any)
return
})
})
}
......
{
"name": "basic-vue-admin",
"version": "3.0.1",
"version": "3.0.2",
"description": "Basic Vue Admin (Template)",
"keywords": [
"vue",
......@@ -25,9 +25,11 @@
"bootstrap": "pnpm install",
"serve": "npm run dev",
"dev": "vite",
"build": "cross-env NODE_ENV=production vite build && esno ./build/script/postBuild.ts",
"build:test": "cross-env vite build --mode test && esno ./build/script/postBuild.ts",
"build:preview": "cross-env vite build --mode preview && esno ./build/script/postBuild.ts",
"dev:app": "tauri dev",
"build:app": "tauri build",
"build": "vite build",
"build:test": "vite build --mode test",
"build:preview": "vite build --mode preview",
"build:no-cache": "pnpm clean:cache && npm run build",
"report": "cross-env REPORT=true npm run build",
"type:check": "vue-tsc --noEmit --skipLibCheck",
......@@ -54,130 +56,136 @@
}
},
"dependencies": {
"@ant-design/colors": "^6.0.0",
"@ant-design/colors": "^7.0.0",
"@ant-design/icons-vue": "^6.1.0",
"@iconify/iconify": "^2.2.1",
"@logicflow/core": "^1.1.31",
"@logicflow/extension": "^1.1.31",
"@stomp/stompjs": "^6.1.2",
"@iconify/iconify": "^3.1.0",
"@logicflow/core": "^1.2.1",
"@logicflow/extension": "^1.2.1",
"@stomp/stompjs": "^7.0.0",
"@tauri-apps/api": "^1.2.0",
"@vue/runtime-core": "^3.2.45",
"@vue/shared": "^3.2.45",
"@vueuse/core": "^9.5.0",
"@vueuse/shared": "^9.5.0",
"@zxcvbn-ts/core": "^2.1.0",
"ant-design-vue": "^3.2.15",
"@vue/runtime-core": "^3.2.47",
"@vue/shared": "^3.2.47",
"@vueuse/core": "^9.13.0",
"@vueuse/shared": "^9.13.0",
"@zxcvbn-ts/core": "^2.2.1",
"ant-design-vue": "^3.2.16",
"axios": "^0.26.1",
"codemirror": "^6.0.1",
"cropperjs": "^1.5.12",
"cropperjs": "^1.5.13",
"crypto-js": "^4.1.1",
"dayjs": "^1.11.6",
"echarts": "^5.4.0",
"intro.js": "^5.1.0",
"dayjs": "^1.11.7",
"default-passive-events": "^2.0.0",
"echarts": "^5.4.2",
"intro.js": "^6.0.0",
"js-file-download": "^0.4.12",
"lodash-es": "^4.17.21",
"mockjs": "^1.1.0",
"nanoid": "^4.0.0",
"nanoid": "^4.0.2",
"nprogress": "^0.2.0",
"path-to-regexp": "^6.2.1",
"pinia": "^2.0.23",
"pinia": "^2.0.33",
"print-js": "^1.6.0",
"qrcode": "^1.5.1",
"qs": "^6.11.0",
"qs": "^6.11.1",
"resize-observer-polyfill": "^1.5.1",
"showdown": "^2.1.0",
"sockjs-client": "^1.6.1",
"sortablejs": "^1.15.0",
"stompjs": "^2.3.3",
"tinymce": "^5.10.6",
"vditor": "^3.8.18",
"vue": "^3.2.45",
"tinymce": "^5.10.7",
"vditor": "^3.9.1",
"vue": "^3.2.47",
"vue-i18n": "^9.2.2",
"vue-json-pretty": "^2.2.3",
"vue-json-pretty": "^2.2.4",
"vue-router": "^4.1.6",
"vue-types": "^4.2.1",
"vue-types": "^5.0.2",
"xlsx": "^0.18.5"
},
"devDependencies": {
"@commitlint/cli": "^17.2.0",
"@commitlint/config-conventional": "^17.2.0",
"@iconify/json": "^2.1.137",
"@purge-icons/generated": "^0.8.1",
"@tauri-apps/cli": "^1.2.0",
"@types/codemirror": "^5.60.5",
"@antfu/eslint-config": "^0.37.0",
"@commitlint/cli": "^17.5.1",
"@commitlint/config-conventional": "^17.4.4",
"@iconify/json": "^2.2.42",
"@purge-icons/generated": "^0.9.0",
"@tauri-apps/cli": "^1.2.3",
"@types/codemirror": "^5.60.7",
"@types/crypto-js": "^4.1.1",
"@types/fs-extra": "^9.0.13",
"@types/fs-extra": "^11.0.1",
"@types/inquirer": "^9.0.3",
"@types/intro.js": "^3.0.2",
"@types/lodash-es": "^4.17.6",
"@types/intro.js": "^5.1.1",
"@types/lodash": "^4.14.192",
"@types/lodash-es": "^4.17.7",
"@types/mockjs": "^1.0.7",
"@types/node": "^18.11.9",
"@types/node": "^18.15.11",
"@types/nprogress": "^0.2.0",
"@types/qrcode": "^1.5.0",
"@types/qs": "^6.9.7",
"@types/showdown": "^1.9.4",
"@types/showdown": "^2.0.0",
"@types/sockjs-client": "^1.5.1",
"@types/sortablejs": "^1.15.0",
"@types/sortablejs": "^1.15.1",
"@types/stompjs": "^2.3.5",
"@typescript-eslint/eslint-plugin": "^5.42.1",
"@typescript-eslint/parser": "^5.42.1",
"@vitejs/plugin-legacy": "^2.3.1",
"@vitejs/plugin-vue": "^3.2.0",
"@vitejs/plugin-vue-jsx": "^1.3.10",
"@vue/compiler-sfc": "3.2.31",
"@vue/test-utils": "^2.2.2",
"autoprefixer": "^10.4.13",
"commitizen": "^4.2.5",
"@typescript-eslint/eslint-plugin": "^5.57.0",
"@typescript-eslint/parser": "^5.57.0",
"@vitejs/plugin-legacy": "^4.0.2",
"@vitejs/plugin-vue": "^4.1.0",
"@vitejs/plugin-vue-jsx": "^3.0.1",
"@vue/compiler-dom": "^3.2.47",
"@vue/compiler-sfc": "^3.2.47",
"@vue/test-utils": "^2.3.2",
"autoprefixer": "^10.4.14",
"commitizen": "^4.3.0",
"conventional-changelog-cli": "^2.2.2",
"cross-env": "^7.0.3",
"cz-conventional-changelog": "^3.3.0",
"cz-git": "^1.3.12",
"czg": "^1.3.12",
"cz-git": "^1.6.1",
"czg": "^1.6.1",
"dotenv": "^16.0.3",
"eslint": "^8.27.0",
"eslint-config-prettier": "^8.5.0",
"eslint": "^8.37.0",
"eslint-config-prettier": "^8.8.0",
"eslint-plugin-prettier": "^4.2.1",
"eslint-plugin-vue": "^9.7.0",
"esno": "^0.14.1",
"fs-extra": "^10.1.0",
"husky": "^7.0.4",
"inquirer": "^9.1.4",
"eslint-plugin-vue": "^9.10.0",
"esno": "^0.16.3",
"fs-extra": "^11.1.1",
"husky": "^8.0.3",
"inquirer": "^9.1.5",
"less": "^4.1.3",
"lint-staged": "12.3.7",
"lint-staged": "^13.2.0",
"lodash": "^4.17.21",
"npm-run-all": "^4.1.5",
"picocolors": "^1.0.0",
"pont-engine": "^1.5.3",
"postcss": "^8.4.19",
"pont-engine": "^1.5.7",
"postcss": "^8.4.21",
"postcss-html": "^1.5.0",
"postcss-less": "^6.0.0",
"prettier": "^2.7.1",
"rimraf": "^3.0.2",
"prettier": "^2.8.7",
"rimraf": "^4.4.1",
"rollup": "^2.79.1",
"rollup-plugin-visualizer": "^5.8.3",
"sort-package-json": "^1.57.0",
"stylelint": "^14.15.0",
"stylelint-config-prettier": "^9.0.4",
"rollup-plugin-visualizer": "^5.9.0",
"sort-package-json": "^2.4.1",
"stylelint": "^14.16.1",
"stylelint-config-prettier": "^9.0.5",
"stylelint-config-recommended": "^9.0.0",
"stylelint-config-recommended-vue": "^1.4.0",
"stylelint-config-standard": "^29.0.0",
"stylelint-order": "^5.0.0",
"terser": "^5.15.1",
"terser": "^5.16.8",
"ts-node": "^10.9.1",
"typescript": "^4.8.4",
"unplugin-auto-import": "^0.11.4",
"vite": "^3.2.3",
"typescript": "^4.9.5",
"unplugin-auto-import": "^0.12.2",
"vite": "^4.2.1",
"vite-plugin-compression": "^0.5.1",
"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-purge-icons": "^0.9.1",
"vite-plugin-pwa": "^0.13.3",
"vite-plugin-purge-icons": "^0.9.2",
"vite-plugin-pwa": "^0.14.7",
"vite-plugin-style-import": "^2.0.0",
"vite-plugin-svg-icons": "^2.0.1",
"vite-plugin-theme": "^0.8.6",
"vite-plugin-vue-setup-extend": "^0.4.0",
"vite-plugin-windicss": "^1.8.8",
"vue-eslint-parser": "^9.1.0",
"vue-tsc": "^1.0.9"
"vite-plugin-windicss": "^1.8.10",
"vue-eslint-parser": "^9.1.1",
"vue-tsc": "^1.2.0"
},
"engines": {
"node": ">=14"
......
This source diff could not be displayed because it is too large. You can view the blob instead.
{
"originType": "SwaggerV2",
"originUrl": "http://127.0.0.1:8081/api/v2/api-docs",
"originType": "SwaggerV3",
"originUrl": "http://127.0.0.1:8081/api/v3/api-docs",
"templateType": "fetch",
"templatePath": "./pont-template",
"transformPath": "./pont-transform",
"outDir": "./src/api/services",
"surrounding": "typeScript",
"usingOperationId": true,
"mocks": {
"enable": true,
"basePath": "",
......
import * as Pont from 'pont-engine'
import { Interface, BaseClass, Property, CodeGenerator } from 'pont-engine'
// import * as Pont from 'pont-engine'
import type { BaseClass, Interface } from 'pont-engine'
import { CodeGenerator, Property } from 'pont-engine'
// 接口 API 前缀
// 通常与项目的 env 配置中的 VITE_GLOB_API_URL_PREFIX 相同
const API_URL_PREFIX = '/api'
export class FileStructures extends Pont.FileStructures {
getModsDeclaration(originCode: string): string {
return originCode
}
}
export default class BasicGenerator extends CodeGenerator {
checkJsonParam(inter: Interface, paramsCode: string): boolean {
isRequestBody(inter: Interface, paramsCode: string): boolean {
const prettier = require('prettier')
const requestParams = inter.getRequestParams(this.surrounding)
const code = prettier.format(paramsCode, { parser: 'typescript' })
return code.includes('{}') && requestParams.includes('body')
}
// 认为没有返回值的接口表示下载(通常是)
isDownload(inter: Interface): boolean {
return inter.responseType === 'any'
}
// 认为包含 form 参数的接口表示带有上传功能
isUpload(inter: Interface): boolean {
return inter.getRequestParams(this.surrounding).includes('form')
......@@ -40,15 +30,16 @@ export default class BasicGenerator extends CodeGenerator {
}
if (requestParams.includes('body')) {
requestParams = requestParams.replace('params?: Params, ', '')
bodyTypeDef = requestParams.replace(/^.*body: (.*),.*$/gi, '$1')
requestParams = requestParams.replace('params?: Params, ', '')
requestParams = requestParams.replace('body:', 'body?:')
}
}
return `${requestParams.replace(
'options?: any',
`config?: http.RequestConfig<${
bodyTypeDef ? bodyTypeDef : `Params${requestParams.includes('form') ? ' | FormData' : ''}`
bodyTypeDef || `Params${requestParams.includes('form') ? ' | FormData' : ''}`
}>`,
)}, options?: http.RequestOptions`
}
......@@ -56,11 +47,18 @@ export default class BasicGenerator extends CodeGenerator {
getInterfaceContentInDeclaration(inter: Interface) {
const paramsCode = inter.getParamsCode('Params')
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 `
export ${paramsCode}
export type Response = ${inter.responseType.replace(/defs.Result\<(.*)\>/, '$1')};
export type Response = ${targetResponseType};
export const init: Response;
......@@ -88,8 +86,10 @@ export default class BasicGenerator extends CodeGenerator {
const method = inter.method.toUpperCase()
const paramsCode = inter.getParamsCode('Params', this.surrounding)
const requestParams = this.getParams(inter, paramsCode)
const isBody = this.checkJsonParam(inter, paramsCode)
const responseType = `Promise<${inter.responseType.replace(/defs.Result\<(.*)\>/, '$1') || 'any'}>`
const initValue = inter.response.getInitialValue(true)
const undef = initValue === 'undefined' || initValue === `''`
const isBody = this.isRequestBody(inter, paramsCode)
const isDownload = inter.responseType === 'File'
// TODO
// 扩展 hooks mode
......@@ -99,11 +99,15 @@ export default class BasicGenerator extends CodeGenerator {
/**
* @desc ${inter.description}
*/
${undef ? '' : `import * as defs from '../../baseClass';`}
import { defHttp } from '/@/utils/http/axios'
${isBody ? '' : `export ${paramsCode}`}
export function request(${requestParams}): ${responseType} {
${undef ? '' : `export const init = ${initValue};`}
export function request(${requestParams}) {
return defHttp.request({
url: "${inter.path.replace(API_URL_PREFIX, '')}",
method: '${method}',
......@@ -116,12 +120,24 @@ export default class BasicGenerator extends CodeGenerator {
requestParams.includes('form')
? `headers: { 'Content-Type': 'multipart/form-data;charset=UTF-8' },`
: isBody
? `headers: { 'Content-Type': 'application/json;charset=UTF-8' },`
? `headers: { 'Content-Type': 'application/json' },`
: ''
}
${
isDownload
? `
responseType: 'blob',
timeout: 0,
`
: ''
}
...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
}
......@@ -3,88 +3,8 @@
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() {
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!())
.expect("error while running tauri application");
}
<template>
<ConfigProvider :locale="getAntdLocale">
<AppProvider>
<RouterView />
</AppProvider>
</ConfigProvider>
</template>
<script lang="ts" setup>
import { ConfigProvider } from 'ant-design-vue'
import { AppProvider } from '/@/components/Application'
......@@ -19,3 +11,11 @@
// Listening to page changes and dynamically changing site titles
useTitle()
</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 登录
*/
import * as defs from '../../baseClass'
import { defHttp } from '/@/utils/http/axios'
export class Params {
......@@ -10,11 +12,9 @@ export class Params {
password: string
}
export function request(
params: Params,
config?: http.RequestConfig<Params>,
options?: http.RequestOptions,
): Promise<defs.LoginVo> {
export const init = new defs.ResultLoginVo()
export function request(params: Params, config?: http.RequestConfig<Params>, options?: http.RequestOptions) {
return defHttp.request(
{
url: '/auth/login',
......@@ -23,6 +23,8 @@ export function request(
...config,
},
options,
{
...options,
},
)
}
/**
* @desc 登出
*/
import * as defs from '../../baseClass'
import { defHttp } from '/@/utils/http/axios'
export class Params {}
export function request(
params?: Params,
config?: http.RequestConfig<Params>,
options?: http.RequestOptions,
): Promise<string> {
export const init = new defs.ResultString()
export function request(params?: Params, config?: http.RequestConfig<Params>, options?: http.RequestOptions) {
return defHttp.request(
{
url: '/auth/logout',
......@@ -18,6 +18,8 @@ export function request(
...config,
},
options,
{
...options,
},
)
}
/**
* @desc 注册
*/
import * as defs from '../../baseClass'
import { defHttp } from '/@/utils/http/axios'
export class Params {
/** 用户名 */
username: string
/** 密码 */
password: string
/** 真实姓名 */
realName: string
/** 手机号 */
mobile: string
/** 头像 */
avatar?: string
/** 邮箱 */
email?: string
/** 是否启用 */
enable?: boolean
/** 简介 */
introduction?: string
/** 手机号 */
mobile: string
/** 密码 */
password: string
/** 真实姓名 */
realName: string
/** 用户名 */
username: string
}
export function request(
params: Params,
config?: http.RequestConfig<Params>,
options?: http.RequestOptions,
): Promise<string> {
export const init = new defs.ResultString()
export function request(params: Params, config?: http.RequestConfig<Params>, options?: http.RequestOptions) {
return defHttp.request(
{
url: '/auth/register',
......@@ -35,6 +33,8 @@ export function request(
...config,
},
options,
{
...options,
},
)
}
/**
* @desc 安全校验
* @desc 安全验证
*/
import * as defs from '../../baseClass'
import { defHttp } from '/@/utils/http/axios'
export class Params {
......@@ -8,11 +10,9 @@ export class Params {
password: string
}
export function request(
params: Params,
config?: http.RequestConfig<Params>,
options?: http.RequestOptions,
): Promise<string> {
export const init = new defs.ResultString()
export function request(params: Params, config?: http.RequestConfig<Params>, options?: http.RequestOptions) {
return defHttp.request(
{
url: '/auth/safe',
......@@ -21,6 +21,8 @@ export function request(
...config,
},
options,
{
...options,
},
)
}
/**
* @desc 检查登录
*/
import * as defs from '../../baseClass'
import { defHttp } from '/@/utils/http/axios'
export class Params {}
export function request(
params?: Params,
config?: http.RequestConfig<Params>,
options?: http.RequestOptions,
): Promise<boolean> {
export const init = new defs.ResultBoolean()
export function request(params?: Params, config?: http.RequestConfig<Params>, options?: http.RequestOptions) {
return defHttp.request(
{
url: '/auth/valid',
......@@ -18,6 +18,8 @@ export function request(
...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 删除
*/
import * as defs from '../../baseClass'
import { defHttp } from '/@/utils/http/axios'
export class Params {
......@@ -8,19 +10,19 @@ export class Params {
ids: string
}
export function request(
params: Params,
config?: http.RequestConfig<Params>,
options?: http.RequestOptions,
): Promise<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/deleted',
url: '/sys/dict/remove',
method: 'POST',
data: params,
...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 文件下载
*/
import { defHttp } from '/@/utils/http/axios'
export class Params {}
export function request(
params?: Params,
config?: http.RequestConfig<Params>,
options?: http.RequestOptions,
): Promise<any> {
export function request(params?: Params, config?: http.RequestConfig<Params>, options?: http.RequestOptions) {
return defHttp.request(
{
url: '/example/download',
method: 'GET',
params,
responseType: 'blob',
timeout: 0,
...config,
},
options,
{
download: true,
...options,
},
)
}
/**
* @desc 测试失败
*/
import * as defs from '../../baseClass'
import { defHttp } from '/@/utils/http/axios'
export class Params {}
export function request(
params?: Params,
config?: http.RequestConfig<Params>,
options?: http.RequestOptions,
): Promise<string> {
export const init = new defs.ResultString()
export function request(params?: Params, config?: http.RequestConfig<Params>, options?: http.RequestOptions) {
return defHttp.request(
{
url: '/example/fail',
......@@ -18,6 +18,8 @@ export function request(
...config,
},
options,
{
...options,
},
)
}
/**
* @desc 查询用户属性
*/
import * as defs from '../../baseClass'
import { defHttp } from '/@/utils/http/axios'
export class Params {}
export function request(
params?: Params,
config?: http.RequestConfig<Params>,
options?: http.RequestOptions,
): Promise<defs.UserExtensionVo> {
export const init = new defs.ResultUserExtensionVo()
export function request(params?: Params, config?: http.RequestConfig<Params>, options?: http.RequestOptions) {
return defHttp.request(
{
url: '/example/findUserExtensionInfo',
......@@ -18,6 +18,8 @@ export function request(
...config,
},
options,
{
...options,
},
)
}
/**
* @desc Hello World
*/
import * as defs from '../../baseClass'
import { defHttp } from '/@/utils/http/axios'
export class Params {}
export function request(
params?: Params,
config?: http.RequestConfig<Params>,
options?: http.RequestOptions,
): Promise<string> {
export const init = new defs.ResultString()
export function request(params?: Params, config?: http.RequestConfig<Params>, options?: http.RequestOptions) {
return defHttp.request(
{
url: '/example/',
......@@ -18,6 +18,8 @@ export function request(
...config,
},
options,
{
...options,
},
)
}
......@@ -7,5 +7,6 @@ import * as fail from './fail'
import * as findUserExtensionInfo from './findUserExtensionInfo'
import * as json from './json'
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 传参
*/
import * as defs from '../../baseClass'
import { defHttp } from '/@/utils/http/axios'
export const init = new defs.ResultPageVoString()
export function request(
body: defs.PageParam,
body?: defs.PageParam,
config?: http.RequestConfig<defs.PageParam>,
options?: http.RequestOptions,
): Promise<defs.PageVo<string>> {
) {
return defHttp.request(
{
url: '/example/json',
......@@ -17,6 +21,8 @@ export function request(
...config,
},
options,
{
...options,
},
)
}
/**
* @desc 分页条件查询
*/
import * as defs from '../../baseClass'
import { defHttp } from '/@/utils/http/axios'
export class Params {
/** 当前页数 */
pageNo: number
/** 分页条数 */
pageSize: number
/** 当前页数 */
pageNo: number
/** 排序字段 */
sortField?: string
/** 排序方向(ASC|DESC) */
sortOrder?: 'ASC' | 'DESC'
sortOrder?: string
}
export function request(
params: Params,
config?: http.RequestConfig<Params>,
options?: http.RequestOptions,
): Promise<defs.PageVo<string>> {
export const init = new defs.ResultPageVoString()
export function request(params: Params, config?: http.RequestConfig<Params>, options?: http.RequestOptions) {
return defHttp.request(
{
url: '/example/page',
......@@ -27,6 +27,8 @@ export function request(
...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 文件下载
*/
import { defHttp } from '/@/utils/http/axios'
export class Params {
......@@ -10,19 +11,22 @@ export class Params {
object: string
}
export function request(
params: Params,
config?: http.RequestConfig<Params>,
options?: http.RequestOptions,
): Promise<any> {
export function request(params: Params, config?: http.RequestConfig<Params>, options?: http.RequestOptions) {
return defHttp.request(
{
url: '/common/file/download',
method: 'GET',
params,
responseType: 'blob',
timeout: 0,
...config,
},
options,
{
download: true,
...options,
},
)
}
/**
* @desc 文件上传
*/
import * as defs from '../../baseClass'
import { defHttp } from '/@/utils/http/axios'
export class Params {}
export const init = new defs.ResultString()
export function request(
params: Params,
form: FormData,
config?: http.RequestConfig<Params | FormData>,
options?: http.RequestOptions,
): Promise<string> {
export function request(body?: object, config?: http.RequestConfig<object>, options?: http.RequestOptions) {
return defHttp.request(
{
url: '/common/file/upload',
method: 'POST',
data: form || params,
headers: { 'Content-Type': 'multipart/form-data;charset=UTF-8' },
data: body,
headers: { 'Content-Type': 'application/json' },
...config,
},
options,
{
...options,
},
)
}
/**
* @desc Base64 图片上传
*/
import * as defs from '../../baseClass'
import { defHttp } from '/@/utils/http/axios'
export class Params {
/** Base64 图片信息 */
base64Image: string
}
export const init = new defs.ResultString()
export function request(
params: Params,
config?: http.RequestConfig<Params>,
options?: http.RequestOptions,
): Promise<string> {
export function request(body?: string, config?: http.RequestConfig<string>, options?: http.RequestOptions) {
return defHttp.request(
{
url: '/common/file/uploadBase64Image',
method: 'POST',
data: params,
data: body,
headers: { 'Content-Type': 'application/json' },
...config,
},
options,
{
...options,
},
)
}
import * as auth from './auth'
import * as dict from './dict'
import * as dictItem from './dictItem'
import * as example from './example'
import * as file from './file'
import * as permission from './permission'
......@@ -8,6 +10,8 @@ import * as userView from './userView'
export const API = {
auth,
dict,
dictItem,
example,
file,
permission,
......
/**
* @desc 新增
*/
import * as defs from '../../baseClass'
import { defHttp } from '/@/utils/http/axios'
export class Params {
/** 组件 */
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 const init = new defs.ResultString()
export function request(
params: Params,
config?: http.RequestConfig<Params>,
body?: defs.PermissionParam,
config?: http.RequestConfig<defs.PermissionParam>,
options?: http.RequestOptions,
): Promise<string> {
) {
return defHttp.request(
{
url: '/sys/permission/add',
method: 'POST',
data: params,
data: body,
headers: { 'Content-Type': 'application/json' },
...config,
},
options,
{
...options,
},
)
}
/**
* @desc 查询
*/
import * as defs from '../../baseClass'
import { defHttp } from '/@/utils/http/axios'
export class Params {
......@@ -8,11 +10,9 @@ export class Params {
id: string
}
export function request(
params: Params,
config?: http.RequestConfig<Params>,
options?: http.RequestOptions,
): Promise<defs.PermissionVo> {
export const init = new defs.ResultPermissionVo()
export function request(params: Params, config?: http.RequestConfig<Params>, options?: http.RequestOptions) {
return defHttp.request(
{
url: '/sys/permission/find',
......@@ -21,6 +21,8 @@ export function request(
...config,
},
options,
{
...options,
},
)
}
......@@ -2,10 +2,10 @@
* @description 权限管理
*/
import * as add from './add'
import * as deleted from './deleted'
import * as find from './find'
import * as modify from './modify'
import * as page from './page'
import * as remove from './remove'
import * as tree from './tree'
export { add, deleted, find, modify, page, tree }
export { add, find, modify, page, remove, tree }
/**
* @desc 修改
*/
import * as defs from '../../baseClass'
import { defHttp } from '/@/utils/http/axios'
export class Params {
/** 组件 */
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 const init = new defs.ResultString()
export function request(
params: Params,
config?: http.RequestConfig<Params>,
body?: defs.PermissionParam,
config?: http.RequestConfig<defs.PermissionParam>,
options?: http.RequestOptions,
): Promise<string> {
) {
return defHttp.request(
{
url: '/sys/permission/modify',
method: 'POST',
data: params,
data: body,
headers: { 'Content-Type': 'application/json' },
...config,
},
options,
{
...options,
},
)
}
/**
* @desc 分页查询
*/
import * as defs from '../../baseClass'
import { defHttp } from '/@/utils/http/axios'
export class Params {
/** 当前页数 */
pageNo: number
/** 分页条数 */
pageSize: number
/** 当前页数 */
pageNo: number
/** 排序字段 */
sortField?: string
/** 排序方向(ASC|DESC) */
sortOrder?: 'ASC' | 'DESC'
sortOrder?: string
}
export function request(
params: Params,
config?: http.RequestConfig<Params>,
options?: http.RequestOptions,
): Promise<defs.PageVo<defs.PermissionVo>> {
export const init = new defs.ResultPageVoPermissionVo()
export function request(params: Params, config?: http.RequestConfig<Params>, options?: http.RequestOptions) {
return defHttp.request(
{
url: '/sys/permission/page',
......@@ -27,6 +27,8 @@ export function request(
...config,
},
options,
{
...options,
},
)
}
/**
* @desc 删除
*/
import * as defs from '../../baseClass'
import { defHttp } from '/@/utils/http/axios'
export class Params {
......@@ -8,19 +10,19 @@ export class Params {
id: string
}
export function request(
params: Params,
config?: http.RequestConfig<Params>,
options?: http.RequestOptions,
): Promise<string> {
export const init = new defs.ResultString()
export function request(params: Params, config?: http.RequestConfig<Params>, options?: http.RequestOptions) {
return defHttp.request(
{
url: '/sys/permission/deleted',
url: '/sys/permission/remove',
method: 'POST',
data: params,
...config,
},
options,
{
...options,
},
)
}
/**
* @desc 树结构查询
*/
import * as defs from '../../baseClass'
import { defHttp } from '/@/utils/http/axios'
export class Params {
/** pid */
pid?: string
pid: string
}
export function request(
params: Params,
config?: http.RequestConfig<Params>,
options?: http.RequestOptions,
): Promise<Array<defs.PermissionVo>> {
export const init = new defs.ResultArrayListPermissionVo()
export function request(params: Params, config?: http.RequestConfig<Params>, options?: http.RequestOptions) {
return defHttp.request(
{
url: '/sys/permission/tree',
......@@ -21,6 +21,8 @@ export function request(
...config,
},
options,
{
...options,
},
)
}
/**
* @desc 新增
*/
import * as defs from '../../baseClass'
import { defHttp } from '/@/utils/http/axios'
export class Params {
/** 名称 */
name: string
/** id */
id: string
/** 标识 */
uid: string
/** 名称 */
name: string
}
export function request(
params: Params,
config?: http.RequestConfig<Params>,
options?: http.RequestOptions,
): Promise<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/add',
......@@ -23,6 +25,8 @@ export function request(
...config,
},
options,
{
...options,
},
)
}
/**
* @desc 分配权限
*/
import * as defs from '../../baseClass'
import { defHttp } from '/@/utils/http/axios'
export class Params {
......@@ -10,11 +12,9 @@ export class Params {
ids: string
}
export function request(
params: Params,
config?: http.RequestConfig<Params>,
options?: http.RequestOptions,
): Promise<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/assign',
......@@ -23,6 +23,8 @@ export function request(
...config,
},
options,
{
...options,
},
)
}
/**
* @desc 查询
*/
import * as defs from '../../baseClass'
import { defHttp } from '/@/utils/http/axios'
export class Params {
......@@ -8,11 +10,9 @@ export class Params {
id: string
}
export function request(
params: Params,
config?: http.RequestConfig<Params>,
options?: http.RequestOptions,
): Promise<defs.RoleVo> {
export const init = new defs.ResultRoleVo()
export function request(params: Params, config?: http.RequestConfig<Params>, options?: http.RequestOptions) {
return defHttp.request(
{
url: '/sys/role/find',
......@@ -21,6 +21,8 @@ export function request(
...config,
},
options,
{
...options,
},
)
}
......@@ -3,10 +3,10 @@
*/
import * as add from './add'
import * as assign from './assign'
import * as deleted from './deleted'
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, assign, deleted, find, modify, page, selector }
export { add, assign, 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
/** 标识 */
uid: string
/** 名称 */
name: string
}
export function request(
params: Params,
config?: http.RequestConfig<Params>,
options?: http.RequestOptions,
): Promise<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/modify',
......@@ -25,6 +25,8 @@ export function request(
...config,
},
options,
{
...options,
},
)
}
/**
* @desc 分页查询
*/
import * as defs from '../../baseClass'
import { defHttp } from '/@/utils/http/axios'
export class Params {
/** 当前页数 */
pageNo: number
/** 分页条数 */
pageSize: number
/** 当前页数 */
pageNo: number
/** 排序字段 */
sortField?: string
/** 排序方向(ASC|DESC) */
sortOrder?: 'ASC' | 'DESC'
sortOrder?: string
}
export function request(
params: Params,
config?: http.RequestConfig<Params>,
options?: http.RequestOptions,
): Promise<defs.PageVo<defs.RoleVo>> {
export const init = new defs.ResultPageVoRoleVo()
export function request(params: Params, config?: http.RequestConfig<Params>, options?: http.RequestOptions) {
return defHttp.request(
{
url: '/sys/role/page',
......@@ -27,6 +27,8 @@ export function request(
...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 选项查询
*/
import * as defs from '../../baseClass'
import { defHttp } from '/@/utils/http/axios'
export class Params {}
export function request(
params?: Params,
config?: http.RequestConfig<Params>,
options?: http.RequestOptions,
): Promise<Array<defs.RoleVo>> {
export const init = new defs.ResultArrayListRoleVo()
export function request(params?: Params, config?: http.RequestConfig<Params>, options?: http.RequestOptions) {
return defHttp.request(
{
url: '/sys/role/selector',
......@@ -18,6 +18,8 @@ export function request(
...config,
},
options,
{
...options,
},
)
}
/**
* @desc 分配角色
*/
import * as defs from '../../baseClass'
import { defHttp } from '/@/utils/http/axios'
export class Params {
......@@ -10,11 +12,9 @@ export class Params {
ids: string
}
export function request(
params: Params,
config?: http.RequestConfig<Params>,
options?: http.RequestOptions,
): Promise<string> {
export const init = new defs.ResultString()
export function request(params: Params, config?: http.RequestConfig<Params>, options?: http.RequestOptions) {
return defHttp.request(
{
url: '/sys/user/assign',
......@@ -23,6 +23,8 @@ export function request(
...config,
},
options,
{
...options,
},
)
}
/**
* @desc 分页查询
*/
import * as defs from '../../baseClass'
import { defHttp } from '/@/utils/http/axios'
export class Params {
/** 当前页数 */
pageNo: number
/** 分页条数 */
pageSize: number
/** 当前页数 */
pageNo: number
/** 排序字段 */
sortField?: string
/** 排序方向(ASC|DESC) */
sortOrder?: 'ASC' | 'DESC'
sortOrder?: string
}
export function request(
params: Params,
config?: http.RequestConfig<Params>,
options?: http.RequestOptions,
): Promise<defs.PageVo<defs.UserVo>> {
export const init = new defs.ResultPageVoUserVo()
export function request(params: Params, config?: http.RequestConfig<Params>, options?: http.RequestOptions) {
return defHttp.request(
{
url: '/sys/user/page',
......@@ -27,6 +27,8 @@ export function request(
...config,
},
options,
{
...options,
},
)
}
/**
* @desc 获取用户菜单
*/
import * as defs from '../../baseClass'
import { defHttp } from '/@/utils/http/axios'
export class Params {}
export function request(
params?: Params,
config?: http.RequestConfig<Params>,
options?: http.RequestOptions,
): Promise<Array<defs.MenuVo>> {
export const init = new defs.ResultArrayListMenuVo()
export function request(params?: Params, config?: http.RequestConfig<Params>, options?: http.RequestOptions) {
return defHttp.request(
{
url: '/user/getMenuList',
......@@ -18,6 +18,8 @@ export function request(
...config,
},
options,
{
...options,
},
)
}
/**
* @desc 获取用户权限
*/
import * as defs from '../../baseClass'
import { defHttp } from '/@/utils/http/axios'
export class Params {}
export function request(
params?: Params,
config?: http.RequestConfig<Params>,
options?: http.RequestOptions,
): Promise<Array<string>> {
export const init = new defs.ResultArrayListString()
export function request(params?: Params, config?: http.RequestConfig<Params>, options?: http.RequestOptions) {
return defHttp.request(
{
url: '/user/getPermCode',
......@@ -18,6 +18,8 @@ export function request(
...config,
},
options,
{
...options,
},
)
}
/**
* @desc 获取登录用户信息
*/
import * as defs from '../../baseClass'
import { defHttp } from '/@/utils/http/axios'
export class Params {}
export function request(
params?: Params,
config?: http.RequestConfig<Params>,
options?: http.RequestOptions,
): Promise<defs.UserInfo> {
export const init = new defs.ResultUserInfo()
export function request(params?: Params, config?: http.RequestConfig<Params>, options?: http.RequestOptions) {
return defHttp.request(
{
url: '/user/getUserInfo',
......@@ -18,6 +18,8 @@ export function request(
...config,
},
options,
{
...options,
},
)
}
import { defHttp } from '/@/utils/http/axios'
import { getMenuListResultModel } from './model/menuModel'
import type { getMenuListResultModel } from './model/menuModel'
enum Api {
GetMenuList = '/user/getMenuList',
......
import { UploadApiResult } from './model/uploadModel'
import type { UploadApiResult } from './model/uploadModel'
import { defHttp } from '/@/utils/http/axios'
import { UploadFileParams } from '/#/axios'
import type { UploadFileParams } from '/#/axios'
import { useGlobSetting } from '/@/hooks/setting'
const { uploadUrl = '' } = useGlobSetting()
......
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 {
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>
import { computed, unref } from 'vue'
import { SvgIcon } from '/@/components/Icon'
......@@ -34,6 +27,15 @@
updateSidebarBgColor()
}
</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>
@prefix-cls: ~'@{namespace}-dark-switch';
......
......@@ -2,25 +2,10 @@
* @Author: Vben
* @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>
import type { LocaleType } from '/#/config'
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 { Icon } from '/@/components/Icon'
import { useLocale } from '/@/locales/useLocale'
......@@ -67,6 +52,22 @@
}
</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">
.app-locale-picker-overlay {
.ant-dropdown-menu-item {
......
......@@ -2,14 +2,6 @@
* @Author: Vben
* @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>
import { computed, unref } from 'vue'
import { useGlobSetting } from '/@/hooks/setting'
......@@ -60,6 +52,16 @@
go(userStore.getUserInfo.homePath || PageEnum.BASE_HOME)
}
</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>
@prefix-cls: ~'@{namespace}-app-logo';
......
<script lang="ts">
import { defineComponent, toRefs, ref, unref } from 'vue'
import { defineComponent, ref, toRefs, unref } from 'vue'
import { createAppProviderContext } from './useAppContext'
import { createBreakpointListen } from '/@/hooks/event/useBreakpoint'
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>
<div :class="`${prefixCls}`">
<AppSearchKeyItem :class="`${prefixCls}-item`" icon="ant-design:enter-outlined" />
......@@ -10,13 +18,6 @@
</div>
</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>
@prefix-cls: ~'@{namespace}-app-search-footer';
......
<template>
<span :class="$attrs.class">
<Icon :icon="icon" />
</span>
</template>
<script lang="ts" setup>
import { Icon } from '/@/components/Icon'
defineProps({
icon: String,
})
</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>
<Teleport to="body">
<transition name="zoom-fade" mode="out-in">
......@@ -57,65 +117,6 @@
</Teleport>
</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>
@prefix-cls: ~'@{namespace}-app-search-modal';
@footer-prefix-cls: ~'@{namespace}-app-search-footer';
......
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 { cloneDeep } from 'lodash-es'
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'
export interface AppProviderContextProps {
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论