feat: 初步完成

main
sankeyangshu 2024-11-20 16:33:02 +08:00
parent 654e3bde2f
commit 6602e58d19
200 changed files with 14014 additions and 1285 deletions

View File

@ -13,4 +13,4 @@ insert_final_newline = true # 始终在文件末尾插入一个新行
[*.md] # 表示仅 md 文件适用以下规则
max_line_length = off
trim_trailing_whitespace = false
trim_trailing_whitespace = false

17
.env 100644
View File

@ -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

11
.env.development 100644
View File

@ -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'

12
.env.production 100644
View File

@ -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

View File

@ -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',

View File

@ -1,4 +1,4 @@
#!/usr/bin/env sh
. "$(dirname -- "$0")/_/husky.sh"
npx --no-install commitlint --edit $1
npx --no-install commitlint --edit

9
.prettierignore 100644
View File

@ -0,0 +1,9 @@
/dist/*
.local
.output.js
/node_modules/**
**/*.svg
**/*.sh
/public/*

View File

@ -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: [

View File

@ -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
View File

@ -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)

51
build/getEnv.ts 100644
View File

@ -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);
}

View File

@ -0,0 +1,37 @@
/**
* gzipVite
* 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;
};

View File

@ -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),
];
};

View File

@ -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;
}

32
build/proxy.ts 100644
View File

@ -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;
}

View File

@ -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"
}
}

File diff suppressed because it is too large Load Diff

View File

@ -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>

View File

@ -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);
}

View File

@ -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);
}

View File

@ -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);
}

View File

@ -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);
}

View File

@ -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,
},
});
}

View File

@ -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);
}

View File

@ -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);
}

View File

@ -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',
}
);
}

View File

@ -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',
}
);
}

View File

@ -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);
}

View File

@ -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 });
}

View File

@ -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);
}

View File

@ -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);
}

View File

@ -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);
}

View File

@ -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);
}

View File

@ -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);
}

View File

@ -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);
}

View File

@ -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);
}

View File

@ -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);
}

View File

@ -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);
}

View File

@ -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);
}

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

Binary file not shown.

After

Width:  |  Height:  |  Size: 218 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 227 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.7 KiB

View File

@ -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

View File

Before

Width:  |  Height:  |  Size: 1.6 KiB

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 783 KiB

View File

@ -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

View File

@ -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>

View File

@ -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;
}

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -0,0 +1,4 @@
/**
*
*/
export const MENU_LIST = 'menuList';

View File

@ -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 = '';

View File

@ -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}`);
}

View File

@ -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);
}

View File

@ -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;

View File

@ -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,
};
};

View File

@ -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,
};
};

View File

@ -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,
};
};

View File

@ -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%);
}

View File

@ -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>

View File

@ -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>

View File

@ -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');
}

View File

@ -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);
};

View File

@ -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:truefalse
* keepAlive ==> true
* meta ==>
* meta.title ==>
* meta.icon ==> icon
* meta.full ==> ()
* meta.affix ==> true
* meta.breadcrumb ==> falsebreadcrumbtrue
*/
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);
}

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