first commit
16
.editorconfig
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
# http://editorconfig.org
|
||||||
|
root = true
|
||||||
|
|
||||||
|
[*]
|
||||||
|
indent_style = space
|
||||||
|
indent_size = 2
|
||||||
|
end_of_line = lf
|
||||||
|
charset = utf-8
|
||||||
|
trim_trailing_whitespace = true
|
||||||
|
insert_final_newline = true
|
||||||
|
|
||||||
|
[*.md]
|
||||||
|
trim_trailing_whitespace = false
|
||||||
|
|
||||||
|
[Makefile]
|
||||||
|
indent_style = tab
|
||||||
9
.eslintignore
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
/lambda/
|
||||||
|
/scripts
|
||||||
|
/config
|
||||||
|
.history
|
||||||
|
public
|
||||||
|
dist
|
||||||
|
.umi
|
||||||
|
mock
|
||||||
|
/node_modules
|
||||||
18
.eslintrc.js
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
module.exports = {
|
||||||
|
extends: [require.resolve('@umijs/fabric/dist/eslint')],
|
||||||
|
globals: {
|
||||||
|
ANT_DESIGN_PRO_ONLY_DO_NOT_USE_IN_YOUR_PRODUCTION: true,
|
||||||
|
page: true,
|
||||||
|
REACT_APP_ENV: true,
|
||||||
|
},
|
||||||
|
rules:{
|
||||||
|
"no-nested-ternary": 1,
|
||||||
|
"no-use-before-define":1,
|
||||||
|
"no-param-reassign":0,
|
||||||
|
"no-plusplus":0,
|
||||||
|
"eqeqeq":0,
|
||||||
|
"no-useless-escape":0,
|
||||||
|
"prefer-destructuring":0,
|
||||||
|
"no-lonely-if":0
|
||||||
|
}
|
||||||
|
};
|
||||||
40
.gitignore
vendored
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
|
||||||
|
|
||||||
|
# dependencies
|
||||||
|
# roadhog-api-doc ignore
|
||||||
|
/node_modules
|
||||||
|
/src/utils/request-temp.js
|
||||||
|
_roadhog-api-doc
|
||||||
|
|
||||||
|
# production
|
||||||
|
/dist
|
||||||
|
/.vscode
|
||||||
|
|
||||||
|
# misc
|
||||||
|
.DS_Store
|
||||||
|
npm-debug.log*
|
||||||
|
yarn-error.log
|
||||||
|
|
||||||
|
/coverage
|
||||||
|
.idea
|
||||||
|
yarn.lock
|
||||||
|
package-lock.json
|
||||||
|
*bak
|
||||||
|
.vscode
|
||||||
|
|
||||||
|
# visual studio code
|
||||||
|
.history
|
||||||
|
*.log
|
||||||
|
functions/*
|
||||||
|
.temp/**
|
||||||
|
|
||||||
|
# umi
|
||||||
|
.umi
|
||||||
|
.umi-production
|
||||||
|
|
||||||
|
# screenshot
|
||||||
|
screenshot
|
||||||
|
.firebase
|
||||||
|
.eslintcache
|
||||||
|
|
||||||
|
build
|
||||||
23
.prettierignore
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
**/*.svg
|
||||||
|
package.json
|
||||||
|
.umi
|
||||||
|
.umi-production
|
||||||
|
/dist
|
||||||
|
.dockerignore
|
||||||
|
.DS_Store
|
||||||
|
.eslintignore
|
||||||
|
*.png
|
||||||
|
*.toml
|
||||||
|
docker
|
||||||
|
.editorconfig
|
||||||
|
Dockerfile*
|
||||||
|
.gitignore
|
||||||
|
.prettierignore
|
||||||
|
LICENSE
|
||||||
|
.eslintcache
|
||||||
|
*.lock
|
||||||
|
yarn-error.log
|
||||||
|
.history
|
||||||
|
CNAME
|
||||||
|
/build
|
||||||
|
/public
|
||||||
5
.prettierrc.js
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
const fabric = require('@umijs/fabric');
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
...fabric.prettier,
|
||||||
|
};
|
||||||
5
.stylelintrc.js
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
const fabric = require('@umijs/fabric');
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
...fabric.stylelint,
|
||||||
|
};
|
||||||
1
.vercel/project.json
Normal file
@ -0,0 +1 @@
|
|||||||
|
{"projectName":"trae_cloud-platform_lsb2"}
|
||||||
187
README.md
Normal file
@ -0,0 +1,187 @@
|
|||||||
|
<!--
|
||||||
|
* @Author: your name
|
||||||
|
* @Date: 2022-04-29 09:23:27
|
||||||
|
* @LastEditTime: 2022-04-29 15:22:59
|
||||||
|
* @LastEditors: Please set LastEditors
|
||||||
|
* @Description: 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
|
||||||
|
* @FilePath: \cloud-platform\README.md
|
||||||
|
-->
|
||||||
|
|
||||||
|
# Ant Design Pro
|
||||||
|
|
||||||
|
This project is initialized with [Ant Design Pro](https://pro.ant.design). Follow is the quick guide for how to use.
|
||||||
|
|
||||||
|
## Environment Prepare
|
||||||
|
|
||||||
|
Install `node_modules`:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
npm install
|
||||||
|
```
|
||||||
|
|
||||||
|
or
|
||||||
|
|
||||||
|
```bash
|
||||||
|
yarn
|
||||||
|
```
|
||||||
|
|
||||||
|
## Provided Scripts
|
||||||
|
|
||||||
|
Ant Design Pro provides some useful script to help you quick start and build with web project, code style check and test.
|
||||||
|
|
||||||
|
Scripts provided in `package.json`. It's safe to modify or add additional script:
|
||||||
|
|
||||||
|
### Start project
|
||||||
|
|
||||||
|
```bash
|
||||||
|
npm start
|
||||||
|
```
|
||||||
|
|
||||||
|
### Build project
|
||||||
|
|
||||||
|
```bash
|
||||||
|
npm run build
|
||||||
|
```
|
||||||
|
|
||||||
|
### Check code style
|
||||||
|
|
||||||
|
```bash
|
||||||
|
npm run lint
|
||||||
|
```
|
||||||
|
|
||||||
|
You can also use script to auto fix some lint error:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
npm run lint:fix
|
||||||
|
```
|
||||||
|
|
||||||
|
### Test code
|
||||||
|
|
||||||
|
```bash
|
||||||
|
npm test
|
||||||
|
```
|
||||||
|
|
||||||
|
## More
|
||||||
|
|
||||||
|
You can view full document on our [official website](https://pro.ant.design). And welcome any feedback in our [github](https://github.com/ant-design/ant-design-pro).
|
||||||
|
|
||||||
|
# pages 页面文件
|
||||||
|
|
||||||
|
## accout 个人中心页面文件
|
||||||
|
|
||||||
|
-center 个人中心 -company 商户资料 -setting 信息设置
|
||||||
|
|
||||||
|
## basicManage 基础信息管理
|
||||||
|
|
||||||
|
-Brand 经营品牌管理 -BusniessTrade 经营业态管理 -Commdity 商品信息管理 -Merchats 商户信息管理 -Serverpart 服务区管理 -ServerpartShop 门店管理
|
||||||
|
|
||||||
|
## busniess 经营管理
|
||||||
|
|
||||||
|
-analysis 经营合同分析 -PaymentConfirm 商户欠款管理
|
||||||
|
|
||||||
|
## BussinessProject 经营项目管理
|
||||||
|
|
||||||
|
-list 列表 -detail 详情
|
||||||
|
|
||||||
|
## contract 合同管理
|
||||||
|
|
||||||
|
-list 列表
|
||||||
|
|
||||||
|
## DataVerification 数据校验
|
||||||
|
|
||||||
|
-list 列表
|
||||||
|
|
||||||
|
## merchantManagement 商家管理
|
||||||
|
|
||||||
|
-Workplace 商户工作台 -BusniessProInst 业务申请单 -commodity 商品管理 -BaseInfo 商户本地商品库 (商品云库) -Category 商户本地商品类别 -OnSale 商户在售商品 -Update 商品上架申请
|
||||||
|
|
||||||
|
-mobilePayment 移动支付管理 -bankArrival 银行到账
|
||||||
|
|
||||||
|
-reports 经营报表 -CommitySaleReport 单品报表 -RevenueSummary 门店营收报表 -SalesFlow 销售流水报表
|
||||||
|
|
||||||
|
-Shops 门店管理
|
||||||
|
|
||||||
|
-supplier 供应商管理 -Management 供应商基础信息 -Qualifications 供应商食品资质
|
||||||
|
|
||||||
|
## Setting 系统设置
|
||||||
|
|
||||||
|
-Module 菜单模块管理 -Roles 角色管理 -Users 账号管理 -UserType 账号部门管理
|
||||||
|
|
||||||
|
# 微应用改造
|
||||||
|
|
||||||
|
主要采用 qiankunjs 方案改造,因为 umijs 默认集成了 qiankunjs plugin,代码改动范围小。官网网址:https://umijs.org/docs/max/micro-frontend
|
||||||
|
|
||||||
|
## 主应用
|
||||||
|
|
||||||
|
### 启用 qiankun 插件
|
||||||
|
|
||||||
|
启用 qiankun 插件只需在 config.ts 中配置
|
||||||
|
|
||||||
|
```js
|
||||||
|
qiankun: {
|
||||||
|
master: {}
|
||||||
|
},
|
||||||
|
```
|
||||||
|
|
||||||
|
### 注册子应用
|
||||||
|
|
||||||
|
注册子应用只需在`src/app.ts`中按如下配置
|
||||||
|
|
||||||
|
```js
|
||||||
|
// 抛出qiankun插件配置
|
||||||
|
export const qiankun = {
|
||||||
|
apps: [
|
||||||
|
{
|
||||||
|
// 子应用唯一标识
|
||||||
|
name: 'merchantManagement',
|
||||||
|
// 子应用部署地址 env为development时可配置为本地地址
|
||||||
|
entry: '//dev.eshangtech.com:16060/merchantManagement/',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
};
|
||||||
|
```
|
||||||
|
|
||||||
|
### 挂载子应用
|
||||||
|
|
||||||
|
挂载子应用只需要在路由配置处将对应路由下的视图使用 microApp 关键字标记,值为子应用注册时的标识
|
||||||
|
|
||||||
|
```js
|
||||||
|
{
|
||||||
|
path: '/merchantManagement/*',
|
||||||
|
name: 'merchantManagement',
|
||||||
|
icon: 'UserOutlined',
|
||||||
|
hideInMenu: true,
|
||||||
|
microApp: 'merchantManagement',
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### 父子应用通信
|
||||||
|
|
||||||
|
父子应用间 state 天然隔离,所以需要在全局作用域下注册管理状态并且通过`useQiankunStateForSlave`共享给子应用全局状态采用 mobx 管理,详见`src/globalState.ts`。主应用可定制框架层的时间抛出给子应用使用,详见 `src/globalEvent`,后续可更具需要扩展使用。
|
||||||
|
|
||||||
|
## 子应用
|
||||||
|
|
||||||
|
子应用采用 umijs 技术栈,业务代码直接迁移至 src 下即可。
|
||||||
|
|
||||||
|
### 启用 qiankun 插件
|
||||||
|
|
||||||
|
```js
|
||||||
|
// .umirc.ts
|
||||||
|
qiankun: {
|
||||||
|
slave: {}
|
||||||
|
},
|
||||||
|
```
|
||||||
|
|
||||||
|
### 自定义子应用标识
|
||||||
|
|
||||||
|
子应用标识即为子应用仓库下`package.json`下的`name`属性。
|
||||||
|
|
||||||
|
### 全局状态绑定
|
||||||
|
|
||||||
|
子应用新增修饰器函数`src/hoc/globalConnect`,使用时:
|
||||||
|
|
||||||
|
```js
|
||||||
|
globalConnect(state1, state2)(ReactComponent);
|
||||||
|
```
|
||||||
|
|
||||||
|
即可将全局状态下的 state1,state2 挂载在 ReactComponent 的 props 上,全局事件`globalEvent`默认挂载在 props 上。
|
||||||
24
config/config.dev.ts
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
/*
|
||||||
|
* @Author: cclu 1106109051@qq.com
|
||||||
|
* @Date: 2021-12-13 11:01:23
|
||||||
|
* @LastEditors: cclu 1106109051@qq.com
|
||||||
|
* @LastEditTime: 2024-09-29 13:36:16
|
||||||
|
* @FilePath: \cloud-platform\config\config.dev.ts
|
||||||
|
* @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
|
||||||
|
*/
|
||||||
|
// https://umijs.org/config/
|
||||||
|
import { defineConfig } from 'umi';
|
||||||
|
|
||||||
|
export default defineConfig({
|
||||||
|
plugins: [
|
||||||
|
// https://github.com/zthxxx/react-dev-inspector
|
||||||
|
'react-dev-inspector/plugins/umi/react-inspector',
|
||||||
|
],
|
||||||
|
// https://github.com/zthxxx/react-dev-inspector#inspector-loader-props
|
||||||
|
inspectorConfig: {
|
||||||
|
exclude: [],
|
||||||
|
babelPlugins: [],
|
||||||
|
babelOptions: {},
|
||||||
|
},
|
||||||
|
// webpack5: {},
|
||||||
|
});
|
||||||
63
config/config.ts
Normal file
@ -0,0 +1,63 @@
|
|||||||
|
/*
|
||||||
|
* @Author: cclu
|
||||||
|
* @Date: 2021-12-13 11:01:23
|
||||||
|
* @LastEditors: cclu 1106109051@qq.com
|
||||||
|
* @LastEditTime: 2024-10-15 12:19:57
|
||||||
|
* @FilePath: \cloud-platform\config\config.ts
|
||||||
|
* @Description:
|
||||||
|
*
|
||||||
|
* Copyright (c) 2022 by cclu/杭州驿商科技, All Rights Reserved.
|
||||||
|
*/
|
||||||
|
// https://umijs.org/config/
|
||||||
|
import { defineConfig } from 'umi';
|
||||||
|
import defaultSettings from './defaultSettings';
|
||||||
|
import proxy from './proxy';
|
||||||
|
import routes from './routes';
|
||||||
|
|
||||||
|
const { REACT_APP_ENV } = process.env;
|
||||||
|
|
||||||
|
export default defineConfig({
|
||||||
|
hash: true,
|
||||||
|
mock: false,
|
||||||
|
antd: {},
|
||||||
|
dva: {
|
||||||
|
hmr: true
|
||||||
|
},
|
||||||
|
history: {
|
||||||
|
type: REACT_APP_ENV === 'dev' ? "hash" : "memory",
|
||||||
|
// type: "hash"
|
||||||
|
},
|
||||||
|
locale:
|
||||||
|
{
|
||||||
|
// default zh-CN
|
||||||
|
default: 'zh-CN',
|
||||||
|
antd: true,
|
||||||
|
// default true, when it is true, will use `navigator.language` overwrite default
|
||||||
|
baseNavigator: true,
|
||||||
|
},
|
||||||
|
dynamicImport: {
|
||||||
|
loading: '@/components/SmartLoading/index',
|
||||||
|
},
|
||||||
|
targets: {
|
||||||
|
ie: 11,
|
||||||
|
},
|
||||||
|
// umi routes: https://umijs.org/docs/routing
|
||||||
|
routes,
|
||||||
|
// Theme for antd: https://ant.design/docs/react/customize-theme-cn
|
||||||
|
theme: {
|
||||||
|
'primary-color': defaultSettings.primaryColor,
|
||||||
|
},
|
||||||
|
title: false,
|
||||||
|
ignoreMomentLocale: true,
|
||||||
|
proxy: proxy[REACT_APP_ENV || 'dev'],
|
||||||
|
base: '/cloud',
|
||||||
|
publicPath: '/cloud/',
|
||||||
|
// 快速刷新功能 https://umijs.org/config#fastrefresh
|
||||||
|
fastRefresh: {},
|
||||||
|
esbuild: {},
|
||||||
|
qiankun: {
|
||||||
|
master: {}
|
||||||
|
},
|
||||||
|
webpack5: {
|
||||||
|
},
|
||||||
|
});
|
||||||
49
config/defaultSettings.ts
Normal file
@ -0,0 +1,49 @@
|
|||||||
|
/*
|
||||||
|
* @Author: cclu
|
||||||
|
* @Date: 2021-12-13 11:01:23
|
||||||
|
* @LastEditors: cclu 1106109051@qq.com
|
||||||
|
* @LastEditTime: 2024-09-26 13:59:31
|
||||||
|
* @FilePath: \cloud-platform\config\defaultSettings.ts
|
||||||
|
* @Description:
|
||||||
|
*
|
||||||
|
* Copyright (c) 2022 by cclu/杭州驿商科技, All Rights Reserved.
|
||||||
|
*/
|
||||||
|
// 没有菜单的配置
|
||||||
|
import { Settings as ProSettings } from '@ant-design/pro-layout';
|
||||||
|
|
||||||
|
type DefaultSettings = Partial<ProSettings> & {
|
||||||
|
pwa: boolean;
|
||||||
|
};
|
||||||
|
/**关闭左侧菜单默认 设置 */
|
||||||
|
// const proSettings: DefaultSettings = {
|
||||||
|
// pwa: false,
|
||||||
|
// "navTheme": "dark",
|
||||||
|
// "primaryColor": "#1890ff",
|
||||||
|
// "layout": "side",
|
||||||
|
// "contentWidth": "Fluid",
|
||||||
|
// "fixedHeader": false,
|
||||||
|
// "fixSiderbar": false,
|
||||||
|
// "splitMenus": false,
|
||||||
|
// "headerRender": false,
|
||||||
|
// "footerRender": false,
|
||||||
|
// "menuRender": false,
|
||||||
|
// };
|
||||||
|
/**有左侧菜单的默认设置 */
|
||||||
|
const proSettings: DefaultSettings = {
|
||||||
|
navTheme: 'dark',
|
||||||
|
// 拂晓蓝
|
||||||
|
primaryColor: '#1890ff',
|
||||||
|
layout: 'side',
|
||||||
|
contentWidth: 'Fluid',
|
||||||
|
fixedHeader: true,
|
||||||
|
fixSiderbar: true,
|
||||||
|
colorWeak: false,
|
||||||
|
title: '彩云驿出行平台',
|
||||||
|
pwa: false,
|
||||||
|
// iconfontUrl: '//at.alicdn.com/t/font_2794551_djdgwbunsvg.js',
|
||||||
|
footerRender: false,
|
||||||
|
};
|
||||||
|
|
||||||
|
export type { DefaultSettings };
|
||||||
|
|
||||||
|
export default proSettings;
|
||||||
49
config/proxy.ts
Normal file
@ -0,0 +1,49 @@
|
|||||||
|
/*
|
||||||
|
* @Author: zzy 411037547@qq.com
|
||||||
|
* @Date: 2022-04-28 10:47:35
|
||||||
|
* @LastEditors: zzy 411037547@qq.com
|
||||||
|
* @LastEditTime: 2023-02-02 18:22:36
|
||||||
|
* @FilePath: \cloud-platform\config\proxy.ts
|
||||||
|
* @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* 在生产环境 代理是无法生效的,所以这里没有生产环境的配置
|
||||||
|
* -------------------------------
|
||||||
|
* The agent cannot take effect in the production environment
|
||||||
|
* so there is no configuration of the production environment
|
||||||
|
* For details, please see
|
||||||
|
* https://pro.ant.design/docs/deploy
|
||||||
|
*/
|
||||||
|
export default {
|
||||||
|
dev: {
|
||||||
|
'/EShangApiMain/': {
|
||||||
|
target: 'http://127.0.0.1:8900',
|
||||||
|
changeOrigin: true,
|
||||||
|
pathRewrite: { '^/EShangApiMain': '/EShangApiMain' },
|
||||||
|
},
|
||||||
|
'/Coop.Merchant/': {
|
||||||
|
target: 'https://user.eshangtech.com',
|
||||||
|
changeOrigin: true,
|
||||||
|
pathRewrite: { '^': '' },
|
||||||
|
},
|
||||||
|
'/EShangApiDashboard/': {
|
||||||
|
target: 'http://127.0.0.1:8900', // 'http://dev.eshangtech.com:8001',
|
||||||
|
changeOrigin: true,
|
||||||
|
pathRewrite: { '^/EShangApiDashboard': '/EShangApiDashboard' }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
test: {
|
||||||
|
'/api/': {
|
||||||
|
target: 'https://192.168.11.201:8081',
|
||||||
|
changeOrigin: true,
|
||||||
|
pathRewrite: { '^': '' },
|
||||||
|
},
|
||||||
|
},
|
||||||
|
pre: {
|
||||||
|
'/api/': {
|
||||||
|
target: 'your pre url',
|
||||||
|
changeOrigin: true,
|
||||||
|
pathRewrite: { '^': '' },
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
1935
config/routes.ts
Normal file
98
config/webpack.config.js
Normal file
@ -0,0 +1,98 @@
|
|||||||
|
import {
|
||||||
|
resolve
|
||||||
|
} from "path";
|
||||||
|
|
||||||
|
import ESLintWebpackPlugin from "eslint-webpack-plugin"; // 引入 ESLint 插件
|
||||||
|
import HtmlWebpackPlugin from "html-webpack-plugin"; // 引入 html-webpack-plugin 插件
|
||||||
|
|
||||||
|
export const entry = "./src/.umi/umi.ts";
|
||||||
|
export const output = {
|
||||||
|
// path: 文件输出目录,必须是绝对路径
|
||||||
|
// path.resolve()方法返回一个绝对路径
|
||||||
|
// __dirname 当前文件的文件夹绝对路径
|
||||||
|
path: undefined,
|
||||||
|
// filename: js文件输出文件名
|
||||||
|
filename: "js/umi.ts",
|
||||||
|
clean: true, // 自动将上次打包目录资源清空
|
||||||
|
};
|
||||||
|
export const module = {
|
||||||
|
rules: [{
|
||||||
|
// 用来匹配 .css 结尾的文件
|
||||||
|
test: /\.css$/,
|
||||||
|
// use 数组里面 Loader 执行顺序是从右到左
|
||||||
|
use: ["style-loader", "css-loader"],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
// 用来匹配.less结尾的文件
|
||||||
|
test: /\.less$/,
|
||||||
|
use: ["style-loader", "css-loader", "less-loader"],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
test: /\.s[ac]ss$/,
|
||||||
|
use: ["style-loader", "css-loader", "sass-loader"],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
// 用来匹配图片文件
|
||||||
|
test: /\.(png|jpe?g|gif|webp)$/,
|
||||||
|
type: "asset",
|
||||||
|
parser: {
|
||||||
|
dataUrlCondition: {
|
||||||
|
maxSize: 10 * 1024, // 小于10kb的图片会被base64处理
|
||||||
|
},
|
||||||
|
},
|
||||||
|
generator: {
|
||||||
|
// 将图片文件输出到 images 目录中
|
||||||
|
// 将图片文件命名 [hash:8][ext][query]
|
||||||
|
// [hash:8]: hash值取8位
|
||||||
|
// [ext]: 使用之前的文件扩展名
|
||||||
|
// [query]: 添加之前的query参数
|
||||||
|
filename: "images/[hash:8][ext][query]",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
test: /\.(ttf|woff2?|map4|map3|avi)$/,
|
||||||
|
type: "asset/resource",
|
||||||
|
generator: {
|
||||||
|
filename: "media/[hash:8][ext][query]", // 输出到media目录中
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
test: /\.m?js/,
|
||||||
|
resolve: {
|
||||||
|
fullySpecified: false,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
],
|
||||||
|
optimization: {
|
||||||
|
splitChunks: {
|
||||||
|
cacheGroups: {
|
||||||
|
vendors: {
|
||||||
|
priority: -10,
|
||||||
|
test: /[\\/]node_modules[\\/]/,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
chunks: 'async',
|
||||||
|
minSize: 30000,
|
||||||
|
minChunks: 1,
|
||||||
|
maxAsyncRequests: 5,
|
||||||
|
maxInitialRequests: 3,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
export const plugins = [
|
||||||
|
new ESLintWebpackPlugin({
|
||||||
|
// 指定检查文件的根目录
|
||||||
|
context: resolve(__dirname, "../src"),
|
||||||
|
}),
|
||||||
|
new HtmlWebpackPlugin({
|
||||||
|
// 以 public/index.html 为模板创建文件
|
||||||
|
// 新的html文件有两个特点:1. 内容和源文件一致 2. 自动引入打包生成的js等资源
|
||||||
|
template: resolve(__dirname, "../public/index.html"),
|
||||||
|
}),
|
||||||
|
];
|
||||||
|
export const devServer = {
|
||||||
|
host: "localhost",
|
||||||
|
port: "8888",
|
||||||
|
open: true, // 是否自动打开浏览器
|
||||||
|
};
|
||||||
|
export const mode = "development";
|
||||||
9
jest.config.js
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
module.exports = {
|
||||||
|
testURL: 'http://localhost:8000',
|
||||||
|
testEnvironment: './tests/PuppeteerEnvironment',
|
||||||
|
verbose: false,
|
||||||
|
globals: {
|
||||||
|
ANT_DESIGN_PRO_ONLY_DO_NOT_USE_IN_YOUR_PRODUCTION: false,
|
||||||
|
localStorage: null,
|
||||||
|
},
|
||||||
|
};
|
||||||
10
jsconfig.json
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
{
|
||||||
|
"compilerOptions": {
|
||||||
|
"emitDecoratorMetadata": true,
|
||||||
|
"experimentalDecorators": true,
|
||||||
|
"baseUrl": ".",
|
||||||
|
"paths": {
|
||||||
|
"@/*": ["./src/*"]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
171
mock/listTableList.ts
Normal file
@ -0,0 +1,171 @@
|
|||||||
|
// eslint-disable-next-line import/no-extraneous-dependencies
|
||||||
|
import { Request, Response } from 'express';
|
||||||
|
import { parse } from 'url';
|
||||||
|
import { TableListItem, TableListParams } from '@/pages/TableList/data';
|
||||||
|
|
||||||
|
// mock tableListDataSource
|
||||||
|
const genList = (current: number, pageSize: number) => {
|
||||||
|
const tableListDataSource: TableListItem[] = [];
|
||||||
|
|
||||||
|
for (let i = 0; i < pageSize; i += 1) {
|
||||||
|
const index = (current - 1) * 10 + i;
|
||||||
|
tableListDataSource.push({
|
||||||
|
key: index,
|
||||||
|
disabled: i % 6 === 0,
|
||||||
|
href: 'https://ant.design',
|
||||||
|
avatar: [
|
||||||
|
'https://gw.alipayobjects.com/zos/rmsportal/eeHMaZBwmTvLdIwMfBpg.png',
|
||||||
|
'https://gw.alipayobjects.com/zos/rmsportal/udxAbMEhpwthVVcjLXik.png',
|
||||||
|
][i % 2],
|
||||||
|
name: `TradeCode ${index}`,
|
||||||
|
owner: '曲丽丽',
|
||||||
|
desc: '这是一段描述',
|
||||||
|
callNo: Math.floor(Math.random() * 1000),
|
||||||
|
status: Math.floor(Math.random() * 10) % 4,
|
||||||
|
updatedAt: new Date(),
|
||||||
|
createdAt: new Date(),
|
||||||
|
progress: Math.ceil(Math.random() * 100),
|
||||||
|
});
|
||||||
|
}
|
||||||
|
tableListDataSource.reverse();
|
||||||
|
return tableListDataSource;
|
||||||
|
};
|
||||||
|
|
||||||
|
let tableListDataSource = genList(1, 100);
|
||||||
|
|
||||||
|
function getRule(req: Request, res: Response, u: string) {
|
||||||
|
let realUrl = u;
|
||||||
|
if (!realUrl || Object.prototype.toString.call(realUrl) !== '[object String]') {
|
||||||
|
realUrl = req.url;
|
||||||
|
}
|
||||||
|
const { current = 1, pageSize = 10 } = req.query;
|
||||||
|
const params = (parse(realUrl, true).query as unknown) as TableListParams;
|
||||||
|
|
||||||
|
let dataSource = [...tableListDataSource].slice(
|
||||||
|
((current as number) - 1) * (pageSize as number),
|
||||||
|
(current as number) * (pageSize as number),
|
||||||
|
);
|
||||||
|
const sorter = JSON.parse(params.sorter as any);
|
||||||
|
if (sorter) {
|
||||||
|
dataSource = dataSource.sort((prev, next) => {
|
||||||
|
let sortNumber = 0;
|
||||||
|
Object.keys(sorter).forEach((key) => {
|
||||||
|
if (sorter[key] === 'descend') {
|
||||||
|
if (prev[key] - next[key] > 0) {
|
||||||
|
sortNumber += -1;
|
||||||
|
} else {
|
||||||
|
sortNumber += 1;
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (prev[key] - next[key] > 0) {
|
||||||
|
sortNumber += 1;
|
||||||
|
} else {
|
||||||
|
sortNumber += -1;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
return sortNumber;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
if (params.filter) {
|
||||||
|
const filter = JSON.parse(params.filter as any) as {
|
||||||
|
[key: string]: string[];
|
||||||
|
};
|
||||||
|
if (Object.keys(filter).length > 0) {
|
||||||
|
dataSource = dataSource.filter((item) => {
|
||||||
|
return Object.keys(filter).some((key) => {
|
||||||
|
if (!filter[key]) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (filter[key].includes(`${item[key]}`)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (params.name) {
|
||||||
|
dataSource = dataSource.filter((data) => data.name.includes(params.name || ''));
|
||||||
|
}
|
||||||
|
const result = {
|
||||||
|
data: dataSource,
|
||||||
|
total: tableListDataSource.length,
|
||||||
|
success: true,
|
||||||
|
pageSize,
|
||||||
|
current: parseInt(`${params.currentPage}`, 10) || 1,
|
||||||
|
};
|
||||||
|
|
||||||
|
return res.json(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
function postRule(req: Request, res: Response, u: string, b: Request) {
|
||||||
|
let realUrl = u;
|
||||||
|
if (!realUrl || Object.prototype.toString.call(realUrl) !== '[object String]') {
|
||||||
|
realUrl = req.url;
|
||||||
|
}
|
||||||
|
|
||||||
|
const body = (b && b.body) || req.body;
|
||||||
|
const { method, name, desc, key } = body;
|
||||||
|
|
||||||
|
switch (method) {
|
||||||
|
/* eslint no-case-declarations:0 */
|
||||||
|
case 'delete':
|
||||||
|
tableListDataSource = tableListDataSource.filter((item) => key.indexOf(item.key) === -1);
|
||||||
|
break;
|
||||||
|
case 'post':
|
||||||
|
(() => {
|
||||||
|
const i = Math.ceil(Math.random() * 10000);
|
||||||
|
const newRule = {
|
||||||
|
key: tableListDataSource.length,
|
||||||
|
href: 'https://ant.design',
|
||||||
|
avatar: [
|
||||||
|
'https://gw.alipayobjects.com/zos/rmsportal/eeHMaZBwmTvLdIwMfBpg.png',
|
||||||
|
'https://gw.alipayobjects.com/zos/rmsportal/udxAbMEhpwthVVcjLXik.png',
|
||||||
|
][i % 2],
|
||||||
|
name,
|
||||||
|
owner: '曲丽丽',
|
||||||
|
desc,
|
||||||
|
callNo: Math.floor(Math.random() * 1000),
|
||||||
|
status: Math.floor(Math.random() * 10) % 2,
|
||||||
|
updatedAt: new Date(),
|
||||||
|
createdAt: new Date(),
|
||||||
|
progress: Math.ceil(Math.random() * 100),
|
||||||
|
};
|
||||||
|
tableListDataSource.unshift(newRule);
|
||||||
|
return res.json(newRule);
|
||||||
|
})();
|
||||||
|
return;
|
||||||
|
|
||||||
|
case 'update':
|
||||||
|
(() => {
|
||||||
|
let newRule = {};
|
||||||
|
tableListDataSource = tableListDataSource.map((item) => {
|
||||||
|
if (item.key === key) {
|
||||||
|
newRule = { ...item, desc, name };
|
||||||
|
return { ...item, desc, name };
|
||||||
|
}
|
||||||
|
return item;
|
||||||
|
});
|
||||||
|
return res.json(newRule);
|
||||||
|
})();
|
||||||
|
return;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
const result = {
|
||||||
|
list: tableListDataSource,
|
||||||
|
pagination: {
|
||||||
|
total: tableListDataSource.length,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
res.json(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
export default {
|
||||||
|
'GET /api/rule': getRule,
|
||||||
|
'POST /api/rule': postRule,
|
||||||
|
};
|
||||||
105
mock/notices.ts
Normal file
@ -0,0 +1,105 @@
|
|||||||
|
import { Request, Response } from 'express';
|
||||||
|
|
||||||
|
const getNotices = (req: Request, res: Response) => {
|
||||||
|
res.json([
|
||||||
|
{
|
||||||
|
id: '000000001',
|
||||||
|
avatar: 'https://gw.alipayobjects.com/zos/rmsportal/ThXAXghbEsBCCSDihZxY.png',
|
||||||
|
title: '你收到了 14 份新周报',
|
||||||
|
datetime: '2017-08-09',
|
||||||
|
type: 'notification',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: '000000002',
|
||||||
|
avatar: 'https://gw.alipayobjects.com/zos/rmsportal/OKJXDXrmkNshAMvwtvhu.png',
|
||||||
|
title: '你推荐的 曲妮妮 已通过第三轮面试',
|
||||||
|
datetime: '2017-08-08',
|
||||||
|
type: 'notification',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: '000000003',
|
||||||
|
avatar: 'https://gw.alipayobjects.com/zos/rmsportal/kISTdvpyTAhtGxpovNWd.png',
|
||||||
|
title: '这种模板可以区分多种通知类型',
|
||||||
|
datetime: '2017-08-07',
|
||||||
|
read: true,
|
||||||
|
type: 'notification',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: '000000004',
|
||||||
|
avatar: 'https://gw.alipayobjects.com/zos/rmsportal/GvqBnKhFgObvnSGkDsje.png',
|
||||||
|
title: '左侧图标用于区分不同的类型',
|
||||||
|
datetime: '2017-08-07',
|
||||||
|
type: 'notification',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: '000000005',
|
||||||
|
avatar: 'https://gw.alipayobjects.com/zos/rmsportal/ThXAXghbEsBCCSDihZxY.png',
|
||||||
|
title: '内容不要超过两行字,超出时自动截断',
|
||||||
|
datetime: '2017-08-07',
|
||||||
|
type: 'notification',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: '000000006',
|
||||||
|
avatar: 'https://gw.alipayobjects.com/zos/rmsportal/fcHMVNCjPOsbUGdEduuv.jpeg',
|
||||||
|
title: '曲丽丽 评论了你',
|
||||||
|
description: '描述信息描述信息描述信息',
|
||||||
|
datetime: '2017-08-07',
|
||||||
|
type: 'message',
|
||||||
|
clickClose: true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: '000000007',
|
||||||
|
avatar: 'https://gw.alipayobjects.com/zos/rmsportal/fcHMVNCjPOsbUGdEduuv.jpeg',
|
||||||
|
title: '朱偏右 回复了你',
|
||||||
|
description: '这种模板用于提醒谁与你发生了互动,左侧放『谁』的头像',
|
||||||
|
datetime: '2017-08-07',
|
||||||
|
type: 'message',
|
||||||
|
clickClose: true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: '000000008',
|
||||||
|
avatar: 'https://gw.alipayobjects.com/zos/rmsportal/fcHMVNCjPOsbUGdEduuv.jpeg',
|
||||||
|
title: '标题',
|
||||||
|
description: '这种模板用于提醒谁与你发生了互动,左侧放『谁』的头像',
|
||||||
|
datetime: '2017-08-07',
|
||||||
|
type: 'message',
|
||||||
|
clickClose: true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: '000000009',
|
||||||
|
title: '任务名称',
|
||||||
|
description: '任务需要在 2017-01-12 20:00 前启动',
|
||||||
|
extra: '未开始',
|
||||||
|
status: 'todo',
|
||||||
|
type: 'event',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: '000000010',
|
||||||
|
title: '第三方紧急代码变更',
|
||||||
|
description: '冠霖提交于 2017-01-06,需在 2017-01-07 前完成代码变更任务',
|
||||||
|
extra: '马上到期',
|
||||||
|
status: 'urgent',
|
||||||
|
type: 'event',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: '000000011',
|
||||||
|
title: '信息安全考试',
|
||||||
|
description: '指派竹尔于 2017-01-09 前完成更新并发布',
|
||||||
|
extra: '已耗时 8 天',
|
||||||
|
status: 'doing',
|
||||||
|
type: 'event',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: '000000012',
|
||||||
|
title: 'ABCD 版本发布',
|
||||||
|
description: '冠霖提交于 2017-01-06,需在 2017-01-07 前完成代码变更任务',
|
||||||
|
extra: '进行中',
|
||||||
|
status: 'processing',
|
||||||
|
type: 'event',
|
||||||
|
},
|
||||||
|
]);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default {
|
||||||
|
'GET /api/notices': getNotices,
|
||||||
|
};
|
||||||
5
mock/route.ts
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
export default {
|
||||||
|
'/api/auth_routes': {
|
||||||
|
'/form/advanced-form': { authority: ['admin', 'user'] },
|
||||||
|
},
|
||||||
|
};
|
||||||
165
mock/user.ts
Normal file
@ -0,0 +1,165 @@
|
|||||||
|
import { Request, Response } from 'express';
|
||||||
|
|
||||||
|
const waitTime = (time: number = 100) => {
|
||||||
|
return new Promise((resolve) => {
|
||||||
|
setTimeout(() => {
|
||||||
|
resolve(true);
|
||||||
|
}, time);
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
async function getFakeCaptcha(req: Request, res: Response) {
|
||||||
|
await waitTime(2000);
|
||||||
|
return res.json('captcha-xxx');
|
||||||
|
}
|
||||||
|
|
||||||
|
// 代码中会兼容本地 service mock 以及部署站点的静态数据
|
||||||
|
export default {
|
||||||
|
// 支持值为 Object 和 Array
|
||||||
|
'GET /api/currentUser': {
|
||||||
|
name: 'Serati Ma',
|
||||||
|
avatar: 'https://gw.alipayobjects.com/zos/antfincdn/XAosXuNZyF/BiazfanxmamNRoxxVxka.png',
|
||||||
|
userid: '00000001',
|
||||||
|
email: 'antdesign@alipay.com',
|
||||||
|
signature: '海纳百川,有容乃大',
|
||||||
|
title: '交互专家',
|
||||||
|
group: '蚂蚁集团-某某某事业群-某某平台部-某某技术部-UED',
|
||||||
|
tags: [
|
||||||
|
{
|
||||||
|
key: '0',
|
||||||
|
label: '很有想法的',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
key: '1',
|
||||||
|
label: '专注设计',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
key: '2',
|
||||||
|
label: '辣~',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
key: '3',
|
||||||
|
label: '大长腿',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
key: '4',
|
||||||
|
label: '川妹子',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
key: '5',
|
||||||
|
label: '海纳百川',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
notifyCount: 12,
|
||||||
|
unreadCount: 11,
|
||||||
|
country: 'China',
|
||||||
|
geographic: {
|
||||||
|
province: {
|
||||||
|
label: '浙江省',
|
||||||
|
key: '330000',
|
||||||
|
},
|
||||||
|
city: {
|
||||||
|
label: '杭州市',
|
||||||
|
key: '330100',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
address: '西湖区工专路 77 号',
|
||||||
|
phone: '0752-268888888',
|
||||||
|
},
|
||||||
|
// GET POST 可省略
|
||||||
|
'GET /api/users': [
|
||||||
|
{
|
||||||
|
key: '1',
|
||||||
|
name: 'John Brown',
|
||||||
|
age: 32,
|
||||||
|
address: 'New York No. 1 Lake Park',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
key: '2',
|
||||||
|
name: 'Jim Green',
|
||||||
|
age: 42,
|
||||||
|
address: 'London No. 1 Lake Park',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
key: '3',
|
||||||
|
name: 'Joe Black',
|
||||||
|
age: 32,
|
||||||
|
address: 'Sidney No. 1 Lake Park',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
'POST /api/login/account': async (req: Request, res: Response) => {
|
||||||
|
const { password, userName, type } = req.body;
|
||||||
|
await waitTime(2000);
|
||||||
|
if (password === 'ant.design' && userName === 'admin') {
|
||||||
|
res.send({
|
||||||
|
status: 'ok',
|
||||||
|
type,
|
||||||
|
currentAuthority: 'admin',
|
||||||
|
});
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (password === 'ant.design' && userName === 'user') {
|
||||||
|
res.send({
|
||||||
|
status: 'ok',
|
||||||
|
type,
|
||||||
|
currentAuthority: 'user',
|
||||||
|
});
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (type === 'mobile') {
|
||||||
|
res.send({
|
||||||
|
status: 'ok',
|
||||||
|
type,
|
||||||
|
currentAuthority: 'admin',
|
||||||
|
});
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
res.send({
|
||||||
|
status: 'error',
|
||||||
|
type,
|
||||||
|
currentAuthority: 'guest',
|
||||||
|
});
|
||||||
|
},
|
||||||
|
'POST /api/register': (req: Request, res: Response) => {
|
||||||
|
res.send({ status: 'ok', currentAuthority: 'user' });
|
||||||
|
},
|
||||||
|
'GET /api/500': (req: Request, res: Response) => {
|
||||||
|
res.status(500).send({
|
||||||
|
timestamp: 1513932555104,
|
||||||
|
status: 500,
|
||||||
|
error: 'error',
|
||||||
|
message: 'error',
|
||||||
|
path: '/base/category/list',
|
||||||
|
});
|
||||||
|
},
|
||||||
|
'GET /api/404': (req: Request, res: Response) => {
|
||||||
|
res.status(404).send({
|
||||||
|
timestamp: 1513932643431,
|
||||||
|
status: 404,
|
||||||
|
error: 'Not Found',
|
||||||
|
message: 'No message available',
|
||||||
|
path: '/base/category/list/2121212',
|
||||||
|
});
|
||||||
|
},
|
||||||
|
'GET /api/403': (req: Request, res: Response) => {
|
||||||
|
res.status(403).send({
|
||||||
|
timestamp: 1513932555104,
|
||||||
|
status: 403,
|
||||||
|
error: 'Unauthorized',
|
||||||
|
message: 'Unauthorized',
|
||||||
|
path: '/base/category/list',
|
||||||
|
});
|
||||||
|
},
|
||||||
|
'GET /api/401': (req: Request, res: Response) => {
|
||||||
|
res.status(401).send({
|
||||||
|
timestamp: 1513932555104,
|
||||||
|
status: 401,
|
||||||
|
error: 'Unauthorized',
|
||||||
|
message: 'Unauthorized',
|
||||||
|
path: '/base/category/list',
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
'GET /api/login/captcha': getFakeCaptcha,
|
||||||
|
};
|
||||||
145
package.json
Normal file
@ -0,0 +1,145 @@
|
|||||||
|
{
|
||||||
|
"name": "ant-design-pro",
|
||||||
|
"version": "4.5.55",
|
||||||
|
"private": true,
|
||||||
|
"description": "An out-of-box UI solution for enterprise applications",
|
||||||
|
"scripts": {
|
||||||
|
"analyze": "cross-env ANALYZE=1 umi build",
|
||||||
|
"build": "node script/writeVersion.js && umi build",
|
||||||
|
"deploy": "npm run site && npm run gh-pages",
|
||||||
|
"dev": "npm run start:dev",
|
||||||
|
"fetch:blocks": "pro fetch-blocks && npm run prettier",
|
||||||
|
"gh-pages": "gh-pages -d dist",
|
||||||
|
"i18n-remove": "pro i18n-remove --locale=zh-CN --write",
|
||||||
|
"postinstall": "umi g tmp",
|
||||||
|
"lint": "umi g tmp && npm run lint:js && npm run lint:style && npm run lint:prettier",
|
||||||
|
"lint-staged:js": "eslint --ext .js,.jsx,.ts,.tsx ",
|
||||||
|
"lint:fix": "eslint --fix --cache --ext .js,.jsx,.ts,.tsx --format=pretty ./src && npm run lint:style",
|
||||||
|
"lint:js": "eslint --cache --ext .js,.jsx,.ts,.tsx --format=pretty ./src",
|
||||||
|
"lint:prettier": "prettier --check \"src/**/*\" --end-of-line auto",
|
||||||
|
"lint:style": "stylelint --fix \"src/**/*.less\" --syntax less",
|
||||||
|
"prettier": "prettier -c --write \"src/**/*\"",
|
||||||
|
"start": "set NODE_OPTIONS=--max-old-space-size=8192 && umi dev",
|
||||||
|
"start:dev": "cross-env REACT_APP_ENV=dev MOCK=none UMI_ENV=dev umi dev",
|
||||||
|
"start:no-mock": "cross-env MOCK=none UMI_ENV=dev umi dev",
|
||||||
|
"start:no-ui": "cross-env UMI_UI=none UMI_ENV=dev umi dev",
|
||||||
|
"start:pre": "cross-env REACT_APP_ENV=pre UMI_ENV=dev umi dev",
|
||||||
|
"start:test": "cross-env REACT_APP_ENV=test MOCK=none UMI_ENV=dev umi dev",
|
||||||
|
"pretest": "node ./tests/beforeTest",
|
||||||
|
"test": "umi test",
|
||||||
|
"test:all": "node ./tests/run-tests.js",
|
||||||
|
"test:component": "umi test ./src/components",
|
||||||
|
"tsc": "tsc --noEmit",
|
||||||
|
"serve": "umi-serve",
|
||||||
|
"fix-memory-limit": "cross-env LIMIT=100000 increase-memory-limit"
|
||||||
|
},
|
||||||
|
"lint-staged": {
|
||||||
|
"**/*.less": "stylelint --syntax less",
|
||||||
|
"**/*.{js,jsx,ts,tsx}": "npm run lint-staged:js",
|
||||||
|
"**/*.{js,jsx,tsx,ts,less,md,json}": [
|
||||||
|
"prettier --write"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"browserslist": [
|
||||||
|
"> 1%",
|
||||||
|
"last 2 versions",
|
||||||
|
"not ie <= 10"
|
||||||
|
],
|
||||||
|
"dependencies": {
|
||||||
|
"@ant-design/charts": "^1.3.4",
|
||||||
|
"@ant-design/icons": "^5.3.1",
|
||||||
|
"@ant-design/pro-descriptions": "^1.2.0",
|
||||||
|
"@ant-design/pro-field": "^1.31.13",
|
||||||
|
"@ant-design/pro-form": "^1.3.0",
|
||||||
|
"@ant-design/pro-layout": "^6.9.0",
|
||||||
|
"@ant-design/pro-list": "^1.21.44",
|
||||||
|
"@ant-design/pro-table": "^2.60.0",
|
||||||
|
"@ant-design/pro-utils": "^1.32.6",
|
||||||
|
"@antv/l7": "^2.22.1",
|
||||||
|
"@antv/l7-maps": "^2.22.1",
|
||||||
|
"@antv/s2": "^1.49.2",
|
||||||
|
"@antv/s2-react": "^1.30.0",
|
||||||
|
"@antv/scale": "^0.4.16",
|
||||||
|
"@umijs/route-utils": "^1.0.33",
|
||||||
|
"ahooks": "^2.10.3",
|
||||||
|
"antd": "^4.17.0",
|
||||||
|
"aws-sdk": "^2.1692.0",
|
||||||
|
"classnames": "^2.2.6",
|
||||||
|
"compression-webpack-plugin": "^11.1.0",
|
||||||
|
"crypto-js": "^4.1.1",
|
||||||
|
"eslint-webpack-plugin": "^4.2.0",
|
||||||
|
"exceljs": "^4.4.0",
|
||||||
|
"html-webpack-plugin": "^5.6.0",
|
||||||
|
"increase-memory-limit": "^1.0.7",
|
||||||
|
"insert-css": "^2.0.0",
|
||||||
|
"js-export-excel": "^1.1.4",
|
||||||
|
"lodash": "^4.17.11",
|
||||||
|
"marked": "^4.2.12",
|
||||||
|
"mobx": "^6.7.0",
|
||||||
|
"moment": "^2.25.3",
|
||||||
|
"omit.js": "^2.0.2",
|
||||||
|
"package": "^1.0.1",
|
||||||
|
"react": "^17.0.2",
|
||||||
|
"react-countup": "^6.4.2",
|
||||||
|
"react-dev-inspector": "^1.1.1",
|
||||||
|
"react-dom": "^17.0.2",
|
||||||
|
"react-draggable": "^4.4.5",
|
||||||
|
"react-helmet-async": "^1.0.4",
|
||||||
|
"react-html-table-to-excel": "^2.0.0",
|
||||||
|
"react-to-print": "^2.14.4",
|
||||||
|
"umi": "^3.5.41",
|
||||||
|
"umi-plugin-keep-alive": "^0.0.1-beta.35",
|
||||||
|
"umi-request": "^1.0.8",
|
||||||
|
"wp2vite": "^2.0.9",
|
||||||
|
"xlsx": "^0.18.5",
|
||||||
|
"xlsx-style": "^0.8.13"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"@ant-design/pro-card": "^1.14.18",
|
||||||
|
"@ant-design/pro-cli": "^1.0.28",
|
||||||
|
"@types/classnames": "^2.2.7",
|
||||||
|
"@types/express": "^4.17.0",
|
||||||
|
"@types/history": "^4.7.2",
|
||||||
|
"@types/insert-css": "^2.0.1",
|
||||||
|
"@types/jest": "^26.0.0",
|
||||||
|
"@types/lodash": "^4.14.144",
|
||||||
|
"@types/react": "^17.0.0",
|
||||||
|
"@types/react-dom": "^17.0.0",
|
||||||
|
"@types/react-helmet": "^6.1.0",
|
||||||
|
"@umijs/fabric": "^2.5.1",
|
||||||
|
"@umijs/plugin-blocks": "^2.0.5",
|
||||||
|
"@umijs/plugin-esbuild": "^1.4.0",
|
||||||
|
"@umijs/plugin-qiankun": "^2.44.1",
|
||||||
|
"@umijs/preset-ant-design-pro": "^1.2.0",
|
||||||
|
"@umijs/preset-react": "^1.4.8",
|
||||||
|
"@umijs/yorkie": "^2.0.3",
|
||||||
|
"carlo": "^0.9.46",
|
||||||
|
"chalk": "^4.0.0",
|
||||||
|
"cross-env": "^7.0.3",
|
||||||
|
"cross-port-killer": "^1.1.1",
|
||||||
|
"detect-installer": "^1.0.1",
|
||||||
|
"enzyme": "^3.11.0",
|
||||||
|
"eslint": "^7.1.0",
|
||||||
|
"express": "^4.17.1",
|
||||||
|
"gh-pages": "^3.0.0",
|
||||||
|
"jsdom-global": "^3.0.2",
|
||||||
|
"lint-staged": "^10.0.0",
|
||||||
|
"mockjs": "^1.0.1-beta3",
|
||||||
|
"numeral": "^2.0.6",
|
||||||
|
"prettier": "^2.0.1",
|
||||||
|
"puppeteer-core": "^8.0.0",
|
||||||
|
"stylelint": "^13.0.0",
|
||||||
|
"typescript": "^4.0.3",
|
||||||
|
"umi-serve": "^1.9.10"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">=10.0.0"
|
||||||
|
},
|
||||||
|
"checkFiles": [
|
||||||
|
"src/**/*.js*",
|
||||||
|
"src/**/*.ts*",
|
||||||
|
"src/**/*.less",
|
||||||
|
"config/**/*.js*",
|
||||||
|
"scripts/**/*.js"
|
||||||
|
]
|
||||||
|
}
|
||||||
1
public/CNAME
Normal file
@ -0,0 +1 @@
|
|||||||
|
preview.pro.ant.design
|
||||||
BIN
public/favicon.ico
Normal file
|
After Width: | Height: | Size: 29 KiB |
BIN
public/home_bg.png
Normal file
|
After Width: | Height: | Size: 199 KiB |
BIN
public/icons/icon-128x128.png
Normal file
|
After Width: | Height: | Size: 1.3 KiB |
BIN
public/icons/icon-192x192.png
Normal file
|
After Width: | Height: | Size: 1.8 KiB |
BIN
public/icons/icon-512x512.png
Normal file
|
After Width: | Height: | Size: 5.0 KiB |
BIN
public/logo.png
Normal file
|
After Width: | Height: | Size: 1.4 KiB |
5
public/pro_icon.svg
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
<svg width="42" height="42" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<g>
|
||||||
|
<path fill="#070707" d="m6.717392,13.773912l5.6,0c2.8,0 4.7,1.9 4.7,4.7c0,2.8 -2,4.7 -4.9,4.7l-2.5,0l0,4.3l-2.9,0l0,-13.7zm2.9,2.2l0,4.9l1.9,0c1.6,0 2.6,-0.9 2.6,-2.4c0,-1.6 -0.9,-2.4 -2.6,-2.4l-1.9,0l0,-0.1zm8.9,11.5l2.7,0l0,-5.7c0,-1.4 0.8,-2.3 2.2,-2.3c0.4,0 0.8,0.1 1,0.2l0,-2.4c-0.2,-0.1 -0.5,-0.1 -0.8,-0.1c-1.2,0 -2.1,0.7 -2.4,2l-0.1,0l0,-1.9l-2.7,0l0,10.2l0.1,0zm11.7,0.1c-3.1,0 -5,-2 -5,-5.3c0,-3.3 2,-5.3 5,-5.3s5,2 5,5.3c0,3.4 -1.9,5.3 -5,5.3zm0,-2.1c1.4,0 2.2,-1.1 2.2,-3.2c0,-2 -0.8,-3.2 -2.2,-3.2c-1.4,0 -2.2,1.2 -2.2,3.2c0,2.1 0.8,3.2 2.2,3.2z" class="st0" id="Ant-Design-Pro"/>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 677 B |
6
public/static/uploadPhoto/README.md
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
|
||||||
|
# #平台文件凭证上传
|
||||||
|
|
||||||
|
# 基础框架 vue3 + elementplus + axios
|
||||||
|
|
||||||
|
# 资源都是在线引用的早期版本 如在线版本已无法引用 则引用本地文件
|
||||||
1
public/static/uploadPhoto/css/element-plus.css
Normal file
104
public/static/uploadPhoto/css/index.css
Normal file
@ -0,0 +1,104 @@
|
|||||||
|
/*@charset "utf-8";*/
|
||||||
|
/*@import url("https://unpkg.com/element-plus/dist/index.css");*/
|
||||||
|
@import url('./element-plus.css');
|
||||||
|
* {
|
||||||
|
box-sizing: border-box;
|
||||||
|
}
|
||||||
|
.upload-content {
|
||||||
|
width: 100%;
|
||||||
|
/*height: 686px;*/
|
||||||
|
/*padding: 10px 24px 0 24px;*/
|
||||||
|
}
|
||||||
|
|
||||||
|
.upload-body {
|
||||||
|
clear: both;
|
||||||
|
/*padding-bottom: 20px;*/
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
.form-container {
|
||||||
|
display: inline-flex;
|
||||||
|
float: right;
|
||||||
|
align-items: center;
|
||||||
|
|
||||||
|
justify-content: space-between;
|
||||||
|
clear: right;
|
||||||
|
width: 430px;
|
||||||
|
}
|
||||||
|
.input-label {
|
||||||
|
font-size: 14px;
|
||||||
|
width: 72px;
|
||||||
|
text-align: right;
|
||||||
|
}
|
||||||
|
|
||||||
|
.el-upload-list {
|
||||||
|
display: inline-flex;
|
||||||
|
}
|
||||||
|
|
||||||
|
.image-list {
|
||||||
|
width: 100%;
|
||||||
|
min-height: 150px;
|
||||||
|
/*height: 574px;*/
|
||||||
|
border: 1px solid #eef0f3;
|
||||||
|
margin: 0 auto;
|
||||||
|
padding: 24px;
|
||||||
|
overflow-y: auto;
|
||||||
|
|
||||||
|
}
|
||||||
|
.image-box {
|
||||||
|
width: 150px;
|
||||||
|
height: 150px;
|
||||||
|
background: #F2F6FC;
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
|
.el-upload-list.el-upload-list--picture-card {
|
||||||
|
flex-wrap: wrap;
|
||||||
|
}
|
||||||
|
.el-upload-list__item:first-child {
|
||||||
|
margin-top: 0;
|
||||||
|
}
|
||||||
|
.el-upload-list--picture-card .el-upload-list__item-actions {
|
||||||
|
height: 226px;
|
||||||
|
}
|
||||||
|
.el-upload-list--picture-card .el-upload-list__item {
|
||||||
|
width: 150px;
|
||||||
|
height: 190px;
|
||||||
|
border: 0;
|
||||||
|
border-radius: 0;
|
||||||
|
margin-bottom: 16px;
|
||||||
|
margin-right: 16px;
|
||||||
|
}
|
||||||
|
.el-upload-list--picture-card .el-upload-list__item:nth-child(4n){
|
||||||
|
margin-right: 0;
|
||||||
|
}
|
||||||
|
.image-title {
|
||||||
|
text-align: center;
|
||||||
|
color: #606266;
|
||||||
|
line-height: 3;
|
||||||
|
background-color: #fff;
|
||||||
|
position: relative;
|
||||||
|
white-space: nowrap;
|
||||||
|
}
|
||||||
|
|
||||||
|
.el-upload.el-upload--picture-card {
|
||||||
|
display: none;
|
||||||
|
width: 0;
|
||||||
|
height: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.el-upload-list__item-preview , .el-upload-list--picture-card .el-upload-list__item-actions .el-upload-list__item-delete {
|
||||||
|
font-size: 12px;
|
||||||
|
|
||||||
|
}
|
||||||
|
.el-upload-list__item-delete, .el-upload-list__item-preview {
|
||||||
|
display: inline-flex !important;
|
||||||
|
align-items: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.el-upload-list--picture-card .el-upload-list__item {
|
||||||
|
display: block !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.footer-tip {
|
||||||
|
color: #FF6D7E;
|
||||||
|
font-size: 14px;
|
||||||
|
}
|
||||||
296
public/static/uploadPhoto/index.html
Normal file
@ -0,0 +1,296 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
|
<title>图片上传</title>
|
||||||
|
<!-- <script src="https://unpkg.com/vue@next"></script>-->
|
||||||
|
<script src="js/vue.js"></script>
|
||||||
|
<!-- import CSS -->
|
||||||
|
<!-- <link rel="stylesheet" href="https://unpkg.com/element-plus@1.2.0-beta.5/dist/index.css">-->
|
||||||
|
<link rel="stylesheet" href="css/element-plus@1.2.0-beta.5.index.css">
|
||||||
|
|
||||||
|
<link rel="stylesheet" href="css/index.css">
|
||||||
|
</link>
|
||||||
|
|
||||||
|
<!-- import JavaScript -->
|
||||||
|
<!-- <script src="https://unpkg.com/element-plus@1.2.0-beta.5"></script>-->
|
||||||
|
<script src="js/element-plus@1.2.0-beta.5.dist.index.full.js"></script>
|
||||||
|
|
||||||
|
<script src="js/axios@0.26.0.min.js"></script>
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
<div id="upload">
|
||||||
|
<div class="upload-content">
|
||||||
|
<el-upload ref="uploadRef" v-if="!readonly" class="upload-body" :action="actionpath" :multiple="false"
|
||||||
|
:limit="1" :on-success="clearFile" :on-change="changeImage" :auto-upload="false" :file-list="fileList"
|
||||||
|
:before-remove="removeFile" :on-error="uploadFailFn">
|
||||||
|
|
||||||
|
<template #trigger>
|
||||||
|
<el-button size="medium" color="#EBF2FC" style="color:#629FE6;" round> + 选择文件</el-button>
|
||||||
|
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<div class="form-container">
|
||||||
|
<span class="input-label">凭证名称:</span>
|
||||||
|
<el-input name="filename" label="凭证名称" size="medium" v-model="filename" style="width:240px;"
|
||||||
|
placeholder="请输入凭证名称" @blur="jugeInput"></el-input>
|
||||||
|
<el-button size="medium" type="primary" color="#EBF2FC" style="color:#629FE6;" round
|
||||||
|
@click="submitUpload">保存单据</el-button>
|
||||||
|
</div>
|
||||||
|
</el-upload>
|
||||||
|
<div class="upload-footer footer-tip" style="padding: 10px 0">
|
||||||
|
注意:上传文件大小小于4M, 上传文件格式:jpg、png、gif
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="image-list" v-loading="loading">
|
||||||
|
<el-empty description="还未上传凭证" v-if="!loading && !imageList.length"></el-empty>
|
||||||
|
<el-upload list-type="picture-card" :auto-upload="false" :file-list="imageList" action="#"
|
||||||
|
v-if="!loading && imageList.length">
|
||||||
|
<template #default>
|
||||||
|
<el-icon>
|
||||||
|
<plus />
|
||||||
|
</el-icon>
|
||||||
|
</template>
|
||||||
|
<template #file="{ file }" :key="file.ImageId">
|
||||||
|
<div class="image-box">
|
||||||
|
<img class="el-upload-list__item-thumbnail" :src="file.ImageUrl" alt="" />
|
||||||
|
<span class="el-upload-list__item-actions">
|
||||||
|
<span class="el-upload-list__item-preview" @click="handlePictureCardPreview(file)">
|
||||||
|
<svg t="1646800324230" class="icon" viewBox="0 0 1024 1024" version="1.1"
|
||||||
|
xmlns="http://www.w3.org/2000/svg" p-id="3120" width="20" height="20">
|
||||||
|
<path
|
||||||
|
d="M942.2 486.2C847.4 286.5 704.1 186 512 186c-192.2 0-335.4 100.5-430.2 300.3-7.7 16.2-7.7 35.2 0 51.5C176.6 737.5 319.9 838 512 838c192.2 0 335.4-100.5 430.2-300.3 7.7-16.2 7.7-35 0-51.5zM512 766c-161.3 0-279.4-81.8-362.7-254C232.6 339.8 350.7 258 512 258c161.3 0 279.4 81.8 362.7 254C791.5 684.2 673.4 766 512 766z"
|
||||||
|
p-id="3121" fill="#ffffff"></path>
|
||||||
|
<path
|
||||||
|
d="M508 336c-97.2 0-176 78.8-176 176s78.8 176 176 176 176-78.8 176-176-78.8-176-176-176z m0 288c-61.9 0-112-50.1-112-112s50.1-112 112-112 112 50.1 112 112-50.1 112-112 112z"
|
||||||
|
p-id="3122" fill="#ffffff"></path>
|
||||||
|
</svg>预览
|
||||||
|
</span>
|
||||||
|
|
||||||
|
<span class="el-upload-list__item-delete" @click="handleRemove(file)" v-if="!readonly">
|
||||||
|
|
||||||
|
<svg t="1646799675443" class="icon" viewBox="0 0 1024 1024" version="1.1"
|
||||||
|
xmlns="http://www.w3.org/2000/svg" p-id="2158" width="20" height="18">
|
||||||
|
<path
|
||||||
|
d="M768 384c-19.2 0-32 12.8-32 32l0 377.6c0 25.6-19.2 38.4-38.4 38.4L326.4 832c-25.6 0-38.4-19.2-38.4-38.4L288 416C288 396.8 275.2 384 256 384S224 396.8 224 416l0 377.6c0 57.6 44.8 102.4 102.4 102.4l364.8 0c57.6 0 102.4-44.8 102.4-102.4L793.6 416C800 396.8 787.2 384 768 384z"
|
||||||
|
p-id="2159" fill="#ffffff"></path>
|
||||||
|
<path
|
||||||
|
d="M460.8 736l0-320C460.8 396.8 448 384 435.2 384S396.8 396.8 396.8 416l0 320c0 19.2 12.8 32 32 32S460.8 755.2 460.8 736z"
|
||||||
|
p-id="2160" fill="#ffffff"></path>
|
||||||
|
<path
|
||||||
|
d="M627.2 736l0-320C627.2 396.8 608 384 588.8 384S563.2 396.8 563.2 416l0 320C563.2 755.2 576 768 588.8 768S627.2 755.2 627.2 736z"
|
||||||
|
p-id="2161" fill="#ffffff"></path>
|
||||||
|
<path
|
||||||
|
d="M832 256l-160 0L672 211.2C672 166.4 633.6 128 588.8 128L435.2 128C390.4 128 352 166.4 352 211.2L352 256 192 256C172.8 256 160 268.8 160 288S172.8 320 192 320l640 0c19.2 0 32-12.8 32-32S851.2 256 832 256zM416 211.2C416 198.4 422.4 192 435.2 192l153.6 0c12.8 0 19.2 6.4 19.2 19.2L608 256l-192 0L416 211.2z"
|
||||||
|
p-id="2162" fill="#ffffff"></path>
|
||||||
|
</svg>
|
||||||
|
删除
|
||||||
|
</span>
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
<div class="image-title">{{file.ImageName}}</div>
|
||||||
|
</template>
|
||||||
|
</el-upload>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<el-image style="width: 0px;height: 0px;" ref="showPreviewRef" :src="url && url[previewIndex]"
|
||||||
|
:preview-src-list="url" :initial-index="previewIndex">
|
||||||
|
</el-image>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
function getreqstr(e) {
|
||||||
|
const keyValue = location.search.substr(1)
|
||||||
|
const reg = new RegExp("(^|&)" + e + "=([^&]*)(&|$)", "i")
|
||||||
|
const matchValue = keyValue.match(reg)
|
||||||
|
if (matchValue) {
|
||||||
|
return matchValue[2]
|
||||||
|
|
||||||
|
}
|
||||||
|
return ''
|
||||||
|
}
|
||||||
|
|
||||||
|
const {
|
||||||
|
defineComponent,
|
||||||
|
ref,
|
||||||
|
nextTick
|
||||||
|
} = Vue;
|
||||||
|
const {
|
||||||
|
ElMessage, Delete
|
||||||
|
} = ElementPlus
|
||||||
|
// const { Plus, ZoomIn, Download, Delete } = ElementPlusIcons
|
||||||
|
const upload = {
|
||||||
|
|
||||||
|
setup() {
|
||||||
|
const tableId = getreqstr('id');
|
||||||
|
const tableName = getreqstr('tablename');
|
||||||
|
const tableType = getreqstr('tabletype');
|
||||||
|
const deleteType = getreqstr('deletetype');
|
||||||
|
const readonly = getreqstr('readonly') ? true : false;
|
||||||
|
const actions = 'https://ahyd.eshangtech.com/EShangApiMain'
|
||||||
|
let uploadRef = ref(null)
|
||||||
|
let showPreviewRef = ref(null)
|
||||||
|
let filename = ref('')
|
||||||
|
let fileList = ref([])
|
||||||
|
let imageList = ref([])
|
||||||
|
let actionpath = ref('')
|
||||||
|
let fileType = ref('')
|
||||||
|
let previewIndex = ref(0)
|
||||||
|
let loading = ref(true)
|
||||||
|
let url = ref([])
|
||||||
|
|
||||||
|
|
||||||
|
const submitUpload = () => {
|
||||||
|
|
||||||
|
if (fileList.value.length > 0) {
|
||||||
|
const file = fileList.value[0].raw
|
||||||
|
const isJPG = file.type === 'image/jpeg' || file.type === 'image/png' ||
|
||||||
|
file.type === 'image/jpg' || file.type === 'image/gif'
|
||||||
|
// const isLt2M = file.size / 1024 / 1024 < 2
|
||||||
|
|
||||||
|
if (!isJPG) {
|
||||||
|
ElMessage({
|
||||||
|
type: 'error',
|
||||||
|
message: '请选择图片!'
|
||||||
|
})
|
||||||
|
|
||||||
|
return
|
||||||
|
}
|
||||||
|
// ElMessage({
|
||||||
|
// type: 'info',
|
||||||
|
// message: '正在上传...'
|
||||||
|
// })
|
||||||
|
uploadRef.value.submit()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// 改变图片
|
||||||
|
let changeImage = (file, files) => {
|
||||||
|
|
||||||
|
fileList.value = files
|
||||||
|
filename.value = file.name || ''
|
||||||
|
fileType.value = file.name ? '.' + file.name.split('.')[1] : ''
|
||||||
|
actionpath.value = actions + '/Picture/UploadPicture?TableId=' + tableId +
|
||||||
|
'&TableName=' + tableName + '&TableType=' + tableType + '&imagename=' + filename.value
|
||||||
|
}
|
||||||
|
// 监听票据名称
|
||||||
|
let jugeInput = () => {
|
||||||
|
|
||||||
|
if (filename.value && filename.value.indexOf(fileType.value) == -1) {
|
||||||
|
|
||||||
|
filename.value = filename.value + fileType.value
|
||||||
|
}
|
||||||
|
actionpath.value = actions + '/Picture/UploadPicture?TableId=' + tableId +
|
||||||
|
'&TableName=' + tableName + '&TableType=' + tableType + '&imagename=' + filename.value
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
// 预览图片
|
||||||
|
|
||||||
|
const handlePictureCardPreview = (file) => {
|
||||||
|
const index = url.value.findIndex(n => n === file.ImageUrl)
|
||||||
|
previewIndex.value = index
|
||||||
|
|
||||||
|
nextTick(() => {
|
||||||
|
showPreviewRef.value.showViewer = true
|
||||||
|
})
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
const removeFile = (file) => {
|
||||||
|
filename.value = ''
|
||||||
|
}
|
||||||
|
const uploadFailFn = () => {
|
||||||
|
|
||||||
|
}
|
||||||
|
const clearFile = () => {
|
||||||
|
|
||||||
|
nextTick(() => {
|
||||||
|
filename.value = ''
|
||||||
|
})
|
||||||
|
ElMessage({
|
||||||
|
type: 'success',
|
||||||
|
message: '上传成功!'
|
||||||
|
})
|
||||||
|
loading.value = true
|
||||||
|
imageList.value = []
|
||||||
|
uploadRef.value.clearFiles()
|
||||||
|
getImages(tableId)
|
||||||
|
}
|
||||||
|
// 删除图片
|
||||||
|
const handleRemove = (file) => {
|
||||||
|
var msg = "您真的确定要删除吗?\n\n请确认!";
|
||||||
|
if (confirm(msg)) {
|
||||||
|
loading.value = true
|
||||||
|
// const index = url.value.findIndex(n => n === file.ImageUrl)
|
||||||
|
axios.get(actions + '/Picture/DeletePicture?imageid=' + file.ImageId + '&TableName=' +
|
||||||
|
tableName + '&TableType=' + deleteType + '&ImagePath=' + file.ImagePath).then(res => {
|
||||||
|
const data = res.data
|
||||||
|
imageList.value = []
|
||||||
|
if (data.Result_Code === 100) {
|
||||||
|
getImages(tableId)
|
||||||
|
ElMessage({
|
||||||
|
type: 'success',
|
||||||
|
message: '删除成功!'
|
||||||
|
})
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// 获取图片列表
|
||||||
|
const getImages = (id) => {
|
||||||
|
|
||||||
|
axios.get(actions + '/Picture/GetPictureList?TableId=' + id + '&TableName=' +
|
||||||
|
tableName + '&TableType=' + tableType)
|
||||||
|
.then(res => {
|
||||||
|
const data = res.data
|
||||||
|
if (data.Result_Code === 100) {
|
||||||
|
imageList.value = data.Result_Data.List
|
||||||
|
url.value = data.Result_Data.List.map(n => n.ImageUrl)
|
||||||
|
filename.value = ''
|
||||||
|
}
|
||||||
|
console.log(imageList.value)
|
||||||
|
setTimeout(() => {
|
||||||
|
|
||||||
|
loading.value = false
|
||||||
|
}, 200)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
getImages(tableId)
|
||||||
|
|
||||||
|
return {
|
||||||
|
uploadRef,
|
||||||
|
filename,
|
||||||
|
readonly,
|
||||||
|
showPreviewRef,
|
||||||
|
fileList,
|
||||||
|
imageList,
|
||||||
|
previewIndex,
|
||||||
|
loading,
|
||||||
|
url,
|
||||||
|
jugeInput,
|
||||||
|
actionpath,
|
||||||
|
submitUpload,
|
||||||
|
changeImage,
|
||||||
|
handlePictureCardPreview,
|
||||||
|
handleRemove,
|
||||||
|
removeFile,
|
||||||
|
clearFile
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
const app = Vue.createApp(upload)
|
||||||
|
app.use(ElementPlus)
|
||||||
|
app.mount('#upload');
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
|
||||||
|
</html>
|
||||||
2
public/static/uploadPhoto/js/axios@0.26.0.min.js
vendored
Normal file
15929
public/static/uploadPhoto/js/vue.js
Normal file
207
public/static/uploadPhoto/search.html
Normal file
@ -0,0 +1,207 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
|
<title>图片上传</title>
|
||||||
|
<script src="https://unpkg.com/vue@next"></script>
|
||||||
|
<!-- import CSS -->
|
||||||
|
<link rel="stylesheet" href="https://unpkg.com/element-plus@1.2.0-beta.5/dist/index.css">
|
||||||
|
|
||||||
|
<link rel="stylesheet" href="./css/index.css">
|
||||||
|
</link>
|
||||||
|
<!-- import JavaScript -->
|
||||||
|
<script src="https://unpkg.com/element-plus@1.2.0-beta.5"></script>
|
||||||
|
<!-- <script src="https://unpkg.com/axios/dist/axios.min.js"></script> -->
|
||||||
|
<script src="js/axios@0.26.0.min.js"></script>
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
<div id="upload">
|
||||||
|
<div class="upload-content">
|
||||||
|
<div class="image-list" v-loading="loading">
|
||||||
|
<el-empty description="还未上传凭证" v-if="!loading && !imageList.length"></el-empty>
|
||||||
|
<el-upload list-type="picture-card" :auto-upload="false" :file-list="imageList" action="#"
|
||||||
|
v-if="!loading && imageList.length">
|
||||||
|
<template #default>
|
||||||
|
<el-icon>
|
||||||
|
<plus />
|
||||||
|
</el-icon>
|
||||||
|
</template>
|
||||||
|
<template #file="{ file }" :key="file.ImageId">
|
||||||
|
<div class="image-box">
|
||||||
|
<img class="el-upload-list__item-thumbnail" :src="file.ImageUrl" alt="" />
|
||||||
|
<span class="el-upload-list__item-actions">
|
||||||
|
<span class="el-upload-list__item-preview" @click="handlePictureCardPreview(file)">
|
||||||
|
<svg t="1646800324230" class="icon" viewBox="0 0 1024 1024" version="1.1"
|
||||||
|
xmlns="http://www.w3.org/2000/svg" p-id="3120" width="20" height="20"><path d="M942.2 486.2C847.4 286.5 704.1 186 512 186c-192.2 0-335.4 100.5-430.2 300.3-7.7 16.2-7.7 35.2 0 51.5C176.6 737.5 319.9 838 512 838c192.2 0 335.4-100.5 430.2-300.3 7.7-16.2 7.7-35 0-51.5zM512 766c-161.3 0-279.4-81.8-362.7-254C232.6 339.8 350.7 258 512 258c161.3 0 279.4 81.8 362.7 254C791.5 684.2 673.4 766 512 766z" p-id="3121" fill="#ffffff"></path><path d="M508 336c-97.2 0-176 78.8-176 176s78.8 176 176 176 176-78.8 176-176-78.8-176-176-176z m0 288c-61.9 0-112-50.1-112-112s50.1-112 112-112 112 50.1 112 112-50.1 112-112 112z" p-id="3122" fill="#ffffff"></path></svg>预览
|
||||||
|
</span>
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
<div class="image-title">{{file.ImageName}}</div>
|
||||||
|
</template>
|
||||||
|
</el-upload>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<el-image style="width: 0px;height: 0px;" ref="showPreviewRef" :src="url && url[previewIndex]"
|
||||||
|
:preview-src-list="url" :initial-index="previewIndex">
|
||||||
|
</el-image>
|
||||||
|
<div class="upload-footer footer-tip">
|
||||||
|
|
||||||
|
注意:上传文件大小小于4M, 上传文件格式:jpg、png、gif
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
function getreqstr(e) {
|
||||||
|
const keyValue = location.search.substr(1)
|
||||||
|
const reg = new RegExp("(^|&)" + e + "=([^&]*)(&|$)", "i")
|
||||||
|
const matchValue = keyValue.match(reg)
|
||||||
|
if (matchValue) {
|
||||||
|
return matchValue[2]
|
||||||
|
|
||||||
|
}
|
||||||
|
return ''
|
||||||
|
}
|
||||||
|
|
||||||
|
const {
|
||||||
|
defineComponent,
|
||||||
|
ref,
|
||||||
|
nextTick
|
||||||
|
} = Vue;
|
||||||
|
const {
|
||||||
|
ElMessage, Delete
|
||||||
|
} = ElementPlus
|
||||||
|
// const { Plus, ZoomIn, Download, Delete } = ElementPlusIcons
|
||||||
|
const upload = {
|
||||||
|
|
||||||
|
setup() {
|
||||||
|
const tableId = getreqstr('id');
|
||||||
|
const tableName = getreqstr('tablename');
|
||||||
|
const tableType = getreqstr('tabletype');
|
||||||
|
const readonly = getreqstr('readonly') ? true : false;
|
||||||
|
const actions = 'http://pos.eshangtech.com:8900/EShangApiMain'
|
||||||
|
let uploadRef = ref(null)
|
||||||
|
let showPreviewRef = ref(null)
|
||||||
|
let filename = ref('')
|
||||||
|
let fileList = ref([])
|
||||||
|
let imageList = ref([])
|
||||||
|
let actionpath = ref('')
|
||||||
|
let fileType = ref('')
|
||||||
|
let previewIndex = ref(0)
|
||||||
|
let loading = ref(true)
|
||||||
|
let url = ref([])
|
||||||
|
|
||||||
|
|
||||||
|
const submitUpload = () => {
|
||||||
|
|
||||||
|
if (fileList.value.length > 0) {
|
||||||
|
const file = fileList.value[0].raw
|
||||||
|
const isJPG = file.type === 'image/jpeg' || file.type === 'image/png' ||
|
||||||
|
file.type === 'image/jpg' || file.type === 'image/gif'
|
||||||
|
// const isLt2M = file.size / 1024 / 1024 < 2
|
||||||
|
|
||||||
|
if (!isJPG) {
|
||||||
|
ElMessage({
|
||||||
|
type: 'error',
|
||||||
|
message: '请选择图片!'
|
||||||
|
})
|
||||||
|
|
||||||
|
return
|
||||||
|
}
|
||||||
|
// ElMessage({
|
||||||
|
// type: 'info',
|
||||||
|
// message: '正在上传...'
|
||||||
|
// })
|
||||||
|
uploadRef.value.submit()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 预览图片
|
||||||
|
|
||||||
|
const handlePictureCardPreview = (file) => {
|
||||||
|
const index = url.value.findIndex(n => n === file.ImageUrl)
|
||||||
|
previewIndex.value = index
|
||||||
|
|
||||||
|
nextTick(() => {
|
||||||
|
showPreviewRef.value.showViewer = true
|
||||||
|
})
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
const removeFile = (file) => {
|
||||||
|
filename.value = ''
|
||||||
|
}
|
||||||
|
const uploadFailFn = () => {
|
||||||
|
|
||||||
|
}
|
||||||
|
const clearFile = () => {
|
||||||
|
|
||||||
|
nextTick(() => {
|
||||||
|
filename.value = ''
|
||||||
|
})
|
||||||
|
ElMessage({
|
||||||
|
type: 'success',
|
||||||
|
message: '上传成功!'
|
||||||
|
})
|
||||||
|
loading.value = true
|
||||||
|
imageList.value = []
|
||||||
|
uploadRef.value.clearFiles()
|
||||||
|
getImages(tableId)
|
||||||
|
}
|
||||||
|
// 获取图片列表
|
||||||
|
const getImages = (id) => {
|
||||||
|
|
||||||
|
axios.get(actions + '/Picture/GetPictureList?TableId=' + id + '&TableName=' +
|
||||||
|
tableName + '&TableType=' + tableType)
|
||||||
|
.then(res => {
|
||||||
|
const data = res.data
|
||||||
|
if (data.Result_Code === 100) {
|
||||||
|
imageList.value = data.Result_Data.List
|
||||||
|
url.value = data.Result_Data.List.map(n => n.ImageUrl)
|
||||||
|
filename.value = ''
|
||||||
|
}
|
||||||
|
console.log(imageList.value)
|
||||||
|
setTimeout(() => {
|
||||||
|
|
||||||
|
loading.value = false
|
||||||
|
}, 200)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
getImages(tableId)
|
||||||
|
|
||||||
|
return {
|
||||||
|
uploadRef,
|
||||||
|
filename,
|
||||||
|
readonly,
|
||||||
|
showPreviewRef,
|
||||||
|
fileList,
|
||||||
|
imageList,
|
||||||
|
previewIndex,
|
||||||
|
loading,
|
||||||
|
url,
|
||||||
|
// jugeInput,
|
||||||
|
actionpath,
|
||||||
|
// submitUpload,
|
||||||
|
// changeImage,
|
||||||
|
handlePictureCardPreview,
|
||||||
|
// handleRemove,
|
||||||
|
// removeFile,
|
||||||
|
// clearFile
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
const app = Vue.createApp(upload)
|
||||||
|
app.use(ElementPlus)
|
||||||
|
app.mount('#upload');
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
|
||||||
|
</html>
|
||||||
26
script/writeVersion.js
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
const fs = require('fs');
|
||||||
|
const path = require('path');
|
||||||
|
const child_process = require('child_process');
|
||||||
|
|
||||||
|
const pkgPath = path.resolve(__dirname, '../package.json');
|
||||||
|
const pkg = require(pkgPath);
|
||||||
|
|
||||||
|
// 自动递增版本号
|
||||||
|
const [major, minor, patch] = pkg.version.split('.').map(Number);
|
||||||
|
const newVersion = `${major}.${minor}.${patch + 1}`;
|
||||||
|
pkg.version = newVersion;
|
||||||
|
fs.writeFileSync(pkgPath, JSON.stringify(pkg, null, 2));
|
||||||
|
|
||||||
|
// 获取 Git hash 和构建时间
|
||||||
|
const gitHash = child_process.execSync('git rev-parse --short HEAD').toString().trim();
|
||||||
|
const buildTime = new Date().toISOString();
|
||||||
|
|
||||||
|
// 写入 src/versionEnv.ts
|
||||||
|
const content = `// 由 scripts/writeVersion.js 自动生成
|
||||||
|
export const VERSION = "${newVersion}";
|
||||||
|
export const GIT_HASH = "${gitHash}";
|
||||||
|
export const BUILD_TIME = "${buildTime}";
|
||||||
|
`;
|
||||||
|
|
||||||
|
fs.writeFileSync(path.resolve(__dirname, '../src/versionEnv.ts'), content);
|
||||||
|
console.log('✅ 自动写入 src/versionEnv.ts 完成');
|
||||||
10359
src/anhuiMap.js
Normal file
61
src/app.ts
Normal file
@ -0,0 +1,61 @@
|
|||||||
|
/*
|
||||||
|
* @Author: zzy 411037547@qq.com
|
||||||
|
* @Date: 2023-05-26 10:05:48
|
||||||
|
* @LastEditors: zzy 411037547@qq.com
|
||||||
|
* @LastEditTime: 2023-05-26 11:15:58
|
||||||
|
* @FilePath: \cloud-platform\src\app.ts
|
||||||
|
* @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
|
||||||
|
*/
|
||||||
|
import globalState from './globalState';
|
||||||
|
import { routePreloader } from './utils/routePreloader';
|
||||||
|
|
||||||
|
// import { getMicroAppRouteComponent } from 'umi';
|
||||||
|
|
||||||
|
// 将全局state注入子应用
|
||||||
|
export function useQiankunStateForSlave() {
|
||||||
|
return {
|
||||||
|
globalState,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
// 注册子应用
|
||||||
|
export const qiankun = {
|
||||||
|
apps: [
|
||||||
|
{
|
||||||
|
name: 'internalManage',
|
||||||
|
// entry: '//dev.eshangtech.com:16060/merchantManagement/'
|
||||||
|
entry: '//localhost:8888/internalManage/',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// 应用启动时的初始化配置
|
||||||
|
export async function getInitialState() {
|
||||||
|
// 预加载关键路由以优化首屏加载
|
||||||
|
setTimeout(() => {
|
||||||
|
routePreloader.preloadCriticalRoutes().then(() => {
|
||||||
|
console.log('关键路由预加载完成');
|
||||||
|
}).catch(error => {
|
||||||
|
console.warn('关键路由预加载失败:', error);
|
||||||
|
});
|
||||||
|
}, 1000); // 延迟1秒后开始预加载,避免影响首屏渲染
|
||||||
|
|
||||||
|
return {
|
||||||
|
preloadEnabled: true,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
// export const patchRoutes = ({ routes }: any) => {
|
||||||
|
// console.info('routes', routes);
|
||||||
|
// routes[0].routes[1].routes[0].routes.forEach((item: any, index: number) => {
|
||||||
|
// if (item.microApp) {
|
||||||
|
// routes[0].routes[1].routes[0].routes[index].component = (() => getMicroAppRouteComponent({
|
||||||
|
// appName: item.microApp,
|
||||||
|
// base: item.microAppProps?.base || '/',
|
||||||
|
// masterHistoryType: item.microAppProps?.history || 'browser',
|
||||||
|
// routeProps: {}
|
||||||
|
// }))()
|
||||||
|
// }
|
||||||
|
// });
|
||||||
|
// }
|
||||||
BIN
src/assets/DataVerification/activeSuccessCheck.png
Normal file
|
After Width: | Height: | Size: 583 B |
BIN
src/assets/DataVerification/activeWaitCheck.png
Normal file
|
After Width: | Height: | Size: 559 B |
BIN
src/assets/DataVerification/allMoney.png
Normal file
|
After Width: | Height: | Size: 4.9 KiB |
BIN
src/assets/DataVerification/allRealMoney.png
Normal file
|
After Width: | Height: | Size: 2.9 KiB |
BIN
src/assets/DataVerification/auditFeedback.png
Normal file
|
After Width: | Height: | Size: 354 B |
BIN
src/assets/DataVerification/billBasic.png
Normal file
|
After Width: | Height: | Size: 480 B |
BIN
src/assets/DataVerification/billCheck.png
Normal file
|
After Width: | Height: | Size: 708 B |
BIN
src/assets/DataVerification/billSale.png
Normal file
|
After Width: | Height: | Size: 488 B |
BIN
src/assets/DataVerification/cash.png
Normal file
|
After Width: | Height: | Size: 1.0 KiB |
BIN
src/assets/DataVerification/changeList.png
Normal file
|
After Width: | Height: | Size: 503 B |
BIN
src/assets/DataVerification/code.png
Normal file
|
After Width: | Height: | Size: 1.9 KiB |
BIN
src/assets/DataVerification/date.png
Normal file
|
After Width: | Height: | Size: 267 B |
BIN
src/assets/DataVerification/east.png
Normal file
|
After Width: | Height: | Size: 2.1 KiB |
BIN
src/assets/DataVerification/fixed.png
Normal file
|
After Width: | Height: | Size: 470 B |
BIN
src/assets/DataVerification/fixedIcon.png
Normal file
|
After Width: | Height: | Size: 2.7 KiB |
BIN
src/assets/DataVerification/haveOwner.png
Normal file
|
After Width: | Height: | Size: 1.9 KiB |
BIN
src/assets/DataVerification/interface.png
Normal file
|
After Width: | Height: | Size: 1.6 KiB |
BIN
src/assets/DataVerification/machineNumber.png
Normal file
|
After Width: | Height: | Size: 288 B |
BIN
src/assets/DataVerification/mobilePay.png
Normal file
|
After Width: | Height: | Size: 272 B |
1
src/assets/DataVerification/noData.svg
Normal file
@ -0,0 +1 @@
|
|||||||
|
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1698051940208" class="icon" viewBox="0 0 1253 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="4263" xmlns:xlink="http://www.w3.org/1999/xlink" width="244.7265625" height="200"><path d="M217.338776 896c0 28.274939 183.379592 51.2 409.6 51.2 226.220408 0 409.6-22.925061 409.6-51.2 0-28.274939-183.379592-51.2-409.6-51.2-226.220408 0-409.6 22.925061-409.6 51.2z" fill="#9C9C9C" opacity=".1" p-id="4264"></path><path d="M231.674776 376.832c0 8.704 6.656 15.36 15.36 15.36s15.36-6.656 15.36-15.36-6.656-15.36-15.36-15.36c-8.192 0-15.36 7.168-15.36 15.36zM1041.658776 832c-19.456 5.12-23.552 9.216-28.16 28.16-5.12-19.456-9.216-23.552-28.16-28.16 18.944-5.12 23.552-9.216 28.16-28.16 4.608 18.944 8.704 23.552 28.16 28.16zM317.178776 323.072c-25.088 6.656-30.208 11.776-36.864 36.864-6.656-25.088-11.776-30.208-36.864-36.864 25.088-6.656 30.208-12.288 36.864-36.864 6.144 25.088 11.776 30.208 36.864 36.864z m614.4-88.064c-15.36 4.096-18.432 7.168-22.528 22.528-4.096-15.36-7.168-18.432-22.528-22.528 15.36-4.096 18.432-7.168 22.528-22.528 3.584 15.36 7.168 18.432 22.528 22.528z m66.048-78.848c-39.936 10.24-48.128 18.944-58.88 58.88-10.24-39.936-18.944-48.128-58.88-58.88 39.936-10.24 48.128-18.944 58.88-58.88 10.24 39.424 18.944 48.128 58.88 58.88zM975.098776 551.936v-1.024c0-1.024-0.512-1.536-0.512-2.56v-0.512L864.506776 260.608a117.728653 117.728653 0 0 0-112.128-81.408H502.010776c-51.2 0-96.256 32.768-112.128 81.408L279.802776 547.84v0.512c-0.512 1.024-0.512 1.536-0.512 2.56V757.76c0 65.024 52.736 117.76 117.76 117.76h460.8c65.024 0 117.76-52.736 117.76-117.76v-204.8c-0.512-0.512-0.512-0.512-0.512-1.024zM418.554776 271.36s0-0.512 0.512-0.512c11.264-36.864 45.056-60.928 82.944-60.928h249.856c37.888 0 71.68 24.064 83.456 60.416 0 0 0 0.512 0.512 0.512l101.888 266.24H703.738776c-8.704 0-15.36 6.656-15.36 15.36 0 33.792-27.648 61.44-61.44 61.44s-61.44-27.648-61.44-61.44c0-8.704-6.656-15.36-15.36-15.36H316.666776l101.888-265.728zM944.378776 757.76a86.966857 86.966857 0 0 1-87.04 87.04h-460.8a86.966857 86.966857 0 0 1-87.04-87.04V568.32h226.816c7.168 43.52 45.056 76.8 90.624 76.8s83.456-33.28 90.624-76.8H944.378776v189.44z" fill="#9C9C9C" opacity=".5" p-id="4265"></path><path d="M626.938776 578.56a25.349224 25.349224 0 0 1-25.6-25.6v-51.2H368.378776l83.968-219.136 0.512-1.024c7.168-21.504 26.624-35.84 49.152-35.84h249.856c22.528 0 41.984 14.336 49.152 35.84l0.512 1.024 83.968 219.136H652.538776v51.2A25.349224 25.349224 0 0 1 626.938776 578.56z" fill="#9C9C9C" opacity=".2" p-id="4266"></path></svg>
|
||||||
|
After Width: | Height: | Size: 2.6 KiB |
BIN
src/assets/DataVerification/north.png
Normal file
|
After Width: | Height: | Size: 2.0 KiB |
BIN
src/assets/DataVerification/otherPay.png
Normal file
|
After Width: | Height: | Size: 343 B |
BIN
src/assets/DataVerification/productData.png
Normal file
|
After Width: | Height: | Size: 490 B |
BIN
src/assets/DataVerification/saleRecord.png
Normal file
|
After Width: | Height: | Size: 482 B |
BIN
src/assets/DataVerification/south.png
Normal file
|
After Width: | Height: | Size: 2.1 KiB |
BIN
src/assets/DataVerification/successCheck.png
Normal file
|
After Width: | Height: | Size: 484 B |
BIN
src/assets/DataVerification/upLoad.png
Normal file
|
After Width: | Height: | Size: 437 B |
BIN
src/assets/DataVerification/upLoadShop.png
Normal file
|
After Width: | Height: | Size: 4.3 KiB |
BIN
src/assets/DataVerification/waitCheck.png
Normal file
|
After Width: | Height: | Size: 448 B |
BIN
src/assets/DataVerification/waitMe.png
Normal file
|
After Width: | Height: | Size: 4.0 KiB |
BIN
src/assets/DataVerification/west.png
Normal file
|
After Width: | Height: | Size: 2.0 KiB |
BIN
src/assets/ai/AiIcon.png
Normal file
|
After Width: | Height: | Size: 12 KiB |
BIN
src/assets/ai/YDLogo.png
Normal file
|
After Width: | Height: | Size: 2.2 KiB |
BIN
src/assets/ai/add.png
Normal file
|
After Width: | Height: | Size: 1.2 KiB |
BIN
src/assets/ai/businessIcon.png
Normal file
|
After Width: | Height: | Size: 609 B |
BIN
src/assets/ai/businessTrade.png
Normal file
|
After Width: | Height: | Size: 5.3 KiB |
BIN
src/assets/ai/close.png
Normal file
|
After Width: | Height: | Size: 2.6 KiB |
BIN
src/assets/ai/comeForm.png
Normal file
|
After Width: | Height: | Size: 5.7 KiB |
BIN
src/assets/ai/deleteIcon.png
Normal file
|
After Width: | Height: | Size: 2.0 KiB |
BIN
src/assets/ai/dropDown.png
Normal file
|
After Width: | Height: | Size: 1.7 KiB |
BIN
src/assets/ai/earlyWarning.png
Normal file
|
After Width: | Height: | Size: 2.3 KiB |
BIN
src/assets/ai/editIcon.png
Normal file
|
After Width: | Height: | Size: 3.8 KiB |
BIN
src/assets/ai/filterIcon.png
Normal file
|
After Width: | Height: | Size: 768 B |
BIN
src/assets/ai/fixed.png
Normal file
|
After Width: | Height: | Size: 1.0 KiB |
BIN
src/assets/ai/foodIcon.png
Normal file
|
After Width: | Height: | Size: 678 B |
BIN
src/assets/ai/heat.png
Normal file
|
After Width: | Height: | Size: 6.5 KiB |
BIN
src/assets/ai/leftArrow.png
Normal file
|
After Width: | Height: | Size: 364 B |
BIN
src/assets/ai/printIcon.png
Normal file
|
After Width: | Height: | Size: 1.6 KiB |
BIN
src/assets/ai/profileIcon.png
Normal file
|
After Width: | Height: | Size: 3.3 KiB |
BIN
src/assets/ai/pullUp.png
Normal file
|
After Width: | Height: | Size: 1.5 KiB |
BIN
src/assets/ai/reduce.png
Normal file
|
After Width: | Height: | Size: 1.3 KiB |
BIN
src/assets/ai/reloadIcon.png
Normal file
|
After Width: | Height: | Size: 4.2 KiB |
BIN
src/assets/ai/retract.png
Normal file
|
After Width: | Height: | Size: 1.5 KiB |
BIN
src/assets/ai/robotIcon.png
Normal file
|
After Width: | Height: | Size: 5.9 KiB |
BIN
src/assets/ai/searchIcon.png
Normal file
|
After Width: | Height: | Size: 3.5 KiB |
BIN
src/assets/ai/searchIconBlue.png
Normal file
|
After Width: | Height: | Size: 930 B |
BIN
src/assets/ai/searchIconNormal.png
Normal file
|
After Width: | Height: | Size: 770 B |
BIN
src/assets/ai/selectBusinessTrade.png
Normal file
|
After Width: | Height: | Size: 5.3 KiB |