feat: 初步完成
|
@ -13,4 +13,4 @@ insert_final_newline = true # 始终在文件末尾插入一个新行
|
|||
|
||||
[*.md] # 表示仅 md 文件适用以下规则
|
||||
max_line_length = off
|
||||
trim_trailing_whitespace = false
|
||||
trim_trailing_whitespace = false
|
|
@ -0,0 +1,17 @@
|
|||
# port
|
||||
VITE_PORT = 5173
|
||||
|
||||
# 标题
|
||||
VITE_APP_TITLE = 'Vue-Admin'
|
||||
|
||||
# open 运行 npm run dev 时自动打开浏览器
|
||||
VITE_OPEN = true
|
||||
|
||||
# 是否生成包预览文件
|
||||
VITE_REPORT = false
|
||||
|
||||
# 是否开启gzip压缩
|
||||
VITE_BUILD_GZIP = false
|
||||
|
||||
# 是否删除生产环境 console
|
||||
VITE_DROP_CONSOLE = true
|
|
@ -0,0 +1,11 @@
|
|||
# 本地环境
|
||||
NODE_ENV = 'development'
|
||||
|
||||
# 开发环境跨域代理,可以配置多个,请注意不要换行
|
||||
# VITE_PROXY=[["/api","http://localhost:3000"]]
|
||||
# VITE_PROXY = [["/appApi","http://localhost:3000"],["/upload","http://localhost:3000/upload"]]
|
||||
|
||||
# 本地环境接口地址
|
||||
# 如果没有跨域问题,直接在这里配置即可
|
||||
VITE_APP_BASE_API = 'http://192.168.1.116:8080'
|
||||
# VITE_APP_BASE_API = 'https://3lp9319797lh.vicp.fun'
|
|
@ -0,0 +1,12 @@
|
|||
# 线上环境
|
||||
NODE_ENV = "production"
|
||||
|
||||
# 线上环境接口地址
|
||||
VITE_APP_BASE_API = '/api'
|
||||
|
||||
# 是否启用 gzip 或 brotli 压缩打包,如果需要多个压缩规则,可以使用 “,” 分隔
|
||||
# Optional: gzip | brotli | none
|
||||
VITE_BUILD_COMPRESS = none
|
||||
|
||||
# 打包压缩后是否删除源文件
|
||||
VITE_BUILD_COMPRESS_DELETE_ORIGIN_FILE = false
|
25
.eslintrc.js
|
@ -1,31 +1,22 @@
|
|||
module.exports = {
|
||||
root: true,
|
||||
env: {
|
||||
browser: true,
|
||||
es2021: true,
|
||||
node: true,
|
||||
},
|
||||
// 指定如何解析语法
|
||||
parser: 'vue-eslint-parser',
|
||||
// 优先级低于 parse 的语法解析配置
|
||||
parserOptions: {
|
||||
parser: '@typescript-eslint/parser',
|
||||
ecmaVersion: 'latest',
|
||||
sourceType: 'module',
|
||||
},
|
||||
// 继承某些已有的规则
|
||||
extends: [
|
||||
'plugin:vue/vue3-essential',
|
||||
'plugin:@typescript-eslint/recommended',
|
||||
'plugin:prettier/recommended', // 添加 prettier 插件
|
||||
],
|
||||
plugins: ['vue', '@typescript-eslint', 'import', 'prettier', 'simple-import-sort'],
|
||||
overrides: [
|
||||
{
|
||||
files: ['*.ts', '*.tsx'],
|
||||
parser: '@typescript-eslint/parser',
|
||||
},
|
||||
],
|
||||
parser: 'vue-eslint-parser',
|
||||
overrides: [],
|
||||
parserOptions: {
|
||||
ecmaVersion: 'latest',
|
||||
parser: '@typescript-eslint/parser',
|
||||
sourceType: 'module',
|
||||
},
|
||||
plugins: ['vue', '@typescript-eslint', 'simple-import-sort'],
|
||||
rules: {
|
||||
'@typescript-eslint/ban-types': 'off',
|
||||
'@typescript-eslint/no-explicit-any': 'off',
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
#!/usr/bin/env sh
|
||||
. "$(dirname -- "$0")/_/husky.sh"
|
||||
|
||||
npx --no-install commitlint --edit $1
|
||||
npx --no-install commitlint --edit
|
||||
|
|
|
@ -0,0 +1,9 @@
|
|||
/dist/*
|
||||
.local
|
||||
.output.js
|
||||
/node_modules/**
|
||||
|
||||
**/*.svg
|
||||
**/*.sh
|
||||
|
||||
/public/*
|
|
@ -4,9 +4,9 @@ module.exports = {
|
|||
root: true,
|
||||
// 继承某些已有的规则
|
||||
extends: [
|
||||
'stylelint-config-html/vue', // 配置 vue 中 template 样式格式化
|
||||
'stylelint-config-standard', // 配置 stylelint 拓展插件
|
||||
'stylelint-config-standard-scss', // 配置 stylelint scss 插件
|
||||
'stylelint-config-recommended-vue/scss', // 配置 vue 中 scss 样式格式化
|
||||
'stylelint-config-html/vue', // 配置 vue 中 template 样式格式化
|
||||
'stylelint-config-recess-order', // 配置 stylelint css 属性书写顺序插件,
|
||||
],
|
||||
overrides: [
|
||||
|
|
2
LICENSE
|
@ -1,6 +1,6 @@
|
|||
MIT License
|
||||
|
||||
Copyright (c) 2023 三棵杨树
|
||||
Copyright (c) 2022 三棵杨树
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
|
|
158
README.md
|
@ -1,3 +1,157 @@
|
|||
# BoatPlatform
|
||||
<h1 align="center">
|
||||
vue-template-admin
|
||||
</h1>
|
||||
<h4 align="center">使用 Vue3 + TS 构建的后台管理系统</h4>
|
||||
|
||||
船货信息智慧共享服务平台
|
||||
<p align="center">
|
||||
<img src="https://img.shields.io/github/license/sankeyangshu/vue-template-admin" alt="license" />
|
||||
<img src="https://img.shields.io/github/package-json/v/sankeyangshu/vue-template-admin" alt="version" />
|
||||
<img src="https://img.shields.io/github/languages/top/sankeyangshu/vue-template-admin" alt="languages" />
|
||||
</p>
|
||||
|
||||
---
|
||||
|
||||
## 简介
|
||||
|
||||
🚀🚀🚀 **vue-template-admin** 使用了最新的`Vue3.2`、`Vite4`、`Pinia2`、`Typescript`等主流技术开发,集成 `Dark Mode`(暗黑)模式,并且持久化保存,集成了代码规范检查工具`Eslint`、`Prettier`、`Stylelint`。另外本项目还封装了一些常用组件、Hooks、指令、动态路由、按钮级别权限控制等功能。你可以在此之上直接开发你的业务代码!希望你能喜欢。👋👋👋
|
||||
|
||||
**注 1:如果对您有帮助,您可以点右上角 "Star" 支持一下 谢谢!**
|
||||
|
||||
**注 2:由于本人工作较忙,所以项目更新频率较慢,但是本项目会长期维护,有问题可以提 issue, 同时也欢迎大家来共建此项目,包括但不限于:bug 修复、代码优化、功能开发等等**
|
||||
|
||||
## ✨ 项目功能
|
||||
|
||||
- 🚀 使用 Vue3.2 + TypeScript 开发,单文件组件**< script setup >**
|
||||
- 🚀 采用 Vite4 作为项目开发、打包工具(配置 Gzip 打包、TSX 语法、跨域代理…)
|
||||
- 🚀 整个项目集成了 TypeScript
|
||||
- 🚀 使用 Pinia 替代 Vuex,轻量、简单、易用,集成 Pinia 持久化插件
|
||||
- 🚀 使用 TypeScript 对 Axios 整个二次封装(请求拦截、取消、常用请求封装…)
|
||||
- 🚀 支持 Element 组件大小切换、暗黑模式、i18n 国际化
|
||||
- 🚀 使用 VueRouter 进行路由权限拦截、页面按钮权限配置、路由懒加载
|
||||
- 🚀 使用 KeepAlive 对页面进行缓存,支持多级嵌套页面缓存
|
||||
- 🚀 常用自定义指令开发(权限、复制、水印、拖拽、节流、防抖、长按…)
|
||||
- 🚀 使用 Prettier 统一格式化代码,集成 Eslint、Stylelint 代码校验规范(项目规范配置)
|
||||
- 🚀 使用 husky、lint-staged、commitlint 规范提交信息(项目规范配置)
|
||||
|
||||
## 基础知识
|
||||
|
||||
提前了解和学习这些知识会对使用本项目有很大的帮助。
|
||||
|
||||
- [Vue3](https://v3.vuejs.org/) - 熟悉 `Vue3` 基础语法
|
||||
- [Vite](https://cn.vitejs.dev/) - 熟悉 `Vite` 特性
|
||||
- [Pinia](https://pinia.vuejs.org/) - 熟悉 `Pinia` 特性
|
||||
- [TypeScript](https://www.typescriptlang.org/) - 熟悉 `TypeScript` 基本语法
|
||||
- [Vue-Router](https://router.vuejs.org/) - 熟悉 `Vue-Router` 基本使用
|
||||
- [Element Plus](https://element-plus.org/zh-CN/) - 熟悉 `Element Plus` 组件库基本使用
|
||||
- [Es6+](http://es6.ruanyifeng.com/) - 熟悉 `ES6` 基本语法
|
||||
|
||||
## 配套资源
|
||||
|
||||
- [nest-template-cms](https://github.com/sankeyangshu/nest-template-cms) - 使用 Nest + TS 构建的 CMS 开发框架
|
||||
- [react-template-admin](https://github.com/sankeyangshu/react-template-admin) - 使用 React + TS 构建的后台管理系统
|
||||
|
||||
## 环境准备
|
||||
|
||||
本地环境需要安装 [pnpm7.x](https://www.pnpm.cn/)、[Node.js](http://nodejs.org/) 和 [Git](https://git-scm.com/)
|
||||
|
||||
- 必须使用[pnpm7.x](https://www.pnpm.cn/),否则依赖可能安装不上。
|
||||
- [Node.js](http://nodejs.org/) 版本要求`12.x`以上,这里推荐 `16.x` 及以上。
|
||||
|
||||
## Vscode 配套插件
|
||||
|
||||
如果你使用的 IDE 是[vscode](https://code.visualstudio.com/)(推荐)的话,可以安装以下工具来提高开发效率及代码格式化
|
||||
|
||||
- [Volar](https://marketplace.visualstudio.com/items?itemName=Vue.volar) - vue 开发必备
|
||||
- [ESLint](https://marketplace.visualstudio.com/items?itemName=dbaeumer.vscode-eslint) - 脚本代码检查
|
||||
- [Prettier](https://marketplace.visualstudio.com/items?itemName=esbenp.prettier-vscode) - 代码格式化
|
||||
- [Stylelint](https://marketplace.visualstudio.com/items?itemName=stylelint.vscode-stylelint) - css 格式化
|
||||
|
||||
## 安装和使用
|
||||
|
||||
### 🚀 使用脚手架
|
||||
|
||||
[Galaxy-CLI](https://github.com/sankeyangshu/galaxy-cli) 是一个用于快速生成各种**前后端项目模版**的脚手架。
|
||||
|
||||
```bash
|
||||
# 选择合适的包管理工具安装脚手架
|
||||
npm i -g galaxy-cli-core
|
||||
|
||||
# yarn
|
||||
yarn global add galaxy-cli-core
|
||||
|
||||
# 推荐使用pnpm进行安装
|
||||
pnpm i -g galaxy-cli-core
|
||||
|
||||
# 创建项目,按照脚手架提示,选择vue-template-admin模板
|
||||
galaxy init <projectName>
|
||||
|
||||
# 进入项目目录
|
||||
cd <projectName>
|
||||
|
||||
# 安装依赖 - 推荐使用pnpm
|
||||
pnpm install
|
||||
|
||||
# 启动服务
|
||||
pnpm dev
|
||||
|
||||
# 打包发布
|
||||
pnpm build
|
||||
```
|
||||
|
||||
### 克隆使用
|
||||
|
||||
```bash
|
||||
# 克隆项目
|
||||
git clone https://github.com/sankeyangshu/vue-template-admin.git
|
||||
|
||||
# 进入项目目录
|
||||
cd vue-template-admin
|
||||
|
||||
# 安装依赖 - 推荐使用pnpm
|
||||
pnpm install
|
||||
|
||||
# 启动服务
|
||||
pnpm dev
|
||||
|
||||
# 打包发布
|
||||
pnpm build
|
||||
```
|
||||
|
||||
## 如何贡献
|
||||
|
||||
你可以[提一个 issue](https://github.com/sankeyangshu/vue-template-admin/issues) 或者提交一个 Pull Request。
|
||||
|
||||
**Pull Request:**
|
||||
|
||||
1. Fork 代码
|
||||
2. 创建自己的分支: `git checkout -b feat/xxxx`
|
||||
3. 提交你的修改: `git commit -am 'feat(function): add xxxxx'`
|
||||
4. 推送您的分支: `git push origin feat/xxxx`
|
||||
5. 提交 `pull request`
|
||||
|
||||
## Git 贡献提交规范
|
||||
|
||||
- `feat`: 新增功能
|
||||
- `fix`: 修复 bug
|
||||
- `docs`: 文档变更
|
||||
- `style`: 代码格式(不影响功能,例如空格、分号等格式修正)
|
||||
- `refactor`: 代码重构(不包括 bug 修复、功能新增)
|
||||
- `perf`: 性能优化
|
||||
- `test`: 添加、修改测试用例
|
||||
- `build`: 构建流程、外部依赖变更(如升级 npm 包、修改 webpack 配置等)
|
||||
- `ci`: 修改 CI 配置、脚本
|
||||
- `chore`: 对构建过程或辅助工具和库的更改(不影响源文件、测试用例)
|
||||
- `revert`: 回滚 commit
|
||||
|
||||
## 浏览器支持
|
||||
|
||||
- 本地开发推荐使用 Chrome 最新版浏览器 [Download](https://www.google.com/intl/zh-CN/chrome/)。
|
||||
- 生产环境支持现代浏览器,不在支持 IE 浏览器,更多浏览器可以查看 [Can I Use Es Module](https://caniuse.com/?search=ESModule)。
|
||||
|
||||
| [<img src="https://i.imgtg.com/2023/04/11/8z7ot.png" alt=" IE" width="24px" height="24px" />](http://godban.github.io/browsers-support-badges/)</br>IE | [<img src="https://raw.githubusercontent.com/alrra/browser-logos/master/src/edge/edge_48x48.png" alt=" Edge" width="24px" height="24px" />](http://godban.github.io/browsers-support-badges/)</br>Edge | [<img src="https://raw.githubusercontent.com/alrra/browser-logos/master/src/firefox/firefox_48x48.png" alt="Firefox" width="24px" height="24px" />](http://godban.github.io/browsers-support-badges/)</br>Firefox | [<img src="https://raw.githubusercontent.com/alrra/browser-logos/master/src/chrome/chrome_48x48.png" alt="Chrome" width="24px" height="24px" />](http://godban.github.io/browsers-support-badges/)</br>Chrome | [<img src="https://raw.githubusercontent.com/alrra/browser-logos/master/src/safari/safari_48x48.png" alt="Safari" width="24px" height="24px" />](http://godban.github.io/browsers-support-badges/)</br>Safari |
|
||||
| :----------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: |
|
||||
| not support | last 2 versions | last 2 versions | last 2 versions | last 2 versions |
|
||||
|
||||
## 许可证
|
||||
|
||||
[MIT License](https://github.com/sankeyangshu/vue-template-admin/blob/master/LICENSE)
|
||||
|
|
|
@ -0,0 +1,51 @@
|
|||
import path from 'path';
|
||||
|
||||
export function isDevFn(mode: string): boolean {
|
||||
return mode === 'development';
|
||||
}
|
||||
|
||||
export function isProdFn(mode: string): boolean {
|
||||
return mode === 'production';
|
||||
}
|
||||
|
||||
export function isTestFn(mode: string): boolean {
|
||||
return mode === 'test';
|
||||
}
|
||||
|
||||
/**
|
||||
* Whether to generate package preview
|
||||
*/
|
||||
export function isReportMode(): boolean {
|
||||
return process.env.VITE_REPORT === 'true';
|
||||
}
|
||||
|
||||
// Read all environment variable configuration files to process.env
|
||||
// 读取并处理所有环境变量配置文件 .env
|
||||
export function wrapperEnv(envConf: Recordable): ViteEnv {
|
||||
const ret: any = {};
|
||||
|
||||
for (const envName of Object.keys(envConf)) {
|
||||
// 去除空格
|
||||
let realName = envConf[envName].replace(/\\n/g, '\n');
|
||||
realName = realName === 'true' ? true : realName === 'false' ? false : realName;
|
||||
|
||||
if (envName === 'VITE_PORT') {
|
||||
realName = Number(realName);
|
||||
}
|
||||
if (envName === 'VITE_PROXY') {
|
||||
try {
|
||||
realName = JSON.parse(realName);
|
||||
} catch (error) {}
|
||||
}
|
||||
ret[envName] = realName;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get user root directory
|
||||
* @param dir file path
|
||||
*/
|
||||
export function getRootPath(...dir: string[]) {
|
||||
return path.resolve(process.cwd(), ...dir);
|
||||
}
|
|
@ -0,0 +1,37 @@
|
|||
/**
|
||||
* 用于打包和输出gzip。请注意,这在Vite中无法正常工作,具体原因仍在调查中
|
||||
* https://github.com/anncwb/vite-plugin-compression
|
||||
*/
|
||||
import type { PluginOption } from 'vite';
|
||||
import viteCompression from 'vite-plugin-compression';
|
||||
|
||||
/**
|
||||
* 根据 compress 配置,生成不同的压缩规则
|
||||
*/
|
||||
export const configCompressPlugin = (viteEnv: ViteEnv): PluginOption | PluginOption[] => {
|
||||
const { VITE_BUILD_COMPRESS = 'none', VITE_BUILD_COMPRESS_DELETE_ORIGIN_FILE = false } = viteEnv;
|
||||
const compressList = VITE_BUILD_COMPRESS.split(',');
|
||||
const plugins: PluginOption[] = [];
|
||||
|
||||
if (compressList.includes('gzip')) {
|
||||
plugins.push(
|
||||
viteCompression({
|
||||
ext: '.gz',
|
||||
algorithm: 'gzip',
|
||||
deleteOriginFile: VITE_BUILD_COMPRESS_DELETE_ORIGIN_FILE,
|
||||
})
|
||||
);
|
||||
}
|
||||
|
||||
if (compressList.includes('brotli')) {
|
||||
plugins.push(
|
||||
viteCompression({
|
||||
ext: '.br',
|
||||
algorithm: 'brotliCompress',
|
||||
deleteOriginFile: VITE_BUILD_COMPRESS_DELETE_ORIGIN_FILE,
|
||||
})
|
||||
);
|
||||
}
|
||||
|
||||
return plugins;
|
||||
};
|
|
@ -0,0 +1,37 @@
|
|||
import vue from '@vitejs/plugin-vue';
|
||||
import type { PluginOption } from 'vite';
|
||||
import { configCompressPlugin } from './compress';
|
||||
import { configSvgIconsPlugin } from './svgPlugin';
|
||||
// 按需加载 Element Plus
|
||||
// import AutoImport from 'unplugin-auto-import/vite';
|
||||
// import Components from 'unplugin-vue-components/vite';
|
||||
// import { ElementPlusResolver } from 'unplugin-vue-components/resolvers';
|
||||
|
||||
/**
|
||||
* 配置 vite 插件
|
||||
* @param {ViteEnv} viteEnv vite 环境变量配置文件键值队 object
|
||||
*/
|
||||
export const createVitePlugins = (viteEnv: ViteEnv): (PluginOption | PluginOption[])[] => {
|
||||
return [
|
||||
vue(),
|
||||
// 按需加载 Element Plus
|
||||
// AutoImport({
|
||||
// // 自动导入 Element Plus 相关函数,如:ElMessage, ElMessageBox... (带样式)
|
||||
// resolvers: [ElementPlusResolver()],
|
||||
// dts: resolve('src/types/auto-imports.d.ts'),
|
||||
// }),
|
||||
// Components({
|
||||
// resolvers: [
|
||||
// // 自动导入 Element Plus 组件
|
||||
// ElementPlusResolver(),
|
||||
// ],
|
||||
// dts: resolve('src/types/components.d.ts'),
|
||||
// }),
|
||||
|
||||
// 使用 svg 图标
|
||||
configSvgIconsPlugin(),
|
||||
|
||||
// 创建打包压缩配置
|
||||
configCompressPlugin(viteEnv),
|
||||
];
|
||||
};
|
|
@ -0,0 +1,16 @@
|
|||
import path from 'path';
|
||||
import { createSvgIconsPlugin } from 'vite-plugin-svg-icons';
|
||||
|
||||
/**
|
||||
* 配置svg vite 插件
|
||||
*/
|
||||
export function configSvgIconsPlugin() {
|
||||
// 使用 svg 图标
|
||||
const svgIconsPlugin = createSvgIconsPlugin({
|
||||
// 指定需要缓存的图标文件夹
|
||||
iconDirs: [path.resolve(process.cwd(), 'src/assets/icons')],
|
||||
// 指定symbolId格式
|
||||
symbolId: 'icon-[dir]-[name]',
|
||||
});
|
||||
return svgIconsPlugin;
|
||||
}
|
|
@ -0,0 +1,32 @@
|
|||
import type { ProxyOptions } from 'vite';
|
||||
|
||||
type ProxyItem = [string, string];
|
||||
|
||||
type ProxyList = ProxyItem[];
|
||||
|
||||
type ProxyTargetList = Record<string, ProxyOptions>;
|
||||
|
||||
const httpsRE = /^https:\/\//;
|
||||
|
||||
/**
|
||||
* 创建代理,用于解析 .env.development 代理配置
|
||||
* @param {ProxyList} list 代理地址列表
|
||||
*/
|
||||
export function createProxy(list: ProxyList = []) {
|
||||
const ret: ProxyTargetList = {};
|
||||
for (const [prefix, target] of list) {
|
||||
const isHttps = httpsRE.test(target);
|
||||
|
||||
// https://github.com/http-party/node-http-proxy#options
|
||||
ret[prefix] = {
|
||||
target: target,
|
||||
changeOrigin: true,
|
||||
ws: true,
|
||||
rewrite: (path) => path.replace(new RegExp(`^${prefix}`), ''),
|
||||
// https is require secure=false
|
||||
// 如果您secure="true"只允许来自 HTTPS 的请求,则secure="false"意味着允许来自 HTTP 和 HTTPS 的请求。
|
||||
...(isHttps ? { secure: false } : {}),
|
||||
};
|
||||
}
|
||||
return ret;
|
||||
}
|
72
package.json
|
@ -1,18 +1,15 @@
|
|||
{
|
||||
"name": "vue-template-base",
|
||||
"private": true,
|
||||
"version": "0.0.0",
|
||||
"description": "使用 Vue3 + TS 构建的项目基础模版",
|
||||
"name": "vue-template-admin",
|
||||
"version": "0.0.1",
|
||||
"description": "使用 Vue3 + TS 构建的后台管理系统",
|
||||
"author": "sankeyangshu",
|
||||
"license": "MIT",
|
||||
"keywords": [
|
||||
"vue",
|
||||
"typescript"
|
||||
],
|
||||
"private": true,
|
||||
"scripts": {
|
||||
"dev": "vite",
|
||||
"build": "vite build",
|
||||
"type-check": "vue-tsc --noEmit --skipLibCheck",
|
||||
"build:dev": "vite build --mode development",
|
||||
"build:prod": "vite build --mode production",
|
||||
"build:test": "vite build --mode test",
|
||||
"preview": "vite preview",
|
||||
"lint:lint-staged": "lint-staged",
|
||||
"lint:eslint": "eslint \"src/**/*.{vue,ts,tsx}\" --fix",
|
||||
|
@ -20,6 +17,19 @@
|
|||
"lint:stylelint": "stylelint --fix \"**/*.{vue,less,postcss,css,scss}\" --cache --cache-location node_modules/.cache/stylelint/",
|
||||
"prepare": "husky install"
|
||||
},
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "git+https://github.com/sankeyangshu/vue-template-admin.git"
|
||||
},
|
||||
"keywords": [
|
||||
"vue",
|
||||
"typescript",
|
||||
"admin"
|
||||
],
|
||||
"bugs": {
|
||||
"url": "https://github.com/sankeyangshu/vue-template-admin/issues"
|
||||
},
|
||||
"homepage": "https://github.com/sankeyangshu/vue-template-admin#readme",
|
||||
"lint-staged": {
|
||||
"*.{js,jsx,ts,tsx}": [
|
||||
"eslint --fix",
|
||||
|
@ -46,46 +56,56 @@
|
|||
},
|
||||
"dependencies": {
|
||||
"@element-plus/icons-vue": "^2.3.1",
|
||||
"@wangeditor/editor": "^5.1.23",
|
||||
"@wangeditor/editor-for-vue": "^5.1.12",
|
||||
"axios": "^1.6.8",
|
||||
"dayjs": "^1.11.11",
|
||||
"echarts": "^5.5.1",
|
||||
"element-plus": "^2.8.5",
|
||||
"element-plus": "^2.7.2",
|
||||
"nprogress": "^0.2.0",
|
||||
"path-browserify": "^1.0.1",
|
||||
"pinia": "^2.1.7",
|
||||
"pinia-plugin-persistedstate": "^3.2.1",
|
||||
"vue": "^3.4.27",
|
||||
"vue-echarts": "^7.0.3",
|
||||
"vue-router": "^4.3.3"
|
||||
"vue-hooks-plus": "^2.0.1",
|
||||
"vue-router": "^4.3.2"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@commitlint/cli": "^19.3.0",
|
||||
"@commitlint/config-conventional": "^19.2.2",
|
||||
"@types/node": "^20.14.2",
|
||||
"@types/node": "^18.19.33",
|
||||
"@types/nprogress": "^0.2.3",
|
||||
"@types/path-browserify": "^1.0.3",
|
||||
"@typescript-eslint/eslint-plugin": "^7.13.0",
|
||||
"@typescript-eslint/parser": "^7.13.0",
|
||||
"@vitejs/plugin-vue": "^5.0.5",
|
||||
"@types/path-browserify": "^1.0.2",
|
||||
"@typescript-eslint/eslint-plugin": "^7.8.0",
|
||||
"@typescript-eslint/parser": "^7.8.0",
|
||||
"@vitejs/plugin-vue": "^5.0.4",
|
||||
"autoprefixer": "^10.4.19",
|
||||
"eslint": "^8.57.0",
|
||||
"eslint": "^8.56.0",
|
||||
"eslint-config-prettier": "^9.1.0",
|
||||
"eslint-plugin-import": "^2.29.1",
|
||||
"eslint-plugin-node": "^11.1.0",
|
||||
"eslint-plugin-prettier": "^5.1.3",
|
||||
"eslint-plugin-simple-import-sort": "^12.1.0",
|
||||
"eslint-plugin-vue": "^9.26.0",
|
||||
"husky": "^9.0.11",
|
||||
"lint-staged": "^15.2.7",
|
||||
"lint-staged": "^15.2.2",
|
||||
"postcss": "^8.4.38",
|
||||
"postcss-html": "^1.7.0",
|
||||
"prettier": "^3.3.2",
|
||||
"sass": "^1.77.5",
|
||||
"stylelint": "^16.6.1",
|
||||
"prettier": "^3.2.5",
|
||||
"sass": "^1.77.1",
|
||||
"stylelint": "^16.5.0",
|
||||
"stylelint-config-html": "^1.1.0",
|
||||
"stylelint-config-recess-order": "^5.0.1",
|
||||
"stylelint-config-recommended-scss": "^14.0.0",
|
||||
"stylelint-config-recommended-vue": "^1.5.0",
|
||||
"stylelint-config-standard": "^36.0.0",
|
||||
"stylelint-config-standard-scss": "^13.1.0",
|
||||
"typescript": "^5.4.5",
|
||||
"vite": "^5.2.13",
|
||||
"unplugin-auto-import": "^0.17.6",
|
||||
"unplugin-vue-components": "^0.27.0",
|
||||
"vite": "^5.2.11",
|
||||
"vite-plugin-compression": "^0.5.1",
|
||||
"vite-plugin-svg-icons": "^2.0.1",
|
||||
"vue-tsc": "^2.0.21"
|
||||
"vue-eslint-parser": "^9.4.2",
|
||||
"vue-tsc": "^2.0.17"
|
||||
}
|
||||
}
|
||||
|
|
1965
pnpm-lock.yaml
27
src/App.vue
|
@ -1,5 +1,30 @@
|
|||
<template>
|
||||
<router-view />
|
||||
<el-config-provider :locale="locale" :size="componentSize">
|
||||
<router-view />
|
||||
</el-config-provider>
|
||||
</template>
|
||||
|
||||
<script lang="ts" setup>
|
||||
import en from 'element-plus/es/locale/lang/en'; // 导入 Element Plus 语言包
|
||||
import zhCn from 'element-plus/es/locale/lang/zh-cn'; // 导入 Element Plus 语言包
|
||||
import { computed } from 'vue';
|
||||
import { useTheme } from '@/hooks/useTheme';
|
||||
import { useSettingStore } from '@/store/modules/setting';
|
||||
|
||||
// 初始化主题
|
||||
const { initTheme } = useTheme();
|
||||
initTheme();
|
||||
|
||||
// 获取全局设置
|
||||
const settingStore = useSettingStore();
|
||||
|
||||
// 获取全局设置中国际化语言默认值
|
||||
const language = computed(() => settingStore.language);
|
||||
|
||||
const locale = computed(() => (language.value === 'en' ? en : zhCn));
|
||||
|
||||
// 获取全局设置中组件尺寸默认值
|
||||
const componentSize = computed(() => settingStore.componentSize);
|
||||
</script>
|
||||
|
||||
<style lang="scss"></style>
|
||||
|
|
|
@ -0,0 +1,56 @@
|
|||
import { PageRowsResult, PageRowsType } from '@/types';
|
||||
import { ApiManageType, StatisticsType } from '@/types/help';
|
||||
import http from '@/utils/request';
|
||||
|
||||
// api接口
|
||||
const api = {
|
||||
apiDel: '/cargo/api/delete', // 删除
|
||||
apiGet: '/cargo/api/get', // 获取
|
||||
apiPage: '/cargo/api/page', // 分页列表
|
||||
apiSave: '/cargo/api/save', // 保存
|
||||
statistics: '/cargo/statistics/', // 首页数据统计
|
||||
};
|
||||
|
||||
/**
|
||||
* 删除
|
||||
* @param {number} data id
|
||||
* @return 返回请求删除接口的结果
|
||||
*/
|
||||
export function postApiDeleteAPI(data: number[]) {
|
||||
return http.post<string>(api.apiDel, data);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取
|
||||
* @param {number|string} data id
|
||||
* @return 返回请求获取接口的结果
|
||||
*/
|
||||
export function postApiGetAPI(data: { id: number | string }) {
|
||||
return http.postParams<ApiManageType>(api.apiGet, data);
|
||||
}
|
||||
|
||||
/**
|
||||
* 分页列表
|
||||
* @param {PageRowsType} data 查询条件
|
||||
* @return 返回请求分页列表接口的结果
|
||||
*/
|
||||
export function postApiPageAPI(data: Partial<PageRowsType>) {
|
||||
return http.post<PageRowsResult<ApiManageType>>(api.apiPage, data);
|
||||
}
|
||||
|
||||
/**
|
||||
* 保存
|
||||
* @param {ApiManageType} data 保存参数
|
||||
* @return 返回接口的结果
|
||||
*/
|
||||
export function postApiSaveAPI(data: Partial<ApiManageType>) {
|
||||
return http.post<string>(api.apiSave, data);
|
||||
}
|
||||
|
||||
/**
|
||||
* 首页数据统计
|
||||
* @return 返回接口的结果
|
||||
*/
|
||||
export function getStatisticsAPI() {
|
||||
return http.get<StatisticsType>(api.statistics);
|
||||
}
|
|
@ -0,0 +1,82 @@
|
|||
import { PageRowsResult } from '@/types';
|
||||
import { BoatInfoPageType, BoatInfoType } from '@/types/boatInfo';
|
||||
import http from '@/utils/request';
|
||||
|
||||
// api接口
|
||||
const api = {
|
||||
sailScheduleDelete: '/cargo/sail_schedule/delete', // 删除
|
||||
sailScheduleGet: '/cargo/sail_schedule/get', // 获取
|
||||
sailSchedulePage: '/cargo/sail_schedule/page', // 分页列表
|
||||
sailScheduleSave: '/cargo/sail_schedule/save', // 保存
|
||||
sailScheduleTmpExport: '/cargo/sail_schedule/tmp/export', // 船期模板下载
|
||||
sailScheduleImport: '/cargo/sail_schedule/import', // 导入
|
||||
historyList: '/cargo/sail_schedule/history/page', // 历史数据
|
||||
};
|
||||
|
||||
/**
|
||||
* 删除
|
||||
* @param {number} data id
|
||||
* @return 返回请求删除接口的结果
|
||||
*/
|
||||
export function getSailScheduleDeleteAPI(data: number[]) {
|
||||
return http.post<string>(api.sailScheduleDelete, data);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取
|
||||
* @param {number|string} data id
|
||||
* @return 返回请求获取接口的结果
|
||||
*/
|
||||
export function getSailScheduleGetAPI(data: { id: number | string }) {
|
||||
return http.postParams<BoatInfoType>(api.sailScheduleGet, data);
|
||||
}
|
||||
|
||||
/**
|
||||
* 分页列表
|
||||
* @param {getUserListType} data 分页信息
|
||||
* @return 返回请求分页列表接口的结果
|
||||
*/
|
||||
export function getSailSchedulePageAPI(data: Partial<BoatInfoPageType>) {
|
||||
return http.post<PageRowsResult<BoatInfoType>>(api.sailSchedulePage, data);
|
||||
}
|
||||
|
||||
/**
|
||||
* 保存
|
||||
* @param {BoatInfoType} data 船期信息
|
||||
* @return 返回请求保存接口的结果
|
||||
*/
|
||||
export function getSailScheduleSaveAPI(data: Partial<BoatInfoType>) {
|
||||
return http.post<string>(api.sailScheduleSave, data);
|
||||
}
|
||||
|
||||
/**
|
||||
* 船期模板下载
|
||||
* @return 返回请求下载接口的结果
|
||||
*/
|
||||
export function getSailScheduleTmpExportAPI() {
|
||||
return http.get<ArrayBuffer>(
|
||||
api.sailScheduleTmpExport,
|
||||
{},
|
||||
{
|
||||
responseType: 'arraybuffer',
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* 导入
|
||||
* @param {File} data 文件
|
||||
* @return 返回请求导入接口的结果
|
||||
*/
|
||||
export function getSailScheduleImportAPI(data: { file: File }) {
|
||||
return http.post<string>(api.sailScheduleImport, data);
|
||||
}
|
||||
|
||||
/**
|
||||
* 历史数据
|
||||
* @param {BoatInfoPageType} data 分页信息
|
||||
* @return 返回请求分页列表接口的结果
|
||||
*/
|
||||
export function getHistoryListAPI(data: Partial<BoatInfoPageType>) {
|
||||
return http.post<PageRowsResult<BoatInfoType>>(api.historyList, data);
|
||||
}
|
|
@ -0,0 +1,57 @@
|
|||
import { dictionaryListType, dictionaryType, PageRowsResult } from '@/types';
|
||||
import { BoatRoutePageType, BoatRouteType } from '@/types/boatInfo';
|
||||
import http from '@/utils/request';
|
||||
|
||||
// api接口
|
||||
const api = {
|
||||
routeDel: '/cargo/route/delete', // 删除
|
||||
routeGet: '/cargo/route/get', // 获取
|
||||
routePage: '/cargo/route/page', // 分页列表
|
||||
routeList: '/cargo/route/list', // 字典列表
|
||||
routeSave: '/cargo/route/save', // 保存
|
||||
};
|
||||
|
||||
/**
|
||||
* 删除
|
||||
* @param {number} data id
|
||||
* @return 返回请求删除接口的结果
|
||||
*/
|
||||
export function postRouteDeleteAPI(data: number[]) {
|
||||
return http.post<string>(api.routeDel, data);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取
|
||||
* @param {number|string} data id
|
||||
* @return 返回请求获取接口的结果
|
||||
*/
|
||||
export function postRouteGetAPI(data: { id: number | string }) {
|
||||
return http.postParams<BoatRouteType>(api.routeGet, data);
|
||||
}
|
||||
|
||||
/**
|
||||
* 分页列表
|
||||
* @param {BoatRoutePageType} data 查询条件
|
||||
* @return 返回请求分页列表接口的结果
|
||||
*/
|
||||
export function postRoutePageAPI(data: Partial<BoatRoutePageType>) {
|
||||
return http.post<PageRowsResult<BoatRouteType>>(api.routePage, data);
|
||||
}
|
||||
|
||||
/**
|
||||
* 字典列表
|
||||
* @param {dictionaryType} data 字典参数
|
||||
* @return 返回请求字典列表接口的结果
|
||||
*/
|
||||
export function postRouteListAPI(data: dictionaryType) {
|
||||
return http.postParams<dictionaryListType[]>(api.routeList, data);
|
||||
}
|
||||
|
||||
/**
|
||||
* 保存
|
||||
* @param {BoatRouteType} data 航线信息
|
||||
* @return 返回请求保存接口的结果
|
||||
*/
|
||||
export function postRouteSaveAPI(data: Partial<BoatRouteType>) {
|
||||
return http.post<string>(api.routeSave, data);
|
||||
}
|
|
@ -0,0 +1,57 @@
|
|||
import { dictionaryListType, dictionaryType, PageRowsResult } from '@/types';
|
||||
import { BrandPageType, BrandType } from '@/types/platform';
|
||||
import http from '@/utils/request';
|
||||
|
||||
// api接口
|
||||
const api = {
|
||||
brandDel: '/cargo/brand/delete', // 删除
|
||||
brandGet: '/cargo/brand/get', // 获取
|
||||
brandList: '/cargo/brand/list', // 字典列表
|
||||
brandPage: '/cargo/brand/page', // 分页列表
|
||||
brandSave: '/cargo/brand/save', // 保存
|
||||
};
|
||||
|
||||
/**
|
||||
* 品牌删除
|
||||
* @param {number} data id
|
||||
* @return 返回请求删除接口的结果
|
||||
*/
|
||||
export function postBrandDeleteAPI(data: number[]) {
|
||||
return http.post<string>(api.brandDel, data);
|
||||
}
|
||||
|
||||
/**
|
||||
* 品牌获取
|
||||
* @param {number|string} data id
|
||||
* @return 返回请求获取接口的结果
|
||||
*/
|
||||
export function postBrandGetAPI(data: { id: number | string }) {
|
||||
return http.postParams<BrandType>(api.brandGet, data);
|
||||
}
|
||||
|
||||
/**
|
||||
* 品牌字典列表
|
||||
* @param {dictionaryType} data 查询条件
|
||||
* @return 返回请求列表接口的结果
|
||||
*/
|
||||
export function postBrandListAPI(data: dictionaryType) {
|
||||
return http.postParams<dictionaryListType[]>(api.brandList, data);
|
||||
}
|
||||
|
||||
/**
|
||||
* 品牌分页列表
|
||||
* @param {BrandPageType} data 查询条件
|
||||
* @return 返回请求分页列表接口的结果
|
||||
*/
|
||||
export function postBrandPageAPI(data: Partial<BrandPageType>) {
|
||||
return http.post<PageRowsResult<BrandType>>(api.brandPage, data);
|
||||
}
|
||||
|
||||
/**
|
||||
* 品牌保存
|
||||
* @param {BrandType} data 保存参数
|
||||
* @return 返回请求保存接口的结果
|
||||
*/
|
||||
export function postBrandSaveAPI(data: Partial<BrandType>) {
|
||||
return http.post<string>(api.brandSave, data);
|
||||
}
|
|
@ -0,0 +1,169 @@
|
|||
import { dictionaryListType, dictionaryType, PageRowsResult } from '@/types';
|
||||
import { EnterpriseType } from '@/types/boatInfo';
|
||||
import { EmployeeType, EnterprisePageType, EnterpriseRegisterType } from '@/types/Enterprise';
|
||||
import http from '@/utils/request';
|
||||
|
||||
// api接口
|
||||
const api = {
|
||||
enterpriseDel: '/cargo/enterprise/delete', // 删除
|
||||
enterpriseDisable: '/cargo/enterprise/disable', // 禁用
|
||||
enterpriseEnable: '/cargo/enterprise/enable', // 启用
|
||||
employeeAdd: '/cargo/enterprise/employee/add', // 添加员工
|
||||
enterpriseGet: '/cargo/enterprise/get', // 获取
|
||||
enterpriseIDImg: '/cargo/enterprise/image/id', // 获取身份证照片
|
||||
enterpriseLicenseImg: '/cargo/enterprise/image/license', // 获取营业执照照片
|
||||
enterprisePage: '/cargo/enterprise/page', // 分页列表
|
||||
enterpriseList: '/cargo/enterprise/list', // 字典列表
|
||||
enterpriseReg: '/cargo/enterprise/reg', // 企业注册
|
||||
enterpriseRegCount: '/cargo/enterprise/reg/audit/count', // 企业注册待审核数量
|
||||
enterpriseRegPass: '/cargo/enterprise/reg/audit/pass', // 企业注册审核通过
|
||||
enterpriseSave: '/cargo/enterprise/save', // 保存
|
||||
enterpriseUpload: '/cargo/enterprise/upload', // 文件上传
|
||||
};
|
||||
|
||||
/**
|
||||
* 删除
|
||||
* @param {number} data id
|
||||
* @return 返回请求删除接口的结果
|
||||
*/
|
||||
export function postEnterpriseDeleteAPI(data: number[]) {
|
||||
return http.post<string>(api.enterpriseDel, data);
|
||||
}
|
||||
|
||||
/**
|
||||
* 禁用
|
||||
* @param {number} data id
|
||||
* @return 返回请求禁用接口的结果
|
||||
*/
|
||||
export function postEnterpriseDisableAPI(data: number[]) {
|
||||
return http.post<string>(api.enterpriseDisable, data);
|
||||
}
|
||||
|
||||
/**
|
||||
* 启用
|
||||
* @param {number} data id
|
||||
* @return 返回请求启用接口的结果
|
||||
*/
|
||||
export function postEnterpriseEnableAPI(data: number[]) {
|
||||
return http.post<string>(api.enterpriseEnable, data);
|
||||
}
|
||||
|
||||
/**
|
||||
* 添加员工
|
||||
* @param {EmployeeType} data 员工信息
|
||||
* @return 返回请求添加员工接口的结果
|
||||
*/
|
||||
export function postEmployeeAddAPI(data: Partial<EmployeeType>) {
|
||||
return http.post<string>(api.employeeAdd, data);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取
|
||||
* @param {number|string} data id
|
||||
* @return 返回请求获取接口的结果
|
||||
*/
|
||||
export function postEnterpriseGetAPI(data: { id: number | string }) {
|
||||
return http.postParams<EnterpriseType>(api.enterpriseGet, data);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取身份证照片
|
||||
* @param {number|string} id id
|
||||
* @return 返回请求获取身份证照片接口的结果
|
||||
*/
|
||||
export function getEnterpriseIDImgAPI(id: number | string) {
|
||||
return http.get<ArrayBuffer>(
|
||||
`${api.enterpriseIDImg}/${id}`,
|
||||
{},
|
||||
{
|
||||
responseType: 'arraybuffer',
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取营业执照照片
|
||||
* @param {number|string} id id
|
||||
* @return 返回请求获取营业执照照片接口的结果
|
||||
*/
|
||||
export function getEnterpriseLicenseImgAPI(id: number | string) {
|
||||
return http.get<ArrayBuffer>(
|
||||
`${api.enterpriseLicenseImg}/${id}`,
|
||||
{},
|
||||
{
|
||||
responseType: 'arraybuffer',
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* 分页列表
|
||||
* @param {EnterprisePageType} data 查询条件
|
||||
* @return 返回请求分页列表接口的结果
|
||||
*/
|
||||
export function postEnterprisePageAPI(data: Partial<EnterprisePageType>) {
|
||||
return http.post<PageRowsResult<EnterpriseType>>(api.enterprisePage, data);
|
||||
}
|
||||
|
||||
/**
|
||||
* 字典列表
|
||||
* @param {dictionaryType} data 字典参数
|
||||
* @return 返回请求字典列表接口的结果
|
||||
*/
|
||||
export function postEnterpriseListAPI(data: dictionaryType) {
|
||||
return http.postParams<dictionaryListType[]>(api.enterpriseList, data);
|
||||
}
|
||||
|
||||
/**
|
||||
* 企业注册
|
||||
* @param {EnterpriseRegisterType} data 企业信息
|
||||
* @return 返回请求企业注册接口的结果
|
||||
*/
|
||||
export function postEnterpriseRegAPI(data: Partial<EnterpriseRegisterType>) {
|
||||
return http.post<string>(api.enterpriseReg, data);
|
||||
}
|
||||
|
||||
/**
|
||||
* 企业注册待审核数量
|
||||
* @return 返回请求企业注册待审核数量接口的结果
|
||||
*/
|
||||
export function getEnterpriseRegCountAPI() {
|
||||
return http.post<string>(api.enterpriseRegCount);
|
||||
}
|
||||
|
||||
/**
|
||||
* 企业注册审核通过
|
||||
* @param {number} data id
|
||||
* @return 返回请求企业注册审核通过接口的结果
|
||||
*/
|
||||
export function postEnterpriseRegPassAPI(data: number[]) {
|
||||
return http.post<string>(api.enterpriseRegPass, data);
|
||||
}
|
||||
|
||||
/**
|
||||
* 保存
|
||||
* @param {EnterpriseType} data 企业信息
|
||||
* @return 返回请求保存接口的结果
|
||||
*/
|
||||
export function postEnterpriseSaveAPI(data: Partial<EnterpriseType>) {
|
||||
return http.post<string>(api.enterpriseSave, data);
|
||||
}
|
||||
|
||||
/**
|
||||
* 文件上传
|
||||
* @param {File} data 文件
|
||||
* @return 返回请求文件上传接口的结果
|
||||
*/
|
||||
export function postEnterpriseUploadAPI(
|
||||
data: { file: File },
|
||||
config: { type: number; no: string | number }
|
||||
) {
|
||||
return http.post<string>(api.enterpriseUpload, data, {
|
||||
headers: {
|
||||
'Content-Type': 'multipart/form-data',
|
||||
},
|
||||
params: {
|
||||
...config,
|
||||
},
|
||||
});
|
||||
}
|
|
@ -0,0 +1,77 @@
|
|||
import { dictionaryListType, dictionaryType, PageRowsResult } from '@/types';
|
||||
import { EmployeePageType, EmployeeType } from '@/types/Enterprise';
|
||||
import http from '@/utils/request';
|
||||
|
||||
// api接口
|
||||
const api = {
|
||||
employeeDel: '/cargo/employee/delete', // 删除
|
||||
employeeDisable: '/cargo/employee/disable', // 禁用
|
||||
employeeEnable: '/cargo/employee/enable', // 启用
|
||||
employeeGet: '/cargo/employee/get', // 获取
|
||||
employeeList: '/cargo/employee/list', // 字典列表
|
||||
employeePage: '/cargo/employee/page', // 分页列表
|
||||
employeeSave: '/cargo/enterprise/employee/add', // 保存
|
||||
};
|
||||
|
||||
/**
|
||||
* 删除
|
||||
* @param {number} data id
|
||||
* @return 返回请求删除接口的结果
|
||||
*/
|
||||
export function postEmployeeDeleteAPI(data: number[]) {
|
||||
return http.post<string>(api.employeeDel, data);
|
||||
}
|
||||
|
||||
/**
|
||||
* 禁用
|
||||
* @param {number} data id
|
||||
* @return 返回请求禁用接口的结果
|
||||
*/
|
||||
export function postEmployeeDisableAPI(data: number[]) {
|
||||
return http.post<string>(api.employeeDisable, data);
|
||||
}
|
||||
|
||||
/**
|
||||
* 启用
|
||||
* @param {number} data id
|
||||
* @return 返回请求启用接口的结果
|
||||
*/
|
||||
export function postEmployeeEnableAPI(data: number[]) {
|
||||
return http.post<string>(api.employeeEnable, data);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取
|
||||
* @param {number|string} data id
|
||||
* @return 返回请求获取接口的结果
|
||||
*/
|
||||
export function postEmployeeGetAPI(data: { id: number | string }) {
|
||||
return http.postParams<EmployeeType>(api.employeeGet, data);
|
||||
}
|
||||
|
||||
/**
|
||||
* 分页列表
|
||||
* @param {EmployeePageType} data 查询条件
|
||||
* @return 返回请求分页列表接口的结果
|
||||
*/
|
||||
export function postEmployeePageAPI(data: Partial<EmployeePageType>) {
|
||||
return http.post<PageRowsResult<EmployeeType>>(api.employeePage, data);
|
||||
}
|
||||
|
||||
/**
|
||||
* 字典列表
|
||||
* @param {dictionaryType} data 字典参数
|
||||
* @return 返回请求字典列表接口的结果
|
||||
*/
|
||||
export function postEmployeeListAPI(data: dictionaryType) {
|
||||
return http.postParams<dictionaryListType[]>(api.employeeList, data);
|
||||
}
|
||||
|
||||
/**
|
||||
* 保存
|
||||
* @param {EmployeeType} data 员工信息
|
||||
* @return 返回请求保存接口的结果
|
||||
*/
|
||||
export function postEmployeeSaveAPI(data: Partial<EmployeeType>) {
|
||||
return http.post<string>(api.employeeSave, data);
|
||||
}
|
|
@ -0,0 +1,47 @@
|
|||
import { PageRowsResult, PageRowsType } from '@/types';
|
||||
import { HelpType } from '@/types/help';
|
||||
import http from '@/utils/request';
|
||||
|
||||
// api接口
|
||||
const api = {
|
||||
helpDel: '/cargo/help/delete', // 删除
|
||||
helpGet: '/cargo/help/get', // 获取
|
||||
helpPage: '/cargo/help/page', // 分页列表
|
||||
helpSave: '/cargo/help/save', // 保存
|
||||
};
|
||||
|
||||
/**
|
||||
* 帮助文档删除
|
||||
* @param {number} data id
|
||||
* @return 返回请求删除接口的结果
|
||||
*/
|
||||
export function postHelpDeleteAPI(data: number[]) {
|
||||
return http.post<string>(api.helpDel, data);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取
|
||||
* @param {number|string} data id
|
||||
* @return 返回请求获取接口的结果
|
||||
*/
|
||||
export function postHelpGetAPI(data: { id: number | string }) {
|
||||
return http.postParams<HelpType>(api.helpGet, data);
|
||||
}
|
||||
|
||||
/**
|
||||
* 分页列表
|
||||
* @param {PageRowsType} data 查询条件
|
||||
* @return 返回请求分页列表接口的结果
|
||||
*/
|
||||
export function postHelpPageAPI(data: Partial<PageRowsType>) {
|
||||
return http.post<PageRowsResult<HelpType>>(api.helpPage, data);
|
||||
}
|
||||
|
||||
/**
|
||||
* 保存帮助中心
|
||||
* @param {HelpType} data 参数
|
||||
* @return 返回请求保存接口的结果
|
||||
*/
|
||||
export function postHelpSaveAPI(data: Partial<HelpType>) {
|
||||
return http.post<string>(api.helpSave, data);
|
||||
}
|
|
@ -0,0 +1,72 @@
|
|||
import { PageRowsResult } from '@/types';
|
||||
import { ManifestDetailPageType, ManifestDetailType } from '@/types/manifest';
|
||||
import http from '@/utils/request';
|
||||
|
||||
// api接口
|
||||
const api = {
|
||||
manifestDel: '/cargo/manifest/detail/delete', // 删除
|
||||
manifestGet: '/cargo/manifest/detail/get', // 获取
|
||||
manifestPage: '/cargo/manifest/detail/page', // 分页列表
|
||||
manifestSave: '/cargo/manifest/detail/save', // 保存
|
||||
manifestImport: '/cargo/manifest/detail/import', // 舱单导入
|
||||
manifestExport: '/cargo/manifest/detail/tmp/export', // 下载模版
|
||||
};
|
||||
|
||||
/**
|
||||
* 舱单详情删除
|
||||
* @param {number} data id
|
||||
* @return 返回请求删除接口的结果
|
||||
*/
|
||||
export function postManifestDetailDeleteAPI(data: number[]) {
|
||||
return http.post<string>(api.manifestDel, data);
|
||||
}
|
||||
|
||||
/**
|
||||
* 舱单详情获取
|
||||
* @param {number|string} data id
|
||||
* @return 返回请求获取接口的结果
|
||||
*/
|
||||
export function getManifestDetailGetAPI(data: { id: number | string }) {
|
||||
return http.postParams<ManifestDetailType>(api.manifestGet, data);
|
||||
}
|
||||
|
||||
/**
|
||||
* 舱单详情分页列表
|
||||
* @param {ManifestDetailPageType} data 查询参数
|
||||
* @return 返回请求分页列表接口的结果
|
||||
*/
|
||||
export function getManifestDetailPageAPI(data: Partial<ManifestDetailPageType>) {
|
||||
return http.post<PageRowsResult<ManifestDetailType>>(api.manifestPage, data);
|
||||
}
|
||||
|
||||
/**
|
||||
* 舱单明细保存
|
||||
* @param {ManifestDetailType} data 参数
|
||||
* @return 返回请求保存接口的结果
|
||||
*/
|
||||
export function postManifestDetailSaveAPI(data: Partial<ManifestDetailType>) {
|
||||
return http.post<string>(api.manifestSave, data);
|
||||
}
|
||||
|
||||
/**
|
||||
* 导入
|
||||
* @param {File} data 文件
|
||||
* @return 返回请求导入接口的结果
|
||||
*/
|
||||
export function getManifestDetailImportAPI(data: { file?: File; scheduleId: number | string }) {
|
||||
return http.post<string>(api.manifestImport, data);
|
||||
}
|
||||
|
||||
/**
|
||||
* 模板下载
|
||||
* @return 返回请求下载接口的结果
|
||||
*/
|
||||
export function getManifestDetailTmpExportAPI() {
|
||||
return http.get<ArrayBuffer>(
|
||||
api.manifestExport,
|
||||
{},
|
||||
{
|
||||
responseType: 'arraybuffer',
|
||||
}
|
||||
);
|
||||
}
|
|
@ -0,0 +1,72 @@
|
|||
import { PageRowsResult } from '@/types';
|
||||
import { ManifestPageType, ManifestType } from '@/types/manifest';
|
||||
import http from '@/utils/request';
|
||||
|
||||
// api接口
|
||||
const api = {
|
||||
manifestDel: '/cargo/manifest/delete', // 删除
|
||||
manifestGet: '/cargo/manifest/get', // 获取
|
||||
manifestPage: '/cargo/manifest/page', // 分页列表
|
||||
manifestSave: '/cargo/manifest/save', // 保存
|
||||
manifestImport: '/cargo/manifest/import', // 舱单导入
|
||||
manifestExport: '/cargo/manifest/tmp/export', // 下载模版
|
||||
};
|
||||
|
||||
/**
|
||||
* 舱单删除
|
||||
* @param {number} data id
|
||||
* @return 返回请求删除接口的结果
|
||||
*/
|
||||
export function postManifestDeleteAPI(data: number[]) {
|
||||
return http.post<string>(api.manifestDel, data);
|
||||
}
|
||||
|
||||
/**
|
||||
* 舱单获取
|
||||
* @param {number|string} data id
|
||||
* @return 返回请求获取接口的结果
|
||||
*/
|
||||
export function getManifestGetAPI(data: { id: number | string }) {
|
||||
return http.postParams<ManifestType>(api.manifestGet, data);
|
||||
}
|
||||
|
||||
/**
|
||||
* 舱单分页列表
|
||||
* @param {ManifestPageType} data 查询参数
|
||||
* @return 返回请求分页列表接口的结果
|
||||
*/
|
||||
export function getManifestPageAPI(data: Partial<ManifestPageType>) {
|
||||
return http.post<PageRowsResult<ManifestType>>(api.manifestPage, data);
|
||||
}
|
||||
|
||||
/**
|
||||
* 舱单保存
|
||||
* @param {ManifestType} data 参数
|
||||
* @return 返回请求保存接口的结果
|
||||
*/
|
||||
export function postManifestSaveAPI(data: Partial<ManifestType>) {
|
||||
return http.post<string>(api.manifestSave, data);
|
||||
}
|
||||
|
||||
/**
|
||||
* 导入
|
||||
* @param {File} data 文件
|
||||
* @return 返回请求导入接口的结果
|
||||
*/
|
||||
export function getManifestImportAPI(data: { file?: File; scheduleId: number | string }) {
|
||||
return http.post<string>(api.manifestImport, data);
|
||||
}
|
||||
|
||||
/**
|
||||
* 模板下载
|
||||
* @return 返回请求下载接口的结果
|
||||
*/
|
||||
export function getManifestTmpExportAPI() {
|
||||
return http.get<ArrayBuffer>(
|
||||
api.manifestExport,
|
||||
{},
|
||||
{
|
||||
responseType: 'arraybuffer',
|
||||
}
|
||||
);
|
||||
}
|
|
@ -0,0 +1,56 @@
|
|||
import { PageRowsResult } from '@/types';
|
||||
import { NoticePageType, NoticeType } from '@/types/notice';
|
||||
import http from '@/utils/request';
|
||||
|
||||
// api接口
|
||||
const api = {
|
||||
noticeCount: '/cargo/notice/count', // 公告数量
|
||||
noticeDel: '/cargo/notice/delete', // 删除
|
||||
noticeGet: '/cargo/notice/get', // 获取
|
||||
noticePage: '/cargo/notice/page', // 分页列表
|
||||
noticeSave: '/cargo/notice/save', // 保存
|
||||
};
|
||||
|
||||
/**
|
||||
* 删除
|
||||
* @param {number} data id
|
||||
* @return 返回请求删除接口的结果
|
||||
*/
|
||||
export function noticeDeleteAPI(data: number[]) {
|
||||
return http.post<string>(api.noticeDel, data);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取
|
||||
* @param {number|string} data id
|
||||
* @return 返回请求获取接口的结果
|
||||
*/
|
||||
export function noticeGetAPI(data: { id: number | string }) {
|
||||
return http.postParams<NoticeType>(api.noticeGet, data);
|
||||
}
|
||||
|
||||
/**
|
||||
* 公告分页列表
|
||||
* @param {NoticePageType} data 查询条件
|
||||
* @return 返回请求分页列表接口的结果
|
||||
*/
|
||||
export function noticePageAPI(data: Partial<NoticePageType>) {
|
||||
return http.post<PageRowsResult<NoticeType>>(api.noticePage, data);
|
||||
}
|
||||
|
||||
/**
|
||||
* 保存
|
||||
* @param {NoticeType} data 企业信息
|
||||
* @return 返回请求保存接口的结果
|
||||
*/
|
||||
export function noticeSaveAPI(data: Partial<NoticeType>) {
|
||||
return http.post<string>(api.noticeSave, data);
|
||||
}
|
||||
|
||||
/**
|
||||
* 公告数量
|
||||
* @return 返回请求公告数量接口的结果
|
||||
*/
|
||||
export function noticeCountAPI() {
|
||||
return http.get<number>(api.noticeCount);
|
||||
}
|
|
@ -0,0 +1,67 @@
|
|||
import { dictionaryListType, dictionaryType, PageRowsResult } from '@/types';
|
||||
import { PortPageType, PortType, ProvinceCityType } from '@/types/boatInfo';
|
||||
import http from '@/utils/request';
|
||||
|
||||
// api接口
|
||||
const api = {
|
||||
portDel: '/cargo/port/delete', // 删除
|
||||
portGet: '/cargo/port/get', // 获取
|
||||
portList: '/cargo/port/list', // 字典列表
|
||||
portPage: '/cargo/port/page', // 分页列表
|
||||
portSave: '/cargo/port/save', // 保存
|
||||
cityList: '/cargo/city/list', // 城市列表
|
||||
};
|
||||
|
||||
/**
|
||||
* 删除
|
||||
* @param {number} data id
|
||||
* @return 返回请求删除接口的结果
|
||||
*/
|
||||
export function postPortDeleteAPI(data: number[]) {
|
||||
return http.post<string>(api.portDel, data);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取
|
||||
* @param {number|string} data id
|
||||
* @return 返回请求获取接口的结果
|
||||
*/
|
||||
export function postPortGetAPI(data: { id: number | string }) {
|
||||
return http.postParams<PortType>(api.portGet, data);
|
||||
}
|
||||
|
||||
/**
|
||||
* 字典列表
|
||||
* @param {dictionaryType} data 字典参数
|
||||
* @return 返回请求字典列表接口的结果
|
||||
*/
|
||||
export function postPortListAPI(data: dictionaryType) {
|
||||
return http.postParams<dictionaryListType[]>(api.portList, data);
|
||||
}
|
||||
|
||||
/**
|
||||
* 分页列表
|
||||
* @param {PortPageType} data 分页参数
|
||||
* @return 返回请求分页列表接口的结果
|
||||
*/
|
||||
export function postPortPageAPI(data: Partial<PortPageType>) {
|
||||
return http.post<PageRowsResult<PortType>>(api.portPage, data);
|
||||
}
|
||||
|
||||
/**
|
||||
* 保存
|
||||
* @param {PortType} data 企业信息
|
||||
* @return 返回请求保存接口的结果
|
||||
*/
|
||||
export function postPortSaveAPI(data: Partial<PortType>) {
|
||||
return http.post<string>(api.portSave, data);
|
||||
}
|
||||
|
||||
/**
|
||||
* 城市列表
|
||||
* @param {number|string} id 城市id
|
||||
* @return 返回请求城市列表接口的结果
|
||||
*/
|
||||
export function getCityListAPI(id?: number | string) {
|
||||
return http.get<ProvinceCityType[]>(api.cityList, { id });
|
||||
}
|
|
@ -0,0 +1,57 @@
|
|||
import { dictionaryListType, dictionaryType, PageRowsResult } from '@/types';
|
||||
import { ShipPageType, ShipType } from '@/types/boatInfo';
|
||||
import http from '@/utils/request';
|
||||
|
||||
// api接口
|
||||
const api = {
|
||||
shipDel: '/cargo/ship/delete', // 删除
|
||||
shipGet: '/cargo/ship/get', // 获取
|
||||
shipList: '/cargo/ship/list', // 字典列表
|
||||
shipPage: '/cargo/ship/page', // 分页列表
|
||||
shipSave: '/cargo/ship/save', // 保存
|
||||
};
|
||||
|
||||
/**
|
||||
* 船舶删除
|
||||
* @param {number} data id
|
||||
* @return 返回请求删除接口的结果
|
||||
*/
|
||||
export function postShipDeleteAPI(data: number[]) {
|
||||
return http.post<string>(api.shipDel, data);
|
||||
}
|
||||
|
||||
/**
|
||||
* 船舶获取
|
||||
* @param {number|string} data id
|
||||
* @return 返回请求获取接口的结果
|
||||
*/
|
||||
export function postShipGetAPI(data: { id: number | string }) {
|
||||
return http.postParams<ShipType>(api.shipGet, data);
|
||||
}
|
||||
|
||||
/**
|
||||
* 船舶字典列表
|
||||
* @param {dictionaryType} data 字典参数
|
||||
* @return 返回请求字典列表接口的结果
|
||||
*/
|
||||
export function postShipListAPI(data: dictionaryType) {
|
||||
return http.postParams<dictionaryListType[]>(api.shipList, data);
|
||||
}
|
||||
|
||||
/**
|
||||
* 船舶分页列表
|
||||
* @param {ShipPageType} data 查询条件
|
||||
* @return 返回请求分页列表接口的结果
|
||||
*/
|
||||
export function postShipPageAPI(data: Partial<ShipPageType>) {
|
||||
return http.post<PageRowsResult<ShipType>>(api.shipPage, data);
|
||||
}
|
||||
|
||||
/**
|
||||
* 船舶保存
|
||||
* @param {ShipType} data 保存参数
|
||||
* @return 返回请求保存接口的结果
|
||||
*/
|
||||
export function postShipSaveAPI(data: Partial<ShipType>) {
|
||||
return http.post<string>(api.shipSave, data);
|
||||
}
|
|
@ -0,0 +1,57 @@
|
|||
import { dictionaryListType, dictionaryType, PageRowsResult } from '@/types';
|
||||
import { ShipChartPageType, ShipChartType } from '@/types/boatInfo';
|
||||
import http from '@/utils/request';
|
||||
|
||||
// api接口
|
||||
const api = {
|
||||
shipChartDel: '/cargo/ship/chart/delete', // 删除
|
||||
shipChartGet: '/cargo/ship/chart/get', // 获取
|
||||
shipChartList: '/cargo/ship/chart/list', // 字典列表
|
||||
shipChartPage: '/cargo/ship/chart/page', // 分页列表
|
||||
shipChartSave: '/cargo/ship/chart/save', // 保存
|
||||
};
|
||||
|
||||
/**
|
||||
* 船图删除
|
||||
* @param {number} data id
|
||||
* @return 返回请求删除接口的结果
|
||||
*/
|
||||
export function postShipChartDeleteAPI(data: number[]) {
|
||||
return http.post<string>(api.shipChartDel, data);
|
||||
}
|
||||
|
||||
/**
|
||||
* 船图获取
|
||||
* @param {number|string} data id
|
||||
* @return 返回请求获取接口的结果
|
||||
*/
|
||||
export function postShipChartGetAPI(data: { id: number | string }) {
|
||||
return http.postParams<ShipChartType>(api.shipChartGet, data);
|
||||
}
|
||||
|
||||
/**
|
||||
* 船图字典列表
|
||||
* @param {dictionaryType} data 字典参数
|
||||
* @return 返回请求字典列表接口的结果
|
||||
*/
|
||||
export function postShipChartListAPI(data: dictionaryType) {
|
||||
return http.postParams<dictionaryListType[]>(api.shipChartList, data);
|
||||
}
|
||||
|
||||
/**
|
||||
* 船图分页列表
|
||||
* @param {ShipChartPageType} data 查询条件
|
||||
* @return 返回请求分页列表接口的结果
|
||||
*/
|
||||
export function postShipChartPageAPI(data: Partial<ShipChartPageType>) {
|
||||
return http.post<PageRowsResult<ShipChartType>>(api.shipChartPage, data);
|
||||
}
|
||||
|
||||
/**
|
||||
* 船图保存
|
||||
* @param {ShipChartType} data 保存参数
|
||||
* @return 返回请求保存接口的结果
|
||||
*/
|
||||
export function postShipChartSaveAPI(data: Partial<ShipChartType>) {
|
||||
return http.post<string>(api.shipChartSave, data);
|
||||
}
|
|
@ -0,0 +1,77 @@
|
|||
import { PageRowsResult } from '@/types';
|
||||
import { SubscribePageType, SubscriptionType } from '@/types/subscription';
|
||||
import http from '@/utils/request';
|
||||
|
||||
// api接口
|
||||
const api = {
|
||||
subscriptionDel: '/cargo/subscribe/delete', // 删除
|
||||
subscriptionGet: '/cargo/subscribe/get', // 获取
|
||||
subscriptionPage: '/cargo/subscribe/page', // 分页列表
|
||||
publishPage: '/cargo/subscribe/publish/page', // 我发布订阅分页列表
|
||||
receivePage: '/cargo/subscribe/receive/page', // 我接受订阅分页列表
|
||||
subscriptionSave: '/cargo/subscribe/save', // 保存
|
||||
editStatus: '/cargo/subscribe/update', // 修改状态
|
||||
};
|
||||
|
||||
/**
|
||||
* 删除
|
||||
* @param {number} data id
|
||||
* @return 返回请求删除接口的结果
|
||||
*/
|
||||
export function subscriptionDeleteAPI(data: number[]) {
|
||||
return http.post<string>(api.subscriptionDel, data);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取
|
||||
* @param {number|string} data id
|
||||
* @return 返回请求获取接口的结果
|
||||
*/
|
||||
export function subscriptionGetAPI(data: { id: number | string }) {
|
||||
return http.postParams<SubscriptionType>(api.subscriptionGet, data);
|
||||
}
|
||||
|
||||
/**
|
||||
* 分页列表
|
||||
* @param {SubscribePageType} data 分页查询参数
|
||||
* @return 返回请求分页列表接口的结果
|
||||
*/
|
||||
export function subscriptionPageAPI(data: Partial<SubscribePageType>) {
|
||||
return http.post<PageRowsResult<SubscriptionType>>(api.subscriptionPage, data);
|
||||
}
|
||||
|
||||
/**
|
||||
* 我发布订阅分页列表
|
||||
* @param {SubscribePageType} data 分页查询参数
|
||||
* @return 返回请求分页列表接口的结果
|
||||
*/
|
||||
export function publishPageAPI(data: Partial<SubscribePageType>) {
|
||||
return http.post<PageRowsResult<SubscriptionType>>(api.publishPage, data);
|
||||
}
|
||||
|
||||
/**
|
||||
* 我接受订阅分页列表
|
||||
* @param {SubscribePageType} data 分页查询参数
|
||||
* @return 返回请求分页列表接口的结果
|
||||
*/
|
||||
export function receivePageAPI(data: Partial<SubscribePageType>) {
|
||||
return http.post<PageRowsResult<SubscriptionType>>(api.receivePage, data);
|
||||
}
|
||||
|
||||
/**
|
||||
* 保存
|
||||
* @param {SubscriptionType} data
|
||||
* @return 返回请求保存接口的结果
|
||||
*/
|
||||
export function subscriptionSaveAPI(data: SubscriptionType) {
|
||||
return http.post<string>(api.subscriptionSave, data);
|
||||
}
|
||||
|
||||
/**
|
||||
* 修改状态
|
||||
* @param data
|
||||
* @return 返回请求保存接口的结果
|
||||
*/
|
||||
export function editStatusAPI(data: { id: string | number; status: string }) {
|
||||
return http.get<string>(api.editStatus, data);
|
||||
}
|
|
@ -0,0 +1,25 @@
|
|||
import { menuParamsType, menuType } from '@/types/menu';
|
||||
import http from '@/utils/request';
|
||||
|
||||
// api接口
|
||||
const api = {
|
||||
appList: '/admin/app/list', // 系统列表
|
||||
menuTree: '/admin/menu/tree', // 系统操作权限树
|
||||
};
|
||||
|
||||
/**
|
||||
* 获取系统列表
|
||||
* @return 返回请求获取系统列表接口的结果
|
||||
*/
|
||||
export function getAppListAPI() {
|
||||
return http.post<string[]>(api.appList);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取系统操作权限树
|
||||
* @param {menuParamsType} data 系统参数
|
||||
* @return 返回请求获取系统操作权限树接口的结果
|
||||
*/
|
||||
export function getMenuTreeAPI(data: menuParamsType) {
|
||||
return http.post<menuType[]>(api.menuTree, data);
|
||||
}
|
|
@ -0,0 +1,77 @@
|
|||
import { dictionaryListType, dictionaryType, PageRowsResult } from '@/types';
|
||||
import { getRoleListType, rolePremType, roleType } from '@/types/role';
|
||||
import http from '@/utils/request';
|
||||
|
||||
// api接口
|
||||
const api = {
|
||||
roleSave: '/admin/role/save', // 角色保存
|
||||
rolePremSave: '/admin/role/perm/save', // 添加角色操作权限
|
||||
rolePage: '/admin/role/page', // 角色分页列表
|
||||
roleList: '/admin/role/list', // 角色字典列表
|
||||
roleGet: '/admin/role/get', // 角色详情
|
||||
roleDelete: '/admin/role/delete', // 角色删除
|
||||
roleMenuList: '/admin/role/perm/list', // 角色菜单列表
|
||||
};
|
||||
|
||||
/**
|
||||
* 角色保存
|
||||
* @param {roleType} data 角色信息
|
||||
* @return 返回请求角色保存接口的结果
|
||||
*/
|
||||
export function postRoleSaveAPI(data: roleType) {
|
||||
return http.post<string>(api.roleSave, data);
|
||||
}
|
||||
|
||||
/**
|
||||
* 角色操作权限
|
||||
* @param {rolePremType} data 角色权限
|
||||
* @return 返回请求角色操作权限接口的结果
|
||||
*/
|
||||
export function postRolePremSaveAPI(data: rolePremType) {
|
||||
return http.post<string>(api.rolePremSave, data);
|
||||
}
|
||||
|
||||
/**
|
||||
* 角色分页列表
|
||||
* @param {getUserListType} data 分页信息
|
||||
* @return 返回请求角色分页列表接口的结果
|
||||
*/
|
||||
export function postRolePageAPI(data: Partial<getRoleListType>) {
|
||||
return http.post<PageRowsResult<roleType>>(api.rolePage, data);
|
||||
}
|
||||
|
||||
/**
|
||||
* 角色字典列表
|
||||
* @param {dictionaryType} data 字典信息
|
||||
* @return 返回请求角色字典列表接口的结果
|
||||
*/
|
||||
export function getRoleListAPI(data: dictionaryType) {
|
||||
return http.postParams<dictionaryListType[]>(api.roleList, data);
|
||||
}
|
||||
|
||||
/**
|
||||
* 角色详情
|
||||
* @param {string|number} data 角色id
|
||||
* @return 返回请求角色详情接口的结果
|
||||
*/
|
||||
export function getRoleGetAPI(data: { id: number | string }) {
|
||||
return http.postParams<roleType>(api.roleGet, data);
|
||||
}
|
||||
|
||||
/**
|
||||
* 角色删除
|
||||
* @param {number} data 角色id
|
||||
* @return 返回请求角色删除接口的结果
|
||||
*/
|
||||
export function getRoleDeleteAPI(data: number[]) {
|
||||
return http.post<string>(api.roleDelete, data);
|
||||
}
|
||||
|
||||
/**
|
||||
* 角色菜单列表
|
||||
* @param {string|number} data 角色id
|
||||
* @return 返回请求角色菜单列表接口的结果
|
||||
*/
|
||||
export function getRoleMenuListAPI(data: { roleId: number | string }) {
|
||||
return http.postParams<string[]>(api.roleMenuList, data);
|
||||
}
|
|
@ -0,0 +1,109 @@
|
|||
import { dictionaryListType, dictionaryType, PageRowsResult } from '@/types';
|
||||
import { roleType } from '@/types/role';
|
||||
import {
|
||||
getUserListType,
|
||||
loginDataType,
|
||||
userInfoRepType,
|
||||
userPasswordType,
|
||||
userRoleType,
|
||||
userType,
|
||||
} from '@/types/user';
|
||||
import http from '@/utils/request';
|
||||
|
||||
// api接口
|
||||
const api = {
|
||||
login: '/admin/user/login', // 用户登录接口
|
||||
userSave: '/admin/user/save', // 用户保存
|
||||
userPassword: '/admin/user/password', // 用户修改密码
|
||||
userPage: '/admin/user/page', // 用户分页列表
|
||||
userList: '/admin/user/list', // 用户字典列表
|
||||
userGet: '/admin/user/get', // 用户详情
|
||||
userDelete: '/admin/user/delete', // 用户删除
|
||||
userRole: '/admin/user/role/add', // 用户添加角色
|
||||
userRoleList: '/admin/user/role/list', // 用户角色列表
|
||||
};
|
||||
|
||||
/**
|
||||
* 用户登录
|
||||
* @param {loginDataType} data 登录参数
|
||||
* @return 返回请求登录接口的结果
|
||||
*/
|
||||
export function postLoginAPI(data: loginDataType) {
|
||||
return http.post<userInfoRepType>(api.login, data, {
|
||||
headers: {
|
||||
Authorization: 'Basic ' + btoa('oauth2-client:123456'),
|
||||
},
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* 用户保存
|
||||
* @param {userType} data 用户信息
|
||||
* @return 返回请求保存接口的结果
|
||||
*/
|
||||
export function postUserSaveAPI(data: userType) {
|
||||
return http.post<string>(api.userSave, data);
|
||||
}
|
||||
|
||||
/**
|
||||
* 用户修改密码
|
||||
* @param {userPasswordType} data 用户修改密码信息
|
||||
* @return 返回请求修改密码接口的结果
|
||||
*/
|
||||
export function postUserPasswordAPI(data: userPasswordType) {
|
||||
return http.post<string>(api.userPassword, data);
|
||||
}
|
||||
|
||||
/**
|
||||
* 用户分页列表
|
||||
* @param {getUserListType} data 分页信息
|
||||
* @return 返回请求分页列表接口的结果
|
||||
*/
|
||||
export function postUserPageAPI(data: Partial<getUserListType>) {
|
||||
return http.post<PageRowsResult<userType>>(api.userPage, data);
|
||||
}
|
||||
|
||||
/**
|
||||
* 用户字典列表
|
||||
* @param {dictionaryType} data 字典信息
|
||||
* @return 返回请求用户字典列表接口的结果
|
||||
*/
|
||||
export function getUserListAPI(data: dictionaryType) {
|
||||
return http.postParams<dictionaryListType[]>(api.userList, data);
|
||||
}
|
||||
|
||||
/**
|
||||
* 用户详情
|
||||
* @param {string|number} data 用户id
|
||||
* @return 返回请求用户详情接口的结果
|
||||
*/
|
||||
export function getUserGetAPI(data: { id: number | string }) {
|
||||
return http.postParams<userType>(api.userGet, data);
|
||||
}
|
||||
|
||||
/**
|
||||
* 用户删除
|
||||
* @param {number} data 用户id
|
||||
* @return 返回请求用户删除接口的结果
|
||||
*/
|
||||
export function getUserDeleteAPI(data: number[]) {
|
||||
return http.post<string>(api.userDelete, data);
|
||||
}
|
||||
|
||||
/**
|
||||
* 用户添加角色
|
||||
* @param {userRoleType} data 用户角色
|
||||
* @return 返回请求用户添加角色接口的结果
|
||||
*/
|
||||
export function postUserRoleAPI(data: userRoleType) {
|
||||
return http.post<string>(api.userRole, data);
|
||||
}
|
||||
|
||||
/**
|
||||
* 用户角色列表
|
||||
* @param {string|number} data 用户id
|
||||
* @return 返回请求用户角色列表接口的结果
|
||||
*/
|
||||
export function getUserRoleListAPI(data: { userId: number | string }) {
|
||||
return http.postParams<roleType[]>(api.userRoleList, data);
|
||||
}
|
|
@ -0,0 +1,57 @@
|
|||
import { dictionaryListType, dictionaryType, PageRowsResult } from '@/types';
|
||||
import { VehicleDetailType, vehiclePageType } from '@/types/manifest';
|
||||
import http from '@/utils/request';
|
||||
|
||||
// api接口
|
||||
const api = {
|
||||
vehicleDel: '/cargo/vehicle_type/detail/delete', // 删除
|
||||
vehicleGet: '/cargo/vehicle_type/detail/get', // 获取
|
||||
vehiclePage: '/cargo/vehicle_type/detail/page', // 分页列表
|
||||
vehicleList: '/cargo/vehicle_type/detail/list', // 车型列表
|
||||
vehicleSave: '/cargo/vehicle_type/detail/save', // 保存
|
||||
};
|
||||
|
||||
/**
|
||||
* 车型明细删除
|
||||
* @param {number} data id
|
||||
* @return 返回请求删除接口的结果
|
||||
*/
|
||||
export function postVehicleDetailDeleteAPI(data: number[]) {
|
||||
return http.post<string>(api.vehicleDel, data);
|
||||
}
|
||||
|
||||
/**
|
||||
* 车型明细获取
|
||||
* @param {number|string} data id
|
||||
* @return 返回请求获取接口的结果
|
||||
*/
|
||||
export function postVehicleDetailGetAPI(data: { id: number | string }) {
|
||||
return http.postParams<VehicleDetailType>(api.vehicleGet, data);
|
||||
}
|
||||
|
||||
/**
|
||||
* 车型明细分页列表
|
||||
* @param data
|
||||
* @returns
|
||||
*/
|
||||
export function postVehicleDetailPageAPI(data: Partial<vehiclePageType>) {
|
||||
return http.post<PageRowsResult<VehicleDetailType>>(api.vehiclePage, data);
|
||||
}
|
||||
|
||||
/**
|
||||
* 车型明细字典列表
|
||||
* @param {dictionaryType} data 字典参数
|
||||
* @return 返回请求字典列表接口的结果
|
||||
*/
|
||||
export function postVehicleDetailListAPI(data: dictionaryType) {
|
||||
return http.postParams<dictionaryListType[]>(api.vehicleList, data);
|
||||
}
|
||||
|
||||
/**
|
||||
* 车型明细保存
|
||||
* @param {VehicleType} data 保存参数
|
||||
* @return 返回请求保存接口的结果
|
||||
*/
|
||||
export function postVehicleDetailSaveAPI(data: Partial<VehicleDetailType>) {
|
||||
return http.post<string>(api.vehicleSave, data);
|
||||
}
|
|
@ -0,0 +1,57 @@
|
|||
import { dictionaryListType, dictionaryType, PageRowsResult } from '@/types';
|
||||
import { vehiclePageType, VehicleType } from '@/types/manifest';
|
||||
import http from '@/utils/request';
|
||||
|
||||
// api接口
|
||||
const api = {
|
||||
vehicleDel: '/cargo/vehicle_type/delete', // 删除
|
||||
vehicleGet: '/cargo/vehicle_type/get', // 获取
|
||||
vehiclePage: '/cargo/vehicle_type/page', // 分页列表
|
||||
vehicleList: '/cargo/vehicle_type/list', // 车型列表
|
||||
vehicleSave: '/cargo/vehicle_type/save', // 保存
|
||||
};
|
||||
|
||||
/**
|
||||
* 车型删除
|
||||
* @param {number} data id
|
||||
* @return 返回请求删除接口的结果
|
||||
*/
|
||||
export function postVehicleDeleteAPI(data: number[]) {
|
||||
return http.post<string>(api.vehicleDel, data);
|
||||
}
|
||||
|
||||
/**
|
||||
* 车型获取
|
||||
* @param {number|string} data id
|
||||
* @return 返回请求获取接口的结果
|
||||
*/
|
||||
export function postVehicleGetAPI(data: { id: number | string }) {
|
||||
return http.postParams<VehicleType>(api.vehicleGet, data);
|
||||
}
|
||||
|
||||
/**
|
||||
* 车型分页列表
|
||||
* @param data
|
||||
* @returns
|
||||
*/
|
||||
export function postVehiclePageAPI(data: Partial<vehiclePageType>) {
|
||||
return http.post<PageRowsResult<VehicleType>>(api.vehiclePage, data);
|
||||
}
|
||||
|
||||
/**
|
||||
* 车型字典列表
|
||||
* @param {dictionaryType} data 字典参数
|
||||
* @return 返回请求字典列表接口的结果
|
||||
*/
|
||||
export function postVehicleListAPI(data: dictionaryType) {
|
||||
return http.postParams<dictionaryListType[]>(api.vehicleList, data);
|
||||
}
|
||||
|
||||
/**
|
||||
* 车型保存
|
||||
* @param {VehicleType} data 保存参数
|
||||
* @return 返回请求保存接口的结果
|
||||
*/
|
||||
export function postVehicleSaveAPI(data: Partial<VehicleType>) {
|
||||
return http.post<string>(api.vehicleSave, data);
|
||||
}
|
|
@ -0,0 +1,57 @@
|
|||
import { dictionaryListType, dictionaryType, PageRowsResult } from '@/types';
|
||||
import { LoadWharfPageType, LoadWharfType } from '@/types/boatInfo';
|
||||
import http from '@/utils/request';
|
||||
|
||||
// api接口
|
||||
const api = {
|
||||
wharfDel: '/cargo/wharf/delete', // 删除
|
||||
wharfGet: '/cargo/wharf/get', // 获取
|
||||
wharfList: '/cargo/wharf/list', // 字典列表
|
||||
wharfPage: '/cargo/wharf/page', // 分页列表
|
||||
wharfSave: '/cargo/wharf/save', // 保存
|
||||
};
|
||||
|
||||
/**
|
||||
* 删除
|
||||
* @param {number} data id
|
||||
* @return 返回请求删除接口的结果
|
||||
*/
|
||||
export function postWharfDeleteAPI(data: number[]) {
|
||||
return http.post<string>(api.wharfDel, data);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取
|
||||
* @param {number|string} data id
|
||||
* @return 返回请求获取接口的结果
|
||||
*/
|
||||
export function postWharfGetAPI(data: { id: number | string }) {
|
||||
return http.postParams<LoadWharfType>(api.wharfGet, data);
|
||||
}
|
||||
|
||||
/**
|
||||
* 字典列表
|
||||
* @param {dictionaryType} data 字典参数
|
||||
* @return 返回请求字典列表接口的结果
|
||||
*/
|
||||
export function postWharfListAPI(data: dictionaryType) {
|
||||
return http.postParams<dictionaryListType[]>(api.wharfList, data);
|
||||
}
|
||||
|
||||
/**
|
||||
* 分页列表
|
||||
* @param {LoadWharfPageType} data 查询参数
|
||||
* @return 返回请求分页列表接口的结果
|
||||
*/
|
||||
export function postWharfPageAPI(data: Partial<LoadWharfPageType>) {
|
||||
return http.post<PageRowsResult<LoadWharfType>>(api.wharfPage, data);
|
||||
}
|
||||
|
||||
/**
|
||||
* 保存
|
||||
* @param {LoadWharfType} data 保存参数
|
||||
* @return 返回请求保存接口的结果
|
||||
*/
|
||||
export function postWharfSaveAPI(data: Partial<LoadWharfType>) {
|
||||
return http.post<string>(api.wharfSave, data);
|
||||
}
|
|
@ -0,0 +1,57 @@
|
|||
import { dictionaryListType, dictionaryType, PageRowsResult } from '@/types';
|
||||
import { WharfRoutePageType, WharfRouteType } from '@/types/boatInfo';
|
||||
import http from '@/utils/request';
|
||||
|
||||
// api接口
|
||||
const api = {
|
||||
wharfRouteDel: '/cargo/route/wharf/delete', // 删除
|
||||
wharfRouteGet: '/cargo/route/wharf/get', // 获取
|
||||
wharfRoutePage: '/cargo/route/wharf/page', // 分页列表
|
||||
wharfRouteList: '/cargo/route/wharf/list', // 字典列表
|
||||
wharfRouteSave: '/cargo/route/wharf/save', // 保存
|
||||
};
|
||||
|
||||
/**
|
||||
* 删除
|
||||
* @param {number} data id
|
||||
* @return 返回请求删除接口的结果
|
||||
*/
|
||||
export function postWharfRouteDeleteAPI(data: number[]) {
|
||||
return http.post<string>(api.wharfRouteDel, data);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取
|
||||
* @param {number|string} data id
|
||||
* @return 返回请求获取接口的结果
|
||||
*/
|
||||
export function wharfRouteGetAPI(data: { id: number | string }) {
|
||||
return http.postParams<WharfRouteType>(api.wharfRouteGet, data);
|
||||
}
|
||||
|
||||
/**
|
||||
* 分页列表
|
||||
* @param {WharfRoutePageType} data 查询条件
|
||||
* @return 返回请求分页列表接口的结果
|
||||
*/
|
||||
export function postWharfRoutePageAPI(data: Partial<WharfRoutePageType>) {
|
||||
return http.post<PageRowsResult<WharfRouteType>>(api.wharfRoutePage, data);
|
||||
}
|
||||
|
||||
/**
|
||||
* 字典列表
|
||||
* @param {dictionaryType} data 查询条件
|
||||
* @return 返回请求分页列表接口的结果
|
||||
*/
|
||||
export function wharfRouteListAPI(data: dictionaryType) {
|
||||
return http.postParams<dictionaryListType[]>(api.wharfRouteList, data);
|
||||
}
|
||||
|
||||
/**
|
||||
* 保存
|
||||
* @param {WharfRouteType} data 航线信息
|
||||
* @return 返回请求保存接口的结果
|
||||
*/
|
||||
export function postWharfRouteSaveAPI(data: Partial<WharfRouteType>) {
|
||||
return http.post<string>(api.wharfRouteSave, data);
|
||||
}
|
|
@ -1 +0,0 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 32 32"><path fill="currentColor" d="M13.502 5.414a15.075 15.075 0 0 0 11.594 18.194a11.113 11.113 0 0 1-7.975 3.39c-.138 0-.278.005-.418 0a11.094 11.094 0 0 1-3.2-21.584M14.98 3a1.002 1.002 0 0 0-.175.016a13.096 13.096 0 0 0 1.825 25.981c.164.006.328 0 .49 0a13.072 13.072 0 0 0 10.703-5.555a1.01 1.01 0 0 0-.783-1.565A13.08 13.08 0 0 1 15.89 4.38A1.015 1.015 0 0 0 14.98 3Z"/></svg>
|
Before Width: | Height: | Size: 459 B |
|
@ -1 +0,0 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 32 32"><path fill="currentColor" d="M16 12.005a4 4 0 1 1-4 4a4.005 4.005 0 0 1 4-4m0-2a6 6 0 1 0 6 6a6 6 0 0 0-6-6ZM5.394 6.813L6.81 5.399l3.505 3.506L8.9 10.319zM2 15.005h5v2H2zm3.394 10.193L8.9 21.692l1.414 1.414l-3.505 3.506zM15 25.005h2v5h-2zm6.687-1.9l1.414-1.414l3.506 3.506l-1.414 1.414zm3.313-8.1h5v2h-5zm-3.313-6.101l3.506-3.506l1.414 1.414l-3.506 3.506zM15 2.005h2v5h-2z"/></svg>
|
Before Width: | Height: | Size: 465 B |
|
@ -0,0 +1 @@
|
|||
<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M84.068 23.784c-1.02 0-1.877-.32-2.572-.96a8.588 8.588 0 0 1-1.738-2.237 11.524 11.524 0 0 1-1.042-2.621c-.232-.895-.348-1.641-.348-2.238V0h.278c.834 0 1.622.085 2.363.256.742.17 1.645.575 2.711 1.214 1.066.64 2.363 1.535 3.892 2.686 1.53 1.15 3.453 2.664 5.77 4.54 2.502 2.045 4.494 3.771 5.977 5.178 1.483 1.406 2.618 2.6 3.406 3.58.787.98 1.274 1.812 1.46 2.494.185.682.277 1.278.277 1.79v2.046H84.068zM127.3 84.01c.278.682.464 1.535.556 2.558.093 1.023-.37 2.003-1.39 2.94-.463.427-.88.832-1.25 1.215-.372.384-.696.704-.974.96a6.69 6.69 0 0 1-.973.767l-11.816-10.741a44.331 44.331 0 0 0 1.877-1.535 31.028 31.028 0 0 1 1.737-1.406c1.112-.938 2.317-1.343 3.615-1.215 1.297.128 2.363.405 3.197.83.927.427 1.923 1.173 2.989 2.239 1.065 1.065 1.876 2.195 2.432 3.388zM78.23 95.902c2.038 0 3.752-.511 5.143-1.534l-26.969 25.83H18.037c-1.761 0-3.684-.47-5.77-1.407a24.549 24.549 0 0 1-5.838-3.709 21.373 21.373 0 0 1-4.518-5.306c-1.204-2.003-1.807-4.07-1.807-6.202V16.495c0-1.79.44-3.665 1.32-5.626A18.41 18.41 0 0 1 5.04 5.562a21.798 21.798 0 0 1 5.213-3.964C12.198.533 14.237 0 16.37 0h53.24v15.984c0 1.62.278 3.367.834 5.242a16.704 16.704 0 0 0 2.572 5.179c1.159 1.577 2.665 2.898 4.518 3.964 1.853 1.066 4.078 1.598 6.673 1.598h20.295v42.325L85.458 92.45c1.02-1.364 1.529-2.856 1.529-4.476 0-2.216-.857-4.113-2.572-5.69-1.714-1.577-3.776-2.366-6.186-2.366H26.1c-2.409 0-4.448.789-6.116 2.366-1.668 1.577-2.502 3.474-2.502 5.69 0 2.217.834 4.092 2.502 5.626 1.668 1.535 3.707 2.302 6.117 2.302h52.13zM26.1 47.951c-2.41 0-4.449.789-6.117 2.366-1.668 1.577-2.502 3.473-2.502 5.69 0 2.216.834 4.092 2.502 5.626 1.668 1.534 3.707 2.302 6.117 2.302h52.13c2.409 0 4.47-.768 6.185-2.302 1.715-1.534 2.572-3.41 2.572-5.626 0-2.217-.857-4.113-2.572-5.69-1.714-1.577-3.776-2.366-6.186-2.366H26.1zm52.407 64.063l1.807-1.663 3.476-3.196a479.75 479.75 0 0 0 4.587-4.284 500.757 500.757 0 0 1 5.004-4.667c3.985-3.666 8.48-7.758 13.485-12.276l11.677 10.741-13.485 12.404-5.004 4.603-4.587 4.22a179.46 179.46 0 0 0-3.267 3.068c-.88.853-1.367 1.322-1.46 1.407-.463.341-.973.703-1.529 1.087-.556.383-1.112.703-1.668.959-.556.256-1.413.575-2.572.959a83.5 83.5 0 0 1-3.545 1.087 72.2 72.2 0 0 1-3.475.895c-1.112.256-1.946.426-2.502.511-1.112.17-1.854.043-2.224-.383-.371-.426-.464-1.151-.278-2.174.092-.511.278-1.279.556-2.302.278-1.023.602-2.067.973-3.132l1.042-3.005c.325-.938.58-1.577.765-1.918a10.157 10.157 0 0 1 2.224-2.941z"/></svg>
|
After Width: | Height: | Size: 2.4 KiB |
|
@ -0,0 +1 @@
|
|||
<svg t="1626927201034" class="icon" viewBox="0 0 1079 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="1754" width="128" height="128"><path d="M915.601 192.981H432.435c-27.528 0-50.048 22.58-50.048 50.168s22.528 50.176 50.048 50.176h483.166c27.537 0 50.048-22.58 50.048-50.176s-22.52-50.168-50.048-50.168zM276.975 203.99l-42.77-6.22c-3.404-0.717-6.348-2.927-7.56-5.778l-18.927-40.524c-7.244-15.787-28.475-15.787-35.737 0.034l-18.842 40.328c-1.817 3.397-4.557 5.615-7.45 5.914l-42.862 6.23c-16.52 2.747-23.04 23.398-11.256 35.694l30.823 31.104c2.483 2.594 3.66 6.076 3.046 9.242l-7.467 44.092c-2.645 17.237 14.533 30.284 29.099 21.998l38.118-20.65c3.09-1.784 6.23-1.784 9.2-0.068l38.331 20.77c14.473 8.234 31.65-4.813 29.022-21.965l-7.458-44.058c-0.316-3.447 0.793-7.023 3.089-9.42l30.703-30.985c11.836-12.348 5.325-32.99-11.102-35.738zM915.6 469.555H432.435c-27.528 0-50.048 22.58-50.048 50.16 0 27.587 22.528 50.175 50.048 50.175h483.166c27.537 0 50.048-22.58 50.048-50.176 0-27.58-22.52-50.159-50.048-50.159z m-638.626 7.996l-42.77-6.22c-3.404-0.726-6.348-2.936-7.56-5.778l-18.927-40.525c-7.244-15.795-28.475-15.795-35.737 0.034l-18.842 40.329c-1.817 3.396-4.557 5.615-7.45 5.914l-42.862 6.229c-16.52 2.748-23.04 23.398-11.256 35.678l30.823 31.104c2.483 2.585 3.66 6.075 3.046 9.233l-7.467 44.1c-2.645 17.237 14.533 30.285 29.099 21.999l38.118-20.65c3.09-1.784 6.23-1.784 9.2-0.069l38.331 20.77c14.473 8.235 31.65-4.813 29.022-21.965l-7.458-44.066c-0.316-3.439 0.793-7.014 3.089-9.412l30.703-30.976c11.836-12.348 5.325-32.998-11.102-35.73zM915.6 760.149H432.435c-27.528 0-50.048 22.58-50.048 50.168s22.528 50.176 50.048 50.176h483.166c27.537 0 50.048-22.58 50.048-50.176s-22.52-50.168-50.048-50.168z m-638.626 1.954l-42.77-6.22c-3.404-0.717-6.348-2.927-7.56-5.777l-18.927-40.525c-7.244-15.787-28.475-15.787-35.737 0.042l-18.842 40.329c-1.817 3.396-4.557 5.606-7.45 5.905l-42.862 6.23c-16.52 2.756-23.04 23.398-11.256 35.694l30.823 31.104c2.483 2.594 3.66 6.085 3.046 9.242l-7.467 44.092c-2.645 17.237 14.533 30.284 29.099 21.999l38.118-20.643c3.09-1.792 6.23-1.792 9.2-0.076l38.331 20.77c14.473 8.234 31.65-4.813 29.022-21.965l-7.458-44.058c-0.316-3.447 0.793-7.023 3.089-9.42l30.703-30.985c11.836-12.356 5.325-32.998-11.102-35.738z" p-id="1755"></path></svg>
|
After Width: | Height: | Size: 2.2 KiB |
|
@ -0,0 +1 @@
|
|||
<svg t="1626927228541" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="1896" width="128" height="128"><path d="M895.146667 189.44H793.6v-19.626667c0-11.093333-9.386667-21.333333-22.186667-21.333333H652.8c-6.826667-25.6-20.48-47.786667-38.4-64.853333C587.946667 58.88 552.106667 42.666667 512 42.666667s-75.946667 15.36-102.4 40.96c-18.773333 17.92-32.426667 40.106667-38.4 64.853333H252.586667c-12.8 0-22.186667 9.386667-22.186667 21.333333v19.626667H128.853333c-20.48 0-36.693333 16.213333-36.693333 34.986667v721.066666c0 19.626667 16.213333 34.986667 36.693333 34.986667h766.293334c20.48 0 36.693333-15.36 36.693333-34.986667V224.426667c0-18.773333-16.213333-34.986667-36.693333-34.986667z m-454.826667-75.946667c17.92-17.92 43.52-28.16 70.826667-28.16 28.16 0 52.906667 10.24 71.68 28.16 10.24 9.386667 18.773333 22.186667 23.893333 34.986667H417.28c5.12-12.8 12.8-24.746667 23.04-34.986667z m-165.546667 77.653334h474.453334v66.56H274.773333v-66.56z m583.68 719.36H166.4V260.266667H230.4v18.773333c0 11.946667 9.386667 21.333333 22.186667 21.333333h518.826666c12.8 0 22.186667-9.386667 22.186667-21.333333v-18.773333h64.853333v650.24z m-563.2-349.866667c-20.48 0-36.693333 15.36-36.693333 35.84 0 19.626667 16.213333 34.986667 36.693333 34.986667s36.693333-15.36 36.693334-34.986667c0.853333-19.626667-16.213333-35.84-36.693334-35.84z m0 149.333333c-20.48 0-36.693333 15.36-36.693333 34.986667s16.213333 34.986667 36.693333 34.986667 36.693333-15.36 36.693334-34.986667c0.853333-19.626667-16.213333-34.986667-36.693334-34.986667z m431.786667-284.16H406.186667c-12.8 0-22.186667 9.386667-22.186667 21.333334s9.386667 21.333333 22.186667 21.333333h320.853333c11.946667 0 22.186667-9.386667 22.186667-21.333333-0.853333-11.093333-10.24-21.333333-22.186667-21.333334z m-431.786667-13.653333c-20.48 0-36.693333 16.213333-36.693333 34.986667 0 19.626667 16.213333 35.84 36.693333 35.84s36.693333-16.213333 36.693334-35.84c0.853333-18.773333-16.213333-34.986667-36.693334-34.986667z m431.786667 311.466667H406.186667c-12.8 0-22.186667 9.386667-22.186667 21.333333s9.386667 21.333333 22.186667 21.333333h320.853333c11.946667 0 22.186667-9.386667 22.186667-21.333333-0.853333-11.093333-10.24-21.333333-22.186667-21.333333z m0-148.48H406.186667c-12.8 0-22.186667 9.386667-22.186667 21.333333 0 11.093333 9.386667 20.48 22.186667 20.48h320.853333c11.946667 0 22.186667-9.386667 22.186667-20.48-0.853333-11.946667-10.24-21.333333-22.186667-21.333333z" p-id="1897"></path></svg>
|
After Width: | Height: | Size: 2.5 KiB |
|
@ -0,0 +1 @@
|
|||
<svg t="1628162061044" class="icon" viewBox="0 0 1194 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="5669" width="128" height="128"><path d="M475.192889 24.860444l-12.401778-19.911111H336.156444c-24.064 0-43.690667 7.395556-62.577777 21.788445-3.413333 2.616889-6.826667 5.461333-10.410667 8.704l-20.821333 19.342222-200.590223 199.111111c-37.205333 36.977778-47.388444 104.106667-3.072 159.061333l7.395556 7.168 36.067556 27.989334c27.136 21.504 54.272 43.576889 79.587555 65.024l12.174222 10.467555 24.576 21.731556 12.117334 11.036444 8.760889 8.305778v336.554667c0 64.853333 76.003556 115.939556 142.165333 115.939555H830.577778l8.305778-0.227555c64.056889-3.982222 133.802667-53.589333 133.802666-115.712v-335.075556l72.078222-62.065778 100.522667-85.333333 4.721778-4.664889c49.948444-57.628444 45.681778-127.772444-2.161778-175.217778L959.886222 55.523556c-39.708444-39.253333-62.577778-50.232889-101.603555-50.517334h-128.284445l-12.572444 19.057778c-3.413333 5.12-12.515556 15.075556-27.192889 25.6-25.315556 18.090667-56.775111 28.899556-95.402667 28.899556-38.570667 0-69.347556-10.808889-93.866666-28.672a106.723556 106.723556 0 0 1-25.770667-25.031112z m297.699555 65.024h85.105778l6.485334 0.227556c8.817778 0.853333 13.937778 4.380444 30.151111 20.195556l193.706666 189.098666 3.811556 4.152889c11.548444 14.051556 12.174222 30.378667-1.706667 49.208889l-2.901333 3.640889-54.215111 45.966222-87.552 74.922667-57.912889 50.062222v373.873778c0 9.216-32.540444 31.118222-57.287111 31.118222H361.472c-24.746667 0-57.230222-21.902222-57.230222-31.118222v-372.053334l-12.515556-12.458666a988.16 988.16 0 0 0-36.238222-34.247111l-13.937778-12.401778a2901.105778 2901.105778 0 0 0-106.894222-88.576l-32.369778-25.201778 2.446222 3.413333c-14.620444-18.147556-11.719111-37.148444-3.185777-45.624888l199.68-198.087112 13.880889-13.084444 7.224888-6.485333a77.937778 77.937778 0 0 1 2.844445-2.275556l3.015111-2.161778a12.856889 12.856889 0 0 1 7.964444-2.104889l82.545778-0.056888 6.257778 6.542222c7.224889 7.224889 15.928889 14.791111 25.998222 22.186666 38.570667 28.046222 86.641778 44.942222 143.872 44.942223 57.002667 0 105.415111-16.839111 144.611556-44.714667 13.710222-9.784889 24.803556-19.740444 33.507555-28.899556h-0.056889z" fill="#4A4A4A" p-id="5670"></path></svg>
|
After Width: | Height: | Size: 2.2 KiB |
|
@ -0,0 +1 @@
|
|||
<svg t="1688439890077" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="1696" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><path d="M682.65984 42.65984l170.65984 0q53.00224 0 90.50112 37.49888t37.49888 90.50112l0 682.65984q0 53.00224-37.49888 90.50112t-90.50112 37.49888l-170.65984 0q-53.00224 0-90.50112-37.49888t-37.49888-90.50112l0-682.65984q0-53.00224 37.49888-90.50112t90.50112-37.49888zM170.65984 554.65984l170.65984 0q53.00224 0 90.50112 37.49888t37.49888 90.50112l0 170.65984q0 53.00224-37.49888 90.50112t-90.50112 37.49888l-170.65984 0q-53.00224 0-90.50112-37.49888t-37.49888-90.50112l0-170.65984q0-53.00224 37.49888-90.50112t90.50112-37.49888zM341.34016 640l-170.65984 0q-17.67424 0-30.16704 12.4928t-12.4928 30.16704l0 170.65984q0 17.67424 12.4928 30.16704t30.16704 12.4928l170.65984 0q17.67424 0 30.16704-12.4928t12.4928-30.16704l0-170.65984q0-17.67424-12.4928-30.16704t-30.16704-12.4928zM170.65984 42.65984l170.65984 0q53.00224 0 90.50112 37.49888t37.49888 90.50112l0 170.65984q0 53.00224-37.49888 90.50112t-90.50112 37.49888l-170.65984 0q-53.00224 0-90.50112-37.49888t-37.49888-90.50112l0-170.65984q0-53.00224 37.49888-90.50112t90.50112-37.49888zM341.34016 128l-170.65984 0q-17.67424 0-30.16704 12.4928t-12.4928 30.16704l0 170.65984q0 17.67424 12.4928 30.16704t30.16704 12.4928l170.65984 0q17.67424 0 30.16704-12.4928t12.4928-30.16704l0-170.65984q0-17.67424-12.4928-30.16704t-30.16704-12.4928zM853.34016 128l-170.65984 0q-17.67424 0-30.16704 12.4928t-12.4928 30.16704l0 682.65984q0 17.67424 12.4928 30.16704t30.16704 12.4928l170.65984 0q17.67424 0 30.16704-12.4928t12.4928-30.16704l0-682.65984q0-17.67424-12.4928-30.16704t-30.16704-12.4928z" p-id="1697"></path></svg>
|
After Width: | Height: | Size: 1.7 KiB |
|
@ -0,0 +1 @@
|
|||
<svg width="128" height="100" xmlns="http://www.w3.org/2000/svg"><path d="M27.429 63.638c0-2.508-.893-4.65-2.679-6.424-1.786-1.775-3.94-2.662-6.464-2.662-2.524 0-4.679.887-6.465 2.662-1.785 1.774-2.678 3.916-2.678 6.424 0 2.508.893 4.65 2.678 6.424 1.786 1.775 3.94 2.662 6.465 2.662 2.524 0 4.678-.887 6.464-2.662 1.786-1.775 2.679-3.916 2.679-6.424zm13.714-31.801c0-2.508-.893-4.65-2.679-6.424-1.785-1.775-3.94-2.662-6.464-2.662-2.524 0-4.679.887-6.464 2.662-1.786 1.774-2.679 3.916-2.679 6.424 0 2.508.893 4.65 2.679 6.424 1.785 1.774 3.94 2.662 6.464 2.662 2.524 0 4.679-.888 6.464-2.662 1.786-1.775 2.679-3.916 2.679-6.424zM71.714 65.98l7.215-27.116c.285-1.23.107-2.378-.536-3.443-.643-1.064-1.56-1.762-2.75-2.094-1.19-.33-2.333-.177-3.429.462-1.095.639-1.81 1.573-2.143 2.804l-7.214 27.116c-2.857.237-5.405 1.266-7.643 3.088-2.238 1.822-3.738 4.152-4.5 6.992-.952 3.644-.476 7.098 1.429 10.364 1.905 3.265 4.69 5.37 8.357 6.317 3.667.947 7.143.474 10.429-1.42 3.285-1.892 5.404-4.66 6.357-8.305.762-2.84.619-5.607-.429-8.305-1.047-2.697-2.762-4.85-5.143-6.46zm47.143-2.342c0-2.508-.893-4.65-2.678-6.424-1.786-1.775-3.94-2.662-6.465-2.662-2.524 0-4.678.887-6.464 2.662-1.786 1.774-2.679 3.916-2.679 6.424 0 2.508.893 4.65 2.679 6.424 1.786 1.775 3.94 2.662 6.464 2.662 2.524 0 4.679-.887 6.465-2.662 1.785-1.775 2.678-3.916 2.678-6.424zm-45.714-45.43c0-2.509-.893-4.65-2.679-6.425C68.68 10.01 66.524 9.122 64 9.122c-2.524 0-4.679.887-6.464 2.661-1.786 1.775-2.679 3.916-2.679 6.425 0 2.508.893 4.65 2.679 6.424 1.785 1.774 3.94 2.662 6.464 2.662 2.524 0 4.679-.888 6.464-2.662 1.786-1.775 2.679-3.916 2.679-6.424zm32 13.629c0-2.508-.893-4.65-2.679-6.424-1.785-1.775-3.94-2.662-6.464-2.662-2.524 0-4.679.887-6.464 2.662-1.786 1.774-2.679 3.916-2.679 6.424 0 2.508.893 4.65 2.679 6.424 1.785 1.774 3.94 2.662 6.464 2.662 2.524 0 4.679-.888 6.464-2.662 1.786-1.775 2.679-3.916 2.679-6.424zM128 63.638c0 12.351-3.357 23.78-10.071 34.286-.905 1.372-2.19 2.058-3.858 2.058H13.93c-1.667 0-2.953-.686-3.858-2.058C3.357 87.465 0 76.037 0 63.638c0-8.613 1.69-16.847 5.071-24.703C8.452 31.08 13 24.312 18.714 18.634c5.715-5.68 12.524-10.199 20.429-13.559C47.048 1.715 55.333.035 64 .035c8.667 0 16.952 1.68 24.857 5.04 7.905 3.36 14.714 7.88 20.429 13.559 5.714 5.678 10.262 12.446 13.643 20.301 3.38 7.856 5.071 16.09 5.071 24.703z"/></svg>
|
After Width: | Height: | Size: 2.3 KiB |
|
@ -0,0 +1 @@
|
|||
<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M96.258 57.462h31.421C124.794 27.323 100.426 2.956 70.287.07v31.422a32.856 32.856 0 0 1 25.971 25.97zm-38.796-25.97V.07C27.323 2.956 2.956 27.323.07 57.462h31.422a32.856 32.856 0 0 1 25.97-25.97zm12.825 64.766v31.421c30.46-2.885 54.507-27.253 57.713-57.712H96.579c-2.886 13.466-13.146 23.726-26.292 26.291zM31.492 70.287H.07c2.886 30.46 27.253 54.507 57.713 57.713V96.579c-13.466-2.886-23.726-13.146-26.291-26.292z"/></svg>
|
After Width: | Height: | Size: 497 B |
|
@ -0,0 +1 @@
|
|||
<svg t="1628162413572" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="1118" width="128" height="128"><path d="M730.4 694.4h174.4c6.4 0 13.6-2.4 18.4-7.2 9.6-9.6 9.6-25.6 0-35.2-4.8-4.8-11.2-7.2-18.4-7.2H668c-2.4 0-4 0.8-5.6 0.8-0.8 0-1.6 0-2.4 0.8-0.8 0-1.6 0.8-2.4 1.6-0.8 0.8-1.6 0.8-1.6 0.8-1.6 0.8-2.4 2.4-4 3.2-1.6 0.8-2.4 2.4-3.2 4-0.8 0.8-0.8 1.6-0.8 1.6-0.8 0.8-0.8 1.6-1.6 2.4 0 0.8-0.8 1.6-0.8 2.4-0.8 1.6-0.8 4-1.6 6.4v234.4c0 6.4 2.4 12.8 7.2 17.6 9.6 9.6 25.6 9.6 35.2 0 4.8-4.8 7.2-11.2 7.2-18.4v-171.2l220.8 220.8c9.6 9.6 25.6 9.6 35.2 0 9.6-9.6 9.6-25.6 0-35.2l-219.2-222.4zM644.8 353.6v1.6c0 2.4 0.8 4 0.8 5.6 0 0.8 0 1.6 0.8 2.4 0 0.8 0.8 1.6 1.6 2.4 0.8 0.8 0.8 1.6 0.8 1.6 0.8 1.6 2.4 2.4 3.2 4 1.6 0.8 2.4 2.4 4 3.2 0.8 0.8 1.6 0.8 1.6 0.8 0.8 0.8 1.6 0.8 2.4 1.6 0.8 0 1.6 0 2.4 0.8 1.6 0.8 4 0.8 6.4 1.6h234.4c6.4 0 12.8-2.4 17.6-7.2 9.6-9.6 9.6-25.6 0-35.2-4.8-4.8-11.2-7.2-18.4-7.2H731.2L952 106.4c9.6-9.6 9.6-25.6 0-35.2s-25.6-9.6-35.2 0L695.2 292V117.6c0-6.4-2.4-13.6-7.2-18.4-9.6-9.6-25.6-9.6-35.2 0-4.8 4.8-7.2 12-7.2 18.4l-0.8 236c0-0.8 0 0 0 0z m-266.4 316v-1.6c0-2.4-0.8-4-0.8-6.4 0-0.8 0-1.6-0.8-2.4 0-0.8-0.8-1.6-0.8-2.4 0-0.8-0.8-1.6-0.8-1.6-0.8-1.6-2.4-2.4-3.2-4-0.8-0.8-2.4-2.4-4-3.2-0.8-0.8-1.6-0.8-1.6-0.8-0.8-0.8-1.6-0.8-2.4-1.6-0.8 0-1.6-0.8-2.4-0.8-1.6-0.8-4-0.8-5.6-0.8h-237.6c-6.4 0-12.8 2.4-18.4 7.2-9.6 9.6-9.6 25.6 0 35.2 4.8 4.8 12 7.2 18.4 7.2h174.4L72 916c-9.6 9.6-9.6 25.6 0 35.2 9.6 9.6 25.6 9.6 35.2 0l220.8-220.8v171.2c0 6.4 2.4 12.8 7.2 18.4 9.6 9.6 25.6 9.6 35.2 0 4.8-4.8 7.2-11.2 7.2-17.6l0.8-232.8z m-85.6-341.6h-171.2c-6.4 0-12.8 2.4-18.4 7.2-9.6 9.6-9.6 25.6 0 35.2 4.8 4.8 11.2 7.2 17.6 7.2h234.4c2.4 0 4-0.8 6.4-1.6 0.8 0 1.6 0 2.4-0.8 0.8 0 1.6-0.8 2.4-1.6 0.8-0.8 1.6-0.8 1.6-0.8 1.6-0.8 2.4-2.4 4-3.2 0.8-1.6 2.4-2.4 3.2-4 0-0.8 0.8-1.6 0.8-1.6 0-0.8 0.8-1.6 1.6-2.4 0-0.8 0-1.6 0.8-2.4 0.8-1.6 0.8-4 0.8-5.6V117.6c0-6.4-2.4-12.8-7.2-18.4-9.6-9.6-25.6-9.6-35.2 0-4.8 4.8-7.2 12-7.2 18.4V292l-221.6-220.8c-9.6-9.6-25.6-9.6-35.2 0s-9.6 25.6 0 35.2l220 221.6z" fill="" p-id="1119"></path></svg>
|
After Width: | Height: | Size: 2.1 KiB |
|
@ -0,0 +1 @@
|
|||
<svg class="icon" viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg" width="128" height="128"><defs><style/></defs><path d="M512 128q69.675 0 135.51 21.163t115.498 54.997 93.483 74.837 73.685 82.006 51.67 74.837 32.17 54.827L1024 512q-2.347 4.992-6.315 13.483T998.87 560.17t-31.658 51.669-44.331 59.99-56.832 64.34-69.504 60.16-82.347 51.5-94.848 34.687T512 896q-69.675 0-135.51-21.163t-115.498-54.826-93.483-74.326-73.685-81.493-51.67-74.496-32.17-54.997L0 513.707q2.347-4.992 6.315-13.483t18.816-34.816 31.658-51.84 44.331-60.33 56.832-64.683 69.504-60.331 82.347-51.84 94.848-34.816T512 128.085zm0 85.333q-46.677 0-91.648 12.331t-81.152 31.83-70.656 47.146-59.648 54.485-48.853 57.686-37.675 52.821-26.325 43.99q12.33 21.674 26.325 43.52t37.675 52.351 48.853 57.003 59.648 53.845T339.2 767.02t81.152 31.488T512 810.667t91.648-12.331 81.152-31.659 70.656-46.848 59.648-54.186 48.853-57.344 37.675-52.651T927.957 512q-12.33-21.675-26.325-43.648t-37.675-52.65-48.853-57.345-59.648-54.186-70.656-46.848-81.152-31.659T512 213.334zm0 128q70.656 0 120.661 50.006T682.667 512 632.66 632.661 512 682.667 391.339 632.66 341.333 512t50.006-120.661T512 341.333zm0 85.334q-35.328 0-60.33 25.002T426.666 512t25.002 60.33T512 597.334t60.33-25.002T597.334 512t-25.002-60.33T512 426.666z"/></svg>
|
After Width: | Height: | Size: 1.3 KiB |
|
@ -0,0 +1 @@
|
|||
<svg width="128" height="64" xmlns="http://www.w3.org/2000/svg"><path d="M127.072 7.994c1.37-2.208.914-5.152-.914-6.87-2.056-1.717-4.797-1.226-6.396.982-.229.245-25.586 32.382-55.74 32.382-29.24 0-55.74-32.382-55.968-32.627-1.6-1.963-4.57-2.208-6.397-.49C-.17 3.086-.399 6.275 1.2 8.238c.457.736 5.94 7.36 14.62 14.72L4.17 35.96c-1.828 1.963-1.6 5.152.228 6.87.457.98 1.6 1.471 2.742 1.471s2.284-.49 3.198-1.472l12.564-13.983c5.94 4.416 13.021 8.587 20.788 11.53l-4.797 17.418c-.685 2.699.686 5.397 3.198 6.133h1.37c2.057 0 3.884-1.472 4.341-3.68L52.6 42.83c3.655.736 7.538 1.227 11.422 1.227 3.883 0 7.767-.49 11.422-1.227l4.797 17.173c.457 2.208 2.513 3.68 4.34 3.68.457 0 .914 0 1.143-.246 2.513-.736 3.883-3.434 3.198-6.133l-4.797-17.172c7.767-2.944 14.848-7.114 20.788-11.53l12.336 13.738c.913.981 2.056 1.472 3.198 1.472s2.284-.49 3.198-1.472c1.828-1.963 1.828-4.906.228-6.87l-11.65-13.001c9.366-7.36 14.849-14.474 14.849-14.474z"/></svg>
|
After Width: | Height: | Size: 944 B |
|
@ -0,0 +1 @@
|
|||
<svg t="1628162431490" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="1260" width="128" height="128"><path d="M67.44746667 108.40746667V375.46666667c0 18.56853333 15.29173333 34.4064 34.4064 34.4064s34.4064-15.29173333 34.4064-34.4064V182.6816L353.0752 400.04266667c12.56106667 12.56106667 33.31413333 12.56106667 46.42133333 0 12.56106667-12.56106667 12.56106667-33.31413333 0-46.42133334L181.58933333 136.8064h192.78506667c18.56853333 0 34.4064-15.29173333 34.4064-34.4064s-15.29173333-34.4064-34.4064-34.4064H107.3152c-25.12213333 0.54613333-39.86773333 13.1072-39.86773333 40.41386667z m849.23733333-39.86773334H649.6256c-18.56853333 0-34.4064 15.29173333-34.4064 34.4064s15.29173333 34.4064 34.4064 34.4064H842.41066667L625.0496 353.62133333c-12.56106667 12.56106667-12.56106667 33.31413333 0 46.42133334 12.56106667 12.56106667 33.31413333 12.56106667 46.42133333 0l216.81493334-217.36106667V375.46666667c0 18.56853333 15.29173333 34.4064 34.4064 34.4064 18.56853333 0 34.4064-15.29173333 34.4064-34.4064V108.40746667c-0.54613333-27.30666667-15.29173333-39.86773333-40.41386667-39.86773334z m-809.3696 887.46666667h267.0592c18.56853333 0 34.4064-15.29173333 34.4064-34.4064s-15.29173333-34.4064-34.4064-34.4064H181.58933333L398.9504 670.37866667c12.56106667-12.56106667 12.56106667-33.31413333 0-46.42133334-12.56106667-12.56106667-33.31413333-12.56106667-46.42133333 0L135.71413333 841.3184V648.53333333c0-18.56853333-15.29173333-34.4064-34.4064-34.4064S66.90133333 629.41866667 66.90133333 648.53333333v267.0592c0.54613333 27.30666667 15.29173333 40.41386667 40.41386667 40.41386667z m849.23733333-40.41386667V648.53333333c0-18.56853333-15.29173333-34.4064-34.4064-34.4064S887.73973333 629.41866667 887.73973333 648.53333333v192.78506667L670.9248 623.95733333c-12.56106667-12.56106667-33.31413333-12.56106667-46.42133333 0-12.56106667 12.56106667-12.56106667 33.31413333 0 46.42133334l217.36106666 216.81493333H649.07946667c-18.56853333 0-34.4064 15.29173333-34.4064 34.4064s15.29173333 34.4064 34.4064 34.4064H916.13866667c25.66826667 0 40.41386667-13.1072 40.41386666-40.41386667z" p-id="1261"></path></svg>
|
After Width: | Height: | Size: 2.1 KiB |
|
@ -0,0 +1 @@
|
|||
<svg t="1628420440275" class="icon" viewBox="0 0 1025 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="1031" width="128" height="128"><path d="M404.96 137.6V81.44h106.08V137.6h53.28V32H351.68v105.6zM511.04 512v431.04H404.96V512H351.68v480h212.64V512z" p-id="1032"></path><path d="M834.08 134.24H33.44v379.2h801.12l158.88-187.2-159.36-192z m-43.2 324.96H92.96V192.8h697.92l118.56 132.48L790.88 459.2z" p-id="1033"></path><path d="M193.28 298.4h532.8v53.28h-532.8z" p-id="1034"></path></svg>
|
After Width: | Height: | Size: 501 B |
|
@ -0,0 +1 @@
|
|||
<svg t="1631523205707" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="1504" width="128" height="128"><path d="M393.67111111 432.35555555h546.13333334a9.10222222 9.10222222 0 0 0 9.10222222-9.10222222v-63.71555555a9.10222222 9.10222222 0 0 0-9.10222222-9.10222223H393.67111111a9.10222222 9.10222222 0 0 0-9.10222222 9.10222223v63.71555555a9.10222222 9.10222222 0 0 0 9.10222222 9.10222222z m-9.10222222 232.10666667a9.10222222 9.10222222 0 0 0 9.10222222 9.10222223h546.13333334a9.10222222 9.10222222 0 0 0 9.10222222-9.10222223v-63.71555555a9.10222222 9.10222222 0 0 0-9.10222222-9.10222222H393.67111111a9.10222222 9.10222222 0 0 0-9.10222222 9.10222222v63.71555555z m573.44-552.96H65.99111111a9.10222222 9.10222222 0 0 0-9.10222222 9.10222223v63.71555555a9.10222222 9.10222222 0 0 0 9.10222222 9.10222222h892.01777778a9.10222222 9.10222222 0 0 0 9.10222222-9.10222222v-63.71555555a9.10222222 9.10222222 0 0 0-9.10222222-9.10222223z m0 719.07555556H65.99111111a9.10222222 9.10222222 0 0 0-9.10222222 9.10222222v63.71555555a9.10222222 9.10222222 0 0 0 9.10222222 9.10222223h892.01777778a9.10222222 9.10222222 0 0 0 9.10222222-9.10222223v-63.71555555a9.10222222 9.10222222 0 0 0-9.10222222-9.10222222zM91.47733333 660.02488889L269.312 519.96444445a10.01244445 10.01244445 0 0 0 0-15.81511112L91.47733333 363.97511111a10.12622222 10.12622222 0 0 0-16.384 7.85066667v280.23466667a10.12622222 10.12622222 0 0 0 16.384 7.96444444z" p-id="1505"></path></svg>
|
After Width: | Height: | Size: 1.5 KiB |
|
@ -0,0 +1 @@
|
|||
<svg t="1631523178203" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="1362" width="128" height="128"><path d="M630.32888889 591.64444445l-546.13333334 0a9.10222222 9.10222222 0 0 0-9.10222222 9.10222222l0 63.71555555a9.10222222 9.10222222 0 0 0 9.10222222 9.10222223L630.32888889 673.56444444a9.10222222 9.10222222 0 0 0 9.10222222-9.10222222l0-63.71555555a9.10222222 9.10222222 0 0 0-9.10222222-9.10222222z m9.10222222-232.10666667a9.10222222 9.10222222 0 0 0-9.10222222-9.10222222l-546.13333334-1e-8a9.10222222 9.10222222 0 0 0-9.10222222 9.10222223l0 63.71555555a9.10222222 9.10222222 0 0 0 9.10222222 9.10222222L630.32888889 432.35555555a9.10222222 9.10222222 0 0 0 9.10222222-9.10222222l0-63.71555555z m-573.44 552.96L958.00888889 912.49777778a9.10222222 9.10222222 0 0 0 9.10222221-9.10222223l1e-8-63.71555555a9.10222222 9.10222222 0 0 0-9.10222222-9.10222222l-892.01777778 0a9.10222222 9.10222222 0 0 0-9.10222222 9.10222222l1e-8 63.71555555a9.10222222 9.10222222 0 0 0 9.10222221 9.10222223z m0-719.07555556L958.00888889 193.42222222a9.10222222 9.10222222 0 0 0 9.10222222-9.10222222l-1e-8-63.71555555a9.10222222 9.10222222 0 0 0-9.10222221-9.10222223l-892.01777778 0a9.10222222 9.10222222 0 0 0-9.10222221 9.10222223l-1e-8 63.71555555a9.10222222 9.10222222 0 0 0 9.10222222 9.10222222zM932.52266667 363.97511111L754.688 504.03555555a10.01244445 10.01244445 0 0 0 0 15.81511112L932.52266667 660.02488889a10.12622222 10.12622222 0 0 0 16.384-7.85066667l0-280.23466667a10.12622222 10.12622222 0 0 0-16.384-7.96444444z" p-id="1363"></path></svg>
|
After Width: | Height: | Size: 1.6 KiB |
|
@ -0,0 +1 @@
|
|||
<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M83.287 103.01c-1.57-3.84-6.778-10.414-15.447-19.548-2.327-2.444-2.182-4.306-1.338-9.862v-.64c.553-3.81 1.513-6.05 14.313-8.087 6.516-1.018 8.203 1.57 10.589 5.178l.785 1.193a12.625 12.625 0 0 0 6.43 5.207c1.134.524 2.53 1.164 4.421 2.24 4.596 2.53 4.596 5.41 4.596 11.753v.727a26.91 26.91 0 0 1-5.178 17.454 59.055 59.055 0 0 1-19.025 11.026c3.49-6.546.814-14.313 0-16.553l-.146-.087zM64 5.12a58.502 58.502 0 0 1 25.484 5.818 54.313 54.313 0 0 0-12.859 10.327c-.93 1.28-1.716 2.473-2.472 3.579-2.444 3.694-3.637 5.352-5.818 5.614a25.105 25.105 0 0 1-4.219 0c-4.276-.29-10.094-.64-11.956 4.422-1.193 3.23-1.396 11.956 2.444 16.495.66 1.077.778 2.4.32 3.578a7.01 7.01 0 0 1-2.066 3.229 18.938 18.938 0 0 1-2.909-2.91 18.91 18.91 0 0 0-8.32-6.603c-1.25-.349-2.647-.64-3.985-.93-3.782-.786-8.03-1.688-9.019-3.812a14.895 14.895 0 0 1-.727-5.818 21.935 21.935 0 0 0-1.396-9.25 8.873 8.873 0 0 0-5.557-4.946A58.705 58.705 0 0 1 64 5.12zM0 64c0 35.346 28.654 64 64 64 35.346 0 64-28.654 64-64 0-35.346-28.654-64-64-64C28.654 0 0 28.654 0 64z"/></svg>
|
After Width: | Height: | Size: 1.1 KiB |
|
@ -0,0 +1 @@
|
|||
<svg t="1628507890221" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="1123" width="128" height="128"><path d="M768.00000031 292.80000031H235.20000031c-9.6 0-16.00000031-6.40000031-16.00000031-16.00000031s6.40000031-16.00000031 16.00000031-16.00000031H768.00000031c9.6 0 16.00000031 6.40000031 15.99999938 16.00000031s-6.40000031 16.00000031-15.99999938 16.00000031zM768.00000031 484.80000031H235.20000031c-9.6 0-16.00000031-6.40000031-16.00000031-16.00000031s6.40000031-16.00000031 16.00000031-16.00000031H768.00000031c9.6 0 16.00000031 6.40000031 15.99999938 16.00000031s-6.40000031 16.00000031-15.99999938 16.00000031zM447.99999969 676.80000031H235.20000031c-9.6 0-16.00000031-6.40000031-16.00000031-16.00000031s6.40000031-16.00000031 16.00000031-16.00000031H447.99999969c9.6 0 16.00000031 6.40000031 16.00000031 16.00000031s-6.40000031 16.00000031-16.00000031 16.00000031z" p-id="1124"></path><path d="M875.19999969 975.99999969H148.80000031C92.79999969 975.99999969 48.00000031 931.20000031 48.00000031 875.19999969V148.80000031C48.00000031 92.79999969 92.79999969 48.00000031 148.80000031 48.00000031h724.8C931.20000031 48.00000031 975.99999969 92.79999969 975.99999969 148.80000031v724.8c0 57.6-44.80000031 102.40000031-100.8 102.39999938zM148.80000031 80C110.40000031 80 80 110.40000031 80 148.80000031v724.8C80 913.59999969 110.40000031 944 148.80000031 944h724.8c38.4 0 68.80000031-30.40000031 68.79999938-68.80000031V148.80000031C944 110.40000031 913.59999969 80 875.19999969 80H148.80000031z" fill="#333333" p-id="1125"></path></svg>
|
After Width: | Height: | Size: 1.6 KiB |
|
@ -0,0 +1 @@
|
|||
<svg t="1628162510870" class="icon" viewBox="0 0 1030 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="4496" width="128" height="128"><path d="M642.129 393.644h297.404c11.545 0.229 22.632 5.143 30.632 13.487 8.001 8.344 12.345 19.66 12.002 31.204V928.56c0.228 11.544-4 22.745-12.002 31.203-8 8.344-18.973 13.259-30.632 13.487H429.991c-11.544-0.228-22.631-5.143-30.632-13.487-8.001-8.344-12.344-19.66-12.001-31.203V616.755H89.496c-11.544-0.229-22.631-5.144-30.632-13.488-8.001-8.343-12.345-19.659-12.002-31.203V81.724c-0.228-11.545 4-22.746 12.002-31.204 8-8.344 18.973-13.259 30.632-13.487h510c11.544 0.228 22.63 5.143 30.631 13.487 8.001 8.344 12.345 19.66 12.002 31.203v311.92zM89.496 572.064h510V81.724h-510v490.34z m581.207-15.088l-93.496 254.657h41.605l22.86-65.493h104.011l22.86 65.493h40.004l-94.067-254.77h-43.777z m-20.23 155.904l40.576-115.442 43.204 115.442h-83.78zM326.55 141.044h32.232v65.036h123.785v172.134h-32.232v-20.231h-91.553v119.556H328.15v-119.67h-88.924v20.23h-32.232V205.966H328.15l-1.6-64.922z m-87.324 183.45h88.352v-85.267h-88.352v85.266z m119.556 0h91.553v-85.267h-91.553v85.266z m0 0" p-id="4497"></path></svg>
|
After Width: | Height: | Size: 1.1 KiB |
|
@ -0,0 +1 @@
|
|||
<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M115.625 127.937H.063V12.375h57.781v12.374H12.438v90.813h90.813V70.156h12.374z"/><path d="M116.426 2.821l8.753 8.753-56.734 56.734-8.753-8.745z"/><path d="M127.893 37.982h-12.375V12.375H88.706V0h39.187z"/></svg>
|
After Width: | Height: | Size: 285 B |
|
@ -0,0 +1 @@
|
|||
<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M.002 9.2c0 5.044 3.58 9.133 7.998 9.133 4.417 0 7.997-4.089 7.997-9.133 0-5.043-3.58-9.132-7.997-9.132S.002 4.157.002 9.2zM31.997.066h95.981V18.33H31.997V.066zm0 45.669c0 5.044 3.58 9.132 7.998 9.132 4.417 0 7.997-4.088 7.997-9.132 0-3.263-1.524-6.278-3.998-7.91-2.475-1.63-5.524-1.63-7.998 0-2.475 1.632-4 4.647-4 7.91zM63.992 36.6h63.986v18.265H63.992V36.6zm-31.995 82.2c0 5.043 3.58 9.132 7.998 9.132 4.417 0 7.997-4.089 7.997-9.132 0-5.044-3.58-9.133-7.997-9.133s-7.998 4.089-7.998 9.133zm31.995-9.131h63.986v18.265H63.992V109.67zm0-27.404c0 5.044 3.58 9.133 7.998 9.133 4.417 0 7.997-4.089 7.997-9.133 0-3.263-1.524-6.277-3.998-7.909-2.475-1.631-5.524-1.631-7.998 0-2.475 1.632-4 4.646-4 7.91zm31.995-9.13h31.991V91.4H95.987V73.135z"/></svg>
|
After Width: | Height: | Size: 821 B |
|
@ -0,0 +1 @@
|
|||
<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M108.8 44.322H89.6v-5.36c0-9.04-3.308-24.163-25.6-24.163-23.145 0-25.6 16.881-25.6 24.162v5.361H19.2v-5.36C19.2 15.281 36.798 0 64 0c27.202 0 44.8 15.281 44.8 38.961v5.361zm-32 39.356c0-5.44-5.763-9.832-12.8-9.832-7.037 0-12.8 4.392-12.8 9.832 0 3.682 2.567 6.808 6.407 8.477v11.205c0 2.718 2.875 4.962 6.4 4.962 3.524 0 6.4-2.244 6.4-4.962V92.155c3.833-1.669 6.393-4.795 6.393-8.477zM128 64v49.201c0 8.158-8.645 14.799-19.2 14.799H19.2C8.651 128 0 121.359 0 113.201V64c0-8.153 8.645-14.799 19.2-14.799h89.6c10.555 0 19.2 6.646 19.2 14.799z"/></svg>
|
After Width: | Height: | Size: 623 B |
|
@ -0,0 +1 @@
|
|||
<svg t="1628481543685" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="1235" width="128" height="128"><path d="M512.1024 2.4576L116.33777778 128.15928889c-14.81386667 4.69902222-24.87182222 18.44337778-24.89457778 33.97404444l2.048 494.34168889 0.46648889 5.64337778a345.75928889 345.75928889 0 0 0 97.8944 165.62631111c62.21368889 61.37173333 214.89208889 141.59644445 280.04124444 175.8208 10.24 5.39306667 17.88586667 9.38666667 22.25493334 11.79875556l7.42968888 4.03911111c5.05173333 2.75342222 11.13884445 2.83306667 16.27022223 0.2048l10.82026667-5.51822223c38.22933333-18.68231111 231.71982222-115.39342222 303.6615111-186.3111111a344.56120889 344.56120889 0 0 0 97.92853334-165.62631112l2.28693333-499.82577778c0.07964445-15.62168889-10.01244445-29.46844445-24.89457777-34.19022222L512.1024 2.4576z m13.26648889 229.08017778c40.33422222 0 76.85688889 16.34986667 103.29884444 42.79182222 26.44195555 26.44195555 42.79182222 62.96462222 42.79182222 103.29884445s-16.34986667 76.85688889-42.79182222 103.29884444c-19.09191111 19.10328889-43.46311111 32.92728889-70.71288888 39.13955556V593.92h76.27662222c17.99964445 0 32.58595555 14.58631111 32.58595555 32.58595555 0 17.98826667-14.58631111 32.58595555-32.58595555 32.58595556h-76.27662222v81.13493334c0 17.98826667-14.58631111 32.58595555-32.58595556 32.58595555s-32.58595555-14.58631111-32.58595556-32.58595555V520.07822222c-27.26115555-6.21226667-51.62097778-20.04764445-70.72426666-39.13955555-26.44195555-26.44195555-42.79182222-62.96462222-42.79182222-103.29884445s16.34986667-76.85688889 42.79182222-103.29884444c26.44195555-26.44195555 62.96462222-42.8032 103.31022222-42.8032z m58.29973333 87.79093333c-14.91626667-14.91626667-35.5328-24.14364445-58.29973333-24.14364444s-43.38346667 9.22737778-58.29973334 24.14364444-24.14364445 35.5328-24.14364444 58.29973334 9.22737778 43.38346667 24.14364444 58.29973333 35.5328 24.14364445 58.29973334 24.14364444 43.38346667-9.22737778 58.29973333-24.14364444 24.14364445-35.5328 24.14364445-58.29973333-9.22737778-43.37208889-24.14364445-58.29973334z m282.33955556 333.6192a294.57976889 294.57976889 0 0 1-79.50791111 130.17315556c-57.0368 56.26311111-211.62666667 136.61297778-267.81013334 164.94364444a17.37045333 17.37045333 0 0 1-16.00853333 0c-57.29848889-30.06008889-209.32835555-109.94346667-264.79502222-164.69333333a293.43516445 293.43516445 0 0 1-79.55342223-130.16177778l-2.00248888-459.30951111a15.85265778 15.85265778 0 0 1 10.99093333-15.12106667l334.01742222-106.17742222a35.24608 35.24608 0 0 1 21.24231111 0l334.01742222 106.17742222c6.59911111 2.08213333 11.09333333 8.20337778 11.08195556 15.12106667l-1.91146666 459.0592 0.23893333-0.01137778z" p-id="1236"></path></svg>
|
After Width: | Height: | Size: 2.7 KiB |
|
@ -0,0 +1 @@
|
|||
<svg t="1626927190002" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="1610" width="128" height="128"><path d="M611.626667 959.530667a36.352 36.352 0 0 1-6.741334-0.64 35.968 35.968 0 0 1-28.672-42.069334 193.749333 193.749333 0 0 1 118.4-144.128 132.010667 132.010667 0 1 1 145.792 0 193.706667 193.706667 0 0 1 118.4 144.128 36.181333 36.181333 0 0 1-28.586666 42.069334 39.381333 39.381333 0 0 1-6.698667 0.597333 36.010667 36.010667 0 0 1-35.285333-29.312 122.794667 122.794667 0 0 0-241.237334 0 36.010667 36.010667 0 0 1-35.370666 29.354667z m155.946666-356.821334a59.989333 59.989333 0 1 0 59.733334 59.946667 60.032 60.032 0 0 0-59.733334-59.946667z" p-id="1611"></path><path d="M888.533333 64H135.552a72.064 72.064 0 0 0-72.021333 72.021333v752A72.064 72.064 0 0 0 135.552 960h276.992a36.010667 36.010667 0 0 0 0-71.978667H135.552V136.021333h752.981333v339.968a36.010667 36.010667 0 0 0 72.021334 0V136.021333A72.064 72.064 0 0 0 888.533333 64z" p-id="1612"></path><path d="M412.501333 712.021333H228.48a36.010667 36.010667 0 0 1 0-72.021333h184.021333a36.010667 36.010667 0 1 1 0 72.021333z m0-192H228.48a36.010667 36.010667 0 0 1 0-71.978666h184.021333a36.010667 36.010667 0 1 1 0 72.021333z m128-192H228.48a36.010667 36.010667 0 0 1 0-72.021333h312.021333a36.010667 36.010667 0 1 1 0 72.021333z" p-id="1613"></path></svg>
|
After Width: | Height: | Size: 1.3 KiB |
|
@ -0,0 +1 @@
|
|||
<svg t="1626927612287" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="1028" width="128" height="128"><path d="M279.552 290.56c0-92.608 76.48-169.28 168.896-169.28 92.352 0 168.832 76.672 168.832 169.344 0 92.608-76.48 169.344-168.832 169.344-92.416 0-168.896-76.736-168.896-169.344z m-107.776 602.688a49.984 49.984 0 0 1-50.688-50.816c0-169.28 130.624-309.248 296.064-325.184h34.752c38.272-3.008 92.352-12.992 120.704-38.4l12.928-9.408c54.08-44.8 85.888-108.608 85.888-178.816C671.424 166.08 569.664 64 442.496 64c-117.76 0-219.52 102.08-219.52 226.56 0 70.272 31.744 134.016 85.888 178.88l15.872 9.408-15.872 6.528A383.424 383.424 0 0 0 64 842.496c0 60.736 47.68 108.544 108.288 108.544h289.536c9.472 0 25.344-9.472 25.344-28.864 0-22.4-15.872-28.928-25.344-28.928H171.776z m734.592-127.488c-47.68 6.464-82.944 44.8-82.944 95.616 0 9.472 2.944 22.4 6.4 28.928l-41.152 22.4-15.936-16c-18.88-12.928-34.752-18.88-54.144-18.88-15.872 0-34.752 6.464-54.144 18.944-6.4 6.4-12.864 9.472-15.872 15.936l-38.208-22.4c2.944-6.528 6.4-18.944 6.4-28.928a96 96 0 0 0-82.944-95.616c0-6.464-2.944-18.944-2.944-31.872 0-9.472 2.944-22.4 2.944-31.872a94.272 94.272 0 0 0 82.944-95.616c0-9.472-2.944-22.4-6.4-28.928l41.216-22.4c2.944 3.008 9.408 9.472 15.872 12.928 18.88 12.992 34.752 18.944 50.688 18.944 15.872 0 31.744-6.464 50.624-18.944 6.464-6.4 12.928-9.408 15.936-12.928l41.216 22.4c-3.008 6.528-6.464 18.944-6.464 28.928a96 96 0 0 0 82.944 95.616c0 6.464 2.944 18.944 2.944 31.872 4.48 9.472 1.024 22.4 1.024 31.872z m44.672-79.68c-2.944-16-15.872-28.928-28.8-28.928h-2.944a49.984 49.984 0 0 1-50.688-50.752c0-6.464 3.008-16 3.008-18.944 6.4-15.936 0-34.88-12.928-44.8l-57.152-31.872h-15.872c-9.408 0-22.4 2.944-28.8 12.928-6.4 6.464-25.344 22.4-38.272 22.4-12.864 0-31.744-15.936-41.216-22.4a40.32 40.32 0 0 0-28.8-12.928c-6.4 0-9.408 0-12.928 2.944l-60.544 31.872a40.128 40.128 0 0 0-12.928 44.8s2.944 9.536 2.944 18.944c0 28.928-22.336 50.816-50.624 50.816h-3.008c-12.928 0-25.344 12.992-28.8 28.928 0 2.944-6.4 25.344-6.4 47.808 0 18.88 2.944 44.8 6.4 47.808 3.008 15.936 15.872 28.864 28.8 28.864h3.008c28.8 0 50.624 22.4 50.624 50.816 0 6.464-2.944 15.936-2.944 18.944-6.464 15.936 0 34.816 12.928 44.8l57.088 31.872c6.4-3.008 9.408-3.008 15.872-3.008 9.472 0 22.4-2.944 28.8-12.928 6.464-6.464 25.344-25.408 41.28-25.408 12.864 0 34.752 16 41.216 25.408a40.32 40.32 0 0 0 28.8 12.928c6.4 0 9.408 0 15.872-2.944l57.152-31.872c12.864-9.472 18.88-28.928 12.864-44.8 0 0-2.944-9.536-2.944-19.008 0-28.8 22.4-50.752 50.624-50.752h3.008c12.928 0 25.344-12.992 28.8-28.928 0 0 6.464-25.408 6.464-47.808a195.136 195.136 0 0 1-8.96-44.8z m-232.448 89.152a41.856 41.856 0 0 1-41.216-41.344c0-22.4 18.88-41.344 41.216-41.344 22.4 0 41.28 18.944 41.28 41.344a41.472 41.472 0 0 1-41.28 41.344z m15.936-127.488c-60.608-12.992-114.752 41.344-101.824 105.088 6.4 34.816 34.752 63.744 70.016 70.208a86.08 86.08 0 0 0 101.824-102.08 87.808 87.808 0 0 0-70.016-73.216z" p-id="1029"></path></svg>
|
After Width: | Height: | Size: 2.9 KiB |
|
@ -0,0 +1 @@
|
|||
<svg t="1626927178609" class="icon" viewBox="0 0 1030 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="1316" width="128" height="128"><path d="M320.326217 674.084571l-36.571428 36.571429c-29.257143 36.571429-43.885714 87.771429-36.571429 138.971429 7.314286 65.828571 168.228571 87.771429 394.971429 87.771428 226.742857 0 387.657143-21.942857 387.657142-87.771428 7.314286-65.828571-21.942857-138.971429-80.457142-175.542858-29.257143-21.942857-58.514286-43.885714-95.085715-58.514285 7.314286 7.314286-36.571429-14.628571-43.885714-21.942857-14.628571-7.314286-21.942857-14.628571-36.571429-14.628572 0 0-7.314286 0-7.314285-7.314286v-7.314285c0-14.628571 7.314286-29.257143 14.628571-36.571429 65.828571-51.2 95.085714-138.971429 87.771429-226.742857-7.314286-124.342857-109.714286-219.428571-234.057143-212.114286-102.4-7.314286-190.171429 51.2-226.742857 146.285715-29.257143 73.142857-21.942857 153.6 14.628571 226.742857 14.628571 21.942857 36.571429 43.885714 58.514286 58.514285 7.314286 7.314286 14.628571 14.628571 14.628571 36.571429 0 7.314286-7.314286 21.942857-14.628571 21.942857-65.828571 21.942857-117.028571 51.2-160.914286 95.085714z m387.657143-95.085714c0 7.314286 7.314286 14.628571 14.628571 21.942857l21.942858 21.942857c7.314286 7.314286 21.942857 14.628571 36.571428 21.942858 7.314286 7.314286 51.2 21.942857 43.885714 21.942857 29.257143 14.628571 58.514286 29.257143 80.457143 51.2 43.885714 29.257143 65.828571 80.457143 58.514286 131.657143 0-7.314286 0-7.314286-14.628571 0-21.942857 7.314286-51.2 14.628571-73.142858 14.628571-73.142857 14.628571-153.6 14.628571-234.057142 14.628571-175.542857 0-336.457143-21.942857-336.457143-36.571428-7.314286-36.571429 0-65.828571 21.942857-95.085714 7.314286-7.314286 29.257143-36.571429 36.571428-36.571429 36.571429-36.571429 87.771429-65.828571 138.971429-87.771429l7.314286-7.314285c21.942857-14.628571 36.571429-43.885714 36.571428-73.142857s-7.314286-58.514286-29.257143-80.457143l-43.885714-43.885715c-29.257143-58.514286-29.257143-117.028571-14.628571-175.542857 29.257143-73.142857 95.085714-117.028571 175.542857-109.714285 95.085714 0 175.542857 73.142857 175.542857 160.914285 7.314286 65.828571-14.628571 131.657143-73.142857 175.542857-21.942857 21.942857-29.257143 51.2-29.257143 87.771429v21.942857z" p-id="1317"></path><path d="M71.640503 593.627429l-36.571429 36.571428c-29.257143 29.257143-43.885714 73.142857-29.257143 117.028572 7.314286 36.571429 58.514286 58.514286 160.914286 65.828571 7.314286 0 21.942857 0 29.257143-7.314286 7.314286-7.314286 7.314286-21.942857 7.314286-29.257143-7.314286-7.314286-14.628571-14.628571-21.942857-14.628571-29.257143 0-58.514286-7.314286-87.771429-14.628571-7.314286 0-14.628571-7.314286-21.942857-7.314286-7.314286-29.257143 0-51.2 21.942857-73.142857 7.314286-7.314286 29.257143-29.257143 36.571429-29.257143 43.885714-36.571429 87.771429-58.514286 138.971428-73.142857l7.314286-7.314286c36.571429-29.257143 51.2-80.457143 21.942857-117.028571l-21.942857-21.942858c-14.628571-7.314286-29.257143-21.942857-36.571429-36.571428-29.257143-43.885714-29.257143-102.4-14.628571-146.285714 29.257143-65.828571 95.085714-102.4 168.228571-95.085715 21.942857 0 43.885714 0 65.828572 7.314286 14.628571 7.314286 29.257143 0 36.571428-14.628571 7.314286-14.628571 0-29.257143-14.628571-36.571429-29.257143-7.314286-58.514286-14.628571-80.457143-14.628571-117.028571-14.628571-226.742857 65.828571-241.371429 182.857142-7.314286 51.2 7.314286 95.085714 29.257143 138.971429 14.628571 21.942857 36.571429 36.571429 58.514286 51.2 7.314286 7.314286 7.314286 14.628571 7.314286 29.257143 0 7.314286-7.314286 14.628571-7.314286 14.628571-73.142857 29.257143-131.657143 58.514286-175.542857 95.085715z" p-id="1318"></path></svg>
|
After Width: | Height: | Size: 3.7 KiB |
|
@ -0,0 +1 @@
|
|||
<svg t="1628508450554" class="icon" viewBox="0 0 1126 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="1153" width="128" height="128"><path d="M883.72 0h21.193c70.698 6.809 122.48 69.648 115.697 140.346-6.81 70.697-69.649 122.505-140.32 115.722a129.219 129.219 0 0 1-38.932-10.06C775.344 215.19 746.804 136.66 777.622 70.62c0.05-0.102 0.102-0.23 0.18-0.332C800.402 31.817 839.488 5.887 883.72 0zM813.1 133.563c0 98.393 141.266 105.432 162.435 21.09 21.194-63.274-42.337-112.47-91.79-105.456-49.452 0-70.646 35.143-70.646 84.469v-0.103z m-254.252 56.312c68.062-9.522 130.952 37.96 140.45 106.047a122.366 122.366 0 0 1 0.792 27.541 129.614 129.614 0 0 1-35.298 84.47c-77.685 84.339-226.017 28.155-226.017-84.47-3.916-69.853 49.555-129.62 119.382-133.537 0.23-0.026 0.461-0.05 0.691-0.05z m-77.685 119.51c-2.662 43.924 30.768 81.679 74.665 84.34 0.998 0.052 2.022 0.103 3.02 0.129 120.05 7.039 113.01-182.759-7.064-161.668-36.321 10.239-63.71 40.212-70.621 77.327v-0.128z m331.936 63.249c70.288-8.83 134.382 41.006 143.239 111.269 1.79 14.46 1.151 29.128-1.972 43.36-21.168 126.524-218.952 133.588-247.185 7.04-18.456-61.945 11.723-128.01 70.62-154.655a145.339 145.339 0 0 1 35.298-7.014z m-63.556 105.458c-35.349 119.459 162.435 140.576 162.435 21.09 3.38-41.363-27.44-77.633-68.803-81.012-10.188-0.845-20.4 0.435-30.102 3.686-31.74 1.612-58.13 25.008-63.53 56.313v-0.077z m-42.388 260.086c77.685-21.066 183.629-49.222 275.47-70.314 32.15-10.34 65.271-17.456 98.854-21.091 49.427 14.103 56.491 91.405 28.182 133.588a354.527 354.527 0 0 1-98.88 70.288c-42.362 21.092-70.647 42.158-105.945 63.274-77.685 42.158-148.28 91.355-233.03 105.432-56.517 14.053-134.203-7.012-183.63-21.09-98.878-28.182-190.693-63.25-317.806-63.25H78.53c-28.156 0-70.621 7.014-70.621-21.092s35.324-21.09 70.621-21.09h91.994c120.049 7.038 211.863 42.182 310.742 63.274 56.491 14.078 120.073 35.144 169.5 28.182a438.753 438.753 0 0 0 134.177-49.197 1533.954 1533.954 0 0 0 232.928-133.563c35.35-21.092 91.842-56.312 56.544-105.432a3378.13 3378.13 0 0 0-331.961 91.38c-35.324 6.987-77.686 28.156-113.01 28.156a80.394 80.394 0 0 1-56.49-21.092c-42.388-14.052-77.686-21.065-120.048-35.143-21.195-6.988-42.388-21.04-28.157-42.132 14.232-21.092 91.816 6.988 105.92 14.052 7.575 12.415 20.783 20.324 35.322 21.092 18.122 7.14 37.14 11.902 56.492 14.053 25.187-1.101 44.742-22.45 43.641-47.636-0.153-2.918-0.537-5.836-1.254-8.677-7.039-28.182-49.452-49.197-70.62-56.312-56.518-35.144-105.944-56.313-155.37-91.38-56.518-28.156-120.075-84.469-211.889-63.25-49.426 14.054-112.983 56.313-162.436 84.341-14.103 14.053-28.155 35.145-49.426 28.157-6.348-2.662-11.416-7.73-14.13-14.053-7.064-21.092 28.157-35.144 49.453-49.222a391.934 391.934 0 0 1 56.491-35.144c56.492-28.156 91.815-56.313 148.307-63.275 21.194 0 70.62-7.013 91.814 7.04a399.008 399.008 0 0 1 91.815 49.196c63.556 35.17 112.983 70.313 176.616 105.458 42.387 14.078 105.969 35.144 91.815 126.523l-0.154-0.05z" p-id="1154"></path></svg>
|
After Width: | Height: | Size: 2.9 KiB |
|
@ -0,0 +1 @@
|
|||
<svg t="1628481532680" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="1092" width="128" height="128"><path d="M890.65244445 40.1408H191.77654045c-32.21458489 0-58.31247645 26.09789155-58.31247645 58.31247645V206.16533333c0 16.07816533 13.04894578 29.12711111 29.12711111 29.12711112s29.12711111-13.04894578 29.12711111-29.12711112V127.58038755c0-16.07816533 13.04894578-29.18536533 29.18536533-29.18536533h640.73819023c16.07816533 0 29.18536533 13.04894578 29.18536533 29.18536533V896.47786667c0 16.07816533-13.04894578 29.18536533-29.18536533 29.18536533h-640.79644445c-16.07816533 0-29.18536533-13.04894578-29.18536533-29.18536533v-55.28325689c0-16.07816533-13.04894578-29.12711111-29.12711111-29.12711111s-29.12711111 13.04894578-29.12711111 29.12711111V925.60497778c0 32.21458489 26.09789155 58.31247645 58.31247644 58.31247644H890.65244445c32.21458489 0 58.31247645-26.09789155 58.31247644-58.31247644V98.45327645C949.02317511 66.23869155 922.86702933 40.1408 890.65244445 40.1408z" p-id="1093"></path><path d="M220.72888889 325.58648889H104.22044445c-16.07816533 0-29.12711111-13.04894578-29.12711112-29.12711111s13.04894578-29.12711111 29.12711112-29.12711111h116.50844444c16.07816533 0 29.12711111 13.04894578 29.12711111 29.12711111s-13.04894578 29.12711111-29.12711111 29.12711111zM220.72888889 558.60337778H104.22044445c-16.07816533 0-29.12711111-13.04894578-29.12711112-29.12711111s13.04894578-29.12711111 29.12711112-29.12711112h116.50844444c16.07816533 0 29.12711111 13.04894578 29.12711111 29.12711112s-13.04894578 29.12711111-29.12711111 29.12711111zM220.72888889 791.62026667H104.22044445c-16.07816533 0-29.12711111-13.04894578-29.12711112-29.12711112s13.04894578-29.12711111 29.12711112-29.1271111h116.50844444c16.07816533 0 29.12711111 13.04894578 29.12711111 29.1271111s-13.04894578 29.12711111-29.12711111 29.12711112zM760.27949511 733.36604445c-18.46658845-58.02120533-59.36105245-106.08093867-112.48890311-133.98471112 44.73924267-32.85538133 73.86635378-85.86672355 73.86635378-145.63555555 0-99.73122845-80.85686045-180.58808889-180.58808889-180.58808889s-180.58808889 80.85686045-180.58808889 180.58808889c0 59.768832 29.06885689 112.78017422 73.86635378 145.63555555-53.12785067 27.90377245-94.02231467 75.96350578-112.48890311 133.98471112 0 0-6.87399822 20.62199467 27.02995911 29.1271111 23.30168889 5.82542222 35.24380445-29.12711111 35.24380444-29.1271111 23.88423111-53.59388445 74.448896-92.62421333 134.85852445-100.43027912 7.28177778 0.87381333 14.62180978 1.39810133 22.13660444 1.39810134s14.85482667-0.524288 22.13660444-1.39810134c60.35137422 7.80606578 110.91603911 46.83639467 134.85852445 100.43027912 0 0 12.52465778 34.83602489 41.06922667 29.1271111 29.01060267-5.82542222 21.08802845-29.12711111 21.08802844-29.1271111zM418.676736 453.74577778c0-67.57489778 54.75896889-122.33386667 122.33386667-122.33386667s122.33386667 54.75896889 122.33386666 122.33386667c0 60.35137422-43.80717511 110.39175111-101.30409244 120.41147733-6.93225245-0.64079645-13.92275911-0.99032178-21.02977422-0.99032178s-14.09752178 0.34952533-21.02977422 0.99032178C462.48391111 564.13752889 418.676736 514.097152 418.676736 453.74577778z" p-id="1094"></path></svg>
|
After Width: | Height: | Size: 3.2 KiB |
|
@ -0,0 +1 @@
|
|||
<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M124.884 109.812L94.256 79.166c-.357-.357-.757-.629-1.129-.914a50.366 50.366 0 0 0 8.186-27.59C101.327 22.689 78.656 0 50.67 0 22.685 0 0 22.688 0 50.663c0 27.989 22.685 50.663 50.656 50.663 10.186 0 19.643-3.03 27.6-8.201.286.385.557.771.9 1.114l30.628 30.632a10.633 10.633 0 0 0 7.543 3.129c2.728 0 5.457-1.043 7.543-3.115 4.171-4.157 4.171-10.915.014-15.073M50.671 85.338C31.557 85.338 16 69.78 16 50.663c0-19.102 15.557-34.661 34.67-34.661 19.115 0 34.657 15.559 34.657 34.675 0 19.102-15.557 34.661-34.656 34.661"/></svg>
|
After Width: | Height: | Size: 600 B |
|
@ -0,0 +1 @@
|
|||
<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M.006.064h127.988v31.104H.006V.064zm0 38.016h38.396v41.472H.006V38.08zm0 48.384h38.396v41.472H.006V86.464zM44.802 38.08h38.396v41.472H44.802V38.08zm0 48.384h38.396v41.472H44.802V86.464zM89.598 38.08h38.396v41.472H89.598zm0 48.384h38.396v41.472H89.598z"/><path d="M.006.064h127.988v31.104H.006V.064zm0 38.016h38.396v41.472H.006V38.08zm0 48.384h38.396v41.472H.006V86.464zM44.802 38.08h38.396v41.472H44.802V38.08zm0 48.384h38.396v41.472H44.802V86.464zM89.598 38.08h38.396v41.472H89.598zm0 48.384h38.396v41.472H89.598z"/></svg>
|
After Width: | Height: | Size: 597 B |
|
@ -0,0 +1 @@
|
|||
<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M126.713 90.023c.858.985 1.287 2.134 1.287 3.447v29.553c0 1.423-.429 2.6-1.287 3.53-.858.93-1.907 1.395-3.146 1.395H97.824c-1.145 0-2.146-.465-3.004-1.395-.858-.93-1.287-2.107-1.287-3.53V93.47c0-.875.19-1.696.572-2.462.382-.766.906-1.368 1.573-1.806a3.84 3.84 0 0 1 2.146-.657h9.725V69.007a3.84 3.84 0 0 0-.43-1.806 3.569 3.569 0 0 0-1.143-1.313 2.714 2.714 0 0 0-1.573-.492h-36.47v23.149h9.725c1.144 0 2.145.492 3.004 1.478.858.985 1.287 2.134 1.287 3.447v29.553c0 .876-.191 1.696-.573 2.463-.38.766-.905 1.368-1.573 1.806a3.84 3.84 0 0 1-2.145.656H51.915a3.84 3.84 0 0 1-2.145-.656c-.668-.438-1.216-1.04-1.645-1.806a4.96 4.96 0 0 1-.644-2.463V93.47c0-1.313.43-2.462 1.288-3.447.858-.986 1.907-1.478 3.146-1.478h9.582v-23.15h-37.9c-.953 0-1.74.356-2.359 1.068-.62.711-.93 1.56-.93 2.544v19.538h9.726c1.239 0 2.264.492 3.074 1.478.81.985 1.216 2.134 1.216 3.447v29.553c0 1.423-.405 2.6-1.216 3.53-.81.93-1.835 1.395-3.074 1.395H4.29c-.476 0-.93-.082-1.358-.246a4.1 4.1 0 0 1-1.144-.657 4.658 4.658 0 0 1-.93-1.067 5.186 5.186 0 0 1-.643-1.395 5.566 5.566 0 0 1-.215-1.56V93.47c0-.437.048-.875.143-1.313a3.95 3.95 0 0 1 .429-1.15c.19-.328.429-.656.715-.984.286-.329.572-.602.858-.821.286-.22.62-.383 1.001-.493.382-.11.763-.164 1.144-.164h9.726V61.619c0-.985.31-1.833.93-2.544.619-.712 1.358-1.068 2.216-1.068h44.335V39.62h-9.582c-1.24 0-2.288-.492-3.146-1.477a5.09 5.09 0 0 1-1.287-3.448V5.14c0-1.423.429-2.627 1.287-3.612.858-.985 1.907-1.477 3.146-1.477h25.743c.763 0 1.478.246 2.145.739a5.17 5.17 0 0 1 1.573 1.888c.382.766.573 1.587.573 2.462v29.553c0 1.313-.43 2.463-1.287 3.448-.859.985-1.86 1.477-3.004 1.477h-9.725v18.389h42.762c.954 0 1.74.355 2.36 1.067.62.711.93 1.56.93 2.545v26.925h9.582c1.239 0 2.288.492 3.146 1.478z"/></svg>
|
After Width: | Height: | Size: 1.8 KiB |
|
@ -0,0 +1 @@
|
|||
<svg width="130" height="130" xmlns="http://www.w3.org/2000/svg"><path d="M63.444 64.996c20.633 0 37.359-14.308 37.359-31.953 0-17.649-16.726-31.952-37.359-31.952-20.631 0-37.36 14.303-37.358 31.952 0 17.645 16.727 31.953 37.359 31.953zM80.57 75.65H49.434c-26.652 0-48.26 18.477-48.26 41.27v2.664c0 9.316 21.608 9.325 48.26 9.325H80.57c26.649 0 48.256-.344 48.256-9.325v-2.663c0-22.794-21.605-41.271-48.256-41.271z" stroke="#979797"/></svg>
|
After Width: | Height: | Size: 440 B |
After Width: | Height: | Size: 218 KiB |
After Width: | Height: | Size: 227 KiB |
After Width: | Height: | Size: 4.7 KiB |
|
@ -0,0 +1,33 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" version="1.1" baseProfile="full" width="100%" height="100%" viewBox="0 0 1400 800">
|
||||
|
||||
<rect x="1300" y="400" rx="40" ry="40" width="150" height="150" stroke="rgb(129, 201, 149)" fill="rgb(129, 201, 149)">
|
||||
<animateTransform attributeType="XML" attributeName="transform" begin="0s" dur="35s" type="rotate" from="0 1450 550" to="360 1450 550" repeatCount="indefinite"/>
|
||||
</rect>
|
||||
|
||||
<path d="M 100 350 A 150 150 0 1 1 400 350 Q400 370 380 370 L 250 370 L 120 370 Q100 370 100 350" fill="#a2b3ff">
|
||||
<animateMotion path="M 800 -200 L 800 -300 L 800 -200" dur="20s" begin="0s" repeatCount="indefinite"/>
|
||||
<animateTransform attributeType="XML" attributeName="transform" begin="0s" dur="30s" type="rotate" values="0 210 530 ; -30 210 530 ; 0 210 530" keyTimes="0 ; 0.5 ; 1" repeatCount="indefinite"/>
|
||||
</path>
|
||||
|
||||
<circle cx="150" cy="150" r="180" stroke="#85FFBD" fill="#85FFBD">
|
||||
<animateMotion path="M 0 0 L 40 20 Z" dur="5s" repeatCount="indefinite"/>
|
||||
</circle>
|
||||
|
||||
<!-- 三角形 -->
|
||||
<path d="M 165 580 L 270 580 Q275 578 270 570 L 223 483 Q220 480 217 483 L 165 570 Q160 578 165 580" fill="#a2b3ff">
|
||||
<animateTransform attributeType="XML" attributeName="transform" begin="0s" dur="35s" type="rotate" from="0 210 530" to="360 210 530" repeatCount="indefinite"/>
|
||||
</path>
|
||||
|
||||
<!-- <circle cx="1200" cy="600" r="30" stroke="rgb(241, 243, 244)" fill="rgb(241, 243, 244)">-->
|
||||
<!-- <animateMotion path="M 0 0 L -20 40 Z" dur="9s" repeatCount="indefinite"/>-->
|
||||
<!-- </circle>-->
|
||||
|
||||
<path d="M 100 350 A 40 40 0 1 1 180 350 L 180 430 A 40 40 0 1 1 100 430 Z" fill="#3054EB">
|
||||
<animateMotion path="M 140 390 L 180 360 L 140 390" dur="20s" begin="0s" repeatCount="indefinite"/>
|
||||
<animateTransform attributeType="XML" attributeName="transform" begin="0s" dur="30s" type="rotate" values="0 140 390; -60 140 390; 0 140 390" keyTimes="0 ; 0.5 ; 1" repeatCount="indefinite"/>
|
||||
</path>
|
||||
|
||||
<rect x="400" y="600" rx="40" ry="40" width="100" height="100" stroke="rgb(129, 201, 149)" fill="#3054EB">
|
||||
<animateTransform attributeType="XML" attributeName="transform" begin="0s" dur="35s" type="rotate" from="-30 550 750" to="330 550 750" repeatCount="indefinite"/>
|
||||
</rect>
|
||||
</svg>
|
After Width: | Height: | Size: 2.2 KiB |
Before Width: | Height: | Size: 1.6 KiB After Width: | Height: | Size: 1.6 KiB |
After Width: | Height: | Size: 16 KiB |
After Width: | Height: | Size: 783 KiB |
|
@ -1 +1 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" class="iconify iconify--logos" width="37.07" height="36" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 198"><path fill="#41B883" d="M204.8 0H256L128 220.8L0 0h97.92L128 51.2L157.44 0h47.36Z"></path><path fill="#41B883" d="m0 0l128 220.8L256 0h-51.2L128 132.48L50.56 0H0Z"></path><path fill="#35495E" d="M50.56 0L128 133.12L204.8 0h-47.36L128 51.2L97.92 0H50.56Z"></path></svg>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" class="iconify iconify--logos" width="37.07" height="36" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 198"><path fill="#41B883" d="M204.8 0H256L128 220.8L0 0h97.92L128 51.2L157.44 0h47.36Z"></path><path fill="#41B883" d="m0 0l128 220.8L256 0h-51.2L128 132.48L50.56 0H0Z"></path><path fill="#35495E" d="M50.56 0L128 133.12L204.8 0h-47.36L128 51.2L97.92 0H50.56Z"></path></svg>
|
Before Width: | Height: | Size: 497 B After Width: | Height: | Size: 496 B |
|
@ -0,0 +1,152 @@
|
|||
<template>
|
||||
<el-dialog
|
||||
v-model="dialogVisible"
|
||||
:title="`${parameter.title}`"
|
||||
:destroy-on-close="true"
|
||||
width="580px"
|
||||
draggable
|
||||
>
|
||||
<el-form class="drawer-multiColumn-form" label-width="100px">
|
||||
<el-form-item label="文件上传 :">
|
||||
<el-upload
|
||||
action="#"
|
||||
class="upload"
|
||||
:drag="true"
|
||||
:limit="excelLimit"
|
||||
:multiple="true"
|
||||
:show-file-list="true"
|
||||
:http-request="uploadExcel"
|
||||
:before-upload="beforeExcelUpload"
|
||||
:on-exceed="handleExceed"
|
||||
:on-success="excelUploadSuccess"
|
||||
:on-error="excelUploadError"
|
||||
:accept="parameter.fileType!.join(',')"
|
||||
>
|
||||
<slot name="empty">
|
||||
<el-icon class="el-icon--upload">
|
||||
<upload-filled />
|
||||
</el-icon>
|
||||
<div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div>
|
||||
</slot>
|
||||
<template #tip>
|
||||
<slot name="tip">
|
||||
<div class="el-upload__tip">
|
||||
请上传 .xls , .xlsx 标准格式文件,文件最大为 {{ parameter.fileSize }}M
|
||||
</div>
|
||||
</slot>
|
||||
</template>
|
||||
</el-upload>
|
||||
</el-form-item>
|
||||
<el-form-item label="数据覆盖 :">
|
||||
<el-switch v-model="isCover" />
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
</el-dialog>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts" name="ImportExcel">
|
||||
import { ElNotification, UploadRawFile, UploadRequestOptions } from 'element-plus';
|
||||
import { ref } from 'vue';
|
||||
|
||||
export interface ExcelParameterProps {
|
||||
title: string; // 标题
|
||||
fileSize?: number; // 上传文件的大小
|
||||
fileType?: File.ExcelMimeType[]; // 上传文件的类型
|
||||
tempApi?: (params: any) => Promise<any>; // 下载模板的Api
|
||||
importApi?: (params: any) => Promise<any>; // 批量导入的Api
|
||||
getTableList?: () => void; // 获取表格数据的Api
|
||||
}
|
||||
|
||||
// 是否覆盖数据
|
||||
const isCover = ref(false);
|
||||
// 最大文件上传数
|
||||
const excelLimit = ref(1);
|
||||
// dialog状态
|
||||
const dialogVisible = ref(false);
|
||||
// 父组件传过来的参数
|
||||
const parameter = ref<ExcelParameterProps>({
|
||||
title: '',
|
||||
fileSize: 5,
|
||||
fileType: [
|
||||
'application/vnd.ms-excel',
|
||||
'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
|
||||
],
|
||||
});
|
||||
|
||||
// 接收父组件参数
|
||||
const acceptParams = (params: ExcelParameterProps) => {
|
||||
parameter.value = { ...parameter.value, ...params };
|
||||
dialogVisible.value = true;
|
||||
};
|
||||
|
||||
// 文件上传
|
||||
const uploadExcel = async (param: UploadRequestOptions) => {
|
||||
let excelFormData = new FormData();
|
||||
excelFormData.append('file', param.file);
|
||||
excelFormData.append('isCover', isCover.value as unknown as Blob);
|
||||
await parameter.value.importApi!(excelFormData);
|
||||
parameter.value.getTableList && parameter.value.getTableList();
|
||||
dialogVisible.value = false;
|
||||
};
|
||||
|
||||
/**
|
||||
* @description 文件上传之前判断
|
||||
* @param file 上传的文件
|
||||
* */
|
||||
const beforeExcelUpload = (file: UploadRawFile) => {
|
||||
const isExcel = parameter.value.fileType!.includes(file.type as File.ExcelMimeType);
|
||||
const fileSize = file.size / 1024 / 1024 < parameter.value.fileSize!;
|
||||
if (!isExcel)
|
||||
ElNotification({
|
||||
title: '温馨提示',
|
||||
message: '上传文件只能是 xls / xlsx 格式!',
|
||||
type: 'warning',
|
||||
});
|
||||
if (!fileSize)
|
||||
setTimeout(() => {
|
||||
ElNotification({
|
||||
title: '温馨提示',
|
||||
message: `上传文件大小不能超过 ${parameter.value.fileSize}MB!`,
|
||||
type: 'warning',
|
||||
});
|
||||
}, 0);
|
||||
return isExcel && fileSize;
|
||||
};
|
||||
|
||||
// 文件数超出提示
|
||||
const handleExceed = () => {
|
||||
ElNotification({
|
||||
title: '温馨提示',
|
||||
message: '最多只能上传一个文件!',
|
||||
type: 'warning',
|
||||
});
|
||||
};
|
||||
|
||||
// 上传错误提示
|
||||
const excelUploadError = () => {
|
||||
ElNotification({
|
||||
title: '温馨提示',
|
||||
message: `批量添加${parameter.value.title}失败,请您重新上传!`,
|
||||
type: 'error',
|
||||
});
|
||||
};
|
||||
|
||||
// 上传成功提示
|
||||
const excelUploadSuccess = () => {
|
||||
ElNotification({
|
||||
title: '温馨提示',
|
||||
message: `批量添加${parameter.value.title}成功!`,
|
||||
type: 'success',
|
||||
});
|
||||
};
|
||||
|
||||
defineExpose({
|
||||
acceptParams,
|
||||
});
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.upload {
|
||||
width: 80%;
|
||||
}
|
||||
</style>
|
|
@ -15,7 +15,7 @@
|
|||
|
||||
<script lang="ts" setup>
|
||||
// 分页参数
|
||||
interface pageAbleType {
|
||||
interface PageAbleType {
|
||||
page: number;
|
||||
rows: number;
|
||||
total: number;
|
||||
|
@ -23,7 +23,7 @@ interface pageAbleType {
|
|||
|
||||
// 分页参数以及分页操作方法
|
||||
interface PaginationProps {
|
||||
pageAble: pageAbleType;
|
||||
pageAble: PageAbleType;
|
||||
handleSizeChange: (size: number) => void;
|
||||
handleCurrentChange: (currentPage: number) => void;
|
||||
}
|
|
@ -0,0 +1,74 @@
|
|||
<template>
|
||||
<el-select
|
||||
v-model="valueContent"
|
||||
:placeholder="placeholder"
|
||||
style="width: 100%"
|
||||
clearable
|
||||
filterable
|
||||
remote
|
||||
reserve-keyword
|
||||
remote-show-suffix
|
||||
:remote-method="onRemoteData"
|
||||
:loading="selectLoading"
|
||||
:disabled="disabled"
|
||||
>
|
||||
<el-option v-for="item in optionList" :key="item.id" :label="item.text" :value="item.id" />
|
||||
</el-select>
|
||||
</template>
|
||||
|
||||
<script lang="ts" setup>
|
||||
import { computed, ref } from 'vue';
|
||||
import { useRequest } from 'vue-hooks-plus';
|
||||
import { dictionaryListType } from '@/types';
|
||||
|
||||
interface SelectType {
|
||||
value: string | number;
|
||||
placeholder?: string;
|
||||
disabled?: boolean;
|
||||
api?: (params: any) => Promise<any>;
|
||||
}
|
||||
|
||||
// 接受父组件参数
|
||||
const props = withDefaults(defineProps<SelectType>(), {
|
||||
value: '',
|
||||
placeholder: '请选择',
|
||||
disabled: false,
|
||||
});
|
||||
|
||||
// 内容监听,触发父组件改变,实现双向数据绑定
|
||||
const emit = defineEmits<{
|
||||
(event: 'update:value', value: string | number): void;
|
||||
}>();
|
||||
|
||||
const valueContent = computed({
|
||||
get() {
|
||||
return props.value;
|
||||
},
|
||||
set(val: string | number) {
|
||||
emit('update:value', val);
|
||||
},
|
||||
});
|
||||
|
||||
// 远程搜索loading
|
||||
const selectLoading = ref(false);
|
||||
|
||||
// 选项列表
|
||||
const optionList = ref<dictionaryListType[]>([]);
|
||||
|
||||
const { runAsync } = useRequest(props.api!, {
|
||||
debounceWait: 500,
|
||||
onSuccess: (list) => {
|
||||
optionList.value = list.data;
|
||||
},
|
||||
});
|
||||
|
||||
// 获取列表
|
||||
const onRemoteData = async (query: string) => {
|
||||
selectLoading.value = true;
|
||||
const { data } = await runAsync({ q: query });
|
||||
selectLoading.value = false;
|
||||
optionList.value = data;
|
||||
};
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped></style>
|
|
@ -1,35 +1,31 @@
|
|||
<template>
|
||||
<div class="switch-dark" @click="onClickToggleDark">
|
||||
<svg-icon v-if="isDark" icon="Moon" className="switch-svg"></svg-icon>
|
||||
<svg-icon v-else icon="Sunny" className="switch-svg"></svg-icon>
|
||||
</div>
|
||||
<el-switch
|
||||
class="dark"
|
||||
v-model="themeConfig.isDark"
|
||||
inline-prompt
|
||||
:active-icon="Sunny"
|
||||
:inactive-icon="Moon"
|
||||
@change="onChangeDark"
|
||||
/>
|
||||
</template>
|
||||
|
||||
<script lang="ts" setup>
|
||||
import { Moon, Sunny } from '@element-plus/icons-vue';
|
||||
import { computed } from 'vue';
|
||||
import { useTheme } from '@/hooks/useTheme';
|
||||
import { useSettingStore } from '@/store/modules/setting';
|
||||
|
||||
// 获取全局状态管理仓库中系统设置状态
|
||||
const settingStore = useSettingStore();
|
||||
const isDark = computed(() => settingStore.isDark);
|
||||
const themeConfig = computed(() => settingStore.themeConfig);
|
||||
|
||||
// 获取切换暗黑模式hooks
|
||||
const { switchDark } = useTheme();
|
||||
|
||||
// 切换暗黑模式
|
||||
const onClickToggleDark = () => {
|
||||
settingStore.setThemeDark(!isDark.value);
|
||||
const onChangeDark = () => {
|
||||
switchDark();
|
||||
};
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.switch-dark {
|
||||
cursor: pointer;
|
||||
transition: all 0.3s;
|
||||
.switch-svg {
|
||||
font-size: 20px;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
<style lang="scss" scoped></style>
|
||||
|
|
|
@ -0,0 +1,339 @@
|
|||
<template>
|
||||
<div class="upload-box">
|
||||
<el-upload
|
||||
:id="uuid"
|
||||
action="#"
|
||||
:class="['upload', self_disabled ? 'disabled' : '', drag ? 'no-border' : '']"
|
||||
:multiple="false"
|
||||
:disabled="self_disabled"
|
||||
:show-file-list="false"
|
||||
:http-request="handleHttpUpload"
|
||||
:before-upload="beforeUpload"
|
||||
:on-success="uploadSuccess"
|
||||
:on-error="uploadError"
|
||||
:drag="drag"
|
||||
:accept="fileType.join(',')"
|
||||
>
|
||||
<template v-if="imageUrl">
|
||||
<img :src="imageUrl" class="upload-image" />
|
||||
<div class="upload-handle" @click.stop>
|
||||
<div v-if="false" class="handle-icon" @click="editImg">
|
||||
<el-icon><Edit /></el-icon>
|
||||
<span>编辑</span>
|
||||
</div>
|
||||
<div class="handle-icon" @click="imgViewVisible = true">
|
||||
<el-icon><ZoomIn /></el-icon>
|
||||
<span>查看</span>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
<template v-else>
|
||||
<div class="upload-empty">
|
||||
<slot name="empty">
|
||||
<el-icon><Plus /></el-icon>
|
||||
<!-- <span>请上传图片</span> -->
|
||||
</slot>
|
||||
</div>
|
||||
</template>
|
||||
</el-upload>
|
||||
<div class="el-upload__tip">
|
||||
<slot name="tip"></slot>
|
||||
</div>
|
||||
<el-image-viewer v-if="imgViewVisible" :url-list="[imageUrl]" @close="imgViewVisible = false" />
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts" name="UploadImg">
|
||||
import type { UploadProps, UploadRequestOptions } from 'element-plus';
|
||||
import { ElNotification, formContextKey, formItemContextKey } from 'element-plus';
|
||||
import { computed, inject, ref, watchEffect } from 'vue';
|
||||
import {
|
||||
getEnterpriseIDImgAPI,
|
||||
getEnterpriseLicenseImgAPI,
|
||||
postEnterpriseUploadAPI,
|
||||
} from '@/api/Enterprise/company';
|
||||
import { generateUUID } from '@/utils';
|
||||
|
||||
interface UploadFileProps {
|
||||
imageID: string; // 图片ID ==> 必传
|
||||
api?: (params: any) => Promise<any>; // 上传图片的 api 方法,一般项目上传都是同一个 api 方法,在组件里直接引入即可 ==> 非必传
|
||||
drag?: boolean; // 是否支持拖拽上传 ==> 非必传(默认为 true)
|
||||
disabled?: boolean; // 是否禁用上传组件 ==> 非必传(默认为 false)
|
||||
fileSize?: number; // 图片大小限制 ==> 非必传(默认为 5M)
|
||||
fileType?: File.ImageMimeType[]; // 图片类型限制 ==> 非必传(默认为 ["image/jpeg", "image/png", "image/gif"])
|
||||
height?: string; // 组件高度 ==> 非必传(默认为 150px)
|
||||
width?: string; // 组件宽度 ==> 非必传(默认为 150px)
|
||||
borderRadius?: string; // 组件边框圆角 ==> 非必传(默认为 8px)
|
||||
imgType?: number; // 图片类型 ==> 非必传
|
||||
fileNo?: string | number;
|
||||
companyID: string | number;
|
||||
}
|
||||
|
||||
// 接受父组件参数
|
||||
const props = withDefaults(defineProps<UploadFileProps>(), {
|
||||
imageID: '',
|
||||
drag: true,
|
||||
disabled: false,
|
||||
fileSize: 5,
|
||||
fileType: () => ['image/jpeg', 'image/png', 'image/gif'],
|
||||
height: '150px',
|
||||
width: '150px',
|
||||
borderRadius: '8px',
|
||||
imgType: 0,
|
||||
fileNo: '',
|
||||
companyID: '',
|
||||
});
|
||||
|
||||
// 生成组件唯一id
|
||||
const uuid = ref('id-' + generateUUID());
|
||||
|
||||
// 查看图片
|
||||
const imgViewVisible = ref(false);
|
||||
// 获取 el-form 组件上下文
|
||||
const formContext = inject(formContextKey, void 0);
|
||||
// 获取 el-form-item 组件上下文
|
||||
const formItemContext = inject(formItemContextKey, void 0);
|
||||
// 判断是否禁用上传和删除
|
||||
const self_disabled = computed(() => {
|
||||
return props.disabled || formContext?.disabled;
|
||||
});
|
||||
|
||||
const imageUrl = ref('');
|
||||
|
||||
watchEffect(async () => {
|
||||
const imgApi = props.imgType === 1 ? getEnterpriseIDImgAPI : getEnterpriseLicenseImgAPI;
|
||||
const { data } = await imgApi(props.companyID);
|
||||
|
||||
const arrayBufferToBase64 = (buffer: ArrayBuffer): string => {
|
||||
let binary = '';
|
||||
const bytes = new Uint8Array(buffer);
|
||||
const len = bytes.byteLength;
|
||||
for (let i = 0; i < len; i++) {
|
||||
binary += String.fromCharCode(bytes[i]);
|
||||
}
|
||||
return btoa(binary);
|
||||
};
|
||||
|
||||
const base64String = arrayBufferToBase64(data);
|
||||
imageUrl.value = `data:image/png;base64,${base64String}`;
|
||||
});
|
||||
|
||||
/**
|
||||
* @description 图片上传
|
||||
* @param options upload 所有配置项
|
||||
* */
|
||||
const emit = defineEmits<{
|
||||
'update:imageID': [value: string];
|
||||
}>();
|
||||
const handleHttpUpload = async (options: UploadRequestOptions) => {
|
||||
try {
|
||||
const api = props.api ?? postEnterpriseUploadAPI;
|
||||
const { data } = await api({ file: options.file }, { type: props.imgType, no: props.fileNo });
|
||||
|
||||
emit('update:imageID', data);
|
||||
// 调用 el-form 内部的校验方法(可自动校验)
|
||||
formItemContext?.prop && formContext?.validateField([formItemContext.prop as string]);
|
||||
} catch (error) {
|
||||
options.onError(error as any);
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* @description 编辑图片
|
||||
* */
|
||||
const editImg = () => {
|
||||
const dom = document.querySelector(`#${uuid.value} .el-upload__input`);
|
||||
dom && dom.dispatchEvent(new MouseEvent('click'));
|
||||
};
|
||||
|
||||
/**
|
||||
* @description 文件上传之前判断
|
||||
* @param rawFile 选择的文件
|
||||
* */
|
||||
const beforeUpload: UploadProps['beforeUpload'] = (rawFile) => {
|
||||
const imgSize = rawFile.size / 1024 / 1024 < props.fileSize;
|
||||
const imgType = props.fileType.includes(rawFile.type as File.ImageMimeType);
|
||||
if (!imgType)
|
||||
ElNotification({
|
||||
title: '温馨提示',
|
||||
message: '上传图片不符合所需的格式!',
|
||||
type: 'warning',
|
||||
});
|
||||
if (!imgSize)
|
||||
setTimeout(() => {
|
||||
ElNotification({
|
||||
title: '温馨提示',
|
||||
message: `上传图片大小不能超过 ${props.fileSize}M!`,
|
||||
type: 'warning',
|
||||
});
|
||||
}, 0);
|
||||
return imgType && imgSize;
|
||||
};
|
||||
|
||||
/**
|
||||
* @description 图片上传成功
|
||||
* */
|
||||
const uploadSuccess = () => {
|
||||
ElNotification({
|
||||
title: '温馨提示',
|
||||
message: '图片上传成功!',
|
||||
type: 'success',
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* @description 图片上传错误
|
||||
* */
|
||||
const uploadError = () => {
|
||||
ElNotification({
|
||||
title: '温馨提示',
|
||||
message: '图片上传失败,请您重新上传!',
|
||||
type: 'error',
|
||||
});
|
||||
};
|
||||
</script>
|
||||
|
||||
<style scoped lang="scss">
|
||||
.is-error {
|
||||
.upload {
|
||||
:deep(.el-upload),
|
||||
:deep(.el-upload-dragger) {
|
||||
border: 1px dashed var(--el-color-danger) !important;
|
||||
&:hover {
|
||||
border-color: var(--el-color-primary) !important;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
:deep(.disabled) {
|
||||
.el-upload,
|
||||
.el-upload-dragger {
|
||||
cursor: not-allowed !important;
|
||||
background: var(--el-disabled-bg-color);
|
||||
border: 1px dashed var(--el-border-color-darker) !important;
|
||||
&:hover {
|
||||
border: 1px dashed var(--el-border-color-darker) !important;
|
||||
}
|
||||
}
|
||||
}
|
||||
.upload-box {
|
||||
.no-border {
|
||||
:deep(.el-upload) {
|
||||
border: none !important;
|
||||
}
|
||||
}
|
||||
:deep(.upload) {
|
||||
.el-upload {
|
||||
position: relative;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
width: v-bind(width);
|
||||
height: v-bind(height);
|
||||
overflow: hidden;
|
||||
border: 1px dashed var(--el-border-color-darker);
|
||||
border-radius: v-bind(borderRadius);
|
||||
transition: var(--el-transition-duration-fast);
|
||||
&:hover {
|
||||
border-color: var(--el-color-primary);
|
||||
.upload-handle {
|
||||
opacity: 1;
|
||||
}
|
||||
}
|
||||
.el-upload-dragger {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
padding: 0;
|
||||
overflow: hidden;
|
||||
background-color: transparent;
|
||||
border: 1px dashed var(--el-border-color-darker);
|
||||
border-radius: v-bind(borderRadius);
|
||||
&:hover {
|
||||
border: 1px dashed var(--el-color-primary);
|
||||
}
|
||||
}
|
||||
.el-upload-dragger.is-dragover {
|
||||
background-color: var(--el-color-primary-light-9);
|
||||
border: 2px dashed var(--el-color-primary) !important;
|
||||
}
|
||||
.upload-image {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
object-fit: contain;
|
||||
}
|
||||
.upload-empty {
|
||||
position: relative;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
font-size: 12px;
|
||||
line-height: 30px;
|
||||
color: var(--el-color-info);
|
||||
.el-icon {
|
||||
font-size: 28px;
|
||||
color: var(--el-text-color-secondary);
|
||||
}
|
||||
}
|
||||
.upload-handle {
|
||||
position: absolute;
|
||||
top: 0;
|
||||
right: 0;
|
||||
box-sizing: border-box;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
cursor: pointer;
|
||||
background: rgb(0 0 0 / 60%);
|
||||
opacity: 0;
|
||||
transition: var(--el-transition-duration-fast);
|
||||
.handle-icon {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
padding: 0 6%;
|
||||
color: aliceblue;
|
||||
.el-icon {
|
||||
margin-bottom: 40%;
|
||||
font-size: 130%;
|
||||
line-height: 130%;
|
||||
}
|
||||
span {
|
||||
font-size: 85%;
|
||||
line-height: 85%;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
.el-upload__tip {
|
||||
line-height: 18px;
|
||||
text-align: center;
|
||||
}
|
||||
}
|
||||
.image-dialog {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
.image-item {
|
||||
box-sizing: border-box;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
width: 100%;
|
||||
padding: 10px;
|
||||
margin-bottom: 10px;
|
||||
cursor: pointer;
|
||||
border: 1px solid var(--el-border-color);
|
||||
border-radius: 4px;
|
||||
&:hover {
|
||||
border-color: var(--el-color-primary);
|
||||
}
|
||||
}
|
||||
}
|
||||
</style>
|
|
@ -0,0 +1,171 @@
|
|||
<template>
|
||||
<div :class="['editor-box', self_disabled ? 'editor-disabled' : '']">
|
||||
<Toolbar
|
||||
v-if="!hideToolBar"
|
||||
class="editor-toolbar"
|
||||
:editor="editorRef"
|
||||
:default-config="toolbarConfig"
|
||||
:mode="mode"
|
||||
/>
|
||||
<Editor
|
||||
v-model="valueHtml"
|
||||
class="editor-content"
|
||||
:style="{ height }"
|
||||
:mode="mode"
|
||||
:default-config="editorConfig"
|
||||
@on-created="handleCreated"
|
||||
@on-blur="handleBlur"
|
||||
/>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts" name="WangEditor">
|
||||
import { IEditorConfig, IToolbarConfig } from '@wangeditor/editor';
|
||||
import { Editor, Toolbar } from '@wangeditor/editor-for-vue';
|
||||
import { formContextKey, formItemContextKey } from 'element-plus';
|
||||
import { computed, inject, nextTick, onBeforeUnmount, shallowRef } from 'vue';
|
||||
import '@wangeditor/editor/dist/css/style.css';
|
||||
|
||||
// 富文本 DOM 元素
|
||||
const editorRef = shallowRef();
|
||||
|
||||
// 实列化编辑器
|
||||
const handleCreated = (editor: any) => {
|
||||
editorRef.value = editor;
|
||||
|
||||
// 获取工具栏参数
|
||||
// nextTick(() => {
|
||||
// const toolbar = DomEditor.getToolbar(editor);
|
||||
// const curToolbarConfig = toolbar?.getConfig();
|
||||
// console.log(curToolbarConfig?.toolbarKeys); // 当前菜单排序和分组
|
||||
// });
|
||||
};
|
||||
|
||||
// 接收父组件参数,并设置默认值
|
||||
interface RichEditorProps {
|
||||
value: string; // 富文本值 ==> 必传
|
||||
toolbarConfig?: Partial<IToolbarConfig>; // 工具栏配置 ==> 非必传(默认为空)
|
||||
editorConfig?: Partial<IEditorConfig>; // 编辑器配置 ==> 非必传(默认为空)
|
||||
height?: string; // 富文本高度 ==> 非必传(默认为 500px)
|
||||
mode?: 'default' | 'simple'; // 富文本模式 ==> 非必传(默认为 default)
|
||||
hideToolBar?: boolean; // 是否隐藏工具栏 ==> 非必传(默认为false)
|
||||
disabled?: boolean; // 是否禁用编辑器 ==> 非必传(默认为false)
|
||||
}
|
||||
|
||||
const props = withDefaults(defineProps<RichEditorProps>(), {
|
||||
toolbarConfig: () => {
|
||||
return {
|
||||
excludeKeys: ['group-video', 'emotion', 'group-image'], // 排除掉视频菜单group-video
|
||||
};
|
||||
},
|
||||
editorConfig: () => {
|
||||
return {
|
||||
placeholder: '请输入内容...',
|
||||
MENU_CONF: {},
|
||||
};
|
||||
},
|
||||
height: '500px',
|
||||
mode: 'default',
|
||||
hideToolBar: false,
|
||||
disabled: false,
|
||||
});
|
||||
|
||||
// 获取 el-form 组件上下文
|
||||
const formContext = inject(formContextKey, void 0);
|
||||
// 获取 el-form-item 组件上下文
|
||||
const formItemContext = inject(formItemContextKey, void 0);
|
||||
// 判断是否禁用上传和删除
|
||||
const self_disabled = computed(() => {
|
||||
return props.disabled || formContext?.disabled;
|
||||
});
|
||||
|
||||
// 判断当前富文本编辑器是否禁用
|
||||
if (self_disabled.value) nextTick(() => editorRef.value.disable());
|
||||
|
||||
// 富文本的内容监听,触发父组件改变,实现双向数据绑定
|
||||
const emit = defineEmits<{
|
||||
(event: 'update:value', value: string): void;
|
||||
(event: 'check-validate'): void;
|
||||
}>();
|
||||
|
||||
const valueHtml = computed({
|
||||
get() {
|
||||
return props.value;
|
||||
},
|
||||
set(val: string) {
|
||||
// 防止富文本内容为空时,校验失败
|
||||
if (editorRef.value.isEmpty()) val = '';
|
||||
emit('update:value', val);
|
||||
},
|
||||
});
|
||||
|
||||
/**
|
||||
* @description 图片自定义上传
|
||||
* @param file 上传的文件
|
||||
* @param insertFn 上传成功后的回调函数(插入到富文本编辑器中)
|
||||
* */
|
||||
// type InsertFnTypeImg = (url: string, alt?: string, href?: string) => void;
|
||||
// props.editorConfig.MENU_CONF!['uploadImage'] = {
|
||||
// async customUpload(file: File, insertFn: InsertFnTypeImg) {
|
||||
// if (!uploadImgValidate(file)) return;
|
||||
// try {
|
||||
// const { data } = await postFileUploadAPI({ file, fileType: 'image' });
|
||||
// insertFn(data.url);
|
||||
// } catch (error) {
|
||||
// console.log(error);
|
||||
// }
|
||||
// },
|
||||
// };
|
||||
|
||||
// 图片上传前判断
|
||||
// const uploadImgValidate = (file: File): boolean => {
|
||||
// console.log(file);
|
||||
// return true;
|
||||
// };
|
||||
|
||||
// 编辑框失去焦点时触发
|
||||
const handleBlur = () => {
|
||||
formItemContext?.prop && formContext?.validateField([formItemContext.prop as string]);
|
||||
};
|
||||
|
||||
// 组件销毁时,也及时销毁编辑器
|
||||
onBeforeUnmount(() => {
|
||||
if (!editorRef.value) return;
|
||||
editorRef.value.destroy();
|
||||
});
|
||||
|
||||
defineExpose({
|
||||
editor: editorRef,
|
||||
});
|
||||
</script>
|
||||
|
||||
<style scoped lang="scss">
|
||||
/* 富文本组件校验失败样式 */
|
||||
.is-error {
|
||||
.editor-box {
|
||||
border-color: var(--el-color-danger);
|
||||
.editor-toolbar {
|
||||
border-bottom-color: var(--el-color-danger);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* 富文本组件禁用样式 */
|
||||
.editor-disabled {
|
||||
cursor: not-allowed !important;
|
||||
}
|
||||
|
||||
/* 富文本组件样式 */
|
||||
.editor-box {
|
||||
/* 防止富文本编辑器全屏时 tabs组件 在其层级之上 */
|
||||
z-index: 2;
|
||||
width: 100%;
|
||||
border: 1px solid var(--el-border-color-darker);
|
||||
.editor-toolbar {
|
||||
border-bottom: 1px solid var(--el-border-color-darker);
|
||||
}
|
||||
.editor-content {
|
||||
overflow-y: hidden;
|
||||
}
|
||||
}
|
||||
</style>
|
|
@ -0,0 +1,4 @@
|
|||
/**
|
||||
* 菜单列表
|
||||
*/
|
||||
export const MENU_LIST = 'menuList';
|
|
@ -0,0 +1,26 @@
|
|||
// 全局默认配置项
|
||||
|
||||
/**
|
||||
* 首页地址(默认)
|
||||
*/
|
||||
export const HOME_URL = '/home';
|
||||
|
||||
/**
|
||||
* 登录页地址(默认)
|
||||
*/
|
||||
export const LOGIN_URL = '/login';
|
||||
|
||||
/**
|
||||
* 默认主题颜色
|
||||
*/
|
||||
export const DEFAULT_THEMECOLOR = '#409eff';
|
||||
|
||||
/**
|
||||
* 高德地图 key
|
||||
*/
|
||||
export const AMAP_MAP_KEY = '';
|
||||
|
||||
/**
|
||||
* 百度地图 key
|
||||
*/
|
||||
export const BAIDU_MAP_KEY = '';
|
|
@ -1,5 +1,7 @@
|
|||
import NProgress from 'nprogress'; // 进度条
|
||||
import { router } from '@/router';
|
||||
import { usePermissionStore } from '@/store/modules/permission';
|
||||
import { useUserStore } from '@/store/modules/user';
|
||||
import 'nprogress/nprogress.css'; // 进度条样式
|
||||
|
||||
// 进度条配置
|
||||
|
@ -24,36 +26,35 @@ router.beforeEach(async (to, from, next) => {
|
|||
}
|
||||
|
||||
// 获取用户信息 store
|
||||
// const userStore = useUserStore();
|
||||
const userStore = useUserStore();
|
||||
// 获取用户是否登录状态,确定用户是否已登录过,存在Token
|
||||
// const hasToken = userStore.token;
|
||||
const hasToken = userStore.token;
|
||||
|
||||
if (false) {
|
||||
if (hasToken) {
|
||||
// 用户登录
|
||||
if (to.path === '/login') {
|
||||
// 如果已登录,重定向到主页
|
||||
next({ path: '/' });
|
||||
} else {
|
||||
// 获取用户权限 store
|
||||
// const permissionStore = usePermissionStore();
|
||||
const permissionStore = usePermissionStore();
|
||||
// 确定用户是否已通过getInfo获得其权限角色
|
||||
// const hasRoles = userStore.roles && userStore.roles.length > 0;
|
||||
try {
|
||||
// // 路由添加进去了没有及时更新 需要重新进去一次拦截
|
||||
// if (!permissionStore.routes.length) {
|
||||
// // 获取权限列表进行接口访问 因为这里页面要切换权限
|
||||
// const accessRoutes = await permissionStore.generateRoutes(userStore.roles);
|
||||
// 路由添加进去了没有及时更新 需要重新进去一次拦截
|
||||
if (!permissionStore.routes.length) {
|
||||
// 获取权限列表进行接口访问 因为这里页面要切换权限
|
||||
const accessRoutes = await permissionStore.generateRoutes(userStore.roles);
|
||||
|
||||
// // 动态添加访问路由表
|
||||
// accessRoutes.forEach((item) => router.addRoute(item));
|
||||
// 动态添加访问路由表
|
||||
accessRoutes.forEach((item) => router.addRoute(item));
|
||||
|
||||
// // 这里相当于push到一个页面 不在进入路由拦截
|
||||
// next({ ...to, replace: true });
|
||||
// } else {
|
||||
// // 如果不传参数就会重新执行路由拦截,重新进到这里
|
||||
// next();
|
||||
// }
|
||||
next();
|
||||
// 这里相当于push到一个页面 不在进入路由拦截
|
||||
next({ ...to, replace: true });
|
||||
} else {
|
||||
// 如果不传参数就会重新执行路由拦截,重新进到这里
|
||||
next();
|
||||
}
|
||||
} catch (error) {
|
||||
next(`/login?redirect=${to.path}`);
|
||||
}
|
|
@ -0,0 +1,22 @@
|
|||
import { App, Directive } from 'vue';
|
||||
import auth from './modules/auth';
|
||||
|
||||
const directivesList: { [key: string]: Directive } = {
|
||||
auth,
|
||||
};
|
||||
|
||||
const directives = {
|
||||
install: function (app: App<Element>) {
|
||||
Object.keys(directivesList).forEach((key) => {
|
||||
app.directive(key, directivesList[key]);
|
||||
});
|
||||
},
|
||||
};
|
||||
|
||||
/**
|
||||
* 配置directives
|
||||
* @param app vue实例
|
||||
*/
|
||||
export function setupDirectives(app: App<Element>) {
|
||||
app.use(directives);
|
||||
}
|
|
@ -0,0 +1,27 @@
|
|||
import type { Directive, DirectiveBinding } from 'vue';
|
||||
import { useUserStore } from '@/store/modules/user';
|
||||
import { getAuthButtonsList } from '@/utils/routers';
|
||||
|
||||
/**
|
||||
* v-auth 按钮权限指令
|
||||
*/
|
||||
const auth: Directive = {
|
||||
mounted(el: HTMLElement, binding: DirectiveBinding) {
|
||||
const { value } = binding;
|
||||
|
||||
// 获取用户菜单权限
|
||||
const userStore = useUserStore();
|
||||
|
||||
// 用户按钮权限
|
||||
const currentPageRoles = getAuthButtonsList(userStore.menus, userStore.routeName);
|
||||
|
||||
if (value instanceof Array && value.length) {
|
||||
const hasPermission = value.every((item) => currentPageRoles.includes(item));
|
||||
if (!hasPermission) el.remove();
|
||||
} else {
|
||||
if (!currentPageRoles.includes(value)) el.remove();
|
||||
}
|
||||
},
|
||||
};
|
||||
|
||||
export default auth;
|
|
@ -0,0 +1,32 @@
|
|||
import { computed } from 'vue';
|
||||
import { useRoute } from 'vue-router';
|
||||
import { useUserStore } from '@/store/modules/user';
|
||||
import { getAuthButtonsList } from '@/utils/routers';
|
||||
|
||||
/**
|
||||
* 页面按钮权限
|
||||
*/
|
||||
export const useAuthButton = () => {
|
||||
// 获取用户菜单权限
|
||||
const userStore = useUserStore();
|
||||
|
||||
// 获取路由对象
|
||||
const route = useRoute();
|
||||
|
||||
// 用户按钮权限
|
||||
const authButtonsList = getAuthButtonsList(userStore.menus, route.path);
|
||||
|
||||
// 控制用户按钮权限显示和隐藏
|
||||
const authButtons = computed(() => {
|
||||
// 当前页面按钮权限
|
||||
const currentPageAuthButton: { [key: string]: boolean } = {};
|
||||
|
||||
authButtonsList.forEach((item) => (currentPageAuthButton[item] = true));
|
||||
|
||||
return currentPageAuthButton;
|
||||
});
|
||||
|
||||
return {
|
||||
authButtons,
|
||||
};
|
||||
};
|
|
@ -0,0 +1,206 @@
|
|||
import { computed, ref } from 'vue';
|
||||
|
||||
/**
|
||||
* 分页参数类型
|
||||
*/
|
||||
interface pageAbleType {
|
||||
total: number;
|
||||
page: number;
|
||||
rows: number;
|
||||
}
|
||||
|
||||
/**
|
||||
* 表格类型
|
||||
*/
|
||||
interface tableStateType {
|
||||
tableData: any[];
|
||||
pageAble: pageAbleType;
|
||||
searchParam: Record<string, any>;
|
||||
searchInitParam: Record<string, any>;
|
||||
totalParam: Record<string, any>;
|
||||
icon?: Record<string, any>;
|
||||
}
|
||||
|
||||
/**
|
||||
* useTable参数类型
|
||||
*/
|
||||
interface tableParamsType {
|
||||
/**
|
||||
* 获取表格数据 api 方法 (必传)
|
||||
*/
|
||||
api: (params: any) => Promise<any>;
|
||||
|
||||
/**
|
||||
* 获取数据初始化参数 (非必传,默认为{})
|
||||
*/
|
||||
initParam?: object;
|
||||
|
||||
/**
|
||||
* 是否有分页 (非必传,默认为true)
|
||||
*/
|
||||
isPageAble?: boolean;
|
||||
|
||||
/**
|
||||
* 对后台返回的数据进行处理的方法 (非必传)
|
||||
*/
|
||||
dataCallBack?: (data: any) => any;
|
||||
|
||||
/**
|
||||
* 异常处理方法 (非必传)
|
||||
*/
|
||||
requestError?: (error: any) => void;
|
||||
}
|
||||
|
||||
/**
|
||||
* table 页面操作方法封装
|
||||
* @param {tableParamsType} option 配置参数
|
||||
* @return 表格处理函数
|
||||
* */
|
||||
export const useTable = (option: tableParamsType) => {
|
||||
const { api, initParam, isPageAble = true, dataCallBack, requestError } = option;
|
||||
|
||||
// 表格数据对象
|
||||
const tableState = ref<tableStateType>({
|
||||
// 表格数据
|
||||
tableData: [],
|
||||
// 分页数据
|
||||
pageAble: {
|
||||
// 当前页数
|
||||
page: 1,
|
||||
// 每页显示条数
|
||||
rows: 10,
|
||||
// 总条数
|
||||
total: 0,
|
||||
},
|
||||
// 查询参数(只包括查询)
|
||||
searchParam: {},
|
||||
// 初始化默认的查询参数
|
||||
searchInitParam: {},
|
||||
// 总参数(包含分页和查询参数)
|
||||
totalParam: {},
|
||||
});
|
||||
|
||||
/**
|
||||
* 分页查询参数(只包括分页和表格字段排序,其他排序方式可自行配置)
|
||||
*/
|
||||
const pageParam = computed(() => ({
|
||||
page: tableState.value.pageAble.page,
|
||||
rows: tableState.value.pageAble.rows,
|
||||
}));
|
||||
|
||||
/**
|
||||
* 获取表格数据
|
||||
*/
|
||||
const getTableList = async () => {
|
||||
// 判断获取表格数据api方法是否存在
|
||||
if (!api) return;
|
||||
|
||||
try {
|
||||
// 先把初始化参数和分页参数放到总参数里面
|
||||
Object.assign(tableState.value.totalParam, initParam, isPageAble ? pageParam.value : {});
|
||||
|
||||
// 请求表格数据
|
||||
let { data } = await api({
|
||||
...tableState.value.searchInitParam,
|
||||
...tableState.value.totalParam,
|
||||
});
|
||||
|
||||
// 判断数据处理函数是否存在,并处理数据
|
||||
dataCallBack && (data = dataCallBack(data));
|
||||
|
||||
// 获取从后端返回的表格数据
|
||||
tableState.value.tableData = isPageAble ? data.records : data;
|
||||
|
||||
// 解构后台返回的分页数据 (如果有分页更新分页信息)
|
||||
const { current: page, size: rows, total } = data;
|
||||
isPageAble &&
|
||||
updatePageAble({ page: Number(page), rows: Number(rows), total: Number(total) });
|
||||
} catch (error) {
|
||||
requestError && requestError(error);
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* 更新分页信息
|
||||
* @param {pageAbleType} resPageAble 后台返回的分页数据
|
||||
* */
|
||||
const updatePageAble = (resPageAble: pageAbleType) => {
|
||||
Object.assign(tableState.value.pageAble, resPageAble);
|
||||
};
|
||||
|
||||
/**
|
||||
* 更新查询参数
|
||||
*/
|
||||
const updatedTotalParam = () => {
|
||||
// 清空上一次查询的参数
|
||||
tableState.value.totalParam = {};
|
||||
// 处理查询参数,可以给查询参数加自定义前缀操作
|
||||
const nowSearchParam: Record<string, any> = {};
|
||||
// 防止手动清空输入框携带参数(这里可以自定义查询参数前缀)
|
||||
for (const key in tableState.value.searchParam) {
|
||||
// 某些情况下参数为 false/0 也应该携带参数
|
||||
if (
|
||||
tableState.value.searchParam[key] ||
|
||||
tableState.value.searchParam[key] === false ||
|
||||
tableState.value.searchParam[key] === 0
|
||||
) {
|
||||
nowSearchParam[key] = tableState.value.searchParam[key];
|
||||
}
|
||||
}
|
||||
Object.assign(tableState.value.totalParam, nowSearchParam, isPageAble ? pageParam.value : {});
|
||||
};
|
||||
|
||||
/**
|
||||
* 表格数据查询
|
||||
*/
|
||||
const searchTable = async () => {
|
||||
// 重置分页数据
|
||||
tableState.value.pageAble.page = 1;
|
||||
updatedTotalParam();
|
||||
await getTableList();
|
||||
};
|
||||
|
||||
/**
|
||||
* 表格数据重置
|
||||
*/
|
||||
const resetTable = async () => {
|
||||
// 重置分页数据
|
||||
tableState.value.pageAble.page = 1;
|
||||
tableState.value.searchParam = {};
|
||||
// 重置搜索表单的时,如果有默认搜索参数,则重置默认的搜索参数
|
||||
Object.keys(tableState.value.searchInitParam).forEach((key) => {
|
||||
tableState.value.searchParam[key] = tableState.value.searchInitParam[key];
|
||||
});
|
||||
updatedTotalParam();
|
||||
await getTableList();
|
||||
};
|
||||
|
||||
/**
|
||||
* 每页条数改变
|
||||
* @param {Number} val 当前条数
|
||||
*/
|
||||
const tableChangeSize = async (val: number) => {
|
||||
tableState.value.pageAble.page = 1;
|
||||
tableState.value.pageAble.rows = val;
|
||||
await getTableList();
|
||||
};
|
||||
|
||||
/**
|
||||
* 当前页改变
|
||||
* @param {Number} val 当前页
|
||||
*/
|
||||
const tableChangeCurrent = async (val: number) => {
|
||||
tableState.value.pageAble.page = val;
|
||||
await getTableList();
|
||||
};
|
||||
|
||||
return {
|
||||
tableState,
|
||||
getTableList,
|
||||
updatedTotalParam,
|
||||
searchTable,
|
||||
resetTable,
|
||||
tableChangeSize,
|
||||
tableChangeCurrent,
|
||||
};
|
||||
};
|
|
@ -1,26 +1,160 @@
|
|||
import { ElMessage } from 'element-plus';
|
||||
import { computed } from 'vue';
|
||||
import { DEFAULT_THEMECOLOR } from '@/config';
|
||||
import { useSettingStore } from '@/store/modules/setting';
|
||||
import { headerTheme, menuTheme, sidebarTheme } from '@/styles/theme';
|
||||
import { getDarkColor, getLightColor } from '@/utils/color';
|
||||
|
||||
/**
|
||||
* @description: 全局主题设置
|
||||
* 主题类型
|
||||
*/
|
||||
export type ThemeType = 'light' | 'inverted' | 'dark';
|
||||
|
||||
/**
|
||||
* 灰色和弱色类型
|
||||
*/
|
||||
export type GreyOrWeakType = 'grey' | 'weak';
|
||||
|
||||
/**
|
||||
* 全局主题设置
|
||||
*/
|
||||
export const useTheme = () => {
|
||||
// 获取全局状态管理仓库中系统设置状态
|
||||
const settingStore = useSettingStore();
|
||||
const isDark = computed(() => settingStore.isDark);
|
||||
const themeConfig = computed(() => settingStore.themeConfig);
|
||||
|
||||
// 切换暗黑模式
|
||||
const switchDark = () => {
|
||||
const body = document.documentElement;
|
||||
|
||||
if (isDark.value) {
|
||||
if (themeConfig.value.isDark) {
|
||||
body.setAttribute('class', 'dark');
|
||||
} else {
|
||||
body.setAttribute('class', '');
|
||||
}
|
||||
|
||||
// 同时修改主题色、侧边栏、头部颜色
|
||||
changeThemeColor(themeConfig.value.themeColor);
|
||||
changeSideBarTheme();
|
||||
changeHeaderTheme();
|
||||
};
|
||||
|
||||
/**
|
||||
* 修改主题颜色
|
||||
* @param {string} val 主题色
|
||||
*/
|
||||
const changeThemeColor = (val: string | null) => {
|
||||
if (!val) {
|
||||
val = DEFAULT_THEMECOLOR;
|
||||
ElMessage({ type: 'success', message: `主题颜色已重置为 ${DEFAULT_THEMECOLOR}` });
|
||||
}
|
||||
// 计算主题颜色变化
|
||||
document.documentElement.style.setProperty('--el-color-primary', val);
|
||||
document.documentElement.style.setProperty(
|
||||
'--el-color-primary-dark-2',
|
||||
themeConfig.value.isDark ? `${getLightColor(val, 0.2)}` : `${getDarkColor(val, 0.3)}`
|
||||
);
|
||||
for (let i = 1; i <= 9; i++) {
|
||||
const primaryColor = themeConfig.value.isDark
|
||||
? `${getDarkColor(val, i / 10)}`
|
||||
: `${getLightColor(val, i / 10)}`;
|
||||
document.documentElement.style.setProperty(`--el-color-primary-light-${i}`, primaryColor);
|
||||
}
|
||||
settingStore.setThemeConfig('themeColor', val);
|
||||
};
|
||||
|
||||
/**
|
||||
* 灰色和弱色切换
|
||||
* @param {GreyOrWeakType} type 类型
|
||||
* @param {boolean} value 值
|
||||
*/
|
||||
const changeGreyOrWeak = (type: GreyOrWeakType, value: boolean) => {
|
||||
const body = document.body as HTMLElement;
|
||||
if (!value) return body.removeAttribute('style');
|
||||
const styles: Record<GreyOrWeakType, string> = {
|
||||
grey: 'filter: grayscale(1)',
|
||||
weak: 'filter: invert(80%)',
|
||||
};
|
||||
body.setAttribute('style', styles[type]);
|
||||
const propName = type === 'grey' ? 'isWeak' : 'isGrey';
|
||||
settingStore.setThemeConfig(propName, false);
|
||||
};
|
||||
|
||||
/**
|
||||
* 设置菜单样式
|
||||
*/
|
||||
const changeMenuTheme = () => {
|
||||
let type: ThemeType = 'light';
|
||||
|
||||
// 判断是否是暗黑主题
|
||||
if (themeConfig.value.isDark) {
|
||||
type = 'dark';
|
||||
}
|
||||
|
||||
const theme = menuTheme[type];
|
||||
// 遍历写入样式
|
||||
for (const [key, value] of Object.entries(theme)) {
|
||||
document.documentElement.style.setProperty(key, value);
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* 设置侧边栏样式
|
||||
*/
|
||||
const changeSideBarTheme = () => {
|
||||
let type: ThemeType = 'light';
|
||||
|
||||
// 判断是否是暗黑主题
|
||||
if (themeConfig.value.isDark) {
|
||||
type = 'dark';
|
||||
}
|
||||
|
||||
const theme = sidebarTheme[type];
|
||||
// 遍历写入样式
|
||||
for (const [key, value] of Object.entries(theme)) {
|
||||
document.documentElement.style.setProperty(key, value);
|
||||
}
|
||||
|
||||
changeMenuTheme();
|
||||
};
|
||||
|
||||
/**
|
||||
* 设置头部样式
|
||||
*/
|
||||
const changeHeaderTheme = () => {
|
||||
let type: ThemeType = 'light';
|
||||
|
||||
// 判断是否是暗黑主题
|
||||
if (themeConfig.value.isDark) {
|
||||
type = 'dark';
|
||||
}
|
||||
|
||||
const theme = headerTheme[type];
|
||||
// 遍历写入样式
|
||||
for (const [key, value] of Object.entries(theme)) {
|
||||
document.documentElement.style.setProperty(key, value);
|
||||
}
|
||||
|
||||
changeMenuTheme();
|
||||
};
|
||||
|
||||
// 初始化主题
|
||||
const initTheme = () => {
|
||||
switchDark();
|
||||
|
||||
// 判断是否是灰色模式
|
||||
if (themeConfig.value.isGrey) changeGreyOrWeak('grey', true);
|
||||
|
||||
// 判断是否色弱模式
|
||||
if (themeConfig.value.isWeak) changeGreyOrWeak('weak', true);
|
||||
};
|
||||
|
||||
return {
|
||||
switchDark,
|
||||
changeThemeColor,
|
||||
changeGreyOrWeak,
|
||||
initTheme,
|
||||
changeSideBarTheme,
|
||||
changeHeaderTheme,
|
||||
};
|
||||
};
|
||||
|
|
|
@ -1,40 +1,105 @@
|
|||
<template>
|
||||
<div class="header-left">
|
||||
<img class="logo" src="@/assets/imgs/logo.png" />
|
||||
<div class="left-title">
|
||||
<img class="logo" src="@/assets/images/logo.png" />
|
||||
<!-- <div class="left-title">
|
||||
<div class="title">船货信息智慧共享服务平台</div>
|
||||
<div class="text">Intelligent sharing service platform for ship and cargo information</div>
|
||||
</div>
|
||||
</div> -->
|
||||
</div>
|
||||
<div class="header-right">
|
||||
<div class="nav-item">
|
||||
<svg-icon icon="Home" className="icon"></svg-icon>
|
||||
<span>首页</span>
|
||||
<div
|
||||
class="nav-item"
|
||||
v-for="item in menuList"
|
||||
:key="item.path"
|
||||
:class="{ 'nav-item-active': activeMenu === item.path }"
|
||||
@click="onClickMenu(item)"
|
||||
>
|
||||
<svg-icon :icon="item.icon" className="icon"></svg-icon>
|
||||
<span>{{ item.title }}</span>
|
||||
</div>
|
||||
<div class="nav-item">
|
||||
<svg-icon icon="Notify" className="icon"></svg-icon>
|
||||
<span>公告</span>
|
||||
</div>
|
||||
<div class="nav-item">
|
||||
<svg-icon icon="API" className="icon"></svg-icon>
|
||||
<span>API</span>
|
||||
</div>
|
||||
<div class="nav-item">
|
||||
<svg-icon icon="Setting" className="icon"></svg-icon>
|
||||
<span>设置</span>
|
||||
</div>
|
||||
<div class="nav-item">
|
||||
<svg-icon icon="Help" className="icon"></svg-icon>
|
||||
<span>帮助</span>
|
||||
</div>
|
||||
<div class="nav-item">
|
||||
<div class="nav-item" @click="onClickLogout">
|
||||
<svg-icon icon="Logout" className="icon"></svg-icon>
|
||||
<span>退出</span>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script lang="ts" setup></script>
|
||||
<script lang="ts" setup>
|
||||
import { ElMessage, ElMessageBox } from 'element-plus';
|
||||
import { computed, ref } from 'vue';
|
||||
import { useRoute, useRouter } from 'vue-router';
|
||||
import { useUserStore } from '@/store/modules/user';
|
||||
|
||||
interface menuListType {
|
||||
path: string;
|
||||
title: string;
|
||||
icon: string;
|
||||
}
|
||||
|
||||
// 导航菜单
|
||||
const menuList = ref<menuListType[]>([
|
||||
{
|
||||
path: '/home',
|
||||
title: '首页',
|
||||
icon: 'Home',
|
||||
},
|
||||
{
|
||||
path: '/notice',
|
||||
title: '公告',
|
||||
icon: 'Notify',
|
||||
},
|
||||
{
|
||||
path: '/api',
|
||||
title: 'API',
|
||||
icon: 'API',
|
||||
},
|
||||
{
|
||||
path: '/enterprise/employee',
|
||||
title: '设置',
|
||||
icon: 'Setting',
|
||||
},
|
||||
{
|
||||
path: '/help',
|
||||
title: '帮助',
|
||||
icon: 'Help',
|
||||
},
|
||||
]);
|
||||
|
||||
// 获取路由实例
|
||||
const router = useRouter();
|
||||
|
||||
// 获取路由携带的参数和路径
|
||||
const route = useRoute();
|
||||
|
||||
// 默认激活菜单
|
||||
const activeMenu = computed(() => {
|
||||
const { path } = route;
|
||||
return path;
|
||||
});
|
||||
|
||||
// 切换菜单
|
||||
const onClickMenu = (item: menuListType) => {
|
||||
router.push(item.path);
|
||||
};
|
||||
|
||||
// store
|
||||
const userStore = useUserStore();
|
||||
|
||||
const onClickLogout = async () => {
|
||||
ElMessageBox.confirm('您是否确认退出登录?', '温馨提示', {
|
||||
confirmButtonText: '确定',
|
||||
cancelButtonText: '取消',
|
||||
type: 'warning',
|
||||
}).then(async () => {
|
||||
userStore.logout(true);
|
||||
|
||||
ElMessage({
|
||||
type: 'success',
|
||||
message: '退出登录成功!',
|
||||
});
|
||||
});
|
||||
};
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.header-left {
|
||||
|
@ -74,6 +139,9 @@
|
|||
margin-right: 6px;
|
||||
}
|
||||
}
|
||||
.nav-item-active {
|
||||
background-color: #555;
|
||||
}
|
||||
.nav-item:hover {
|
||||
background-color: rgb(109 0 14 / 100%);
|
||||
}
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
<template v-for="subItem in menuList" :key="subItem.path">
|
||||
<el-sub-menu v-if="subItem.children && subItem.children.length > 0" :index="subItem.path">
|
||||
<template #title>
|
||||
<el-icon v-if="subItem.meta.native">
|
||||
<el-icon v-if="subItem.meta?.native">
|
||||
<component :is="subItem.meta?.icon"></component>
|
||||
</el-icon>
|
||||
<svg-icon :icon="subItem.meta?.icon" className="side-icon" v-else></svg-icon>
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
<template>
|
||||
<div class="sidebar">
|
||||
<img class="side-logo" src="@/assets/imgs/logo.png" />
|
||||
<img class="side-logo" src="@/assets/images/logo.png" />
|
||||
<el-scrollbar>
|
||||
<el-menu :default-active="activeMenu" background-color="#333" text-color="#fff" router>
|
||||
<SubMenu :menuList="menuList"></SubMenu>
|
||||
|
|
|
@ -1,11 +1,13 @@
|
|||
import { createApp } from 'vue';
|
||||
import { setupDirectives } from '@/directives'; // 导入自定义指令
|
||||
import setupElementPlus from '@/plugins/element'; // 导入element plus
|
||||
import setupSvgIcons from '@/plugins/icons'; // 导入svg图标组件
|
||||
import { setupRouter } from '@/router';
|
||||
import { setupStore } from '@/store';
|
||||
import App from './App.vue';
|
||||
import './styles/index.scss'; // 全局css
|
||||
import './styles/index.scss'; // 导入默认样式
|
||||
import 'virtual:svg-icons-register'; // svg-icons注册导入
|
||||
import './config/permission'; // 导入路由鉴权-加载异步路由
|
||||
|
||||
function bootstrap() {
|
||||
// 创建实例
|
||||
|
@ -23,6 +25,9 @@ function bootstrap() {
|
|||
// 导入element和全局注册element 图标
|
||||
setupElementPlus(app);
|
||||
|
||||
// 导入自定义指令
|
||||
setupDirectives(app);
|
||||
|
||||
app.mount('#app');
|
||||
}
|
||||
|
||||
|
|
|
@ -1,6 +1,9 @@
|
|||
import { App } from 'vue';
|
||||
import SvgIcon from '@/components/SvgIcon/index.vue'; // svg图标组件
|
||||
|
||||
/**
|
||||
* 导入svg图标
|
||||
*/
|
||||
export default (app: App<Element>) => {
|
||||
app.component('svg-icon', SvgIcon);
|
||||
};
|
||||
|
|
|
@ -2,12 +2,56 @@ import { App } from 'vue';
|
|||
import { createRouter, createWebHashHistory, RouteRecordRaw } from 'vue-router';
|
||||
import Layout from '@/layouts/index.vue';
|
||||
import boatRoutes from './modules/boat';
|
||||
import enterpriseRoutes from './modules/enterprise';
|
||||
import historyRoutes from './modules/history';
|
||||
import manifestRoutes from './modules/manifest';
|
||||
import sendRoutes from './modules/send';
|
||||
import subscribeRoutes from './modules/subscribe';
|
||||
import subscriptionRoutes from './modules/subscription';
|
||||
|
||||
const routes: Array<RouteRecordRaw> = [
|
||||
/**
|
||||
* 异步路由组件
|
||||
*/
|
||||
export const asyncRoutes = [
|
||||
...boatRoutes,
|
||||
...manifestRoutes,
|
||||
...enterpriseRoutes,
|
||||
...sendRoutes,
|
||||
...subscriptionRoutes,
|
||||
...historyRoutes,
|
||||
];
|
||||
|
||||
/**
|
||||
* 公共路由
|
||||
* path ==> 路由路径
|
||||
* name ==> 路由名称
|
||||
* component ==> 路由组件
|
||||
* redirect ==> 路由重定向
|
||||
* alwaysShow ==> 如果设置为true,将始终显示根菜单,无论其子路由长度如何
|
||||
* hidden ==> 如果“hidden:true”不会显示在侧边栏中(默认值为false)
|
||||
* keepAlive ==> 设为true 缓存
|
||||
* meta ==> 路由元信息
|
||||
* meta.title ==> 路由标题
|
||||
* meta.icon ==> 菜单icon
|
||||
* meta.full ==> 菜单是否全屏 (示例:数据大屏页面)
|
||||
* meta.affix ==> 如果设置为true将会出现在 标签栏中
|
||||
* meta.breadcrumb ==> 如果设置为false,该项将隐藏在breadcrumb中(默认值为true)
|
||||
*/
|
||||
export const constantRoutes: Array<RouteRecordRaw> = [
|
||||
{
|
||||
path: '/login',
|
||||
name: 'Login',
|
||||
component: () => import('@/views/Login/index.vue'),
|
||||
},
|
||||
{
|
||||
path: '/404',
|
||||
name: '404',
|
||||
component: () => import('@/views/ErrorPages/404.vue'),
|
||||
},
|
||||
{
|
||||
path: '/403',
|
||||
name: '403',
|
||||
component: () => import('@/views/ErrorPages/403.vue'),
|
||||
},
|
||||
{
|
||||
path: '/',
|
||||
name: 'layout',
|
||||
|
@ -18,36 +62,51 @@ const routes: Array<RouteRecordRaw> = [
|
|||
path: '/home',
|
||||
name: 'home',
|
||||
component: () => import('@/views/Home/index.vue'),
|
||||
meta: { title: 'home', affix: true },
|
||||
meta: { title: '首页', affix: true },
|
||||
},
|
||||
{
|
||||
path: '/notify',
|
||||
name: 'notify',
|
||||
component: () => import('@/views/Notify/index.vue'),
|
||||
meta: { title: 'notify', affix: true },
|
||||
path: '/notice',
|
||||
name: 'Notice',
|
||||
component: () => import('@/views/Notice/index.vue'),
|
||||
meta: { title: '公告', roles: ['test2'] },
|
||||
},
|
||||
{
|
||||
path: '/resource',
|
||||
name: 'resource',
|
||||
component: () => import('@/views/Resource/index.vue'),
|
||||
meta: { title: 'resource', affix: true },
|
||||
path: '/api',
|
||||
name: 'Api',
|
||||
component: () => import('@/views/ApiManage/index.vue'),
|
||||
meta: { title: 'API', roles: ['test2'] },
|
||||
},
|
||||
{
|
||||
path: '/help',
|
||||
name: 'HelpCenter',
|
||||
component: () => import('@/views/Help/index.vue'),
|
||||
meta: { title: '帮助', roles: ['test2'] },
|
||||
},
|
||||
],
|
||||
},
|
||||
...boatRoutes,
|
||||
...manifestRoutes,
|
||||
...sendRoutes,
|
||||
...subscribeRoutes,
|
||||
...historyRoutes,
|
||||
];
|
||||
|
||||
// 创建一个可以被 Vue 应用程序使用的路由实例
|
||||
/**
|
||||
* notFoundRouter(找不到路由)
|
||||
*/
|
||||
export const notFoundRouter = {
|
||||
path: '/:pathMatch(.*)*',
|
||||
name: 'notFound',
|
||||
redirect: '/404',
|
||||
};
|
||||
|
||||
/**
|
||||
* 创建一个可以被 Vue 应用程序使用的路由实例
|
||||
*/
|
||||
export const router = createRouter({
|
||||
history: createWebHashHistory(),
|
||||
routes,
|
||||
routes: [...constantRoutes, ...asyncRoutes],
|
||||
});
|
||||
|
||||
// 配置路由器
|
||||
/**
|
||||
* 配置路由器
|
||||
* @param app vue实例
|
||||
*/
|
||||
export function setupRouter(app: App<Element>) {
|
||||
app.use(router);
|
||||
}
|
||||
|
|