refactor: 悦码项目重构

This commit is contained in:
wangxuefeng 2025-02-19 13:42:56 +08:00
parent c8c9406fd5
commit eab709f94f
494 changed files with 50986 additions and 27639 deletions

8
.env Normal file
View File

@ -0,0 +1,8 @@
# 项目名称
VITE_APP_TITLE = Admin
# 公共基础路径, 详见: https://cn.vitejs.dev/guide/build.html#public-base-path
VITE_BASE_URL = /
# enable mock in production
VITE_MOCK_IN_PROD = true

11
.gitattributes vendored Normal file
View File

@ -0,0 +1,11 @@
# https://docs.github.com/cn/get-started/getting-started-with-git/configuring-git-to-handle-line-endings
# Automatically normalize line endings (to LF) for all text-based files.
* text=auto eol=lf
# Declare files that will always have CRLF line endings on checkout.
*.{cmd,[cC][mM][dD]} text eol=crlf
*.{bat,[bB][aA][tT]} text eol=crlf
# Denote all files that are truly binary and should not be modified.
*.{ico,png,jpg,jpeg,gif,webp,svg,woff,woff2} binary

41
.gitignore vendored
View File

@ -1,25 +1,38 @@
# Logs
logs
*.log
node_modules
.DS_Store
dist
.cache
.turbo
.nx
.nx/cache
tests/server/static
tests/server/static/upload
.local
# local env files
.env.local
.env.*.local
.eslintcache
# Log files
npm-debug.log*
yarn-debug.log*
yarn-error.log*
pnpm-debug.log*
lerna-debug.log*
node_modules
dist
dist-ssr
*.local
*pnpm-debug.log*
# Editor directories and files
.vscode/*
!.vscode/extensions.json
.idea
.DS_Store
# .vscode
*.suo
*.ntvs*
*.njsproj
*.sln
*.sw?
localSet.js
# auto generate file
types/auto-imports.d.ts
types/components.d.ts
# Turbo
.turbo

24
.npmrc
View File

@ -1,6 +1,22 @@
# 默认使用淘宝镜像源
registry=https://registry.npmmirror.com/
# 公司私有源配置
# 使用淘宝镜像源
registry = https://registry.npmmirror.com
@sy:registry=http://sy-registry.shiyue.com
# 根据需要提升含有以下的依赖包到根 node_modules 目录下
public-hoist-pattern[]=husky
public-hoist-pattern[]=*eslint*
public-hoist-pattern[]=@eslint*
public-hoist-pattern[]=*prettier*
public-hoist-pattern[]=lint-staged
public-hoist-pattern[]=*stylelint*
public-hoist-pattern[]=@commitlint*
public-hoist-pattern[]=core-js
# 提升所有依赖到根 node_modules 目录下,相当于 public-hoist-pattern[]=*,与上面一种方式一般二选一使用
# 极不推荐用这样的方式解决依赖问题,这样没有充分利用 pnpm 依赖访问安全性的优势,又走回了 npm / yarn 的老路。
# shamefully-hoist=true
enable-pre-post-scripts=true
engine-strict=true
package-manager-strict=false
strict-peer-dependencies=false

View File

@ -1,7 +0,0 @@
{
"recommendations": [
"Vue.volar",
"Vue.vscode-typescript-vue-plugin",
"dbaeumer.vscode-eslint"
]
}

View File

@ -0,0 +1,9 @@
[*.{js, jsx, ts, tsx, vue, mjs}]
indent_style = space
indent_size = 2
trim_trailing_whitespace = true
insert_final_newline = true
ij_javascript_spaces_within_imports = true
ij_html_do_not_indent_children_of_tags = html, body, thead, tbody, tfoot, script
ij_javascript_space_before_function_left_parenth = true
ij_javascript_use_semicolon_after_statement = true

33
apps/designer/.gitignore vendored Normal file
View File

@ -0,0 +1,33 @@
# Logs
logs
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*
pnpm-debug.log*
lerna-debug.log*
# Editor directories and files
.vscode/*
!.vscode/extensions.json
.idea
.DS_Store
*.suo
*.ntvs*
*.njsproj
*.sln
*.sw?
.history
# Project
package-lock.json
yarn-lock.json
pnpm-lock.yaml
tsconfig.tsbuildinfo
node_modules
coverage
dist
dist-ssr
*.local
.vtj/logs
.vtj/histories

15
apps/designer/.npmrc Normal file
View File

@ -0,0 +1,15 @@
registry = https://registry.npmmirror.com
@sy:registry=http://sy-registry.shiyue.com
# 根据需要提升含有以下的依赖包到根 node_modules 目录下
# public-hoist-pattern[]=core-js
# public-hoist-pattern[]=*@vtj*
# 提升所有依赖到根 node_modules 目录下,相当于 public-hoist-pattern[]=*,与上面一种方式一般二选一使用
# 极不推荐用这样的方式解决依赖问题,这样没有充分利用 pnpm 依赖访问安全性的优势,又走回了 npm / yarn 的老路。
# shamefully-hoist=true
enable-pre-post-scripts=true
engine-strict=true
package-manager-strict=false

20
apps/designer/.prettierrc Normal file
View File

@ -0,0 +1,20 @@
{
"arrowParens": "always",
"bracketSpacing": true,
"bracketSameLine": true,
"endOfLine": "lf",
"htmlWhitespaceSensitivity": "css",
"insertPragma": false,
"jsxBracketSameLine": true,
"jsxSingleQuote": true,
"printWidth": 80,
"proseWrap": "preserve",
"quoteProps": "as-needed",
"requirePragma": false,
"semi": true,
"singleQuote": true,
"tabWidth": 2,
"trailingComma": "none",
"useTabs": false,
"vueIndentScriptAndStyle": false
}

5
apps/designer/.vscode/extensions.json vendored Normal file
View File

@ -0,0 +1,5 @@
{
"recommendations": [
"vue.volar"
]
}

View File

@ -0,0 +1,19 @@
{
"name": "Test",
"locked": false,
"inject": [],
"state": {},
"lifeCycles": {},
"methods": {},
"computed": {},
"watch": [],
"css": "",
"props": [],
"emits": [],
"slots": [],
"dataSources": {},
"__VTJ_BLOCK__": true,
"__VERSION__": "1739842497674",
"id": "45t7j3xqi",
"nodes": []
}

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,176 @@
{
"__VTJ_PROJECT__": true,
"id": "@sy/low-code-designer",
"platform": "web",
"name": "低代码编辑器",
"homepage": "",
"description": "低代码编辑器",
"dependencies": [
{
"package": "vue",
"version": "latest",
"library": "Vue",
"urls": [
"@vtj/materials/deps/vue/vue.global.prod.js"
],
"assetsLibrary": "VueMaterial",
"required": true,
"official": true,
"enabled": true
},
{
"package": "vue-router",
"version": "latest",
"library": "VueRouter",
"urls": [
"@vtj/materials/deps/vue-router/vue-router.global.prod.js"
],
"assetsLibrary": "VueRouterMaterial",
"required": true,
"official": true,
"enabled": true
},
{
"package": "@vtj/utils",
"version": "latest",
"library": "VtjUtils",
"urls": [
"@vtj/materials/deps/@vtj/utils/index.umd.js"
],
"required": true,
"official": true,
"enabled": true
},
{
"package": "@vtj/icons",
"version": "latest",
"library": "VtjIcons",
"urls": [
"@vtj/materials/deps/@vtj/icons/style.css",
"@vtj/materials/deps/@vtj/icons/index.umd.js"
],
"required": true,
"official": true,
"enabled": true
},
{
"package": "@vueuse/core",
"version": "latest",
"library": "VueUse",
"urls": [
"@vtj/materials/deps/@vueuse/shared/index.iife.min.js",
"@vtj/materials/deps/@vueuse/core/index.iife.min.js"
],
"required": false,
"official": true,
"enabled": true,
"platform": [
"web",
"h5"
]
},
{
"package": "element-plus",
"version": "latest",
"library": "ElementPlus",
"localeLibrary": "ElementPlusLocaleZhCn",
"urls": [
"@vtj/materials/deps/element-plus/dark/css-vars.css",
"@vtj/materials/deps/element-plus/index.css",
"@vtj/materials/deps/element-plus/zh-cn.js",
"@vtj/materials/deps/element-plus/index.full.min.js"
],
"assetsUrl": "@vtj/materials/assets/element/index.umd.js",
"assetsLibrary": "ElementPlusMaterial",
"required": false,
"official": true,
"enabled": true,
"platform": "web"
},
{
"package": "@vtj/ui",
"version": "latest",
"library": "VtjUI",
"urls": [
"@vtj/materials/deps/vxe-table/style.min.css",
"@vtj/materials/deps/@vtj/ui/style.css",
"@vtj/materials/deps/xe-utils/xe-utils.umd.min.js",
"@vtj/materials/deps/vxe-table/index.umd.min.js",
"@vtj/materials/deps/@vtj/ui/index.umd.js"
],
"assetsUrl": "@vtj/materials/assets/ui/index.umd.js",
"assetsLibrary": "VtjUIMaterial",
"required": false,
"official": true,
"enabled": false,
"platform": "web"
},
{
"package": "ant-design-vue",
"version": "latest",
"library": "antd",
"urls": [
"@vtj/materials/deps/ant-design-vue/reset.css",
"@vtj/materials/deps/ant-design-vue/dayjs/dayjs.min.js",
"@vtj/materials/deps/ant-design-vue/dayjs/plugin/customParseFormat.js",
"@vtj/materials/deps/ant-design-vue/dayjs/plugin/weekday.js",
"@vtj/materials/deps/ant-design-vue/dayjs/plugin/localeData.js",
"@vtj/materials/deps/ant-design-vue/dayjs/plugin/weekOfYear.js",
"@vtj/materials/deps/ant-design-vue/dayjs/plugin/weekYear.js",
"@vtj/materials/deps/ant-design-vue/dayjs/plugin/advancedFormat.js",
"@vtj/materials/deps/ant-design-vue/dayjs/plugin/quarterOfYear.js",
"@vtj/materials/deps/ant-design-vue/antd.min.js"
],
"assetsUrl": "@vtj/materials/assets/antdv/index.umd.js",
"assetsLibrary": "AntdvMaterial",
"required": false,
"official": true,
"enabled": false,
"platform": [
"web"
]
},
{
"package": "@vtj/charts",
"version": "latest",
"library": "VtjCharts",
"urls": [
"@vtj/materials/deps/echarts/echarts.min.js",
"@vtj/materials/deps/@vtj/charts/index.umd.js"
],
"assetsUrl": "@vtj/materials/assets/charts/index.umd.js",
"assetsLibrary": "VtjChartsMaterial",
"required": false,
"official": true,
"enabled": false,
"platform": [
"web",
"h5"
]
}
],
"pages": [
{
"dir": false,
"name": "Test",
"title": "1",
"icon": "",
"mask": true,
"hidden": false,
"raw": false,
"pure": false,
"meta": "",
"cache": false,
"id": "45t7j3xqi",
"type": "page"
}
],
"blocks": [],
"apis": [],
"meta": [],
"config": {
"title": "",
"themeSwitchable": false
},
"__BASE_PATH__": "/"
}

4
apps/designer/env.json Normal file
View File

@ -0,0 +1,4 @@
{
"PORTAL_HOST": "sso-sit.newpearl.com",
"PORTAL_HOST_I": "soi-sit.newpearl.com"
}

View File

@ -0,0 +1 @@
{}

View File

@ -0,0 +1 @@
{}

View File

@ -0,0 +1 @@
{}

18
apps/designer/index.html Normal file
View File

@ -0,0 +1,18 @@
<!doctype html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8" />
<link rel="shortcut icon" href="/logo.svg" type="image/x-icon" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta
http-equiv="Cache-Control"
content="no-cache, no-store, must-revalidate" />
<meta http-equiv="Pragma" content="no-cache" />
<meta http-equiv="Expires" content="0" />
<title>VTJ Web Project Template</title>
</head>
<body>
<div id="low-code-designer"></div>
<script type="module" src="/src/main.ts"></script>
</body>
</html>

View File

@ -0,0 +1,35 @@
{
"name": "@sy/low-code-designer",
"description": "低代码编辑器",
"private": true,
"version": "1.0.0-1",
"type": "module",
"scripts": {
"dev": "cross-env ENV_TYPE=local vite",
"build": "npm run build:prod",
"build:sit": "vue-tsc && cross-env ENV_TYPE=sit vite build",
"build:uat": "vue-tsc && cross-env ENV_TYPE=uat vite build",
"build:pre": "vue-tsc && cross-env ENV_TYPE=pre vite build",
"build:prod": "cross-env ENV_TYPE=live vite build",
"preview": "vite preview",
"clean:lock": "rimraf pnpm-lock.yaml && rimraf package.lock.json",
"clean:lib": "rimraf node_modules"
},
"dependencies": {
"@vtj/materials": "^0.9.30",
"@vtj/renderer": "^0.9.30",
"@vtj/ui": "^0.9.30",
"@vtj/web": "^0.9.30",
"element-plus": "^2.9.4",
"vue": "~3.5.13",
"vue-router": "~4.5.0",
"core-js": "^3.40.0"
},
"devDependencies": {
"@sy/vite-plugin-http2-proxy": "workspace:*",
"@vtj/cli": "^0.9.8",
"@vtj/local": "^0.9.30",
"vite": "6.1.0",
"vite-plugin-mkcert": "^1.17.6"
}
}

View File

@ -0,0 +1,7 @@
export default {
'/api': {
target: 'https://sso-sit.newpearl.com',
changeOrigin: true,
ws: true
}
};

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

View File

@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1711803009570" class="icon" viewBox="0 0 1280 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="1500" width="320" height="256" xmlns:xlink="http://www.w3.org/1999/xlink"><path d="M557.85 1023l-122-35.4c-12.8-3.6-20-17-16.4-29.8L692.45 17.4c3.6-12.8 17-20 29.8-16.4l122 35.4c12.8 3.6 20 17 16.4 29.8L587.65 1006.6c-3.8 12.8-17 20.2-29.8 16.4z m-228-224.4l87-92.8c9.2-9.8 8.6-25.4-1.6-34.4L234.05 512l181.2-159.4c10.2-9 11-24.6 1.6-34.4l-87-92.8c-9-9.6-24.2-10.2-34-1L7.65 494.4c-10.2 9.4-10.2 25.6 0 35l288.2 270.2c9.8 9.2 25 8.8 34-1z m654.4 1.2l288.2-270.2c10.2-9.4 10.2-25.6 0-35L984.25 224.2c-9.6-9-24.8-8.6-34 1L863.25 318c-9.2 9.8-8.6 25.4 1.6 34.4L1046.05 512l-181.2 159.4c-10.2 9-11 24.6-1.6 34.4l87 92.8c9 9.8 24.2 10.2 34 1.2z" fill="#0157fe" p-id="1501"></path></svg>

After

Width:  |  Height:  |  Size: 931 B

51
apps/designer/src/App.vue Normal file
View File

@ -0,0 +1,51 @@
<template>
<ElConfigProvider :locale="zhCn">
<Suspense>
<XMask
:title="title"
:logo="logo || _logo"
:menus="menus"
:disabled="disabled"
:pure="pure"
:actions="actions"
@action-click="onActionClick"
:theme="themeSwitchable"></XMask>
</Suspense>
</ElConfigProvider>
</template>
<script setup lang="ts">
import { Suspense } from 'vue';
import { ElConfigProvider, ElMessage } from 'element-plus';
import {
XMask,
useMask,
Bell,
Lock,
SwitchButton,
type ActionBarItems,
type ActionProps
} from '@vtj/web';
import zhCn from 'element-plus/es/locale/lang/zh-cn';
import _logo from './assets/logo.svg';
const { disabled, title, menus, logo, themeSwitchable, pure } = useMask();
const actions: ActionBarItems = [
{
name: 'message',
icon: Bell,
badge: 1
},
{
name: 'lock',
icon: Lock
},
{
name: 'logout',
icon: SwitchButton
}
];
const onActionClick = (action: ActionProps) => {
ElMessage.success(`click: ${action.name}`);
};
</script>

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

View File

@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1711803009570" class="icon" viewBox="0 0 1280 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="1500" width="320" height="256" xmlns:xlink="http://www.w3.org/1999/xlink"><path d="M557.85 1023l-122-35.4c-12.8-3.6-20-17-16.4-29.8L692.45 17.4c3.6-12.8 17-20 29.8-16.4l122 35.4c12.8 3.6 20 17 16.4 29.8L587.65 1006.6c-3.8 12.8-17 20.2-29.8 16.4z m-228-224.4l87-92.8c9.2-9.8 8.6-25.4-1.6-34.4L234.05 512l181.2-159.4c10.2-9 11-24.6 1.6-34.4l-87-92.8c-9-9.6-24.2-10.2-34-1L7.65 494.4c-10.2 9.4-10.2 25.6 0 35l288.2 270.2c9.8 9.2 25 8.8 34-1z m654.4 1.2l288.2-270.2c10.2-9.4 10.2-25.6 0-35L984.25 224.2c-9.6-9-24.8-8.6-34 1L863.25 318c-9.2 9.8-8.6 25.4 1.6 34.4L1046.05 512l-181.2 159.4c-10.2 9-11 24.6-1.6 34.4l87 92.8c9 9.8 24.2 10.2 34 1.2z" fill="#0157fe" p-id="1501"></path></svg>

After

Width:  |  Height:  |  Size: 931 B

View File

@ -0,0 +1,38 @@
<script setup lang="ts">
import { ref } from 'vue'
defineProps<{ msg: string }>()
const count = ref(0)
</script>
<template>
<h1>{{ msg }}</h1>
<div class="card">
<button type="button" @click="count++">count is {{ count }}</button>
<p>
Edit
<code>components/HelloWorld.vue</code> to test HMR
</p>
</div>
<p>
Check out
<a href="https://vuejs.org/guide/quick-start.html#local" target="_blank"
>create-vue</a
>, the official Vue + Vite starter
</p>
<p>
Install
<a href="https://github.com/vuejs/language-tools" target="_blank">Volar</a>
in your IDE for a better DX
</p>
<p class="read-the-docs">Click on the Vite and Vue logos to learn more</p>
</template>
<style scoped>
.read-the-docs {
color: #888;
}
</style>

28
apps/designer/src/env.d.ts vendored Normal file
View File

@ -0,0 +1,28 @@
/// <reference types="vite/client" />
declare module '*.vue' {
import type { DefineComponent } from 'vue';
const component: DefineComponent<{}, {}, any>;
export default component;
}
declare namespace NodeJS {
interface ProcessEnv {
[key: string]: any;
}
}
declare module global {
interface Window {}
}
declare module 'vue' {
interface ComponentCustomProperties {
$uploader: any;
$reqeust: any;
$apis: any;
$libs: any;
}
}
export {};

48
apps/designer/src/main.ts Normal file
View File

@ -0,0 +1,48 @@
import {
createProvider,
LocalService,
createModules,
NodeEnv,
autoUpdate,
notify,
loading,
createAdapter,
createServiceRequest
} from '@vtj/web';
import { createApp } from 'vue';
import router from './router';
import App from './App.vue';
import { name, description } from '../package.json';
import './style/index.scss';
const app = createApp(App);
const adapter = createAdapter({ loading, notify });
const service = new LocalService(createServiceRequest(notify));
// const modules = createModules();
// console.log('modules', modules);
const { provider, onReady } = createProvider({
nodeEnv: process.env.NODE_ENV as NodeEnv,
modules: createModules(),
service,
adapter,
router,
dependencies: {
Vue: () => import('vue'),
VueRouter: () => import('vue-router')
},
project: {
id: name,
name: description
}
});
onReady(async () => {
app.use(router);
app.use(provider);
app.mount('#low-code-designer');
});
if (process.env.NODE_ENV === 'production') {
autoUpdate();
}

View File

@ -0,0 +1,19 @@
import { createRouter, createWebHistory } from 'vue-router';
const router = createRouter({
history: createWebHistory(),
routes: [
{
path: '/unauthorized',
name: 'Unauthorized',
component: () => import('@/views/unauthorized.vue')
},
{
path: '/:pathMatch(.*)*',
name: 'NotFound',
component: () => import('@/views/not-found.vue')
}
]
});
export default router;

View File

@ -0,0 +1,11 @@
@use '@vtj/web/src/index.scss';
html,
body,
#app {
padding: 0;
margin: 0;
font-size: 14px;
height: 100%;
overflow: hidden;
}

View File

@ -0,0 +1,10 @@
<template>
<XContainer class="not-found" fit justify="center">
<ElEmpty description="找不到页面【404】"></ElEmpty>
</XContainer>
</template>
<script lang="ts" setup>
import { XContainer } from '@vtj/web';
import { ElEmpty } from 'element-plus';
</script>
<style lang="scss" scoped></style>

View File

@ -0,0 +1,10 @@
<template>
<XContainer class="unauthorized" fit justify="center">
<ElEmpty description="无权限访问该页面"></ElEmpty>
</XContainer>
</template>
<script lang="ts" setup>
import { XContainer } from '@vtj/ui';
import { ElEmpty } from 'element-plus';
</script>
<style lang="scss" scoped></style>

View File

@ -0,0 +1,27 @@
{
"extends": "./node_modules/@vtj/cli/config/tsconfig.web.json",
"compilerOptions": {
"noUnusedLocals": false,
"noUnusedParameters": false,
"baseUrl": "./",
"paths": {
"@/*": [
"src/*"
],
"$vtj/*": [
".vtj/*"
]
}
},
"include": [
"src"
],
"exclude": [
".vtj",
],
"references": [
{
"path": "./tsconfig.node.json"
}
]
}

View File

@ -0,0 +1,13 @@
{
"compilerOptions": {
"composite": true,
"skipLibCheck": true,
"module": "ESNext",
"moduleResolution": "bundler",
"allowSyntheticDefaultImports": true
},
"include": [
"vite.config.ts",
"proxy.config.ts"
]
}

View File

@ -0,0 +1,19 @@
import { createViteConfig } from '@vtj/cli';
import { createDevTools } from '@vtj/local';
import mkcert from 'vite-plugin-mkcert';
import Http2Proxy from '@sy/vite-plugin-http2-proxy';
import type { UserConfig, ConfigEnv } from 'vite';
const config = createViteConfig({
plugins: [createDevTools(), mkcert({ source: 'coding' }), Http2Proxy()]
});
// export default config;
export default ({ command, mode }: ConfigEnv): UserConfig => {
return {
...config,
server: {
cors: true
}
};
};

View File

@ -0,0 +1,5 @@
> 1%
last 2 versions
not dead
not ie 11
chrome 79

View File

@ -0,0 +1,19 @@
.DS_Store
node_modules/
dist/
.vscode/
npm-debug.log*
yarn-debug.log*
yarn-error.log*
tests/**/coverage/
# Editor directories and files
.idea
.vscode
*.suo
*.ntvs*
*.njsproj
*.sln

