fix: 初始化

This commit is contained in:
jiaojinfeng
2023-05-30 19:27:03 +08:00
commit 28db653900
4436 changed files with 500218 additions and 0 deletions

View File

@ -0,0 +1,5 @@
> 1%
last 2 versions
not dead
chrome > 40
not ie 11

View 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

View 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

View File

@ -0,0 +1,2 @@
NODE_ENV=production
IS_ANALYZ=true

View 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

View 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

View 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

View File

@ -0,0 +1,4 @@
module.exports = {
...require('./mock/index'),
// 这里可以引入任意的mock文件位置也随意。
};

View 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;"]

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

View 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 文件
},
],
],
};

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

View 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');

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

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

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

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

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

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

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

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

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

View File

@ -0,0 +1,5 @@
import request from '@/utils/request';
export async function queryTags(): Promise<any> {
return request.get('/tags');
}

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

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

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

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

View File

@ -0,0 +1,7 @@
import request from '@/utils/request';
export async function queryFakeList(params = {}): Promise<any> {
return request.get('/fake_list', {
params,
});
}

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

View File

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

View File

@ -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&currentNodeKeys=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;

View File

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

View File

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

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

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

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

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

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

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

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

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

View File

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

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

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

View File

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

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

View File

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

View File

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

View File

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

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

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

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

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

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

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

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

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

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

View 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

View 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

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.2 KiB

View 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

View 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

Binary file not shown.

After

Width:  |  Height:  |  Size: 120 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 527 B

View 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

Binary file not shown.

After

Width:  |  Height:  |  Size: 425 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 456 B

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 64 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 880 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 358 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 265 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 880 B

View 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

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