fix: 初始化
5
packages/icpx-platform/.browserslistrc
Normal file
@ -0,0 +1,5 @@
|
||||
> 1%
|
||||
last 2 versions
|
||||
not dead
|
||||
chrome > 40
|
||||
not ie 11
|
38
packages/icpx-platform/.editorconfig
Normal file
@ -0,0 +1,38 @@
|
||||
[*]
|
||||
charset=utf-8
|
||||
end_of_line=lf
|
||||
insert_final_newline=false
|
||||
indent_style=space
|
||||
indent_size=2
|
||||
|
||||
[{*.ng,*.sht,*.html,*.shtm,*.shtml,*.htm}]
|
||||
indent_style=space
|
||||
indent_size=2
|
||||
|
||||
[{*.jhm,*.xslt,*.xul,*.rng,*.xsl,*.xsd,*.ant,*.tld,*.fxml,*.jrxml,*.xml,*.jnlp,*.wsdl}]
|
||||
indent_style=space
|
||||
indent_size=2
|
||||
|
||||
[{.babelrc,.stylelintrc,jest.config,.eslintrc,.prettierrc,*.json,*.jsb3,*.jsb2,*.bowerrc}]
|
||||
indent_style=space
|
||||
indent_size=2
|
||||
|
||||
[*.svg]
|
||||
indent_style=space
|
||||
indent_size=2
|
||||
|
||||
[*.js.map]
|
||||
indent_style=space
|
||||
indent_size=2
|
||||
|
||||
[*.less]
|
||||
indent_style=space
|
||||
indent_size=2
|
||||
|
||||
[{*.vue,*.ts,*.tsx}]
|
||||
indent_style=space
|
||||
indent_size=2
|
||||
|
||||
[{.analysis_options,*.yml,*.yaml}]
|
||||
indent_style=space
|
||||
indent_size=2
|
7
packages/icpx-platform/.env
Normal file
@ -0,0 +1,7 @@
|
||||
VUE_APP_PUBLIC_PATH=/
|
||||
VUE_APP_PREVIEW=true
|
||||
VUE_APP_API_BASE_URL=/api
|
||||
|
||||
VITE_APP_PUBLIC_PATH=/
|
||||
VITE_APP_PREVIEW=true
|
||||
VITE_APP_API_BASE_URL=/api
|
2
packages/icpx-platform/.env.analyz
Normal file
@ -0,0 +1,2 @@
|
||||
NODE_ENV=production
|
||||
IS_ANALYZ=true
|
9
packages/icpx-platform/.env.development
Normal file
@ -0,0 +1,9 @@
|
||||
VUE_APP_PREVIEW=true
|
||||
VUE_APP_API_BASE_URL=/api
|
||||
MOCK=true
|
||||
HTTP_MOCK=true
|
||||
|
||||
VITE_APP_PREVIEW=true
|
||||
VITE_APP_API_BASE_URL=/api
|
||||
VITE_MOCK=true
|
||||
VITE_HTTP_MOCK=true
|
6
packages/icpx-platform/.env.preview
Normal file
@ -0,0 +1,6 @@
|
||||
NODE_ENV=production
|
||||
VUE_APP_PUBLIC_PATH=/pro/preview/
|
||||
VUE_APP_API_URL=/api
|
||||
|
||||
VITE_APP_PUBLIC_PATH=/pro/preview/
|
||||
VITE_APP_API_URL=/api
|
7
packages/icpx-platform/.env.production
Normal file
@ -0,0 +1,7 @@
|
||||
NODE_ENV=production
|
||||
VUE_APP_PREVIEW=false
|
||||
VUE_APP_API_URL=/api
|
||||
|
||||
|
||||
VITE_APP_PREVIEW=false
|
||||
VITE_APP_API_URL=/api
|
4
packages/icpx-platform/.umirc.mock.js
Normal file
@ -0,0 +1,4 @@
|
||||
module.exports = {
|
||||
...require('./mock/index'),
|
||||
// 这里可以引入任意的mock文件,位置也随意。
|
||||
};
|
9
packages/icpx-platform/Dockerfile
Normal file
@ -0,0 +1,9 @@
|
||||
#### 1.拉取自定义镜像名称
|
||||
FROM 10.0.88.243/icpx/base_frontend:0.0.9
|
||||
|
||||
# 2.将打包后的代码复制到运行位置
|
||||
COPY ./dist /var/www
|
||||
|
||||
# 3.启动nginx
|
||||
ENTRYPOINT ["nginx","-g","daemon off;"]
|
||||
|
13
packages/icpx-platform/apiMap.config.ts
Normal file
@ -0,0 +1,13 @@
|
||||
const apiMap = {};
|
||||
|
||||
export function getLocalApiProxy() {
|
||||
for (const key in apiMap) {
|
||||
apiMap[key] = {
|
||||
target: apiMap[key],
|
||||
ws: true,
|
||||
changeOrigin: true,
|
||||
rewrite: path => path.replace(new RegExp('^' + key), ''),
|
||||
};
|
||||
}
|
||||
return apiMap;
|
||||
}
|
15
packages/icpx-platform/babel.config.js
Normal file
@ -0,0 +1,15 @@
|
||||
module.exports = {
|
||||
presets: ['@vue/cli-plugin-babel/preset'],
|
||||
plugins: [
|
||||
'@babel/plugin-transform-spread',
|
||||
['@babel/plugin-proposal-object-rest-spread', { loose: true, useBuiltIns: true }],
|
||||
[
|
||||
'import',
|
||||
{
|
||||
libraryName: 'ant-design-vue',
|
||||
libraryDirectory: 'es',
|
||||
// style: true, // `style: true` 会加载 less 文件
|
||||
},
|
||||
],
|
||||
],
|
||||
};
|
89
packages/icpx-platform/build/cssVariable.ts
Normal file
@ -0,0 +1,89 @@
|
||||
const cssVariable = () => {
|
||||
return {
|
||||
theme: 'variable',
|
||||
// >>> Primary
|
||||
'primary-color': "~'var(--@{ant-prefix}-primary-color)'",
|
||||
'primary-color-hover': "~'var(--@{ant-prefix}-primary-color-hover)'",
|
||||
'primary-color-active': "~'var(--@{ant-prefix}-primary-color-active)'",
|
||||
'primary-color-outline': "~'var(--@{ant-prefix}-primary-color-outline)'",
|
||||
|
||||
'processing-color': '@primary-color',
|
||||
|
||||
// >>> Info
|
||||
'info-color': "~'var(--@{ant-prefix}-info-color)'",
|
||||
'info-color-deprecated-bg': "~'var(--@{ant-prefix}-info-color-deprecated-bg)'",
|
||||
|
||||
'info-color-deprecated-border': "~'var(--@{ant-prefix}-info-color-deprecated-border)'",
|
||||
|
||||
// >>> Success
|
||||
'success-color': "~'var(--@{ant-prefix}-success-color)'",
|
||||
'success-color-hover': "~'var(--@{ant-prefix}-success-color-hover)'",
|
||||
'success-color-active': "~'var(--@{ant-prefix}-success-color-active)'",
|
||||
'success-color-outline': "~'var(--@{ant-prefix}-success-color-outline)'",
|
||||
|
||||
'success-color-deprecated-bg': "~'var(--@{ant-prefix}-success-color-deprecated-bg)'",
|
||||
|
||||
'success-color-deprecated-border': "~'var(--@{ant-prefix}-success-color-deprecated-border)'",
|
||||
|
||||
// >>> Warning
|
||||
'warning-color': "~'var(--@{ant-prefix}-warning-color)'",
|
||||
'warning-color-hover': "~'var(--@{ant-prefix}-warning-color-hover)'",
|
||||
'warning-color-active': "~'var(--@{ant-prefix}-warning-color-active)'",
|
||||
'warning-color-outline': "~'var(--@{ant-prefix}-warning-color-outline)'",
|
||||
|
||||
'warning-color-deprecated-bg': "~'var(--@{ant-prefix}-warning-color-deprecated-bg)'",
|
||||
|
||||
'warning-color-deprecated-border': "~'var(--@{ant-prefix}-warning-color-deprecated-border)'",
|
||||
|
||||
// >>> Error
|
||||
'error-color': "~'var(--@{ant-prefix}-error-color)'",
|
||||
'error-color-hover': "~'var(--@{ant-prefix}-error-color-hover)'",
|
||||
'error-color-active': "~'var(--@{ant-prefix}-error-color-active)'",
|
||||
'error-color-outline': "~'var(--@{ant-prefix}-error-color-outline)'",
|
||||
'error-color-deprecated-bg': "~'var(--@{ant-prefix}-error-color-deprecated-bg)'",
|
||||
|
||||
'error-color-deprecated-border': "~'var(--@{ant-prefix}-error-color-deprecated-border)'",
|
||||
|
||||
// >>> Primary Level Color
|
||||
'primary-1': "~'var(--@{ant-prefix}-primary-1)'",
|
||||
'primary-2': "~'var(--@{ant-prefix}-primary-2)'",
|
||||
'primary-3': "~'var(--@{ant-prefix}-primary-3)'",
|
||||
'primary-4': "~'var(--@{ant-prefix}-primary-4)'",
|
||||
'primary-5': "~'var(--@{ant-prefix}-primary-5)'",
|
||||
'primary-6': "~'var(--@{ant-prefix}-primary-6)'",
|
||||
'primary-7': "~'var(--@{ant-prefix}-primary-7)'",
|
||||
|
||||
// Link
|
||||
'link-hover-color': '@primary-color-hover',
|
||||
'link-active-color': '@primary-color-active',
|
||||
|
||||
'table-selected-row-hover-bg': "~'var(--@{ant-prefix}-primary-color-active-deprecated-d-02)'",
|
||||
|
||||
'picker-basic-cell-hover-with-range-color':
|
||||
"~'var(--@{ant-prefix}-primary-color-deprecated-l-35)'",
|
||||
|
||||
'picker-date-hover-range-border-color': "~'var(--@{ant-prefix}-primary-color-deprecated-l-20)'",
|
||||
|
||||
'calendar-column-active-bg': "~'var(--@{ant-prefix}-primary-color-active-deprecated-f-30)'",
|
||||
|
||||
'slider-handle-color-focus': "~'var(--@{ant-prefix}-primary-color-deprecated-t-20)'",
|
||||
|
||||
'slider-handle-color-focus-shadow': "~'var(--@{ant-prefix}-primary-color-deprecated-f-12)'",
|
||||
|
||||
'slider-dot-border-color-active': "~'var(--@{ant-prefix}-primary-color-deprecated-t-50)'",
|
||||
|
||||
'transfer-item-selected-hover-bg':
|
||||
"~'var(--@{ant-prefix}-primary-color-active-deprecated-d-02)'",
|
||||
|
||||
'alert-success-border-color': '@success-color-deprecated-border',
|
||||
'alert-success-bg-color': '@success-color-deprecated-bg',
|
||||
'alert-info-border-color': '@info-color-deprecated-border',
|
||||
'alert-info-bg-color': '@info-color-deprecated-bg',
|
||||
'alert-warning-border-color': '@warning-color-deprecated-border',
|
||||
'alert-warning-bg-color': '@warning-color-deprecated-bg',
|
||||
'alert-error-border-color': '@error-color-deprecated-border',
|
||||
'alert-error-bg-color': '@error-color-deprecated-bg',
|
||||
};
|
||||
};
|
||||
|
||||
export { cssVariable };
|
13
packages/icpx-platform/build/mockServer.ts
Normal file
@ -0,0 +1,13 @@
|
||||
import { createMockMiddleware } from 'umi-mock-middleware';
|
||||
import express from 'express';
|
||||
const createMockServer = () => {
|
||||
const mockTarget = `http://127.0.0.1:${process.env.MOCK_SERVER_PORT}`;
|
||||
const app = express();
|
||||
app.use(createMockMiddleware());
|
||||
app.listen(process.env.MOCK_SERVER_PORT, () => {
|
||||
console.log(`Mock Server listening at ${mockTarget}`);
|
||||
});
|
||||
return mockTarget;
|
||||
};
|
||||
|
||||
export default createMockServer;
|
24
packages/icpx-platform/deploy/nginx.conf
Normal file
@ -0,0 +1,24 @@
|
||||
server {
|
||||
listen 80;
|
||||
server_name _;
|
||||
# gzip config
|
||||
gzip on;
|
||||
gzip_min_length 1k;
|
||||
gzip_comp_level 9;
|
||||
gzip_types text/plain text/css text/javascript application/json application/javascript application/x-javascript application/xml;
|
||||
gzip_vary on;
|
||||
gzip_disable "MSIE [1-6]\.";
|
||||
|
||||
root /usr/share/nginx/html;
|
||||
include /etc/nginx/mime.types;
|
||||
|
||||
location / {
|
||||
try_files $uri $uri/ /index.html;
|
||||
}
|
||||
|
||||
location /api {
|
||||
proxy_pass https://store.antdv.com/api;
|
||||
proxy_set_header X-Forwarded-Proto $scheme;
|
||||
proxy_set_header X-Real-IP $remote_addr;
|
||||
}
|
||||
}
|
38
packages/icpx-platform/docs/DEPLAY_README_zh_CN.md
Normal file
@ -0,0 +1,38 @@
|
||||
## 部署说明
|
||||
|
||||
部署时,可以使用 `.env` 和 `.env[环境名]` 来进行控制环境变量
|
||||
默认部署配置设定 vue-cli 的 `publicPath` 为 `/`
|
||||
如果当前部署目录为子目录,需要修改 `.env[环境]` 等文件中的相关 `publicPath` 来修改子目录。
|
||||
在使用 `history` 模式路由时,还需要在 nginx 配置文件中配置如下内容:
|
||||
|
||||
```nginx
|
||||
server {
|
||||
listen 443 ssl;
|
||||
server_name 你的域名;
|
||||
index index.html index.htm index.php;
|
||||
root /wwwroot/项目路径;
|
||||
|
||||
# preview
|
||||
location /preview/ {
|
||||
alias /wwwroot/项目路径/preview/;
|
||||
index index.html;
|
||||
try_files $uri $uri/ /index.html =404;
|
||||
}
|
||||
# 测试演示子目录
|
||||
location /test/ {
|
||||
alias /wwwroot/项目路径/test/;
|
||||
index index.html;
|
||||
try_files $uri $uri/ /index.html =404;
|
||||
}
|
||||
# 根目录项目
|
||||
location / {
|
||||
try_files $uri $uri/ /index.html =404;
|
||||
}
|
||||
# 请求的后端 API 地址
|
||||
location /api/ {
|
||||
proxy_set_header X-Real-IP $remote_addr;
|
||||
proxy_set_header X-Forwarded-Proto $scheme;
|
||||
proxy_pass http://127.0.0.1:8080/api/;
|
||||
}
|
||||
}
|
||||
```
|
13
packages/icpx-platform/index.html
Normal file
@ -0,0 +1,13 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8" />
|
||||
<link rel="icon" href="/favicon.ico" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||
<title>Studio</title>
|
||||
</head>
|
||||
<body>
|
||||
<div id="app"></div>
|
||||
<script type="module" src="/src/main.ts"></script>
|
||||
</body>
|
||||
</html>
|
218
packages/icpx-platform/mock/dashboard/analysis.js
Normal file
@ -0,0 +1,218 @@
|
||||
const dayjs = require('dayjs');
|
||||
|
||||
// mock data
|
||||
const visitData = [];
|
||||
const beginDay = new Date().getTime();
|
||||
|
||||
const fakeY = [7, 5, 4, 2, 4, 7, 5, 6, 5, 9, 6, 3, 1, 5, 3, 6, 5];
|
||||
for (let i = 0; i < fakeY.length; i += 1) {
|
||||
visitData.push({
|
||||
x: dayjs(new Date(beginDay + 1000 * 60 * 60 * 24 * i)).format('YYYY-MM-DD'),
|
||||
y: fakeY[i],
|
||||
});
|
||||
}
|
||||
|
||||
const visitData2 = [];
|
||||
const fakeY2 = [1, 6, 4, 8, 3, 7, 2];
|
||||
for (let i = 0; i < fakeY2.length; i += 1) {
|
||||
visitData2.push({
|
||||
x: dayjs(new Date(beginDay + 1000 * 60 * 60 * 24 * i)).format('YYYY-MM-DD'),
|
||||
y: fakeY2[i],
|
||||
});
|
||||
}
|
||||
|
||||
const salesData = [];
|
||||
for (let i = 0; i < 12; i += 1) {
|
||||
salesData.push({
|
||||
x: `${i + 1}月`,
|
||||
y: Math.floor(Math.random() * 1000) + 200,
|
||||
});
|
||||
}
|
||||
const searchData = [];
|
||||
for (let i = 0; i < 50; i += 1) {
|
||||
searchData.push({
|
||||
index: i + 1,
|
||||
keyword: `搜索关键词-${i}`,
|
||||
count: Math.floor(Math.random() * 1000),
|
||||
range: Math.floor(Math.random() * 100),
|
||||
status: Math.floor((Math.random() * 10) % 2),
|
||||
});
|
||||
}
|
||||
const salesTypeData = [
|
||||
{
|
||||
x: '家用电器',
|
||||
y: 4544,
|
||||
},
|
||||
{
|
||||
x: '食用酒水',
|
||||
y: 3321,
|
||||
},
|
||||
{
|
||||
x: '个护健康',
|
||||
y: 3113,
|
||||
},
|
||||
{
|
||||
x: '服饰箱包',
|
||||
y: 2341,
|
||||
},
|
||||
{
|
||||
x: '母婴产品',
|
||||
y: 1231,
|
||||
},
|
||||
{
|
||||
x: '其他',
|
||||
y: 1231,
|
||||
},
|
||||
];
|
||||
|
||||
const salesTypeDataOnline = [
|
||||
{
|
||||
x: '家用电器',
|
||||
y: 244,
|
||||
},
|
||||
{
|
||||
x: '食用酒水',
|
||||
y: 321,
|
||||
},
|
||||
{
|
||||
x: '个护健康',
|
||||
y: 311,
|
||||
},
|
||||
{
|
||||
x: '服饰箱包',
|
||||
y: 41,
|
||||
},
|
||||
{
|
||||
x: '母婴产品',
|
||||
y: 121,
|
||||
},
|
||||
{
|
||||
x: '其他',
|
||||
y: 111,
|
||||
},
|
||||
];
|
||||
|
||||
const salesTypeDataOffline = [
|
||||
{
|
||||
x: '家用电器',
|
||||
y: 99,
|
||||
},
|
||||
{
|
||||
x: '食用酒水',
|
||||
y: 188,
|
||||
},
|
||||
{
|
||||
x: '个护健康',
|
||||
y: 344,
|
||||
},
|
||||
{
|
||||
x: '服饰箱包',
|
||||
y: 255,
|
||||
},
|
||||
{
|
||||
x: '其他',
|
||||
y: 65,
|
||||
},
|
||||
];
|
||||
|
||||
const offlineData = [];
|
||||
for (let i = 0; i < 10; i += 1) {
|
||||
offlineData.push({
|
||||
name: `Stores ${i}`,
|
||||
cvr: Math.ceil(Math.random() * 9) / 10,
|
||||
});
|
||||
}
|
||||
const offlineChartData = [];
|
||||
for (let i = 0; i < 20; i += 1) {
|
||||
offlineChartData.push({
|
||||
x: new Date().getTime() + 1000 * 60 * 30 * i,
|
||||
y1: Math.floor(Math.random() * 100) + 10,
|
||||
y2: Math.floor(Math.random() * 100) + 10,
|
||||
});
|
||||
}
|
||||
|
||||
const radarOriginData = [
|
||||
{
|
||||
name: '个人',
|
||||
ref: 10,
|
||||
koubei: 8,
|
||||
output: 4,
|
||||
contribute: 5,
|
||||
hot: 7,
|
||||
},
|
||||
{
|
||||
name: '团队',
|
||||
ref: 3,
|
||||
koubei: 9,
|
||||
output: 6,
|
||||
contribute: 3,
|
||||
hot: 1,
|
||||
},
|
||||
{
|
||||
name: '部门',
|
||||
ref: 4,
|
||||
koubei: 1,
|
||||
output: 6,
|
||||
contribute: 5,
|
||||
hot: 7,
|
||||
},
|
||||
];
|
||||
|
||||
const radarData = [];
|
||||
const radarTitleMap = {
|
||||
ref: '引用',
|
||||
koubei: '口碑',
|
||||
output: '产量',
|
||||
contribute: '贡献',
|
||||
hot: '热度',
|
||||
};
|
||||
radarOriginData.forEach(item => {
|
||||
Object.keys(item).forEach(key => {
|
||||
if (key !== 'name') {
|
||||
radarData.push({
|
||||
name: item.name,
|
||||
label: radarTitleMap[key],
|
||||
value: item[key],
|
||||
});
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
const getFakeChartData = {
|
||||
visitData,
|
||||
visitData2,
|
||||
salesData,
|
||||
searchData,
|
||||
offlineData,
|
||||
offlineChartData,
|
||||
salesTypeData,
|
||||
salesTypeDataOnline,
|
||||
salesTypeDataOffline,
|
||||
radarData,
|
||||
};
|
||||
|
||||
module.exports = {
|
||||
'GET /api/dashboard/fake_chart_data': (req, res) => {
|
||||
return new Promise(resolve => {
|
||||
// mock loading time 1500ms
|
||||
setTimeout(() => {
|
||||
resolve();
|
||||
}, 300);
|
||||
}).then(() => {
|
||||
res.send({
|
||||
...getFakeChartData,
|
||||
});
|
||||
});
|
||||
},
|
||||
|
||||
'GET /api/dashboard/fake_chart_sales_data': (req, res) => {
|
||||
return new Promise(resolve => {
|
||||
// mock loading time 1500ms
|
||||
setTimeout(() => {
|
||||
resolve();
|
||||
}, 300);
|
||||
}).then(() => {
|
||||
res.send(getFakeChartData.salesData);
|
||||
});
|
||||
},
|
||||
};
|
7
packages/icpx-platform/mock/dashboard/monitor.js
Normal file
@ -0,0 +1,7 @@
|
||||
const mockjs = require('mockjs');
|
||||
|
||||
module.exports = {
|
||||
'GET /api/tags': mockjs.mock({
|
||||
'list|100': [{ name: '@city', 'value|1-100': 150, 'type|0-2': 1 }],
|
||||
}),
|
||||
};
|
393
packages/icpx-platform/mock/dashboard/workplace.js
Normal file
@ -0,0 +1,393 @@
|
||||
const dayjs = require('dayjs');
|
||||
// mock data
|
||||
const visitData = [];
|
||||
const beginDay = new Date().getTime();
|
||||
|
||||
const fakeY = [7, 5, 4, 2, 4, 7, 5, 6, 5, 9, 6, 3, 1, 5, 3, 6, 5];
|
||||
for (let i = 0; i < fakeY.length; i += 1) {
|
||||
visitData.push({
|
||||
x: dayjs(new Date(beginDay + 1000 * 60 * 60 * 24 * i)).format('YYYY-MM-DD'),
|
||||
y: fakeY[i],
|
||||
});
|
||||
}
|
||||
|
||||
const visitData2 = [];
|
||||
const fakeY2 = [1, 6, 4, 8, 3, 7, 2];
|
||||
for (let i = 0; i < fakeY2.length; i += 1) {
|
||||
visitData2.push({
|
||||
x: dayjs(new Date(beginDay + 1000 * 60 * 60 * 24 * i)).format('YYYY-MM-DD'),
|
||||
y: fakeY2[i],
|
||||
});
|
||||
}
|
||||
|
||||
const salesData = [];
|
||||
for (let i = 0; i < 12; i += 1) {
|
||||
salesData.push({
|
||||
x: `${i + 1}月`,
|
||||
y: Math.floor(Math.random() * 1000) + 200,
|
||||
});
|
||||
}
|
||||
const searchData = [];
|
||||
for (let i = 0; i < 50; i += 1) {
|
||||
searchData.push({
|
||||
index: i + 1,
|
||||
keyword: `搜索关键词-${i}`,
|
||||
count: Math.floor(Math.random() * 1000),
|
||||
range: Math.floor(Math.random() * 100),
|
||||
status: Math.floor((Math.random() * 10) % 2),
|
||||
});
|
||||
}
|
||||
const salesTypeData = [
|
||||
{
|
||||
x: '家用电器',
|
||||
y: 4544,
|
||||
},
|
||||
{
|
||||
x: '食用酒水',
|
||||
y: 3321,
|
||||
},
|
||||
{
|
||||
x: '个护健康',
|
||||
y: 3113,
|
||||
},
|
||||
{
|
||||
x: '服饰箱包',
|
||||
y: 2341,
|
||||
},
|
||||
{
|
||||
x: '母婴产品',
|
||||
y: 1231,
|
||||
},
|
||||
{
|
||||
x: '其他',
|
||||
y: 1231,
|
||||
},
|
||||
];
|
||||
|
||||
const salesTypeDataOnline = [
|
||||
{
|
||||
x: '家用电器',
|
||||
y: 244,
|
||||
},
|
||||
{
|
||||
x: '食用酒水',
|
||||
y: 321,
|
||||
},
|
||||
{
|
||||
x: '个护健康',
|
||||
y: 311,
|
||||
},
|
||||
{
|
||||
x: '服饰箱包',
|
||||
y: 41,
|
||||
},
|
||||
{
|
||||
x: '母婴产品',
|
||||
y: 121,
|
||||
},
|
||||
{
|
||||
x: '其他',
|
||||
y: 111,
|
||||
},
|
||||
];
|
||||
|
||||
const salesTypeDataOffline = [
|
||||
{
|
||||
x: '家用电器',
|
||||
y: 99,
|
||||
},
|
||||
{
|
||||
x: '食用酒水',
|
||||
y: 188,
|
||||
},
|
||||
{
|
||||
x: '个护健康',
|
||||
y: 344,
|
||||
},
|
||||
{
|
||||
x: '服饰箱包',
|
||||
y: 255,
|
||||
},
|
||||
{
|
||||
x: '其他',
|
||||
y: 65,
|
||||
},
|
||||
];
|
||||
|
||||
const offlineData = [];
|
||||
for (let i = 0; i < 10; i += 1) {
|
||||
offlineData.push({
|
||||
name: `Stores ${i}`,
|
||||
cvr: Math.ceil(Math.random() * 9) / 10,
|
||||
});
|
||||
}
|
||||
const offlineChartData = [];
|
||||
for (let i = 0; i < 20; i += 1) {
|
||||
offlineChartData.push({
|
||||
x: new Date().getTime() + 1000 * 60 * 30 * i,
|
||||
y1: Math.floor(Math.random() * 100) + 10,
|
||||
y2: Math.floor(Math.random() * 100) + 10,
|
||||
});
|
||||
}
|
||||
|
||||
const titles = [
|
||||
'Alipay',
|
||||
'Angular',
|
||||
'Ant Design',
|
||||
'Ant Design Pro',
|
||||
'Bootstrap',
|
||||
'React',
|
||||
'Vue',
|
||||
'Webpack',
|
||||
];
|
||||
const avatars = [
|
||||
'https://gw.alipayobjects.com/zos/rmsportal/WdGqmHpayyMjiEhcKoVE.png', // Alipay
|
||||
'https://gw.alipayobjects.com/zos/rmsportal/zOsKZmFRdUtvpqCImOVY.png', // Angular
|
||||
'https://gw.alipayobjects.com/zos/rmsportal/dURIMkkrRFpPgTuzkwnB.png', // Ant Design
|
||||
'https://gw.alipayobjects.com/zos/rmsportal/sfjbOqnsXXJgNCjCzDBL.png', // Ant Design Pro
|
||||
'https://gw.alipayobjects.com/zos/rmsportal/siCrBXXhmvTQGWPNLBow.png', // Bootstrap
|
||||
'https://gw.alipayobjects.com/zos/rmsportal/kZzEzemZyKLKFsojXItE.png', // React
|
||||
'https://gw.alipayobjects.com/zos/rmsportal/ComBAopevLwENQdKWiIn.png', // Vue
|
||||
'https://gw.alipayobjects.com/zos/rmsportal/nxkuOJlFJuAUhzlMTCEe.png', // Webpack
|
||||
];
|
||||
|
||||
const avatars2 = [
|
||||
'https://gw.alipayobjects.com/zos/rmsportal/BiazfanxmamNRoxxVxka.png',
|
||||
'https://gw.alipayobjects.com/zos/rmsportal/cnrhVkzwxjPwAaCfPbdc.png',
|
||||
'https://gw.alipayobjects.com/zos/rmsportal/gaOngJwsRYRaVAuXXcmB.png',
|
||||
'https://gw.alipayobjects.com/zos/rmsportal/ubnKSIfAJTxIgXOKlciN.png',
|
||||
'https://gw.alipayobjects.com/zos/rmsportal/WhxKECPNujWoWEFNdnJE.png',
|
||||
'https://gw.alipayobjects.com/zos/rmsportal/jZUIxmJycoymBprLOUbT.png',
|
||||
'https://gw.alipayobjects.com/zos/rmsportal/psOgztMplJMGpVEqfcgF.png',
|
||||
'https://gw.alipayobjects.com/zos/rmsportal/ZpBqSxLxVEXfcUNoPKrz.png',
|
||||
'https://gw.alipayobjects.com/zos/rmsportal/laiEnJdGHVOhJrUShBaJ.png',
|
||||
'https://gw.alipayobjects.com/zos/rmsportal/UrQsqscbKEpNuJcvBZBu.png',
|
||||
];
|
||||
|
||||
const getNotice = [
|
||||
{
|
||||
id: 'xxx1',
|
||||
title: titles[0],
|
||||
logo: avatars[0],
|
||||
description: '那是一种内在的东西,他们到达不了,也无法触及的',
|
||||
updatedAt: new Date(),
|
||||
member: '科学搬砖组',
|
||||
href: '',
|
||||
memberLink: '',
|
||||
},
|
||||
{
|
||||
id: 'xxx2',
|
||||
title: titles[1],
|
||||
logo: avatars[1],
|
||||
description: '希望是一个好东西,也许是最好的,好东西是不会消亡的',
|
||||
updatedAt: new Date('2017-07-24'),
|
||||
member: '全组都是吴彦祖',
|
||||
href: '',
|
||||
memberLink: '',
|
||||
},
|
||||
{
|
||||
id: 'xxx3',
|
||||
title: titles[2],
|
||||
logo: avatars[2],
|
||||
description: '城镇中有那么多的酒馆,她却偏偏走进了我的酒馆',
|
||||
updatedAt: new Date(),
|
||||
member: '中二少女团',
|
||||
href: '',
|
||||
memberLink: '',
|
||||
},
|
||||
{
|
||||
id: 'xxx4',
|
||||
title: titles[3],
|
||||
logo: avatars[3],
|
||||
description: '那时候我只会想自己想要什么,从不想自己拥有什么',
|
||||
updatedAt: new Date('2017-07-23'),
|
||||
member: '程序员日常',
|
||||
href: '',
|
||||
memberLink: '',
|
||||
},
|
||||
{
|
||||
id: 'xxx5',
|
||||
title: titles[4],
|
||||
logo: avatars[4],
|
||||
description: '凛冬将至',
|
||||
updatedAt: new Date('2017-07-23'),
|
||||
member: '高逼格设计天团',
|
||||
href: '',
|
||||
memberLink: '',
|
||||
},
|
||||
{
|
||||
id: 'xxx6',
|
||||
title: titles[5],
|
||||
logo: avatars[5],
|
||||
description: '生命就像一盒巧克力,结果往往出人意料',
|
||||
updatedAt: new Date('2017-07-23'),
|
||||
member: '骗你来学计算机',
|
||||
href: '',
|
||||
memberLink: '',
|
||||
},
|
||||
];
|
||||
|
||||
const getActivities = [
|
||||
{
|
||||
id: 'trend-1',
|
||||
updatedAt: new Date(),
|
||||
user: {
|
||||
name: '曲丽丽',
|
||||
avatar: avatars2[0],
|
||||
},
|
||||
group: {
|
||||
name: '高逼格设计天团',
|
||||
link: 'http://github.com/',
|
||||
},
|
||||
project: {
|
||||
name: '六月迭代',
|
||||
link: 'http://github.com/',
|
||||
},
|
||||
template: '在 @{group} 新建项目 @{project}',
|
||||
},
|
||||
{
|
||||
id: 'trend-2',
|
||||
updatedAt: new Date(),
|
||||
user: {
|
||||
name: '付小小',
|
||||
avatar: avatars2[1],
|
||||
},
|
||||
group: {
|
||||
name: '高逼格设计天团',
|
||||
link: 'http://github.com/',
|
||||
},
|
||||
project: {
|
||||
name: '六月迭代',
|
||||
link: 'http://github.com/',
|
||||
},
|
||||
template: '在 @{group} 新建项目 @{project}',
|
||||
},
|
||||
{
|
||||
id: 'trend-3',
|
||||
updatedAt: new Date(),
|
||||
user: {
|
||||
name: '林东东',
|
||||
avatar: avatars2[2],
|
||||
},
|
||||
group: {
|
||||
name: '中二少女团',
|
||||
link: 'http://github.com/',
|
||||
},
|
||||
project: {
|
||||
name: '六月迭代',
|
||||
link: 'http://github.com/',
|
||||
},
|
||||
template: '在 @{group} 新建项目 @{project}',
|
||||
},
|
||||
{
|
||||
id: 'trend-4',
|
||||
updatedAt: new Date(),
|
||||
user: {
|
||||
name: '周星星',
|
||||
avatar: avatars2[4],
|
||||
},
|
||||
project: {
|
||||
name: '5 月日常迭代',
|
||||
link: 'http://github.com/',
|
||||
},
|
||||
template: '将 @{project} 更新至已发布状态',
|
||||
},
|
||||
{
|
||||
id: 'trend-5',
|
||||
updatedAt: new Date(),
|
||||
user: {
|
||||
name: '朱偏右',
|
||||
avatar: avatars2[3],
|
||||
},
|
||||
project: {
|
||||
name: '工程效能',
|
||||
link: 'http://github.com/',
|
||||
},
|
||||
comment: {
|
||||
name: '留言',
|
||||
link: 'http://github.com/',
|
||||
},
|
||||
template: '在 @{project} 发布了 @{comment}',
|
||||
},
|
||||
{
|
||||
id: 'trend-6',
|
||||
updatedAt: new Date(),
|
||||
user: {
|
||||
name: '乐哥',
|
||||
avatar: avatars2[5],
|
||||
},
|
||||
group: {
|
||||
name: '程序员日常',
|
||||
link: 'http://github.com/',
|
||||
},
|
||||
project: {
|
||||
name: '品牌迭代',
|
||||
link: 'http://github.com/',
|
||||
},
|
||||
template: '在 @{group} 新建项目 @{project}',
|
||||
},
|
||||
];
|
||||
|
||||
const radarOriginData = [
|
||||
{
|
||||
name: '个人',
|
||||
ref: 10,
|
||||
koubei: 8,
|
||||
output: 4,
|
||||
contribute: 5,
|
||||
hot: 7,
|
||||
},
|
||||
{
|
||||
name: '团队',
|
||||
ref: 3,
|
||||
koubei: 9,
|
||||
output: 6,
|
||||
contribute: 3,
|
||||
hot: 1,
|
||||
},
|
||||
{
|
||||
name: '部门',
|
||||
ref: 4,
|
||||
koubei: 1,
|
||||
output: 6,
|
||||
contribute: 5,
|
||||
hot: 7,
|
||||
},
|
||||
];
|
||||
|
||||
const radarData = [];
|
||||
const radarTitleMap = {
|
||||
ref: '引用',
|
||||
koubei: '口碑',
|
||||
output: '产量',
|
||||
contribute: '贡献',
|
||||
hot: '热度',
|
||||
};
|
||||
radarOriginData.forEach(item => {
|
||||
Object.keys(item).forEach(key => {
|
||||
if (key !== 'name') {
|
||||
radarData.push({
|
||||
name: item.name,
|
||||
label: radarTitleMap[key],
|
||||
value: item[key],
|
||||
});
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
module.exports = {
|
||||
'GET /api/project/notice': getNotice,
|
||||
'GET /api/activities': getActivities,
|
||||
'GET /api/fake_chart_data': {
|
||||
visitData,
|
||||
visitData2,
|
||||
salesData,
|
||||
searchData,
|
||||
offlineData,
|
||||
offlineChartData,
|
||||
salesTypeData,
|
||||
salesTypeDataOnline,
|
||||
salesTypeDataOffline,
|
||||
radarData,
|
||||
},
|
||||
};
|
29
packages/icpx-platform/mock/form.js
Normal file
@ -0,0 +1,29 @@
|
||||
module.exports = {
|
||||
'POST /api/forms/basic-form': (req, res) => {
|
||||
const { title, goal } = req.body;
|
||||
return new Promise((resolve, reject) => {
|
||||
setTimeout(() => {
|
||||
resolve();
|
||||
}, 1500);
|
||||
}).then(() => {
|
||||
res.send({
|
||||
message: 'submit.ok',
|
||||
code: 200,
|
||||
});
|
||||
});
|
||||
},
|
||||
|
||||
'POST /api/forms': (req, res) => {
|
||||
const body = req.body;
|
||||
return new Promise((resolve, reject) => {
|
||||
setTimeout(() => {
|
||||
resolve();
|
||||
}, 3000);
|
||||
}).then(() => {
|
||||
res.send({
|
||||
message: 'transfer.success',
|
||||
code: 0,
|
||||
});
|
||||
});
|
||||
},
|
||||
};
|
27
packages/icpx-platform/mock/index.js
Normal file
@ -0,0 +1,27 @@
|
||||
const user = require('./user.js');
|
||||
const userNav = require('./userNav.js');
|
||||
const message = require('./message.js');
|
||||
const listTableList = require('./listTableList.js');
|
||||
const form = require('./form.js');
|
||||
const dashboardAnalysis = require('./dashboard/analysis.js');
|
||||
const dashboardMonitor = require('./dashboard/monitor.js');
|
||||
const dashboardWorkplace = require('./dashboard/workplace.js');
|
||||
const basicList = require('./list/basic-list.js');
|
||||
const cardList = require('./list/card-list.js');
|
||||
const permission = require('./permission/index.js');
|
||||
const notices = require('./notices.js');
|
||||
|
||||
module.exports = {
|
||||
...user,
|
||||
...userNav,
|
||||
...form,
|
||||
...message,
|
||||
...listTableList,
|
||||
...dashboardAnalysis,
|
||||
...dashboardMonitor,
|
||||
...dashboardWorkplace,
|
||||
...basicList,
|
||||
...cardList,
|
||||
...permission,
|
||||
...notices,
|
||||
};
|
149
packages/icpx-platform/mock/list/basic-list.js
Normal file
@ -0,0 +1,149 @@
|
||||
const titles = [
|
||||
'Alipay',
|
||||
'Angular',
|
||||
'Ant Design',
|
||||
'Ant Design Pro',
|
||||
'Bootstrap',
|
||||
'React',
|
||||
'Vue',
|
||||
'Webpack',
|
||||
];
|
||||
const avatars = [
|
||||
'https://gw.alipayobjects.com/zos/rmsportal/WdGqmHpayyMjiEhcKoVE.png', // Alipay
|
||||
'https://gw.alipayobjects.com/zos/rmsportal/zOsKZmFRdUtvpqCImOVY.png', // Angular
|
||||
'https://gw.alipayobjects.com/zos/rmsportal/dURIMkkrRFpPgTuzkwnB.png', // Ant Design
|
||||
'https://gw.alipayobjects.com/zos/rmsportal/sfjbOqnsXXJgNCjCzDBL.png', // Ant Design Pro
|
||||
'https://gw.alipayobjects.com/zos/rmsportal/siCrBXXhmvTQGWPNLBow.png', // Bootstrap
|
||||
'https://gw.alipayobjects.com/zos/rmsportal/kZzEzemZyKLKFsojXItE.png', // React
|
||||
'https://gw.alipayobjects.com/zos/rmsportal/ComBAopevLwENQdKWiIn.png', // Vue
|
||||
'https://gw.alipayobjects.com/zos/rmsportal/nxkuOJlFJuAUhzlMTCEe.png', // Webpack
|
||||
];
|
||||
|
||||
const covers = [
|
||||
'https://gw.alipayobjects.com/zos/rmsportal/uMfMFlvUuceEyPpotzlq.png',
|
||||
'https://gw.alipayobjects.com/zos/rmsportal/iZBVOIhGJiAnhplqjvZW.png',
|
||||
'https://gw.alipayobjects.com/zos/rmsportal/iXjVmWVHbCJAyqvDxdtx.png',
|
||||
'https://gw.alipayobjects.com/zos/rmsportal/gLaIAoVWTtLbBWZNYEMg.png',
|
||||
];
|
||||
const desc = [
|
||||
'那是一种内在的东西, 他们到达不了,也无法触及的',
|
||||
'希望是一个好东西,也许是最好的,好东西是不会消亡的',
|
||||
'生命就像一盒巧克力,结果往往出人意料',
|
||||
'城镇中有那么多的酒馆,她却偏偏走进了我的酒馆',
|
||||
'那时候我只会想自己想要什么,从不想自己拥有什么',
|
||||
];
|
||||
|
||||
const user = [
|
||||
'付小小',
|
||||
'曲丽丽',
|
||||
'林东东',
|
||||
'周星星',
|
||||
'吴加好',
|
||||
'朱偏右',
|
||||
'鱼酱',
|
||||
'乐哥',
|
||||
'谭小仪',
|
||||
'仲尼',
|
||||
];
|
||||
|
||||
function fakeList(count) {
|
||||
const list = [];
|
||||
for (let i = 0; i < count; i += 1) {
|
||||
list.push({
|
||||
id: `fake-list-${i}`,
|
||||
owner: user[i % 10],
|
||||
title: titles[i % 8],
|
||||
avatar: avatars[i % 8],
|
||||
cover: parseInt(`${i / 4}`, 10) % 2 === 0 ? covers[i % 4] : covers[3 - (i % 4)],
|
||||
status: ['active', 'exception', 'normal'][i % 3],
|
||||
percent: Math.ceil(Math.random() * 50) + 50,
|
||||
logo: avatars[i % 8],
|
||||
href: 'https://ant.design',
|
||||
updatedAt: new Date(new Date().getTime() - 1000 * 60 * 60 * 2 * i).getTime(),
|
||||
createdAt: new Date(new Date().getTime() - 1000 * 60 * 60 * 2 * i).getTime(),
|
||||
subDescription: desc[i % 5],
|
||||
description:
|
||||
'在中台产品的研发过程中,会出现不同的设计规范和实现方式,但其中往往存在很多类似的页面和组件,这些类似的组件会被抽离成一套标准规范。',
|
||||
activeUser: Math.ceil(Math.random() * 100000) + 100000,
|
||||
newUser: Math.ceil(Math.random() * 1000) + 1000,
|
||||
star: Math.ceil(Math.random() * 100) + 100,
|
||||
like: Math.ceil(Math.random() * 100) + 100,
|
||||
message: Math.ceil(Math.random() * 10) + 10,
|
||||
content:
|
||||
'段落示意:蚂蚁金服设计平台 ant.design,用最小的工作量,无缝接入蚂蚁金服生态,提供跨越设计与开发的体验解决方案。蚂蚁金服设计平台 ant.design,用最小的工作量,无缝接入蚂蚁金服生态,提供跨越设计与开发的体验解决方案。',
|
||||
members: [
|
||||
{
|
||||
avatar: 'https://gw.alipayobjects.com/zos/rmsportal/ZiESqWwCXBRQoaPONSJe.png',
|
||||
name: '曲丽丽',
|
||||
id: 'member1',
|
||||
},
|
||||
{
|
||||
avatar: 'https://gw.alipayobjects.com/zos/rmsportal/tBOxZPlITHqwlGjsJWaF.png',
|
||||
name: '王昭君',
|
||||
id: 'member2',
|
||||
},
|
||||
{
|
||||
avatar: 'https://gw.alipayobjects.com/zos/rmsportal/sBxjgqiuHMGRkIjqlQCd.png',
|
||||
name: '董娜娜',
|
||||
id: 'member3',
|
||||
},
|
||||
],
|
||||
});
|
||||
}
|
||||
|
||||
return list;
|
||||
}
|
||||
let sourceData = [];
|
||||
|
||||
function getFakeList(req, res) {
|
||||
const params = req.query;
|
||||
|
||||
const count = params.count * 1 || 20;
|
||||
|
||||
const result = fakeList(count);
|
||||
sourceData = result;
|
||||
return new Promise(resolve => {
|
||||
setTimeout(() => {
|
||||
resolve();
|
||||
}, 800);
|
||||
}).then(() => {
|
||||
res.json(result);
|
||||
});
|
||||
}
|
||||
|
||||
function postFakeList(req, res) {
|
||||
const { /* url = '', */ body } = req;
|
||||
// const params = getUrlParams(url);
|
||||
const { method, id } = body;
|
||||
// const count = (params.count * 1) || 20;
|
||||
let result = sourceData || [];
|
||||
|
||||
switch (method) {
|
||||
case 'delete':
|
||||
result = result.filter(item => item.id !== id);
|
||||
break;
|
||||
case 'update':
|
||||
result.forEach((item, i) => {
|
||||
if (item.id === id) {
|
||||
result[i] = { ...item, ...body };
|
||||
}
|
||||
});
|
||||
break;
|
||||
case 'post':
|
||||
result.unshift({
|
||||
...body,
|
||||
id: `fake-list-${result.length}`,
|
||||
createdAt: new Date().getTime(),
|
||||
});
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
return res.json(result);
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
'GET /api/fake_list': getFakeList,
|
||||
'POST /api/fake_list': postFakeList,
|
||||
};
|
114
packages/icpx-platform/mock/list/card-list.js
Normal file
@ -0,0 +1,114 @@
|
||||
const titles = [
|
||||
'Alipay',
|
||||
'Angular',
|
||||
'Ant Design',
|
||||
'Ant Design Pro',
|
||||
'Bootstrap',
|
||||
'React',
|
||||
'Vue',
|
||||
'Webpack',
|
||||
];
|
||||
const avatars = [
|
||||
'https://gw.alipayobjects.com/zos/rmsportal/WdGqmHpayyMjiEhcKoVE.png', // Alipay
|
||||
'https://gw.alipayobjects.com/zos/rmsportal/zOsKZmFRdUtvpqCImOVY.png', // Angular
|
||||
'https://gw.alipayobjects.com/zos/rmsportal/dURIMkkrRFpPgTuzkwnB.png', // Ant Design
|
||||
'https://gw.alipayobjects.com/zos/rmsportal/sfjbOqnsXXJgNCjCzDBL.png', // Ant Design Pro
|
||||
'https://gw.alipayobjects.com/zos/rmsportal/siCrBXXhmvTQGWPNLBow.png', // Bootstrap
|
||||
'https://gw.alipayobjects.com/zos/rmsportal/kZzEzemZyKLKFsojXItE.png', // React
|
||||
'https://gw.alipayobjects.com/zos/rmsportal/ComBAopevLwENQdKWiIn.png', // Vue
|
||||
'https://gw.alipayobjects.com/zos/rmsportal/nxkuOJlFJuAUhzlMTCEe.png', // Webpack
|
||||
];
|
||||
|
||||
const covers = [
|
||||
'https://gw.alipayobjects.com/zos/rmsportal/uMfMFlvUuceEyPpotzlq.png',
|
||||
'https://gw.alipayobjects.com/zos/rmsportal/iZBVOIhGJiAnhplqjvZW.png',
|
||||
'https://gw.alipayobjects.com/zos/rmsportal/iXjVmWVHbCJAyqvDxdtx.png',
|
||||
'https://gw.alipayobjects.com/zos/rmsportal/gLaIAoVWTtLbBWZNYEMg.png',
|
||||
];
|
||||
const desc = [
|
||||
'那是一种内在的东西, 他们到达不了,也无法触及的',
|
||||
'希望是一个好东西,也许是最好的,好东西是不会消亡的',
|
||||
'生命就像一盒巧克力,结果往往出人意料',
|
||||
'城镇中有那么多的酒馆,她却偏偏走进了我的酒馆',
|
||||
'那时候我只会想自己想要什么,从不想自己拥有什么',
|
||||
];
|
||||
|
||||
const user = [
|
||||
'付小小',
|
||||
'曲丽丽',
|
||||
'林东东',
|
||||
'周星星',
|
||||
'吴加好',
|
||||
'朱偏右',
|
||||
'鱼酱',
|
||||
'乐哥',
|
||||
'谭小仪',
|
||||
'仲尼',
|
||||
];
|
||||
|
||||
function fakeList(count) {
|
||||
const list = [];
|
||||
for (let i = 0; i < count; i += 1) {
|
||||
list.push({
|
||||
id: `fake-list-${i}`,
|
||||
owner: user[i % 10],
|
||||
title: titles[i % 8],
|
||||
avatar: avatars[i % 8],
|
||||
cover: parseInt(`${i / 4}`, 10) % 2 === 0 ? covers[i % 4] : covers[3 - (i % 4)],
|
||||
status: ['active', 'exception', 'normal'][i % 3],
|
||||
percent: Math.ceil(Math.random() * 50) + 50,
|
||||
logo: avatars[i % 8],
|
||||
href: 'https://ant.design',
|
||||
updatedAt: new Date(new Date().getTime() - 1000 * 60 * 60 * 2 * i).getTime(),
|
||||
createdAt: new Date(new Date().getTime() - 1000 * 60 * 60 * 2 * i).getTime(),
|
||||
subDescription: desc[i % 5],
|
||||
description:
|
||||
'在中台产品的研发过程中,会出现不同的设计规范和实现方式,但其中往往存在很多类似的页面和组件,这些类似的组件会被抽离成一套标准规范。',
|
||||
activeUser: Math.ceil(Math.random() * 100000) + 100000,
|
||||
newUser: Math.ceil(Math.random() * 1000) + 1000,
|
||||
star: Math.ceil(Math.random() * 100) + 100,
|
||||
like: Math.ceil(Math.random() * 100) + 100,
|
||||
message: Math.ceil(Math.random() * 10) + 10,
|
||||
content:
|
||||
'段落示意:蚂蚁金服设计平台 ant.design,用最小的工作量,无缝接入蚂蚁金服生态,提供跨越设计与开发的体验解决方案。蚂蚁金服设计平台 ant.design,用最小的工作量,无缝接入蚂蚁金服生态,提供跨越设计与开发的体验解决方案。',
|
||||
members: [
|
||||
{
|
||||
avatar: 'https://gw.alipayobjects.com/zos/rmsportal/ZiESqWwCXBRQoaPONSJe.png',
|
||||
name: '曲丽丽',
|
||||
id: 'member1',
|
||||
},
|
||||
{
|
||||
avatar: 'https://gw.alipayobjects.com/zos/rmsportal/tBOxZPlITHqwlGjsJWaF.png',
|
||||
name: '王昭君',
|
||||
id: 'member2',
|
||||
},
|
||||
{
|
||||
avatar: 'https://gw.alipayobjects.com/zos/rmsportal/sBxjgqiuHMGRkIjqlQCd.png',
|
||||
name: '董娜娜',
|
||||
id: 'member3',
|
||||
},
|
||||
],
|
||||
});
|
||||
}
|
||||
|
||||
return list;
|
||||
}
|
||||
|
||||
function getFakeList(req, res) {
|
||||
const params = req.query;
|
||||
|
||||
const count = params.count * 1 || 20;
|
||||
|
||||
const result = fakeList(count);
|
||||
return new Promise(resolve => {
|
||||
setTimeout(() => {
|
||||
resolve();
|
||||
}, 500);
|
||||
}).then(() => {
|
||||
res.json(result);
|
||||
});
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
'GET /api/fake_list': getFakeList,
|
||||
};
|
105
packages/icpx-platform/mock/listTableList.js
Normal file
@ -0,0 +1,105 @@
|
||||
// mock tableListDataSource
|
||||
const genList = (current, pageSize, status = undefined) => {
|
||||
const tableListDataSource = [];
|
||||
const filterStatus = status && status.length > 0;
|
||||
|
||||
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: filterStatus
|
||||
? status[Math.floor(Math.random() * 10) % status.length]
|
||||
: Math.floor(Math.random() * 10) % 4,
|
||||
updatedAt: new Date(),
|
||||
createdAt: new Date(),
|
||||
progress: Math.ceil(Math.random() * 100),
|
||||
});
|
||||
}
|
||||
tableListDataSource.reverse();
|
||||
return tableListDataSource;
|
||||
};
|
||||
|
||||
function getRule(req, res, u) {
|
||||
let realUrl = u;
|
||||
if (!realUrl || Object.prototype.toString.call(realUrl) !== '[object String]') {
|
||||
realUrl = req.url;
|
||||
}
|
||||
const { current = 1, pageSize = 10, status } = req.query;
|
||||
const params = req.query || {};
|
||||
|
||||
const tableListDataSource = genList(1, 100, status);
|
||||
|
||||
let dataSource = [...tableListDataSource].slice((current - 1) * pageSize, current * pageSize);
|
||||
const sorter = params.sorter && JSON.parse(params.sorter);
|
||||
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);
|
||||
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 new Promise(resolve => {
|
||||
setTimeout(() => {
|
||||
resolve();
|
||||
}, 800);
|
||||
}).then(() => {
|
||||
res.json(result);
|
||||
});
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
'GET /api/rule': getRule,
|
||||
};
|
10
packages/icpx-platform/mock/message.js
Normal file
@ -0,0 +1,10 @@
|
||||
const Mock = require('mockjs');
|
||||
|
||||
module.exports = {
|
||||
'POST /api/message/sms': (req, res) => {
|
||||
return res.json({ captcha: Mock.mock('@integer(10000, 99999)') });
|
||||
},
|
||||
'GET /api/message/captcha/sms': (req, res) => {
|
||||
return res.json({ captcha: Mock.mock('@integer(10000, 99999)') });
|
||||
},
|
||||
};
|
104
packages/icpx-platform/mock/notices.js
Normal file
@ -0,0 +1,104 @@
|
||||
const notices = [
|
||||
// notices
|
||||
{
|
||||
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',
|
||||
},
|
||||
];
|
||||
|
||||
module.exports = {
|
||||
'GET /api/notices': (req, res) => {
|
||||
res.json(notices);
|
||||
},
|
||||
};
|
180
packages/icpx-platform/mock/permission/index.js
Normal file
@ -0,0 +1,180 @@
|
||||
// role table
|
||||
const roleDataSource = [
|
||||
{
|
||||
id: 1,
|
||||
name: '管理员',
|
||||
describe: '管理员角色',
|
||||
},
|
||||
{
|
||||
id: 2,
|
||||
name: '会员',
|
||||
describe: '普通会员角色',
|
||||
},
|
||||
];
|
||||
|
||||
// permission table
|
||||
const permissionDataSource = [
|
||||
{
|
||||
id: 1000,
|
||||
name: 'dashboard',
|
||||
label: '仪表盘',
|
||||
actions: ['add', 'update', 'query'],
|
||||
},
|
||||
{
|
||||
id: 1001,
|
||||
name: 'form',
|
||||
label: '表单',
|
||||
actions: ['add', 'delete', 'update', 'query'],
|
||||
},
|
||||
{
|
||||
id: 1002,
|
||||
name: 'list',
|
||||
label: '列表',
|
||||
actions: ['add', 'delete', 'update', 'query', 'import', 'export'],
|
||||
},
|
||||
];
|
||||
|
||||
// role_permission table
|
||||
const rolePermissionJoinDataSource = [
|
||||
{
|
||||
uid: 1,
|
||||
roleId: 1,
|
||||
permissionId: 1000,
|
||||
},
|
||||
{
|
||||
uid: 2,
|
||||
roleId: 1,
|
||||
permissionId: 1001,
|
||||
},
|
||||
{
|
||||
uid: 3,
|
||||
roleId: 1,
|
||||
permissionId: 1002,
|
||||
},
|
||||
{
|
||||
uid: 4,
|
||||
roleId: 2,
|
||||
permissionId: 1001,
|
||||
},
|
||||
];
|
||||
|
||||
const genRoles = () => {
|
||||
return roleDataSource.map(item => {
|
||||
const rpList = rolePermissionJoinDataSource
|
||||
.filter(rp => rp.roleId === item.id)
|
||||
.map(rp => {
|
||||
const currentAllowPermissions = permissionDataSource.filter(
|
||||
permission => permission.id === rp.permissionId,
|
||||
);
|
||||
return currentAllowPermissions;
|
||||
})
|
||||
.flat();
|
||||
|
||||
return {
|
||||
...item,
|
||||
permissions: rpList,
|
||||
};
|
||||
});
|
||||
};
|
||||
|
||||
const genPermissions = () => {
|
||||
return permissionDataSource.concat();
|
||||
};
|
||||
|
||||
const getRoles = (req, res) => {
|
||||
const { current = 1, pageSize = 10 } = req.query;
|
||||
const params = req.query || {};
|
||||
|
||||
const dataSource = genRoles();
|
||||
|
||||
const result = {
|
||||
data: dataSource,
|
||||
total: dataSource.length,
|
||||
success: true,
|
||||
pageSize,
|
||||
current: parseInt(`${current}`, 10) || 1,
|
||||
};
|
||||
|
||||
// 模拟请求延迟
|
||||
return new Promise(resolve => {
|
||||
setTimeout(() => {
|
||||
resolve();
|
||||
}, 800);
|
||||
}).then(() => {
|
||||
res.json(result);
|
||||
});
|
||||
};
|
||||
const getPermissions = (req, res) => {
|
||||
const { current = 1, pageSize = 10 } = req.query;
|
||||
const dataSource = genPermissions();
|
||||
|
||||
const result = {
|
||||
data: dataSource,
|
||||
total: dataSource.length,
|
||||
success: true,
|
||||
pageSize,
|
||||
current: parseInt(`${current}`, 10) || 1,
|
||||
};
|
||||
|
||||
// 模拟请求延迟
|
||||
return new Promise(resolve => {
|
||||
setTimeout(() => {
|
||||
resolve();
|
||||
}, 800);
|
||||
}).then(() => {
|
||||
res.json(result);
|
||||
});
|
||||
};
|
||||
|
||||
const addRole = (req, res) => {};
|
||||
const addPermission = (req, res) => {
|
||||
const data = req.body;
|
||||
if (permissionDataSource.findIndex(item => item.name === data.name) > -1) {
|
||||
// 模拟请求延迟
|
||||
return new Promise(resolve => {
|
||||
setTimeout(() => {
|
||||
resolve();
|
||||
}, 800);
|
||||
}).then(() => {
|
||||
res.status(400).json({ success: false, message: '该权限名已存在' });
|
||||
});
|
||||
}
|
||||
data.id = new Date().getTime();
|
||||
permissionDataSource.push(data);
|
||||
|
||||
// 模拟请求延迟
|
||||
return new Promise(resolve => {
|
||||
setTimeout(() => {
|
||||
resolve();
|
||||
}, 800);
|
||||
}).then(() => {
|
||||
res.json(data);
|
||||
});
|
||||
};
|
||||
|
||||
const updateRole = (req, res) => {};
|
||||
const updatePermission = (req, res) => {
|
||||
const data = req.body;
|
||||
const item = permissionDataSource.find(item => item.id === data.id);
|
||||
Object.assign(item, data);
|
||||
|
||||
// 模拟请求延迟
|
||||
return new Promise(resolve => {
|
||||
setTimeout(() => {
|
||||
resolve();
|
||||
}, 800);
|
||||
}).then(() => {
|
||||
res.json(item);
|
||||
});
|
||||
};
|
||||
|
||||
module.exports = {
|
||||
'GET /api/roles': getRoles,
|
||||
'GET /api/permissions': getPermissions,
|
||||
|
||||
'POST /api/role': addRole,
|
||||
'POST /api/permission': addPermission,
|
||||
|
||||
'PUT /api/role': updateRole,
|
||||
'PUT /api/permission': updatePermission,
|
||||
};
|
124
packages/icpx-platform/mock/user.js
Normal file
@ -0,0 +1,124 @@
|
||||
const usernames = ['ant.design', 'admin', 'superuser'];
|
||||
const passwords = ['ant.design', 'admin'];
|
||||
|
||||
module.exports = {
|
||||
'GET /api/currentUser': (req, res) => {
|
||||
res.send({
|
||||
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',
|
||||
role: {
|
||||
id: 1,
|
||||
name: '管理员',
|
||||
describe: '管理员角色',
|
||||
permissions: [
|
||||
{ id: 1001, roleId: 1, name: 'home', actions: ['query'] },
|
||||
{ id: 1002, roleId: 1, name: 'dashboard', actions: ['query'] },
|
||||
{ id: 1003, roleId: 1, name: 'form', actions: ['query', 'add', 'update', 'delete'] },
|
||||
],
|
||||
},
|
||||
});
|
||||
},
|
||||
|
||||
'POST /api/login/account': (req, res) => {
|
||||
const { password, username, type } = req.body;
|
||||
|
||||
if (!usernames.includes(username) || !passwords.includes(password)) {
|
||||
res.status(400).send({
|
||||
data: {
|
||||
isLogin: true,
|
||||
},
|
||||
errorMessage: '账户或密码错误',
|
||||
success: false,
|
||||
});
|
||||
return;
|
||||
}
|
||||
|
||||
// 模拟请求延迟
|
||||
return new Promise(resolve => {
|
||||
setTimeout(() => {
|
||||
resolve();
|
||||
}, 800);
|
||||
}).then(() => {
|
||||
res.send({
|
||||
type: 'account',
|
||||
token:
|
||||
'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.PObw1E6dwD2Mo9vLQUO8CQxzITNXx4ABu7mS2zWLeJk',
|
||||
success: true,
|
||||
});
|
||||
});
|
||||
},
|
||||
|
||||
'POST /api/logout': (req, res) => {
|
||||
// 模拟请求延迟
|
||||
return new Promise(resolve => {
|
||||
setTimeout(() => {
|
||||
resolve();
|
||||
}, 800);
|
||||
}).then(() => {
|
||||
res.send({
|
||||
success: true,
|
||||
});
|
||||
});
|
||||
},
|
||||
|
||||
'POST /api/register': (req, res) => {
|
||||
const body = req.body;
|
||||
// 模拟请求延迟
|
||||
return new Promise(resolve => {
|
||||
setTimeout(() => {
|
||||
resolve();
|
||||
}, 800);
|
||||
}).then(() => {
|
||||
res.send({
|
||||
data: body,
|
||||
success: true,
|
||||
});
|
||||
});
|
||||
},
|
||||
};
|
45
packages/icpx-platform/mock/userNav.js
Normal file
@ -0,0 +1,45 @@
|
||||
const userNavDataSource = [
|
||||
// dashboard
|
||||
{
|
||||
name: 'dashboard',
|
||||
parentId: 0,
|
||||
id: 1,
|
||||
meta: {
|
||||
icon: 'HeartOutlined',
|
||||
title: 'pages.dashboard.title',
|
||||
show: true,
|
||||
},
|
||||
component: 'RouteView',
|
||||
redirect: '/workplace',
|
||||
},
|
||||
{
|
||||
name: 'workplace',
|
||||
parentId: 1,
|
||||
id: 7,
|
||||
meta: {
|
||||
icon: 'HistoryOutlined',
|
||||
title: 'pages.dashboard.workplace.title',
|
||||
show: true,
|
||||
},
|
||||
component: 'dashboard/workplace/index',
|
||||
path: '/workplace',
|
||||
},
|
||||
{
|
||||
name: 'Analysis',
|
||||
parentId: 1,
|
||||
id: 2,
|
||||
meta: {
|
||||
icon: 'HeartOutlined',
|
||||
title: 'pages.dashboard.analysis.title',
|
||||
show: true,
|
||||
},
|
||||
component: 'dashboard/analysis/index',
|
||||
path: '/dashboard/analysis',
|
||||
},
|
||||
];
|
||||
|
||||
module.exports = {
|
||||
'GET /api/currentUserNav': (req, res) => {
|
||||
res.send(userNavDataSource);
|
||||
},
|
||||
};
|
82
packages/icpx-platform/package.json
Normal file
@ -0,0 +1,82 @@
|
||||
{
|
||||
"name": "icpx-platform",
|
||||
"version": "4.0.0",
|
||||
"private": true,
|
||||
"scripts": {
|
||||
"serve": "vue-cli-service serve",
|
||||
"build": "vite build",
|
||||
"dev": "vite",
|
||||
"vite:dev": "vite",
|
||||
"vite:build": "vite build",
|
||||
"preview": "vite preview --port=4000"
|
||||
},
|
||||
"dependencies": {
|
||||
"@alilc/lowcode-types": "^1.0.15",
|
||||
"@crami/frame-lowcode": "workspace:*",
|
||||
"@types/lodash-es": "^4.17.6",
|
||||
"@umijs/ssr-darkreader": "^4.9.45",
|
||||
"core-js": "^3.21.1",
|
||||
"crypto-js": "^4.1.1",
|
||||
"echarts": "^4.9.0",
|
||||
"gridstack": "^7.2.2",
|
||||
"mitt": "^3.0.0",
|
||||
"nprogress": "^0.2.0",
|
||||
"numeral": "^2.0.6",
|
||||
"resize-detector": "^0.3.0",
|
||||
"screenfull": "^6.0.1",
|
||||
"scroll-into-view-if-needed": "^2.2.29",
|
||||
"smooth-dnd": "^0.12.1"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@surely-vue/table": "2.4.7",
|
||||
"echarts-wordcloud": "^1.1.3",
|
||||
"js-base64": "^3.7.2",
|
||||
"js-md5": "^0.7.3",
|
||||
"kill-port-process": "^3.0.1",
|
||||
"less": "^4.1.3",
|
||||
"less-loader": "^10.2.0",
|
||||
"less-vars-to-js": "^1.3.0",
|
||||
"lint-staged": "^12.3.7",
|
||||
"mockjs": "^1.1.0",
|
||||
"prettier-plugin-style-order": "^0.2.2",
|
||||
"prettier-quick": "^0.0.5",
|
||||
"raw-loader": "^4.0.2",
|
||||
"stylelint-config-css-modules": "^4.1.0",
|
||||
"stylelint-config-rational-order": "^0.1.2",
|
||||
"stylelint-declaration-block-no-ignored-properties": "^2.5.0",
|
||||
"stylelint-no-unsupported-browser-features": "^5.0.3",
|
||||
"stylelint-order": "^5.0.0",
|
||||
"stylelint-webpack-plugin": "^3.2.0",
|
||||
"umi-mock-middleware": "^1.0.0",
|
||||
"webpack-bundle-analyzer": "^4.5.0"
|
||||
},
|
||||
"husky": {
|
||||
"hooks": {
|
||||
"pre-commit": "lint-staged && pretty-quick --staged"
|
||||
}
|
||||
},
|
||||
"lint-staged": {
|
||||
"*.{js,jsx,vue,ts,tsx}": [
|
||||
"vue-cli-service lint",
|
||||
"git add"
|
||||
]
|
||||
},
|
||||
"pnpm": {
|
||||
"peerDependencyRules": {
|
||||
"ignoreMissing": [
|
||||
"@babel/core",
|
||||
"camunda-bpmn-js-behaviors",
|
||||
"preact",
|
||||
"webpack",
|
||||
"@bpmn-io/properties-panel",
|
||||
"diagram-js",
|
||||
"rollup"
|
||||
]
|
||||
}
|
||||
},
|
||||
"resolutions": {
|
||||
"esbuild": "0.14.34",
|
||||
"@crami/router": "1.0.7",
|
||||
"@types/node": "17.0.36"
|
||||
}
|
||||
}
|
13
packages/icpx-platform/pages/index.html
Normal file
@ -0,0 +1,13 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8" />
|
||||
<link rel="icon" href="/favicon.ico" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||
<title>Vite App</title>
|
||||
</head>
|
||||
<body>
|
||||
<div id="app"></div>
|
||||
<script type="module" src="./main.ts"></script>
|
||||
</body>
|
||||
</html>
|
11
packages/icpx-platform/pages/main.ts
Normal file
@ -0,0 +1,11 @@
|
||||
// 这是一个多页面示例,没有 store、没有 router
|
||||
import 'ant-design-vue/dist/antd.variable.less';
|
||||
import { Button } from 'ant-design-vue';
|
||||
import { createApp } from 'vue';
|
||||
import App from '../src/SubApp.vue';
|
||||
|
||||
const app = createApp(App);
|
||||
|
||||
app.use(Button);
|
||||
|
||||
app.mount('#app');
|
20
packages/icpx-platform/plugins/vitePluginDotFallback.ts
Normal file
@ -0,0 +1,20 @@
|
||||
/**
|
||||
* Vite doesn't handle fallback html with dot (.), see https://github.com/vitejs/vite/issues/2415
|
||||
* TODO: Review the PR in Vite
|
||||
* @returns {import('vite').Plugin}
|
||||
*/
|
||||
export function spaFallbackWithDot() {
|
||||
return {
|
||||
name: 'spa-fallback-with-dot',
|
||||
configureServer(server) {
|
||||
return () => {
|
||||
server.middlewares.use(function customSpaFallback(req, res, next) {
|
||||
if (req.url.includes('.') && !req.url.endsWith('.html')) {
|
||||
req.url = '/index.html';
|
||||
}
|
||||
next();
|
||||
});
|
||||
};
|
||||
},
|
||||
};
|
||||
}
|
21
packages/icpx-platform/public/index.html
Normal file
@ -0,0 +1,21 @@
|
||||
<!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" />
|
||||
<link rel="shortcut icon" type="image/x-icon" href="<%= BASE_URL %>favicon.ico" />
|
||||
<title>Ant Design Vue Pro</title>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<noscript>
|
||||
<strong>
|
||||
We're sorry but <%= htmlWebpackPlugin.options.title %> doesn't work properly without
|
||||
JavaScript enabled. Please enable it to continue.
|
||||
</strong>
|
||||
</noscript>
|
||||
<div id="app"></div>
|
||||
<!-- built files will be auto injected -->
|
||||
</body>
|
||||
</html>
|
13
packages/icpx-platform/scripts/convert.sh
Normal file
@ -0,0 +1,13 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
node scripts/tsToJs.js
|
||||
|
||||
echo 'convert successfully'
|
||||
|
||||
rsync -av src/assets js/src
|
||||
rm -rf src
|
||||
mv js/src src
|
||||
|
||||
git branch -D js
|
||||
git checkout -b js
|
||||
git add .
|
85
packages/icpx-platform/scripts/tsToJs.js
Normal file
@ -0,0 +1,85 @@
|
||||
const path = require('path');
|
||||
const fs = require('fs');
|
||||
const { transformSync } = require('@babel/core');
|
||||
const { ESLint } = require('eslint');
|
||||
const glob = require('glob');
|
||||
const cheerio = require('cheerio');
|
||||
|
||||
const files = glob.sync('src/**/*.@(*)');
|
||||
|
||||
const cwd = process.cwd();
|
||||
|
||||
const engine = new ESLint({
|
||||
fix: true,
|
||||
useEslintrc: false,
|
||||
baseConfig: require('../.eslintrc.js'),
|
||||
});
|
||||
|
||||
fs.readFile('index.html', 'utf8', function (err, test) {
|
||||
var result = test.replace(/\/src\/main.ts/g, '/src/main.js');
|
||||
fs.writeFile('index.html', result, 'utf8', function (err) {
|
||||
if (err) {
|
||||
console.log(err);
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
files.forEach(async file => {
|
||||
console.log('files: ', file);
|
||||
const isVue = file.endsWith('.vue');
|
||||
const isTs = file.endsWith('.ts') || file.endsWith('.tsx');
|
||||
const source = fs.readFileSync(path.join(cwd, file)).toString();
|
||||
const dirs = file.split('/');
|
||||
dirs.pop();
|
||||
if (isTs || isVue) {
|
||||
let content = '';
|
||||
let template = '';
|
||||
let style = '';
|
||||
|
||||
if (isVue) {
|
||||
const $ = cheerio.load(source);
|
||||
template = source.match(/<template>[\s\S]*<\/template>/)[0];
|
||||
content = $('script').html();
|
||||
style = source.match(/<style [\s\S]*<\/style>/)?.[0];
|
||||
} else if (isTs) {
|
||||
content = source;
|
||||
}
|
||||
const { code } = transformSync(content, {
|
||||
configFile: false,
|
||||
plugins: [
|
||||
[
|
||||
require.resolve('@babel/plugin-transform-typescript'),
|
||||
{
|
||||
isTSX: true,
|
||||
},
|
||||
],
|
||||
],
|
||||
});
|
||||
|
||||
const report = await engine.lintText(code);
|
||||
let output = report[0].output || report[0].source || code;
|
||||
output = output ? output.trim() : output;
|
||||
if (output) {
|
||||
fs.mkdirSync(`js/${dirs.join('/')}`, {
|
||||
recursive: true,
|
||||
});
|
||||
let res = isVue
|
||||
? `${template}
|
||||
<script>
|
||||
${output}
|
||||
</script>
|
||||
|
||||
${style || ''}
|
||||
`
|
||||
: output;
|
||||
res = `${res.trim()}
|
||||
`;
|
||||
fs.writeFileSync(path.join(cwd, `js/${file.replace('.ts', '.js')}`), res);
|
||||
}
|
||||
} else {
|
||||
fs.mkdirSync(`js/${dirs.join('/')}`, {
|
||||
recursive: true,
|
||||
});
|
||||
fs.copyFileSync(path.join(cwd, file), path.join(cwd, `js/${file}`));
|
||||
}
|
||||
});
|
130
packages/icpx-platform/src/App.vue
Normal file
@ -0,0 +1,130 @@
|
||||
<template>
|
||||
<h-config-provider :locale="locale">
|
||||
<router-view />
|
||||
</h-config-provider>
|
||||
</template>
|
||||
|
||||
<script lang="ts">
|
||||
import { computed, defineComponent, onMounted, provide, watch } from 'vue';
|
||||
import { useStore } from 'vuex';
|
||||
import { STORAGE_LANG_KEY } from '@/store/mutation-type';
|
||||
import { localStorage } from '@/utils/local-storage';
|
||||
import useMediaQuery from '@/utils/hooks/useMediaQuery';
|
||||
import { useI18n } from 'vue-i18n';
|
||||
import useMenuState, { MenuStateSymbol } from './layouts/use-menu-state';
|
||||
import { useMultiTabStateProvider } from './components/multi-tab';
|
||||
import { defaultLang } from './locales';
|
||||
import type { ConfigProviderProps } from 'ant-design-vue/lib/config-provider';
|
||||
import { useHttp } from '@crami/http';
|
||||
import {
|
||||
SET_CONTENT_WIDTH,
|
||||
SET_LAYOUT,
|
||||
SET_NAV_THEME,
|
||||
SET_SPLIT_MENUS,
|
||||
SET_TRANSITION_NAME,
|
||||
SET_FIXED_HEADER,
|
||||
SET_FIXED_SIDEBAR,
|
||||
SET_MULTI_TAB,
|
||||
SET_FIXED_MULTI_TAB,
|
||||
SET_PRIMARY_COLOR,
|
||||
} from '@/store/modules/app/mutations';
|
||||
import { useRoute, useRouter } from 'vue-router';
|
||||
import { message } from 'ant-design-vue';
|
||||
|
||||
export default defineComponent({
|
||||
name: 'App',
|
||||
|
||||
setup() {
|
||||
const router = useRouter();
|
||||
const route = useRoute();
|
||||
let checkCode = '';
|
||||
|
||||
const store = useStore();
|
||||
const i18n = useI18n();
|
||||
const multiTabState = useMultiTabStateProvider();
|
||||
const colSize = useMediaQuery();
|
||||
const isMobile = computed(() => colSize.value === 'sm' || colSize.value === 'xs');
|
||||
const menuState = useMenuState(
|
||||
{
|
||||
collapsed: isMobile.value,
|
||||
openKeys: [] as string[],
|
||||
selectedKeys: [] as string[],
|
||||
isMobile,
|
||||
},
|
||||
multiTabState,
|
||||
);
|
||||
const lang = localStorage.get(STORAGE_LANG_KEY, defaultLang);
|
||||
if (lang) {
|
||||
store.dispatch('app/SET_LANG', lang);
|
||||
}
|
||||
const theme = computed(() => store.getters['app/navTheme']);
|
||||
watch(
|
||||
theme,
|
||||
() => {
|
||||
if (theme.value === 'realDark') {
|
||||
document
|
||||
.getElementsByTagName('html')[0]
|
||||
.setAttribute('data-pro-theme', 'antdv-pro-theme-dark');
|
||||
} else {
|
||||
document
|
||||
.getElementsByTagName('html')[0]
|
||||
.setAttribute('data-pro-theme', 'antdv-pro-theme-light');
|
||||
}
|
||||
},
|
||||
{ immediate: true },
|
||||
);
|
||||
|
||||
// 解析短链接,获取项目的配置信息,并设置项目风格
|
||||
const setSetting = async (code: string) => {
|
||||
const result = await useHttp({
|
||||
// url: 'http://10.0.59.229:7300/mock/6233025aec91f63c580c0589/example/getSetting',
|
||||
url: 'studio-admin/shorturl/project',
|
||||
method: 'get',
|
||||
params: {
|
||||
code: code,
|
||||
},
|
||||
});
|
||||
if (result.code == 200) {
|
||||
// 设置导航位置和主题
|
||||
store.commit(`app/${SET_LAYOUT}`, result.data.layout || 'side');
|
||||
store.commit(`app/${SET_NAV_THEME}`, result.data.theme || 'light');
|
||||
// store.dispatch('app/SET_LANG', 'en');
|
||||
} else if (result.code == 19000) {
|
||||
// 链接失效
|
||||
router.push('/error');
|
||||
} else {
|
||||
message.error(result.msg);
|
||||
}
|
||||
};
|
||||
|
||||
// 监听checkCode,变化后重新请求布局
|
||||
watch(
|
||||
() => route.query.checkCode,
|
||||
() => {
|
||||
if (route.query.checkCode && route.query.checkCode != checkCode) {
|
||||
checkCode = route.query.checkCode as string;
|
||||
setSetting(checkCode);
|
||||
}
|
||||
},
|
||||
{ deep: true, immediate: true },
|
||||
);
|
||||
|
||||
provide('isMobile', isMobile);
|
||||
provide(
|
||||
'isRealDark',
|
||||
computed(() => theme.value === 'realDark'),
|
||||
);
|
||||
provide(MenuStateSymbol, menuState);
|
||||
const locale = computed(() => {
|
||||
return i18n.getLocaleMessage(i18n.locale.value).antd as ConfigProviderProps['locale'];
|
||||
});
|
||||
|
||||
onMounted(() => {});
|
||||
return {
|
||||
route,
|
||||
router,
|
||||
locale,
|
||||
};
|
||||
},
|
||||
});
|
||||
</script>
|
10
packages/icpx-platform/src/SubApp.vue
Normal file
@ -0,0 +1,10 @@
|
||||
<template>
|
||||
<div style="text-align: center; margin-top: 100px">
|
||||
<h-button type="primary">Hello</h-button>
|
||||
</div>
|
||||
</template>
|
||||
<script lang="ts">
|
||||
import { defineComponent } from 'vue';
|
||||
|
||||
export default defineComponent({});
|
||||
</script>
|
41
packages/icpx-platform/src/api/README.md
Normal file
@ -0,0 +1,41 @@
|
||||
## Axios Typescript 使用说明
|
||||
|
||||
目前推荐封装请求方法直接使用 `src/utils/request.ts`
|
||||
使用案例如下:
|
||||
|
||||
#### GET
|
||||
|
||||
```ts
|
||||
async function getUser(id: number) {
|
||||
return request.get<id, UserInfo>(`/user/${id}`);
|
||||
}
|
||||
// 返回结果为
|
||||
// Promise<UserInfo>
|
||||
```
|
||||
|
||||
#### POST / PUT
|
||||
|
||||
```ts
|
||||
async function saveUser(user: UserInfo) {
|
||||
// 定义用于得知是 新增 还是 修改
|
||||
// 可根据自己业务自定义逻辑判断
|
||||
const isNewRecord = user.id > 0;
|
||||
return request<UserInfo, boolean>({
|
||||
url: isNewRecord ? `/user/${id}` : `/user/`,
|
||||
method: isNewRecord ? 'POST' : 'PUT',
|
||||
data: user,
|
||||
});
|
||||
}
|
||||
// 返回结果为
|
||||
// Promise<boolean>
|
||||
```
|
||||
|
||||
#### DELETE
|
||||
|
||||
```ts
|
||||
async function deleteUser(id: number) {
|
||||
return request.delete<number, boolean>(`/user/${id}`);
|
||||
}
|
||||
// 返回结果为
|
||||
// Promise<boolean>
|
||||
```
|
139
packages/icpx-platform/src/api/commonApi/index.ts
Normal file
@ -0,0 +1,139 @@
|
||||
import type { APIMethod } from '@crami/bui-types';
|
||||
//通用接口参数处理
|
||||
import { getInfo, ICP_CONFIG } from '@/utils/commMethods';
|
||||
import { computed, reactive } from 'vue';
|
||||
|
||||
export const commonApi = () => {
|
||||
const commonParams = computed(() => {
|
||||
return getInfo(ICP_CONFIG);
|
||||
});
|
||||
|
||||
const studioCacheParam = reactive({
|
||||
//产品线
|
||||
productLine: commonParams.value?.project,
|
||||
//语言
|
||||
lang: commonParams.value?.lang,
|
||||
//视图名称
|
||||
// name: commonParams.value?.listView,
|
||||
//行政组
|
||||
// userDept: commonParams.value?.userDept,
|
||||
// //用户组
|
||||
// userGroup: commonParams.value?.userGroup,
|
||||
//项目实例
|
||||
projectCode: commonParams.value?.projectCode,
|
||||
// 多时区
|
||||
timeZone: commonParams.value?.TIME_ZONE,
|
||||
});
|
||||
const systemParam = reactive({
|
||||
// viewName: commonParams.value?.listViewName,
|
||||
lang: commonParams.value?.lang,
|
||||
//数据库连接
|
||||
connect: commonParams.value?.connect,
|
||||
//所属租户
|
||||
companyId: commonParams.value?.companyId,
|
||||
//行政组
|
||||
userDept: commonParams.value?.userDept,
|
||||
//用户组
|
||||
userGroup: commonParams.value?.userGroup,
|
||||
projectCode: commonParams.value?.projectCode,
|
||||
// 多时区
|
||||
timeZone: commonParams.value?.TIME_ZONE,
|
||||
});
|
||||
const paraList = {
|
||||
loadAllStructure: false,
|
||||
lang: commonParams.value?.lang,
|
||||
connect: commonParams.value?.connect,
|
||||
companyId: commonParams.value?.companyId,
|
||||
userGroup: commonParams.value?.userGroup,
|
||||
projectCode: commonParams.value?.projectCode,
|
||||
userDept: commonParams.value?.userDept,
|
||||
};
|
||||
return {
|
||||
studioCache: {
|
||||
getMetaInfo: {
|
||||
url: '/api/studio-cache/page/getMetaInfo',
|
||||
params: studioCacheParam,
|
||||
method: 'post' as APIMethod,
|
||||
},
|
||||
getByProjectAndType: {
|
||||
url: '/api/studio-cache/metaData/getByProjectAndType',
|
||||
params: {
|
||||
// TODO:jjf临时修改
|
||||
// productLine: commonParams.value?.project,
|
||||
// projectCode: commonParams.value?.projectCode,
|
||||
project: 'PLMBASE,PLM_PRODUCT,PLMPRODUCT',
|
||||
productLine: 'PLMBASE,PLM_PRODUCT,PLMPRODUCT',
|
||||
projectCode: 'PLMBASE',
|
||||
timeZone: commonParams.value?.TIME_ZONE,
|
||||
},
|
||||
method: 'get' as APIMethod,
|
||||
},
|
||||
},
|
||||
system: {
|
||||
getData: {
|
||||
url: '/api/system/view/getData',
|
||||
params: systemParam,
|
||||
method: 'post' as APIMethod,
|
||||
},
|
||||
getGetOnePageGridDataList: {
|
||||
url: '/api/system/model/getGetOnePageGridDataList',
|
||||
params: {
|
||||
...systemParam,
|
||||
objectType: '',
|
||||
},
|
||||
method: 'post' as APIMethod,
|
||||
},
|
||||
getGetOnePageGridDataListByTenant: {
|
||||
url: '/api/system/tenant/getGetOnePageGridDataList',
|
||||
params: {
|
||||
...systemParam,
|
||||
objectType: '',
|
||||
},
|
||||
method: 'post' as APIMethod,
|
||||
},
|
||||
getSltData: {
|
||||
url: '/api/system/model/getSltData',
|
||||
params: {
|
||||
...systemParam,
|
||||
userId: commonParams.value?.user_id,
|
||||
},
|
||||
method: 'post' as APIMethod,
|
||||
},
|
||||
getGetTreeRootDataList: {
|
||||
url: '/api/system/model/getGetTreeRootDataList',
|
||||
params: {
|
||||
...systemParam,
|
||||
paraList: JSON.stringify(paraList),
|
||||
type: 'tree',
|
||||
loadAllStructure: false,
|
||||
},
|
||||
method: 'post' as APIMethod,
|
||||
},
|
||||
getGetTreeChildDataList: {
|
||||
url: '/api/system/model/getGetTreeChildDataList',
|
||||
params: {
|
||||
...systemParam,
|
||||
type: 'treeChildren',
|
||||
loadAllStructure: false,
|
||||
},
|
||||
method: 'post' as APIMethod,
|
||||
},
|
||||
getObjectDataTestList: {
|
||||
url: '/api/system/model/GetObjectDataTestList',
|
||||
params: {
|
||||
...systemParam,
|
||||
userId: commonParams.value?.user_id,
|
||||
},
|
||||
method: 'post' as APIMethod,
|
||||
},
|
||||
saveObjectData: {
|
||||
url: '/api/msg/sender/saveOrEditMsgSender',
|
||||
params: {
|
||||
...systemParam,
|
||||
userId: commonParams.value?.user_id,
|
||||
},
|
||||
method: 'post' as APIMethod,
|
||||
},
|
||||
},
|
||||
};
|
||||
};
|
122
packages/icpx-platform/src/api/dashboard/analysis.ts
Normal file
@ -0,0 +1,122 @@
|
||||
import { reactive } from 'vue';
|
||||
import request from '@/utils/request';
|
||||
|
||||
export interface VisitDataItem {
|
||||
x: string;
|
||||
y: number;
|
||||
}
|
||||
|
||||
export interface SalesDataItem {
|
||||
x: string;
|
||||
y: number;
|
||||
}
|
||||
|
||||
export interface SearchDataItem {
|
||||
index: number | string;
|
||||
keyword: string;
|
||||
count: number;
|
||||
range: number;
|
||||
status: number;
|
||||
}
|
||||
|
||||
export interface OfflineDataItem {
|
||||
name: string;
|
||||
cvr: number;
|
||||
}
|
||||
|
||||
export interface OfflineChartDataItem {
|
||||
x: number;
|
||||
y1: number;
|
||||
y2: number;
|
||||
}
|
||||
|
||||
export interface RadarDataItem {
|
||||
name: string;
|
||||
label: string;
|
||||
value: number | string;
|
||||
}
|
||||
|
||||
export interface ChartData {
|
||||
offlineChartData: OfflineChartDataItem[];
|
||||
offlineData: OfflineDataItem[];
|
||||
radarData: RadarDataItem[];
|
||||
salesData: SalesDataItem[];
|
||||
salesTypeData: SalesDataItem[];
|
||||
salesTypeDataOffline: SalesDataItem[];
|
||||
salesTypeDataOnline: SalesDataItem[];
|
||||
searchData: SearchDataItem[];
|
||||
visitData: VisitDataItem[];
|
||||
visitData2: VisitDataItem[];
|
||||
}
|
||||
|
||||
export function getAnalysisChartData(): Promise<ChartData> {
|
||||
return request.get('dashboard/fake_chart_data');
|
||||
}
|
||||
|
||||
export type SalesRangeType = [string, string];
|
||||
|
||||
export function getAnalysisSalesData(range: SalesRangeType): Promise<SalesDataItem[]> {
|
||||
return request.get('dashboard/fake_chart_sales_data', {
|
||||
params: {
|
||||
range,
|
||||
},
|
||||
});
|
||||
}
|
||||
|
||||
export interface AnalysisData {
|
||||
state: {
|
||||
loading: boolean;
|
||||
chartData: ChartData;
|
||||
};
|
||||
fetchAllData: () => void;
|
||||
fetchSalesData: (rangeDate: [string, string]) => void;
|
||||
}
|
||||
|
||||
export const useAnalysisData = (): AnalysisData => {
|
||||
const state = reactive({
|
||||
loading: true,
|
||||
chartData: {
|
||||
offlineChartData: [],
|
||||
offlineData: [],
|
||||
radarData: [],
|
||||
salesData: [],
|
||||
salesTypeData: [],
|
||||
salesTypeDataOffline: [],
|
||||
salesTypeDataOnline: [],
|
||||
searchData: [],
|
||||
visitData: [],
|
||||
visitData2: [],
|
||||
} as ChartData,
|
||||
});
|
||||
|
||||
const fetchAllData = () => {
|
||||
state.loading = true;
|
||||
// fetch backend JSON api data.
|
||||
getAnalysisChartData()
|
||||
.then(res => {
|
||||
state.chartData = {
|
||||
...res,
|
||||
};
|
||||
})
|
||||
.finally(() => {
|
||||
state.loading = false;
|
||||
});
|
||||
};
|
||||
|
||||
const fetchSalesData = (rangeDate: [string, string]) => {
|
||||
state.loading = true;
|
||||
getAnalysisSalesData(rangeDate)
|
||||
.then(res => {
|
||||
state.chartData.salesData = res;
|
||||
})
|
||||
.finally(() => {
|
||||
state.loading = false;
|
||||
});
|
||||
};
|
||||
|
||||
return {
|
||||
state,
|
||||
fetchAllData,
|
||||
fetchSalesData,
|
||||
};
|
||||
};
|
5
packages/icpx-platform/src/api/dashboard/monitor.ts
Normal file
@ -0,0 +1,5 @@
|
||||
import request from '@/utils/request';
|
||||
|
||||
export async function queryTags(): Promise<any> {
|
||||
return request.get('/tags');
|
||||
}
|
17
packages/icpx-platform/src/api/dashboard/workplace.ts
Normal file
@ -0,0 +1,17 @@
|
||||
import request from '@/utils/request';
|
||||
|
||||
export async function queryProjectNotice(): Promise<any> {
|
||||
return request('/project/notice');
|
||||
}
|
||||
|
||||
export async function queryActivities(): Promise<any> {
|
||||
return request('/activities');
|
||||
}
|
||||
|
||||
export async function fakeChartData(): Promise<any> {
|
||||
return request('/fake_chart_data');
|
||||
}
|
||||
|
||||
export async function queryCurrent(): Promise<any> {
|
||||
return request('/currentUser');
|
||||
}
|
25
packages/icpx-platform/src/api/form/basic-form.ts
Normal file
@ -0,0 +1,25 @@
|
||||
import request from '@/utils/request';
|
||||
import type { ResponseBody } from '../typing';
|
||||
|
||||
export interface BasicFormData {
|
||||
title?: string;
|
||||
date?: [string, string];
|
||||
goal?: string;
|
||||
standard?: string;
|
||||
}
|
||||
|
||||
export interface BasicFormResponse {
|
||||
saveId: number;
|
||||
}
|
||||
|
||||
/**
|
||||
* Save basic form data to backend
|
||||
*
|
||||
* @param formData
|
||||
* @return Promise<ResponseBody<BasicFormResponse>>
|
||||
*/
|
||||
export function saveBasicFormData(
|
||||
formData: BasicFormData,
|
||||
): Promise<ResponseBody<BasicFormResponse>> {
|
||||
return request.post('forms/basic-form', formData);
|
||||
}
|
7
packages/icpx-platform/src/api/form/step-form.ts
Normal file
@ -0,0 +1,7 @@
|
||||
import request from '@/utils/request';
|
||||
|
||||
// use request util will ignore `/api/` path
|
||||
|
||||
export async function fakeSubmitForm(params = {}) {
|
||||
return request.post('forms', params);
|
||||
}
|
8
packages/icpx-platform/src/api/list/basic-list.ts
Normal file
@ -0,0 +1,8 @@
|
||||
import request from '@/utils/request';
|
||||
import type { TableListItem } from '@/views/list/typing';
|
||||
|
||||
export async function queryFakeList(params = {}) {
|
||||
return request.get<any, TableListItem[]>('/fake_list', {
|
||||
params,
|
||||
});
|
||||
}
|
7
packages/icpx-platform/src/api/list/card-list.ts
Normal file
@ -0,0 +1,7 @@
|
||||
import request from '@/utils/request';
|
||||
|
||||
export async function queryFakeList(params = {}): Promise<any> {
|
||||
return request.get('/fake_list', {
|
||||
params,
|
||||
});
|
||||
}
|
100
packages/icpx-platform/src/api/list/table-list.ts
Normal file
@ -0,0 +1,100 @@
|
||||
import request from '@/utils/request';
|
||||
import { reactive } from 'vue';
|
||||
|
||||
export async function queryRule(params?: { [key: string]: any }): Promise<RuleResponse> {
|
||||
return request.get('/rule', {
|
||||
params,
|
||||
});
|
||||
}
|
||||
|
||||
export async function removeRule(params: Record<string, any>) {
|
||||
return request('/api/rule', {
|
||||
method: 'POST',
|
||||
data: {
|
||||
...params,
|
||||
method: 'delete',
|
||||
},
|
||||
});
|
||||
}
|
||||
|
||||
export async function addRule(params: Record<string, any>) {
|
||||
return request('/api/rule', {
|
||||
method: 'POST',
|
||||
data: {
|
||||
...params,
|
||||
method: 'post',
|
||||
},
|
||||
});
|
||||
}
|
||||
|
||||
export async function updateRule(params: Record<string, any>) {
|
||||
return request('/api/rule', {
|
||||
method: 'POST',
|
||||
data: {
|
||||
...params,
|
||||
method: 'update',
|
||||
},
|
||||
});
|
||||
}
|
||||
|
||||
interface RuleItem {
|
||||
key: string | number;
|
||||
callNo: number;
|
||||
avatar: string;
|
||||
desc: string;
|
||||
disabled: false;
|
||||
href: string;
|
||||
name: string;
|
||||
owner: string;
|
||||
progress: number;
|
||||
status: number;
|
||||
updatedAt: string;
|
||||
createdAt: string;
|
||||
}
|
||||
|
||||
interface RuleResponse {
|
||||
current: number;
|
||||
data: RuleItem[];
|
||||
pageSize: string;
|
||||
success: boolean;
|
||||
total: number;
|
||||
}
|
||||
|
||||
export function useRuleData() {
|
||||
const state = reactive({
|
||||
loading: true,
|
||||
current: 0,
|
||||
pageSize: 10,
|
||||
total: 0,
|
||||
dataSource: [] as RuleItem[],
|
||||
});
|
||||
|
||||
const fetchRule = (params?: Record<string, any>) => {
|
||||
// 使 table 打开加载状态指示
|
||||
state.loading = true;
|
||||
// 发起 AJAX 请求到后端
|
||||
queryRule(
|
||||
Object.assign(
|
||||
{
|
||||
current: state.current,
|
||||
pageSize: state.pageSize,
|
||||
},
|
||||
params,
|
||||
),
|
||||
)
|
||||
.then((res: RuleResponse) => {
|
||||
// 更新数据
|
||||
state.dataSource = res.data;
|
||||
state.total = res.total;
|
||||
})
|
||||
.finally(() => {
|
||||
// 使 table 关闭加载状态指示
|
||||
state.loading = false;
|
||||
});
|
||||
};
|
||||
|
||||
return {
|
||||
state,
|
||||
fetch: fetchRule,
|
||||
};
|
||||
}
|
@ -0,0 +1,130 @@
|
||||
import request from '@/utils/request';
|
||||
|
||||
export interface PageList {
|
||||
current?: number;
|
||||
size?: number;
|
||||
}
|
||||
export interface MsgChannel {
|
||||
channelCode: string;
|
||||
channelName: string;
|
||||
organizationId: string;
|
||||
sendImpl: string;
|
||||
userMappping: string;
|
||||
contentConstructor: string;
|
||||
isUse?: string;
|
||||
configParam?: {
|
||||
configCode: string;
|
||||
configItem: string;
|
||||
configValue: string;
|
||||
};
|
||||
}
|
||||
|
||||
export interface IsUseStates {
|
||||
ids: Array<string>;
|
||||
isUse: string;
|
||||
}
|
||||
export interface IsUseState {
|
||||
ids: string;
|
||||
isUse: string;
|
||||
}
|
||||
export interface Channel {
|
||||
id: string;
|
||||
}
|
||||
|
||||
export interface EditMsgChannel {
|
||||
id: string;
|
||||
field_28: string;
|
||||
// channelCode: string;
|
||||
channelName: string;
|
||||
organization: string;
|
||||
sendImpl: string;
|
||||
userMappping: string;
|
||||
contentConstructor: string;
|
||||
isUse?: string;
|
||||
configParam?: {
|
||||
id: string;
|
||||
field_29: string;
|
||||
//configCode: string;
|
||||
configItem: string;
|
||||
configValue: string;
|
||||
};
|
||||
}
|
||||
|
||||
export async function getList(params: PageList) {
|
||||
return (
|
||||
request.request < PageList,
|
||||
any >
|
||||
{
|
||||
url: '/msg/channel/queryChannelList',
|
||||
method: 'GET',
|
||||
params,
|
||||
}
|
||||
);
|
||||
}
|
||||
export async function addMsgChannel(data: MsgChannel) {
|
||||
return (
|
||||
request.request < MsgChannel,
|
||||
any >
|
||||
{
|
||||
url: '/msg/channel/add',
|
||||
method: 'POST',
|
||||
data,
|
||||
}
|
||||
);
|
||||
}
|
||||
export async function batchChangeIsUse(params: IsUseStates) {
|
||||
return (
|
||||
request.request < IsUseStates,
|
||||
any >
|
||||
{
|
||||
url: '/msg/channel/updateStates',
|
||||
method: 'GET',
|
||||
params,
|
||||
}
|
||||
);
|
||||
}
|
||||
export async function changeIsUse(params: IsUseState) {
|
||||
return (
|
||||
request.request < IsUseState,
|
||||
any >
|
||||
{
|
||||
url: '/msg/channel/updateState',
|
||||
method: 'GET',
|
||||
params,
|
||||
}
|
||||
);
|
||||
}
|
||||
export async function queryByChannelCode(params: Channel) {
|
||||
return (
|
||||
request.request < Channel,
|
||||
any >
|
||||
{
|
||||
url: '/msg/channel/queryByChannelCode',
|
||||
method: 'GET',
|
||||
params,
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
export async function updateChannel(data: EditMsgChannel) {
|
||||
return (
|
||||
request.request < EditMsgChannel,
|
||||
any >
|
||||
{
|
||||
url: '/msg/channel/update',
|
||||
method: 'POST',
|
||||
data,
|
||||
}
|
||||
);
|
||||
}
|
||||
export async function deleteChannel(data: Channel) {
|
||||
return (
|
||||
request.request < Channel,
|
||||
any >
|
||||
{
|
||||
url: '/msg/channel/delete',
|
||||
method: 'GET',
|
||||
data,
|
||||
}
|
||||
);
|
||||
}
|
@ -0,0 +1,244 @@
|
||||
import { notification } from 'ant-design-vue';
|
||||
import { h, ref } from 'vue';
|
||||
import bus from '@/utils/bus';
|
||||
import router from '@/router';
|
||||
import { message, Divider } from '@crami/ui';
|
||||
import _store from '@/store/index';
|
||||
import { useI18n } from '@crami/locale';
|
||||
import UserAvatar from '@/views/platform/components/UserAvatar.vue';
|
||||
import { changeRouterByMsg } from '@/views/platform/Message/utils/generateMsgContent';
|
||||
import { divide } from 'lodash';
|
||||
|
||||
let key;
|
||||
|
||||
const NOTIFICATION_CLS = 'message-prompt-notification';
|
||||
const BUI_CONTAINER_CLS = 'bui-assoQuery-container';
|
||||
const BUI_ITEM_CLS = 'bui-assoQuery-item';
|
||||
|
||||
const createStyleSheet = () => {
|
||||
let style = document.createElement("style");
|
||||
// WebKit处理
|
||||
style.appendChild(document.createTextNode(""));
|
||||
style.setAttribute('type', 'text/css');
|
||||
style.setAttribute(`${NOTIFICATION_CLS}-style`, '');
|
||||
document.head.appendChild(style);
|
||||
|
||||
const addCSSRule = (sheet, selector, rules, index) => sheet.insertRule ?
|
||||
sheet.insertRule(selector + "{" + rules + "}", index) :
|
||||
sheet.addRule(selector, rules, index);
|
||||
|
||||
const sheet = style.sheet;
|
||||
addCSSRule(sheet, `.${NOTIFICATION_CLS}`, `border-radius: 8px`);
|
||||
}
|
||||
|
||||
requestIdleCallback(() => {
|
||||
createStyleSheet();
|
||||
})
|
||||
|
||||
const clickNotification = (e, result, t) => {
|
||||
notification.close(key);
|
||||
const allowRouters = _store.getters['user/allowRouters'] || [];
|
||||
// 存在消息中心导航菜单
|
||||
const messageCenter = allowRouters.find(route => route.name === 'MessageCenter');
|
||||
// 存在我收到的导航菜单
|
||||
if (
|
||||
messageCenter &&
|
||||
messageCenter?.meta?.frontHidden !== true &&
|
||||
messageCenter.children && messageCenter.children.length
|
||||
) {
|
||||
const receivedMsgPage = messageCenter.children.find(route => route.name === 'ReceivedMsg');
|
||||
if (receivedMsgPage && receivedMsgPage?.meta?.frontHidden !== true) {
|
||||
setTimeout(() => {
|
||||
router.push({
|
||||
path: `/platform/Message/MessageCenter/ReceivedMsg/Index`,
|
||||
query: {
|
||||
activeKey: result.msgType,
|
||||
eid: result.msgReceivedEid,
|
||||
},
|
||||
});
|
||||
}, 300);
|
||||
} else {
|
||||
message.warning(`${t('messageGlobl.notification.noAuth')}`);
|
||||
}
|
||||
} else {
|
||||
message.warning(`${t('messageGlobl.notification.noAuth')}`);
|
||||
}
|
||||
}
|
||||
|
||||
// 获取正常的跳转部分配置
|
||||
const getLinkContent = (result) => {
|
||||
let messageContentUrlJson = {};
|
||||
try {
|
||||
messageContentUrlJson = JSON.parse(result.messageContentUrl);
|
||||
} catch (e) {
|
||||
|
||||
}
|
||||
return Object.values(messageContentUrlJson);
|
||||
}
|
||||
|
||||
// 获取content里可跳转的a标签内容
|
||||
const getAtagContent = ({ messageContent: content }) => {
|
||||
let result = [];
|
||||
// 测试用
|
||||
// content = "<p>当前信息:流程消息提示插件;您收到一条待办信息,请查收!,点击:<a href='http://10.0.88.239:33380/platform/workflow/myWorkflow/viewWorkflow?operationMode=need&processInstanceId=22906fd2b2f44ffebd0892b9c416d521&taskId=ae7086a1b0e349bda61308031b632ae1&processDefinitionId=fee5a95babb54d389915a4b805884255&isView=false&viewed=&EID=22906fd2b2f44ffebd0892b9c416d521¤tNodeKeys=Activity_0th4m4g&entryId=1596104410415521794&nodeType=a56123d295d' target='_blank'>办理</a></p>";
|
||||
if (!content) return result;
|
||||
|
||||
try {
|
||||
let _dom = document.createElement('div');
|
||||
_dom.innerHTML = content;
|
||||
const aDom = _dom.querySelectorAll('a');
|
||||
if (aDom && aDom.length) {
|
||||
result = [].map.call(aDom, a => ({
|
||||
name: a.innerText,
|
||||
target: a.getAttribute('target'),
|
||||
url: a.getAttribute('href'),
|
||||
}));
|
||||
}
|
||||
_dom = null;
|
||||
} catch (err) {
|
||||
console.log(err);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
// 业务联查部分
|
||||
const renderBusiAssoQuery = (result) => {
|
||||
const messageContentItems = getLinkContent(result);
|
||||
const extraContentItems = getAtagContent(result);
|
||||
if (!messageContentItems.length && !extraContentItems.length) return null;
|
||||
|
||||
const renderItem = (item, type = 'common') => {
|
||||
const default_props = {
|
||||
class: BUI_ITEM_CLS,
|
||||
style: {
|
||||
width: '48%',
|
||||
background: '#E8F0FD',
|
||||
borderRadius: '4px',
|
||||
overflow: 'hidden',
|
||||
color: '#3979F9',
|
||||
height: '28px',
|
||||
lineHeight: '28px',
|
||||
textAlign: 'center',
|
||||
cursor: 'pointer',
|
||||
marginBottom: '12px',
|
||||
},
|
||||
}
|
||||
const extra_props = {};
|
||||
switch (type) {
|
||||
case 'a':
|
||||
default_props.onClick = (e) => {
|
||||
item.url && window.open(item.url);
|
||||
e.stopPropagation();
|
||||
};
|
||||
break;
|
||||
case 'common':
|
||||
default_props.onClick = (e) => {
|
||||
item.url && changeRouterByMsg(item);
|
||||
e.stopPropagation();
|
||||
};
|
||||
break;
|
||||
default:
|
||||
default_props.onClick = () => {};
|
||||
}
|
||||
|
||||
return h('div', Object.assign({}, default_props, extra_props), item.name);
|
||||
}
|
||||
|
||||
return h('div', {}, [
|
||||
h(Divider, {
|
||||
style: {
|
||||
borderColor: '#E9E9E9',
|
||||
margin: '16px 0',
|
||||
},
|
||||
dashed: true,
|
||||
}),
|
||||
h('div', {
|
||||
class: BUI_CONTAINER_CLS,
|
||||
style: {
|
||||
display: 'flex',
|
||||
flexWrap: 'wrap',
|
||||
justifyContent: 'space-between',
|
||||
marginBottom: '-12px',
|
||||
},
|
||||
}, [
|
||||
...messageContentItems.map(item => renderItem(item, 'common')),
|
||||
...extraContentItems.map(item => renderItem(item, 'a')),
|
||||
]),
|
||||
])
|
||||
}
|
||||
|
||||
const notificationContent = (result, t) => h(
|
||||
'div',
|
||||
{
|
||||
fontSize: '14px',
|
||||
onClick: (e) => clickNotification(e, result, t),
|
||||
},
|
||||
[
|
||||
// 因为数据问题先不展示
|
||||
// h('div', {
|
||||
// class: `${NOTIFICATION_CLS}-msgInfo`,
|
||||
// style: {
|
||||
// display: 'flex',
|
||||
// alignItems: 'center',
|
||||
// marginBottom: '12px'
|
||||
// }
|
||||
// }, [
|
||||
// h(UserAvatar, {
|
||||
// userInfo: result,
|
||||
// avaterField: 'sender_avatar',
|
||||
// size: 24,
|
||||
// style: {
|
||||
// marginRight: '8px',
|
||||
// }
|
||||
// }),
|
||||
// h('div', {
|
||||
// style: {
|
||||
// marginRight: '8px',
|
||||
// color: '#666666',
|
||||
// }
|
||||
// }, result.senderName),
|
||||
// h('div', {
|
||||
// style: {
|
||||
// fontSize: '12px',
|
||||
// color: '#999',
|
||||
// }
|
||||
// }, `[${t('messageGlobl.notification.newMessage')}]`),
|
||||
// ]),
|
||||
h('div', {
|
||||
style: {
|
||||
color: '#333333',
|
||||
fontWeight: '500',
|
||||
height: '21px',
|
||||
lineHeight: '21px',
|
||||
marginBottom: '8px',
|
||||
}
|
||||
}, `${t('messageGlobl.notification.title')}: ${result?.messageTitle}`),
|
||||
h('div', {
|
||||
style: {
|
||||
color: '#666666',
|
||||
height: '21px',
|
||||
lineHeight: '21px',
|
||||
}
|
||||
}, `${t('messageGlobl.notification.abstract')}: ${result?.abstractContent}`),
|
||||
renderBusiAssoQuery(result),
|
||||
],
|
||||
)
|
||||
|
||||
const handleMessage = (result) => {
|
||||
bus.emit('getMessageData');
|
||||
|
||||
const { t } = useI18n();
|
||||
key = result.messageId || `open${Date.now()}`;
|
||||
|
||||
if (result.messageTitle || result.abstractContent || result.messageContent) {
|
||||
notification.open({
|
||||
message: ``,
|
||||
key,
|
||||
class: NOTIFICATION_CLS,
|
||||
description: notificationContent(result, t),
|
||||
// duration: 10000,
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
export default handleMessage;
|
@ -0,0 +1,187 @@
|
||||
import { useHttp } from '@crami/http';
|
||||
import { getInfo, ICP_CONFIG } from '@/utils/commMethods';
|
||||
import { notification } from 'ant-design-vue';
|
||||
import { h, ref } from 'vue';
|
||||
import { UserOutlined } from '@ant-design/icons-vue';
|
||||
import bus from '@/utils/bus';
|
||||
import router from '@/router';
|
||||
import { message } from '@crami/ui';
|
||||
|
||||
import _store from '@/store/index';
|
||||
|
||||
let socket = null;
|
||||
const messageUrl = ref();
|
||||
const getUrl = async () => {
|
||||
const data = await useHttp({
|
||||
url: '/api/msg/serverUrl/getWebsocketServerUrl',
|
||||
method: 'get',
|
||||
});
|
||||
if (data.code === 200) {
|
||||
return data.data;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
};
|
||||
//处理消息弹窗内容,返回innerhtml
|
||||
const handleMessageData = (messageContentParams, messageContentUrlParams) => {
|
||||
if (!messageContentUrlParams) return;
|
||||
let messageContent = messageContentParams;
|
||||
const messageUrl = JSON.parse(messageContentUrlParams);
|
||||
for (const i in messageUrl) {
|
||||
const reg = new RegExp(`\%${i}\%`, 'g');
|
||||
messageContent = messageContent.replace(
|
||||
reg,
|
||||
`<a href='javascript:void(0)' onclick="aClic('` +
|
||||
messageUrl[i].name +
|
||||
`')">` +
|
||||
messageUrl[i].name +
|
||||
`</a>`,
|
||||
);
|
||||
}
|
||||
window.aClic = aClic;
|
||||
return messageContent;
|
||||
};
|
||||
const aClic = e => {
|
||||
for (const i in messageUrl.value) {
|
||||
if (messageUrl.value[i].name == e) {
|
||||
console.log(messageUrl.value[i].params);
|
||||
if (messageUrl.value[i]?.url.includes('/changeManage/changeManageMainPage')) {
|
||||
router.push({
|
||||
name: 'changeNoticeInspectorRouter',
|
||||
query: {
|
||||
objectEID: messageUrl.value[i].params,
|
||||
},
|
||||
});
|
||||
return true;
|
||||
} else {
|
||||
router.push({
|
||||
path: messageUrl.value[i].url,
|
||||
query: {
|
||||
key: JSON.stringify(messageUrl.value[i].params),
|
||||
},
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
const setSocket = async (opts = {}) => {
|
||||
if (socket && [socket.CONNECTING, socket.OPEN].includes(socket.readyState)) return;
|
||||
const router = opts.router;
|
||||
const userInfo = getInfo(ICP_CONFIG);
|
||||
const socketUrl = await getUrl();
|
||||
if (!userInfo || !socketUrl) return;
|
||||
const URL = `${socketUrl}${userInfo.user_id}`;
|
||||
socket = new WebSocket(URL);
|
||||
socket.addEventListener('message', event => {
|
||||
const { data } = event;
|
||||
bus.emit('getMessageData');
|
||||
let result: Record<string, any> = {};
|
||||
try {
|
||||
result = JSON.parse(data);
|
||||
} catch (e) {
|
||||
// TODO
|
||||
}
|
||||
const key = result.messageId || `open${Date.now()}`;
|
||||
if (result.messageTitle || result.abstractContent || result.messageContent) {
|
||||
//0830 处理content数据
|
||||
const messageContentData = handleMessageData(result.messageContent, result.messageContentUrl);
|
||||
if (result.messageContentUrl) {
|
||||
messageUrl.value = JSON.parse(result.messageContentUrl);
|
||||
}
|
||||
notification.open({
|
||||
message: ``,
|
||||
key,
|
||||
description: h(
|
||||
'div',
|
||||
{
|
||||
fontSize: '14px',
|
||||
fontWeight: '900',
|
||||
onClick: e => {
|
||||
if (e.target.nodeName !== 'A') {
|
||||
notification.close(key);
|
||||
const allowRouters = _store.getters['user/allowRouters'] || [];
|
||||
// 存在消息中心导航菜单
|
||||
const messageCenter = allowRouters.find(route => route.name === 'MessageCenter');
|
||||
// 存在我收到的导航菜单
|
||||
if (
|
||||
messageCenter &&
|
||||
messageCenter?.meta?.frontHidden !== true &&
|
||||
messageCenter.children && messageCenter.children.length
|
||||
) {
|
||||
const receivedMsgPage = messageCenter.children.find(route => route.name === 'ReceivedMsg');
|
||||
if (receivedMsgPage && receivedMsgPage?.meta?.frontHidden !== true) {
|
||||
setTimeout(() => {
|
||||
router.push({
|
||||
path: `/platform/Message/MessageCenter/ReceivedMsg/Index`,
|
||||
query: {
|
||||
activeKey: result.msgType,
|
||||
eid: result.msgReceivedEid,
|
||||
},
|
||||
});
|
||||
}, 300);
|
||||
} else {
|
||||
message.warning(`“消息中心-我收到的”菜单未授权`);
|
||||
}
|
||||
} else {
|
||||
message.warning(`“消息中心-我收到的”菜单未授权`);
|
||||
}
|
||||
}
|
||||
// else {
|
||||
// e.preventDefault()
|
||||
// }
|
||||
},
|
||||
},
|
||||
[
|
||||
h('div', { style: { display: 'flex', width: '100%', marginBottom: '10px' } }, [
|
||||
h(
|
||||
'div',
|
||||
{
|
||||
style: { width: `50px`, fontSize: '30px' },
|
||||
},
|
||||
[h(UserOutlined, { style: 'color: #108ee9' })],
|
||||
),
|
||||
h(
|
||||
'div',
|
||||
{
|
||||
style: { width: `calc(100% - 50px)`, lineHeight: '50px' },
|
||||
},
|
||||
`[一条新消息]`,
|
||||
),
|
||||
]),
|
||||
h('p', { innerHTML: `标题: ${result?.messageTitle}` }),
|
||||
h('p', { innerHTML: `摘要: ${result?.abstractContent}` }),
|
||||
result.messageContent && messageContentData
|
||||
? h('p', { innerHTML: `内容: ${messageContentData}` })
|
||||
: null,
|
||||
// h('div', { style: { display: 'flex', width: '100%', marginTop: '10px' } }, [
|
||||
// h(
|
||||
// Button,
|
||||
// {
|
||||
// style: { width: `40%` },
|
||||
// onClick: () => {
|
||||
// console.log('业务联查1');
|
||||
// },
|
||||
// },
|
||||
// `业务联查1`,
|
||||
// ),
|
||||
// h(
|
||||
// Button,
|
||||
// {
|
||||
// style: { width: `40%` },
|
||||
// onClick: () => {
|
||||
// console.log('业务联查2');
|
||||
// },
|
||||
// },
|
||||
// `业务联查2`,
|
||||
// ),
|
||||
// ]),
|
||||
],
|
||||
),
|
||||
});
|
||||
}
|
||||
});
|
||||
};
|
||||
const closeSocket = async () => {
|
||||
socket.close();
|
||||
};
|
||||
export { setSocket, closeSocket };
|
@ -0,0 +1,42 @@
|
||||
// 业务联查功能使用时socket切换到该文件
|
||||
import { useHttp } from '@crami/http';
|
||||
import { getInfo, ICP_CONFIG } from '@/utils/commMethods';
|
||||
// import handleMessage from './messageHandle';
|
||||
|
||||
let socket = null;
|
||||
const getUrl = async () => {
|
||||
const data = await useHttp({
|
||||
url: '/api/msg/serverUrl/getWebsocketServerUrl',
|
||||
method: 'get',
|
||||
});
|
||||
if (data.code === 200) {
|
||||
return data.data;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
};
|
||||
|
||||
const setSocket = async (opts = {}) => {
|
||||
if (socket && [socket.CONNECTING, socket.OPEN].includes(socket.readyState)) return;
|
||||
const router = opts.router;
|
||||
const userInfo = getInfo(ICP_CONFIG);
|
||||
const socketUrl = await getUrl();
|
||||
if (!userInfo || !socketUrl) return;
|
||||
const URL = `${socketUrl}${userInfo.user_id}`;
|
||||
socket = new WebSocket(URL);
|
||||
socket.addEventListener('message', event => {
|
||||
const { data } = event;
|
||||
let result: Record<string, any> = {};
|
||||
try {
|
||||
result = JSON.parse(data);
|
||||
} catch (e) {
|
||||
// TODO
|
||||
}
|
||||
|
||||
// handleMessage(result);
|
||||
});
|
||||
};
|
||||
const closeSocket = async () => {
|
||||
socket.close();
|
||||
};
|
||||
export { setSocket, closeSocket };
|
71
packages/icpx-platform/src/api/platform/ImpExp/Export.ts
Normal file
@ -0,0 +1,71 @@
|
||||
// import request from '@/utils/request';
|
||||
import { useHttp } from '@crami/http';
|
||||
|
||||
export interface saveData {
|
||||
ObjectType: string;
|
||||
companyId: string;
|
||||
connect: string;
|
||||
data: {
|
||||
ECODE: string;
|
||||
EID: string;
|
||||
ENAME: string;
|
||||
EXPORTTYPE: string;
|
||||
FILETYPE: string;
|
||||
MAXCOUNT: string;
|
||||
SETTING: string;
|
||||
STATE: string;
|
||||
TEMPLATE: string;
|
||||
};
|
||||
lang: string;
|
||||
mode: string;
|
||||
modelName: string;
|
||||
newObject: string;
|
||||
objectID: string;
|
||||
productLine: string;
|
||||
projectCode: string;
|
||||
type: string;
|
||||
userId: string;
|
||||
}
|
||||
export async function saveDataAPI(data: any) {
|
||||
return await useHttp({
|
||||
url: '/system/model/saveObjectData',
|
||||
method: 'post',
|
||||
data,
|
||||
headers: {
|
||||
//根据接扣文档需要加的请求头
|
||||
'Content-Type': 'application/json',
|
||||
},
|
||||
});
|
||||
}
|
||||
|
||||
export interface editData {
|
||||
companyId: string;
|
||||
connect: string;
|
||||
lang: string;
|
||||
objectID: string;
|
||||
// projectCode: string;
|
||||
// userDept: string;
|
||||
// userGroup: string;
|
||||
// userId: string;
|
||||
}
|
||||
export async function editDataAPI(data: editData) {
|
||||
return await useHttp({
|
||||
url: '/system/model/GetObjectDataTestList',
|
||||
method: 'post',
|
||||
data,
|
||||
});
|
||||
}
|
||||
|
||||
export interface deleteRule {
|
||||
companyId: string;
|
||||
connect: string;
|
||||
lang: string;
|
||||
eidstr: string[];
|
||||
}
|
||||
export async function deleteRuleAPI(data: deleteRule) {
|
||||
return await useHttp({
|
||||
url: '/exportservice/exportMaintain/deleteRule',
|
||||
method: 'post',
|
||||
data,
|
||||
});
|
||||
}
|
149
packages/icpx-platform/src/api/platform/ImpExp/Import.ts
Normal file
@ -0,0 +1,149 @@
|
||||
// import request from '@/utils/request';
|
||||
import { useHttp } from '@crami/http';
|
||||
|
||||
export interface saveData {
|
||||
ObjectType: string;
|
||||
companyId: string;
|
||||
connect: string;
|
||||
data: {
|
||||
ECODE: string;
|
||||
EID: string;
|
||||
ENAME: string;
|
||||
ERROPTION: string;
|
||||
FILETYPE: string;
|
||||
MAXCOUNT: string;
|
||||
SETTING: string;
|
||||
STATEID: string;
|
||||
TEMPLATE: string;
|
||||
};
|
||||
lang: string;
|
||||
mode: string;
|
||||
modelName: string;
|
||||
newObject: string;
|
||||
objectID: string;
|
||||
productLine: string;
|
||||
projectCode: string;
|
||||
type: string;
|
||||
userId: string;
|
||||
}
|
||||
export async function saveDataAPI(data: saveData) {
|
||||
return await useHttp({
|
||||
url: '/system/model/saveObjectData',
|
||||
method: 'post',
|
||||
data,
|
||||
});
|
||||
}
|
||||
|
||||
export interface editData {
|
||||
companyId: string;
|
||||
connect: string;
|
||||
lang: string;
|
||||
objectID: string;
|
||||
// userId: string;
|
||||
}
|
||||
export async function editDataAPI(data: editData) {
|
||||
return await useHttp({
|
||||
url: '/system/model/GetObjectDataTestList',
|
||||
method: 'post',
|
||||
data,
|
||||
});
|
||||
}
|
||||
|
||||
// sheet页
|
||||
export interface analysis {
|
||||
dataList: any;
|
||||
dataCache: string; //可以为空
|
||||
companyId: string;
|
||||
objectID: string;
|
||||
connect: string;
|
||||
lang: string;
|
||||
userId: string;
|
||||
}
|
||||
export async function analysisTableAPI(data: analysis) {
|
||||
return await useHttp({
|
||||
url: '/importservice/importMaintain/getSheetNameTab',
|
||||
method: 'post',
|
||||
data,
|
||||
});
|
||||
}
|
||||
|
||||
//校验
|
||||
export interface analysis2 {
|
||||
dataList: any;
|
||||
dataCache: string; //可以为空
|
||||
companyId: string;
|
||||
connect: string;
|
||||
lang: string;
|
||||
userId: string;
|
||||
}
|
||||
export async function verifyDataAPI(data: analysis2) {
|
||||
return await useHttp({
|
||||
url: '/importservice/import/checkData',
|
||||
method: 'post',
|
||||
data,
|
||||
});
|
||||
}
|
||||
|
||||
//解析
|
||||
export interface analysisData {
|
||||
fileId: string;
|
||||
dataList: any;
|
||||
companyId: string;
|
||||
connect: string;
|
||||
lang: string;
|
||||
userId: string;
|
||||
}
|
||||
export async function analysisDataAPI(data: analysisData) {
|
||||
return await useHttp({
|
||||
url: '/importservice/import/extractData',
|
||||
method: 'post',
|
||||
data,
|
||||
});
|
||||
}
|
||||
|
||||
//下载获取文件id
|
||||
export async function getFileId(data: analysis) {
|
||||
return await useHttp({
|
||||
url: '/importservice/importMaintain/getFileId',
|
||||
method: 'post',
|
||||
data,
|
||||
});
|
||||
}
|
||||
|
||||
//导入
|
||||
export interface importErrList {
|
||||
ecode: string; //编码 导入按钮上默认配置
|
||||
dataCache: string; //数据缓存key
|
||||
customValid: [];
|
||||
companyId: string;
|
||||
connect: string;
|
||||
userId: string;
|
||||
lang: string;
|
||||
}
|
||||
export async function importErrListAPI(data: importErrList) {
|
||||
return await useHttp({
|
||||
url: '/importservice/import/saveData',
|
||||
method: 'post',
|
||||
data,
|
||||
});
|
||||
}
|
||||
|
||||
export interface ExpRule {
|
||||
companyId: string;
|
||||
connect: string;
|
||||
lang: string;
|
||||
objectType: string;
|
||||
dataRoute: string;
|
||||
dataCache: string;
|
||||
viewName: string;
|
||||
isAll: string;
|
||||
eids: [];
|
||||
}
|
||||
|
||||
export async function ExpDataAPI(data: ExpRule) {
|
||||
return await useHttp({
|
||||
url: '/exportservice/export/exportGridData',
|
||||
method: 'post',
|
||||
data,
|
||||
});
|
||||
}
|
29
packages/icpx-platform/src/api/platform/ImpExp/expGuide.ts
Normal file
@ -0,0 +1,29 @@
|
||||
// import request from '@/utils/request';
|
||||
import { useHttp } from '@crami/http';
|
||||
|
||||
export interface ExpRule {
|
||||
companyId: string;
|
||||
connect: string;
|
||||
filter: [
|
||||
{
|
||||
andOrFlag: string;
|
||||
field: string;
|
||||
operation: string;
|
||||
value: string;
|
||||
},
|
||||
];
|
||||
lang: string;
|
||||
objectType: string;
|
||||
page: number;
|
||||
pageNo: number;
|
||||
pageSize: number;
|
||||
data: any;
|
||||
}
|
||||
|
||||
export async function ExpDataAPI(data: ExpRule) {
|
||||
return await useHttp({
|
||||
url: '/exportservice/export/exportGridData',
|
||||
method: 'post',
|
||||
data,
|
||||
});
|
||||
}
|
43
packages/icpx-platform/src/api/platform/ImpExp/upload.ts
Normal file
@ -0,0 +1,43 @@
|
||||
// import request from '@/utils/request';
|
||||
import { useHttp } from '@crami/http';
|
||||
|
||||
export interface fileUpload {
|
||||
file: string;
|
||||
filePath: string;
|
||||
fileShowName: string;
|
||||
}
|
||||
export async function FileUploadAPI(data: any) {
|
||||
return await useHttp({
|
||||
url: '/api/file/applicationFile/upload',
|
||||
method: 'post',
|
||||
data,
|
||||
});
|
||||
}
|
||||
|
||||
export interface downloadUrl {
|
||||
fileId: string;
|
||||
}
|
||||
export async function downloadUrlAPI(fileId: string) {
|
||||
return await useHttp({
|
||||
url: `/api/file/applicationFile/template/downloadUrl/${fileId}`,
|
||||
method: 'get',
|
||||
});
|
||||
}
|
||||
|
||||
export interface soleData {
|
||||
Data: {
|
||||
coding: string;
|
||||
};
|
||||
NewObject: boolean;
|
||||
connect: string;
|
||||
lang: string;
|
||||
objectID: string;
|
||||
objectType: string;
|
||||
}
|
||||
export async function soleDataAPI(data: soleData) {
|
||||
return await useHttp({
|
||||
url: '/api/system/model/CheckObjectUnique',
|
||||
method: 'post',
|
||||
data,
|
||||
});
|
||||
}
|
30
packages/icpx-platform/src/api/platform/auth/index.ts
Normal file
@ -0,0 +1,30 @@
|
||||
import request from '@/utils/request';
|
||||
import { useHttp } from '@crami/http';
|
||||
|
||||
interface SaveMenu {
|
||||
lang: string;
|
||||
connect: string;
|
||||
companyId: string;
|
||||
objectId: string;
|
||||
appId: string;
|
||||
permissionType: string; // PC/MOBILE/API
|
||||
userId: string;
|
||||
data: Array<any>;
|
||||
}
|
||||
|
||||
// 获取授权应用
|
||||
export async function getApplication() {
|
||||
return request.request<any, any>({
|
||||
url: '/system/fun/getApplication',
|
||||
method: 'POST',
|
||||
});
|
||||
}
|
||||
|
||||
// 授权菜单保存
|
||||
export async function saveMenu(data: SaveMenu) {
|
||||
return await useHttp({
|
||||
url: '/api/menupermission/menuPer/saveMenuPer',
|
||||
method: 'post',
|
||||
params: data,
|
||||
});
|
||||
}
|
52
packages/icpx-platform/src/api/platform/demo/demoList.ts
Normal file
@ -0,0 +1,52 @@
|
||||
import request from '@/utils/request';
|
||||
|
||||
interface MetaData {
|
||||
EID: string;
|
||||
ECODE: string;
|
||||
ENAME: string;
|
||||
PUBLISHER: string;
|
||||
PUBLISHDATE: string;
|
||||
}
|
||||
|
||||
export interface RegisterResp {
|
||||
data: Record<any, any>;
|
||||
success: boolean;
|
||||
}
|
||||
|
||||
interface deleteData {
|
||||
EID: string;
|
||||
}
|
||||
|
||||
// 新增
|
||||
export async function addList(data: MetaData) {
|
||||
return request.request<MetaData, RegisterResp>({
|
||||
url: '/practice/tclBook/add',
|
||||
method: 'POST',
|
||||
data,
|
||||
});
|
||||
}
|
||||
|
||||
// 查询
|
||||
export async function searchList(data: MetaData) {
|
||||
return request.request<MetaData, RegisterResp>({
|
||||
url: '/practice/tclBook/list ',
|
||||
method: 'POST',
|
||||
data,
|
||||
});
|
||||
}
|
||||
|
||||
export async function deleteList(data: deleteData) {
|
||||
return request.request<deleteData, RegisterResp>({
|
||||
url: '/practice/tclBook/delete',
|
||||
method: 'POST',
|
||||
data,
|
||||
});
|
||||
}
|
||||
|
||||
export async function updateList(data: MetaData) {
|
||||
return request.request<MetaData, RegisterResp>({
|
||||
url: '/practice/tclBook/update',
|
||||
method: 'POST',
|
||||
data,
|
||||
});
|
||||
}
|
15
packages/icpx-platform/src/api/platform/dict/dict.ts
Normal file
@ -0,0 +1,15 @@
|
||||
import request from '@/utils/request';
|
||||
|
||||
export interface MetaData {
|
||||
type: string;
|
||||
project: string;
|
||||
name: string;
|
||||
}
|
||||
|
||||
export async function getByProjectAndType(data: MetaData) {
|
||||
return request.request<MetaData, any>({
|
||||
url: '/studio-cache/page/getMetaInfo',
|
||||
method: 'POST',
|
||||
data,
|
||||
});
|
||||
}
|
17
packages/icpx-platform/src/api/platform/fileService/dict.ts
Normal file
@ -0,0 +1,17 @@
|
||||
import { commonApi } from '@/api/commonApi';
|
||||
// import request from '@/utils/request';
|
||||
import { useHttp } from '@crami/http';
|
||||
|
||||
export interface MetaData {
|
||||
type: string;
|
||||
productLine: string;
|
||||
name: string;
|
||||
}
|
||||
|
||||
export async function getByProjectAndType(params: MetaData) {
|
||||
return useHttp({
|
||||
url: commonApi().studioCache.getMetaInfo.url,
|
||||
method: commonApi().studioCache.getMetaInfo.method,
|
||||
params,
|
||||
});
|
||||
}
|
@ -0,0 +1,91 @@
|
||||
// import request from '@/utils/request';
|
||||
import { useHttp } from '@crami/http';
|
||||
interface saveTransfer {
|
||||
transferStrategyName: string;
|
||||
transferStrategyDescription: string;
|
||||
transferStrategyCode: string;
|
||||
inUse: string;
|
||||
eid: string;
|
||||
strategyList: Array<any>;
|
||||
companyId: string;
|
||||
}
|
||||
|
||||
interface deleteTransferr {
|
||||
eidList: Array<any>;
|
||||
}
|
||||
|
||||
interface getOneTransfer {
|
||||
eid: string;
|
||||
}
|
||||
|
||||
//替换当前版本
|
||||
|
||||
export async function getPluginList() {
|
||||
return await useHttp({
|
||||
method: 'get',
|
||||
url: '/api/file/transfer/getPluginList',
|
||||
});
|
||||
}
|
||||
|
||||
// 传输策略新增
|
||||
|
||||
export async function saveTransfer(params: saveTransfer) {
|
||||
return await useHttp({
|
||||
method: 'post',
|
||||
url: '/api/file/transfer/saveTransfer',
|
||||
params,
|
||||
});
|
||||
}
|
||||
|
||||
// 传输策略编辑
|
||||
|
||||
export async function editTransfer(params: saveTransfer) {
|
||||
return await useHttp({
|
||||
method: 'post',
|
||||
url: '/api/file/transfer/editTransfer',
|
||||
params,
|
||||
});
|
||||
}
|
||||
|
||||
// 传输策略编辑回显
|
||||
|
||||
export async function getOneTransfer(eid: string) {
|
||||
return await useHttp({
|
||||
method: 'get',
|
||||
url: '/api/file/transfer/getOneTransfer?eid=' + eid,
|
||||
});
|
||||
}
|
||||
|
||||
// 删除
|
||||
|
||||
export async function deleteTransferr(params: deleteTransferr) {
|
||||
return await useHttp({
|
||||
method: 'post',
|
||||
url: '/api/file/transfer/deleteTransfer',
|
||||
params,
|
||||
});
|
||||
}
|
||||
|
||||
export async function getList() {
|
||||
return await useHttp({
|
||||
method: 'get',
|
||||
url: '/api/file/transfer/getPluginList',
|
||||
});
|
||||
}
|
||||
|
||||
// 拓展插件删除
|
||||
|
||||
export async function deleteExtensions(eid: string) {
|
||||
return await useHttp({
|
||||
method: 'get',
|
||||
url: '/api/file/transfer/deleteExtensions?eid=' + eid,
|
||||
});
|
||||
}
|
||||
|
||||
// 1.查看插件详情
|
||||
export async function getExtensionsDetail(eid: string) {
|
||||
return await useHttp({
|
||||
method: 'get',
|
||||
url: `/api/file/transfer/getExtensionsDetail/${eid}`,
|
||||
});
|
||||
}
|
274
packages/icpx-platform/src/api/platform/fileService/operation.ts
Normal file
@ -0,0 +1,274 @@
|
||||
// import request from '@/utils/request';
|
||||
import { useHttp } from '@crami/http';
|
||||
|
||||
interface createFileVolume {
|
||||
appCode: string;
|
||||
volumeCode: string;
|
||||
volumeName: string;
|
||||
volumeDescription: string;
|
||||
storageCode: string;
|
||||
}
|
||||
interface editFileVolume {
|
||||
eid: string;
|
||||
appCode: string;
|
||||
volumeCode: string;
|
||||
volumeName: string;
|
||||
volumeDescription: string;
|
||||
storageCode: string;
|
||||
}
|
||||
|
||||
interface editApplication {
|
||||
eid: string;
|
||||
appCode: string;
|
||||
appName: string;
|
||||
appDescription: string;
|
||||
}
|
||||
|
||||
interface createApplication {
|
||||
appCode: string;
|
||||
appName: string;
|
||||
appDescription: string;
|
||||
}
|
||||
|
||||
interface deleteFileVolume {
|
||||
EID: string;
|
||||
}
|
||||
|
||||
interface fileList {
|
||||
eid: string;
|
||||
appCode: string;
|
||||
volumeCode: string;
|
||||
filePath: string;
|
||||
fileShowName: string;
|
||||
fileDescription: string;
|
||||
versionCode: string;
|
||||
metaInfo: string;
|
||||
expiresOn: string;
|
||||
isgeneralfile: string;
|
||||
}
|
||||
|
||||
interface createExtensions {
|
||||
eid: string;
|
||||
extensionName: string; //插件名称
|
||||
extensionDescription: string; //插件描述
|
||||
extensionId: string; //插string;件标识
|
||||
serviceCode: string; //服务标识
|
||||
inUse: string; //是否启用
|
||||
fileTypes: string; //文件类型
|
||||
}
|
||||
|
||||
interface createStorage {
|
||||
eid: string;
|
||||
storageName: string; //存储名称
|
||||
storageDescription: string; //存储描述
|
||||
states: string; //状态
|
||||
accAddress: string; //地址
|
||||
accUser: string; //用户
|
||||
accPwd: string; //密码
|
||||
}
|
||||
|
||||
/*
|
||||
新建文件卷
|
||||
*/
|
||||
|
||||
export async function createFileVolume(params: createFileVolume) {
|
||||
return await useHttp({
|
||||
method: 'post',
|
||||
url: '/api/file/fileVolume/createFileVolume',
|
||||
params,
|
||||
});
|
||||
}
|
||||
/*
|
||||
编辑文件卷
|
||||
*/
|
||||
|
||||
export async function editFileVolume(params: editFileVolume) {
|
||||
return await useHttp({
|
||||
method: 'put',
|
||||
url: '/api/file/fileVolume/editFileVolume',
|
||||
params,
|
||||
});
|
||||
}
|
||||
|
||||
/*
|
||||
删除文件卷
|
||||
*/
|
||||
|
||||
export async function deleteFileVolume(eid: string) {
|
||||
return await useHttp({
|
||||
method: 'get',
|
||||
url: `/api/file/fileVolume/${eid}`,
|
||||
});
|
||||
}
|
||||
|
||||
/*
|
||||
新建文件卷获取主存储集群数据
|
||||
*/
|
||||
|
||||
export async function duplicationStrategy() {
|
||||
return await useHttp({
|
||||
method: 'get',
|
||||
url: '/api/file/storage/getOtherStrategy',
|
||||
});
|
||||
}
|
||||
/*
|
||||
编辑文件卷回显主集群数据
|
||||
*/
|
||||
|
||||
export async function getDetail(eid: string) {
|
||||
return await useHttp({
|
||||
method: 'get',
|
||||
url: `/api/file/fileVolume/getDetailMsg/${eid}`,
|
||||
});
|
||||
}
|
||||
|
||||
//删除历史版本
|
||||
|
||||
export async function deleteHistory(eid: string) {
|
||||
return await useHttp({
|
||||
method: 'delete',
|
||||
url: `/api/file/applicationFile/deleteHistoryFile/${eid}`,
|
||||
});
|
||||
}
|
||||
|
||||
//替换当前版本
|
||||
|
||||
export async function updateHistory(eid: string) {
|
||||
return await useHttp({
|
||||
method: 'get',
|
||||
url: `/api/file/applicationFile/changeHistoryVersion/${eid}`,
|
||||
});
|
||||
}
|
||||
|
||||
// 新增应用仓库
|
||||
|
||||
export async function createApplication(params: createApplication) {
|
||||
return await useHttp({
|
||||
method: 'post',
|
||||
url: '/api/file/applications/createApplication',
|
||||
params,
|
||||
});
|
||||
}
|
||||
|
||||
// 编辑应用仓库
|
||||
|
||||
export async function editApplication(params: editApplication) {
|
||||
return await useHttp({
|
||||
method: 'put',
|
||||
url: '/api/file/applications/editApplication',
|
||||
params,
|
||||
});
|
||||
}
|
||||
|
||||
// 删除应用仓库
|
||||
export async function deleteApplication(eid: string) {
|
||||
return await useHttp({
|
||||
method: 'delete',
|
||||
url: `/api/file/applications/${eid}`,
|
||||
});
|
||||
}
|
||||
|
||||
// 新建文件信息保存
|
||||
|
||||
export async function createApplicationFile(params: fileList) {
|
||||
return await useHttp({
|
||||
method: 'post',
|
||||
url: '/api/file/applicationFile/createApplicationFile',
|
||||
params,
|
||||
});
|
||||
}
|
||||
|
||||
// 编辑文件信息保存
|
||||
|
||||
export async function editApplicationFile(params: fileList) {
|
||||
return await useHttp({
|
||||
method: 'put',
|
||||
url: '/api/file/applicationFile/editApplicationFile',
|
||||
params,
|
||||
});
|
||||
}
|
||||
|
||||
// 删除文件信息列表
|
||||
|
||||
export async function applicationFile(eid: string) {
|
||||
return await useHttp({
|
||||
method: 'delete',
|
||||
url: `/api/file/applicationFile/${eid}`,
|
||||
});
|
||||
}
|
||||
|
||||
// 存储结构禁用
|
||||
|
||||
export async function changeStateDisable(eid: string) {
|
||||
return await useHttp({
|
||||
method: 'get',
|
||||
url: `/api/file/storage/changeStateDisable/${eid}`,
|
||||
});
|
||||
}
|
||||
|
||||
// 存储结构启用
|
||||
export async function changeStateEnable(eid: string) {
|
||||
return await useHttp({
|
||||
method: 'get',
|
||||
url: `/api/file/storage/changeStateEnable/${eid}`,
|
||||
});
|
||||
}
|
||||
|
||||
// 传输策略启用
|
||||
export async function transferEnable(eid: string) {
|
||||
return await useHttp({
|
||||
method: 'get',
|
||||
url: `/api/file/transfer/changeStateEnable/${eid}`,
|
||||
});
|
||||
}
|
||||
// 传输策略禁用
|
||||
export async function transferDisable(eid: string) {
|
||||
return await useHttp({
|
||||
method: 'get',
|
||||
url: `/api/file/transfer/changeStateDisable/${eid}`,
|
||||
});
|
||||
}
|
||||
|
||||
// 插件管理新增保存
|
||||
export async function createExtensions(params: createExtensions) {
|
||||
return await useHttp({
|
||||
method: 'post',
|
||||
url: '/api/file/transfer/createExtensions',
|
||||
params,
|
||||
});
|
||||
}
|
||||
// 插件管理编辑保存
|
||||
|
||||
export async function editExtensions(params: createExtensions) {
|
||||
return await useHttp({
|
||||
method: 'put',
|
||||
url: '/api/file/transfer/editExtensions',
|
||||
params,
|
||||
});
|
||||
}
|
||||
|
||||
// 存储结构新增保存
|
||||
|
||||
export async function createStorage(params: createStorage) {
|
||||
return await useHttp({
|
||||
method: 'post',
|
||||
url: '/api/file/storage/createStorage',
|
||||
params,
|
||||
});
|
||||
}
|
||||
// 存储结构编辑保存
|
||||
export async function editStorage(params: createStorage) {
|
||||
return await useHttp({
|
||||
method: 'put',
|
||||
url: '/api/file/storage/editStorage',
|
||||
params,
|
||||
});
|
||||
}
|
||||
|
||||
// 存储结构管理删除
|
||||
export async function deleteStorage(eid: string) {
|
||||
return await useHttp({
|
||||
method: 'delete',
|
||||
url: `/api/file/storage/Storage/${eid}`,
|
||||
});
|
||||
}
|
102
packages/icpx-platform/src/api/platform/fileService/select.ts
Normal file
@ -0,0 +1,102 @@
|
||||
// import request from '@/utils/request';
|
||||
import { useHttp } from '@crami/http';
|
||||
import { commonApi } from '@/api/commonApi/index';
|
||||
|
||||
export interface MetaData {
|
||||
type: string;
|
||||
productLine: string;
|
||||
name: string;
|
||||
mode: string;
|
||||
}
|
||||
|
||||
export interface treeData {
|
||||
type: string;
|
||||
productLine: string;
|
||||
// name: string;
|
||||
loadAll: boolean;
|
||||
objectType: string;
|
||||
treeViewName: string;
|
||||
userDept: string;
|
||||
userGroup: string;
|
||||
userId: string;
|
||||
}
|
||||
|
||||
export async function getSelectData(params: MetaData) {
|
||||
return await useHttp({
|
||||
url: commonApi().studioCache.getMetaInfo.url,
|
||||
method: commonApi().studioCache.getMetaInfo.method,
|
||||
params,
|
||||
});
|
||||
}
|
||||
|
||||
export async function storageListAPI() {
|
||||
return await useHttp({
|
||||
method: 'get',
|
||||
url: '/api/file/storage/getVolumeAcquireDuplicationStrategy',
|
||||
});
|
||||
}
|
||||
|
||||
export async function storageChildListAPI(eid: string) {
|
||||
return await useHttp({
|
||||
method: 'get',
|
||||
url: `/api/file/storage/getOtherStorage/${eid}`,
|
||||
});
|
||||
}
|
||||
|
||||
export interface saveData {
|
||||
eid: string;
|
||||
mainStorageName: string;
|
||||
mainStorageId: string; //主存储集群标识
|
||||
duplicationParam: string; //调度参数
|
||||
duplicationMode: string; //启动方式
|
||||
inUse: string; //启用中
|
||||
expiresMode: string; //过期策略
|
||||
blockMode: string; //阻塞模式
|
||||
expiresTimeLong: string; //任务超时时间
|
||||
mayFailTime: string; //默认重试次数
|
||||
// eslint-disable-next-line @typescript-eslint/ban-types
|
||||
sequenceList: {};
|
||||
}
|
||||
|
||||
export async function saveDataAPI(params: saveData) {
|
||||
return await useHttp({
|
||||
url: '/api/file/duplicationStrategy/saveDuplicationStrategy',
|
||||
method: 'post',
|
||||
params,
|
||||
});
|
||||
}
|
||||
|
||||
export async function showListAPI(storageId) {
|
||||
return await useHttp({
|
||||
url: `/api/file/orgStorage/${storageId}`,
|
||||
method: 'get',
|
||||
});
|
||||
}
|
||||
|
||||
export interface saveList {
|
||||
storageId: string;
|
||||
organizationIds: string[];
|
||||
}
|
||||
|
||||
export async function saveDataListAPI(params: saveList) {
|
||||
return await useHttp({
|
||||
url: '/api/file/orgStorage/saveOrgStorage',
|
||||
method: 'post',
|
||||
params,
|
||||
});
|
||||
}
|
||||
|
||||
export async function getDuplicationAPI() {
|
||||
return await useHttp({
|
||||
url: '/api/file/duplicationStrategy/getDuplicationStrategy',
|
||||
method: 'get',
|
||||
});
|
||||
}
|
||||
|
||||
export async function getByProjectAndType(params: treeData) {
|
||||
return useHttp({
|
||||
url: commonApi().studioCache.getMetaInfo.url,
|
||||
method: commonApi().studioCache.getMetaInfo.method,
|
||||
params,
|
||||
});
|
||||
}
|
@ -0,0 +1,74 @@
|
||||
// import request from '@/utils/request';
|
||||
import { useHttp } from '@crami/http';
|
||||
import { commonApi } from '@/api/commonApi/index';
|
||||
|
||||
interface uploadFile {
|
||||
eid: string;
|
||||
filePath: string;
|
||||
fileShowName: string;
|
||||
fileDescription: string;
|
||||
versionCode: string;
|
||||
metaInfo: string;
|
||||
}
|
||||
|
||||
interface uploadFinished {
|
||||
eid: string;
|
||||
storageId: string;
|
||||
bucketCode: string;
|
||||
objectCode: string;
|
||||
fileId: string;
|
||||
templateUrl: string;
|
||||
fileShowName: string;
|
||||
versionCode: string;
|
||||
}
|
||||
|
||||
interface downloadUrl {
|
||||
fileId: string;
|
||||
}
|
||||
|
||||
export interface MetaData {
|
||||
type: string;
|
||||
productLine: string;
|
||||
name: string;
|
||||
mode: string;
|
||||
}
|
||||
|
||||
export async function getByProjectAndType(params: MetaData) {
|
||||
return await useHttp({
|
||||
url: commonApi().studioCache.getMetaInfo.url,
|
||||
method: commonApi().studioCache.getMetaInfo.method,
|
||||
params,
|
||||
});
|
||||
}
|
||||
|
||||
export async function uploadFile(params: uploadFile) {
|
||||
return await useHttp({
|
||||
url: '/api/file/applicationFile/template/uploadUrl',
|
||||
method: 'post',
|
||||
params,
|
||||
});
|
||||
}
|
||||
|
||||
export async function uploadFinished(params: uploadFinished) {
|
||||
return await useHttp({
|
||||
url: '/api/file/applicationFile/template/uploadFinished',
|
||||
method: 'put',
|
||||
params,
|
||||
});
|
||||
}
|
||||
|
||||
export async function downloadUrl(fileId: string) {
|
||||
return await useHttp({
|
||||
url: `/api/file/applicationFile/template/downloadUrl/${fileId}`,
|
||||
method: 'get',
|
||||
});
|
||||
}
|
||||
|
||||
export async function uploadMessage(eid: string) {
|
||||
return await useHttp({
|
||||
url: `/api/file/applicationFile/getOneFile/${eid}`,
|
||||
method: 'get',
|
||||
});
|
||||
}
|
||||
|
||||
|
144
packages/icpx-platform/src/api/platform/lifeCycle/index.ts
Normal file
@ -0,0 +1,144 @@
|
||||
//import request from '@/utils/request';
|
||||
import { useHttp } from '@crami/http';
|
||||
import { commonApi } from '@/api/commonApi/index';
|
||||
|
||||
export interface MetaData {
|
||||
type: string;
|
||||
productLine: string;
|
||||
name: string;
|
||||
}
|
||||
|
||||
export async function getLifeCycleData(params: MetaData) {
|
||||
return useHttp({
|
||||
url: commonApi().studioCache.getMetaInfo.url,
|
||||
method: commonApi().studioCache.getMetaInfo.method,
|
||||
params,
|
||||
});
|
||||
}
|
||||
|
||||
// 获取生命周期状态分组
|
||||
export async function getLiftStatusList(params: any) {
|
||||
return useHttp({
|
||||
url: '/api/lifecycle/lifeStatus/getLifeStatusList',
|
||||
method: 'post',
|
||||
params,
|
||||
});
|
||||
}
|
||||
|
||||
// 获取生命周期详情
|
||||
export async function getLiftCycleInfo(params: any) {
|
||||
return useHttp({
|
||||
url: '/api/lifecycle/lifeCycle/getLifeCircleById',
|
||||
method: 'post',
|
||||
params,
|
||||
});
|
||||
}
|
||||
|
||||
// 获取使用对象数据
|
||||
export async function getModelList(params: any) {
|
||||
return useHttp({
|
||||
url: '/api/lifecycle/lifeCycle/getModelList',
|
||||
method: 'post',
|
||||
params,
|
||||
});
|
||||
}
|
||||
|
||||
// 保存生命周期
|
||||
export async function saveLifeCircleData(params: any) {
|
||||
return useHttp({
|
||||
url: '/api/lifecycle/lifeCycle/saveLifeCircleData',
|
||||
method: 'post',
|
||||
params,
|
||||
});
|
||||
}
|
||||
// 删除生命周期
|
||||
export async function deleteLifeCircleDatas(params: any) {
|
||||
return useHttp({
|
||||
url: '/api/lifecycle/lifeCycle/deleteLifeCircleData',
|
||||
method: 'post',
|
||||
params,
|
||||
});
|
||||
}
|
||||
// 删除生命周期校验
|
||||
export async function deleteLifeCircleCheck(params: any) {
|
||||
return useHttp({
|
||||
url: '/api/lifecycle/lifeCycle/deleteLifeCircleCheck',
|
||||
method: 'post',
|
||||
params,
|
||||
});
|
||||
}
|
||||
//删除状态列表
|
||||
export async function deleteState(params: any) {
|
||||
return useHttp({
|
||||
url: '/api/lifecycle/lifeStatus/deleteLifeStatus',
|
||||
method: 'post',
|
||||
params,
|
||||
});
|
||||
}
|
||||
|
||||
//删除状态列表校验
|
||||
export async function checkDeleteState(params: any) {
|
||||
return useHttp({
|
||||
url: '/api/lifecycle/lifeStatus/checkDelete',
|
||||
method: 'post',
|
||||
params,
|
||||
});
|
||||
}
|
||||
|
||||
// 获取节点插件数据
|
||||
export async function getLifeCyclePlugins(params: any) {
|
||||
return useHttp({
|
||||
url: '/api/lifecycle/lifeStatus/getLifeCyclePlugins',
|
||||
method: 'post',
|
||||
params,
|
||||
});
|
||||
}
|
||||
//获取状态分类下拉列表
|
||||
export async function getStateTypeList(params: any) {
|
||||
return useHttp({
|
||||
//commonApi().system.getSltData.url
|
||||
url: commonApi().system.getSltData.url,
|
||||
method: commonApi().system.getSltData.method,
|
||||
params,
|
||||
});
|
||||
}
|
||||
//保存生命周期状态
|
||||
export async function saveState(params: any) {
|
||||
return useHttp({
|
||||
url: '/api/lifecycle/lifeStatus/saveLifeStatus',
|
||||
method: 'post',
|
||||
params,
|
||||
});
|
||||
}
|
||||
//获取多语言列表
|
||||
export async function getLangList(params: any) {
|
||||
return useHttp({
|
||||
url: '/api/lifecycle/lifeStatus/getMutilLanuageList',
|
||||
method: 'post',
|
||||
params,
|
||||
});
|
||||
}
|
||||
//上传文件
|
||||
export async function uploadFile(data: any) {
|
||||
return useHttp({
|
||||
url: '/api/file/applicationFile/upload',
|
||||
method: 'post',
|
||||
data,
|
||||
});
|
||||
}
|
||||
//获取单条数据
|
||||
export async function getData(params: any) {
|
||||
return useHttp({
|
||||
url: '/api/lifecycle/lifeStatus/getSingleData',
|
||||
method: 'post',
|
||||
params,
|
||||
});
|
||||
}
|
||||
//ID唯一性校验
|
||||
export async function checkIDUnique(params: any) {
|
||||
return useHttp({
|
||||
url: '/api/lifecycle/lifeStatus/checkObjectUnique',
|
||||
method: 'post',
|
||||
params,
|
||||
});
|
||||
}
|
@ -0,0 +1,30 @@
|
||||
//import request from '@/utils/request';
|
||||
import { useHttp } from '@crami/http';
|
||||
import { commonApi } from '@/api/commonApi/index';
|
||||
|
||||
export interface MetaData {
|
||||
type: string;
|
||||
productLine: string;
|
||||
name: string;
|
||||
}
|
||||
export interface UserData {
|
||||
lang: string;
|
||||
connect: string;
|
||||
companyId: string;
|
||||
data: { id: string; ids: string };
|
||||
}
|
||||
|
||||
export async function getByProjectAndType(params: MetaData) {
|
||||
return useHttp({
|
||||
url: commonApi().studioCache.getMetaInfo.url,
|
||||
method: commonApi().studioCache.getMetaInfo.method,
|
||||
params,
|
||||
});
|
||||
}
|
||||
export async function saveUser(params: UserData) {
|
||||
return useHttp({
|
||||
url: '/system/dept/saveUser',
|
||||
method: 'post',
|
||||
params,
|
||||
});
|
||||
}
|
@ -0,0 +1,52 @@
|
||||
import request from '@/utils/request';
|
||||
|
||||
export interface getUserSetData {
|
||||
}
|
||||
|
||||
export interface UserSetData {
|
||||
// ENAME: string;
|
||||
// USER_EMAIL: string;
|
||||
// POST_IDS: string;
|
||||
// USER_PHONE: string;
|
||||
// USER_ADDRESS: string;
|
||||
// AVATAR: string;
|
||||
// PREFER:boolean;
|
||||
// data:any;
|
||||
// NewObject:boolean;
|
||||
// ObjectType:string;
|
||||
}
|
||||
|
||||
export interface UserSetResp {
|
||||
data: Record<any, any>;
|
||||
success: boolean;
|
||||
}
|
||||
|
||||
export interface UpdateUserPassword {
|
||||
|
||||
|
||||
}
|
||||
|
||||
//获取用户设置信息
|
||||
export async function getUserSetting() {
|
||||
return request.request<getUserSetData, UserSetResp>({
|
||||
url: '/system/user/getUseInfo',
|
||||
method: 'GET',
|
||||
data: {},
|
||||
});
|
||||
}
|
||||
//更新用户信息,更新用户偏好选择
|
||||
export async function updateUserSetting(data: UserSetData) {
|
||||
return request.request<UserSetData, UserSetResp>({
|
||||
url: '/system/user/saveUserData',
|
||||
method: 'POST',
|
||||
data,
|
||||
});
|
||||
}
|
||||
//更新登录密码
|
||||
export async function updateUserPassword(data: UpdateUserPassword) {
|
||||
return request.request<UpdateUserPassword, UserSetResp>({
|
||||
url: '/system/user/updatePwd',
|
||||
method: 'POST',
|
||||
data,
|
||||
});
|
||||
}
|
@ -0,0 +1,9 @@
|
||||
import request from '@/utils/request';
|
||||
|
||||
export async function getLoginPageInfo() {
|
||||
return request.get<any, any>('/system/loginPageElement/GetLoginPageInfo');
|
||||
}
|
||||
|
||||
export async function saveLoginPageInfo(params) {
|
||||
return request.post<any, any>('/system/loginPageElement/saveLoginPageInfo', params);
|
||||
}
|
149
packages/icpx-platform/src/api/platform/user/login.ts
Normal file
@ -0,0 +1,149 @@
|
||||
import request from '@/utils/request';
|
||||
import { useHttp } from '@crami/http';
|
||||
export type LoginData = 'account' | 'telephone';
|
||||
export type LoginStatus = 'ok' | 'error';
|
||||
import { commonApi } from '@/api/commonApi';
|
||||
|
||||
export interface LoginParams {
|
||||
username: string;
|
||||
password: string;
|
||||
code: string;
|
||||
uuid: string;
|
||||
loginMode?: string;
|
||||
}
|
||||
|
||||
export interface LoginResp {
|
||||
code: number;
|
||||
msg: string;
|
||||
data: {
|
||||
[key: string]: any;
|
||||
};
|
||||
// currentAuthority: string;
|
||||
}
|
||||
|
||||
export interface UserInfo {
|
||||
companyId: string;
|
||||
connect: string;
|
||||
avatar: string;
|
||||
lang: string;
|
||||
user_id: string;
|
||||
user_name: string;
|
||||
email: string;
|
||||
group: string;
|
||||
name: string;
|
||||
phone: string;
|
||||
signature: string;
|
||||
user_type: string;
|
||||
role: {
|
||||
[key: string]: any;
|
||||
};
|
||||
}
|
||||
|
||||
export interface CaptchaResp {
|
||||
captcha: number;
|
||||
}
|
||||
|
||||
export interface SmsCaptchaRequest {
|
||||
mobile: string;
|
||||
}
|
||||
|
||||
// 后端的结构体定义
|
||||
export type RouteItem = {
|
||||
id: number | string;
|
||||
parentId: number | string;
|
||||
name: string;
|
||||
path: string;
|
||||
redirect: string;
|
||||
component: string;
|
||||
meta: {
|
||||
title: string | false;
|
||||
icon?: string;
|
||||
target?: '_blank' | '_self';
|
||||
hideInMenu?: boolean;
|
||||
hideChildrenInMenu?: boolean;
|
||||
authority?: string | string[];
|
||||
[key: string]: any;
|
||||
};
|
||||
};
|
||||
|
||||
export interface PermissionRequest {
|
||||
lang: string;
|
||||
objectId: string;
|
||||
productLine: string;
|
||||
companyId: string;
|
||||
connect: string;
|
||||
userType: string;
|
||||
userName: string;
|
||||
orgId: string;
|
||||
projectCode: string;
|
||||
permissionType: string;
|
||||
userId?: string;
|
||||
}
|
||||
|
||||
export async function getLoginCode() {
|
||||
return request.get<any, any>('/code');
|
||||
}
|
||||
|
||||
export async function getTenant() {
|
||||
return request.get<any, any>('/system/tenant/getTenant');
|
||||
}
|
||||
|
||||
export async function postAccountLogin(params: LoginParams) {
|
||||
return request.post<LoginParams, LoginResp>('/auth/login', params);
|
||||
}
|
||||
|
||||
// 获取组织列表接口
|
||||
export async function getOrgByUserName(params) {
|
||||
return request.post<any, any>('/system/org/getOrgByUserName', params);
|
||||
}
|
||||
|
||||
export async function getLoginOrg() {
|
||||
return request.get<any, any>('/system/org/getOrg');
|
||||
}
|
||||
|
||||
export async function getCurrentUser(info: any) {
|
||||
return request.get<any, UserInfo>('/system/user/getUseInfo', { params: info });
|
||||
}
|
||||
|
||||
export async function getProjectRoutes(info: any) {
|
||||
const method = commonApi().studioCache.getByProjectAndType.method;
|
||||
const url = commonApi().studioCache.getByProjectAndType.url;
|
||||
return request[method]<any, any>(url.replace('/api', ''), { params: info });
|
||||
}
|
||||
|
||||
export async function getCurrentUserNav() {
|
||||
return request.get<any, RouteItem[]>('/currentUserNav');
|
||||
}
|
||||
|
||||
// export async function postLogout() {
|
||||
// return request.delete<any, any>('/auth/logout');
|
||||
// }
|
||||
|
||||
export async function postLogout(isClear) {
|
||||
const url = isClear ? '/api/auth/logout/1' : '/api/auth/logout/0';
|
||||
return await useHttp({
|
||||
method: 'delete',
|
||||
url: url,
|
||||
});
|
||||
}
|
||||
|
||||
export async function getSmsCaptcha(params: SmsCaptchaRequest) {
|
||||
return request.get<SmsCaptchaRequest, CaptchaResp>('/message/captcha/sms', {
|
||||
params,
|
||||
});
|
||||
}
|
||||
|
||||
// 获取当前用户的导航和menu权限
|
||||
export async function getPermissionData(params: PermissionRequest) {
|
||||
return request.post<any, any>('/menuperservice/function/getPermissionData', params);
|
||||
}
|
||||
|
||||
// 获取当前用户的导航和menu权限
|
||||
export async function changeOrgIdOfUserInRedis(params: any) {
|
||||
return request.post<any, any>('/auth/changeOrgIdOfUserInRedis', params);
|
||||
}
|
||||
|
||||
// 根据当前用户获取默认的登录方式
|
||||
export async function getLoginModeByUserName(params: any) {
|
||||
return request.post<any, any>('/system/org/getLoginModeByUserName', params);
|
||||
}
|
27
packages/icpx-platform/src/api/platform/user/notice.ts
Normal file
@ -0,0 +1,27 @@
|
||||
import request from '@/utils/request';
|
||||
import type { CSSProperties } from 'vue';
|
||||
|
||||
export type NoticeIconData = {
|
||||
avatar?: string;
|
||||
title?: string;
|
||||
description?: string;
|
||||
datetime?: string;
|
||||
extra?: string;
|
||||
style?: CSSProperties;
|
||||
key?: string | number;
|
||||
read?: boolean;
|
||||
};
|
||||
|
||||
export type NoticeItem = {
|
||||
id: string;
|
||||
type: string;
|
||||
status: string;
|
||||
} & NoticeIconData;
|
||||
|
||||
export async function queryNotices() {
|
||||
return request.get<any, NoticeItem[]>('/notices');
|
||||
}
|
||||
|
||||
export async function changeNoticeReadState(notices: any[]): Promise<any> {
|
||||
return request.post('/change-notices-read', notices);
|
||||
}
|
30
packages/icpx-platform/src/api/platform/user/register.ts
Normal file
@ -0,0 +1,30 @@
|
||||
import request from '@/utils/request';
|
||||
|
||||
export interface RegisterData {
|
||||
lang: string;
|
||||
connect: string;
|
||||
project: string;
|
||||
companyId: string;
|
||||
orgId: string;
|
||||
roleId: string;
|
||||
username: string;
|
||||
password: string;
|
||||
password2: string;
|
||||
userPhone: string;
|
||||
code: string;
|
||||
}
|
||||
|
||||
export interface RegisterResp {
|
||||
data: Record<any, any>;
|
||||
success: boolean;
|
||||
code?: number | undefined;
|
||||
msg?: string | undefined;
|
||||
}
|
||||
|
||||
export async function postRegister(data) {
|
||||
return request.request({
|
||||
url: '/user/register',
|
||||
method: 'POST',
|
||||
data,
|
||||
});
|
||||
}
|
21
packages/icpx-platform/src/api/typing.ts
Normal file
@ -0,0 +1,21 @@
|
||||
export interface ResponseBody<T = any> {
|
||||
message: string;
|
||||
code: number;
|
||||
data?: T | T[];
|
||||
}
|
||||
|
||||
/** 统一返回结构体 */
|
||||
|
||||
export interface PageResult<T = any> {
|
||||
data: T[];
|
||||
current?: number;
|
||||
pageSize?: number;
|
||||
total?: number;
|
||||
success: boolean;
|
||||
}
|
||||
|
||||
export interface RequestResult<T = any> {
|
||||
data: T;
|
||||
success: boolean;
|
||||
errorMessage: string;
|
||||
}
|
89
packages/icpx-platform/src/api/user/login.ts
Normal file
@ -0,0 +1,89 @@
|
||||
import request from '@/utils/request';
|
||||
|
||||
export type LoginType = 'account' | 'telephone';
|
||||
export type LoginStatus = 'ok' | 'error';
|
||||
|
||||
export interface LoginParams {
|
||||
type: LoginType;
|
||||
username: string;
|
||||
password: string;
|
||||
code: string;
|
||||
uuid: string;
|
||||
}
|
||||
|
||||
export interface LoginResp {
|
||||
code: number;
|
||||
msg: string;
|
||||
data: {
|
||||
[key: string]: any;
|
||||
};
|
||||
// currentAuthority: string;
|
||||
}
|
||||
|
||||
export interface UserInfo {
|
||||
user_id: string | number;
|
||||
address: string;
|
||||
avatar: string;
|
||||
country: string;
|
||||
email: string;
|
||||
group: string;
|
||||
name: string;
|
||||
phone: string;
|
||||
signature: string;
|
||||
role: {
|
||||
[key: string]: any;
|
||||
};
|
||||
[key: string]: any;
|
||||
}
|
||||
|
||||
export interface CaptchaResp {
|
||||
captcha: number;
|
||||
}
|
||||
|
||||
export interface SmsCaptchaRequest {
|
||||
mobile: string;
|
||||
}
|
||||
|
||||
// 后端的结构体定义
|
||||
export type RouteItem = {
|
||||
id: number | string;
|
||||
parentId: number | string;
|
||||
name: string;
|
||||
path: string;
|
||||
redirect: string;
|
||||
component: string;
|
||||
meta: {
|
||||
title: string | false;
|
||||
icon?: string;
|
||||
target?: '_blank' | '_self';
|
||||
hideInMenu?: boolean;
|
||||
hideChildrenInMenu?: boolean;
|
||||
authority?: string | string[];
|
||||
[key: string]: any;
|
||||
};
|
||||
};
|
||||
|
||||
export async function postAccountLogin(params: LoginParams) {
|
||||
return request.post<LoginParams, LoginResp>('/auth/login', params);
|
||||
}
|
||||
|
||||
// export async function getCurrentUser() {
|
||||
// return request.get<any, UserInfo>('/currentUser');
|
||||
// }
|
||||
export async function getCurrentUser(userName: string) {
|
||||
return request.get<any, UserInfo>(`/thor/user`);
|
||||
}
|
||||
|
||||
export async function getCurrentUserNav() {
|
||||
return request.get<any, RouteItem[]>('/currentUserNav');
|
||||
}
|
||||
|
||||
export async function postLogout() {
|
||||
return request.delete('/thor/user/logout');
|
||||
}
|
||||
|
||||
export async function getSmsCaptcha(params: SmsCaptchaRequest) {
|
||||
return request.get<SmsCaptchaRequest, CaptchaResp>('/message/captcha/sms', {
|
||||
params,
|
||||
});
|
||||
}
|
27
packages/icpx-platform/src/api/user/notice.ts
Normal file
@ -0,0 +1,27 @@
|
||||
import request from '@/utils/request';
|
||||
import type { CSSProperties } from '@vue/runtime-dom';
|
||||
|
||||
export type NoticeIconData = {
|
||||
avatar?: string;
|
||||
title?: string;
|
||||
description?: string;
|
||||
datetime?: string;
|
||||
extra?: string;
|
||||
style?: CSSProperties;
|
||||
key?: string | number;
|
||||
read?: boolean;
|
||||
};
|
||||
|
||||
export type NoticeItem = {
|
||||
id: string;
|
||||
type: string;
|
||||
status: string;
|
||||
} & NoticeIconData;
|
||||
|
||||
export async function queryNotices() {
|
||||
return request.get<any, NoticeItem[]>('/notices');
|
||||
}
|
||||
|
||||
export async function changeNoticeReadState(notices: any[]): Promise<any> {
|
||||
return request.post('/change-notices-read', notices);
|
||||
}
|
22
packages/icpx-platform/src/api/user/register.ts
Normal file
@ -0,0 +1,22 @@
|
||||
import request from '@/utils/request';
|
||||
|
||||
export interface RegisterData {
|
||||
email: string;
|
||||
username: string;
|
||||
password: string;
|
||||
password2: string;
|
||||
captcha: string;
|
||||
}
|
||||
|
||||
export interface RegisterResp {
|
||||
data: Record<any, any>;
|
||||
success: boolean;
|
||||
}
|
||||
|
||||
export async function postRegister(data: RegisterData) {
|
||||
return request.request<RegisterData, RegisterResp>({
|
||||
url: '/register',
|
||||
method: 'POST',
|
||||
data,
|
||||
});
|
||||
}
|
19
packages/icpx-platform/src/api/user/role.ts
Normal file
@ -0,0 +1,19 @@
|
||||
import request from '@/utils/request';
|
||||
import type { PageResult } from '../typing';
|
||||
import type { Permission, Role } from '@/store/modules/user/typing';
|
||||
|
||||
export async function getRoles() {
|
||||
return request.get<any, PageResult<Role>>('/roles');
|
||||
}
|
||||
|
||||
export async function getPermissions(): Promise<PageResult<Permission>> {
|
||||
return request.get<any, PageResult<Permission>>('/permissions');
|
||||
}
|
||||
|
||||
export async function addPermission(data: Permission) {
|
||||
return request.post<Permission, any>('/permission', data);
|
||||
}
|
||||
|
||||
export async function updatePermission(data: Permission) {
|
||||
return request.put<Permission, any>('/permission', data);
|
||||
}
|
98
packages/icpx-platform/src/app.less
Normal file
@ -0,0 +1,98 @@
|
||||
@import './components/header-dropdown.less';
|
||||
@import './components/table/pro-table.less';
|
||||
body {
|
||||
overflow: hidden;
|
||||
}
|
||||
#app {
|
||||
height: 100%;
|
||||
overflow-x: hidden;
|
||||
}
|
||||
.slide-fadein-up-enter-active,
|
||||
.slide-fadein-up-leave-active {
|
||||
transition: opacity 0.3s, transform 0.4s;
|
||||
}
|
||||
|
||||
.slide-fadein-up-enter-from {
|
||||
transform: translateY(20px);
|
||||
opacity: 0;
|
||||
}
|
||||
|
||||
.slide-fadein-up-leave-to {
|
||||
transform: translateY(-20px);
|
||||
opacity: 0;
|
||||
}
|
||||
|
||||
.slide-fadein-right-enter-active,
|
||||
.slide-fadein-right-leave-active {
|
||||
transition: opacity 0.3s, transform 0.4s, -webkit-transform 0.4s;
|
||||
}
|
||||
|
||||
.slide-fadein-right-enter-from {
|
||||
transform: translateX(-20px);
|
||||
opacity: 0;
|
||||
}
|
||||
|
||||
.slide-fadein-right-leave-to {
|
||||
transform: translateX(20px);
|
||||
opacity: 0;
|
||||
}
|
||||
|
||||
.zoom-fadein-enter-active,
|
||||
.zoom-fadein-leave-active {
|
||||
transition: transform 0.3s, opacity 0.3s ease-in-out;
|
||||
}
|
||||
|
||||
.zoom-fadein-enter-from {
|
||||
transform: scale(0.99);
|
||||
opacity: 0;
|
||||
}
|
||||
|
||||
.zoom-fadein-leave-to {
|
||||
transform: scale(1.01);
|
||||
opacity: 0;
|
||||
}
|
||||
|
||||
.fadein-enter-active,
|
||||
.fadein-leave-active {
|
||||
transition: opacity 0.3s ease-in-out !important;
|
||||
}
|
||||
|
||||
.fadein-enter-from,
|
||||
.fadein-leave-to {
|
||||
opacity: 0 !important;
|
||||
}
|
||||
|
||||
@media (max-width: 480px) {
|
||||
.pro-components-header-dropdown-index-container {
|
||||
width: 100% !important;
|
||||
}
|
||||
.ant-table {
|
||||
width: 100%;
|
||||
overflow-x: auto;
|
||||
}
|
||||
|
||||
.ant-table-tbody > tr > td,
|
||||
.ant-table-tbody > tr > th,
|
||||
.ant-table-thead > tr > td,
|
||||
.ant-table-thead > tr > th {
|
||||
white-space: pre;
|
||||
}
|
||||
|
||||
.ant-table-tbody > tr > td > span,
|
||||
.ant-table-tbody > tr > th > span,
|
||||
.ant-table-thead > tr > td > span,
|
||||
.ant-table-thead > tr > th > span {
|
||||
display: block;
|
||||
}
|
||||
}
|
||||
|
||||
.pb10 {
|
||||
padding-bottom: 10px;
|
||||
}
|
||||
|
||||
[data-pro-theme='antdv-pro-theme-dark'] {
|
||||
&,
|
||||
* {
|
||||
color-scheme: dark !important;
|
||||
}
|
||||
}
|
16
packages/icpx-platform/src/assets/ICP/icp-icon_top_tcl.svg
Normal file
@ -0,0 +1,16 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg width="92px" height="53px" viewBox="0 0 92 53" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||
<title>logo-2</title>
|
||||
<g id="租户管理" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
|
||||
<g id="ICON" transform="translate(-58.000000, -2017.000000)">
|
||||
<g id="logo-2" transform="translate(58.000000, 2017.000000)">
|
||||
<rect id="矩形" opacity="0" x="0" y="0" width="92" height="52.5714286"></rect>
|
||||
<g id="编组-8" transform="translate(8.761905, 14.238095)" fill="#E64C3D" fill-rule="nonzero">
|
||||
<polygon id="Fill-1" points="0 1.20000879 0 7.51157367 8.4458982 7.51157367 8.4458982 23.1495106 16.0030346 23.1495106 16.0030346 7.51157367 24.435628 7.51157367 24.435628 1.20000879"></polygon>
|
||||
<path d="M39.2361731,18.6266121 C37.4812677,18.6266121 36.1654212,18.1094736 35.0438251,17.031185 C33.958152,15.9859051 33.1638544,14.364346 33.1638544,12.1830119 L33.1638544,11.847422 C33.1638544,9.67021414 33.958152,8.03765202 35.0438251,6.99099679 C36.1654212,5.91133272 37.4919115,5.40932331 39.2401646,5.40932331 C43.3553447,5.40932331 44.2347932,7.93725014 44.5008895,9.59731961 L51.1998651,9.59731961 C51.0402073,6.26617773 49.498179,3.91429802 47.3268328,2.34225212 C45.1701218,0.793587478 42.6475284,3.32996287e-23 39.3133411,3.32996287e-23 C35.2127963,3.32996287e-23 32.2830755,0.943502616 29.8961912,3.04231456 C27.4813668,5.18101218 26.1934605,8.55891659 26.1934605,11.9285687 L26.1934605,12.1032406 C26.1934605,15.7851013 27.3150566,18.5592191 29.7870917,20.8767146 C32.1034605,23.0470457 35.4762317,24.0400615 39.2241988,24.0346054 C42.5543946,24.0346054 45.408278,23.2230928 47.3813825,21.6840558 C49.5580506,19.9882267 51.0495207,17.5992121 51.2264748,14.4537449 L44.5421344,14.4537449 C44.355867,15.7795999 43.554917,18.6266121 39.2361731,18.6266121" id="Fill-2"></path>
|
||||
<polygon id="Fill-5" points="62.5448831 17.1336499 62.5448831 1.20551027 55.2671478 1.20551027 55.2671478 23.1481352 74.4620082 23.1481352 74.4620082 17.1336499"></polygon>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 2.2 KiB |
13
packages/icpx-platform/src/assets/PLM 2.svg
Normal file
@ -0,0 +1,13 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg width="32px" height="24px" viewBox="0 0 32 24" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||
<title>PLM 2</title>
|
||||
<g id="租户管理" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" font-family="Impact" font-size="20" font-style="condensed" font-weight="700">
|
||||
<g id="ICON" transform="translate(-232.000000, -485.000000)" fill="#FFFFFF">
|
||||
<g id="PLM-2" transform="translate(232.000000, 485.000000)">
|
||||
<text id="PLM">
|
||||
<tspan x="0" y="20">PLM</tspan>
|
||||
</text>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 686 B |
BIN
packages/icpx-platform/src/assets/a1.png
Normal file
After Width: | Height: | Size: 9.1 KiB |
BIN
packages/icpx-platform/src/assets/a2.png
Normal file
After Width: | Height: | Size: 8.6 KiB |
BIN
packages/icpx-platform/src/assets/b1.png
Normal file
After Width: | Height: | Size: 8.8 KiB |
BIN
packages/icpx-platform/src/assets/b2.png
Normal file
After Width: | Height: | Size: 8.2 KiB |
69
packages/icpx-platform/src/assets/background copy.svg
Normal file
@ -0,0 +1,69 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg width="1361px" height="609px" viewBox="0 0 1361 609" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||
<!-- Generator: Sketch 46.2 (44496) - http://www.bohemiancoding.com/sketch -->
|
||||
<title>Group 21</title>
|
||||
<desc>Created with Sketch.</desc>
|
||||
<defs></defs>
|
||||
<g id="Ant-Design-Pro-3.0" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
|
||||
<g id="账户密码登录-校验" transform="translate(-79.000000, -82.000000)">
|
||||
<g id="Group-21" transform="translate(77.000000, 73.000000)">
|
||||
<g id="Group-18" opacity="0.8" transform="translate(74.901416, 569.699158) rotate(-7.000000) translate(-74.901416, -569.699158) translate(4.901416, 525.199158)">
|
||||
<ellipse id="Oval-11" fill="#CFDAE6" opacity="0.25" cx="63.5748792" cy="32.468367" rx="21.7830479" ry="21.766008"></ellipse>
|
||||
<ellipse id="Oval-3" fill="#CFDAE6" opacity="0.599999964" cx="5.98746479" cy="13.8668601" rx="5.2173913" ry="5.21330997"></ellipse>
|
||||
<path d="M38.1354514,88.3520215 C43.8984227,88.3520215 48.570234,83.6838647 48.570234,77.9254015 C48.570234,72.1669383 43.8984227,67.4987816 38.1354514,67.4987816 C32.3724801,67.4987816 27.7006688,72.1669383 27.7006688,77.9254015 C27.7006688,83.6838647 32.3724801,88.3520215 38.1354514,88.3520215 Z" id="Oval-3-Copy" fill="#CFDAE6" opacity="0.45"></path>
|
||||
<path d="M64.2775582,33.1704963 L119.185836,16.5654915" id="Path-12" stroke="#CFDAE6" stroke-width="1.73913043" stroke-linecap="round" stroke-linejoin="round"></path>
|
||||
<path d="M42.1431708,26.5002681 L7.71190162,14.5640702" id="Path-16" stroke="#E0B4B7" stroke-width="0.702678964" opacity="0.7" stroke-linecap="round" stroke-linejoin="round" stroke-dasharray="1.405357899873153,2.108036953469981"></path>
|
||||
<path d="M63.9262187,33.521561 L43.6721326,69.3250951" id="Path-15" stroke="#BACAD9" stroke-width="0.702678964" stroke-linecap="round" stroke-linejoin="round" stroke-dasharray="1.405357899873153,2.108036953469981"></path>
|
||||
<g id="Group-17" transform="translate(126.850922, 13.543654) rotate(30.000000) translate(-126.850922, -13.543654) translate(117.285705, 4.381889)" fill="#CFDAE6">
|
||||
<ellipse id="Oval-4" opacity="0.45" cx="9.13482653" cy="9.12768076" rx="9.13482653" ry="9.12768076"></ellipse>
|
||||
<path d="M18.2696531,18.2553615 C18.2696531,13.2142826 14.1798519,9.12768076 9.13482653,9.12768076 C4.08980114,9.12768076 0,13.2142826 0,18.2553615 L18.2696531,18.2553615 Z" id="Oval-4" transform="translate(9.134827, 13.691521) scale(-1, -1) translate(-9.134827, -13.691521) "></path>
|
||||
</g>
|
||||
</g>
|
||||
<g id="Group-14" transform="translate(216.294700, 123.725600) rotate(-5.000000) translate(-216.294700, -123.725600) translate(106.294700, 35.225600)">
|
||||
<ellipse id="Oval-2" fill="#CFDAE6" opacity="0.25" cx="29.1176471" cy="29.1402439" rx="29.1176471" ry="29.1402439"></ellipse>
|
||||
<ellipse id="Oval-2" fill="#CFDAE6" opacity="0.3" cx="29.1176471" cy="29.1402439" rx="21.5686275" ry="21.5853659"></ellipse>
|
||||
<ellipse id="Oval-2-Copy" stroke="#CFDAE6" opacity="0.4" cx="179.019608" cy="138.146341" rx="23.7254902" ry="23.7439024"></ellipse>
|
||||
<ellipse id="Oval-2" fill="#BACAD9" opacity="0.5" cx="29.1176471" cy="29.1402439" rx="10.7843137" ry="10.7926829"></ellipse>
|
||||
<path d="M29.1176471,39.9329268 L29.1176471,18.347561 C23.1616351,18.347561 18.3333333,23.1796097 18.3333333,29.1402439 C18.3333333,35.1008781 23.1616351,39.9329268 29.1176471,39.9329268 Z" id="Oval-2" fill="#BACAD9"></path>
|
||||
<g id="Group-9" opacity="0.45" transform="translate(172.000000, 131.000000)" fill="#E6A1A6">
|
||||
<ellipse id="Oval-2-Copy-2" cx="7.01960784" cy="7.14634146" rx="6.47058824" ry="6.47560976"></ellipse>
|
||||
<path d="M0.549019608,13.6219512 C4.12262681,13.6219512 7.01960784,10.722722 7.01960784,7.14634146 C7.01960784,3.56996095 4.12262681,0.670731707 0.549019608,0.670731707 L0.549019608,13.6219512 Z" id="Oval-2-Copy-2" transform="translate(3.784314, 7.146341) scale(-1, 1) translate(-3.784314, -7.146341) "></path>
|
||||
</g>
|
||||
<ellipse id="Oval-10" fill="#CFDAE6" cx="218.382353" cy="138.685976" rx="1.61764706" ry="1.61890244"></ellipse>
|
||||
<ellipse id="Oval-10-Copy-2" fill="#E0B4B7" opacity="0.35" cx="179.558824" cy="175.381098" rx="1.61764706" ry="1.61890244"></ellipse>
|
||||
<ellipse id="Oval-10-Copy" fill="#E0B4B7" opacity="0.35" cx="180.098039" cy="102.530488" rx="2.15686275" ry="2.15853659"></ellipse>
|
||||
<path d="M28.9985381,29.9671598 L171.151018,132.876024" id="Path-11" stroke="#CFDAE6" opacity="0.8"></path>
|
||||
</g>
|
||||
<g id="Group-10" opacity="0.799999952" transform="translate(1054.100635, 36.659317) rotate(-11.000000) translate(-1054.100635, -36.659317) translate(1026.600635, 4.659317)">
|
||||
<ellipse id="Oval-7" stroke="#CFDAE6" stroke-width="0.941176471" cx="43.8135593" cy="32" rx="11.1864407" ry="11.2941176"></ellipse>
|
||||
<g id="Group-12" transform="translate(34.596774, 23.111111)" fill="#BACAD9">
|
||||
<ellipse id="Oval-7" opacity="0.45" cx="9.18534718" cy="8.88888889" rx="8.47457627" ry="8.55614973"></ellipse>
|
||||
<path d="M9.18534718,17.4450386 C13.8657264,17.4450386 17.6599235,13.6143199 17.6599235,8.88888889 C17.6599235,4.16345787 13.8657264,0.332739156 9.18534718,0.332739156 L9.18534718,17.4450386 Z" id="Oval-7"></path>
|
||||
</g>
|
||||
<path d="M34.6597385,24.809694 L5.71666084,4.76878945" id="Path-2" stroke="#CFDAE6" stroke-width="0.941176471"></path>
|
||||
<ellipse id="Oval" stroke="#CFDAE6" stroke-width="0.941176471" cx="3.26271186" cy="3.29411765" rx="3.26271186" ry="3.29411765"></ellipse>
|
||||
<ellipse id="Oval-Copy" fill="#F7E1AD" cx="2.79661017" cy="61.1764706" rx="2.79661017" ry="2.82352941"></ellipse>
|
||||
<path d="M34.6312443,39.2922712 L5.06366663,59.785082" id="Path-10" stroke="#CFDAE6" stroke-width="0.941176471"></path>
|
||||
</g>
|
||||
<g id="Group-19" opacity="0.33" transform="translate(1282.537219, 446.502867) rotate(-10.000000) translate(-1282.537219, -446.502867) translate(1142.537219, 327.502867)">
|
||||
<g id="Group-17" transform="translate(141.333539, 104.502742) rotate(275.000000) translate(-141.333539, -104.502742) translate(129.333539, 92.502742)" fill="#BACAD9">
|
||||
<circle id="Oval-4" opacity="0.45" cx="11.6666667" cy="11.6666667" r="11.6666667"></circle>
|
||||
<path d="M23.3333333,23.3333333 C23.3333333,16.8900113 18.1099887,11.6666667 11.6666667,11.6666667 C5.22334459,11.6666667 0,16.8900113 0,23.3333333 L23.3333333,23.3333333 Z" id="Oval-4" transform="translate(11.666667, 17.500000) scale(-1, -1) translate(-11.666667, -17.500000) "></path>
|
||||
</g>
|
||||
<circle id="Oval-5-Copy-6" fill="#CFDAE6" cx="201.833333" cy="87.5" r="5.83333333"></circle>
|
||||
<path d="M143.5,88.8126685 L155.070501,17.6038544" id="Path-17" stroke="#BACAD9" stroke-width="1.16666667"></path>
|
||||
<path d="M17.5,37.3333333 L127.466252,97.6449735" id="Path-18" stroke="#BACAD9" stroke-width="1.16666667"></path>
|
||||
<polyline id="Path-19" stroke="#CFDAE6" stroke-width="1.16666667" points="143.902597 120.302281 174.935455 231.571342 38.5 147.510847 126.366941 110.833333"></polyline>
|
||||
<path d="M159.833333,99.7453842 L195.416667,89.25" id="Path-20" stroke="#E0B4B7" stroke-width="1.16666667" opacity="0.6"></path>
|
||||
<path d="M205.333333,82.1372105 L238.719406,36.1666667" id="Path-24" stroke="#BACAD9" stroke-width="1.16666667"></path>
|
||||
<path d="M266.723424,132.231988 L207.083333,90.4166667" id="Path-25" stroke="#CFDAE6" stroke-width="1.16666667"></path>
|
||||
<circle id="Oval-5" fill="#C1D1E0" cx="156.916667" cy="8.75" r="8.75"></circle>
|
||||
<circle id="Oval-5-Copy-3" fill="#C1D1E0" cx="39.0833333" cy="148.75" r="5.25"></circle>
|
||||
<circle id="Oval-5-Copy-2" fill-opacity="0.6" fill="#D1DEED" cx="8.75" cy="33.25" r="8.75"></circle>
|
||||
<circle id="Oval-5-Copy-4" fill-opacity="0.6" fill="#D1DEED" cx="243.833333" cy="30.3333333" r="5.83333333"></circle>
|
||||
<circle id="Oval-5-Copy-5" fill="#E0B4B7" cx="175.583333" cy="232.75" r="5.25"></circle>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 8.7 KiB |
69
packages/icpx-platform/src/assets/background.svg
Normal file
@ -0,0 +1,69 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg width="1361px" height="609px" viewBox="0 0 1361 609" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||
<!-- Generator: Sketch 46.2 (44496) - http://www.bohemiancoding.com/sketch -->
|
||||
<title>Group 21</title>
|
||||
<desc>Created with Sketch.</desc>
|
||||
<defs></defs>
|
||||
<g id="Ant-Design-Pro-3.0" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
|
||||
<g id="账户密码登录-校验" transform="translate(-79.000000, -82.000000)">
|
||||
<g id="Group-21" transform="translate(77.000000, 73.000000)">
|
||||
<g id="Group-18" opacity="0.8" transform="translate(74.901416, 569.699158) rotate(-7.000000) translate(-74.901416, -569.699158) translate(4.901416, 525.199158)">
|
||||
<ellipse id="Oval-11" fill="#CFDAE6" opacity="0.25" cx="63.5748792" cy="32.468367" rx="21.7830479" ry="21.766008"></ellipse>
|
||||
<ellipse id="Oval-3" fill="#CFDAE6" opacity="0.599999964" cx="5.98746479" cy="13.8668601" rx="5.2173913" ry="5.21330997"></ellipse>
|
||||
<path d="M38.1354514,88.3520215 C43.8984227,88.3520215 48.570234,83.6838647 48.570234,77.9254015 C48.570234,72.1669383 43.8984227,67.4987816 38.1354514,67.4987816 C32.3724801,67.4987816 27.7006688,72.1669383 27.7006688,77.9254015 C27.7006688,83.6838647 32.3724801,88.3520215 38.1354514,88.3520215 Z" id="Oval-3-Copy" fill="#CFDAE6" opacity="0.45"></path>
|
||||
<path d="M64.2775582,33.1704963 L119.185836,16.5654915" id="Path-12" stroke="#CFDAE6" stroke-width="1.73913043" stroke-linecap="round" stroke-linejoin="round"></path>
|
||||
<path d="M42.1431708,26.5002681 L7.71190162,14.5640702" id="Path-16" stroke="#E0B4B7" stroke-width="0.702678964" opacity="0.7" stroke-linecap="round" stroke-linejoin="round" stroke-dasharray="1.405357899873153,2.108036953469981"></path>
|
||||
<path d="M63.9262187,33.521561 L43.6721326,69.3250951" id="Path-15" stroke="#BACAD9" stroke-width="0.702678964" stroke-linecap="round" stroke-linejoin="round" stroke-dasharray="1.405357899873153,2.108036953469981"></path>
|
||||
<g id="Group-17" transform="translate(126.850922, 13.543654) rotate(30.000000) translate(-126.850922, -13.543654) translate(117.285705, 4.381889)" fill="#CFDAE6">
|
||||
<ellipse id="Oval-4" opacity="0.45" cx="9.13482653" cy="9.12768076" rx="9.13482653" ry="9.12768076"></ellipse>
|
||||
<path d="M18.2696531,18.2553615 C18.2696531,13.2142826 14.1798519,9.12768076 9.13482653,9.12768076 C4.08980114,9.12768076 0,13.2142826 0,18.2553615 L18.2696531,18.2553615 Z" id="Oval-4" transform="translate(9.134827, 13.691521) scale(-1, -1) translate(-9.134827, -13.691521) "></path>
|
||||
</g>
|
||||
</g>
|
||||
<g id="Group-14" transform="translate(216.294700, 123.725600) rotate(-5.000000) translate(-216.294700, -123.725600) translate(106.294700, 35.225600)">
|
||||
<ellipse id="Oval-2" fill="#CFDAE6" opacity="0.25" cx="29.1176471" cy="29.1402439" rx="29.1176471" ry="29.1402439"></ellipse>
|
||||
<ellipse id="Oval-2" fill="#CFDAE6" opacity="0.3" cx="29.1176471" cy="29.1402439" rx="21.5686275" ry="21.5853659"></ellipse>
|
||||
<ellipse id="Oval-2-Copy" stroke="#CFDAE6" opacity="0.4" cx="179.019608" cy="138.146341" rx="23.7254902" ry="23.7439024"></ellipse>
|
||||
<ellipse id="Oval-2" fill="#BACAD9" opacity="0.5" cx="29.1176471" cy="29.1402439" rx="10.7843137" ry="10.7926829"></ellipse>
|
||||
<path d="M29.1176471,39.9329268 L29.1176471,18.347561 C23.1616351,18.347561 18.3333333,23.1796097 18.3333333,29.1402439 C18.3333333,35.1008781 23.1616351,39.9329268 29.1176471,39.9329268 Z" id="Oval-2" fill="#BACAD9"></path>
|
||||
<g id="Group-9" opacity="0.45" transform="translate(172.000000, 131.000000)" fill="#E6A1A6">
|
||||
<ellipse id="Oval-2-Copy-2" cx="7.01960784" cy="7.14634146" rx="6.47058824" ry="6.47560976"></ellipse>
|
||||
<path d="M0.549019608,13.6219512 C4.12262681,13.6219512 7.01960784,10.722722 7.01960784,7.14634146 C7.01960784,3.56996095 4.12262681,0.670731707 0.549019608,0.670731707 L0.549019608,13.6219512 Z" id="Oval-2-Copy-2" transform="translate(3.784314, 7.146341) scale(-1, 1) translate(-3.784314, -7.146341) "></path>
|
||||
</g>
|
||||
<ellipse id="Oval-10" fill="#CFDAE6" cx="218.382353" cy="138.685976" rx="1.61764706" ry="1.61890244"></ellipse>
|
||||
<ellipse id="Oval-10-Copy-2" fill="#E0B4B7" opacity="0.35" cx="179.558824" cy="175.381098" rx="1.61764706" ry="1.61890244"></ellipse>
|
||||
<ellipse id="Oval-10-Copy" fill="#E0B4B7" opacity="0.35" cx="180.098039" cy="102.530488" rx="2.15686275" ry="2.15853659"></ellipse>
|
||||
<path d="M28.9985381,29.9671598 L171.151018,132.876024" id="Path-11" stroke="#CFDAE6" opacity="0.8"></path>
|
||||
</g>
|
||||
<g id="Group-10" opacity="0.799999952" transform="translate(1054.100635, 36.659317) rotate(-11.000000) translate(-1054.100635, -36.659317) translate(1026.600635, 4.659317)">
|
||||
<ellipse id="Oval-7" stroke="#CFDAE6" stroke-width="0.941176471" cx="43.8135593" cy="32" rx="11.1864407" ry="11.2941176"></ellipse>
|
||||
<g id="Group-12" transform="translate(34.596774, 23.111111)" fill="#BACAD9">
|
||||
<ellipse id="Oval-7" opacity="0.45" cx="9.18534718" cy="8.88888889" rx="8.47457627" ry="8.55614973"></ellipse>
|
||||
<path d="M9.18534718,17.4450386 C13.8657264,17.4450386 17.6599235,13.6143199 17.6599235,8.88888889 C17.6599235,4.16345787 13.8657264,0.332739156 9.18534718,0.332739156 L9.18534718,17.4450386 Z" id="Oval-7"></path>
|
||||
</g>
|
||||
<path d="M34.6597385,24.809694 L5.71666084,4.76878945" id="Path-2" stroke="#CFDAE6" stroke-width="0.941176471"></path>
|
||||
<ellipse id="Oval" stroke="#CFDAE6" stroke-width="0.941176471" cx="3.26271186" cy="3.29411765" rx="3.26271186" ry="3.29411765"></ellipse>
|
||||
<ellipse id="Oval-Copy" fill="#F7E1AD" cx="2.79661017" cy="61.1764706" rx="2.79661017" ry="2.82352941"></ellipse>
|
||||
<path d="M34.6312443,39.2922712 L5.06366663,59.785082" id="Path-10" stroke="#CFDAE6" stroke-width="0.941176471"></path>
|
||||
</g>
|
||||
<g id="Group-19" opacity="0.33" transform="translate(1282.537219, 446.502867) rotate(-10.000000) translate(-1282.537219, -446.502867) translate(1142.537219, 327.502867)">
|
||||
<g id="Group-17" transform="translate(141.333539, 104.502742) rotate(275.000000) translate(-141.333539, -104.502742) translate(129.333539, 92.502742)" fill="#BACAD9">
|
||||
<circle id="Oval-4" opacity="0.45" cx="11.6666667" cy="11.6666667" r="11.6666667"></circle>
|
||||
<path d="M23.3333333,23.3333333 C23.3333333,16.8900113 18.1099887,11.6666667 11.6666667,11.6666667 C5.22334459,11.6666667 0,16.8900113 0,23.3333333 L23.3333333,23.3333333 Z" id="Oval-4" transform="translate(11.666667, 17.500000) scale(-1, -1) translate(-11.666667, -17.500000) "></path>
|
||||
</g>
|
||||
<circle id="Oval-5-Copy-6" fill="#CFDAE6" cx="201.833333" cy="87.5" r="5.83333333"></circle>
|
||||
<path d="M143.5,88.8126685 L155.070501,17.6038544" id="Path-17" stroke="#BACAD9" stroke-width="1.16666667"></path>
|
||||
<path d="M17.5,37.3333333 L127.466252,97.6449735" id="Path-18" stroke="#BACAD9" stroke-width="1.16666667"></path>
|
||||
<polyline id="Path-19" stroke="#CFDAE6" stroke-width="1.16666667" points="143.902597 120.302281 174.935455 231.571342 38.5 147.510847 126.366941 110.833333"></polyline>
|
||||
<path d="M159.833333,99.7453842 L195.416667,89.25" id="Path-20" stroke="#E0B4B7" stroke-width="1.16666667" opacity="0.6"></path>
|
||||
<path d="M205.333333,82.1372105 L238.719406,36.1666667" id="Path-24" stroke="#BACAD9" stroke-width="1.16666667"></path>
|
||||
<path d="M266.723424,132.231988 L207.083333,90.4166667" id="Path-25" stroke="#CFDAE6" stroke-width="1.16666667"></path>
|
||||
<circle id="Oval-5" fill="#C1D1E0" cx="156.916667" cy="8.75" r="8.75"></circle>
|
||||
<circle id="Oval-5-Copy-3" fill="#C1D1E0" cx="39.0833333" cy="148.75" r="5.25"></circle>
|
||||
<circle id="Oval-5-Copy-2" fill-opacity="0.6" fill="#D1DEED" cx="8.75" cy="33.25" r="8.75"></circle>
|
||||
<circle id="Oval-5-Copy-4" fill-opacity="0.6" fill="#D1DEED" cx="243.833333" cy="30.3333333" r="5.83333333"></circle>
|
||||
<circle id="Oval-5-Copy-5" fill="#E0B4B7" cx="175.583333" cy="232.75" r="5.25"></circle>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 8.7 KiB |
BIN
packages/icpx-platform/src/assets/bottom-menu2x.png
Normal file
After Width: | Height: | Size: 120 KiB |
BIN
packages/icpx-platform/src/assets/c1.png
Normal file
After Width: | Height: | Size: 9.3 KiB |
BIN
packages/icpx-platform/src/assets/c2.png
Normal file
After Width: | Height: | Size: 8.7 KiB |
BIN
packages/icpx-platform/src/assets/d1.png
Normal file
After Width: | Height: | Size: 8.4 KiB |
BIN
packages/icpx-platform/src/assets/d2.png
Normal file
After Width: | Height: | Size: 7.8 KiB |
BIN
packages/icpx-platform/src/assets/icon-delete-warning.png
Normal file
After Width: | Height: | Size: 527 B |
24
packages/icpx-platform/src/assets/icon-nav-home.svg
Normal file
@ -0,0 +1,24 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg width="16px" height="16px" viewBox="0 0 16 16" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||
<title>3</title>
|
||||
<defs>
|
||||
<linearGradient x1="100%" y1="22.9627705%" x2="1.11022302e-14%" y2="77.0372295%" id="linearGradient-1">
|
||||
<stop stop-color="#F55448" offset="0.0799005682%"></stop>
|
||||
<stop stop-color="#FF8076" stop-opacity="0.555780157" offset="100%"></stop>
|
||||
</linearGradient>
|
||||
<linearGradient x1="100%" y1="39.2821771%" x2="1.11022302e-14%" y2="60.7178229%" id="linearGradient-2">
|
||||
<stop stop-color="#F55448" offset="0.0799005682%"></stop>
|
||||
<stop stop-color="#FF8076" stop-opacity="0.555780157" offset="100%"></stop>
|
||||
</linearGradient>
|
||||
</defs>
|
||||
<g id="页面-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
|
||||
<g id="切图组件" transform="translate(-297.000000, -327.000000)">
|
||||
<g id="UI-icon/zhgl/Normal" transform="translate(297.000000, 327.000000)">
|
||||
<rect id="矩形" x="0" y="0" width="16" height="16"></rect>
|
||||
<path d="M1.85,14.1666584 L1.85,6.13218299 C1.85,5.95185896 1.94709687,5.78550472 2.10410813,5.6968243 L7.77077907,2.49627191 C7.92337826,2.41008344 8.10996396,2.4100835 8.26256309,2.49627207 L13.9292251,5.69682424 C14.0862363,5.78550471 14.183333,5.95185886 14.183333,6.13218277 L14.183333,14.1666584 C14.183333,14.4428007 13.9594754,14.6666584 13.683333,14.6666584 L2.35,14.6666584 C2.07385763,14.6666584 1.85,14.4428007 1.85,14.1666584 Z" id="0BAE8FC9-327C-402C-AD45-7C27CADE7DA5" stroke="#FFFFFF" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"></path>
|
||||
<path d="M5.16167828,9.15621756 L6.56140429,9.15621756 C7.11368904,9.15621756 7.56140429,9.60393281 7.56140429,10.1562176 L7.56140429,10.6562176 C7.56140429,11.2085023 7.11368904,11.6562176 6.56140429,11.6562176 L5.16167828,11.6562176 C4.60939353,11.6562176 4.16167828,11.2085023 4.16167828,10.6562176 L4.16167828,10.1562176 C4.16167828,9.60393281 4.60939353,9.15621756 5.16167828,9.15621756 Z" id="矩形备份-4" fill="url(#linearGradient-1)" transform="translate(5.861541, 10.406218) rotate(-90.000000) translate(-5.861541, -10.406218) "></path>
|
||||
<path d="M8.41167828,8.15621756 L11.8114043,8.15621756 C12.363689,8.15621756 12.8114043,8.60393281 12.8114043,9.15621756 L12.8114043,9.65621756 C12.8114043,10.2085023 12.363689,10.6562176 11.8114043,10.6562176 L8.41167828,10.6562176 C7.85939353,10.6562176 7.41167828,10.2085023 7.41167828,9.65621756 L7.41167828,9.15621756 C7.41167828,8.60393281 7.85939353,8.15621756 8.41167828,8.15621756 Z" id="矩形备份-6" fill="url(#linearGradient-2)" transform="translate(10.111541, 9.406218) rotate(-90.000000) translate(-10.111541, -9.406218) "></path>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 2.8 KiB |
BIN
packages/icpx-platform/src/assets/login-localhost.png
Normal file
After Width: | Height: | Size: 425 B |
BIN
packages/icpx-platform/src/assets/login-password.png
Normal file
After Width: | Height: | Size: 456 B |
12
packages/icpx-platform/src/assets/login-top-logo-square.svg
Normal file
After Width: | Height: | Size: 64 KiB |
BIN
packages/icpx-platform/src/assets/login-top-logo.png
Normal file
After Width: | Height: | Size: 880 B |
BIN
packages/icpx-platform/src/assets/login-user.png
Normal file
After Width: | Height: | Size: 358 B |
BIN
packages/icpx-platform/src/assets/login_bg.png
Normal file
After Width: | Height: | Size: 265 KiB |
BIN
packages/icpx-platform/src/assets/logo copy.png
Normal file
After Width: | Height: | Size: 880 B |
29
packages/icpx-platform/src/assets/logo copy.svg
Normal file
@ -0,0 +1,29 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg width="128px" height="128px" viewBox="0 0 128 128" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||
<!-- Generator: Sketch 52.6 (67491) - http://www.bohemiancoding.com/sketch -->
|
||||
<title>Vue</title>
|
||||
<desc>Created with Sketch.</desc>
|
||||
<defs>
|
||||
<linearGradient x1="69.644116%" y1="0%" x2="69.644116%" y2="100%" id="linearGradient-1">
|
||||
<stop stop-color="#29CDFF" offset="0%"></stop>
|
||||
<stop stop-color="#148EFF" offset="37.8600687%"></stop>
|
||||
<stop stop-color="#0A60FF" offset="100%"></stop>
|
||||
</linearGradient>
|
||||
<linearGradient x1="-19.8191553%" y1="-36.7931464%" x2="138.57919%" y2="157.637507%" id="linearGradient-2">
|
||||
<stop stop-color="#29CDFF" offset="0%"></stop>
|
||||
<stop stop-color="#0F78FF" offset="100%"></stop>
|
||||
</linearGradient>
|
||||
<linearGradient x1="68.1279872%" y1="-35.6905737%" x2="30.4400914%" y2="114.942679%" id="linearGradient-3">
|
||||
<stop stop-color="#FA8E7D" offset="0%"></stop>
|
||||
<stop stop-color="#F74A5C" offset="51.2635191%"></stop>
|
||||
<stop stop-color="#F51D2C" offset="100%"></stop>
|
||||
</linearGradient>
|
||||
</defs>
|
||||
<g id="Vue" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
|
||||
<g id="Group" transform="translate(19.000000, 9.000000)">
|
||||
<path d="M89.96,90.48 C78.58,93.48 68.33,83.36 67.62,82.48 L46.6604487,62.2292258 C45.5023849,61.1103236 44.8426845,59.5728835 44.8296987,57.9626396 L44.5035564,17.5209948 C44.4948861,16.4458744 44.0537714,15.4195095 43.2796864,14.6733517 L29.6459999,1.53153737 C28.055475,-0.00160504005 25.5232423,0.0449126588 23.9900999,1.63543756 C23.2715121,2.38092066 22.87,3.37600834 22.87,4.41143746 L22.87,64.3864751 C22.87,67.0807891 23.9572233,69.6611067 25.885409,71.5429748 L63.6004615,108.352061 C65.9466323,110.641873 69.6963584,110.624605 72.0213403,108.313281" id="Path-Copy" fill="url(#linearGradient-1)" fill-rule="nonzero" transform="translate(56.415000, 54.831157) scale(-1, 1) translate(-56.415000, -54.831157) "></path>
|
||||
<path d="M68,90.1163122 C56.62,93.1163122 45.46,83.36 44.75,82.48 L23.7904487,62.2292258 C22.6323849,61.1103236 21.9726845,59.5728835 21.9596987,57.9626396 L21.6335564,17.5209948 C21.6248861,16.4458744 21.1837714,15.4195095 20.4096864,14.6733517 L6.7759999,1.53153737 C5.185475,-0.00160504005 2.65324232,0.0449126588 1.12009991,1.63543756 C0.401512125,2.38092066 3.90211878e-13,3.37600834 3.90798505e-13,4.41143746 L3.94351218e-13,64.3864751 C3.94681177e-13,67.0807891 1.08722326,69.6611067 3.01540903,71.5429748 L40.7807092,108.401101 C43.1069304,110.671444 46.8180151,110.676525 49.1504445,108.412561" id="Path" fill="url(#linearGradient-2)" fill-rule="nonzero"></path>
|
||||
<path d="M43.2983488,19.0991931 L27.5566079,3.88246244 C26.7624281,3.11476967 26.7409561,1.84862177 27.5086488,1.05444194 C27.8854826,0.664606611 28.4044438,0.444472651 28.9466386,0.444472651 L60.3925021,0.444472651 C61.4970716,0.444472651 62.3925021,1.33990315 62.3925021,2.44447265 C62.3925021,2.9858375 62.1730396,3.50407742 61.7842512,3.88079942 L46.0801285,19.0975301 C45.3051579,19.8484488 44.0742167,19.8491847 43.2983488,19.0991931 Z" id="Path" fill="url(#linearGradient-3)"></path>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 3.3 KiB |