8
apps/platform/.env Normal file
View File

@ -0,0 +1,8 @@
# 项目名称
VITE_APP_TITLE = Admin
# 公共基础路径, 详见: https://cn.vitejs.dev/guide/build.html#public-base-path
VITE_BASE_URL = /
# enable mock in production
VITE_MOCK_IN_PROD = true

View File

@ -0,0 +1,8 @@
# 只在开发模式中被载入
ENV = 'development'
# 公共基础路径, 详见: https://cn.vitejs.dev/guide/build.html#public-base-path
VITE_BASE_URL = /
# base api url
VITE_BASE_API_URL = 'http://8.134.216.72:8080/'

View File

@ -0,0 +1,8 @@
# 只在生产模式中被载入
ENV = 'production'
# base api url
VITE_BASE_API_URL = 'http://127.0.0.1:8080/'
# 公共基础路径, 详见: https://cn.vitejs.dev/guide/build.html#public-base-path
VITE_BASE_URL = /

11
apps/platform/.gitattributes vendored Normal file
View File

@ -0,0 +1,11 @@
# https://docs.github.com/cn/get-started/getting-started-with-git/configuring-git-to-handle-line-endings
# Automatically normalize line endings (to LF) for all text-based files.
* text=auto eol=lf
# Declare files that will always have CRLF line endings on checkout.
*.{cmd,[cC][mM][dD]} text eol=crlf
*.{bat,[bB][aA][tT]} text eol=crlf
# Denote all files that are truly binary and should not be modified.
*.{ico,png,jpg,jpeg,gif,webp,svg,woff,woff2} binary

35
apps/platform/.gitignore vendored Normal file
View File

@ -0,0 +1,35 @@
node_modules
.DS_Store
dist
.cache
.turbo
.nx
.nx/cache
tests/server/static
tests/server/static/upload
.local
# local env files
.env.local
.env.*.local
.eslintcache
# Log files
npm-debug.log*
yarn-debug.log*
yarn-error.log*
*pnpm-debug.log*
# Editor directories and files
.idea
# .vscode
*.suo
*.ntvs*
*.njsproj
*.sln
*.sw?
# auto generate file
types/auto-imports.d.ts
types/components.d.ts

22
apps/platform/.npmrc Normal file
View File

@ -0,0 +1,22 @@
# 使用淘宝镜像源
registry = https://registry.npmmirror.com
@sy:registry=http://sy-registry.shiyue.com
# 根据需要提升含有以下的依赖包到根 node_modules 目录下
# public-hoist-pattern[]=husky
# public-hoist-pattern[]=*eslint*
# public-hoist-pattern[]=@eslint*
# public-hoist-pattern[]=*prettier*
# public-hoist-pattern[]=lint-staged
# public-hoist-pattern[]=*stylelint*
# public-hoist-pattern[]=@commitlint*
# public-hoist-pattern[]=core-js
# 提升所有依赖到根 node_modules 目录下,相当于 public-hoist-pattern[]=*,与上面一种方式一般二选一使用
# 极不推荐用这样的方式解决依赖问题,这样没有充分利用 pnpm 依赖访问安全性的优势,又走回了 npm / yarn 的老路。
# shamefully-hoist=true
enable-pre-post-scripts=true
engine-strict=true
package-manager-strict=false

View File

