first commit

This commit is contained in:
ylj20011123 2025-09-12 17:46:36 +08:00
commit 37ad56ea54
1541 changed files with 557309 additions and 0 deletions

16
.editorconfig Normal file
View 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
View File

@ -0,0 +1,9 @@
/lambda/
/scripts
/config
.history
public
dist
.umi
mock
/node_modules

18
.eslintrc.js Normal file
View 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
View 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
View 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
View File

@ -0,0 +1,5 @@
const fabric = require('@umijs/fabric');
module.exports = {
...fabric.prettier,
};

5
.stylelintrc.js Normal file
View File

@ -0,0 +1,5 @@
const fabric = require('@umijs/fabric');
module.exports = {
...fabric.stylelint,
};

1
.vercel/project.json Normal file
View File

@ -0,0 +1 @@
{"projectName":"trae_cloud-platform_lsb2"}

187
README.md Normal file
View 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);
```
即可将全局状态下的 state1state2 挂载在 ReactComponent 的 props 上,全局事件`globalEvent`默认挂载在 props 上。

24
config/config.dev.ts Normal file
View 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
View 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
View 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
View 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

File diff suppressed because it is too large Load Diff

98
config/webpack.config.js Normal file
View 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
View 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
View File

@ -0,0 +1,10 @@
{
"compilerOptions": {
"emitDecoratorMetadata": true,
"experimentalDecorators": true,
"baseUrl": ".",
"paths": {
"@/*": ["./src/*"]
}
}
}

171
mock/listTableList.ts Normal file
View 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
View 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
View File

@ -0,0 +1,5 @@
export default {
'/api/auth_routes': {
'/form/advanced-form': { authority: ['admin', 'user'] },
},
};

165
mock/user.ts Normal file
View 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
View 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
View File

@ -0,0 +1 @@
preview.pro.ant.design

BIN
public/favicon.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

BIN
public/home_bg.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 199 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.0 KiB

BIN
public/logo.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

5
public/pro_icon.svg Normal file
View 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

View File

@ -0,0 +1,6 @@
# #平台文件凭证上传
# 基础框架 vue3 + elementplus + axios
# 资源都是在线引用的早期版本 如在线版本已无法引用 则引用本地文件

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

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

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

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

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

File diff suppressed because it is too large Load Diff

61
src/app.ts Normal file
View 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: {}
// }))()
// }
// });
// }

Binary file not shown.

After

Width:  |  Height:  |  Size: 583 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 559 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 354 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 480 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 708 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 488 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 503 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 267 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 470 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 288 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 272 B

View File

@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="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

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 343 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 490 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 482 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 484 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 437 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 448 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

BIN
src/assets/ai/AiIcon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

BIN
src/assets/ai/YDLogo.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

BIN
src/assets/ai/add.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 609 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.3 KiB

BIN
src/assets/ai/close.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

BIN
src/assets/ai/comeForm.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

BIN
src/assets/ai/dropDown.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

BIN
src/assets/ai/editIcon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 768 B

BIN
src/assets/ai/fixed.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

BIN
src/assets/ai/foodIcon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 678 B

BIN
src/assets/ai/heat.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.5 KiB

BIN
src/assets/ai/leftArrow.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 364 B

BIN
src/assets/ai/printIcon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.3 KiB

BIN
src/assets/ai/pullUp.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

BIN
src/assets/ai/reduce.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

BIN
src/assets/ai/retract.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

BIN
src/assets/ai/robotIcon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 930 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 770 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.3 KiB

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