@ -0,0 +1,81 @@
# 1.1.0 (2022-09-02)
### Bug Fixes
- :bug: router navigation bug ([b550a7a](https://github.com/buqiyuan/vite-vue3-admin/commit/b550a7a01b486cfd161ccb8efd7bca9a0ed35627))
- :bug:生成路由出错问题 ([917e3f0](https://github.com/buqiyuan/vite-vue3-admin/commit/917e3f07209851a3df0b7e220e38df4df7612a68))
- :bug:修复某些权限码传参错误 ([47071ef](https://github.com/buqiyuan/vite-vue3-admin/commit/47071efa7beb2e210151405e2a1c7e74d6dff4f1))
- :bug:fix BASE_URL to VITE_BASE_URL ([3d32e82](https://github.com/buqiyuan/vite-vue3-admin/commit/3d32e82b838aea3c8a928989d2aa55c5d125a8ab))
- 面包屑导航和弹窗拖拽后宽度问题 ([ae96559](https://github.com/buqiyuan/vite-vue3-admin/commit/ae96559fb82a87908a40b425701eaa0ee1993aa7))
- 删除一些多余的旧代码 ([9eaa568](https://github.com/buqiyuan/vite-vue3-admin/commit/9eaa568a104e7ab1980c0d2069cbedddb4a4934b))
- add menu type judgment ([144a539](https://github.com/buqiyuan/vite-vue3-admin/commit/144a53942a9229cb5e0286ae3452b644d66621e6))
- **component:** :bug:修复 dynamicTable ts 类型错误 ([58b9275](https://github.com/buqiyuan/vite-vue3-admin/commit/58b9275758625f583aed644923431df72acb9687))
- **components:** [dynamic-table] initial fetchData did not carry the default value ([3aaedcf](https://github.com/buqiyuan/vite-vue3-admin/commit/3aaedcf3c0551477e05dec85fb86d4e5af62b193))
- **components:** [dynamic-table] parameter missing ([1e306d7](https://github.com/buqiyuan/vite-vue3-admin/commit/1e306d77d205cc9fe69fb19d860f5e014e8accc8))
- **dynamic-table:** add onChangeParams param for dataRequest ([f381c79](https://github.com/buqiyuan/vite-vue3-admin/commit/f381c793529b6711994e001d29d1b8e6dc016631))
- fix the aformPropsKeys ([#22](https://github.com/buqiyuan/vite-vue3-admin/issues/22)) ([e1c21be](https://github.com/buqiyuan/vite-vue3-admin/commit/e1c21bea3dddee1fefc9465142f390b0252ebcb4))
- invalid regular expression in safari ([3939f82](https://github.com/buqiyuan/vite-vue3-admin/commit/3939f8229561959cb46982f64c54f4348258a1bd)), closes [#20](https://github.com/buqiyuan/vite-vue3-admin/issues/20)
- isAsyncFunction ([71aca13](https://github.com/buqiyuan/vite-vue3-admin/commit/71aca13b8055cd38c9f49a4d370c935312fa4d6f))
- **pages:** about page link issues ([62c840c](https://github.com/buqiyuan/vite-vue3-admin/commit/62c840ccec3aa4b4237a182d750db933797c1c92))
- **projects:** 修复 tabs-view 下拉菜单溢出 ([a43353d](https://github.com/buqiyuan/vite-vue3-admin/commit/a43353dc89f8395278b6988f7a2dd8c372ff0d7f))
- remove topLevelAwait usage ([6653da6](https://github.com/buqiyuan/vite-vue3-admin/commit/6653da65f7a6d9738a39c955fb4dcb6d4f553235))
- router redirect error when logout ([4073cb6](https://github.com/buqiyuan/vite-vue3-admin/commit/4073cb651b3bf45c16ce5f965fb7dddd3fab3bcd))
- **router:** 第一次进入页面缓存失效问题 ([1b79adc](https://github.com/buqiyuan/vite-vue3-admin/commit/1b79adc072c1c9b6518cc4c05846dfd47c954989))
- **schema-form:** update props issue ([ff1da5e](https://github.com/buqiyuan/vite-vue3-admin/commit/ff1da5e4f9723392f8af6a5286131f8cbf3c2bf8))
- some css style issues ([9db10b0](https://github.com/buqiyuan/vite-vue3-admin/commit/9db10b058c8ba212cf51c94c10d2f37705ff7112))
- some route file path error ([c89b131](https://github.com/buqiyuan/vite-vue3-admin/commit/c89b131d77c0ee8036813a2d377774bb854c652d))
- some ts type issue ([60ea702](https://github.com/buqiyuan/vite-vue3-admin/commit/60ea702d7fe9cc88f85c07cdb0cd6fe5f3c56669))
- svg can not loaded ([6aec46a](https://github.com/buqiyuan/vite-vue3-admin/commit/6aec46a00412a2b02e4090faca6722717a739550))
- **utils:** [is] always false of isPromise ([8479111](https://github.com/buqiyuan/vite-vue3-admin/commit/84791110a87ab48f131c91e73508c2547fff8b25))
- xlsx.js not default export in new versions [#8](https://github.com/buqiyuan/vite-vue3-admin/issues/8) ([a0b0fc8](https://github.com/buqiyuan/vite-vue3-admin/commit/a0b0fc8c78e1cf75e5ed7e48aee03dc7ce364db4))
### Features
- 表格列设置工具栏 ([a934e12](https://github.com/buqiyuan/vite-vue3-admin/commit/a934e123426fab27fcbfbf47181f3355f584974a))
- 当前用户角色权限变更时实时更新权限菜单 ([89918a2](https://github.com/buqiyuan/vite-vue3-admin/commit/89918a2195b119f480f498d420bb29016d557846))
- 服务监控页面 ([0c3d61f](https://github.com/buqiyuan/vite-vue3-admin/commit/0c3d61fbdf4b0ecb1375990c06f5b039bed37085))
- 全局挂载 Reflect 反射对象 ([f6f4675](https://github.com/buqiyuan/vite-vue3-admin/commit/f6f4675fba8e94b8b8bb67eff79d1205e3b06fff))
- 新增按钮权限 ([5538d38](https://github.com/buqiyuan/vite-vue3-admin/commit/5538d387925b7bd53f332643903f9e4cacad0908))
- **components:** [dynamic-table] cell support defaultEditable ([125bb08](https://github.com/buqiyuan/vite-vue3-admin/commit/125bb08ef2563f4dd4f3883da679e739e3f80bad))
- **components:** [dynamic-table] support cell edit ([4411b0e](https://github.com/buqiyuan/vite-vue3-admin/commit/4411b0e49feeb93b3d1034fc038c9a778d7312af))
- **components:** [ProjectSetting] add layout mode ([815b0c2](https://github.com/buqiyuan/vite-vue3-admin/commit/815b0c2cdc063a848b88cfe35519b0755b279282))
- edit-row-table support save loading ([4d0eea6](https://github.com/buqiyuan/vite-vue3-admin/commit/4d0eea6d30d8b09d30cafb6e3bb4b80bb806c675))
- support for nested routes ([9d9e1d8](https://github.com/buqiyuan/vite-vue3-admin/commit/9d9e1d856f01e0164c88a18583957d20ace95654))
- **tools:** :art: add project config drawer ([c1f0de0](https://github.com/buqiyuan/vite-vue3-admin/commit/c1f0de05f25bbbadbcbc9f4a105e8d721b008bbb))
- update basic-form demo ([27f95ec](https://github.com/buqiyuan/vite-vue3-admin/commit/27f95ec4e7c1b57fca5af379165960167aea2e1b))
- **views:** add about page ([0a34802](https://github.com/buqiyuan/vite-vue3-admin/commit/0a34802b7ef2d2727df4b3b769bd4d664ace2bfa))
### Performance Improvements
- **tableColumns:** customRender is easy ([#10](https://github.com/buqiyuan/vite-vue3-admin/issues/10)) ([e069f3c](https://github.com/buqiyuan/vite-vue3-admin/commit/e069f3c164f92e414638cb2f681013c7dc7727a0))
- use vite-plugin-style-import replace unplugin-vue-components [#5](https://github.com/buqiyuan/vite-vue3-admin/issues/5) ([10540eb](https://github.com/buqiyuan/vite-vue3-admin/commit/10540eb1de36f4cd6048f86e5b0363109d571760))
## 1.0.2 (2022-03-15)
### Bug Fixes
- :bug: router navigation bug ([b550a7a](https://github.com/buqiyuan/vite-vue3-admin/commit/b550a7a01b486cfd161ccb8efd7bca9a0ed35627))
- :bug:生成路由出错问题 ([917e3f0](https://github.com/buqiyuan/vite-vue3-admin/commit/917e3f07209851a3df0b7e220e38df4df7612a68))
- :bug:修复某些权限码传参错误 ([47071ef](https://github.com/buqiyuan/vite-vue3-admin/commit/47071efa7beb2e210151405e2a1c7e74d6dff4f1))
- :bug:fix BASE_URL to VITE_BASE_URL ([3d32e82](https://github.com/buqiyuan/vite-vue3-admin/commit/3d32e82b838aea3c8a928989d2aa55c5d125a8ab))
- 面包屑导航和弹窗拖拽后宽度问题 ([ae96559](https://github.com/buqiyuan/vite-vue3-admin/commit/ae96559fb82a87908a40b425701eaa0ee1993aa7))
- 删除一些多余的旧代码 ([9eaa568](https://github.com/buqiyuan/vite-vue3-admin/commit/9eaa568a104e7ab1980c0d2069cbedddb4a4934b))
- **component:** :bug:修复 dynamicTable ts 类型错误 ([58b9275](https://github.com/buqiyuan/vite-vue3-admin/commit/58b9275758625f583aed644923431df72acb9687))
- remove topLevelAwait usage ([6653da6](https://github.com/buqiyuan/vite-vue3-admin/commit/6653da65f7a6d9738a39c955fb4dcb6d4f553235))
- **router:** 第一次进入页面缓存失效问题 ([1b79adc](https://github.com/buqiyuan/vite-vue3-admin/commit/1b79adc072c1c9b6518cc4c05846dfd47c954989))
- some route file path error ([c89b131](https://github.com/buqiyuan/vite-vue3-admin/commit/c89b131d77c0ee8036813a2d377774bb854c652d))
- svg can not loaded ([6aec46a](https://github.com/buqiyuan/vite-vue3-admin/commit/6aec46a00412a2b02e4090faca6722717a739550))
- xlsx.js not default export in new versions [#8](https://github.com/buqiyuan/vite-vue3-admin/issues/8) ([a0b0fc8](https://github.com/buqiyuan/vite-vue3-admin/commit/a0b0fc8c78e1cf75e5ed7e48aee03dc7ce364db4))
### Features
- 表格列设置工具栏 ([a934e12](https://github.com/buqiyuan/vite-vue3-admin/commit/a934e123426fab27fcbfbf47181f3355f584974a))
- 服务监控页面 ([0c3d61f](https://github.com/buqiyuan/vite-vue3-admin/commit/0c3d61fbdf4b0ecb1375990c06f5b039bed37085))
- 全局挂载 Reflect 反射对象 ([f6f4675](https://github.com/buqiyuan/vite-vue3-admin/commit/f6f4675fba8e94b8b8bb67eff79d1205e3b06fff))
- 新增按钮权限 ([5538d38](https://github.com/buqiyuan/vite-vue3-admin/commit/5538d387925b7bd53f332643903f9e4cacad0908))
- **views:** add about page ([0a34802](https://github.com/buqiyuan/vite-vue3-admin/commit/0a34802b7ef2d2727df4b3b769bd4d664ace2bfa))
### Performance Improvements
- **tableColumns:** customRender is easy ([#10](https://github.com/buqiyuan/vite-vue3-admin/issues/10)) ([e069f3c](https://github.com/buqiyuan/vite-vue3-admin/commit/e069f3c164f92e414638cb2f681013c7dc7727a0))
- use vite-plugin-style-import replace unplugin-vue-components [#5](https://github.com/buqiyuan/vite-vue3-admin/issues/5) ([10540eb](https://github.com/buqiyuan/vite-vue3-admin/commit/10540eb1de36f4cd6048f86e5b0363109d571760))

29
apps/platform/Dockerfile Normal file
View File

@ -0,0 +1,29 @@
# https://stackoverflow.com/questions/53681522/share-variable-in-multi-stage-dockerfile-arg-before-from-not-substituted
ARG PROJECT_DIR=/vue3-antdv-admin
FROM node:20-slim as builder
ARG PROJECT_DIR
WORKDIR $PROJECT_DIR
# 安装pnpm
RUN npm install -g pnpm
COPY . ./
# 安装依赖
# 若网络不通,可以使用淘宝源
# RUN pnpm config set registry https://registry.npmmirror.com
RUN pnpm install
# 构建项目
ENV VITE_BASE_URL=/
RUN pnpm build
FROM nginx:alpine as production
ARG PROJECT_DIR
COPY --from=builder $PROJECT_DIR/dist/ /usr/share/nginx/html
# COPY --from=builder $PROJECT_DIR/nginx.conf /etc/nginx/nginx.conf
EXPOSE 80

42
apps/platform/README.md Normal file
View File

@ -0,0 +1,42 @@
## 安装使用
- 安装依赖
```bash
pnpm install
```
- 运行
```bash
pnpm dev
```
- 打包
```bash
pnpm build
```
## vscode 配置
安装项目根目录 `.vscode` 推荐的插件,再安装 `Volar`,并禁用 `Vetur`,重启 vscode 即可。
## Git 贡献提交规范
- 参考 [vue](https://github.com/vuejs/vue/blob/dev/.github/COMMIT_CONVENTION.md) 规范 ([Angular](https://github.com/conventional-changelog/conventional-changelog/tree/master/packages/conventional-changelog-angular))
- `feat` 增加新功能
- `fix` 修复问题/BUG
- `style` 代码风格相关无影响运行结果的
- `perf` 优化/性能提升
- `refactor` 重构
- `revert` 撤销修改
- `test` 测试相关
- `docs` 文档/注释
- `chore` 依赖更新/脚手架配置修改等
- `workflow` 工作流改进
- `ci` 持续集成
- `types` 类型定义文件更改
- `wip` 开发中

View File

@ -0,0 +1,34 @@
/** @type {import("@commitlint/types").UserConfig} */
export default {
ignores: [(commit) => commit.includes('init')],
extends: ['@commitlint/config-conventional'],
rules: {
'body-leading-blank': [2, 'always'],
'footer-leading-blank': [1, 'always'],
'header-max-length': [2, 'always', 108],
'subject-empty': [2, 'never'],
'type-empty': [2, 'never'],
'subject-case': [0],
'type-enum': [
2,
'always',
[
'feat',
'fix',
'perf',
'style',
'docs',
'test',
'refactor',
'build',
'ci',
'chore',
'revert',
'wip',
'workflow',
'types',
'release',
],
],
},
};

View File

@ -0,0 +1,15 @@
version: '3'
services:
vue3-antdv-admin:
# 从当前路径构建镜像
build:
context: .
dockerfile: Dockerfile
target: production
image: buqiyuan/vue3-antdv-admin:latest
ports:
- '80:80'
env_file:
- .env
- .env.production

View File

@ -0,0 +1,206 @@
import js from '@eslint/js';
import pluginVue from 'eslint-plugin-vue';
import * as parserVue from 'vue-eslint-parser';
import configPrettier from 'eslint-config-prettier';
import pluginPrettier from 'eslint-plugin-prettier';
import pluginImport from 'eslint-plugin-import';
import { defineFlatConfig } from 'eslint-define-config';
import * as parserTypeScript from '@typescript-eslint/parser';
import pluginTypeScript from '@typescript-eslint/eslint-plugin';
import unusedImports from 'eslint-plugin-unused-imports';
export default defineFlatConfig([
{
...js.configs.recommended,
plugins: {
prettier: pluginPrettier,
},
rules: {
...configPrettier.rules,
...pluginPrettier.configs.recommended.rules,
'no-debugger': 'off',
'no-unused-vars': [
'error',
{
argsIgnorePattern: '^_',
varsIgnorePattern: '^_',
},
],
'prettier/prettier': [
'error',
{
endOfLine: 'auto',
},
],
},
},
{
files: ['**/*.?([cm])ts', '**/*.?([cm])tsx'],
languageOptions: {
parser: parserTypeScript,
parserOptions: {
sourceType: 'module',
},
},
plugins: {
'@typescript-eslint': pluginTypeScript,
},
rules: {
...pluginTypeScript.configs.strict.rules,
'@typescript-eslint/ban-types': 'off',
'@typescript-eslint/no-unused-vars': 'off',
'@typescript-eslint/no-unused-expressions': 'off',
'@typescript-eslint/no-invalid-void-type': 'off',
'@typescript-eslint/no-redeclare': 'error',
'@typescript-eslint/ban-ts-comment': 'off',
'@typescript-eslint/prefer-ts-expect-error': 'off',
'@typescript-eslint/no-explicit-any': 'off',
'@typescript-eslint/prefer-as-const': 'warn',
'@typescript-eslint/no-empty-function': 'off',
'@typescript-eslint/no-empty-object-type': 'off',
'@typescript-eslint/no-non-null-assertion': 'off',
'@typescript-eslint/no-import-type-side-effects': 'error',
'@typescript-eslint/explicit-module-boundary-types': 'off',
'@typescript-eslint/consistent-type-imports': [
'error',
{ disallowTypeAnnotations: false, fixStyle: 'inline-type-imports' },
],
'@typescript-eslint/prefer-literal-enum-member': ['error', { allowBitwiseExpressions: true }],
},
},
{
files: ['**/*.d.ts'],
rules: {
'eslint-comments/no-unlimited-disable': 'off',
'import/no-duplicates': 'off',
'unused-imports/no-unused-vars': 'off',
},
},
{
files: ['**/*.?([cm])js'],
rules: {
'@typescript-eslint/no-require-imports': 'off',
'@typescript-eslint/no-var-requires': 'off',
},
},
{
files: ['**/*.vue'],
languageOptions: {
parser: parserVue,
parserOptions: {
ecmaFeatures: {
jsx: true,
},
extraFileExtensions: ['.vue'],
parser: parserTypeScript,
sourceType: 'module',
},
},
plugins: {
vue: pluginVue,
},
processor: pluginVue.processors['.vue'],
rules: {
...pluginVue.configs.base.rules,
...pluginVue.configs['vue3-essential'].rules,
...pluginVue.configs['vue3-recommended'].rules,
'no-undef': 'off',
'no-unused-vars': 'off',
'vue/no-v-html': 'off',
'vue/require-default-prop': 'off',
'vue/require-explicit-emits': 'off',
'vue/multi-word-component-names': 'off',
'vue/no-setup-props-reactivity-loss': 'off',
'vue/html-self-closing': [
'error',
{
html: {
void: 'always',
normal: 'always',
component: 'always',
},
svg: 'always',
math: 'always',
},
],
},
},
{
files: ['**/*.vue', '**/*.?([cm])ts', '**/*.?([cm])tsx'],
plugins: {
import: pluginImport,
'unused-imports': unusedImports,
},
rules: {
'import/first': 'error',
'import/no-duplicates': 'error',
'import/order': [
'error',
{
groups: [
'builtin',
'external',
'internal',
'parent',
'sibling',
'index',
'object',
'type',
],
pathGroups: [
{
pattern: 'vue',
group: 'external',
position: 'before',
},
{
pattern: '@vue/**',
group: 'external',
position: 'before',
},
{
pattern: 'ant-design-vue',
group: 'internal',
},
],
pathGroupsExcludedImportTypes: ['type'],
},
],
'unused-imports/no-unused-imports': 'error',
// 如需保存时自动删除未引用代码,可注释掉该规则
'unused-imports/no-unused-vars': [
'warn',
{
vars: 'all',
varsIgnorePattern: '^_',
args: 'after-used',
argsIgnorePattern: '^_',
},
],
},
},
{
linterOptions: {
reportUnusedDisableDirectives: 'off',
},
ignores: [
'src/assets/**',
'*.sh',
'node_modules',
'*.md',
'*.woff',
'*.ttf',
'.vscode',
'.idea',
'dist',
'/public',
'/docs',
'.husky',
'.local',
'/bin',
'Dockerfile',
],
},
]);

17
apps/platform/index.html Normal file
View File

@ -0,0 +1,17 @@
<!doctype html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8" />
<meta name="referrer" content="origin" />
<link rel="icon" href="/favicon.ico" />
<meta
name="viewport"
content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=5.0"
/>
<title>Vite App</title>
</head>
<body>
<div id="app"></div>
<script type="module" src="/src/main.ts"></script>
</body>
</html>

View File

@ -0,0 +1,8 @@
/** @type {import('lint-staged').Config} */
export default {
'*.{js,jsx,ts,tsx}': ['eslint --fix', 'prettier --write'],
'*.json': ['prettier --write'],
'*.vue': ['eslint --fix', 'prettier --write', 'stylelint --fix --allow-empty-input'],
'*.{scss,less,styl,html}': ['stylelint --fix --allow-empty-input', 'prettier --write'],
'*.md': ['prettier --write'],
};

View File

@ -0,0 +1,104 @@
import { generateService } from '@umijs/openapi';
import type { RequestOptions } from './src/utils/request';
const re = /controller[-_ .](\w)/gi;
// swagger-typescript-api
generateService({
schemaPath: 'http://127.0.0.1:7001/api-docs-json',
serversPath: './src/api/backend',
requestOptionsType: 'RequestOptions',
// 自定义网络请求函数路径
requestImportStatement: `
/**
* @umijs/openapi openapi.config.ts
* */
import { request, type RequestOptions } from "@/utils/request";
`,
hook: {
afterOpenApiDataInited(openAPIData) {
const schemas = openAPIData.components?.schemas;
if (schemas) {
Object.values(schemas).forEach((schema) => {
if ('$ref' in schema) {
return;
}
if (schema.properties) {
Object.values(schema.properties).forEach((prop) => {
if ('$ref' in prop) {
return;
}
// 匡正文件上传的参数类型
if (prop.format === 'binary') {
prop.type = 'object';
}
});
}
});
}
return openAPIData;
},
// @ts-ignore
customFunctionName(operationObject, apiPath) {
const { operationId } = operationObject;
if (!operationId) {
console.warn('[Warning] no operationId', apiPath);
return;
}
const funcName = operationId.replace(re, (_all, letter) => letter.toUpperCase());
operationObject.operationId = funcName;
return funcName;
},
// @ts-ignore
customFileNames(operationObject, apiPath) {
const { operationId } = operationObject;
if (!operationId) {
console.warn('[Warning] no operationId', apiPath);
return;
}
const controllerName = operationId.split(re)[0];
const moduleName = operationObject.tags?.[0].split(' - ')[0];
// 移除 query 参数的默认值
operationObject.parameters?.forEach((param) => {
if ('in' in param && param.in === 'query' && param.schema) {
if (!('$ref' in param.schema) && param.schema.default) {
Reflect.deleteProperty(param.schema, 'default');
}
}
});
if (moduleName === controllerName) {
return [controllerName];
} else if (moduleName && moduleName !== controllerName) {
return [`${moduleName}_${controllerName}`];
}
return;
},
customType(schemaObject, namespace, defaultGetType) {
const type = defaultGetType(schemaObject, namespace);
// 提取出 data 的类型
const regex = /API\.ResOp & { 'data'\?: (.+); }/;
return type.replace(regex, '$1');
},
customOptionsDefaultValue(data): RequestOptions {
const { summary } = data;
if (summary?.startsWith('创建') || summary?.startsWith('新增')) {
return { successMsg: '创建成功' };
} else if (summary?.startsWith('更新')) {
return { successMsg: '更新成功' };
} else if (summary?.startsWith('删除')) {
return { successMsg: '删除成功' };
}
return {};
},
},
});

120
apps/platform/package.json Normal file
View File

@ -0,0 +1,120 @@
{
"name": "@sy/low-code-platform",
"version": "1.0.0-1",
"packageManager": "pnpm@9.4.0",
"type": "module",
"engines": {
"node": ">=20",
"pnpm": ">=9.0.2"
},
"author": {
"name": "wangxuefeng",
"email": "wangxuefeng@shiyue.com"
},
"scripts": {
"preinstall": "npx only-allow pnpm",
"serve": "npm run dev",
"dev": "vite dev",
"build": "rimraf dist && cross-env NODE_ENV=production vite build",
"build:watch": "rimraf dist && cross-env NODE_ENV=production vite build --watch",
"preview": "vite preview",
"preview:watch": "npm run build:watch && vite preview",
"clean:cache": "rimraf node_modules/.cache/ && rimraf node_modules/.vite",
"test:gzip": "npx http-server dist --cors --gzip -c-1",
"test:br": "npx http-server dist --cors --brotli -c-1",
"clean:lock": "rimraf pnpm-lock.yaml && rimraf package.lock.json",
"clean:lib": "rimraf node_modules"
},
"dependencies": {
"@ant-design/icons-vue": "~7.0.1",
"@iconify/vue": "^4.3.0",
"@vueuse/core": "~11.1.0",
"ant-design-vue": "~4.2.6",
"axios": "~1.7.9",
"crypto-js": "^4.2.0",
"dayjs": "~1.11.13",
"file-saver": "~2.0.5",
"licia-es": "^1.46.0",
"lodash-es": "~4.17.21",
"mitt": "~3.0.1",
"nprogress": "1.0.0-1",
"pinia": "~2.2.8",
"pinia-plugin-persistedstate": "^4.2.0",
"qs": "~6.13.1",
"sortablejs": "~1.15.6",
"vue": "~3.5.13",
"vue-i18n": "^11.1.1",
"vue-router": "~4.4.5",
"vue-types": "~5.1.3",
"vue-virtual-scroller": "2.0.0-beta.8",
"wujie-vue3": "^1.0.24",
"xlsx": "~0.18.5",
"core-js": "^3.40.0"
},
"devDependencies": {
"@sy/vite-plugin-http2-proxy": "workspace:*",
"@commitlint/cli": "~19.5.0",
"@commitlint/config-conventional": "~19.5.0",
"@iconify-json/ant-design": "^1.2.5",
"@iconify-json/ep": "^1.2.2",
"@iconify/json": "^2.2.307",
"@sy/low-code-designer": "workspace:*",
"@types/crypto-js": "^4.2.2",
"@types/lodash-es": "~4.17.12",
"@types/node": "~22.7.9",
"@types/qs": "^6.9.18",
"@types/sortablejs": "^1.15.8",
"@typescript-eslint/eslint-plugin": "~8.11.0",
"@typescript-eslint/parser": "~8.11.0",
"@umijs/openapi": "^1.13.0",
"@vitejs/plugin-vue": "~5.1.5",
"@vitejs/plugin-vue-jsx": "~4.0.1",
"@vue/tsconfig": "^0.5.1",
"commitizen": "~4.3.1",
"conventional-changelog-cli": "~4.1.0",
"cross-env": "~7.0.3",
"eslint": "~9.13.0",
"eslint-config-prettier": "~9.1.0",
"eslint-define-config": "~2.1.0",
"eslint-plugin-import": "~2.31.0",
"eslint-plugin-prettier": "~5.2.3",
"eslint-plugin-unused-imports": "^4.1.4",
"eslint-plugin-vue": "~9.29.1",
"less": "~4.2.2",
"lint-staged": "~15.2.11",
"msw": "^2.7.0",
"postcss": "~8.4.49",
"postcss-html": "~1.7.0",
"postcss-less": "~6.0.0",
"prettier": "~3.3.3",
"rimraf": "~6.0.1",
"stylelint": "~16.10.0",
"stylelint-config-property-sort-order-smacss": "^10.0.0",
"stylelint-config-recommended": "~14.0.1",
"stylelint-config-recommended-vue": "~1.5.0",
"stylelint-config-standard": "~36.0.1",
"stylelint-order": "~6.0.4",
"stylelint-prettier": "^5.0.3",
"typescript": "~5.6.3",
"unocss": "^65.5.0",
"unplugin-vue-components": "~0.27.5",
"vite": "~6.1.0",
"vite-plugin-checker": "~0.8.0",
"vite-plugin-inspect": "^10.2.1",
"vite-plugin-mkcert": "^1.17.6",
"vite-plugin-svg-icons": "~2.0.1",
"vite-plugin-vue-inspector": "^5.3.1",
"vue-eslint-parser": "~9.4.3",
"vue-tsc": "~2.1.10"
},
"keywords": [
"vue",
"ant-design-vue",
"vue3",
"ts",
"tsx",
"admin",
"typescript"
],
"target": "web"
}

View File

@ -0,0 +1,11 @@
/** @type {import('prettier').Config} */
export default {
printWidth: 100,
semi: true,
vueIndentScriptAndStyle: true,
singleQuote: true,
trailingComma: 'all',
proseWrap: 'never',
htmlWhitespaceSensitivity: 'strict',
endOfLine: 'auto',
};

View File

Before

Width:  |  Height:  |  Size: 4.2 KiB

After

Width:  |  Height:  |  Size: 4.2 KiB

File diff suppressed because one or more lines are too long

30
apps/platform/src/App.vue Normal file
View File

@ -0,0 +1,30 @@
<template>
<ProConfigProvider
:theme="{
algorithm: [compactAlgorithm],
}"
>
<Suspense>
<router-view v-slot="{ Component }">
<transition>
<keep-alive v-if="route.meta.keepAlive">
<component :is="Component" v-if="route.meta.keepAlive" :key="route.path" />
</keep-alive>
<component :is="Component" v-else :key="route.path" />
</transition>
</router-view>
</Suspense>
<LockScreen />
</ProConfigProvider>
</template>
<script setup lang="ts">
import { theme } from 'ant-design-vue';
import { LockScreen } from '@/components/basic/lockscreen';
import { useRoute } from 'vue-router';
const route = useRoute();
const { compactAlgorithm } = theme;
</script>

View File

@ -0,0 +1,64 @@
// @ts-ignore
/* eslint-disable */
/**
* @umijs/openapi openapi.config.ts
* */
import { request, type RequestOptions } from '@/utils/request';
/** 账户登出 GET /api/account/logout */
export async function accountLogout(options?: RequestOptions) {
return request<any>('/api/account/logout', {
method: 'GET',
...(options || {}),
});
}
/** 获取菜单列表 GET /api/account/menus */
export async function accountMenu(options?: RequestOptions) {
return request<API.AccountMenus[]>('/api/account/menus', {
method: 'GET',
...(options || {}),
});
}
/** 更改账户密码 POST /api/account/password */
export async function accountPassword(body: API.PasswordUpdateDto, options?: RequestOptions) {
return request<any>('/api/account/password', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
data: body,
...(options || {}),
});
}
/** 获取权限列表 GET /api/account/permissions */
export async function accountPermissions(options?: RequestOptions) {
return request<string[]>('/api/account/permissions', {
method: 'GET',
...(options || {}),
});
}
/** 获取账户资料 GET /api/account/profile */
export async function accountProfile(options?: RequestOptions) {
return request<API.AccountInfo>('/api/account/profile', {
method: 'GET',
...(options || {}),
});
}
/** 更改账户资料 PUT /api/account/update */
export async function accountUpdate(body: API.AccountUpdateDto, options?: RequestOptions) {
return request<any>('/api/account/update', {
method: 'PUT',
headers: {
'Content-Type': 'application/json',
},
data: body,
...(options || {}),
});
}

View File

@ -0,0 +1,32 @@
// @ts-ignore
/* eslint-disable */
/**
* @umijs/openapi openapi.config.ts
* */
import { request, type RequestOptions } from '@/utils/request';
/** 登录 POST /api/auth/login */
export async function authLogin(body: API.LoginDto, options?: RequestOptions) {
return request<API.LoginToken>('/api/auth/login', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
data: body,
...(options || {}),
});
}
/** 注册 POST /api/auth/register */
export async function authRegister(body: API.RegisterDto, options?: RequestOptions) {
return request<any>('/api/auth/register', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
data: body,
...(options || {}),
});
}

View File

@ -0,0 +1,20 @@
// @ts-ignore
/* eslint-disable */
/**
* @umijs/openapi openapi.config.ts
* */
import { request, type RequestOptions } from '@/utils/request';
/** 发送邮箱验证码 POST /api/auth/email/send */
export async function emailSendEmailCode(body: API.SendEmailCodeDto, options?: RequestOptions) {
return request<any>('/api/auth/email/send', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
data: body,
...(options || {}),
});
}

View File

@ -0,0 +1,82 @@
// @ts-ignore
/* eslint-disable */
/**
* @umijs/openapi openapi.config.ts
* */
import { request, type RequestOptions } from '@/utils/request';
/** 获取Todo列表 GET /api/todos */
export async function todoList(
// 叠加生成的Param类型 (非body参数swagger默认没有生成对象)
params: API.TodoListParams,
options?: RequestOptions,
) {
return request<API.TodoEntity[]>('/api/todos', {
method: 'GET',
params: {
...params,
},
...(options || {}),
});
}
/** 创建Todo POST /api/todos */
export async function todoCreate(body: API.TodoDto, options?: RequestOptions) {
return request<any>('/api/todos', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
data: body,
...(options || { successMsg: '创建成功' }),
});
}
/** 获取Todo详情 GET /api/todos/${param0} */
export async function todoInfo(
// 叠加生成的Param类型 (非body参数swagger默认没有生成对象)
params: API.TodoInfoParams,
options?: RequestOptions,
) {
const { id: param0, ...queryParams } = params;
return request<API.TodoEntity>(`/api/todos/${param0}`, {
method: 'GET',
params: { ...queryParams },
...(options || {}),
});
}
/** 更新Todo PUT /api/todos/${param0} */
export async function todoUpdate(
// 叠加生成的Param类型 (非body参数swagger默认没有生成对象)
params: API.TodoUpdateParams,
body: API.TodoUpdateDto,
options?: RequestOptions,
) {
const { id: param0, ...queryParams } = params;
return request<any>(`/api/todos/${param0}`, {
method: 'PUT',
headers: {
'Content-Type': 'application/json',
},
params: { ...queryParams },
data: body,
...(options || { successMsg: '更新成功' }),
});
}
/** 删除Todo DELETE /api/todos/${param0} */
export async function todoDelete(
// 叠加生成的Param类型 (非body参数swagger默认没有生成对象)
params: API.TodoDeleteParams,
options?: RequestOptions,
) {
const { id: param0, ...queryParams } = params;
return request<any>(`/api/todos/${param0}`, {
method: 'DELETE',
params: { ...queryParams },
...(options || { successMsg: '删除成功' }),
});
}

View File

@ -0,0 +1,23 @@
// @ts-ignore
/* eslint-disable */
/**
* @umijs/openapi openapi.config.ts
* */
import { request, type RequestOptions } from '@/utils/request';
/** 获取登录图片验证码 GET /api/auth/captcha/img */
export async function captchaCaptchaByImg(
// 叠加生成的Param类型 (非body参数swagger默认没有生成对象)
params: API.CaptchaCaptchaByImgParams,
options?: RequestOptions,
) {
return request<API.ImageCaptcha>('/api/auth/captcha/img', {
method: 'GET',
params: {
...params,
},
...(options || {}),
});
}

View File

@ -0,0 +1,73 @@
// @ts-ignore
/* eslint-disable */
/**
* @umijs/openapi openapi.config.ts
* */
import { request, type RequestOptions } from '@/utils/request';
/** 此处后端没有提供注释 GET /api/health/database */
export async function healthCheckDatabase(options?: RequestOptions) {
return request<{
status?: string;
info?: Record<string, any>;
error?: Record<string, any>;
details?: Record<string, any>;
}>('/api/health/database', {
method: 'GET',
...(options || {}),
});
}
/** 此处后端没有提供注释 GET /api/health/disk */
export async function healthCheckDisk(options?: RequestOptions) {
return request<{
status?: string;
info?: Record<string, any>;
error?: Record<string, any>;
details?: Record<string, any>;
}>('/api/health/disk', {
method: 'GET',
...(options || {}),
});
}
/** 此处后端没有提供注释 GET /api/health/memory-heap */
export async function healthCheckMemoryHeap(options?: RequestOptions) {
return request<{
status?: string;
info?: Record<string, any>;
error?: Record<string, any>;
details?: Record<string, any>;
}>('/api/health/memory-heap', {
method: 'GET',
...(options || {}),
});
}
/** 此处后端没有提供注释 GET /api/health/memory-rss */
export async function healthCheckMemoryRss(options?: RequestOptions) {
return request<{
status?: string;
info?: Record<string, any>;
error?: Record<string, any>;
details?: Record<string, any>;
}>('/api/health/memory-rss', {
method: 'GET',
...(options || {}),
});
}
/** 此处后端没有提供注释 GET /api/health/network */
export async function healthCheckNetwork(options?: RequestOptions) {
return request<{
status?: string;
info?: Record<string, any>;
error?: Record<string, any>;
details?: Record<string, any>;
}>('/api/health/network', {
method: 'GET',
...(options || {}),
});
}

View File

@ -0,0 +1,54 @@
// @ts-ignore
/* eslint-disable */
// API 更新时间:
// API 唯一标识:
import * as auth from './auth';
import * as account from './account';
import * as captcha from './captcha';
import * as authEmail from './authEmail';
import * as systemUser from './systemUser';
import * as systemRole from './systemRole';
import * as systemMenu from './systemMenu';
import * as systemParamConfig from './systemParamConfig';
import * as systemLog from './systemLog';
import * as systemDept from './systemDept';
import * as systemDictType from './systemDictType';
import * as systemDictItem from './systemDictItem';
import * as systemTask from './systemTask';
import * as systemOnline from './systemOnline';
import * as systemSse from './systemSse';
import * as systemServe from './systemServe';
import * as toolsStorage from './toolsStorage';
import * as systemEmail from './systemEmail';
import * as toolsUpload from './toolsUpload';
import * as health from './health';
import * as netDiskManage from './netDiskManage';
import * as netDiskOverview from './netDiskOverview';
import * as businessTodo from './businessTodo';
import * as user from './user';
export default {
auth,
account,
captcha,
authEmail,
systemUser,
systemRole,
systemMenu,
systemParamConfig,
systemLog,
systemDept,
systemDictType,
systemDictItem,
systemTask,
systemOnline,
systemSse,
systemServe,
toolsStorage,
systemEmail,
toolsUpload,
health,
netDiskManage,
netDiskOverview,
businessTodo,
user,
};

View File

@ -0,0 +1,133 @@
// @ts-ignore
/* eslint-disable */
/**
* @umijs/openapi openapi.config.ts
* */
import { request, type RequestOptions } from '@/utils/request';
/** 复制文件或文件夹,支持批量 POST /api/netdisk/manage/copy */
export async function netDiskManageCopy(body: API.FileOpDto, options?: RequestOptions) {
return request<any>('/api/netdisk/manage/copy', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
data: body,
...(options || {}),
});
}
/** 剪切文件或文件夹,支持批量 POST /api/netdisk/manage/cut */
export async function netDiskManageCut(body: API.FileOpDto, options?: RequestOptions) {
return request<any>('/api/netdisk/manage/cut', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
data: body,
...(options || {}),
});
}
/** 删除文件或文件夹 POST /api/netdisk/manage/delete */
export async function netDiskManageDelete(body: API.DeleteDto, options?: RequestOptions) {
return request<any>('/api/netdisk/manage/delete', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
data: body,
...(options || { successMsg: '删除成功' }),
});
}
/** 获取下载链接,不支持下载文件夹 GET /api/netdisk/manage/download */
export async function netDiskManageDownload(
// 叠加生成的Param类型 (非body参数swagger默认没有生成对象)
params: API.NetDiskManageDownloadParams,
options?: RequestOptions,
) {
return request<string>('/api/netdisk/manage/download', {
method: 'GET',
params: {
...params,
},
...(options || {}),
});
}
/** 获取文件详细信息 GET /api/netdisk/manage/info */
export async function netDiskManageInfo(
// 叠加生成的Param类型 (非body参数swagger默认没有生成对象)
params: API.NetDiskManageInfoParams,
options?: RequestOptions,
) {
return request<API.SFileInfoDetail>('/api/netdisk/manage/info', {
method: 'GET',
params: {
...params,
},
...(options || {}),
});
}
/** 获取文件列表 GET /api/netdisk/manage/list */
export async function netDiskManageList(
// 叠加生成的Param类型 (非body参数swagger默认没有生成对象)
params: API.NetDiskManageListParams,
options?: RequestOptions,
) {
return request<API.SFileList>('/api/netdisk/manage/list', {
method: 'GET',
params: {
...params,
},
...(options || {}),
});
}
/** 添加文件备注 POST /api/netdisk/manage/mark */
export async function netDiskManageMark(body: API.MarkFileDto, options?: RequestOptions) {
return request<any>('/api/netdisk/manage/mark', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
data: body,
...(options || {}),
});
}
/** 创建文件夹,支持多级 POST /api/netdisk/manage/mkdir */
export async function netDiskManageMkdir(body: API.MKDirDto, options?: RequestOptions) {
return request<any>('/api/netdisk/manage/mkdir', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
data: body,
...(options || { successMsg: '创建成功' }),
});
}
/** 重命名文件或文件夹 POST /api/netdisk/manage/rename */
export async function netDiskManageRename(body: API.RenameDto, options?: RequestOptions) {
return request<any>('/api/netdisk/manage/rename', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
data: body,
...(options || {}),
});
}
/** 获取上传Token无Token前端无法上传 GET /api/netdisk/manage/token */
export async function netDiskManageToken(options?: RequestOptions) {
return request<API.UploadToken>('/api/netdisk/manage/token', {
method: 'GET',
...(options || {}),
});
}

View File

@ -0,0 +1,16 @@
// @ts-ignore
/* eslint-disable */
/**
* @umijs/openapi openapi.config.ts
* */
import { request, type RequestOptions } from '@/utils/request';
/** 获取网盘空间数据统计 GET /api/netdisk/overview/desc */
export async function netDiskOverviewSpace(options?: RequestOptions) {
return request<API.OverviewSpaceInfo>('/api/netdisk/overview/desc', {
method: 'GET',
...(options || {}),
});
}

View File

@ -0,0 +1,82 @@
// @ts-ignore
/* eslint-disable */
/**
* @umijs/openapi openapi.config.ts
* */
import { request, type RequestOptions } from '@/utils/request';
/** 获取部门列表 GET /api/system/depts */
export async function deptList(
// 叠加生成的Param类型 (非body参数swagger默认没有生成对象)
params: API.DeptListParams,
options?: RequestOptions,
) {
return request<API.DeptEntity[]>('/api/system/depts', {
method: 'GET',
params: {
...params,
},
...(options || {}),
});
}
/** 创建部门 POST /api/system/depts */
export async function deptCreate(body: API.DeptDto, options?: RequestOptions) {
return request<any>('/api/system/depts', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
data: body,
...(options || { successMsg: '创建成功' }),
});
}
/** 查询部门信息 GET /api/system/depts/${param0} */
export async function deptInfo(
// 叠加生成的Param类型 (非body参数swagger默认没有生成对象)
params: API.DeptInfoParams,
options?: RequestOptions,
) {
const { id: param0, ...queryParams } = params;
return request<API.DeptEntity>(`/api/system/depts/${param0}`, {
method: 'GET',
params: { ...queryParams },
...(options || {}),
});
}
/** 更新部门 PUT /api/system/depts/${param0} */
export async function deptUpdate(
// 叠加生成的Param类型 (非body参数swagger默认没有生成对象)
params: API.DeptUpdateParams,
body: API.DeptDto,
options?: RequestOptions,
) {
const { id: param0, ...queryParams } = params;
return request<any>(`/api/system/depts/${param0}`, {
method: 'PUT',
headers: {
'Content-Type': 'application/json',
},
params: { ...queryParams },
data: body,
...(options || { successMsg: '更新成功' }),
});
}
/** 删除部门 DELETE /api/system/depts/${param0} */
export async function deptDelete(
// 叠加生成的Param类型 (非body参数swagger默认没有生成对象)
params: API.DeptDeleteParams,
options?: RequestOptions,
) {
const { id: param0, ...queryParams } = params;
return request<any>(`/api/system/depts/${param0}`, {
method: 'DELETE',
params: { ...queryParams },
...(options || { successMsg: '删除成功' }),
});
}

View File

@ -0,0 +1,91 @@
// @ts-ignore
/* eslint-disable */
/**
* @umijs/openapi openapi.config.ts
* */
import { request, type RequestOptions } from '@/utils/request';
/** 获取字典项列表 GET /api/system/dict-item */
export async function dictItemList(
// 叠加生成的Param类型 (非body参数swagger默认没有生成对象)
params: API.DictItemListParams,
options?: RequestOptions,
) {
return request<{
items?: API.DictItemEntity[];
meta?: {
itemCount?: number;
totalItems?: number;
itemsPerPage?: number;
totalPages?: number;
currentPage?: number;
};
}>('/api/system/dict-item', {
method: 'GET',
params: {
...params,
},
...(options || {}),
});
}
/** 新增字典项 POST /api/system/dict-item */
export async function dictItemCreate(body: API.DictItemDto, options?: RequestOptions) {
return request<any>('/api/system/dict-item', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
data: body,
...(options || { successMsg: '创建成功' }),
});
}
/** 查询字典项信息 GET /api/system/dict-item/${param0} */
export async function dictItemInfo(
// 叠加生成的Param类型 (非body参数swagger默认没有生成对象)
params: API.DictItemInfoParams,
options?: RequestOptions,
) {
const { id: param0, ...queryParams } = params;
return request<API.DictItemEntity>(`/api/system/dict-item/${param0}`, {
method: 'GET',
params: { ...queryParams },
...(options || {}),
});
}
/** 更新字典项 POST /api/system/dict-item/${param0} */
export async function dictItemUpdate(
// 叠加生成的Param类型 (非body参数swagger默认没有生成对象)
params: API.DictItemUpdateParams,
body: API.DictItemDto,
options?: RequestOptions,
) {
const { id: param0, ...queryParams } = params;
return request<any>(`/api/system/dict-item/${param0}`, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
params: { ...queryParams },
data: body,
...(options || { successMsg: '更新成功' }),
});
}
/** 删除指定的字典项 DELETE /api/system/dict-item/${param0} */
export async function dictItemDelete(
// 叠加生成的Param类型 (非body参数swagger默认没有生成对象)
params: API.DictItemDeleteParams,
options?: RequestOptions,
) {
const { id: param0, ...queryParams } = params;
return request<any>(`/api/system/dict-item/${param0}`, {
method: 'DELETE',
params: { ...queryParams },
...(options || { successMsg: '删除成功' }),
});
}

View File

@ -0,0 +1,99 @@
// @ts-ignore
/* eslint-disable */
/**
* @umijs/openapi openapi.config.ts
* */
import { request, type RequestOptions } from '@/utils/request';
/** 获取字典类型列表 GET /api/system/dict-type */
export async function dictTypeList(
// 叠加生成的Param类型 (非body参数swagger默认没有生成对象)
params: API.DictTypeListParams,
options?: RequestOptions,
) {
return request<{
items?: API.DictTypeEntity[];
meta?: {
itemCount?: number;
totalItems?: number;
itemsPerPage?: number;
totalPages?: number;
currentPage?: number;
};
}>('/api/system/dict-type', {
method: 'GET',
params: {
...params,
},
...(options || {}),
});
}
/** 新增字典类型 POST /api/system/dict-type */
export async function dictTypeCreate(body: API.DictTypeDto, options?: RequestOptions) {
return request<any>('/api/system/dict-type', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
data: body,
...(options || { successMsg: '创建成功' }),
});
}
/** 查询字典类型信息 GET /api/system/dict-type/${param0} */
export async function dictTypeInfo(
// 叠加生成的Param类型 (非body参数swagger默认没有生成对象)
params: API.DictTypeInfoParams,
options?: RequestOptions,
) {
const { id: param0, ...queryParams } = params;
return request<API.DictTypeEntity>(`/api/system/dict-type/${param0}`, {
method: 'GET',
params: { ...queryParams },
...(options || {}),
});
}
/** 更新字典类型 POST /api/system/dict-type/${param0} */
export async function dictTypeUpdate(
// 叠加生成的Param类型 (非body参数swagger默认没有生成对象)
params: API.DictTypeUpdateParams,
body: API.DictTypeDto,
options?: RequestOptions,
) {
const { id: param0, ...queryParams } = params;
return request<any>(`/api/system/dict-type/${param0}`, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
params: { ...queryParams },
data: body,
...(options || { successMsg: '更新成功' }),
});
}
/** 删除指定的字典类型 DELETE /api/system/dict-type/${param0} */
export async function dictTypeDelete(
// 叠加生成的Param类型 (非body参数swagger默认没有生成对象)
params: API.DictTypeDeleteParams,
options?: RequestOptions,
) {
const { id: param0, ...queryParams } = params;
return request<any>(`/api/system/dict-type/${param0}`, {
method: 'DELETE',
params: { ...queryParams },
...(options || { successMsg: '删除成功' }),
});
}
/** 一次性获取所有的字典类型(不分页) GET /api/system/dict-type/select-options */
export async function dictTypeGetAll(options?: RequestOptions) {
return request<API.DictTypeEntity[]>('/api/system/dict-type/select-options', {
method: 'GET',
...(options || {}),
});
}

View File

@ -0,0 +1,20 @@
// @ts-ignore
/* eslint-disable */
/**
* @umijs/openapi openapi.config.ts
* */
import { request, type RequestOptions } from '@/utils/request';
/** 发送邮件 POST /api/tools/email/send */
export async function emailSend(body: API.EmailSendDto, options?: RequestOptions) {
return request<any>('/api/tools/email/send', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
data: body,
...(options || {}),
});
}

View File

@ -0,0 +1,80 @@
// @ts-ignore
/* eslint-disable */
/**
* @umijs/openapi openapi.config.ts
* */
import { request, type RequestOptions } from '@/utils/request';
/** 查询验证码日志列表 GET /api/system/log/captcha/list */
export async function logCaptchaList(
// 叠加生成的Param类型 (非body参数swagger默认没有生成对象)
params: API.LogCaptchaListParams,
options?: RequestOptions,
) {
return request<{
items?: API.CaptchaLogEntity[];
meta?: {
itemCount?: number;
totalItems?: number;
itemsPerPage?: number;
totalPages?: number;
currentPage?: number;
};
}>('/api/system/log/captcha/list', {
method: 'GET',
params: {
...params,
},
...(options || {}),
});
}
/** 查询登录日志列表 GET /api/system/log/login/list */
export async function logLoginLogPage(
// 叠加生成的Param类型 (非body参数swagger默认没有生成对象)
params: API.LogLoginLogPageParams,
options?: RequestOptions,
) {
return request<{
items?: API.LoginLogInfo[];
meta?: {
itemCount?: number;
totalItems?: number;
itemsPerPage?: number;
totalPages?: number;
currentPage?: number;
};
}>('/api/system/log/login/list', {
method: 'GET',
params: {
...params,
},
...(options || {}),
});
}
/** 查询任务日志列表 GET /api/system/log/task/list */
export async function logTaskList(
// 叠加生成的Param类型 (非body参数swagger默认没有生成对象)
params: API.LogTaskListParams,
options?: RequestOptions,
) {
return request<{
items?: API.TaskLogEntity[];
meta?: {
itemCount?: number;
totalItems?: number;
itemsPerPage?: number;
totalPages?: number;
currentPage?: number;
};
}>('/api/system/log/task/list', {
method: 'GET',
params: {
...params,
},
...(options || {}),
});
}

View File

@ -0,0 +1,90 @@
// @ts-ignore
/* eslint-disable */
/**
* @umijs/openapi openapi.config.ts
* */
import { request, type RequestOptions } from '@/utils/request';
/** 获取所有菜单列表 GET /api/system/menus */
export async function menuList(
// 叠加生成的Param类型 (非body参数swagger默认没有生成对象)
params: API.MenuListParams,
options?: RequestOptions,
) {
return request<API.MenuItemInfo[]>('/api/system/menus', {
method: 'GET',
params: {
...params,
},
...(options || {}),
});
}
/** 新增菜单或权限 POST /api/system/menus */
export async function menuCreate(body: API.MenuDto, options?: RequestOptions) {
return request<any>('/api/system/menus', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
data: body,
...(options || { successMsg: '创建成功' }),
});
}
/** 获取菜单或权限信息 GET /api/system/menus/${param0} */
export async function menuInfo(
// 叠加生成的Param类型 (非body参数swagger默认没有生成对象)
params: API.MenuInfoParams,
options?: RequestOptions,
) {
const { id: param0, ...queryParams } = params;
return request<any>(`/api/system/menus/${param0}`, {
method: 'GET',
params: { ...queryParams },
...(options || {}),
});
}
/** 更新菜单或权限 PUT /api/system/menus/${param0} */
export async function menuUpdate(
// 叠加生成的Param类型 (非body参数swagger默认没有生成对象)
params: API.MenuUpdateParams,
body: API.MenuUpdateDto,
options?: RequestOptions,
) {
const { id: param0, ...queryParams } = params;
return request<any>(`/api/system/menus/${param0}`, {
method: 'PUT',
headers: {
'Content-Type': 'application/json',
},
params: { ...queryParams },
data: body,
...(options || { successMsg: '更新成功' }),
});
}
/** 删除菜单或权限 DELETE /api/system/menus/${param0} */
export async function menuDelete(
// 叠加生成的Param类型 (非body参数swagger默认没有生成对象)
params: API.MenuDeleteParams,
options?: RequestOptions,
) {
const { id: param0, ...queryParams } = params;
return request<any>(`/api/system/menus/${param0}`, {
method: 'DELETE',
params: { ...queryParams },
...(options || { successMsg: '删除成功' }),
});
}
/** 获取后端定义的所有权限集 GET /api/system/menus/permissions */
export async function menuGetPermissions(options?: RequestOptions) {
return request<string[]>('/api/system/menus/permissions', {
method: 'GET',
...(options || {}),
});
}

View File

@ -0,0 +1,28 @@
// @ts-ignore
/* eslint-disable */
/**
* @umijs/openapi openapi.config.ts
* */
import { request, type RequestOptions } from '@/utils/request';
/** 下线指定在线用户 POST /api/system/online/kick */
export async function onlineKick(body: API.KickDto, options?: RequestOptions) {
return request<any>('/api/system/online/kick', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
data: body,
...(options || {}),
});
}
/** 查询当前在线用户 GET /api/system/online/list */
export async function onlineList(options?: RequestOptions) {
return request<API.OnlineUserInfo[]>('/api/system/online/list', {
method: 'GET',
...(options || {}),
});
}

View File

@ -0,0 +1,91 @@
// @ts-ignore
/* eslint-disable */
/**
* @umijs/openapi openapi.config.ts
* */
import { request, type RequestOptions } from '@/utils/request';
/** 获取参数配置列表 GET /api/system/param-config */
export async function paramConfigList(
// 叠加生成的Param类型 (非body参数swagger默认没有生成对象)
params: API.ParamConfigListParams,
options?: RequestOptions,
) {
return request<{
items?: API.ParamConfigEntity[];
meta?: {
itemCount?: number;
totalItems?: number;
itemsPerPage?: number;
totalPages?: number;
currentPage?: number;
};
}>('/api/system/param-config', {
method: 'GET',
params: {
...params,
},
...(options || {}),
});
}
/** 新增参数配置 POST /api/system/param-config */
export async function paramConfigCreate(body: API.ParamConfigDto, options?: RequestOptions) {
return request<any>('/api/system/param-config', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
data: body,
...(options || { successMsg: '创建成功' }),
});
}
/** 查询参数配置信息 GET /api/system/param-config/${param0} */
export async function paramConfigInfo(
// 叠加生成的Param类型 (非body参数swagger默认没有生成对象)
params: API.ParamConfigInfoParams,
options?: RequestOptions,
) {
const { id: param0, ...queryParams } = params;
return request<API.ParamConfigEntity>(`/api/system/param-config/${param0}`, {
method: 'GET',
params: { ...queryParams },
...(options || {}),
});
}
/** 更新参数配置 POST /api/system/param-config/${param0} */
export async function paramConfigUpdate(
// 叠加生成的Param类型 (非body参数swagger默认没有生成对象)
params: API.ParamConfigUpdateParams,
body: API.ParamConfigDto,
options?: RequestOptions,
) {
const { id: param0, ...queryParams } = params;
return request<any>(`/api/system/param-config/${param0}`, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
params: { ...queryParams },
data: body,
...(options || { successMsg: '更新成功' }),
});
}
/** 删除指定的参数配置 DELETE /api/system/param-config/${param0} */
export async function paramConfigDelete(
// 叠加生成的Param类型 (非body参数swagger默认没有生成对象)
params: API.ParamConfigDeleteParams,
options?: RequestOptions,
) {
const { id: param0, ...queryParams } = params;
return request<any>(`/api/system/param-config/${param0}`, {
method: 'DELETE',
params: { ...queryParams },
...(options || { successMsg: '删除成功' }),
});
}

View File

@ -0,0 +1,91 @@
// @ts-ignore
/* eslint-disable */
/**
* @umijs/openapi openapi.config.ts
* */
import { request, type RequestOptions } from '@/utils/request';
/** 获取角色列表 GET /api/system/roles */
export async function roleList(
// 叠加生成的Param类型 (非body参数swagger默认没有生成对象)
params: API.RoleListParams,
options?: RequestOptions,
) {
return request<{
items?: API.RoleEntity[];
meta?: {
itemCount?: number;
totalItems?: number;
itemsPerPage?: number;
totalPages?: number;
currentPage?: number;
};
}>('/api/system/roles', {
method: 'GET',
params: {
...params,
},
...(options || {}),
});
}
/** 新增角色 POST /api/system/roles */
export async function roleCreate(body: API.RoleDto, options?: RequestOptions) {
return request<any>('/api/system/roles', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
data: body,
...(options || { successMsg: '创建成功' }),
});
}
/** 获取角色信息 GET /api/system/roles/${param0} */
export async function roleInfo(
// 叠加生成的Param类型 (非body参数swagger默认没有生成对象)
params: API.RoleInfoParams,
options?: RequestOptions,
) {
const { id: param0, ...queryParams } = params;
return request<API.RoleInfo>(`/api/system/roles/${param0}`, {
method: 'GET',
params: { ...queryParams },
...(options || {}),
});
}
/** 更新角色 PUT /api/system/roles/${param0} */
export async function roleUpdate(
// 叠加生成的Param类型 (非body参数swagger默认没有生成对象)
params: API.RoleUpdateParams,
body: API.RoleUpdateDto,
options?: RequestOptions,
) {
const { id: param0, ...queryParams } = params;
return request<any>(`/api/system/roles/${param0}`, {
method: 'PUT',
headers: {
'Content-Type': 'application/json',
},
params: { ...queryParams },
data: body,
...(options || { successMsg: '更新成功' }),
});
}
/** 删除角色 DELETE /api/system/roles/${param0} */
export async function roleDelete(
// 叠加生成的Param类型 (非body参数swagger默认没有生成对象)
params: API.RoleDeleteParams,
options?: RequestOptions,
) {
const { id: param0, ...queryParams } = params;
return request<any>(`/api/system/roles/${param0}`, {
method: 'DELETE',
params: { ...queryParams },
...(options || { successMsg: '删除成功' }),
});
}

View File

@ -0,0 +1,16 @@
// @ts-ignore
/* eslint-disable */
/**
* @umijs/openapi openapi.config.ts
* */
import { request, type RequestOptions } from '@/utils/request';
/** 获取服务器运行信息 GET /api/system/serve/stat */
export async function serveStat(options?: RequestOptions) {
return request<API.ServeStatInfo>('/api/system/serve/stat', {
method: 'GET',
...(options || {}),
});
}

View File

@ -0,0 +1,22 @@
// @ts-ignore
/* eslint-disable */
/**
* @umijs/openapi openapi.config.ts
* */
import { request, type RequestOptions } from '@/utils/request';
/** 服务端推送消息 GET /api/sse/${param0} */
export async function sseSse(
// 叠加生成的Param类型 (非body参数swagger默认没有生成对象)
params: API.SseSseParams,
options?: RequestOptions,
) {
const { uid: param0, ...queryParams } = params;
return request<Record<string, any>>(`/api/sse/${param0}`, {
method: 'GET',
params: { ...queryParams },
...(options || {}),
});
}

View File

@ -0,0 +1,133 @@
// @ts-ignore
/* eslint-disable */
/**
* @umijs/openapi openapi.config.ts
* */
import { request, type RequestOptions } from '@/utils/request';
/** 获取任务列表 GET /api/system/tasks */
export async function taskList(
// 叠加生成的Param类型 (非body参数swagger默认没有生成对象)
params: API.TaskListParams,
options?: RequestOptions,
) {
return request<{
items?: API.TaskEntity[];
meta?: {
itemCount?: number;
totalItems?: number;
itemsPerPage?: number;
totalPages?: number;
currentPage?: number;
};
}>('/api/system/tasks', {
method: 'GET',
params: {
...params,
},
...(options || {}),
});
}
/** 添加任务 POST /api/system/tasks */
export async function taskCreate(body: API.TaskDto, options?: RequestOptions) {
return request<any>('/api/system/tasks', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
data: body,
...(options || {}),
});
}
/** 查询任务详细信息 GET /api/system/tasks/${param0} */
export async function taskInfo(
// 叠加生成的Param类型 (非body参数swagger默认没有生成对象)
params: API.TaskInfoParams,
options?: RequestOptions,
) {
const { id: param0, ...queryParams } = params;
return request<API.TaskEntity>(`/api/system/tasks/${param0}`, {
method: 'GET',
params: { ...queryParams },
...(options || {}),
});
}
/** 更新任务 PUT /api/system/tasks/${param0} */
export async function taskUpdate(
// 叠加生成的Param类型 (非body参数swagger默认没有生成对象)
params: API.TaskUpdateParams,
body: API.TaskUpdateDto,
options?: RequestOptions,
) {
const { id: param0, ...queryParams } = params;
return request<any>(`/api/system/tasks/${param0}`, {
method: 'PUT',
headers: {
'Content-Type': 'application/json',
},
params: { ...queryParams },
data: body,
...(options || { successMsg: '更新成功' }),
});
}
/** 删除任务 DELETE /api/system/tasks/${param0} */
export async function taskDelete(
// 叠加生成的Param类型 (非body参数swagger默认没有生成对象)
params: API.TaskDeleteParams,
options?: RequestOptions,
) {
const { id: param0, ...queryParams } = params;
return request<any>(`/api/system/tasks/${param0}`, {
method: 'DELETE',
params: { ...queryParams },
...(options || { successMsg: '删除成功' }),
});
}
/** 手动执行一次任务 PUT /api/system/tasks/${param0}/once */
export async function taskOnce(
// 叠加生成的Param类型 (非body参数swagger默认没有生成对象)
params: API.TaskOnceParams,
options?: RequestOptions,
) {
const { id: param0, ...queryParams } = params;
return request<any>(`/api/system/tasks/${param0}/once`, {
method: 'PUT',
params: { ...queryParams },
...(options || {}),
});
}
/** 启动任务 PUT /api/system/tasks/${param0}/start */
export async function taskStart(
// 叠加生成的Param类型 (非body参数swagger默认没有生成对象)
params: API.TaskStartParams,
options?: RequestOptions,
) {
const { id: param0, ...queryParams } = params;
return request<any>(`/api/system/tasks/${param0}/start`, {
method: 'PUT',
params: { ...queryParams },
...(options || {}),
});
}
/** 停止任务 PUT /api/system/tasks/${param0}/stop */
export async function taskStop(
// 叠加生成的Param类型 (非body参数swagger默认没有生成对象)
params: API.TaskStopParams,
options?: RequestOptions,
) {
const { id: param0, ...queryParams } = params;
return request<any>(`/api/system/tasks/${param0}/stop`, {
method: 'PUT',
params: { ...queryParams },
...(options || {}),
});
}

View File

@ -0,0 +1,110 @@
// @ts-ignore
/* eslint-disable */
/**
* @umijs/openapi openapi.config.ts
* */
import { request, type RequestOptions } from '@/utils/request';
/** 获取用户列表 GET /api/system/users */
export async function userList(
// 叠加生成的Param类型 (非body参数swagger默认没有生成对象)
params: API.UserListParams,
options?: RequestOptions,
) {
return request<{
items?: API.UserEntity[];
meta?: {
itemCount?: number;
totalItems?: number;
itemsPerPage?: number;
totalPages?: number;
currentPage?: number;
};
}>('/api/system/users', {
method: 'GET',
params: {
...params,
},
...(options || {}),
});
}
/** 新增用户 POST /api/system/users */
export async function userCreate(body: API.UserDto, options?: RequestOptions) {
return request<any>('/api/system/users', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
data: body,
...(options || { successMsg: '创建成功' }),
});
}
/** 查询用户 GET /api/system/users/${param0} */
export async function userRead(
// 叠加生成的Param类型 (非body参数swagger默认没有生成对象)
params: API.UserReadParams,
options?: RequestOptions,
) {
const { id: param0, ...queryParams } = params;
return request<API.UserEntity>(`/api/system/users/${param0}`, {
method: 'GET',
params: { ...queryParams },
...(options || {}),
});
}
/** 更新用户 PUT /api/system/users/${param0} */
export async function userUpdate(
// 叠加生成的Param类型 (非body参数swagger默认没有生成对象)
params: API.UserUpdateParams,
body: API.UserUpdateDto,
options?: RequestOptions,
) {
const { id: param0, ...queryParams } = params;
return request<any>(`/api/system/users/${param0}`, {
method: 'PUT',
headers: {
'Content-Type': 'application/json',
},
params: { ...queryParams },
data: body,
...(options || { successMsg: '更新成功' }),
});
}
/** 删除用户 DELETE /api/system/users/${param0} */
export async function userDelete(
// 叠加生成的Param类型 (非body参数swagger默认没有生成对象)
params: API.UserDeleteParams,
options?: RequestOptions,
) {
const { id: param0, ...queryParams } = params;
return request<any>(`/api/system/users/${param0}`, {
method: 'DELETE',
params: { ...queryParams },
...(options || { successMsg: '删除成功' }),
});
}
/** 更改用户密码 POST /api/system/users/${param0}/password */
export async function userPassword(
// 叠加生成的Param类型 (非body参数swagger默认没有生成对象)
params: API.UserPasswordParams,
body: API.UserPasswordDto,
options?: RequestOptions,
) {
const { id: param0, ...queryParams } = params;
return request<any>(`/api/system/users/${param0}/password`, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
params: { ...queryParams },
data: body,
...(options || {}),
});
}

View File

@ -0,0 +1,44 @@
// @ts-ignore
/* eslint-disable */
/**
* @umijs/openapi openapi.config.ts
* */
import { request, type RequestOptions } from '@/utils/request';
/** 删除文件 POST /api/tools/storage/delete */
export async function storageDelete(body: API.StorageDeleteDto, options?: RequestOptions) {
return request<any>('/api/tools/storage/delete', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
data: body,
...(options || { successMsg: '删除成功' }),
});
}
/** 获取本地存储列表 GET /api/tools/storage/list */
export async function storageList(
// 叠加生成的Param类型 (非body参数swagger默认没有生成对象)
params: API.StorageListParams,
options?: RequestOptions,
) {
return request<{
items?: API.StorageInfo[];
meta?: {
itemCount?: number;
totalItems?: number;
itemsPerPage?: number;
totalPages?: number;
currentPage?: number;
};
}>('/api/tools/storage/list', {
method: 'GET',
params: {
...params,
},
...(options || {}),
});
}

View File

@ -0,0 +1,40 @@
// @ts-ignore
/* eslint-disable */
/**
* @umijs/openapi openapi.config.ts
* */
import { request, type RequestOptions } from '@/utils/request';
/** 上传 POST /api/tools/upload */
export async function uploadUpload(body: API.FileUploadDto, file?: File, options?: RequestOptions) {
const formData = new FormData();
if (file) {
formData.append('file', file);
}
Object.keys(body).forEach((ele) => {
const item = (body as any)[ele];
if (item !== undefined && item !== null) {
if (typeof item === 'object' && !(item instanceof File)) {
if (item instanceof Array) {
item.forEach((f) => formData.append(ele, f || ''));
} else {
formData.append(ele, JSON.stringify(item));
}
} else {
formData.append(ele, item);
}
}
});
return request<any>('/api/tools/upload', {
method: 'POST',
data: formData,
requestType: 'form',
...(options || {}),
});
}

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,29 @@
import { request } from '@/utils/request';
enum Api {
Login = '/boyanghu/iotree-service/platform/login',
}
/**
* @description:
*/
export interface LoginParams {
phone: string;
type: number; // 0短信 1密码
code?: string;
password?: string;
}
/**
* @description:
*/
export function loginApi(params: LoginParams) {
return request({
url: Api.Login,
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
},
data: params,
});
}

View File

@ -0,0 +1,11 @@
import { request } from '@/utils/request';
export type DictType = 'gender' | 'sell_status';
export async function getDictData(params: { type: DictType }) {
return request<LabelValueOptions>({
url: '/dict/data',
method: 'GET',
params,
});
}

View File

@ -0,0 +1,33 @@
import { request } from '@/utils/request';
/**
* @description 耀
*/
export function getWzryHeroList(query: API.PageParams) {
return request({
url: '/demo/wzry/hero_list',
method: 'get',
params: query,
});
}
/**
* @description
*/
export function getLolHeroList(query: API.PageParams) {
return request({
url: '/demo/lol/hero_list',
method: 'get',
params: query,
});
}
/**
* @description
*/
export function getLolHeroInfo({ id }) {
return request({
url: `/demo/lol/hero_info/${id}`,
method: 'get',
});
}

View File

@ -0,0 +1,14 @@
import { request } from '@/utils/request';
interface DemoOptionsItem {
name: string;
id: string;
}
export async function optionsListApi(params?: Recordable) {
return request<DemoOptionsItem[]>({
url: '/select/getDemoOptions',
method: 'GET',
params,
});
}

View File

@ -0,0 +1,26 @@
import { request } from '@/utils/request';
enum Api {
Login = '/boyanghu/iotree-service/platform/login',
}
/**
* @description:
*/
export interface LoginParams {
phone: string;
password?: string;
code?: string;
type: number; // 0短信 1密码
}
/**
* @description:
*/
export function loginApi(params: LoginParams) {
return request({
url: Api.Login,
method: 'POST',
data: params,
});
}

View File

@ -0,0 +1,5 @@
import Api from './backend/api';
export { Api };
export default Api;

36
apps/platform/src/api/typings.d.ts vendored Normal file
View File

@ -0,0 +1,36 @@
// @ts-ignore
/* eslint-disable */
declare namespace API {
/** 全局通过表格查询返回结果 */
type TableListResult<T = any> = {
items?: T;
meta?: PaginationResult;
};
/** 全局通用表格分页返回数据结构 */
type PaginationResult = {
itemCount?: number;
totalItems?: number;
itemsPerPage?: number;
totalPages?: number;
currentPage?: number;
};
/** 全局通用表格分页请求参数 */
type PageParams<T = any> = {
page?: number;
pageSize?: number;
} & {
[P in keyof T]?: T[P];
};
type ErrorResponse = {
/** 业务约定的错误码 */
errorCode: string;
/** 业务上的错误信息 */
errorMessage?: string;
/** 业务上的请求是否成功 */
success?: boolean;
};
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 160 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 12 KiB

View File

@ -0,0 +1,39 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="52px" height="45px" viewBox="0 0 52 45" version="1.1"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink">
<defs>
<filter x="-9.4%" y="-6.2%" width="118.8%" height="122.5%" filterUnits="objectBoundingBox" id="filter-1">
<feOffset dx="0" dy="1" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset>
<feGaussianBlur stdDeviation="1" in="shadowOffsetOuter1" result="shadowBlurOuter1"></feGaussianBlur>
<feColorMatrix values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.15 0" type="matrix" in="shadowBlurOuter1" result="shadowMatrixOuter1"></feColorMatrix>
<feMerge>
<feMergeNode in="shadowMatrixOuter1"></feMergeNode>
<feMergeNode in="SourceGraphic"></feMergeNode>
</feMerge>
</filter>
<rect id="path-2" x="0" y="0" width="48" height="40" rx="4"></rect>
<filter x="-4.2%" y="-2.5%" width="108.3%" height="110.0%" filterUnits="objectBoundingBox" id="filter-4">
<feOffset dx="0" dy="1" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset>
<feGaussianBlur stdDeviation="0.5" in="shadowOffsetOuter1" result="shadowBlurOuter1"></feGaussianBlur>
<feColorMatrix values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.1 0" type="matrix" in="shadowBlurOuter1"></feColorMatrix>
</filter>
</defs>
<g id="配置面板" width="48" height="40" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="setting-copy-2" width="48" height="40" transform="translate(-1190.000000, -136.000000)">
<g id="Group-8" width="48" height="40" transform="translate(1167.000000, 0.000000)">
<g id="Group-5-Copy-5" filter="url(#filter-1)" transform="translate(25.000000, 137.000000)">
<mask id="mask-3" fill="white">
<use xlink:href="#path-2"></use>
</mask>
<g id="Rectangle-18">
<use fill="black" fill-opacity="1" filter="url(#filter-4)" xlink:href="#path-2"></use>
<use fill="#F0F2F5" fill-rule="evenodd" xlink:href="#path-2"></use>
</g>
<rect id="Rectangle-11" fill="#FFFFFF" mask="url(#mask-3)" x="0" y="0" width="48" height="10"></rect>
<rect id="Rectangle-18" fill="#303648" mask="url(#mask-3)" x="0" y="0" width="16" height="40"></rect>
</g>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.5 KiB

View File

@ -0,0 +1 @@
<svg t="1619506354975" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2334" width="64" height="64"><path d="M137.90246 0.00041a48.573421 48.573421 0 0 0-35.589106 15.293433A53.964778 53.964778 0 0 0 87.0404 50.934149V968.345622a48.706541 48.706541 0 0 0 15.272954 35.640306 49.97118 49.97118 0 0 0 35.589106 15.293434h746.336982a48.639981 48.639981 0 0 0 35.589105-15.293434 50.37054 50.37054 0 0 0 15.272954-35.640306V288.717094L646.727857 0.00041H137.90246z" fill="#FF8976" p-id="2335"></path><path d="M935.101501 288.717094h-237.445025c-27.822069-0.6656-50.22718-23.075831-50.928619-50.93374V0.00041l288.373644 288.716684z" fill="#FFD0C8" p-id="2336"></path><path d="M415.257869 564.731064l-124.70267 49.26974 124.70267 49.27486v39.096305l-172.175291-68.756453v-39.096304l172.175291-68.756453v38.963185zM539.02358 451.686629h39.045104l-95.016922 254.801818h-38.978544l94.950362-254.801818z m67.860452 212.377515l124.702671-49.26974-124.702671-49.269741v-39.101424l172.175292 67.957733v39.895024l-172.175292 68.823012V664.064144z" fill="#FFFFFF" p-id="2337"></path></svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

@ -0,0 +1 @@
<svg t="1619506230415" class="icon" viewBox="0 0 1208 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="1594" width="64" height="64"><path d="M132.51584 120.4736h879.4368c33.26976 0 60.2368 26.96704 60.2368 60.23168v409.6c0 33.26976-26.96704 60.2368-60.2368 60.2368H132.51584c-33.26464 0-60.23168-26.96704-60.23168-60.2368v-409.6c0-33.26464 26.96704-60.2368 60.23168-60.2368z" fill="#F9B552" p-id="1595"></path><path d="M469.8368 0c73.18528 0 132.51584 59.33056 132.51584 132.51584v84.3264h469.8368c73.18528 0 132.51584 59.33568 132.51584 132.52096v542.12096c0 73.18528-59.33056 132.51584-132.51584 132.51584H132.51584A132.51584 132.51584 0 0 1 0 891.48416V349.3632c0-4.03456 0.1792-8.06912 0.54272-12.04736A134.25664 134.25664 0 0 1 0 325.2736V132.51584C0 59.33056 59.33056 0 132.51584 0h337.32096z" fill="#FFCF5C" p-id="1596"></path></svg>

After

Width:  |  Height:  |  Size: 853 B

View File

@ -0,0 +1 @@
<svg t="1619506254031" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="1741" width="64" height="64"><path d="M594.944 0l335.12448 341.31968v563.2c0 65.9968-52.50048 119.48032-117.29408 119.48032H209.54624c-64.7936 0-117.2992-53.5296-117.2992-119.48032V119.48032C92.25216 53.48352 144.75776 0 209.55136 0H594.944z" fill="#5895FF" p-id="1742"></path><path d="M930.06848 341.31968h-211.9168c-64.74752 0-123.20768-59.48928-123.20768-125.4912V0l335.12448 341.31968z" fill="#FFFFFF" fill-opacity=".4" p-id="1743"></path><path d="M427.37664 725.31968V768H259.8144v-42.68032h167.56224zM594.944 640v42.68032H259.8144V640H594.944z m0-85.31968v42.63936H259.8144v-42.63936H594.944z m0-85.36064V512H259.8144v-42.68032H594.944z" fill="#FFFFFF" p-id="1744"></path></svg>

After

Width:  |  Height:  |  Size: 800 B

View File

@ -0,0 +1 @@
<svg t="1619506332655" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2186" width="64" height="64"><path d="M594.944 0l335.12448 341.31968v563.2c0 65.9968-52.50048 119.48032-117.29408 119.48032H209.54624c-64.7936 0-117.2992-53.5296-117.2992-119.48032V119.48032C92.25216 53.48352 144.75776 0 209.55136 0H594.944z" fill="#1ABF74" p-id="2187"></path><path d="M930.06848 341.31968h-211.9168c-64.74752 0-123.20768-59.48928-123.20768-125.4912V0l335.12448 341.31968z" fill="#FFFFFF" fill-opacity=".4" p-id="2188"></path><path d="M594.61632 426.82368v0.2304h0.09216V768H566.8352v-0.0512h-83.968 0.04608H399.7696h0.0512-139.91936v-28.3904l0.0512-0.04608v-85.82656h-0.0512v-28.39552h0.0512v-85.82656h-0.09728v-28.39552l0.09216-0.04608V455.168h-0.09216v-28.3904h334.70976l0.04608 0.04608z m-222.62784 226.86208H287.88224v85.82656h84.10624v-85.82656z m83.08224 0h-55.2448v85.82656h55.19872v-85.82656h0.0512z m111.75936 0H482.90816v85.82656H566.784v-85.82656h0.04608z m-194.8416-114.2272H287.88224v85.83168h84.10624v-85.82656z m83.08224 0h-55.2448v85.83168h55.19872v-85.82656h0.0512z m111.75936 0H482.90816v85.83168H566.784v-85.82656h0.04608z m0-84.24448H287.88224v55.808H566.784V455.168l0.04608 0.0512z" fill="#FFFFFF" p-id="2189"></path></svg>

After

Width:  |  Height:  |  Size: 1.2 KiB

View File

@ -0,0 +1 @@
<svg t="1619506370346" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2482" width="64" height="64"><path d="M137.90246 0.00041a48.573421 48.573421 0 0 0-35.589106 15.293433A53.964778 53.964778 0 0 0 87.0404 50.934149V968.345622a48.706541 48.706541 0 0 0 15.272954 35.640306 49.97118 49.97118 0 0 0 35.589106 15.293434h746.336982a48.639981 48.639981 0 0 0 35.589105-15.293434 50.37054 50.37054 0 0 0 15.272954-35.640306V288.717094L646.727857 0.00041H137.90246z" fill="#FF5562" p-id="2483"></path><path d="M935.101501 288.717094h-237.445025c-27.822069-0.6656-50.22718-23.075831-50.928619-50.93374V0.00041l288.373644 288.716684z" fill="#FFBBC0" p-id="2484"></path><path d="M772.290686 715.069564l-106.239957-164.766655a16.593913 16.593913 0 0 0-14.412794-7.649276 18.851832 18.851832 0 0 0-14.407675 7.649276l-56.837097 88.299485-127.221709-206.131117a16.527353 16.527353 0 0 0-14.407674-7.644157 18.851832 18.851832 0 0 0-14.412795 7.649277L249.656655 715.264123a15.447034 15.447034 0 0 0 0 16.957434 15.667194 15.667194 0 0 0 14.407675 8.509436h493.547322a18.851832 18.851832 0 0 0 15.272954-8.509436 16.977913 16.977913 0 0 0-0.7936-16.957434l0.19968-0.199679zM628.070584 403.149048a42.490863 42.490863 0 0 0 26.14271 39.306225 42.388463 42.388463 0 0 0 46.264301-9.169917 42.531823 42.531823 0 0 0 9.226236-46.310381 42.429423 42.429423 0 0 0-39.203824-26.24511c-23.408631 0-42.393583 18.979832-42.434543 42.419183z" fill="#FFFFFF" p-id="2485"></path></svg>

After

Width:  |  Height:  |  Size: 1.5 KiB

View File

@ -0,0 +1 @@
<svg t="1619506298580" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2038" width="64" height="64"><path d="M594.944 0l335.12448 341.31968v563.2c0 65.9968-52.50048 119.48032-117.29408 119.48032H209.54624c-64.7936 0-117.2992-53.5296-117.2992-119.48032V119.48032C92.25216 53.48352 144.75776 0 209.55136 0H594.944z" fill="#FFC547" p-id="2039"></path><path d="M930.06848 341.31968h-211.9168c-64.74752 0-123.20768-59.48928-123.20768-125.4912V0l335.12448 341.31968z" fill="#FFFFFF" fill-opacity=".4" p-id="2040"></path><path d="M568.7808 446.464V675.84a27.2384 27.2384 0 0 1-6.79424 18.24768 45.66016 45.66016 0 0 1-17.31584 12.38016 112.64 112.64 0 0 1-20.80256 6.51776c-6.9376 1.43872-13.40416 2.18624-19.40992 2.18624-6.05184 0-12.52352-0.74752-19.40992-2.14016a112.45568 112.45568 0 0 1-20.80768-6.56384 45.70624 45.70624 0 0 1-17.31584-12.38016A27.22816 27.22816 0 0 1 440.08448 675.84c0-6.84032 2.3296-12.89216 6.84032-18.24768a45.70624 45.70624 0 0 1 17.31584-12.38016c6.98368-2.93376 13.91616-5.12 20.80768-6.51776 6.8864-1.4848 13.35808-2.18624 19.4048-2.18624 14.05952 0 26.95168 2.65216 38.63552 8.00768V534.528L388.608 583.07584v145.21856a27.22816 27.22816 0 0 1-6.79936 18.2016 45.66016 45.66016 0 0 1-17.31584 12.38016 112.64 112.64 0 0 1-20.80256 6.56384c-6.9376 1.39776-13.40416 2.14016-19.40992 2.14016-6.05184 0-12.52352-0.69632-19.40992-2.14016a112.50176 112.50176 0 0 1-20.80768-6.51776A45.70624 45.70624 0 0 1 266.752 746.496a27.23328 27.23328 0 0 1-6.84544-18.24768c0-6.79424 2.3296-12.89216 6.84544-18.19648a45.70624 45.70624 0 0 1 17.31072-12.38016c6.98368-2.93376 13.92128-5.12 20.80768-6.56384a94.80192 94.80192 0 0 1 19.4048-2.14016c14.05952 0 26.9568 2.65216 38.63552 7.95648V498.87232a19.87584 19.87584 0 0 1 13.68576-18.84672l167.28576-52.41344c1.80224-0.57856 3.6864-0.86016 5.5808-0.83968 5.4016 0 9.96352 1.90976 13.68576 5.72928 3.77344 3.86048 5.632 8.46848 5.632 13.96224z" fill="#FFFFFF" p-id="2041"></path></svg>

After

Width:  |  Height:  |  Size: 1.9 KiB

View File

@ -0,0 +1 @@
<svg t="1619506408333" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2778" width="64" height="64"><path d="M116.91008 0h552.05888l262.77376 257.70496V995.4304c0 15.7696-13.19936 28.5696-29.46048 28.5696H116.91008c-16.26112 0-29.45536-12.8-29.45536-28.5696V28.5696C87.4496 12.8 100.64896 0 116.91008 0z" fill="#4A8DFF" p-id="2779"></path><path d="M668.96896 0v229.13536c0 15.79008 13.19936 28.5696 29.46048 28.5696h233.31328L668.96896 0z" fill="#E5F0FF" p-id="2780"></path><path d="M722.7648 823.53664c25.3952 26.96192 71.7056 9.55392 71.7056-26.96704V371.44064h-82.51392v321.97632l-163.96288-174.1824c-7.81312-8.29952-18.87232-13.0304-30.464-13.0304-11.58656 0-22.64064 4.73088-30.45888 13.0304l-163.96288 174.1824v-321.9968H240.62976v425.14944c0 36.52096 46.31552 53.92896 71.71072 26.96704l205.2096-217.99424 205.2096 217.99424z" fill="#FFFFFF" p-id="2781"></path></svg>

After

Width:  |  Height:  |  Size: 919 B

Some files were not shown because too many files have changed in this diff Show More