Browse Source

think webapp

pull/11/head
thinkenergy 4 years ago
parent
commit
1d2c286f46
100 changed files with 2518 additions and 1441 deletions
  1. +3
    -3
      webapp/.env.development
  2. +9
    -11
      webapp/.env.production
  3. +33
    -30
      webapp/README.md
  4. +1
    -0
      webapp/package.json
  5. BIN
      webapp/public/favicon.ico
  6. +23
    -13
      webapp/public/index.html
  7. +28
    -16
      webapp/src/App.vue
  8. +3
    -0
      webapp/src/api/auth.js
  9. +30
    -0
      webapp/src/api/preparation/dataset.js
  10. +9
    -0
      webapp/src/api/preparation/labelGroup.js
  11. BIN
      webapp/src/assets/images/dashboard/advantage-1.png
  12. BIN
      webapp/src/assets/images/dashboard/advantage-2.png
  13. BIN
      webapp/src/assets/images/dashboard/advantage-3.png
  14. BIN
      webapp/src/assets/images/dashboard/advantage-4.png
  15. BIN
      webapp/src/assets/images/dataset/tu1.png
  16. BIN
      webapp/src/assets/images/dataset/tu2.png
  17. BIN
      webapp/src/assets/images/login/background.jpg
  18. BIN
      webapp/src/assets/images/login/background.png
  19. BIN
      webapp/src/assets/images/login/login-logo.png
  20. BIN
      webapp/src/assets/images/login/out-background.png
  21. BIN
      webapp/src/assets/images/login/register.png
  22. BIN
      webapp/src/assets/images/menu-text.png
  23. BIN
      webapp/src/assets/images/weixin.png
  24. +2
    -0
      webapp/src/assets/styles/common.scss
  25. +1
    -1
      webapp/src/assets/styles/element-variables.scss
  26. +2
    -1
      webapp/src/assets/styles/sidebar.scss
  27. +9
    -9
      webapp/src/assets/styles/variables.scss
  28. +7
    -15
      webapp/src/components/InfoSelect/info-select.vue
  29. +7
    -15
      webapp/src/components/InlineTableEdit/index.vue
  30. +125
    -253
      webapp/src/components/LoginPublic/index.vue
  31. +7
    -15
      webapp/src/components/ProTable/header.vue
  32. +7
    -15
      webapp/src/components/ProTable/index.vue
  33. +69
    -0
      webapp/src/components/ScreenAdapter.vue
  34. +23
    -29
      webapp/src/components/Training/dataSourceSelector.vue
  35. +18
    -23
      webapp/src/components/Training/jobForm.vue
  36. +7
    -15
      webapp/src/components/Training/saveModelDialog.vue
  37. +15
    -3
      webapp/src/components/UploadForm/form.js
  38. +7
    -15
      webapp/src/components/editor/index.vue
  39. +33
    -0
      webapp/src/components/loginTitle.vue
  40. +72
    -0
      webapp/src/config/index.js
  41. +6
    -15
      webapp/src/layout/BaseLayout.vue
  42. +7
    -16
      webapp/src/layout/components/AppMain/index.vue
  43. +16
    -26
      webapp/src/layout/components/Feedback/index.vue
  44. +11
    -17
      webapp/src/layout/components/Guideline/index.vue
  45. +8
    -16
      webapp/src/layout/components/Sidebar/Logo.vue
  46. +6
    -15
      webapp/src/layout/components/Sidebar/index.vue
  47. +64
    -18
      webapp/src/layout/index.vue
  48. +1
    -0
      webapp/src/lib/api-map/index.js
  49. +7
    -1
      webapp/src/main.js
  50. +21
    -1
      webapp/src/router/index.js
  51. +2
    -2
      webapp/src/settings.js
  52. +1
    -0
      webapp/src/store/modules/user.js
  53. +8
    -0
      webapp/src/utils/locale/en.js
  54. +18
    -0
      webapp/src/utils/locale/index.js
  55. +8
    -0
      webapp/src/utils/locale/zh.js
  56. +2
    -2
      webapp/src/utils/utils.js
  57. +5
    -5
      webapp/src/utils/validate.js
  58. +225
    -0
      webapp/src/views/agreement.vue
  59. +28
    -22
      webapp/src/views/algorithm/components/algorithmForm.vue
  60. +14
    -16
      webapp/src/views/algorithm/index.vue
  61. +35
    -1
      webapp/src/views/algorithm/utils.js
  62. +14
    -22
      webapp/src/views/cloudServing/batch.vue
  63. +7
    -15
      webapp/src/views/cloudServing/components/forms/batchServingForm.vue
  64. +11
    -19
      webapp/src/views/cloudServing/index.vue
  65. +7
    -15
      webapp/src/views/dashboard/components/CardPanel.vue
  66. +26
    -26
      webapp/src/views/dashboard/components/Welcome.vue
  67. +85
    -75
      webapp/src/views/dashboard/dashboard.vue
  68. +10
    -17
      webapp/src/views/dataset/components/tenant/index.vue
  69. +5
    -1
      webapp/src/views/dataset/custom/index.vue
  70. +19
    -32
      webapp/src/views/dataset/entrance.vue
  71. +23
    -2
      webapp/src/views/dataset/list/action.js
  72. +81
    -67
      webapp/src/views/dataset/list/create-dataset.vue
  73. +60
    -58
      webapp/src/views/dataset/list/edit-dataset.vue
  74. +34
    -28
      webapp/src/views/dataset/list/import-dataset.vue
  75. +57
    -34
      webapp/src/views/dataset/list/index.vue
  76. +7
    -15
      webapp/src/views/dataset/list/publish.vue
  77. +2
    -1
      webapp/src/views/dataset/list/status.js
  78. +10
    -18
      webapp/src/views/dataset/medical/list.vue
  79. +2
    -0
      webapp/src/views/dataset/util/index.js
  80. +9
    -17
      webapp/src/views/dataset/version/actions.vue
  81. +9
    -17
      webapp/src/views/dataset/version/index.vue
  82. +15
    -21
      webapp/src/views/development/notebook.vue
  83. +9
    -16
      webapp/src/views/home/index.vue
  84. +26
    -21
      webapp/src/views/labelGroup/index.vue
  85. +9
    -1
      webapp/src/views/labelGroup/labelGroupAction.js
  86. +131
    -27
      webapp/src/views/labelGroup/labelGroupForm.vue
  87. +126
    -42
      webapp/src/views/login.vue
  88. +7
    -15
      webapp/src/views/model/components/addModelDialog.vue
  89. +11
    -17
      webapp/src/views/model/components/createModelForm.vue
  90. +11
    -19
      webapp/src/views/model/index.vue
  91. +577
    -0
      webapp/src/views/privacy.vue
  92. +8
    -17
      webapp/src/views/register.vue
  93. +18
    -20
      webapp/src/views/resetpassword.vue
  94. +7
    -15
      webapp/src/views/system/authCode/index.vue
  95. +7
    -15
      webapp/src/views/trainingJob/components/jobDetail.vue
  96. +8
    -15
      webapp/src/views/trainingJob/detail.vue
  97. +7
    -15
      webapp/src/views/trainingJob/index.vue
  98. +12
    -15
      webapp/src/views/trainingJob/jobList.vue
  99. +7
    -15
      webapp/src/views/trainingJob/jobParam.vue
  100. +1
    -1
      webapp/src/views/visual/Layout.vue

+ 3
- 3
webapp/.env.development View File

@@ -1,11 +1,11 @@
ENV = 'development'

# 默认BASE URL
VUE_APP_BASE_API = ''
VUE_APP_BASE_API = 'http://10.0.0.35:8800/'

# TODO: 目前后端连接位于 8960端口 k8s 服务,需要后端调整后再同步调整
# WebSocket 连接地址
VUE_APP_WS_API = 'ws://{HOST}:8960/ws'
VUE_APP_WS_API = 'ws://10.0.0.35:8960/ws'

# 数据管理
VUE_APP_DATA_API = ''
@@ -25,7 +25,7 @@ VUE_APP_DCM_API = 'http://{HOST}/dcm4chee/dcm4chee-arc/aets/DCM4CHEE_ADMIN'

# minIO 服务 IP
# 部署文档参考:http://docs.dubhe.ai/docs/setup/deploy-minio
VUE_APP_MINIO_ENDPOINT = ''
VUE_APP_MINIO_ENDPOINT = 'http://10.0.0.35:8800/minio'

# minIO 服务 端口
VUE_APP_MINIO_PORT = '9000'


+ 9
- 11
webapp/.env.production View File

@@ -1,31 +1,29 @@
ENV = 'production'

# 默认BASE URL, 后端服务地址
VUE_APP_BASE_API = ''

# TODO: 目前后端连接位于 8960端口 k8s 服务,需要后端调整后再同步调整
# WebSocket 连接地址
VUE_APP_WS_API = 'ws://{HOST}:8960/ws'
VUE_APP_BASE_API = '/'

# 数据管理
VUE_APP_DATA_API = ''
VUE_APP_DATA_API = '/'

VUE_APP_WS_API = 'ws://10.0.0.35:8960/ws'

# 训练可视化
VUE_APP_VISUAL_API = ''
VUE_APP_VISUAL_API = '/'

# 用户 minio 访问地址
VUE_APP_MINIO_API = ''
VUE_APP_MINIO_API = '/minio'

# atlas 服务,需要单独部署
VUE_APP_ATLAS_HOST = ''

# 医疗影像 DCM4CHEE 服务访问地址
# 部署文档参考:http://docs.dubhe.ai/docs/setup/deploy-algorithm
VUE_APP_DCM_API = 'http://{HOST}/dcm4chee/dcm4chee-arc/aets/DCM4CHEE_ADMIN'
VUE_APP_DCM_API = '/dcm4chee/dcm4chee-arc/aets/DCM4CHEE_ADMIN'

# minIO 服务 IP
# 部署文档参考:http://docs.dubhe.ai/docs/setup/deploy-minio
VUE_APP_MINIO_ENDPOINT = ''
VUE_APP_MINIO_ENDPOINT = '10.0.0.35'

# minIO 服务 端口
VUE_APP_MINIO_PORT = '9000'
@@ -37,4 +35,4 @@ VUE_APP_MINIO_USESSL = 'false'
VUE_APP_MINIO_BUCKETNAME = 'dubhe-prod'

# 文档链接
VUE_APP_DOCS_URL = http://docs.tianshu.org.cn/docs/
VUE_APP_DOCS_URL = http://docs.dubhe.ai/docs/

+ 33
- 30
webapp/README.md View File

@@ -1,30 +1,34 @@
# 之江天枢-前端

**之江天枢一站式人工智能开源平台**(简称:**之江天枢**),包括海量数据处理、交互式模型构建(包含Notebook和模型可视化)、AI模型高效训练。多维度产品形态满足从开发者到大型企业的不同需求,将提升人工智能技术的研发效率、扩大算法模型的应用范围,进一步构建人工智能生态“朋友圈”。
**之江天枢一站式人工智能开源平台**(简称:**之江天枢**),包括海量数据处理、交互式模型构建(包含 Notebook 和模型可视化)、AI 模型高效训练。多维度产品形态满足从开发者到大型企业的不同需求,将提升人工智能技术的研发效率、扩大算法模型的应用范围,进一步构建人工智能生态“朋友圈”。

## 特性
* 一站式开发
* 集成先进算法
* 灵活易用
* 性能优越

- 一站式开发
- 集成先进算法
- 灵活易用
- 性能优越

## 预览
![概览](/public/dubhe_dashboard.png "概览")

![概览](/public/dubhe_dashboard.png '概览')

## 源码部署

### 1. 下载源码

``` bash
```bash
git clone https://codeup.teambition.com/zhejianglab/dubhe-web.git

# 进入根目录
cd dubhe-web

```

### 2. 配置

根据需要修改如下配置文件

```
.env.mock
.env.development
@@ -34,7 +38,7 @@ cd dubhe-web

### 3. 构建

``` bash
```bash
# 安装项目依赖
npm install

@@ -47,7 +51,7 @@ npm run build:prod
- 构建完成后会在根目录生成 dist 文件夹,并将该文件夹上传至服务器;
- 在服务器 nginx.conf 文件中添加如下配置;

``` nginx
```nginx
server {
listen 80; # 端口
server_name localhost; # 域名/外网IP
@@ -63,10 +67,9 @@ server {

- 保存 `nginx.conf` 并重启 Nginx 使之生效。


## 本地开发

``` bash
```bash
# 下载源码
git clone https://codeup.teambition.com/zhejianglab/dubhe-web.git

@@ -92,23 +95,23 @@ npm run dev
## 项目结构

```
├── public 公共静态文件
├── src 源码目录
│   ├── api 接口
│   ├── assets 静态资源
│   ├── assets 静态资源
│   ├── boot 全局加载
│   ├── components 公共组件
│   ├── config 全局配置
│   ├── directives 全局指令
│   ├── hooks 全局Hook
│   ├── layout 页面布局
│   ├── mixins 混入
│   ├── router 路由
│   ├── store 存储
│   ├── utils 工具函数
│   ├── views 页面
│   ├── App.vue 根组件
│   ├── main.js 项目入口
│   └── settings.js 项目设置
├── public 公共静态文件
├── src 源码目录
│   ├── api 接口
│   ├── assets 静态资源
│   ├── assets 静态资源
│   ├── boot 全局加载
│   ├── components 公共组件
│   ├── config 全局配置
│   ├── directives 全局指令
│   ├── hooks 全局Hook
│   ├── layout 页面布局
│   ├── mixins 混入
│   ├── router 路由
│   ├── store 存储
│   ├── utils 工具函数
│   ├── views 页面
│   ├── App.vue 根组件
│   ├── main.js 项目入口
│   └── settings.js 项目设置
```

+ 1
- 0
webapp/package.json View File

@@ -92,6 +92,7 @@
"vee-validate": "^3.3.0",
"vue": "2.6.10",
"vue-copy-to-clipboard": "^1.0.3",
"vue-i18n": "^8.26.8",
"vue-prism-component": "^1.2.0",
"vue-prism-editor": "^1.2.2",
"vue-router": "^3.0.2",


BIN
webapp/public/favicon.ico View File

Before After

+ 23
- 13
webapp/public/index.html View File

@@ -1,16 +1,26 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta name="renderer" content="webkit">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
<script src="<%= BASE_URL %>js/ponyfill.min.js"></script>
<link rel="icon" href="<%= BASE_URL %>favicon.ico">
<title><%= webpackConfig.name %></title>
</head>
<body>
<div id="app"></div>
<!-- built files will be auto injected -->
</body>

<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta name="renderer" content="webkit">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
<script src="<%= BASE_URL %>js/ponyfill.min.js"></script>
<link rel="icon" href="<%= BASE_URL %>favicon.ico">
<title><%= webpackConfig.name %></title>
<style>
body {
width: 100%;
overflow-x: hidden;
}

</style>
</head>

<body>
<div id="app"></div>
<!-- built files will be auto injected -->
</body>

</html>

+ 28
- 16
webapp/src/App.vue View File

@@ -1,19 +1,3 @@
/** Copyright 2020 Tianshu AI Platform. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* =============================================================
*/

<template>
<div id="app">
<keep-alive include="DataSet">
@@ -25,5 +9,33 @@
<script>
export default {
name: 'App',
data() {
return {};
},
methods: {
/**
* @description: 获取缩放值
* @param { Void }
* @return { Void }
*/
getScale() {
const dw = document.documentElement.clientWidth;
const dh = document.documentElement.clientHeight;
const size = dw / dh;
const ww = 1920;
const hh = dw === ww ? dh : document.documentElement.clientHeight * (1920 / dw);
this.width = `${ww}px`;
this.height = size < 16 / 9 ? '920px' : `${hh}px`;
let scale = 1;
const w = window.innerWidth / ww;
const h = window.innerHeight / hh;
scale = w < h ? w : h;
window.localStorage.setItem('scale', scale);
const { container } = this.$refs;
if (container) {
container.style.transform = `scale(${scale}) translate(-50%, -50%)`;
}
},
},
};
</script>

+ 3
- 0
webapp/src/api/auth.js View File

@@ -18,6 +18,8 @@ import request from '@/utils/request';
import { API_MODULE_NAME } from '@/config';

export function login(data) {
const url = `/${API_MODULE_NAME.ADMIN}/auth/login`;
console.log('啦啦啦:', url);
return request({
url: `/${API_MODULE_NAME.ADMIN}/auth/login`,
method: 'post',
@@ -81,5 +83,6 @@ export function logout() {
export function getMinIOAuth() {
return request({
url: `/${API_MODULE_NAME.DATA}/datasets/minio/info`,
//url: 'http://10.0.0.35:8800/api/v1/data/datasets/minio/info',
});
}

+ 30
- 0
webapp/src/api/preparation/dataset.js View File

@@ -60,6 +60,10 @@ export function del(ids) {
}

export function editDataset(data) {
if (data.labelGroupId) {
data.labelGroupIds = data.labelGroupId;
data.labelGroupId = '';
}
return request({
url: `/${API_MODULE_NAME.DATA}/datasets/${data.id}`,
method: 'put',
@@ -260,4 +264,30 @@ export function getPresetDataset() {
});
}

export function getNotContainList(labelGroupType, datasetId, annotateType) {
const params = {};
if (labelGroupType) {
params.labelGroupType = labelGroupType;
}
if (datasetId) {
params.datasetId = datasetId;
}
if (annotateType) {
params.annotateType = annotateType;
}
return request({
url: `/${API_MODULE_NAME.DATA}/datasets/getNotContainList`,
method: 'get',
params,
});
}

// 将普通数据集转为预置数据集
export function myConvertPreset(datasetId) {
return request({
url: `/${API_MODULE_NAME.DATA}/datasets/myConvertPreset/${datasetId}`,
method: 'post',
});
}

export default { list, add, del };

+ 9
- 0
webapp/src/api/preparation/labelGroup.js View File

@@ -80,6 +80,15 @@ export function getLabelGroupList(params) {
});
}

// 标签组列表的简况查询 用于详情页选择标签组列举
export function getLabelGroupTreeList(params) {
return request({
url: `/${API_MODULE_NAME.DATA}/labelGroup/getTreeList`,
method: 'get',
params,
});
}

// 获取标签组详情
export function getLabelGroupDetail(id) {
return request({


BIN
webapp/src/assets/images/dashboard/advantage-1.png View File

Before After
Width: 162  |  Height: 162  |  Size: 6.2 kB Width: 104  |  Height: 104  |  Size: 5.0 kB

BIN
webapp/src/assets/images/dashboard/advantage-2.png View File

Before After
Width: 162  |  Height: 162  |  Size: 6.2 kB Width: 104  |  Height: 104  |  Size: 5.0 kB

BIN
webapp/src/assets/images/dashboard/advantage-3.png View File

Before After
Width: 162  |  Height: 162  |  Size: 7.3 kB Width: 104  |  Height: 104  |  Size: 6.1 kB

BIN
webapp/src/assets/images/dashboard/advantage-4.png View File

Before After
Width: 162  |  Height: 162  |  Size: 6.1 kB Width: 104  |  Height: 104  |  Size: 5.6 kB

BIN
webapp/src/assets/images/dataset/tu1.png View File

Before After
Width: 277  |  Height: 246  |  Size: 14 kB

BIN
webapp/src/assets/images/dataset/tu2.png View File

Before After
Width: 277  |  Height: 246  |  Size: 9.0 kB

BIN
webapp/src/assets/images/login/background.jpg View File

Before After
Width: 382  |  Height: 500  |  Size: 116 kB

BIN
webapp/src/assets/images/login/background.png View File

Before After
Width: 512  |  Height: 550  |  Size: 70 kB

BIN
webapp/src/assets/images/login/login-logo.png View File

Before After
Width: 224  |  Height: 77  |  Size: 14 kB

BIN
webapp/src/assets/images/login/out-background.png View File

Before After
Width: 1920  |  Height: 1080  |  Size: 24 kB

BIN
webapp/src/assets/images/login/register.png View File

Before After
Width: 396  |  Height: 396  |  Size: 69 kB

BIN
webapp/src/assets/images/menu-text.png View File

Before After
Width: 150  |  Height: 33  |  Size: 2.3 kB

BIN
webapp/src/assets/images/weixin.png View File

Before After
Width: 877  |  Height: 1184  |  Size: 291 kB

+ 2
- 0
webapp/src/assets/styles/common.scss View File

@@ -20,6 +20,8 @@
//main-container全局样式
.app-container {
padding: 10px 20px 70px 20px;
overflow: auto;
height: 100%;

.wrapper.fixed {
width: 1080px;


+ 1
- 1
webapp/src/assets/styles/element-variables.scss View File

@@ -15,7 +15,7 @@
*/

/* theme color */
$--color-primary: #2e4fde;
$--color-primary: #27afae;
$--color-success: #13ce66;
$--color-warning: #ffba00;
$--color-danger: #ff4949;


+ 2
- 1
webapp/src/assets/styles/sidebar.scss View File

@@ -17,7 +17,8 @@
#app {
.main-container {
position: relative;
min-height: 100%;
// min-height: 100%;
height: 100%;
margin-left: $sideBarWidth;
transition: margin-left 0.28s;
}


+ 9
- 9
webapp/src/assets/styles/variables.scss View File

@@ -15,17 +15,17 @@
*/

$red: #fa5555;
$primaryColor: #2e4fde;
$primaryHoverColor: #5872e5;
$primaryPlainBgColor: #eaedfc;
$primaryBorderColor: #abb9f2;
$primaryColor: #27afae;
$primaryHoverColor: #27afae;
$primaryPlainBgColor: #e9f7f7;
$primaryBorderColor: #27afae;
$primaryBg: #ecf8ff;
$titleColor: #444;
$commonTextColor: #666;
$labelColor: #606266;
$infoColor: #909399;
$disableColor: #666;
$linkColor: #2e4fde;
$linkColor: #27afae;
$borderColor: #d8d8d8;
$successColor: #67c23a;
$imageBg: #f8f8f8;
@@ -36,13 +36,13 @@ $black: #001529;
$dark: #323232;

// sidebar
$menuBg: #f3f7ff;
$menuBg: #f7fcfc;
$menuText: $commonTextColor;
$menuActiveText: $primaryColor;

$menuHoverBg: #d8dfff;
$subMenuBg: #edf0ff;
$menuActiveBg: #d8dfff;
$menuHoverBg: #dbf1f1;
$subMenuBg: #eff9f9;
$menuActiveBg: #dbf1f1;
$sideBarWidth: 205px;
$iconBarWidth: 64px;
$navBarHeight: 50px;


+ 7
- 15
webapp/src/components/InfoSelect/info-select.vue View File

@@ -1,18 +1,10 @@
/** Copyright 2020 Tianshu AI Platform. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* =============================================================
*/
/** Copyright 2020 Tianshu AI Platform. All Rights Reserved. * * Licensed under the Apache License,
Version 2.0 (the "License"); * you may not use this file except in compliance with the License. *
You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless
required by applicable law or agreed to in writing, software * distributed under the License is
distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied. * See the License for the specific language governing permissions and * limitations under
the License. * ============================================================= */

<template>
<div class="info-data-select">


+ 7
- 15
webapp/src/components/InlineTableEdit/index.vue View File

@@ -1,18 +1,10 @@
/** Copyright 2020 Tianshu AI Platform. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* =============================================================
*/
/** Copyright 2020 Tianshu AI Platform. All Rights Reserved. * * Licensed under the Apache License,
Version 2.0 (the "License"); * you may not use this file except in compliance with the License. *
You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless
required by applicable law or agreed to in writing, software * distributed under the License is
distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied. * See the License for the specific language governing permissions and * limitations under
the License. * ============================================================= */

<template>
<ValidationObserver ref="observerRef">


+ 125
- 253
webapp/src/components/LoginPublic/index.vue View File

@@ -1,276 +1,148 @@
/** Copyright 2020 Tianshu AI Platform. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* =============================================================
*/

/** Copyright 2020 Tianshu AI Platform. All Rights Reserved. * * Licensed under the Apache License,
Version 2.0 (the "License"); * you may not use this file except in compliance with the License. *
You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless
required by applicable law or agreed to in writing, software * distributed under the License is
distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied. * See the License for the specific language governing permissions and * limitations under
the License. * ============================================================= */
<template>
<div style="height: 100%;">
<div class="bg">
<div class="left" />
<div class="right" />
</div>
<div id="content">
<div class="left mb-dn">
<div class="image" @mouseenter="stopSlider" @mouseleave="startSlider">
<transition-group ref="loginList" name="login-list" tag="ul">
<li
v-for="item in loginImageList"
v-show="item.id === currentIndex"
:key="item.id"
class="image-item"
>
<!-- 文本介绍 -->
<div class="carousel-title">{{ item.title }}</div>
<div class="carousel-text">{{ item.text }}</div>
</li>
</transition-group>
<!-- 翻页指示器 -->
<ul class="indicator-item">
<li
v-for="(item, index) in loginImageList.length"
:key="index"
:class="{ active: index === currentIndex }"
@click="currentIndex = index"
></li>
</ul>
<!-- 底部 -->
<div v-if="$store.state.settings.showFooter" id="el-login-footer">
<span>{{ $store.state.settings.footerTxt }}</span>
<template v-if="$store.state.settings.caseNumber">
<span>⋅</span>
<a href="/" target="_blank">{{ $store.state.settings.caseNumber }}</a>
</template>
<div class="login_container">
<div class="login-wrapper">
<ScreenAdapter>
<div class="container">
<div class="container-box">
<div class="bg-img">
<img src="~@/assets/images/login/background.png" alt="logo" />
</div>
<div class="slot-content">
<login-title></login-title>
<slot></slot>
</div>
</div>
</div>
</div>
<div class="right mb-w100">
<!-- 左侧部分 -->
<slot />
<div class="footer-logo">
<img src="@/assets/images/dubhe-logo.svg" width="74" alt />
</div>
</div>
</ScreenAdapter>
</div>
</div>
</template>

<script>
import LoginTitle from '@/components/loginTitle';
import ScreenAdapter from '@/components/ScreenAdapter';

export default {
name: 'LoginPublic',
data() {
return {
loginImageList: [
{
id: 0,
title: '交互式模型构建',
text: '提供云端深度学习开发环境,包含notebook和深度学习网络可视化建模',
},
{
id: 1,
title: '海量数据处理',
text: '提供数据集版本管理及海量数据预处理与智能标注服务,大大减少人力成本',
},
],
currentIndex: 0,
timer: '',
};
},
mounted() {
this.startSlider();
this.$once('hook:beforeDestroy', () => {
this.stopSlider();
});
},
methods: {
startSlider() {
this.timer = setInterval(() => {
this.autoPlay();
}, 8000);
},
stopSlider() {
clearInterval(this.timer);
this.timer = null;
},
autoPlay() {
this.currentIndex += 1;
if (this.currentIndex > this.loginImageList.length - 1) {
this.currentIndex = 0;
}
},
components: {
LoginTitle,
ScreenAdapter,
},
};
</script>

<style rel="stylesheet/scss" lang="scss" scoped>
@import '@/assets/styles/variables.scss';

.bg {
position: absolute;
z-index: 1;
<style lang="scss" scoped>
$green: #39b29b;
$input-background: #fafbff;
$white: #fff;
.login_container {
background: url('~@/assets/images/login/out-background.png') center center no-repeat;
background-size: 100% 100%;
position: fixed;
inset: 0;
overflow: auto;
width: 100%;
height: 100%;

.left {
.login-wrapper {
box-sizing: border-box;
position: relative;
float: left;
width: 61.8%;
height: 100%;
background-color: #f3f7ff;
}

.right {
float: right;
width: 38.2%;
height: 100%;
background: #fff;
}
}

#content {
position: relative;
z-index: 999;
height: 100%;
margin: 0 auto;

.left {
position: relative;
float: left;
width: 61.8%;
height: 100%;
}

.right {
display: flex;
align-items: center;
justify-content: center;
float: right;
width: 38.2%;
height: 100%;
padding-bottom: 70px;
background: #fff;
}
}

.image {
position: relative;
width: 100%;
height: 100%;

.image-item {
position: absolute;
top: 0;
left: 50%;
width: 100%;
height: 100%;
transform: translateX(-50%);

.carousel-title {
margin-top: 20.444%;
margin-left: 8.236%;
font-size: 32px;
line-height: 42px;
color: rgb(92, 92, 91);
letter-spacing: 4px;
-moz-user-select: none;
-o-user-select: none;
-webkit-user-select: none;
-ms-user-select: none;
user-select: none;
}

.carousel-text {
width: 50%;
margin-top: 20px;
margin-left: 8.236%;
font-size: 14px;
font-size: 18px;
line-height: 28px;
color: rgb(92, 92, 91);
letter-spacing: 2px;
-moz-user-select: none;
-o-user-select: none;
-webkit-user-select: none;
-ms-user-select: none;
user-select: none;
}
}

.image-item:nth-child(1) {
background: url('../../assets/images/loginImage1.png') no-repeat center;
background-size: cover;
}

.image-item:nth-child(2) {
background: url('../../assets/images/loginImage2.png') no-repeat center;
background-size: cover;
}

.indicator-item {
position: absolute;
bottom: 50px;
left: 50%;
z-index: 20;
overflow: hidden;
text-align: center;
transform: translateX(-50%);

li {
float: left;
width: 10px;
height: 10px;
margin-right: 15px;
cursor: pointer;
background: #d9e3ff;
border-radius: 50%;

&.active {
background: #8ea3ff;
.container {
transform: translate(-50%, -50%);
position: absolute;
top: 50%;
left: 50%;
.container-box {
display: flex;
height: 100%;
border-radius: 10px;
}
.screen {
margin-top: 30px;
text-align: center;
color: #999999;
}
.bg-img {
width: 620px;
display: flex;
justify-content: center;
align-items: center;
background: #fafbfc;
}
.slot-content {
background: rgba(255, 255, 255, 0.7);
flex: 1;
padding: 40px 30px;
}
.login-form {
::v-deep .el-input__inner {
height: 45px !important;
// line-height: 45px !important;
// font-size: 16px;
background: $input-background;
border: 1px solid #eee;
border-radius: 2px;
padding: 5px 20px 5px 45px;
}
::v-deep .el-input__prefix {
height: 45px;
line-height: 45px;
width: 45px;
}
::v-deep .svg-container {
color: $green;
margin: 0 auto;
padding-right: 5px;
border-right: 1px solid #eee;
}
.title {
// font-size: 30px;
color: $green;
margin-bottom: 60px;
}
.el-form-item--small {
margin-bottom: 5px;
}
.btn {
text-align: center;
.login-btn {
width: 358px;
height: 50px;
background: $green;
margin: 30px 0px 20px 0px;
border-radius: 25px;
font-weight: 500;
box-shadow: 0px 5px 14px 1px rgba(0, 31, 61, 0.15);
}
::v-deep .el-button {
span {
font-size: 22px;
}
}
}
.captcha {
margin-left: 10px;
}
.password-option {
.forget-password {
color: $green;
cursor: pointer;
}
}
}
}
}
}

.footer-logo {
position: fixed;
bottom: 20px;
left: 61.8%;
display: flex;
align-items: center;
justify-content: center;
width: 38.2%;
}

#el-login-footer {
position: fixed;
bottom: 0;
width: 61.8%;
height: 40px;
font-family: Arial, serif;
font-size: 12px;
line-height: 40px;
color: rgb(92, 92, 91);
text-align: center;
letter-spacing: 1px;
}

.login-list-enter,
.login-list-leave-to {
opacity: 0;
}

.login-list-leave-active,
.login-list-enter-active {
transition: all 0.5s linear;
.el-icon-user,
.el-icon-lock,
.el-icon-warning-outline {
// font-size: 20px;
}
}
</style>

+ 7
- 15
webapp/src/components/ProTable/header.vue View File

@@ -1,18 +1,10 @@
/** Copyright 2020 Tianshu AI Platform. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* =============================================================
*/
/** Copyright 2020 Tianshu AI Platform. All Rights Reserved. * * Licensed under the Apache License,
Version 2.0 (the "License"); * you may not use this file except in compliance with the License. *
You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless
required by applicable law or agreed to in writing, software * distributed under the License is
distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied. * See the License for the specific language governing permissions and * limitations under
the License. * ============================================================= */

<template>
<div class="pro-table-header flex py-4">


+ 7
- 15
webapp/src/components/ProTable/index.vue View File

@@ -1,18 +1,10 @@
/** Copyright 2020 Tianshu AI Platform. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* =============================================================
*/
/** Copyright 2020 Tianshu AI Platform. All Rights Reserved. * * Licensed under the Apache License,
Version 2.0 (the "License"); * you may not use this file except in compliance with the License. *
You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless
required by applicable law or agreed to in writing, software * distributed under the License is
distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied. * See the License for the specific language governing permissions and * limitations under
the License. * ============================================================= */

<template>
<div class="pro-table-container">


+ 69
- 0
webapp/src/components/ScreenAdapter.vue View File

@@ -0,0 +1,69 @@
<template>
<div class="ScreenAdapter" :style="style">
<slot />
</div>
</template>
<script>
export default {
name: '',
// 参数注入
props: {
width: {
type: String,
default: '1920',
},
height: {
type: String,
default: '1080',
},
},
data() {
return {
style: {
width: `${this.width}px`,
height: `${this.height}px`,
transform: 'scale(1) translate(-50%, -50%)',
},
};
},
mounted() {
this.setScale();
window.onresize = this.Debounce(this.setScale, 1000);
},
methods: {
Debounce: (fn, t) => {
const delay = t || 500;
let timer;
return function() {
const args = arguments;
if (timer) {
clearTimeout(timer);
}
const context = this;
timer = setTimeout(() => {
timer = null;
fn.apply(context, args);
}, delay);
};
},
// 获取放大缩小比例
getScale() {
const w = window.innerWidth / this.width;
const h = window.innerHeight / this.height;
return w < h ? w : h;
},
// 设置比例
setScale() {
this.style.transform = `scale(${this.getScale()}) translate(-50%, -50%)`;
},
},
};
</script>
<style lang="scss" scoped>
.ScreenAdapter {
transform-origin: 0 0;
position: absolute;
left: 50%;
top: 50%;
}
</style>

+ 23
- 29
webapp/src/components/Training/dataSourceSelector.vue View File

@@ -1,18 +1,10 @@
/** Copyright 2020 Tianshu AI Platform. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* =============================================================
*/
/** Copyright 2020 Tianshu AI Platform. All Rights Reserved. * * Licensed under the Apache License,
Version 2.0 (the "License"); * you may not use this file except in compliance with the License. *
You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless
required by applicable law or agreed to in writing, software * distributed under the License is
distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied. * See the License for the specific language governing permissions and * limitations under
the License. * ============================================================= */

<template>
<div>
@@ -25,9 +17,9 @@
<el-option :value="null" label="全部" />
<el-option
v-for="item in algorithmUsageList"
:key="item.id"
:value="item.auxInfo"
:label="item.auxInfo"
:key="item.value"
:value="item.value"
:label="item.label"
/>
</el-select>
<el-select
@@ -53,7 +45,7 @@
:label="item.versionName"
/>
</el-select>
<el-tooltip
<!-- <el-tooltip
effect="dark"
:disabled="!dataSourceVersion"
:content="ofRecordTooltip"
@@ -62,13 +54,14 @@
<el-checkbox v-model="useOfRecord" :disabled="!ofRecordDisabled" @change="onUseOfRecordChange"
>使用 OFRecord</el-checkbox
>
</el-tooltip>
</el-tooltip> -->
</div>
</template>

<script>
import { list as getAlgorithmUsages } from '@/api/algorithm/algorithmUsage';
import { getPublishedDatasets, getDatasetVersions } from '@/api/preparation/dataset';
import { typeList } from '@/config';

export default {
name: 'DataSourceSelector',
@@ -92,7 +85,7 @@ export default {
},
data() {
return {
algorithmUsageList: [],
algorithmUsageList: typeList,
datasetIdList: [],
datasetVersionList: [],

@@ -148,13 +141,14 @@ export default {
// 选择数据集版本后,如果存在 OfRecordUrl,则默认勾选使用,否则禁用选择
this.result.dataSourceName = `${this.dataSource.name}:${version.versionName}`;
this.result.imageCounts = version.imageCounts;
if (version.versionOfRecordUrl) {
this.useOfRecord = true;
this.result.dataSourcePath = version.versionOfRecordUrl;
} else {
this.useOfRecord = false;
this.result.dataSourcePath = version.versionUrl;
}
// if (version.versionOfRecordUrl) {
// this.useOfRecord = true;
// this.result.dataSourcePath = version.versionOfRecordUrl;
// } else {
// this.useOfRecord = false;
// this.result.dataSourcePath = version.versionUrl;
// }
this.result.dataSourcePath = version.versionUrl;
this.emitResult();
},
onUseOfRecordChange(useOfRecord) {
@@ -171,7 +165,7 @@ export default {
size: 1000,
};
getAlgorithmUsages(params).then((res) => {
this.algorithmUsageList = res.result;
// this.algorithmUsageList = res.result;
});
},
/**


+ 18
- 23
webapp/src/components/Training/jobForm.vue View File

@@ -1,18 +1,10 @@
/** Copyright 2020 Tianshu AI Platform. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* =============================================================
*/
/** Copyright 2020 Tianshu AI Platform. All Rights Reserved. * * Licensed under the Apache License,
Version 2.0 (the "License"); * you may not use this file except in compliance with the License. *
You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless
required by applicable law or agreed to in writing, software * distributed under the License is
distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied. * See the License for the specific language governing permissions and * limitations under
the License. * ============================================================= */

<!--使用场景: add: 任务创建(jobAdd), edit: 任务版本修改(jobDetail), paramsAdd: 模板创建(jobDetail), paramsEdit: 模板修改(job)-->
<template>
@@ -564,6 +556,9 @@ export default {
imageTag: [{ required: true, message: '请选择镜像', trigger: 'manual' }],
trainJobSpecsName: [{ required: true, message: '请选择节点规格', trigger: 'change' }],
runCommand: [{ required: true, message: '请输入运行命令', trigger: ['blur', 'change'] }],
dataSourcePath: [
{ required: true, message: '请选择训练数据集', trigger: ['blur', 'change'] },
],
},
};
},
@@ -586,7 +581,7 @@ export default {
? ' --train_visualized_log=/workspace/visualizedlog'
: '';
}
str += this.form.dataSourceName && this.form.dataSourcePath ? ' --data_url=/dataset' : '';
str += this.form.dataSourceName && this.form.dataSourcePath ? ' --data_url=/dataset --label_url=/label' : '';
str +=
this.form.valDataSourceName && this.form.valDataSourcePath
? ' --val_data_url=/valdataset'
@@ -641,12 +636,12 @@ export default {
this.resetProject();
});
this.getModels(true);
this.$refs.trainDataSourceSelector.updateAlgorithmUsage(this.form.algorithmUsage, true);
/* this.$refs.trainDataSourceSelector.updateAlgorithmUsage(this.form.algorithmUsage, true);
this.form.valType &&
this.$refs.verifyDataSourceSelector.updateAlgorithmUsage(
this.form.valAlgorithmUsage,
true
);
); */
} else if (this.form.modelResource !== null) {
const { modelList, teacherModelList, studentModelList } = await getTrainModel({
modelResource: this.form.modelResource,
@@ -1073,11 +1068,11 @@ export default {
// 选用算法变更时,需要同步算法的模型类别、运行项目、运行镜像、运行命令、运行参数
const algorithm = this.algorithmIdList.find((i) => i.id === id);
this.selectedAlgorithm = algorithm;
this.form.algorithmUsage = algorithm?.algorithmUsage || null; // 同步算法用途
this.form.valAlgorithmUsage = algorithm?.algorithmUsage || null; // 同步算法用途到验证数据集
this.$refs.trainDataSourceSelector.updateAlgorithmUsage(this.form.algorithmUsage); // 根据算法用途更新数据集列表
this.form.valType &&
this.$refs.verifyDataSourceSelector.updateAlgorithmUsage(this.form.valAlgorithmUsage); // 根据验证数据集算法用途更新数据集列表
// this.form.algorithmUsage = algorithm?.algorithmUsage || null; // 同步算法用途
// this.form.valAlgorithmUsage = algorithm?.algorithmUsage || null; // 同步算法用途到验证数据集
// this.$refs.trainDataSourceSelector.updateAlgorithmUsage(this.form.algorithmUsage); // 根据算法用途更新数据集列表
// this.form.valType &&
// this.$refs.verifyDataSourceSelector.updateAlgorithmUsage(this.form.valAlgorithmUsage); // 根据验证数据集算法用途更新数据集列表
if (this.usePresetAlgorithm) {
this.form.runCommand = algorithm?.runCommand || ''; // 同步运行命令
this.form.runParams = algorithm?.runParams || {}; // 同步运行参数


+ 7
- 15
webapp/src/components/Training/saveModelDialog.vue View File

@@ -1,18 +1,10 @@
/** Copyright 2020 Tianshu AI Platform. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* =============================================================
*/
/** Copyright 2020 Tianshu AI Platform. All Rights Reserved. * * Licensed under the Apache License,
Version 2.0 (the "License"); * you may not use this file except in compliance with the License. *
You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless
required by applicable law or agreed to in writing, software * distributed under the License is
distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied. * See the License for the specific language governing permissions and * limitations under
the License. * ============================================================= */

<template>
<!--训练管理页面-保存模型Dialog-->


+ 15
- 3
webapp/src/components/UploadForm/form.js View File

@@ -186,10 +186,12 @@ export default {

return (
<div id="upload-form-style" class="upload-form">
{/*
class="upload-field"
*/}
<el-upload
action={this.action}
accept={this.accept}
class="upload-field"
limit={this.limit}
multiple
list-type={this.lenOfFileList > 100 || this.dataType === 'text' ? 'text' : 'picture'}
@@ -204,10 +206,20 @@ export default {
>
上传文件
</el-button>
<div slot="tip" class="flex f1 flex-between" style="margin-left: 20px;">
<div slot="tip" class="flex f1 flex-between">
<div class="upload-tip">
{this.accept === 'unspecified' ? (
<span>文件格式不限</span>
// <span>文件格式不限</span>
<span>
文件大小需小于100MB,大文件请使用脚本上传,
<a
href="https://docs.vloong.thinkenergy.tech/vloong/scene/datamanagement"
target="_blank"
type="primary"
>
使用文档
</a>
</span>
) : (
<span>文件格式:{this.acceptFormatStr}</span>
)}


+ 7
- 15
webapp/src/components/editor/index.vue View File

@@ -1,18 +1,10 @@
/** Copyright 2020 Tianshu AI Platform. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* =============================================================
*/
/** Copyright 2020 Tianshu AI Platform. All Rights Reserved. * * Licensed under the Apache License,
Version 2.0 (the "License"); * you may not use this file except in compliance with the License. *
You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless
required by applicable law or agreed to in writing, software * distributed under the License is
distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied. * See the License for the specific language governing permissions and * limitations under
the License. * ============================================================= */

<template>
<PrismEditor


+ 33
- 0
webapp/src/components/loginTitle.vue View File

@@ -0,0 +1,33 @@
<template>
<div>
<span class="text-title">
伏龙AI平台
<span class="version">V2.0.0</span>
<el-row class="description">
一站式电池AI + 算法开发平台
</el-row>
</span>
</div>
</template>
<style lang="scss" scoped>
$green: #39b29b;
.text-title {
display: inline-block;
padding: 0;
margin-bottom: 20px;
font-size: 44px;
color: $green;
font-weight: bold;
}
.version {
font-size: 26px;
font-weight: 300;
}
.description {
text-align: left;
color: #666;
font-size: 22px;
margin-top: 10px;
font-weight: 300;
}
</style>

+ 72
- 0
webapp/src/config/index.js View File

@@ -1,3 +1,6 @@
import {isNil} from "lodash";
import {annotationMap} from "../views/dataset/util";

/** Copyright 2020 Tianshu AI Platform. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
@@ -71,3 +74,72 @@ export const servingConfig = {
export const atlasConfig = {
uploadFileAcceptSize: 5, // 上传度量图文件大小限制,单位为 MB,0 表示不限制大小
};

// demo list
export const algList = [
{
id: 10,
auxInfo: '健康状态',
},
{
id: 11,
auxInfo: '安全预警',
},
{
id: 12,
auxInfo: '异常检测',
},
{
id: 13,
auxInfo: '其他',
},
];

export const typeList = [
{
label: '车端数据',
value: 102,
code: 102,
},
{
label: '桩端数据',
value: 101,
code: 101,
},
{
label: '实验数据',
value: 105,
code: 105,
},
{
label: '其他',
value: 106,
code: 106,
},
];

// 根据 code 编码放回标注类型(数据集数据类型)
export const datasetTypeBy = (valueBy) => (value, key) => {
const filterItems = Object.values(typeList).filter((d) => d[valueBy] === value);
// 区分类型(是否唯一)
if (valueBy === 'code') {
const item = filterItems[0];
if (isNil(item)) return item;
return key ? item[key] || '' : item;
}
// 基于数据类型获取内容
/* if (valueBy === 'dataType') {
const dataTypeKey = Object.keys(dataAnnotationMap).find((d) => Number(d) === value);
if (dataTypeKey) {
const items = [];
const dataTypeValues = dataAnnotationMap[dataTypeKey];
for (const [key, value] of Object.entries(typeList)) {
if (dataTypeValues.includes(Number(key))) {
items.push(value);
}
}
return items;
}
} */
return key ? filterItems.map((d) => d[key] || '') : filterItems;
};

+ 6
- 15
webapp/src/layout/BaseLayout.vue View File

@@ -1,18 +1,9 @@
/*
* Copyright 2019-2020 Zheng Jie
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/* * Copyright 2019-2020 Zheng Jie * * Licensed under the Apache License, Version 2.0 (the
"License"); * you may not use this file except in compliance with the License. * You may obtain a
copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by
applicable law or agreed to in writing, software * distributed under the License is distributed on
an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See
the License for the specific language governing permissions and * limitations under the License. */

<template>
<div :class="classObj" class="app-wrapper">


+ 7
- 16
webapp/src/layout/components/AppMain/index.vue View File

@@ -1,18 +1,9 @@
/*
* Copyright 2019-2020 Zheng Jie
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/* * Copyright 2019-2020 Zheng Jie * * Licensed under the Apache License, Version 2.0 (the
"License"); * you may not use this file except in compliance with the License. * You may obtain a
copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by
applicable law or agreed to in writing, software * distributed under the License is distributed on
an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See
the License for the specific language governing permissions and * limitations under the License. */

<template>
<section class="app-main">
@@ -32,7 +23,7 @@ export default {
width: 100%;

/* 50= navbar 50 */
min-height: calc(100vh);
height: calc(100% - 33px);
overflow: hidden;
}



+ 16
- 26
webapp/src/layout/components/Feedback/index.vue View File

@@ -1,41 +1,31 @@
/** Copyright 2020 Tianshu AI Platform. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* =============================================================
*/
/** Copyright 2020 Tianshu AI Platform. All Rights Reserved. * * Licensed under the Apache License,
Version 2.0 (the "License"); * you may not use this file except in compliance with the License. *
You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless
required by applicable law or agreed to in writing, software * distributed under the License is
distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied. * See the License for the specific language governing permissions and * limitations under
the License. * ============================================================= */

<template>
<div v-click-outside="onClickOutside" class="feedback-outside">
<div ref="triggerRef" class="feedback" @click="handleOpen">
我要反馈
</div>
<div ref="triggerRef" class="feedback" @click="handleOpen">我要反馈</div>
<el-card v-show="tooltipData.visible" class="feed-content box-card g6" :style="contentStyle">
<div slot="header" class="clearfix">
我要反馈
</div>
<div slot="header" class="clearfix">我要反馈</div>
<el-row :gutter="20">
<el-col :span="12">
<!-- <el-col :span="12">
<a class="feed-action g6" target="_blank" :href="Community">
<i class="el-icon-edit-outline" />
<div>在线社区</div>
</a>
</el-col>
<el-col :span="12">
</el-col>-->
<el-col :span="24">
<el-popover placement="bottom" trigger="click">
<img src="../../../assets/images/dingtalk.jpg" width="200" alt="" />
<!-- <img src="../../../assets/images/dingtalk.jpg" width="200" alt /> -->
<img src="../../../assets/images/weixin.png" width="200" alt />
<div slot="reference" class="feed-action">
<i class="el-icon-chat-dot-square" />
<div>钉钉交流群</div>
<!-- <div>钉钉交流群</div> -->
<div>微信交流群</div>
</div>
</el-popover>
</el-col>


+ 11
- 17
webapp/src/layout/components/Guideline/index.vue View File

@@ -1,18 +1,10 @@
/** Copyright 2020 Tianshu AI Platform. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* =============================================================
*/
/** Copyright 2020 Tianshu AI Platform. All Rights Reserved. * * Licensed under the Apache License,
Version 2.0 (the "License"); * you may not use this file except in compliance with the License. *
You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless
required by applicable law or agreed to in writing, software * distributed under the License is
distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied. * See the License for the specific language governing permissions and * limitations under
the License. * ============================================================= */

<template>
<div class="doc-link">
@@ -24,7 +16,9 @@
</template>

<script>
const docsUrl = process.env.VUE_APP_DOCS_URL;
//! A temporary change
// const docsUrl = process.env.VUE_APP_DOCS_URL;
const docsUrl = 'https://docs.vloong.thinkenergy.tech';

export default {
name: 'Guideline',
@@ -37,7 +31,7 @@ export default {
</script>

<style lang="scss">
@import '~@/assets/styles/variables.scss';
@import "~@/assets/styles/variables.scss";

.doc-link {
margin-right: 20px;


+ 8
- 16
webapp/src/layout/components/Sidebar/Logo.vue View File

@@ -1,18 +1,9 @@
/*
* Copyright 2019-2020 Zheng Jie
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/* * Copyright 2019-2020 Zheng Jie * * Licensed under the Apache License, Version 2.0 (the
"License"); * you may not use this file except in compliance with the License. * You may obtain a
copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by
applicable law or agreed to in writing, software * distributed under the License is distributed on
an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See
the License for the specific language governing permissions and * limitations under the License. */

<template>
<div class="sidebar-logo-container">
@@ -23,7 +14,8 @@
</template>

<script>
import title from '@/assets/images/dl-title.png';
// import title from '@/assets/images/dl-title.png';
import title from '@/assets/images/menu-text.png';

export default {
name: 'SidebarLogo',


+ 6
- 15
webapp/src/layout/components/Sidebar/index.vue View File

@@ -1,18 +1,9 @@
/*
* Copyright 2019-2020 Zheng Jie
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/* * Copyright 2019-2020 Zheng Jie * * Licensed under the Apache License, Version 2.0 (the
"License"); * you may not use this file except in compliance with the License. * You may obtain a
copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by
applicable law or agreed to in writing, software * distributed under the License is distributed on
an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See
the License for the specific language governing permissions and * limitations under the License. */

<template>
<div :class="{ 'has-logo': showLogo }">


+ 64
- 18
webapp/src/layout/index.vue View File

@@ -1,23 +1,24 @@
/** Copyright 2020 Tianshu AI Platform. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* =============================================================
*/
/** Copyright 2020 Tianshu AI Platform. All Rights Reserved. * * Licensed under the Apache License,
Version 2.0 (the "License"); * you may not use this file except in compliance with the License. *
You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless
required by applicable law or agreed to in writing, software * distributed under the License is
distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied. * See the License for the specific language governing permissions and * limitations under
the License. * ============================================================= */

<template>
<component :is="layout">
<router-view />
</component>
<div
id="container"
ref="container"
:style="{
width,
height,
}"
>
<component :is="layout">
<router-view />
</component>
</div>
</template>

<script>
@@ -44,11 +45,56 @@ export default {
SubpageLayout,
FullpageLayout,
},
data() {
return {
width: '1920px',
height: '',
};
},
computed: {
layout() {
const { layout } = this.$route.meta;
return layoutList.includes(layout) ? layout : 'BaseLayout';
},
},
mounted() {
this.getScale();
window.addEventListener('resize', this.getScale);
},
methods: {
/**
* @description: 获取缩放值
* @param { Void }
* @return { Void }
*/
getScale() {
const dw = document.documentElement.clientWidth;
const dh = document.documentElement.clientHeight;
const size = dw / dh;
const ww = 1920;
const hh = dw === ww ? dh : document.documentElement.clientHeight * (1920 / dw);
this.width = `${ww}px`;
this.height = size < 16 / 9 ? '920px' : `${hh}px`;
let scale = 1;
const w = window.innerWidth / ww;
const h = window.innerHeight / hh;
scale = w < h ? w : h;
window.localStorage.setItem('scale', scale);
const { container } = this.$refs;
if (container) {
container.style.transform = `scale(${scale}) translate(-50%, -50%)`;
}
},
},
};
</script>
<style>
#container {
font-size: 14px !important;
transform-origin: 0 0;
position: absolute;
left: 50%;
top: 50%;
overflow: hidden;
}
</style>

+ 1
- 0
webapp/src/lib/api-map/index.js View File

@@ -41,6 +41,7 @@ const rules = [
const mapper = (pathname) => {
if (isURL(pathname)) return undefined;
const rule = findMatchRule(rules)(pathname);
// debugger;
return rule.host;
};



+ 7
- 1
webapp/src/main.js View File

@@ -41,7 +41,12 @@ import './boot';
import './assets/VisualIcon/iconfont.css';
import './assets/styles/index.scss';

Vue.use(Element);
// 国际化
import i18n from './utils/locale';

Vue.use(Element, {
i18n: (key, value) => i18n.t(key, value),
});
Vue.use(VueCompositionAPI);
Vue.use(VueHotkey);
Vue.use(dict);
@@ -61,6 +66,7 @@ Vue.config.productionTip = false;
new Vue({
el: '#app',
router,
i18n,
store,
render: (h) => h(App),
});

+ 21
- 1
webapp/src/router/index.js View File

@@ -61,7 +61,27 @@ const filterAsyncRoute = (routes) => {

const loadUserMenus = (next, to) => {
userMenus().then((res) => {
const asyncRoutes = filterAsyncRoute(res);
// A temporary change
// 屏蔽【模型炼知】路由
// 批量服务 -> SDK服务
// 在线服务 -> API服务
const _res = res.filter((route) => {
if (route.name === '云端Serving') {
route.meta.title = '云端部署';
const list = route.children.filter((item) => !item.hidden);
list.forEach((i) => {
if (i?.meta?.title === '在线服务') {
i.meta.title = 'API服务';
}
if (i?.meta?.title === '批量服务') {
i.meta.title = 'SDK服务';
}
});
}
return route.name !== '模型炼知';
});

const asyncRoutes = filterAsyncRoute(_res);
asyncRoutes.push({ path: '*', redirect: '/', hidden: true });
store.dispatch('app/addRoutes', asyncRoutes).then(() => {
router.addRoutes(asyncRoutes);


+ 2
- 2
webapp/src/settings.js View File

@@ -18,7 +18,7 @@ module.exports = {
/**
* @description 网站标题
*/
title: '之江天枢人工智能开源平台',
title: '昇科能源伏龙AI平台',
/**
* @description 固定头部
*/
@@ -50,7 +50,7 @@ module.exports = {
/**
* 底部文字
*/
footerTxt: '© 2020 之江天枢人工智能开源平台',
footerTxt: '©2021 昇科能源伏龙AI平台',
/**
* 备案号
*/


+ 1
- 0
webapp/src/store/modules/user.js View File

@@ -63,6 +63,7 @@ const user = {
return new Promise((resolve, reject) => {
login(loginData)
.then((res) => {
console.log('123:', res);
setToken(res.token, rememberMe);
initWebSocket();
commit('SET_TOKEN', res.token);


+ 8
- 0
webapp/src/utils/locale/en.js View File

@@ -0,0 +1,8 @@
const lang = {
title: 'title',
title1: 'title1',
placeholder: 'please enter',
name: 'gaosen',
};

export default lang;

+ 18
- 0
webapp/src/utils/locale/index.js View File

@@ -0,0 +1,18 @@
import Vue from 'vue';
import VueI18n from 'vue-i18n';
import enLocale from 'element-ui/lib/locale/lang/en';
import zhLocale from 'element-ui/lib/locale/lang/zh-CN';
import en from './en.js';
import zh from './zh.js';

Vue.use(VueI18n);

const i18n = new VueI18n({
locale: 'zh-CN',
messages: {
'zh-CN': { ...zhLocale, ...zh },
en: { ...enLocale, ...en },
},
});

export default i18n;

+ 8
- 0
webapp/src/utils/locale/zh.js View File

@@ -0,0 +1,8 @@
const lang = {
title: '标题',
title1: '标题1',
placeholder: '请输入中文',
name: '高森',
};

export default lang;

+ 2
- 2
webapp/src/utils/utils.js View File

@@ -20,10 +20,10 @@

import { nanoid } from 'nanoid';
import { Message } from 'element-ui';
import { isNil } from 'lodash';
import Config from '@/settings';

import FileFilter from '@/components/UploadForm/FileFilter';
import { isNil } from 'lodash';

/**
* Parse the time to string
@@ -147,7 +147,7 @@ export function debounce(func, wait, immediate) {
};

// eslint-disable-next-line func-names
return function(...args) {
return function (...args) {
context = this;
timestamp = +new Date();
const callNow = immediate && !timeout;


+ 5
- 5
webapp/src/utils/validate.js View File

@@ -373,15 +373,15 @@ export const validateLabelsUtil = (value) => {
if (!isPlainObject(value)) {
return '标签不能为空';
}
if (!value.name) {
if (!value.vin) {
return '标签格式异常,请检查';
}
if (!value.color) {
return '标签颜色不能为空';
if (!value.label) {
return 'label不能为空';
}
if (!/^#[0-9A-F]{6}$/i.test(value.color)) {
/* if (!/^#[0-9A-F]{6}$/i.test(value.color)) {
return '标签颜色格式不对';
}
} */
return '';
};



+ 225
- 0
webapp/src/views/agreement.vue View File

@@ -0,0 +1,225 @@
<style lang="scss" scoped>
.bold {
font-weight: 900;
}
</style>
<template>
<div>
<div class="header">
<h2 style="text-align: center">
昇科能源用户使用协议
</h2>
<p style="text-align: right">发布日期: 2021年11月30日</p>
</div>

<div class="box">
<p class="bold">
尊敬的用户,欢迎访问北京昇科能源科技有限责任公司。本《昇科能源用户使用协议》(以下简称“本协议”)是您与北京昇科能源科技有限责任公司(以下简称“昇科能源”或“我们”)订立的关于您使用昇科能源伏龙AI平台(以下简称“伏龙平台”)服务而订立的协议。根据本协议,我们向您提供昇科能源客户端的内容和服务。
</p>
<p class="bold">
一、服务条款的确认和接受
</p>
<p>
1.1
昇科能源在此特别提醒您,在您注册前请务必仔细阅读本协议,如果您对本协议的任何条款或将来随时可能修改、补充的条款有异议,您可选择不注册成为本平台的用户。当您点选“同意”按钮时(或使用昇科能源分发的账号登录平台时)即视为您已仔细阅读本条款,同意接受本协议条款的所有规范包括接受昇科能源对本协议条款随时所做的任何修改,并愿受其约束。
</p>
<p>
1.2
本协议条款将会随时更新,且不再另行通知。昇科能源有权在法律允许的范围内修改或者补充本协议条款,协议条款一旦发生变动,将会在重要页面上提示修改内容。如果不同意所改动的内容,您可以主动注销用户账号。如果您继续享用昇科能源所提供的网络服务,则视为接受服务条款的变动。
</p>
<p>
1.3
为向您提供平台服务,您需提供您的手机号码用于注册账号。您应当对该账号进行的所有活动和事件承担法律责任。
</p>
<p>
1.4
昇科能源保留在任何时候自行决定对平台及其相关功能的变更、升级、修改、转移的权利。昇科能源进一步保留在本平台中开发新的功能或其它服务的权利。上述所有新的功能、软件服务的提供,除非昇科能源另有说明,否则仍适用本协议。
</p>
<p class="bold">
二、注册信息和隐私保护
</p>
<p>
2.1 “ 昇科能源
”账号(即“昇科能源”用户ID)的所有权归属于昇科能源,您完成注册申请手续后,可获得“昇科能源”账号的使用权。注册时您应提供即时、详尽、准确的个人资料,并有义务不断更新注册资料,以符合即时、详尽、准确的要求。所有原始键入的资料将认定为注册资料。因注册资料不真实而引起的问题,及该问题引发的后果,昇科能源不承担任何责任。
</p>
<p>
2.2 为方便及时与您联系,昇科能源强烈建议您使用真实的手机号码进行账号注册。
</p>
<p>
2.3
昇科能源提示您请勿将账号、密码转让、出售或借予他人使用,若您授权他人使用账号,对被授权人在该账户下实施的所有行为您须承担全部责任。
</p>
<p>
2.4 昇科能源承诺不对外公开或向第三方提供单个用户的注册资料,以下情况除外:
</p>
<p>
(1)事先获得用户的明确授权;<br />
(2)只有透露用户个人资料,才能提供其所要求的产品和服务;<br />
(3)根据有关的法律法规要求;<br />
(4)按照相关政府主管部门的要求; <br />
(5)为维护昇科能源的合法权益; <br />
(6)其余昇科能源有理由公开的情形。
</p>
<p>
2.5
您在注册昇科能源账号,使用相关产品或服务,访问昇科能源伏龙AI平台等类似情形时,昇科能源将会自动收集您的个人身份识别资料且不再另行通知您。这些资料将会用于:改进并优化为您提供的服务及网页内容。
</p>
<p class="bold">
三、使用规则
</p>
<p>
3.1
您在使用昇科能源客户端提供的服务时,必须遵守中华人民共和国相关法律法规的规定,不得利用本服务进行任何违法或不正当的活动,包括但不限于下列行为:
</p>
<p>3.1.1 上载、展示、张贴、传播或以其他方式传达含有下列内容之一的信息:</p>
<p>
(1)反对宪法所确定的基本原则的;<br />
(2)危害国家安全,泄露国家秘密,颠覆国家政权,破坏国家统一的;<br />
(3)损害国家荣誉和利益的;<br />
(4)煽动民族仇恨、民族歧视、破坏民族团结的;<br />
(5)破坏国家宗教政策,宣扬邪教和封建迷信的;<br />
(6)散布谣言,扰乱社会秩序,破坏社会稳定的;<br />
(7)散布淫秽、色情、赌博、暴力、凶杀、恐怖或者教唆犯罪的;<br />
(8)侮辱或者诽谤他人,侵害他人合法权利的;<br />
(9)含有虚假、有害、胁迫、侵害他人隐私、骚扰、侵害、中伤、粗俗、猥亵或其它道德上令人反感的内容;<br />
(10)危害社会公德或者民族优秀文化传统的;<br />
(11)含有中国法律、法规、规章、条例以及任何具有法律效力之规范所限制或禁止的其它内容的。
</p>
<p>3.1.2 不得利用昇科能源客户端提供的服务从事危害计算机信息网络安全的活动</p>
<p>
(1)未经允许,进入计算机信息网络或者使用计算机信息网络资源;<br />
(2)未经允许,对计算机信息网络功能进行删除、修改或者增加;<br />
(3)未经允许,对进入计算机信息网络中存储、处理或者传输的数据和应用程序进行删除、修改或者增加;<br />
(4)故意制作、传播计算机病毒等破坏性程序;<br />
(5)盗窃他人用户账号信息,非法牟利;<br />
(6)其他危害计算机信息网络安全的行为。<br />
</p>
<p>3.1.3 不得为任何非法目的而使用网络服务系统。</p>
<p>
3.2
您不得使用未经我们授权的任何插件、外挂或第三方工具对昇科能源客户端提供的服务进行干扰、破坏、修改或施加其他影响。您不得使用存在可能破坏、篡改、删除、影响昇科能源客户端系统正常运行或未经授权秘密获取昇科能源客户端及其他用户的数据、个人资料的病毒、木马、爬虫等恶意软件、程序代码。
</p>
<p>
3.3
您不得对昇科能源客户端进行修改、复制、发布、传输、公开展示、展览、播放、翻制、翻译、发行、出版、授权、从其创建衍生产品、转让、出售、逆向工程、反编译,或试图从昇科能源客户端或其任何部分提取源代码或获取原始数据。
</p>
<p>
3.4
除非另有说明,昇科能源客户端的服务只适用于非商业用途。对于从服务取得的任何信息、软件、产品或服务,您不得对其修改、复制、分发、传送、显示、执行、复制、公布、许可、转让、销售或基于以上内容创建衍生作品。
</p>
<p class="bold">四、服务内容</p>
<p>4.1 昇科能源客户端的具体内容由昇科能源根据实际情况提供。</p>
<p>
4.2
除非本服务协议另有其他明示规定,昇科能源客户端推出的新产品、新功能、新服务,均受到本服务协议之规范。
</p>
<p>
4.3
昇科能源客户端将按照本协议及相关操作规程为您提供相应的用户服务并保证其所提供服务的合法性。
</p>
<p>
4.4
昇科能源仅提供网络服务,与网络服务有关的通信设备(如电脑、调制解调器及其他与接入互联网有关的装置)及通信服务所需的费用(如为接入互联网而支付的电话费及宽带费)由用户自行承担。
</p>
<p>
4.5
昇科能源将定期或不定期地对提供网络服务的平台或相关的设备进行检修或者维护,您知悉并同意因此类情况而造成的网络服务(包括收费网络服务)在合理时间内的中断,本平台无需为此承担任何责任,且昇科能源无需事先通知用户,有权为维修、保养、升级或其它目的而暂停任何服务。
</p>
<p>
4.6
您明确同意在使用本平台网络服务过程中产生的风险将完全由其自己承担。确认由您独立做出下载或通过本平台服务取得信息资料的行为,并愿意承担可能发生的系统受损、资料丢失以及其他任何风险。
</p>
<p>
4.7
昇科能源有权于任何时间暂时或永久地修改或终止本服务(或其任何部分),而无论其通知与否,本平台对您或任何第三人均无需承担任何责任。
</p>
<p>
4.8
终止服务:您同意昇科能源有权基于其自身之考虑,因任何原因,包含但不限于您长时间未使用,或昇科能源认为您已经违反本服务协议的文字及精神,终止您的密码、账号或本服务之使用(或服务之任何部分),并将您在本服务内任何内容加以移除并删除。您同意依本服务协议规定而提供之服务,昇科能源无需进行事先通知即可中断或终止;您承认并同意,昇科能源可随时关闭或删除您的账号及您账号中所有相关信息及文件,或禁止您继续使用前述文件或本服务。此外,您同意出现本服务之使用被中断、终止或您的账号及相关信息和文件被关闭、删除的情形,昇科能源对您或任何第三人均不承担任何责任。
</p>
<p class="bold">五、知识产权和其他合法权益(包括但不限于名誉权、商誉权)</p>
<p>
5.1
昇科能源拥有本平台的著作权、商标权、商业秘密以及其他相关的知识产权,包括但不限于各种数据库、网站设计、文档资料、软件、照片、商标、FLASH、设计、图案、音像、摄影、动画、美术及其前述组合等,软件编译、相关源代码和软件
(包括伏龙AI平台程序和脚本) 等。其它本协议中未经提及的权利亦由昇科能源保留。
</p>
<p>
5.2
昇科能源及相关标识均属于昇科能源的知识产权,并受到著作权法,商标法和其它知识产权法律的保护,未经授权地复制,模仿,使用或发布上述标识,均被禁止。
</p>
<p>
5.3
未经昇科能源事先书面同意,用户不得为任何营利性或非营利性的目的自行实施、利用、转让或许可任何第三方实施、利用、转让上述知识产权。
</p>
<p class="bold">六、用户内容</p>
<p>
6.1
您声明并保证,您对您通过昇科能源客户端上传的或通过昇科能源客户端张贴、发表、发布或以其他方式向公众或其他用户可访问的界面内提供的任何信息,包括但不限于数据、文字、文本、声音、图片、图像、图表、图形、视频、音频、或说明等信息(统称为“用户内容”),符合法律法规,并拥有相应的、合法的权利、许可或授权。否则,本公司可以对您提供的信息依法进行删除或屏蔽,并视行为情节对违规行为处以包括但不限于警告、限制功能、暂停更新或禁止使用部分或全部功能直至注销账号的处罚,保存记录并向主管部门报告。
</p>
<p>
6.2
对于您通过昇科能源客户端提供的用户内容,您同意授予本公司一项永久的、全球范围的、免许可费的、可转让的、可分许可的、不可撤销的、非排他性的使用许可,以允许本公司(以及其关联公司、第三方顾问、咨询或服务机构等合作伙伴)使用、持有、存储、传输、复制、修改、创建衍生作品、传播、发行、出版、公开演示、公开展示、分发、授予分许可或以其他任何已知或以后产生的合法的方式使用。
</p>
<p>
6.3
本协议属于《中华人民共和国著作权法》第二十五条规定的书面协议,其效力及于您在昇科能源客户端发布的任何受著作权法保护的作品内容,无论该内容形成于本协议签订前还是本协议签订后。请勿在昇科能源客户端上发布您无权使用或需保留著作权的信息材料,对此昇科能源客户端将不再进行通知,因此而产生的侵权责任或权利纠纷,本公司将不承担相关责任。
</p>
<p class="bold">七、违约处理及赔偿责任</p>
<p>
7.1
如果您在使用昇科能源客户端时违反法律、法规的相关规定,或者违反使用协议,我们有权根据您的行为性质,采取包括但不限于:删除发布的信息内容、限制您对我们服务的使用、暂停使用许可、终止服务、注销昇科能源客户端账号、追究法律责任等措施。同时,我们将会协助相关部门开展调查活动。
</p>
<p>
7.2
您须对自己在使用昇科能源客户端服务过程中的行为承担法律责任。您承担法律责任的形式包含但不限于:直接对受到侵害者进行赔偿,以及在本公司或本公司的关联公司因您的行为遭受行政处罚或导致侵权损害赔偿后,给予本公司或本公司的关联公司等额的赔偿。
7.3
因您违反本协议或相关服务条款的规定,导致或产生的任何第三方主张的索赔、要求或损失,包括合理的律师费在内,您同意对本公司、本公司的关联公司及本公司的合作伙伴作出赔偿,并使之免受损害。
</p>
<p class="bold">八、服务及协议的中断、终止</p>
<p>
8.1
本公司有权根据业务需要等原因合理变更、中断或终止提供昇科能源客户端服务,无需事先通知。如因本公司相关服务器或系统维护或升级的需要或其他原因而需中断或暂停提供任何昇科能源客户端服务的,本公司将尽可能事先进行通告。除法律法规明确规定要求本公司承担责任之外,本公司无需因变更、中断或终止提供昇科能源客户端或使用条款终止而需向您或任何第三方承担责任。
</p>
<p>8.2 本服务协议于以下任一情形下终止:</p>
<p>
8.2.1
我们有权依据本服务协议约定,收回、注销用户账号,此情形下,本服务协议于账号收回、注销之日终止。
</p>
<p>
8.2.2
您可通过《昇科能源隐私权声明》中提供的方式注销用户账号,本服务协议于账号注销之日终止。您理解并同意,您已认真阅读、认可《昇科能源隐私权声明》,并已了解、同意相关用户注销流程及注销后的权利义务安排。
</p>
<p class="bold">九、本平台链接</p>
<p>
9.1
从本平台链接至昇科能源以外的网站:某些情况下,本平台可能会提供跳转至互联网上的其它页面或网站的链接。此链接将会引您至第三方发行或经营的网站,而该第三方并非昇科能源的合作机构或与昇科能源有任何联系。昇科能源将该链接列入平台内,仅为协助用户浏览和参考之用。昇科能源致力于挑选声誉良好的网站和资料来源,以方便用户。然而,除非昇科能源已经明确声明与该第三方有合作关系,提供链接至此第三方网站或网页,并不视为昇科能源同意、推荐、认可、保证或推介任何第三方或在第三方网站上所提供的任何服务、产品,亦不可视为昇科能源与该第三方及其网站有任何形式的合作。
</p>
<p>
9.2
从其他平台链接至本平台:若您想在第三方的网站以任何形式建立链接至本平台,必须先取得昇科能源的书面同意,昇科能源有权决定是否核准建立此链接。凡从第三方网站建立任何链接至本平台,昇科能源不负责该链接的建立与设置。依此建立的链接,并不构成昇科能源与该第三方网站有任何形式的合作,亦不构成昇科能源对该第三方网站的认同。如因该链接而产生或导致的任何需由您或第三方承担或蒙受的损失或损害,昇科能源不承担任何责任。对于经由昇科能源核准以纯文字格式或任何形式建立的链接,昇科能源保留随时撤销核准的权利,并有权要求清除任何指向本平台的链接。
</p>
<p class="bold">十、免责声明</p>
<p>
昇科能源客户端可能会受到多种因素影响,包括但不限于您的原因、第三方原因、通信网络服务质量、连接故障、网络设备或系统维护、电脑或通讯或其他系统故障、电力故障、公用设施损坏、罢工、暴乱、火灾、洪水、风暴、爆炸、战争、政府行为、司法行政机关的命令、社会环境及其他不可抗力等;也可能受到各种安全问题的侵扰,例如您下载安装的其它软件或访问的其他网站中含有病毒、木马或其他恶意程序,威胁到您的设备和数据安全,进而影响昇科能源客户端的使用等。除法律法规明确规定要求本公司承担责任之外,因本款所述原因给您造成的任何损失由您本人自行承担,本公司对此不承担责任。
</p>
<p class="bold">十一、不可抗力</p>
<p>
如果由于黑客攻击或政府管制或网络通讯瘫痪等用户对其发生和后果不能预见的事件,双方均确认此属不可抗力;双方应按照不可抗力对影响履行本协议的程度,协商决定是否解除本协议、免除履行本协议的部分义务,或者延期履行本协议。
</p>
<p class="bold">十二、法律适用及争议解决</p>
<p>12.1 昇科能源未行使或执行本服务协议所规定的任何权利或规定,不构成对前述权利之放弃。</p>
<p>
12.2
本服务协议中任何一条被视为废止、无效或因任何理由不可执行,该条应视为可分的且并不影响任何其余条款的有效性和可执行性。
</p>
<p>
12.3
本协议的订立、执行和解释及争议的解决均应适用中华人民共和国法律。如遇本协议有关的某一特定事项缺乏明确法律规定,则应参照通用惯例。
</p>
<p>
12.4
如双方就本协议的内容或执行发生争议,双方应友好协商解决。协商不成时,任何一方均可向昇科能源所在地有管辖权的人民法院起诉。
</p>
</div>
</div>
</template>

+ 28
- 22
webapp/src/views/algorithm/components/algorithmForm.vue View File

@@ -1,18 +1,10 @@
/** Copyright 2020 Tianshu AI Platform. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* =============================================================
*/
/** Copyright 2020 Tianshu AI Platform. All Rights Reserved. * * Licensed under the Apache License,
Version 2.0 (the "License"); * you may not use this file except in compliance with the License. *
You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless
required by applicable law or agreed to in writing, software * distributed under the License is
distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied. * See the License for the specific language governing permissions and * limitations under
the License. * ============================================================= */

<template>
<el-form ref="formRef" :model="form" :rules="rules" label-width="100px">
@@ -61,19 +53,19 @@
@change="onAlgorithmUsageChange"
>
<el-option
v-for="item in algorithmUsageList"
:key="item.id"
v-for="(item, ind) in algorithmUsageList"
:key="ind"
:label="item.auxInfo"
:value="item.auxInfo"
>
<span style="float: left;">{{ item.auxInfo }}</span>
<el-button
<!-- <el-button
v-if="!item.isDefault"
class="select-del-btn"
type="text"
@click.stop="delAlgorithmUsage(item)"
><i class="el-icon-close"
/></el-button>
/></el-button> -->
</el-option>
</el-select>
</el-form-item>
@@ -201,7 +193,7 @@ import UploadInline from '@/components/UploadForm/inline';
import UploadProgress from '@/components/UploadProgress';
import RunParamForm from '@/components/Training/runParamForm';
import { useMapGetters } from '@/hooks';
import { algorithmConfig } from '@/config';
import { algorithmConfig, algList } from '@/config';
import {
list as getAlgoUsages,
add as addAlgoUsage,
@@ -246,7 +238,20 @@ export default {
setup(props) {
// 状态
const state = reactive({
algorithmUsageList: [], // 算法用途列表
algorithmUsageList: [
{
auxInfo: '健康状态',
},
{
auxInfo: '安全预警',
},
{
auxInfo: '异常检测',
},
{
auxInfo: '其他',
},
], // 算法用途列表
imageNameList: [], // 镜像名列表
imageTagList: [], // 镜像版本列表
uploading: false, // 上传算法 Loading
@@ -316,7 +321,8 @@ export default {
current: 1,
size: 1000,
}).then((res) => {
state.algorithmUsageList = res.result;
console.log(res, 12312);
// state.algorithmUsageList = res.result;
});
};
const createAlgorithmUsage = async (auxInfo) => {


+ 14
- 16
webapp/src/views/algorithm/index.vue View File

@@ -1,18 +1,10 @@
/** Copyright 2020 Tianshu AI Platform. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* =============================================================
*/
/** Copyright 2020 Tianshu AI Platform. All Rights Reserved. * * Licensed under the Apache License,
Version 2.0 (the "License"); * you may not use this file except in compliance with the License. *
You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless
required by applicable law or agreed to in writing, software * distributed under the License is
distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied. * See the License for the specific language governing permissions and * limitations under
the License. * ============================================================= */

<template>
<div class="app-container">
@@ -42,7 +34,13 @@
<AlgorithmForm ref="form" :form-type="formType" />
</BaseModal>
<!--右边侧边栏-->
<el-drawer :visible.sync="drawer" :with-header="false" :direction="'rtl'" size="36%">
<el-drawer
:visible.sync="drawer"
append-to-body
:with-header="false"
:direction="'rtl'"
size="36%"
>
<algorithm-detail :item="selectedItemObj" />
</el-drawer>
</div>


+ 35
- 1
webapp/src/views/algorithm/utils.js View File

@@ -15,6 +15,7 @@
*/

import { getEmptyFormatter, ALGORITHM_RESOURCE_ENUM } from '@/utils';
import { algList } from '@/config';

export function getColumns({
doEdit,
@@ -26,6 +27,12 @@ export function getColumns({
allAlgorithmUsageList,
isAdmin,
}) {
const data = JSON.parse(JSON.stringify(algList));
data.forEach((item) => {
item.label = item.auxInfo;
item.value = item.id;
});
const dropdownList = data;
const isPreset = active === String(ALGORITHM_RESOURCE_ENUM.PRESET);
return [
{
@@ -47,7 +54,29 @@ export function getColumns({
prop: 'algorithmUsage',
formatter: getEmptyFormatter(),
minWidth: '100px',
dropdownList: allAlgorithmUsageList,
// dropdownList: allAlgorithmUsageList,
dropdownList: [
{
label: '全部',
value: '',
},
{
label: '健康状态',
value: '健康状态',
},
{
label: '安全预警',
value: '安全预警',
},
{
label: '异常检测',
value: '异常检测',
},
{
label: '其他',
value: '其他',
},
],
},
{
label: '是否支持推理',
@@ -83,6 +112,11 @@ export function getColumns({
minWidth: '160px',
sortable: 'custom',
},
{
label: '创建人',
prop: 'originUserId',
hide: !isAdmin,
},
{
label: '操作',
type: 'operation',


+ 14
- 22
webapp/src/views/cloudServing/batch.vue View File

@@ -1,18 +1,10 @@
/** Copyright 2020 Tianshu AI Platform. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* =============================================================
*/
/** Copyright 2020 Tianshu AI Platform. All Rights Reserved. * * Licensed under the Apache License,
Version 2.0 (the "License"); * you may not use this file except in compliance with the License. *
You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless
required by applicable law or agreed to in writing, software * distributed under the License is
distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied. * See the License for the specific language governing permissions and * limitations under
the License. * ============================================================= */

<template>
<div id="cloud-serving-container" class="app-container">
@@ -143,6 +135,12 @@
import { debounce } from 'throttle-debounce';
import { mapActions } from 'vuex';

import CRUD, { presenter, header, crud } from '@crud/crud';
import cdOperation from '@crud/CD.operation';
import rrOperation from '@crud/RR.operation';
import pagination from '@crud/Pagination';
import MsgPopover from '@/components/MsgPopover';
import DropdownHeader from '@/components/DropdownHeader';
import {
list,
start,
@@ -150,12 +148,6 @@ import {
del as deleteServing,
getServiceProgress,
} from '@/api/cloudServing/batch';
import CRUD, { presenter, header, crud } from '@crud/crud';
import DropdownHeader from '@/components/DropdownHeader';
import MsgPopover from '@/components/MsgPopover';
import cdOperation from '@crud/CD.operation';
import rrOperation from '@crud/RR.operation';
import pagination from '@crud/Pagination';
import { downloadZipFromObjectPath, Constant, generateMap } from '@/utils';
import {
SERVING_STATUS_ENUM,
@@ -190,7 +182,7 @@ export default {
time: 0,
props: {
optText: {
add: '创建批量服务',
add: '创建SDK服务',
},
},
});


+ 7
- 15
webapp/src/views/cloudServing/components/forms/batchServingForm.vue View File

@@ -1,18 +1,10 @@
/** Copyright 2020 Tianshu AI Platform. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* =============================================================
*/
/** Copyright 2020 Tianshu AI Platform. All Rights Reserved. * * Licensed under the Apache License,
Version 2.0 (the "License"); * you may not use this file except in compliance with the License. *
You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless
required by applicable law or agreed to in writing, software * distributed under the License is
distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied. * See the License for the specific language governing permissions and * limitations under
the License. * ============================================================= */

<template>
<el-form ref="form" :model="form" :rules="rules" label-width="120px" class="model-config-wrapper">


+ 11
- 19
webapp/src/views/cloudServing/index.vue View File

@@ -1,18 +1,10 @@
/** Copyright 2020 Tianshu AI Platform. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* =============================================================
*/
/** Copyright 2020 Tianshu AI Platform. All Rights Reserved. * * Licensed under the Apache License,
Version 2.0 (the "License"); * you may not use this file except in compliance with the License. *
You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless
required by applicable law or agreed to in writing, software * distributed under the License is
distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied. * See the License for the specific language governing permissions and * limitations under
the License. * ============================================================= */

<template>
<div id="cloud-serving-container" class="app-container">
@@ -163,13 +155,13 @@
import { debounce } from 'throttle-debounce';
import { mapActions } from 'vuex';

import { list, start, stop, del as deleteServing } from '@/api/cloudServing';
import CRUD, { presenter, header, crud } from '@crud/crud';
import DropdownHeader from '@/components/DropdownHeader';
import MsgPopover from '@/components/MsgPopover';
import cdOperation from '@crud/CD.operation';
import rrOperation from '@crud/RR.operation';
import pagination from '@crud/Pagination';
import MsgPopover from '@/components/MsgPopover';
import DropdownHeader from '@/components/DropdownHeader';
import { list, start, stop, del as deleteServing } from '@/api/cloudServing';

import { Constant, generateMap } from '@/utils';

@@ -207,7 +199,7 @@ export default {
time: 0,
props: {
optText: {
add: '创建在线服务',
add: '创建API服务',
},
},
});


+ 7
- 15
webapp/src/views/dashboard/components/CardPanel.vue View File

@@ -1,18 +1,10 @@
/** Copyright 2020 Tianshu AI Platform. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* =============================================================
*/
/** Copyright 2020 Tianshu AI Platform. All Rights Reserved. * * Licensed under the Apache License,
Version 2.0 (the "License"); * you may not use this file except in compliance with the License. *
You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless
required by applicable law or agreed to in writing, software * distributed under the License is
distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied. * See the License for the specific language governing permissions and * limitations under
the License. * ============================================================= */

<template>
<div class="card-panel">


+ 26
- 26
webapp/src/views/dashboard/components/Welcome.vue View File

@@ -1,26 +1,20 @@
/** Copyright 2020 Tianshu AI Platform. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* =============================================================
*/
/** Copyright 2020 Tianshu AI Platform. All Rights Reserved. * * Licensed under the Apache License,
Version 2.0 (the "License"); * you may not use this file except in compliance with the License. *
You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless
required by applicable law or agreed to in writing, software * distributed under the License is
distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied. * See the License for the specific language governing permissions and * limitations under
the License. * ============================================================= */

<template>
<el-card class="welcome" shadow="never">
<div class="welcome-title">欢迎体验天枢一站式 AI 模型开发平台</div>
<div class="welcome-title">
欢迎体验伏龙AI平台
<el-button type="primary" style="margin-left:12px" @click="handleClick">使用手册</el-button>
</div>
<div class="welcome-desc">
天枢一站式 AI 模型开发平台(简称:一站式开发平台)面向 AI
模型生产的生命周期,提供了包括数据处理(数据集管理、智能标注和数据增强)、算法开发、模型训练和模型管理等功能,方便用户一站式构建
AI 算法。
伏龙AI平台(简称伏龙平台)面向 AI
模型生产的生命周期,提供了数据处理(数据集管理、数据清洗、数据集成)、模型开发、模型训练和模型管理等功能,方便用户一站式构建电池AI算法;同时为开发者提供一系列昇科自主研发的电池安全监测与预警算法。
</div>
<div class="welcome-title">产品优势</div>
<el-row class="card-row">
@@ -29,34 +23,35 @@
<img class="card-panel-img" src="@/assets/images/dashboard/advantage-1.png" alt="" />
<div class="card-panel-title">一站式开发</div>
<div class="card-panel-desc">
为用户提供一站式深度学习开发功能,通过智能数据处理、便利的算法开发和模型训练,打通深度学习全链路。
为用户提供一站式 AI
模型开发功能,通过智能数据处理、模型开发和模型训练,打通深度学习全链路。
</div>
</div>
</el-col>
<el-col :xs="12" :sm="12" :lg="6" class="card-col">
<div class="card-panel">
<img class="card-panel-img" src="@/assets/images/dashboard/advantage-2.png" alt="" />
<div class="card-panel-title">集成先进算法</div>
<div class="card-panel-title">算法先进</div>
<div class="card-panel-desc">
除了囊括常规AI算法外,一站式开发平台还集成了多领域的独家算法,提供业界领先性能
平台集成了一系列昇科自主研发的动力电池安全算法,包括电池组评价、估计和各类安全监测预警算法
</div>
</div>
</el-col>
<el-col :xs="12" :sm="12" :lg="6" class="card-col">
<div class="card-panel">
<img class="card-panel-img" src="@/assets/images/dashboard/advantage-3.png" alt="" />
<div class="card-panel-title">灵活易用</div>
<div class="card-panel-title">安全稳定</div>
<div class="card-panel-desc">
除了一站式深度学习开发平台,亦提供可视化和动静结合编码方式,调试灵活,小白亦可快速上手
拥有世界顶尖的科学家顾问和研发团队,拥有大量不同类型电池的数据经验,20+新能源企业合作验证
</div>
</div>
</el-col>
<el-col :xs="12" :sm="12" :lg="6" class="card-col">
<div class="card-panel">
<img class="card-panel-img" src="@/assets/images/dashboard/advantage-4.png" alt="" />
<div class="card-panel-title">性能优越</div>
<div class="card-panel-title">接入便捷</div>
<div class="card-panel-desc">
集成自主研发的分布式训练平台,提供高性能的分布式计算体验,节省训练成本和训练时间
支持联网授权与离线授权两种 SDK 授权模式,可提供私有化部署、服务端SDK集成等产品服务
</div>
</div>
</el-col>
@@ -67,6 +62,11 @@
<script>
export default {
name: 'Welcome',
methods: {
handleClick () {
window.open("https://docs.vloong.thinkenergy.tech")
}
}
};
</script>



+ 85
- 75
webapp/src/views/dashboard/dashboard.vue View File

@@ -1,82 +1,83 @@
/** Copyright 2020 Tianshu AI Platform. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* =============================================================
*/
/** Copyright 2020 Tianshu AI Platform. All Rights Reserved. * * Licensed under the Apache License,
Version 2.0 (the "License"); * you may not use this file except in compliance with the License. *
You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless
required by applicable law or agreed to in writing, software * distributed under the License is
distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied. * See the License for the specific language governing permissions and * limitations under
the License. * ============================================================= */

<template>
<div class="dashboard-container">
<welcome />
<template v-if="show.data">
<div class="section-title">数据管理</div>
<el-card class="section-card" shadow="hover">
<div class="card-head">
<div class="card-head-title">数据集</div>
<el-button class="card-head-button" type="primary" @click="goTo('/data/datasets')"
>进入项目</el-button
>
</div>
<el-row>
<el-col :xs="12" :sm="12" :lg="6">
<CardPanel icon="shuju1" name="我的数据集" :value="privateCount" />
</el-col>
<el-col :xs="12" :sm="12" :lg="6">
<CardPanel icon="shujumoxing" name="预置数据集" :value="publicCount" />
</el-col>
</el-row>
</el-card>
</template>
<template v-if="show.development">
<div class="section-title">算法开发</div>
<el-card class="section-card" shadow="hover">
<div class="card-head">
<div class="card-head-title">编码式建模</div>
<el-button class="card-head-button" type="primary" @click="goTo('/development/notebook')"
>进入项目</el-button
>
</div>
<el-row>
<el-col :xs="12" :sm="12" :lg="6">
<CardPanel icon="zongshili" name="总实例" :value="notebookCount + algorithmCount" />
</el-col>
<el-col :xs="12" :sm="12" :lg="6">
<CardPanel icon="yunhangzhong" name="在建算法数" :value="notebookCount" />
</el-col>
<el-col :xs="12" :sm="12" :lg="6">
<CardPanel icon="moxingzongshu" name="算法总数" :value="algorithmCount" />
</el-col>
</el-row>
</el-card>
</template>
<template v-if="show.training">
<div class="section-title">训练任务</div>
<el-card class="section-card" shadow="hover">
<div class="card-head">
<div class="card-head-title">任务详情</div>
<el-button class="card-head-button" type="primary" @click="goTo('/training/job')"
>进入项目</el-button
>
</div>
<el-row>
<el-col :xs="12" :sm="12" :lg="6">
<CardPanel icon="zongshiyanbeifen" name="运行中任务" :value="runJobCount" />
</el-col>
<el-col :xs="12" :sm="12" :lg="6">
<CardPanel icon="jinhangzhongshiyanbeifen" name="已完成任务" :value="finishJobCount" />
</el-col>
</el-row>
</el-card>
</template>
<div class="content-card">
<div v-if="show.data">
<div class="section-title">数据管理</div>
<el-card class="section-card" shadow="hover">
<div class="card-head">
<div class="card-head-title">数据集</div>
<el-button class="card-head-button" type="primary" @click="goTo('/data/datasets')"
>进入项目</el-button
>
</div>
<el-row>
<el-col>
<CardPanel icon="shuju1" name="我的数据集" :value="privateCount" />
</el-col>
<el-col>
<CardPanel icon="shujumoxing" name="预置数据集" :value="publicCount" />
</el-col>
</el-row>
</el-card>
</div>
<div v-if="show.development">
<div class="section-title">算法开发</div>
<el-card class="section-card" shadow="hover">
<div class="card-head">
<div class="card-head-title">编码式建模</div>
<el-button
class="card-head-button"
type="primary"
@click="goTo('/development/algorithm')"
>进入项目</el-button
>
</div>
<el-row>
<el-col>
<CardPanel icon="zongshili" name="总实例" :value="notebookCount + algorithmCount" />
</el-col>
<el-col>
<CardPanel icon="yunhangzhong" name="在建算法数" :value="notebookCount" />
</el-col>
<el-col>
<CardPanel icon="moxingzongshu" name="算法总数" :value="algorithmCount" />
</el-col>
</el-row>
</el-card>
</div>
<div v-if="show.training">
<div class="section-title">训练任务</div>
<el-card class="section-card" shadow="hover">
<div class="card-head">
<div class="card-head-title">任务详情</div>
<el-button class="card-head-button" type="primary" @click="goTo('/training/job')"
>进入项目</el-button
>
</div>
<el-row>
<el-col>
<CardPanel icon="zongshiyanbeifen" name="运行中任务" :value="runJobCount" />
</el-col>
<el-col>
<CardPanel
icon="jinhangzhongshiyanbeifen"
name="已完成任务"
:value="finishJobCount"
/>
</el-col>
</el-row>
</el-card>
</div>
</div>
</div>
</template>

@@ -164,6 +165,14 @@ export default {
.dashboard-container {
padding: 24px;
color: #666;
.content-card {
display: flex;
justify-content: space-between;

> div {
width: 32%;
}
}

.section-title {
height: 24px;
@@ -176,6 +185,7 @@ export default {

.section-card {
padding: 4px;
height: 324px;

&:last-child {
margin-bottom: 34px;


+ 10
- 17
webapp/src/views/dataset/components/tenant/index.vue View File

@@ -1,21 +1,14 @@
/** Copyright 2020 Tianshu AI Platform. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* =============================================================
*/
/** Copyright 2020 Tianshu AI Platform. All Rights Reserved. * * Licensed under the Apache License,
Version 2.0 (the "License"); * you may not use this file except in compliance with the License. *
You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless
required by applicable law or agreed to in writing, software * distributed under the License is
distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied. * See the License for the specific language governing permissions and * limitations under
the License. * ============================================================= */

<template>
<el-dropdown trigger="click" placement="bottom-start" @command="onCommand">
<div></div>
<!-- <el-dropdown trigger="click" placement="bottom-start" @command="onCommand">
<div>
<span>切换场景</span>
<i class="el-icon-arrow-down el-icon--right" />
@@ -28,7 +21,7 @@
>医学影像</el-dropdown-item
>
</el-dropdown-menu>
</el-dropdown>
</el-dropdown> -->
</template>

<script>


+ 5
- 1
webapp/src/views/dataset/custom/index.vue View File

@@ -21,7 +21,7 @@
<div class="custom-tab dib">
{{ countInfoTxt }}
</div>
<div v-if="state.selections.length > 0" class="mb-10">
<div v-if="state.selections.length > 0 && isAdmin" class="mb-10">
<InfoAlert>
<div class="flex flex-between">
<div>已选 {{ state.selections.length }} 项</div>
@@ -205,6 +205,7 @@ import UploadInline from '@/components/UploadForm/inline';
import { minioBaseUrl } from '@/utils/minIO';
import { getCustomFileList } from '@/api/preparation/datafile';

import { mapGetters } from 'vuex';
import { getFileType, getIcon } from '../util';
import GridTable from './GridTable';

@@ -575,6 +576,9 @@ export default {
getIcon,
};
},
computed: {
...mapGetters(['user', 'isAdmin']),
},
};
</script>



+ 19
- 32
webapp/src/views/dataset/entrance.vue View File

@@ -1,18 +1,10 @@
/** Copyright 2020 Tianshu AI Platform. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* =============================================================
*/
/** Copyright 2020 Tianshu AI Platform. All Rights Reserved. * * Licensed under the Apache License,
Version 2.0 (the "License"); * you may not use this file except in compliance with the License. *
You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless
required by applicable law or agreed to in writing, software * distributed under the License is
distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied. * See the License for the specific language governing permissions and * limitations under
the License. * ============================================================= */

<template>
<div class="flex flex-center flex-col entry-wrapper">
@@ -21,31 +13,25 @@
:class="['radio-label', state.entrance === 0 ? 'border-chosen' : 'border']"
@click="changeRadio(0)"
>
<img src="@/assets/images/dataset/normalDataset.png" width="50%" />
<div class="mb-20 mt-20 bold">
视觉/语音/文本
</div>
<div class="tl">
针对图像、视频、语音、文本及自定义格式的数据标注,涵常规深度学习领域场景
</div>
<img src="@/assets/images/dataset/tu1.png" width="50%" />
<!-- <div class="mb-20 mt-20 bold">视觉/语音/文本</div>
<div class="tl">针对图像、视频、语音、文本及自定义格式的数据标注,涵常规深度学习领域场景</div>-->
<div class="mb-20 mt-20 bold">车端数据/桩端数据/实验数据</div>
<div class="tl">针对新能源汽车全过程数据,涵盖健康监测、异常检测及预警场景</div>
</div>
<div
:class="['radio-label', state.entrance === 1 ? 'border-chosen' : 'border']"
@click="changeRadio(1)"
>
<img src="@/assets/images/dataset/medicalDataset.png" width="50%" />
<div class="mb-20 mt-20 bold">
医学影像
</div>
<div class="tl">
针对医学影像 dcm 格式文件的数据标注,目前支持器官分割和病灶识别场景
</div>
<img src="@/assets/images/dataset/tu2.png" width="50%" />
<!-- <div class="mb-20 mt-20 bold">医学影像</div>
<div class="tl">针对医学影像 dcm 格式文件的数据标注,目前支持器官分割和病灶识别场景</div>-->
<div class="mb-20 mt-20 bold">故障识别(即将上线)</div>
<div class="tl">针对生产及售后数据,涵盖故障分析、故障溯源等场景</div>
</div>
</div>
<div class="tc">
<el-button type="primary" @click="handleNext">
下一步
</el-button>
<el-button type="primary" @click="handleNext">下一步</el-button>
</div>
</div>
</template>
@@ -71,6 +57,7 @@ export default {
});

const changeRadio = (val) => {
if (val === 1) return;
state.entrance = val;
};



+ 23
- 2
webapp/src/views/dataset/list/action.js View File

@@ -42,6 +42,8 @@ export default {
topDataset: Function,
editDataset: Function,
checkImport: Function, // 查询外部数据集导入状态
doConvert: Function,
isAdmin: Boolean,
},
render(h, { data, props }) {
const {
@@ -56,6 +58,8 @@ export default {
topDataset,
editDataset,
checkImport,
doConvert,
isAdmin,
} = props;
const columnProps = {
...data,
@@ -70,7 +74,7 @@ export default {
<br />
详见
<a
href={`${process.env.VUE_APP_DOCS_URL}module/dataset/intro`}
href="https://docs.vloong.thinkenergy.tech/"
class="primary"
target="_blank"
>
@@ -320,7 +324,8 @@ export default {
);

// 导入外部数据集
const showImportButton = row.import === true && isIncludeStatus(row, ['UNANNOTATED']);
// const showImportButton = row.import === true && isIncludeStatus(row, ['UNANNOTATED']);
const showImportButton = false;

// 外部导入数据集
const importDatasetButton = showImportButton ? (
@@ -336,6 +341,20 @@ export default {
</a>
) : null;

let showConvert = true;
const convertButton = (
<el-button {...btnProps} onClick={() => doConvert(row)}>
设为预置
</el-button>
);

// 非管理员账号,设为预置不可见不可操作
if (showConvert) {
if (!isAdmin) {
showConvert = false;
}
}

// 数据集版本发布或者切换中 只允许置顶 修改 历史版本,查看标注置灰
if (isPublishDataset(row)) {
showPublishButton = false;
@@ -364,6 +383,7 @@ export default {
showAugmentButton = false;
showTopButton = false;
showEditButton = false;
showConvert = false;
}
// 脚本导入的数据集只允许删除 置顶 修改操作
if (row.import) {
@@ -459,6 +479,7 @@ export default {
{showCheckButton && checkButton}
{showAutoButton && autoButton}
{showTrackButton && trackButton}
{showConvert && convertButton}
{moreButton}
</span>
);


+ 81
- 67
webapp/src/views/dataset/list/create-dataset.vue View File

@@ -1,18 +1,10 @@
/** Copyright 2020 Tianshu AI Platform. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* =============================================================
*/
/** Copyright 2020 Tianshu AI Platform. All Rights Reserved. * * Licensed under the Apache License,
Version 2.0 (the "License"); * you may not use this file except in compliance with the License. *
You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless
required by applicable law or agreed to in writing, software * distributed under the License is
distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied. * See the License for the specific language governing permissions and * limitations under
the License. * ============================================================= */

<template>
<BaseModal
@@ -28,7 +20,7 @@
<el-form-item label="数据集名称" prop="name">
<el-input v-model="state.form.name" placeholder="数据集名称不能超过50字" maxlength="50" />
</el-form-item>
<el-form-item label="数据类型" prop="dataType">
<!-- <el-form-item label="数据类型" prop="dataType">
<InfoRadio
v-model="state.form.dataType"
:dataSource="dataTypeList"
@@ -36,12 +28,9 @@
type="button"
@change="handleDataTypeChange"
/>
</el-form-item>
<el-form-item label="模型类型" prop="annotateType">
<div
v-if="state.form.dataType !== dataTypeCodeMap.CUSTOM"
class="image-select flex flex-wrap"
>
</el-form-item> -->
<el-form-item label="数据类型" prop="annotateType">
<div v-if="false" class="image-select flex flex-wrap">
<div
v-for="item in annotationList"
:key="item.code"
@@ -61,8 +50,8 @@
@change="(val) => selectCustomAnnotationType(val)"
>
<el-option
v-for="item in allAnnotationList"
:key="item.value"
v-for="(item, index) in allAnnotationList"
:key="index"
:label="item.label"
:value="item.value"
/>
@@ -71,12 +60,12 @@
<el-input :value="state.form.annotateType" class="dn" />
</el-form-item>
<div style="position: relative; top: -10px; margin-left: 100px;">
更多标注类型说明参考<a
更多数据类型说明参考<a
target="_blank"
type="primary"
:underline="false"
class="primary"
:href="`${VUE_APP_DOCS_URL}module/dataset/intro`"
href="http://docs.vloong.thinkenergy.tech"
>官方文档</a
>
</div>
@@ -86,7 +75,7 @@
clearable
placeholder="标签组"
:options="labelGroupOptions"
:props="{ expandTrigger: 'hover' }"
:props="{ expandTrigger: 'hover', multiple: true }"
:show-all-levels="false"
filterable
popper-class="group-cascader"
@@ -107,21 +96,21 @@
<span>页面创建</span>
</div>
</el-cascader>
<div style="position: relative; top: -33px; right: 30px; float: right;">
<!--<div style="position: relative; top: -33px; right: 30px; float: right;">
<el-link
v-if="state.form.labelGroupId !== null"
v-if="state.form.labelGroupIds !== null"
target="_blank"
type="primary"
:underline="false"
class="vm"
:href="`/data/labelgroup/detail?id=${state.form.labelGroupId}`"
:href="`/data/labelgroup/detail?id=${state.form.labelGroupIds}`"
>
查看详情
</el-link>
</div>
</div>-->
</el-form-item>
<div
v-if="state.form.labelGroupId === null && showlabelGroup"
v-if="state.form.labelGroupIds === null && showlabelGroup"
style="position: relative; top: -10px; margin-left: 100px;"
>
<span>标签组需要在</span>
@@ -168,8 +157,9 @@ import InfoRadio from '@/components/InfoRadio';
import { isEmptyValue } from '@/utils';
import { validateName } from '@/utils/validate';

import { getLabelGroupList } from '@/api/preparation/labelGroup';
import { getLabelGroupTreeList } from '@/api/preparation/labelGroup';
import { add } from '@/api/preparation/dataset';
import { typeList } from '@/config/index';

const annotationByDataType = annotationBy('dataType');

@@ -202,10 +192,10 @@ export default {
const { toggleVisible, onResetFresh } = props;
const initialForm = {
name: '',
dataType: 0,
annotateType: 2,
dataType: 100,
annotateType: 102,
labelGroup: null,
labelGroupId: null,
labelGroupIds: null,
remark: '',
type: 0,
};
@@ -231,7 +221,7 @@ export default {
formKey: 1,
visible: props.visible,
loading: false, // 数据集创建进行中
customAnnotationType: null,
customAnnotationType: 102,
});

const labelGroupOptions = ref(initialLabelGroupOptions);
@@ -246,15 +236,17 @@ export default {
{ validator: validateName, trigger: ['change', 'blur'] },
],
dataType: [{ required: true, message: '请选择数据类型', trigger: 'change' }],
annotateType: [{ required: true, message: '请选择标注类型', trigger: 'change' }],
labelGroup: [{ required: true, message: '请选择标签组', trigger: 'change' }],
annotateType: [{ required: true, message: '请选择数据类型', trigger: 'change' }],
// labelGroup: [{ required: true, message: '请选择标签组', trigger: 'change' }],
};

// 是否展示标签组
const showlabelGroup = computed(
() =>
enableLabelGroup(state.form.annotateType) && state.form.dataType !== dataTypeCodeMap.CUSTOM
);
// const showlabelGroup = computed(
// () =>
// enableLabelGroup(state.form.annotateType) && state.form.dataType !== dataTypeCodeMap.CUSTOM
// );

const showlabelGroup = true;

const setForm = (params) =>
Object.assign(state, {
@@ -272,10 +264,10 @@ export default {
Object.assign(state, {
form: {
name: '',
dataType: 0,
annotateType: 2,
dataType: 100,
annotateType: 102,
labelGroup: null,
labelGroupId: null,
labelGroupIds: null,
remark: '',
type: 0,
},
@@ -288,13 +280,14 @@ export default {

const annotationList = computed(() => annotationByDataType(state.form.dataType));

const allAnnotationList = computed(() => {
return Object.keys(annotationMap).map((d) => ({
label: annotationMap[d].name,
value: annotationMap[d].code,
code: annotationMap[d].code,
}));
});
// const allAnnotationList = computed(() => {
// return Object.keys(annotationMap).map((d) => ({
// label: annotationMap[d].name,
// value: annotationMap[d].code,
// code: annotationMap[d].code,
// }));
// });
const allAnnotationList = typeList;

const transformOptions = (list) => {
return list.map((d) => ({
@@ -305,7 +298,7 @@ export default {
};

// eslint-disable-next-line
const getImgUrl = item => {
const getImgUrl = (item) => {
try {
// eslint-disable-next-line
return require(`@/assets/images/dataset/${imageNameMap[item.type]}`);
@@ -320,14 +313,14 @@ export default {
});

// 构建标签组信息
const buildLabelOptions = (data) =>
/* const buildLabelOptions = (data) =>
data.map((d) => ({
value: d.id,
label: d.name,
disabled: false,
}));
})); */

const updateLabelGroup = () => {
/* const updateLabelGroup = () => {
const { dataType, annotateType } = state.form || {};
if (!isEmptyValue(dataType) && !isEmptyValue(annotateType)) {
// 遍历两层
@@ -338,6 +331,16 @@ export default {
});
});
}
}; */

const updateLabelGroup = () => {
// 遍历两层
[0, 1].forEach((d) => {
getLabelGroupTreeList({ type: d }).then((res) => {
// const options = buildLabelOptions(res);
updateLabelGroupOptions(d, 'children', res);
});
});
};

const selectAnnotationType = (item) => {
@@ -345,9 +348,9 @@ export default {
setForm({
annotateType: item.code,
labelGroup: null,
labelGroupId: null,
labelGroupIds: null,
});
updateLabelGroup();
// updateLabelGroup();
};

const selectCustomAnnotationType = (val) => {
@@ -360,17 +363,24 @@ export default {
setForm({
annotateType: annotationList.value[0].code,
labelGroup: null,
labelGroupId: null,
labelGroupIds: null,
});
}
updateLabelGroup();
// updateLabelGroup();
};

const handleGroupChange = (val) => {
if (val.length === 0) {
setForm({ labelGroup: null, labelGroupId: null });
setForm({ labelGroup: null, labelGroupIds: null });
} else {
setForm({ labelGroup: val, labelGroupId: val[1] });
// setForm({ labelGroup: val, labelGroupId: val[1] });
const thisLabelGroupIds = [];
for (let i = 0; i < val.length; i += 1) {
if (val[i][2]) {
thisLabelGroupIds.push(val[i][2]);
}
}
setForm({ labelGroup: val, labelGroupIds: thisLabelGroupIds });
}
};

@@ -380,10 +390,10 @@ export default {
// reactive mutate 原始对象
form: {
name: '',
dataType: 0,
annotateType: 2,
dataType: 100,
annotateType: 102,
labelGroup: null,
labelGroupId: null,
labelGroupIds: null,
remark: '',
type: 0,
},
@@ -418,13 +428,17 @@ export default {
Object.assign(state, {
visible: next,
});
if (next) {
// 初始化标签组
updateLabelGroup();
}
}
);

onMounted(() => {
annotationList.value.forEach((item) => getImgUrl(item));
// 初始化标签组
updateLabelGroup();
// updateLabelGroup();
});

return {


+ 60
- 58
webapp/src/views/dataset/list/edit-dataset.vue View File

@@ -1,18 +1,10 @@
/** Copyright 2020 Tianshu AI Platform. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* =============================================================
*/
/** Copyright 2020 Tianshu AI Platform. All Rights Reserved. * * Licensed under the Apache License,
Version 2.0 (the "License"); * you may not use this file except in compliance with the License. *
You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless
required by applicable law or agreed to in writing, software * distributed under the License is
distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied. * See the License for the specific language governing permissions and * limitations under
the License. * ============================================================= */

<template>
<BaseModal
@@ -34,24 +26,24 @@
disabled
/>
</el-form-item>
<el-form-item label="数据类型" prop="dataType">
<!-- <el-form-item label="数据类型" prop="dataType">
<InfoSelect
v-model="state.model.dataType"
placeholder="数据类型"
:dataSource="dataTypeList"
disabled
/>
</el-form-item>
</el-form-item> -->
<el-form-item v-if="showlabelGroup" label="标签组" style="height: 32px;">
<div v-if="editable">
<div>
<el-cascader
v-model="state.chosenGroup"
placeholder="标签组"
:options="state.labelGroupOptions"
:props="{ expandTrigger: 'hover' }"
:props="{ expandTrigger: 'hover', multiple: true }"
:show-all-levels="false"
filterable
:clearable="deletable"
clearable
popper-class="group-cascader"
style="width: 100%; line-height: 32px;"
@change="handleGroupChange"
@@ -70,7 +62,7 @@
<span>页面创建</span>
</div>
</el-cascader>
<div style="position: relative; top: -33px; right: 30px; float: right;">
<!--<div style="position: relative; top: -33px; right: 30px; float: right;">
<el-link
v-if="state.chosenGroupId !== null"
target="_blank"
@@ -81,9 +73,9 @@
>
查看详情
</el-link>
</div>
</div>-->
</div>
<div v-else class="label-input" style="color: #c0c4cc; background-color: #f5f7fa;">
<!--<div v-else class="label-input" style="color: #c0c4cc; background-color: #f5f7fa;">
&nbsp;&nbsp;&nbsp;&nbsp;{{ state.model.labelGroupName }}
<el-link
v-if="state.model.labelGroupId !== null"
@@ -96,7 +88,7 @@
>
查看详情
</el-link>
</div>
</div>-->
</el-form-item>
<div
v-if="state.chosenGroupId === null && showlabelGroup"
@@ -141,7 +133,7 @@ import {
isIncludeStatus,
enableLabelGroup,
} from '@/views/dataset/util';
import { getLabelGroupList } from '@/api/preparation/labelGroup';
import { getLabelGroupTreeList } from '@/api/preparation/labelGroup';

export default {
name: 'EditDataset',
@@ -201,9 +193,9 @@ export default {
],
});

const deletable = computed(() => {
/* const deletable = computed(() => {
return isNil(props.row.labelGroupId);
});
}); */

const dataTypeList = computed(() => {
return Object.keys(dataTypeMap).map((d) => ({
@@ -217,9 +209,10 @@ export default {
});

// 是否展示标签组
const showlabelGroup = computed(
/* const showlabelGroup = computed(
() => enableLabelGroup(state.model.annotateType) && !state.model.import
);
); */
const showlabelGroup = true;

const handleEditDataset = () => {
state.model.labelGroupId = state.chosenGroupId;
@@ -237,9 +230,14 @@ export default {
state.chosenGroup = null;
state.chosenGroupId = null;
} else {
const thisLabelGroupIds = [];
for (let i = 0; i < val.length; i += 1) {
if (val[i][2]) {
thisLabelGroupIds.push(val[i][2]);
}
}
state.chosenGroup = val;
// eslint-disable-next-line prefer-destructuring
state.chosenGroupId = val[1];
state.chosenGroupId = thisLabelGroupIds;
}
};

@@ -250,42 +248,46 @@ export default {
model: { ...state.model, ...next },
});
if (!isNil(state.model.dataType)) {
getLabelGroupList({
getLabelGroupTreeList({
type: 1,
dataType: state.model.dataType,
annotateType: state.model.annotateType,
datasetId: state.model.id,
// dataType: state.model.dataType,
// annotateType: state.model.annotateType,
}).then((res) => {
res.forEach((item) => {
state.labelGroupOptions[1].children.push({
value: item.id,
label: item.name,
disabled: false,
});
});
state.labelGroupOptions[1].children = res;
});
}
if (!isNil(state.model.dataType)) {
getLabelGroupList({
getLabelGroupTreeList({
type: 0,
dataType: state.model.dataType,
annotateType: state.model.annotateType,
datasetId: state.model.id,
// dataType: state.model.dataType,
// annotateType: state.model.annotateType,
}).then((res) => {
res.forEach((item) => {
state.labelGroupOptions[0].children.push({
value: item.id,
label: item.name,
disabled: false,
});
});
state.labelGroupOptions[0].children = res;
});
}
// 读取数据集已有标签组
if (!isNil(next?.labelGroupId)) {
state.chosenGroupId = next.labelGroupId;
if (next.labelGroupType === 0) {
state.chosenGroup = ['custom', next.labelGroupId];
} else {
state.chosenGroup = ['system', next.labelGroupId];
if (!isNil(next?.labelGroupVOList)) {
state.chosenGroupId = [];
state.chosenGroup = [];
const labelGroupList = next.labelGroupVOList;
for (let i = 0; i < labelGroupList.length; i += 1) {
const thisLabelGroup = labelGroupList[i];
state.chosenGroupId.push(thisLabelGroup.labelGroupId);
if (thisLabelGroup.type === 0) {
state.chosenGroup.push([
'custom',
thisLabelGroup.labelGroupType,
thisLabelGroup.labelGroupId,
]);
} else {
state.chosenGroup.push([
'system',
thisLabelGroup.labelGroupType,
thisLabelGroup.labelGroupId,
]);
}
}
} else {
state.chosenGroupId = null;
@@ -297,7 +299,7 @@ export default {
return {
rules,
state,
deletable,
// deletable,
editable,
handleGroupChange,
handleEditDataset,


+ 34
- 28
webapp/src/views/dataset/list/import-dataset.vue View File

@@ -1,18 +1,10 @@
/** Copyright 2020 Tianshu AI Platform. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* =============================================================
*/
/** Copyright 2020 Tianshu AI Platform. All Rights Reserved. * * Licensed under the Apache License,
Version 2.0 (the "License"); * you may not use this file except in compliance with the License. *
You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless
required by applicable law or agreed to in writing, software * distributed under the License is
distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied. * See the License for the specific language governing permissions and * limitations under
the License. * ============================================================= */

<template>
<BaseModal
@@ -29,7 +21,9 @@
<el-alert class="info-alert" type="warning" show-icon :closable="false">
<div slot="title" class="slot-content">
<div>数据集创建完毕后,需要使用脚本工具上传本地已有数据集</div>
<a :href="`${VUE_APP_DOCS_URL}module/dataset/util`" target="_blank">使用文档</a>
<a href="https://docs.vloong.thinkenergy.tech/vloong/scene/datamanagement" target="_blank"
>使用文档</a
>
</div>
</el-alert>
<el-form-item label="数据集名称" prop="name">
@@ -38,13 +32,13 @@
<el-form-item label="数据集来源" prop="sourceType">
<InfoRadio v-model="state.form.sourceType" :dataSource="sourceTypeList" />
<div>
标准数据集是指天枢平台预置支持的部分数据集类型,
标准数据集是指伏龙平台预置支持的部分数据集类型,
<a
target="_blank"
type="primary"
:underline="false"
class="primary"
:href="`${VUE_APP_DOCS_URL}module/dataset/intro`"
href="https://docs.vloong.thinkenergy.tech/sdk/standardizefield/doc1"
>详细参考</a
>
</div>
@@ -66,13 +60,22 @@
width="200px"
/>
</el-form-item>
<el-form-item v-else label="模型类型" prop="annotateType">
<InfoSelect
<el-form-item v-else label="数据类型" prop="annotateType">
<!-- <InfoSelect
v-model="state.form.annotateType"
placeholder="模型类型"
:dataSource="allAnnotationList"
width="200px"
/>
/> -->
<el-select v-model="state.form.annotateType" placeholder="数据类型" clearable>
<el-option
v-for="item in options"
:key="item.value"
:label="item.label"
:value="item.value"
>
</el-option>
</el-select>
</el-form-item>
<el-form-item label="数据集描述">
<el-input
@@ -108,6 +111,7 @@ import {
} from '@/views/dataset/util';

import { add } from '@/api/preparation/dataset';
import { typeList } from '@/config/index';

const annotationByDataType = annotationBy('dataType');

@@ -131,6 +135,7 @@ export default {
},
},
setup(props) {
const options = typeList;
const { toggleVisible, onResetFresh } = props;
const initialForm = {
name: '',
@@ -176,14 +181,14 @@ export default {
});

const sourceTypeList = [
{
label: '自定义数据集',
value: 0,
},
{
label: '标准数据集',
value: 1,
value: 0,
},
// {
// label: '标准数据集',
// value: 1,
// },
];

// 是否为自定义来源
@@ -234,7 +239,7 @@ export default {
name: '',
dataType: 0,
sourceType: 0,
annotateType: 2,
annotateType: '',
remark: '',
},
});
@@ -263,7 +268,7 @@ export default {
name: '',
dataType: 0,
sourceType: 0,
annotateType: 2,
annotateType: '',
remark: '',
},
loading: false,
@@ -335,6 +340,7 @@ export default {
selectAnnotationType,
handleClose,
handleOk,
options,
};
},
};


+ 57
- 34
webapp/src/views/dataset/list/index.vue View File

@@ -1,18 +1,10 @@
/** Copyright 2020 Tianshu AI Platform. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* =============================================================
*/
/** Copyright 2020 Tianshu AI Platform. All Rights Reserved. * * Licensed under the Apache License,
Version 2.0 (the "License"); * you may not use this file except in compliance with the License. *
You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless
required by applicable law or agreed to in writing, software * distributed under the License is
distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied. * See the License for the specific language governing permissions and * limitations under
the License. * ============================================================= */

<template>
<div class="app-container">
@@ -124,7 +116,7 @@
当前数据集为外部导入数据集<br />点击复制数据集 ID<br /><a
class="mt-10 db primary"
target="_blank"
:href="`${VUE_APP_DOCS_URL}module/dataset/util#2-导入数据集`"
href="https://docs.vloong.thinkenergy.tech/sdk/standardizefield/doc1"
>使用文档</a
>
</div>
@@ -161,7 +153,7 @@
/>
</template>
</el-table-column>
<el-table-column
<!-- <el-table-column
show-overflow-tooltip
prop="dataType"
:formatter="parseDataType"
@@ -176,7 +168,7 @@
@command="(cmd) => filter('dataType', cmd)"
/>
</template>
</el-table-column>
</el-table-column> -->
<el-table-column prop="progress" min-width="200" label="进度" align="left">
<template slot-scope="scope">
<div v-if="scope.row.progress !== null" class="flex progress-wrap">
@@ -215,7 +207,7 @@
>
<template slot="header">
<dropdown-header
title="标注类型"
title="数据类型"
:list="annotateTypeList"
:filtered="!isNil(annotateType)"
@command="(cmd) => filter('annotateType', cmd)"
@@ -264,6 +256,8 @@
:topDataset="topDataset"
:editDataset="showEditDataset"
:checkImport="checkImport"
:doConvert="doConvert"
:isAdmin="isAdmin"
/>
</el-table>
<!--分页组件-->
@@ -309,9 +303,19 @@
<script>
import { Message } from 'element-ui';
import { isNil, omit, findKey } from 'lodash';
import { mapState } from 'vuex';
import {mapGetters, mapState} from 'vuex';
import CopyToClipboard from 'vue-copy-to-clipboard';

import CRUD, { presenter, header, form, crud } from '@crud/crud';
import rrOperation from '@crud/RR.operation';
import cdOperation from '@crud/CD.operation';
import {
publish,
autoAnnotate,
annotateStatus,
delAnnotation,
track,
} from '@/api/preparation/annotation';
import crudDataset, {
editDataset,
detail,
@@ -319,17 +323,8 @@ import crudDataset, {
topDataset,
queryDatasetsProgress,
queryDatasetStatus,
myConvertPreset,
} from '@/api/preparation/dataset';
import {
publish,
autoAnnotate,
annotateStatus,
delAnnotation,
track,
} from '@/api/preparation/annotation';
import CRUD, { presenter, header, form, crud } from '@crud/crud';
import rrOperation from '@crud/RR.operation';
import cdOperation from '@crud/CD.operation';
import datePickerMixin from '@/mixins/datePickerMixin';

import {
@@ -339,7 +334,7 @@ import {
annotationProgressMap,
decompressProgressMap,
datasetStatusMap,
rankDatasetStatusMap,
rankDatasetStatusMap_dataset,
isStatus,
isIncludeStatus,
getDatasetType,
@@ -366,6 +361,8 @@ import DataEnhance from './data-enhance';
import EditDataset from './edit-dataset';
import UploadDataFile from './upload-datafile';
import '../style/list.scss';
import { typeList, datasetTypeBy } from '@/config/index';
import {annotationMap} from "../util";

const defaultForm = {
id: null,
@@ -379,6 +376,8 @@ const defaultForm = {

const annotationByCode = annotationBy('code');

const datasetTypeByCode = datasetTypeBy('code');

// 自定义数据集
const isImport = (d) => d.import;

@@ -455,6 +454,7 @@ export default {
};
},
computed: {
...mapGetters(['user', 'isAdmin']),
...mapState({
activePanel: (state) => {
return String(state.dataset.activePanel);
@@ -477,7 +477,11 @@ export default {
};
},
annotateTypeList() {
return [{ label: '全部', value: null }].concat(annotationList);
const annotateTypeData = Object.keys(typeList).map((d) => ({
label: typeList[d].label,
value: typeList[d].code,
}));
return [{ label: '全部', value: null }].concat(annotateTypeData);
},
dataTypeList() {
const rawDataTypeList = Object.keys(dataTypeMap).map((d) => ({
@@ -487,7 +491,7 @@ export default {
return [{ label: '全部', value: null }].concat(rawDataTypeList);
},
statusList() {
const rawStatusList = Object.keys(rankDatasetStatusMap).map((d) => ({
const rawStatusList = Object.keys(rankDatasetStatusMap_dataset).map((d) => ({
label: datasetStatusMap[d].name,
value: Number(d),
}));
@@ -764,6 +768,25 @@ export default {
path: `/data/datasets/${row.id}/version`,
});
},
// 转为预置标签组
doConvert(row) {
myConvertPreset(row.id)
.then(() => {
this.$message({
message: '成功转为预置数据集',
type: 'success',
});
})
.catch((e) => {
this.$message({
message: e.message || '转为预置数据集失败',
type: 'error',
});
});
setTimeout(() => {
this.onResetFresh();
}, 500);
},
autoAnnotate(row) {
this.$set(row, 'pollIng', true); // 新增响应式变量,并设置禁用操作台按钮
return autoAnnotate([row.id])
@@ -847,7 +870,7 @@ export default {
return dataTypeMap[cellValue];
},
parseAnnotateType(row, column, cellValue) {
return annotationByCode(cellValue, 'name');
return datasetTypeByCode(cellValue, 'label');
},
parseStatus(row, column, cellValue = 0) {
return datasetStatusMap[cellValue].name;


+ 7
- 15
webapp/src/views/dataset/list/publish.vue View File

@@ -1,18 +1,10 @@
/** Copyright 2020 Tianshu AI Platform. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* =============================================================
*/
/** Copyright 2020 Tianshu AI Platform. All Rights Reserved. * * Licensed under the Apache License,
Version 2.0 (the "License"); * you may not use this file except in compliance with the License. *
You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless
required by applicable law or agreed to in writing, software * distributed under the License is
distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied. * See the License for the specific language governing permissions and * limitations under
the License. * ============================================================= */

<template>
<el-form ref="form" :model="state.model" :rules="rules" label-width="110px">


+ 2
- 1
webapp/src/views/dataset/list/status.js View File

@@ -60,7 +60,8 @@ export default {
borderColor: status.bgColor,
},
};
const statusName = row.dataType === 100 ? '导入完成' : status.name;
// const statusName = row.dataType === 100 ? '导入完成' : status.name;
const statusName = status.name;
return (
<el-tag type={status.type} {...colorProps}>
{statusName}


+ 10
- 18
webapp/src/views/dataset/medical/list.vue View File

@@ -1,18 +1,10 @@
/** Copyright 2020 Tianshu AI Platform. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* =============================================================
*/
/** Copyright 2020 Tianshu AI Platform. All Rights Reserved. * * Licensed under the Apache License,
Version 2.0 (the "License"); * you may not use this file except in compliance with the License. *
You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless
required by applicable law or agreed to in writing, software * distributed under the License is
distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied. * See the License for the specific language governing permissions and * limitations under
the License. * ============================================================= */

<template>
<div class="app-container">
@@ -265,14 +257,14 @@
import { Message } from 'element-ui';
import { mapState } from 'vuex';
import { isNil, findKey } from 'lodash';
import CRUD, { presenter, header, form, crud } from '@crud/crud';
import rrOperation from '@crud/RR.operation';
import cdOperation from '@crud/CD.operation';
import crudDataset, {
autoAnnotate,
queryDatasetsProgress,
editDataset,
} from '@/api/preparation/medical';
import CRUD, { presenter, header, form, crud } from '@crud/crud';
import rrOperation from '@crud/RR.operation';
import cdOperation from '@crud/CD.operation';
import datePickerMixin from '@/mixins/datePickerMixin';
import DropdownHeader from '@/components/DropdownHeader';



+ 2
- 0
webapp/src/views/dataset/util/index.js View File

@@ -479,6 +479,8 @@ export const datasetStatusMap = {
// 筛选常见的标注类型
export const rankDatasetStatusMap = pick(datasetStatusMap, [101, 102, 104, 105, 202]);

export const rankDatasetStatusMap_dataset = pick(datasetStatusMap, [101, 105]);

export const isStatus = (row, code) => datasetStatusMap[row.status]?.status === code;

export const isIncludeStatus = (row, codeArr) =>


+ 9
- 17
webapp/src/views/dataset/version/actions.vue View File

@@ -1,18 +1,10 @@
/** Copyright 2020 Tianshu AI Platform. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* =============================================================
*/
/** Copyright 2020 Tianshu AI Platform. All Rights Reserved. * * Licensed under the Apache License,
Version 2.0 (the "License"); * you may not use this file except in compliance with the License. *
You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless
required by applicable law or agreed to in writing, software * distributed under the License is
distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied. * See the License for the specific language governing permissions and * limitations under
the License. * ============================================================= */

<template>
<div class="info-table-action-cell">
@@ -45,11 +37,11 @@
</el-dropdown-item>
<el-dropdown-item v-click-once :disabled="publishing" @click.native="download(row)">
<el-button v-if="!publishing" type="text">
导出
下载
</el-button>
<el-tooltip v-else content="文件生成中,请稍后" placement="top" :open-delay="400">
<el-button class="disabled-button" type="text">
导出
下载
</el-button>
</el-tooltip>
</el-dropdown-item>


+ 9
- 17
webapp/src/views/dataset/version/index.vue View File

@@ -1,18 +1,10 @@
/** Copyright 2020 Tianshu AI Platform. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* =============================================================
*/
/** Copyright 2020 Tianshu AI Platform. All Rights Reserved. * * Licensed under the Apache License,
Version 2.0 (the "License"); * you may not use this file except in compliance with the License. *
You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless
required by applicable law or agreed to in writing, software * distributed under the License is
distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied. * See the License for the specific language governing permissions and * limitations under
the License. * ============================================================= */

<template>
<div class="app-container">
@@ -37,10 +29,10 @@

<script>
import { h, ref, reactive } from '@vue/composition-api';
import { Message, MessageBox } from 'element-ui';
import InfoTable from '@/components/InfoTable';
import BaseModal from '@/components/BaseModal';
import { getConvertInfo } from '@/api/preparation/dataset';
import { Message, MessageBox } from 'element-ui';

import api from '@/utils/request';
import { API_MODULE_NAME } from '@/config';
@@ -113,7 +105,7 @@ export default {
sortable: true,
render: ({ row }) => parseTime(row.createTime),
},
{ prop: 'versionNote', label: '版本描述' },
// { prop: 'versionNote', label: '版本描述' },
{
label: '操作',
minWidth: 240,


+ 15
- 21
webapp/src/views/development/notebook.vue View File

@@ -1,18 +1,10 @@
/** Copyright 2020 Tianshu AI Platform. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* =============================================================
*/
/** Copyright 2020 Tianshu AI Platform. All Rights Reserved. * * Licensed under the Apache License,
Version 2.0 (the "License"); * you may not use this file except in compliance with the License. *
You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless
required by applicable law or agreed to in writing, software * distributed under the License is
distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied. * See the License for the specific language governing permissions and * limitations under
the License. * ============================================================= */

<template>
<div class="app-container">
@@ -45,7 +37,7 @@
</div>
<create-dialog ref="create" @on-add="onAdded" />
<!--右边侧边栏-->
<el-drawer :visible.sync="drawer" :with-header="false" size="33%">
<el-drawer :visible.sync="drawer" :with-header="false" size="33%" append-to-body>
<notebook-detail :itemObj="selectedItemObj" />
</el-drawer>
<!--表格渲染-->
@@ -88,6 +80,7 @@
<span>{{ parseTime(scope.row.createTime) }}</span>
</template>
</el-table-column>
<el-table-column v-if="isAdmin" prop="originUserId" label="创建人" />
<el-table-column label="操作" width="300" fixed="right">
<template slot-scope="scope">
<el-button
@@ -148,6 +141,11 @@
// eslint-disable-next-line import/no-extraneous-dependencies
import { debounce } from 'throttle-debounce';

import CRUD, { presenter, header, crud } from '@crud/crud';
import rrOperation from '@crud/RR.operation';
import cdOperation from '@crud/CD.operation';
import pagination from '@crud/Pagination';
import { mapGetters } from 'vuex';
import notebookApi, {
detail,
start,
@@ -158,12 +156,7 @@ import notebookApi, {
import { add as addAlgorithm } from '@/api/algorithm/algorithm';
import DropdownHeader from '@/components/DropdownHeader';
import MsgPopover from '@/components/MsgPopover';
import CRUD, { presenter, header, crud } from '@crud/crud';
import rrOperation from '@crud/RR.operation';
import cdOperation from '@crud/CD.operation';
import pagination from '@crud/Pagination';
import { getUserConfig, generateMap, emitter } from '@/utils';

import CreateDialog from './components/CreateDialog';
import NotebookDetail from './components/NotebookDetail';
import {
@@ -220,6 +213,7 @@ export default {
};
},
computed: {
...mapGetters(['isAdmin']),
notebookStatusList() {
const arr = [{ label: '全部', value: null }];
for (const key in this.notebookNameMap) {


+ 9
- 16
webapp/src/views/home/index.vue View File

@@ -1,18 +1,10 @@
/** Copyright 2020 Tianshu AI Platform. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* =============================================================
*/
/** Copyright 2020 Tianshu AI Platform. All Rights Reserved. * * Licensed under the Apache License,
Version 2.0 (the "License"); * you may not use this file except in compliance with the License. *
You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless
required by applicable law or agreed to in writing, software * distributed under the License is
distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied. * See the License for the specific language governing permissions and * limitations under
the License. * ============================================================= */

<template>
<div class="index-content">
@@ -326,7 +318,8 @@ export default {
left: 0;
width: 100%;
height: 21%;
background: url('../../assets/images/home/circle-bottom.png') no-repeat center top;
background: url("../../assets/images/home/circle-bottom.png") no-repeat
center top;
background-size: 56.8%;
}
}


+ 26
- 21
webapp/src/views/labelGroup/index.vue View File

@@ -1,18 +1,10 @@
/** Copyright 2020 Tianshu AI Platform. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* =============================================================
*/
/** Copyright 2020 Tianshu AI Platform. All Rights Reserved. * * Licensed under the Apache License,
Version 2.0 (the "License"); * you may not use this file except in compliance with the License. *
You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless
required by applicable law or agreed to in writing, software * distributed under the License is
distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied. * See the License for the specific language governing permissions and * limitations under
the License. * ============================================================= */

<template>
<div class="app-container">
@@ -100,6 +92,7 @@
</template>
</el-table-column>
<el-table-column prop="count" min-width="80" label="标签数量" align="left" />
<el-table-column prop="datasetName" min-width="80" label="数据集" align="left" />
<el-table-column
prop="updateTime"
min-width="160"
@@ -131,6 +124,7 @@
:doEdit="doEdit"
:doFork="showFork"
:doConvert="doConvert"
:isAdmin="isAdmin"
/>
</el-table>
<!--分页组件-->
@@ -185,16 +179,16 @@

<script>
import { isNil } from 'lodash';
import { mapState } from 'vuex';
import {mapGetters, mapState} from 'vuex';

import CRUD, { presenter, header, form, crud } from '@crud/crud';
import rrOperation from '@crud/RR.operation';
import cdOperation from '@crud/CD.operation';
import crudLabelGroup, {
copy as LabelGroupFork,
getLabelGroupDetail,
convertPreset,
} from '@/api/preparation/labelGroup';
import CRUD, { presenter, header, form, crud } from '@crud/crud';
import rrOperation from '@crud/RR.operation';
import cdOperation from '@crud/CD.operation';

import { formatDateTime } from '@/utils';
import { validateName } from '@/utils/validate';
@@ -205,6 +199,7 @@ import DropdownHeader from '@/components/DropdownHeader';
import BaseModal from '@/components/BaseModal';
import LabelGroupAction from './labelGroupAction';
import '@/views/dataset/style/list.scss';
import { algList } from '@/config';

const defaultForm = {
id: null,
@@ -269,6 +264,7 @@ export default {
},

computed: {
...mapGetters(['user', 'isAdmin']),
...mapState({
activePanelLabelGroup: (state) => {
return String(state.dataset.activePanelLabelGroup);
@@ -286,7 +282,14 @@ export default {
},

labelGroupTypeList() {
return [{ label: '全部', value: null }].concat(Object.values(labelGroupTypeMap));
const data = JSON.parse(JSON.stringify(algList));
data.forEach((item) => {
item.label = item.auxInfo;
item.value = item.id;
});
// return data;
return [{ label: '全部', value: null }].concat(data);
// return [{ label: '全部', value: null }].concat(Object.values(labelGroupTypeMap));
},

// 区分预置标签组和普通便签组操作权限
@@ -318,7 +321,8 @@ export default {

// 根据值获取标签值
getLabelGroupLabel(value) {
return (Object.values(labelGroupTypeMap).find((d) => d.value === value) || {}).label;
// return (Object.values(labelGroupTypeMap).find((d) => d.value === value) || {}).label;
return (Object.values(algList).find((d) => d.id === value) || {}).auxInfo;
},

onResetQuery() {
@@ -420,6 +424,7 @@ export default {
type: res.type,
labels: JSON.stringify(res.labels),
labelGroupType: res.labelGroupType,
operateType: res.operateType,
id: row.id,
});
});


+ 9
- 1
webapp/src/views/labelGroup/labelGroupAction.js View File

@@ -22,9 +22,10 @@ export default {
doEdit: Function,
doFork: Function,
doConvert: Function,
isAdmin: Boolean,
},
render(h, { data, props }) {
const { doFork, goDetail, doEdit, doConvert } = props;
const { doFork, goDetail, doEdit, doConvert, isAdmin } = props;
const columnProps = {
...data,
scopedSlots: {
@@ -80,6 +81,13 @@ export default {
showConvert = false;
}

// 非管理员账号,设为预置不可见不可操作
if (showConvert) {
if (!isAdmin) {
showConvert = false;
}
}

return (
<span>
{checkButton}


+ 131
- 27
webapp/src/views/labelGroup/labelGroupForm.vue View File

@@ -1,18 +1,10 @@
/** Copyright 2020 Tianshu AI Platform. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* =============================================================
*/
/** Copyright 2020 Tianshu AI Platform. All Rights Reserved. * * Licensed under the Apache License,
Version 2.0 (the "License"); * you may not use this file except in compliance with the License. *
You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless
required by applicable law or agreed to in writing, software * distributed under the License is
distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied. * See the License for the specific language governing permissions and * limitations under
the License. * ============================================================= */

<template>
<div v-loading="state.loading" class="app-container" style="width: 600px; margin-top: 28px;">
@@ -27,13 +19,65 @@
/>
</el-form-item>
<el-form-item label="类型" prop="labelGroupType">
<InfoSelect
<!-- <InfoSelect
v-model="state.createForm.labelGroupType"
placeholder="类型"
:dataSource="labelGroupTypeList"
:disabled="['detail', 'edit'].includes(state.actionType)"
@change="handleLabelGroupTypeChange"
/> -->
<el-select
v-model="state.createForm.labelGroupType"
placeholder="类型"
@change="handleLabelGroupTypeChange2"
>
<el-option v-for="item in options" :key="item.id" :label="item.auxInfo" :value="item.id">
</el-option>
</el-select>
</el-form-item>
<el-form-item label="数据集" prop="datasetId">
<!-- <InfoSelect
v-model="state.createForm.labelGroupType"
placeholder="类型"
:dataSource="labelGroupTypeList"
:disabled="['detail', 'edit'].includes(state.actionType)"
@change="handleLabelGroupTypeChange"
/> -->
<el-input
v-if="state.actionType === 'detail'"
v-model="state.createForm.datasetName"
placeholder="数据集"
show-word-limit
:disabled="true"
/>
<el-select
v-if="state.actionType != 'detail'"
v-model="state.createForm.datasetType"
placeholder="类型"
@change="handleLabelGroupTypeChange2"
>
<el-option key="key0" label="请选择类型" value=""></el-option>
<el-option
v-for="(item, index) in datasetTypeList"
:key="index"
:label="item.label"
:value="item.value"
/>
</el-select>
<el-select
v-if="state.actionType != 'detail'"
v-model="state.createForm.datasetId"
placeholder="数据集"
>
<el-option key="key0" label="请选择数据集" value=""></el-option>
<el-option
v-for="item in state.datasetIdList"
:key="item.id"
:label="item.name"
:value="item.id"
>
</el-option>
</el-select>
</el-form-item>
<el-form-item label="描述" prop="remark">
<el-input
@@ -54,7 +98,7 @@
:before-leave="beforeLeave"
@tab-click="handleClick"
>
<el-tab-pane label="自定义标签组" name="custom" class="dynamic-field">
<!-- <el-tab-pane label="自定义标签组" name="custom" class="dynamic-field">
<Exception v-if="state.createForm.labels.length === 0" />
<div v-else>
<div v-if="state.groupType === 1">
@@ -77,7 +121,7 @@
/>
</el-form>
</div>
</el-tab-pane>
</el-tab-pane> -->
<el-tab-pane label="编辑标签组" name="edit" class="code-editor">
<Editor
ref="editorRef"
@@ -94,7 +138,7 @@
<UploadInline
ref="uploadFormRef"
action="fakeApi"
accept=".json"
accept=".json,.csv"
listType="text"
:limit="1"
:acceptSize="0"
@@ -103,6 +147,19 @@
@uploadError="uploadError"
/>
</div>
<!--<div class="min-height-100 flex flex-center upload-tab">
<UploadInline
ref="uploadFormRef"
action="fakeApi"
accept=".csv"
listType="text"
:limit="1"
:acceptSize="0"
:multiple="false"
:showFileCount="false"
@uploadError="uploadError"
/>
</div>-->
</el-tab-pane>
</el-tabs>
<div class="field-extra mt-10">
@@ -113,13 +170,16 @@
<div>1.「编辑标签组」提供用户自由编写标签方式</div>
<div>2. 请不要随意删除已有标签</div>
<div>3. 请不要随意修改已有标签 id</div>
<div>4. 请按照标准格式提供颜色色值</div>
<!-- <div>4. 请按照标准格式提供颜色色值</div> -->
</div>
<div v-else-if="state.addWay === 'upload'">
<div>1. 请按照格式要求提交 json 格式标签文件</div>
<div>1. 请按照格式要求提交标签文件</div>
<div>
2. 格式参考
<a target="_blank" :href="`${VUE_APP_DOCS_URL}module/dataset/labelGroup`">
<!-- <a target="_blank" :href="`${VUE_APP_DOCS_URL}module/dataset/labelGroup`">
标签组模版文件
</a> -->
<a target="_blank" href="http://docs.vloong.thinkenergy.tech">
标签组模版文件
</a>
</div>
@@ -148,15 +208,24 @@ import { remove, replace, duplicate } from '@/utils';
import { labelGroupTypeMap } from '@/views/dataset/util';
import { validateName, validateLabelsUtil } from '@/utils/validate';
import { getAutoLabels } from '@/api/preparation/datalabel';
import { getNotContainList } from '@/api/preparation/dataset';
import { add, edit, getLabelGroupDetail, importLabelGroup } from '@/api/preparation/labelGroup';
import InfoSelect from '@/components/InfoSelect';
import { algList, typeList } from '@/config/index';
import DynamicField from './dynamicField';

const defaultColor = '#FFFFFF';

// const initialLabels = [
// { name: '', color: defaultColor },
// { name: '', color: '#000000' },
// ];
const initialLabels = [
{ name: '', color: defaultColor },
{ name: '', color: '#000000' },
{ vin: '', label: '' },
{ vin: '', label: '' },
{ vin: '', label: '' },
{ vin: '', label: '' },
{ vin: '', label: '' },
];

export default {
@@ -169,6 +238,7 @@ export default {
InfoSelect,
},
setup(props, ctx) {
const options = algList;
const editorRef = ref(null);
const formRef = ref(null);
const uploadFormRef = ref(null);
@@ -193,6 +263,8 @@ export default {
3: 'upload',
};

const datasetTypeList = typeList;

// 表单规则
const rules = {
name: [
@@ -222,6 +294,7 @@ export default {
systemLabels: [], // 系统自动标注标签列表
originList: [], // 记录原始返回列表
activeLabels: [], // 当前可用标签列表
datasetIdList: [], // 数据集列表
fileCount: undefined,
// counter: 动态表单项数量,keys: 每次生成唯一的表单项
counter: initialLabels.length - 1,
@@ -232,6 +305,10 @@ export default {
labelGroupType: undefined,
remark: '',
type: 0,
datasetName: '',
datasetId: '',
id: '',
datasetType: '',
},
codeContent: JSON.stringify(initialLabels),
customForm: {
@@ -242,7 +319,7 @@ export default {
},
],
},
addWay: 'custom', // 默认创建类型为自定义
addWay: 'edit', // 默认创建类型为自定义
cancelText: '取消',
errmsg: '',
loading: false, // 加载详情
@@ -311,6 +388,28 @@ export default {
});
};

const getDatasetList = () => {
if (state.createForm.labelGroupType) {
getNotContainList(
state.createForm.labelGroupType,
state.createForm.datasetId,
state.createForm.datasetType
).then((res) => {
Object.assign(state, {
datasetIdList: res,
});
});
} else {
Object.assign(state, {
datasetIdList: [],
});
}
};

const handleLabelGroupTypeChange2 = () => {
getDatasetList();
};

const handleLabelGroupRequest = (params) => {
const nextParams = {
...params,
@@ -380,14 +479,15 @@ export default {
break;
case 'upload': {
const { uploadFiles } = uploadFormRef.value.formRef?.$refs.uploader || {};
const { name, remark, labelGroupType } = state.createForm;

const { name, remark, labelGroupType, datasetId, id } = state.createForm;
const formData = new FormData();
formData.append('name', name);
formData.append('remark', remark);
formData.append('file', uploadFiles[0].raw);
formData.append('operateType', 3);
formData.append('labelGroupType', labelGroupType);
formData.append('datasetId', datasetId || '');
formData.append('id', id);

importLabelGroup(formData).then(() => {
Message.success({
@@ -574,6 +674,7 @@ export default {
codeContent: JSON.stringify(res.labels),
...restProps,
});
getDatasetList();
})
.finally(() => {
setLoading(false);
@@ -603,7 +704,10 @@ export default {
labelGroupType,
labelGroupTypeList,
handleLabelGroupTypeChange,
handleLabelGroupTypeChange2,
handleCodeChange,
datasetTypeList,
options,
};
},
};


+ 126
- 42
webapp/src/views/login.vue View File

@@ -1,18 +1,10 @@
/** Copyright 2020 Tianshu AI Platform. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* =============================================================
*/
/** Copyright 2020 Tianshu AI Platform. All Rights Reserved. * * Licensed under the Apache License,
Version 2.0 (the "License"); * you may not use this file except in compliance with the License. *
You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless
required by applicable law or agreed to in writing, software * distributed under the License is
distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied. * See the License for the specific language governing permissions and * limitations under
the License. * ============================================================= */

<template>
<div style="height: 100%;">
@@ -25,7 +17,6 @@
label-width="0px"
class="login-form"
>
<h2 class="title">之江天枢人工智能开源平台</h2>
<el-form-item prop="username">
<el-input
v-model="loginForm.username"
@@ -61,15 +52,22 @@
<img v-show="codeUrl" :src="codeUrl" alt="刷新验证码" @click="getCode" />
</div>
</el-form-item>

<el-form-item>
<div class="clearfix">
<el-checkbox v-model="loginForm.rememberMe">记住我</el-checkbox>
<el-checkbox v-model="loginForm.rememberMe" class="my-checkbox">记住我</el-checkbox>
<el-button
type="text"
style="float: right;"
@click="$router.replace({ path: '/resetpassword' })"
>找回密码</el-button
>
<el-button
type="text"
style="float: right; margin-right: 10px;"
@click="dialogVisible = true"
>注册</el-button
>
<el-button
v-if="loginConfig.allowRegister"
type="text"
@@ -78,11 +76,26 @@
>免费注册</el-button
>
</div>
<div class="agreement">
<el-checkbox v-model="checked" class="my-checkbox yinsi">
<el-link :underline="false" style="color: #606266;font-weight: 500">
我已阅读或同意
</el-link>
<el-link type="primary" :underline="false" @click="handleShowDialog('agreement')"
>用户协议</el-link
>
<el-link :underline="false" style="color: #606266;font-weight: 500">和</el-link>
<el-link type="primary" :underline="false" @click="handleShowDialog('privacy')"
>隐私政策</el-link
>
</el-checkbox>
</div>
<el-button
:loading="loading"
type="primary"
size="medium"
style="width: 100%;"
class="my-btn"
style="width: 100%;margin-top:60px"
@click.native.prevent="handleLogin"
>
<span v-if="!loading">登 录</span>
@@ -90,6 +103,36 @@
</el-button>
</el-form-item>
</el-form>
<el-dialog
title=""
append-to-body
:visible.sync="dialogVisible"
width="400px"
:show-close="false"
>
<div class="dialog-content">
<el-button type="primary" size="default" @click="changeLocale">切换语言</el-button>

{{ $t('title1') }}--- {{ $t('name') }}
<h2>恭喜获得注册资格</h2>
<p>扫码进群,获取注册通道,与行业大咖共同进步。</p>
<img class="img" src="~@/assets/images/login/register.png" alt="" />
<p>
<el-button style="width:120px" round @click="dialogVisible = false">返回登录</el-button>
</p>
</div>
</el-dialog>
<!-- 隐私 协议 -->
<el-dialog
title=""
:visible.sync="isShow"
width="50%"
append-to-body
custom-class="my_dialog"
>
<Privacy v-if="title === 'privacy'"></Privacy>
<Agreement v-else></Agreement>
</el-dialog>
</login-public>
</div>
</template>
@@ -100,15 +143,23 @@ import Cookies from 'js-cookie';
import { getCodeImg } from '@/api/auth';
import LoginPublic from '@/components/LoginPublic';
import { loginConfig } from '@/config';
import Privacy from './privacy.vue';
import Agreement from './agreement.vue';

export default {
name: 'Login',
components: {
LoginPublic,
Privacy,
Agreement,
},
data() {
return {
loginConfig,
title: '',
isShow: false,
checked: false,
dialogVisible: false,
codeUrl: '',
loginForm: {
username: '',
@@ -130,6 +181,13 @@ export default {
this.getCookie();
},
methods: {
changeLocale() {
this.$i18n.locale = this.$i18n.locale === 'en' ? 'zh-CN' : 'en';
},
handleShowDialog(type) {
this.isShow = true;
this.title = type;
},
getCode() {
getCodeImg().then((res) => {
this.codeUrl = res.img;
@@ -142,6 +200,10 @@ export default {
handleLogin() {
this.$refs.loginForm.validate((valid) => {
if (valid) {
if (!this.checked) {
this.$message.warning('请勾选我已阅读或同意用户协议和隐私政策');
return;
}
this.loading = true;
if (this.loginForm.rememberMe) {
Cookies.set('username', this.loginForm.username, { expires: 7 });
@@ -159,45 +221,67 @@ export default {
this.loading = false;
this.getCode();
});
return true;
}
return false;
});
},
},
};
</script>

<style lang="scss">
.my_dialog {
.el-dialog__body {
height: 460px;
overflow: auto;
position: relative;
}
.el-dialog__close {
position: absolute;
top: -10px;
right: -10px;
}
}
</style>

<style rel="stylesheet/scss" lang="scss" scoped>
@import '@/assets/styles/variables.scss';

.title {
margin: 0 auto 30px;
color: $primaryColor;
.dialog-content {
text-align: center;
.img {
width: 120px;
}
}

@media screen and (max-width: 1000px) {
.title {
font-size: 1.3em;
.my-checkbox {
margin-top: 2px;
&.yinsi {
margin-right: 8px;
::v-deep .el-checkbox__input {
vertical-align: bottom;
}
}
::v-deep .el-checkbox__inner {
width: 20px;
height: 20px;
&::after {
width: 8px;
}
}
::v-deep .el-checkbox__label {
font-size: 20px;
}
}

.login-form {
width: 360px;

.el-input {
height: 38px;

input {
height: 38px;
}
width: 420px;
::v-deep .el-input__inner,
.my-btn {
height: 60px !important;
}
.input-icon {
width: 14px;
height: 39px;
margin-left: 2px;
* {
font-size: 20px !important;
}
:v-deep .el-input--prefix .el-input__inne {
padding-left: 40px;
}
}

@@ -210,7 +294,7 @@ export default {
.login-code {
float: right;
width: 33%;
height: 38px;
height: 60px;

img {
width: 100%;


+ 7
- 15
webapp/src/views/model/components/addModelDialog.vue View File

@@ -1,18 +1,10 @@
/** Copyright 2020 Tianshu AI Platform. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* =============================================================
*/
/** Copyright 2020 Tianshu AI Platform. All Rights Reserved. * * Licensed under the Apache License,
Version 2.0 (the "License"); * you may not use this file except in compliance with the License. *
You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless
required by applicable law or agreed to in writing, software * distributed under the License is
distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied. * See the License for the specific language governing permissions and * limitations under
the License. * ============================================================= */

<template>
<!--模型管理页面-保存模型Dialog-->


+ 11
- 17
webapp/src/views/model/components/createModelForm.vue View File

@@ -1,18 +1,10 @@
/** Copyright 2020 Tianshu AI Platform. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* =============================================================
*/
/** Copyright 2020 Tianshu AI Platform. All Rights Reserved. * * Licensed under the Apache License,
Version 2.0 (the "License"); * you may not use this file except in compliance with the License. *
You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless
required by applicable law or agreed to in writing, software * distributed under the License is
distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied. * See the License for the specific language governing permissions and * limitations under
the License. * ============================================================= */

<template>
<el-form ref="form" :model="form" :rules="rules" label-width="100px">
@@ -113,6 +105,7 @@ import { getModelTypeMap } from '@/api/model/model';

import ModelUploader from './modelUploader';
import { atlasFrameTypeList, atlasModelTypeList } from '../util';
import { algList } from '@/config';

const defaultForm = {
name: null,
@@ -138,7 +131,7 @@ export default {
},
data() {
return {
algorithmUsageList: [],
algorithmUsageList: algList,

form: { ...defaultForm },
rules: {
@@ -221,7 +214,8 @@ export default {
size: 1000,
};
getAlgorithmUsages(params).then((res) => {
this.algorithmUsageList = res.result;
console.log('啦啦啦:', res);
// this.algorithmUsageList = res.result;
});
},
async createAlgorithmUsage(auxInfo) {


+ 11
- 19
webapp/src/views/model/index.vue View File

@@ -1,18 +1,10 @@
/** Copyright 2020 Tianshu AI Platform. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* =============================================================
*/
/** Copyright 2020 Tianshu AI Platform. All Rights Reserved. * * Licensed under the Apache License,
Version 2.0 (the "License"); * you may not use this file except in compliance with the License. *
You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless
required by applicable law or agreed to in writing, software * distributed under the License is
distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied. * See the License for the specific language governing permissions and * limitations under
the License. * ============================================================= */

<template>
<div class="app-container">
@@ -48,7 +40,7 @@
<el-tabs v-model="active" class="eltabs-inlineblock" @tab-click="onTabClick">
<el-tab-pane id="tab_0" label="我的模型" :name="String(MODEL_RESOURCE_ENUM.CUSTOM)" />
<el-tab-pane id="tab_1" label="预训练模型" :name="String(MODEL_RESOURCE_ENUM.PRESET)" />
<el-tab-pane id="tab_2" label="炼知模型" :name="String(MODEL_RESOURCE_ENUM.ATLAS)" />
<!-- <el-tab-pane id="tab_2" label="炼知模型" :name="String(MODEL_RESOURCE_ENUM.ATLAS)" /> -->
</el-tabs>
</div>
</div>
@@ -275,15 +267,15 @@
<script>
import { mapGetters } from 'vuex';

import CRUD, { presenter, header, form, crud } from '@crud/crud';
import rrOperation from '@crud/RR.operation';
import pagination from '@crud/Pagination';
import crudModel, { del, packageAtlasModel, getModelTypeMap } from '@/api/model/model';
import {
list as getAlgorithmUsages,
add as addAlgorithmUsage,
} from '@/api/algorithm/algorithmUsage';
import CRUD, { presenter, header, form, crud } from '@crud/crud';
import BaseModal from '@/components/BaseModal';
import rrOperation from '@crud/RR.operation';
import pagination from '@crud/Pagination';
import {
validateNameWithHyphen,
downloadZipFromObjectPath,


+ 577
- 0
webapp/src/views/privacy.vue View File

@@ -0,0 +1,577 @@
<style lang="scss" scoped>
.bold {
font-weight: 900;
}
</style>
<template>
<div class="">
<h2 style="text-align: center">
昇科能源隐私权声明
</h2>
<p style="text-align: right">
发布日期 2021年12月1日
</p>
<p class="bold">
提示条款
</p>
<p>
我们深知个人信息对您的重要性,我们将按法律法规的要求采取相应的安全保护措施,严格遵循合法、正当、必要和诚信原则,收集、使用用户信息,尽力保护您的个人信息安全可控。因此,北京昇科能源科技有限责任公司(以下简称“昇科能源”或“我们”)制定本《昇科能源隐私权声明》(以下简称“本声明/本隐私权”)并提醒您:
</p>
<p class="bold">
在使用昇科能源提供的产品及服务之前,请您务必仔细阅读并充分理解本声明,特别是以粗体/粗体下划线标识的条款,请您重点阅读。您点击“同意”按钮,勾选“同意隐私权声明”选框,或登录本平台均视为您完全接受本隐私权声明,在操作之前请您确认已知悉并完全理解本隐私权声明的全部内容。
</p>

<p class="bold">定义</p>
<p><span class="bold">本平台:</span> 指 伏龙AI平台 (域名为:vLoong.thinkenergy.tech)。</p>

<p>
<span class="bold">昇科能源:</span>
除非另有约定,指北京昇科能源科技有限责任公司(注册地址:北京市延庆区中关村延庆园风谷四路8号院27号楼2525)。北京昇科能源科技有限责任公司是
vLoong.thinkenergy.tech 的经营者。
</p>

<p>
<span class="bold"> 用户信息:</span
>用户信息是指您注册伏龙AI平台账户,使用伏龙AI平台的服务以及伏龙AI平台为了向您提供服务,您提交的或者伏龙AI平台收集的用户信息,如姓名、联系方式等,具体详见隐私权政策第二条所述的信息。
</p>

<p>
<span class="bold">业务数据:</span
>不同于用户信息,是指伏龙AI平台的用户利用伏龙AI平台的服务上传、下载、分发等通过伏龙AI平台的技术服务处理的数据。
</p>

<p>
<span class="bold">个人信息:</span
>指以电子或其他方式记录的能够单独或者与其他信息结合识别特定自然人身份或反映特定自然人活动情况的各种信息。
</p>

<p>
<span class="bold">敏感个人信息:</span>
指一旦泄露、非法提供或滥用可能危害人身和财产安全,极易导致个人名誉、身心健康受到损害或歧视性待遇等的个人信息,包括身份证件号码、个人生物识别信息、银行账户、通信记录和内容、财产信息、征信信息、行踪轨迹、住宿信息、健康生理信息、交易信息、14岁以下(含)儿童的个人信息等(我们将在本隐私权声明中对具体个人敏感信息以粗体进行显著标识)。
</p>

<p>
<span class="bold"> 匿名化:</span>
通过对个人信息的技术处理,使得个人信息主体无法被识别或者关联,且处理后的信息不能被复原的过程。个人信息经匿名化处理后所得的信息不属于个人信息。
</p>

<p>
<span class="bold"> 去标识化:</span>
通过对个人信息的技术处理,使其在不借助额外信息的情况下,无法识别或者关联个人信息主体的过程。
</p>

<p>
<span class="bold">个人信息删除:</span
>指在实现日常业务功能所涉及的系统中去除个人信息的行为,使其保持不可被检索、访问的状态。
</p>

<p>
除另有约定外,本声明所用定义与《昇科能源用户使用协议》中的定义具有相同涵义。
</p>

<p>
下文将帮您详细了解我们将如何收集、使用、共享、转让、公开披露和保护您的个人信息,帮您了解查询、访问、删除、更正、撤回授权个人信息的方式。
</p>
<p>
一、本协议的适用范围 <br />
二、我们如何收集和使用您的信息 <br />
三、我们如何使用Cookie和同类技术<br />
四、我们如何共享、转让、公开披露您的信息 <br />五、用户业务数据和公开信息
<br />六、我们如何保护和保存您的信息 <br />七、您如何管理您的信息<br />
八、我们如何处理未成年人的信息 <br />九、本隐私权声明如何更新 <br />十、如何联系我们
</p>
<p class="bold">
一、本协议的适用范围
</p>
<p>
1.1
本隐私权政策适用于伏龙AI平台所有服务。服务包括向您提供页面浏览、网站登录服务,以及通过伏龙AI平台向您提供的技术服务。
</p>
<p>
1.2
需要特别说明的是,作为伏龙AI平台的用户,若您利用伏龙AI平台的技术服务,为您的用户再行提供服务,因您的业务数据属于您所有,您应当另行与您的用户约定隐私权政策。
</p>

<p class="bold">
二、我们如何收集和使用您的信息
</p>
<p>
(一)我们收集您的用户信息的情形
</p>
<p>
在您使用我们的产品及/或服务时,我们可能需要收集和使用的您的个人信息包括如下两种:
</p>
<p>
2.1 帮助您成为我们的用户
</p>
<p>
2.1.1
如果您是个人开发者/高校用户,当您在伏龙AI平台网站创建账户时,您须向我们提供开发者名称(用户名),设置、确认您的登录密码,提供您在中华人民共和国境内手机号码,电子邮箱。您提交的手机号码和电子邮箱用于您注册、登录、绑定账户、密码找回时接收验证码,并且作为您与伏龙AI平台指定的联系方式之一,用来接受相关业务通知(如新品上线、服务变更等),并且伏龙AI平台可通过此联系方式向您营销推广、宣传产品、发送业务通知(含账单)或与您进行业务沟通。请注意,该等注册和登录过程是使用本平台和/或本服务的前提之一,如拒绝提供该等信息将无法正常注册、登录和/或使用本平台和/或本服务。
</p>
<p>
2.1.2
如果您是企业开发者,当您在伏龙AI平台网站创建账户时,您须向我们提供开发者名称(用户名),设置、确认您的登录密码,提供企业名称、企业地址信息、企业联系人姓名、企业联系人手机号码、电子邮箱、归属国家。您提交的企业联系人手机号码和电子邮箱用于您注册、登录、绑定账户、密码找回时接收验证码,并且作为您与伏龙AI平台指定的联系方式之一,用来接受相关业务通知(如新品上线、服务变更等),并且伏龙AI平台可通过此联系方式向您营销推广、宣传产品、发送业务通知(含账单)或与您进行业务沟通。请注意,该等注册和登录过程是使用本平台和/或本服务的前提之一,如拒绝提供该等信息将无法正常注册、登录和/或使用本平台和/或本服务。
</p>

<p>
2.2 向您提供技术服务:
</p>
<p>
2.2.1
根据中华人民共和国法律,在您使用具体的技术服务时,您应通过您的账号提供您的真实身份信息。您通过伏龙AI平台账号提供真实身份信息的,伏龙AI平台为您提供了多种方式以协助您提供信息,您应根据您的身份属性(开发者类型)选择适合的方式。
</p>
<p>
2.2.2 在您使用服务过程中我们会收集以下的信息:
</p>
<p>
2.2.2.1
设备信息:我们会根据您在软件安装及使用中授予的具体权限,接收并记录您所使用的设备相关信息(例如设备型号、操作系统版本、设备设置、
MAC 地址及 IMEI 、 IDFA 、 OAID 及其他设备标识符等软硬件特征信息)、设备所在位置相关信息(例如
IP 地址、 GPS
位置以及能够提供相关信息的Wi-Fi接入点、蓝牙和基站等传感器信息)。我们可能会将前面两类信息进行关联,以便我们能在不同设备上为您提供一致的服务。
</p>
<p>
2.2.2.2
日志信息:当您使用我们的网站或客户端提供的服务时,我们会自动收集您对我们服务的详细使用情况,作为有关网络日志保存。例如您的搜索查询内容、IP地址、浏览器的类型、电信运营商、使用的语言、访问日期和时间及您访问的网页记录等。
</p>
<p>
2.2.2.3
用户账户的支持信息:基于您使用伏龙AI平台服务而产生的用户的咨询记录、报障记录和针对用户故障的排障过程(如通信或通话记录),伏龙AI平台将通过记录、分析这些信息以便更及时响应您的帮助请求,以及用于改进服务。
</p>
<p>
2.2.2.4
数据调用:我们将根据您使用的具体功能,调用您上传的数据集及算法等相关信息,我们将说明具体的调用功能和相关用途(请注意:您上传的数据为个人私有,其他用户无查看及编辑权限,除非您同意公开,否则平台不会在任何情形公开您上传的任何数据信息)。
</p>
<p>
2.2.2.4.1
算法相关信息:我们将收集您上传的算法代码等相关信息,用于您在平台已有的数据集上测试、优化迭代或开发新的算法。
</p>
<p>
2.2.2.4.2
实验数据:动力电池实验室测试数据记录,包括电池单体、电池模组、电池系统(电池系统的子系统)、电池包的数据,信息传输均符合现有动力蓄电池实验相关国标要求[《电动汽车用动力蓄电池循环寿命要求及试验方法》
(GB/T 31484-2015)、《电动汽车用动力蓄电池安全要求及试验方法》 (GB/T 31485-2015) [
[ii]]、《电动汽车用动力蓄电池电性能要求及试验方法》 (GB/T
31486-2015)、《电动汽车用锂离子动力蓄电池包和系统第1部分:高功率应用测试规程》 (GB/T
31467.1-2015)、《电动汽车用锂离子动力蓄电池包和系统第2部分:高能量应用测试规程》 (GB/T
31467.2-2015)、《电动汽车用锂离子动力蓄电池包和系统第3部分:安全性要求与测试方法》 (GB/T
31467.3-2015)。];实验数据用于您开发新的算法,或者在平台已有的算法上进行二次开发,以产出新的算法。
</p>
<p>
2.2.2.4.3
实车数据(车辆参数及电池参数等相关数据信息):除身份识别信息以外,我们还会收集您上传的数据集中电池及车辆参数信息(车牌号、VIN、品牌、车系、车型、里程、电池厂商、电池型号等,信息传输均符合相关国标要求[《
电动汽车非车载传导式充电机与电池管理系统之间的通信协议》 (GB/T
27930-2015)、《电动汽车远程服务与管理系统技术规范》 (GB/T
32960-2015)]),用于您在平台已有的预置算法上验证数据集。
</p>
<p>
2.2.2.5
我们还将收集和存储在您浏览、访问平台及/或使用的产品或服务时主动向我们提供的信息,此类信息视为您个人主动公示的信息。
</p>
<p>
2.2.3
我们在向您提供业务功能或具体服务时,我们会按照本政策以及相应的产品服务协议的约定收集、使用、存储、对外提供及保护您的用户信息;超出本政策以及相应的产品服务协议约定收集您的用户信息的,我们会另行向您说明信息收集的范围与目的,并征得您的同意后方收集提供相应服务所必要的您的信息;如您选择不提供前述信息,将会影响到您使用相应产品,但不会影响您使用伏龙AI平台网站基本功能和其他产品。
</p>
<p>
2.2.4
我们可能向关联公司商业合作伙伴及第三方独立资料来源收集和储存其合法获得的与您有关的信息,如依法设立的征信机构查询您的相关信用信息,包括信用分和信用报告。如果为了向您提供服务而需要从第三方获取您的信息,我们将要求第三方说明信息来源,并要求第三方保障其提供信息的合法性;如果我们开展业务需进行的个人信息处理活动超出您原本向第三方提供个人信息时的授权范围,我们将征得您的明示同意。
</p>

<p>
(二)我们使用您的用户信息的情形
</p>
<p>
2.3 信息收集目的及用处
</p>
<p>
我们在遵守国家法律法规的前提下,出于向您提供并优化产品及服务的目的,包括但不限于完善现有产品及服务功能、开发新产品,提高产品及服务安全性等。如行政机关、司法机构等有权机需要我们配合开展调查,我们将遵守适用法律法规及其他向有权机关承诺之义务提供相关信息。
</p>

<p>
2.4
我们将持续优化产品功能及服务。如果产品的某一功能或服务未包括在前述说明中且需要收集您的信息,我们会通过更新本隐私声明,以弹窗、页面提示等方式另行向您说明信息的收集目的、范围及使用方式,并为您提供自主选择同意的方式,且在征得您明示同意后收集、使用。
</p>

<p>
2.5 我们出于如下目的,使用您提交以及我们收集的用户信息:
</p>
<p>
2.5.1
我们会根据本隐私声明的约定,在实现我们的产品及/或服务功能所必要的范围内,对所收集的个人信息进行使用。
</p>
<p>
2.5.2
在收集您的个人信息后,我们可能将通过技术手段对部分数据进行匿名化处理,匿名化处理的信息将无法识别主体。请您了解并同意,在此情况下我们有权使用已经匿名化的信息,并在不透露您个人信息的前提下,我们有权对用户数据库进行分析并予以商业化的利用。
</p>
<p>
2.5.3
我们可能以用户信息统计数据为基础,设计、开发、推广全新的产品及服务;我们会对我们的服务使用情况进行统计,并可能会与公众或第三方分享这些统计信息,但这些统计信息不包含您的任何身份识别信息。
</p>
<p>
2.5.4
为了向您提供服务,我们会向您发送信息、通知或与您进行业务沟通,包括但不限于为保证服务完成所必须的验证码、使用服务时所必要的推送通知。
</p>
<p>
2.5.5
为提高您使用我们及我们关联公司、合作伙伴提供服务的安全性,确保操作环境安全与识别账号异常状态,保护您或其他用户或公众的人身财产安全免遭侵害,更好地预防钓鱼网站、欺诈、网络漏洞、计算机病毒、网络攻击、网络侵入等安全风险,更准确地识别违反法律法规或阿里云相关协议、规则的情况,我们可能使用您的会员信息、并整合设备信息、有关网络日志以及我们关联公司、合作伙伴合法分享的信息,来判断您账户及交易风险、进行身份验证、安全事件的检测及防范,并依法采取必要的记录、审计、分析、处置措施。
</p>
<p>
2.5.6
如超出收集用户信息时所声称的目的,或者在超出具有直接或合理关联的范围使用用户信息前,我们会再次向您告知并征得您的明示同意。
</p>
<p>
2.5.7
请您注意,您在使用我们的产品及服务时所提供的所有个人信息,除非您删除、通过系统设置或联系我们等方式撤回您的同意,否则将在您使用我们的产品及服务期间持续授权我们使用。在您注销账户时,我们将停止使用并删除您的个人信息。
</p>
<p>
2.5.8
当我们要将您的个人信息用于本隐私声明未载明的其它用途时,或基于特定目的收集而来的信息用于其他目的时,我们会再次向您告知并征得您的明示同意。
</p>

<p>
2.6
为向您提供的其他附加服务而使用您提交以及我们收集的用户信息:为向您提供更便捷、更优质、个性化的产品及/或服务,努力提升您的体验,我们在向您提供的以下附加服务中可能会收集和使用您的个人信息。
</p>
<p>
2.6.1
基于存储权限的附加服务:我们向您申请获取此权限,目的是为了保障客户端的稳定运行。在您开启我们可读取/写入您设备存储的权限后,我们将自您设备存储空间内读取或向其中写入图片、文件、崩溃日志信息等必要信息,用于向您提供通过伏龙AI平台的技术服务处理的数据上传、下载、分发或在本地记录崩溃日志信息等功能。
</p>

<p>
2.7 征得授权同意的例外
</p>
<p>
依据国家法律法规,在下列情形中,我们可能会依法收集并使用您的相关个人信息而无需征求您的同意:
</p>
<p>
(1)与我们履行法律法规规定的义务相关的; <br />(2)与国家安全、国防安全直接相关的; <br />
(3)与公共安全、公共卫生、重大公共利益直接相关的; <br />
(4)与刑事侦查、起诉、审判和判决执行等直接相关的; <br />
(5)出于维护您或其他个人的生命、财产等重大合法权益但又很难得到您授权同意的; <br />
(6)所涉及的您的信息是您自行向社会公众公开的;<br />
(7)根据您的要求签订和履行合同所必需的;
<br />
(8)从合法公开披露的信息中收集个人信息的,如合法的新闻报道、政府信息公开等渠道; <br />
(9)维护所提供产品或服务的安全稳定运行所必需的,如发现、处置产品或服务的故障; <br />
(10)法律法规规定的其他情形。
</p>
<p class="bold">
三、我们如何使用Cookie和同类技术
</p>
<p>
为使您获得更轻松安全的使用体验,您使用我们的服务时,我们可能会在您的计算机或移动设备上存储名为Cookies的小数据文件。Cookies通常包含标识符、站点名称以及一些号码和字符。我们使用该等信息判断注册用户是否已经登录,提升服务质量及优化用户体验。
</p>
<p>
我们不会将Cookies用于本声明所述目的之外的任何用途。您可根据自己的偏好管理或删除Cookies。您可以清除计算机上保存的所有Cookies,大部分网络浏览器都设有阻止Cookies的功能。但如果您这么做,您可能需要在每一次访问我们的网站时亲自更改用户设置,而且您之前所记录的相应信息也均会被删除,并且可能会对您所使用服务的安全性有一定影响。
</p>
<p class="bold">
四、我们如何共享、转让、公开披露您的信息
</p>
<p>
4.1 共享
</p>
<p>
4.1.1 我们不会与昇科能源以外的任何公司、组织和个人共享您的个人信息,但以下情况除外:
</p>
(1)在法定情形下的共享:我们可能会根据法律法规规定、诉讼、争议解决需要,或按行政、司法机关依法提出的要求,对外共享您的个人信息。
<br />
(2)在获取明确同意的情况下共享:获得您的明确同意后,我们会与其它方共享您的个人信息。<br />
(3)在您主动选择情况下共享:某些产品及/或服务可能由第三方提供或由相关服务提供方与第三方共同提供,因此,只有在经您授权后,共享您的信息,第三方才能为您提供您需要的产品及/或服务。<br />
(4)与关联公司间共享:经您授权后,我们可能会将您的个人信息与我们的关联公司共享。我们只会共享必要的个人信息,并要求关联公司以不低于本隐私声明水平的方式保护您的个人信息。我们的关联公司如要改变个人信息的处理目的,将再次征求您的授权同意。<br />
(5)与授权合作伙伴共享:我们可能委托授权合作伙伴为您提供某些服务或代表我们履行职能,我们仅会出于本隐私声明的合法、正当、必要、特定、明确的目的共享您的信息,授权合作伙伴只能接触到其履行职责所需信息,且不得将此信息用于其他任何目的。<br />
我们的合作伙伴包括以下类型:<br />
a.广告、分析服务类的授权合作伙伴。除非得到您的许可,否则我们不会将您的个人身份信息与提供广告、分析服务的合作伙伴共享。我们会委托这些合作伙伴处理与广告覆盖面和有效性相关的信息,但不会提供您的个人身份信息,或者我们将这些信息进行去标识化处理,以便它不会识别您个人。这类合作伙伴可能将上述信息与他们合法获取的其他数据相结合,以执行我们委托的广告服务或决策建议。<br />
b.供应商、服务提供商和其他合作伙伴。我们将信息发送给支持我们业务的供应商、服务提供商和其他合作伙伴,这些支持包括受我们委托提供的技术基础设施服务、分析我们服务的使用方式、衡量广告和服务的有效性、提供客户服务、支付便利或进行学术研究和调查。
<p>
4.1.2
我们会对授权合作伙伴获取有关信息的应用程序接口(API)、软件工具开发包(SDK)进行严格的安全检测,并与授权合作伙伴约定严格的数据保护措施,令其按照我们的委托目的、服务说明、本隐私声明以及其他任何相关的保密和安全措施来处理个人信息。
</p>
<p>
4.1.3
在将信息提供给第三方前,我们会审慎评估该第三方收集信息的合法性、正当性、必要性。有关您在使用第三方服务中相关的隐私控制和选项,以及服务提供者的隐私规定,请您谨慎参阅该等第三方所提供的隐私声明。
</p>
<p>
4.1.4
对我们与之共享个人信息的公司、组织和个人,我们会与其签署严格的保密协定,要求他们按照我们的说明以及其他任何相关的保密和安全措施来处理个人信息。在个人敏感数据使用上,我们要求第三方采用数据脱敏和加密技术,从而更好地保护用户数据。
</p>

<p>
4.2 转让
</p>
<p>
我们不会将您的个人信息转移给任何公司、组织和个人,但以下情况除外:
</p>
<p>
4.2.1 在获取明确同意的情况下转让:获得您的明确同意后,我们会向其它方转让您的个人信息;
</p>
<p>
4.2.2
在本产品及服务提供者因合并、分立、解散、被宣告破产等原因需要转移个人信息的,应当向您告知接收方的名称或者姓名和联系方式。接收方应当继续履行个人信息处理者的义务。接收方变更原先的处理目的、处理方式的,应当依照相关规定重新取得您的同意。
</p>

<p>
4.3 公开披露
</p>
<p>
我们仅会在以下情况下,公开披露您的个人信息:
</p>
<p>
4.3.1 获得您明确同意或基于您的主动选择,我们可能会公开披露您的个人信息;
</p>
<p>
4.3.2
如果我们确定您出现违反法律法规或严重违反本产品及/或服务相关协议及规则的情况,或为保护本产品及/或服务及其关联公司用户或公众的人身财产安全免遭侵害,我们可能依据法律法规或本产品及/或服务相关协议规则征得您同意的情况下披露关于您的个人信息,包括相关违规行为以及本产品及/或服务已对您采取的措施。
</p>

<p>
4.4 共享、转移、公开披露个人信息时事先征得授权同意的例外
</p>
<p>
4.4.1 以下情形中,共享、转移、公开披露您的个人信息无需事先征得您的授权同意: <br />
(1)与国家安全、国防安全直接相关的; <br />
(2)与公共安全、公共卫生、重大公共利益直接相关的; <br />
(3)与犯罪侦查、起诉、审判和判决执行等直接相关的; <br />(4)法律法规规定的其他情形。
</p>
<p>
4.4.2
请知悉,根据适用的法律,若我们对个人信息采取技术措施和其他必要措施进行处理,使得数据接收法重新识别特定个人且不能方无复原,则此类处理后数据的共享、转移、公开披露无需另行向您通知并征得您的同意。
</p>

<p class="bold">
五、用户业务数据和公开信息
</p>
<p>
不同于您的用户信息,对于用户业务数据和公开信息,伏龙AI平台将按如下方式处理:
</p>
<p>
5.1 用户业务数据
</p>
<p>
5.1.1
您通过伏龙AI平台提供的服务,加工、存储、上传、下载、分发以及通过其他方式处理的数据,均为您的用户业务数据,您完全拥有您的用户业务数据。伏龙AI平台作为服务提供商,我们只会严格执行您的指示处理您的业务数据,除按与您协商一致或执行明确的法律法规要求外,不对您的业务数据进行任何非授权的使用或披露。
</p>
<p>
5.1.2
您应对您的用户业务数据来源及内容负责,伏龙AI平台提示您谨慎判断数据来源及内容的合法性。因您的用户业务数据内容违反法律法规、部门规章或国家政策而造成的全部结果及责任均由您自行承担。
</p>
<p>
5.1.3
根据您与伏龙AI平台协商一致,伏龙AI平台在您选定的数据中心存储用户业务数据。伏龙AI平台恪守对用户的安全承诺,根据适用的法律保护用户存储在伏龙AI平台数据中心的数据。
</p>

<p>
5.2 公开信息
</p>
<p>
5.2.1
公开信息是指您公开分享的任何信息,任何人都可以在使用和未使用伏龙AI平台网站服务期间查看或访问这些信息。例如您在伏龙AI平台开发者论坛发布的信息。
</p>
<p>
5.2.2
在使用伏龙AI平台网站时,如开发者论坛,如您不可避免的要向对方或潜在的交流对方披露自己的个人信息,如联络方式或者邮政地址。请您妥善保护自己的个人信息,仅在必要的情形下向他人提供。如您发现自己的个人信息泄漏,尤其是您的账户或密码发生泄露,请您立即联络伏龙AI平台客服,以便伏龙AI平台采取相应措施。
</p>

<p class="bold">
六、我们如何保护和保存您的信息
</p>
<p>
6.1 我们保护您个人信息的技术与措施
</p>
<p>
6.1.1 数据安全技术措施
</p>
<p>
我们采取安全技术和管理措施来防止您的个人信息遭到未经授权访问使用、公开披露、使用、修改、损坏或丢失,包括但不限于:<br />
(1)在个人信息使用时,例如个人信息展示、个人信息关联计算,我们会采用包括内容替换在内多种数据脱敏技术增强个人信息在使用中安全性。
<br />
(2)我们采取严格的数据访问权限控制和多重身份认证技术保护个人信息,避免数据被违规使用。
</p>
<p>
6.1.2 数据安全制度措施
</p>
<p>
(1)我们制定了安全保障制度,规范我们各部门对个人信息所采取的管理措施; <br />
(2)我们存储您个人数据的系统得到了相应的安全和服务认证,如通过公安部安全等级保护测评; <br />
(3)我们会定期举办安全和隐私保护培训课程,加强员工对于保护个人信息重要性的认识; <br />
(4)我们严格管理访问权限,对被授权访问您的个人信息的人员,实施最小授权的访问控制策略,使其只能访问职责所需的最小必要的个人信息,且仅具备完成职责所需的最少的数据操作权限;
</p>
<p>
6.1.3
互联网并非绝对安全的环境,使用本平台服务时,我们将尽力确保或担保您发送给我们的任何信息的安全性。如果我们的物理、技术、或管理防护设施遭到第三方破坏,导致信息被非授权访问、公开披露、篡改、或毁坏,导致您的合法权益受损,我们将协助您依法维护自身权益。
</p>
<p>
6.1.4
请使用复杂密码,协助我们保证您的账号安全。同时请注意,您在使用我们服务时自愿共享甚至公开分享的信息,可能会涉及您或他人的个人信息甚至个人敏感信息。请您更加谨慎地考虑,是否在使用我们的服务时共享甚至公开分享相关信息。
</p>
<p>
6.1.5 安全事件处置
</p>
<p>
(1)我们建立专门的管理制度、流程和组织以保障信息的安全。例如,我们严格限制访问信息的人员范围,要求他们遵守保密义务,并进行审计。
<br />
(2)在不幸发生个人信息安全事件后,我们将按照法律法规的要求启动应急预案,阻止安全事件扩大,并以推送通知、公告等形式告知您。同时,我们还将按照监管部门要求,上报个人信息安全事件的处置情况。
</p>
<p>
6.1.6
如果您发现自己的个人信息泄密或我们存在有安全弱点、可疑安全事件时,尤其是您的账户及密码发生泄露,请您立即通过本隐私权声明约定的联系方式联络我们,以便我们采取相应措施,禁止私自尝试或验证弱点。
</p>
<p>
6.1.7 如果您对我们的个人信息保护有任何疑问,可通过我们在本隐私权声明中提供的联系方式联系我们。
</p>
<p>
6.2 您个人信息的保存
</p>
<p>
6.2.1 信息存储的地点:
我们在中华人民共和国境内运营中收集和产生的个人信息,存储在中国境内,以下情形除外: <br />
(1)法律法规有明确规定; <br />
(2)获得您的明确授权; <br />
针对以上情形,我们会确保依据本隐私权声明对您的个人信息提供足够的保护。
</p>
<p>
6.2.2 信息存储期限:
</p>
<p>
我们只会在达成本声明所述目的所需的期限内保留您的个人信息,除非法律有强制的存留要求。而我们判断前述期限的标准包括:
<br />
(1)完成与您相关的服务目的、维护相应服务及业务记录、应对您可能的查询或投诉; <br />
(2)保证我们为您提供服务的安全和质量; <br />
(3)您是否同意更长的留存期间; <br />
(4)是否存在保留期限的其他特别约定
</p>
<p>
在您的个人信息超出保留期限后,我们会根据适用法律的要求删除您的个人信息,或使其匿名化处理。
</p>
<p>
6.3 信息删除和匿名化处理
</p>
<p>
6.3.1
如本平台服务决定停止运营时,我们将在相关服务停止运营后停止继续收集您的个人信息。我们将以公告形式将停止运营通知向您送达。对已持有的您的个人信息将进行删除或匿名化处理。涉及儿童个人信息的,我们会并将停止运营的通知及时告知儿童监护人。
</p>
<p class="bold">
七、您如何管理您的信息
</p>
<p>
我们非常重视您对个人信息的关注,并尽全力保护您对于您个人信息访问、更正、删除以及撤回同意的权利,以使您拥有充分的能力保障您的隐私和安全。您的权利包括:
</p>
<p>
7.1 查询、更正和补充您的个人信息
</p>
<p>
除法律法规规定外,您有权查询、更正和补充您的头像、手机号码、电子邮箱等个人信息,具体操作步骤:点击头像,进入个人中心,进行信息查询或更正。
</p>
<p>
7.2 删除您的个人信息
</p>
<p>
删除个人信息:您可以通过伏龙AI平台企业微信交流群,寻找技术人员进行注销等用户信息删除业务申请。
</p>
<p>
7.2.1 在以下情形中,您可以向我们提出删除个人信息的请求: <br />
(1)如果我们处理个人信息的行为违反法律法规;<br />
(2)如果我们收集、使用您的个人信息,却未征得您的同意;<br />
(3)如果我们处理个人信息的行为违反了与您的约定; <br />(4)如果您注销了账户;<br />
(5)如果我们终止服务及运营。<br />
</p>
<p>
7.2.2
若我们决定响应您的删除请求,我们还将同时通知从我们获得您的个人信息的实体,要求其及时删除,除非法律法规另有规定,或这些实体获得您的独立授权。当您从我们的服务中删除信息后,我们可能不会立即从备份系统中删除相应的信息,但会在备份更新时删除这些信息。
</p>
<p>
7.3 改变您授权同意的范围或撤回您的授权
</p>
<p>
7.3.1
您可以通过删除信息、关闭设备功能、在设备系统中进行隐私设置等方式改变您授权我们继续收集个人信息的范围或撤回您的授权。您也可以通过注销账户的方式,撤回我们继续收集、处理您个人信息的全部授权。
</p>
<p>
7.3.2
请您理解,每个业务功能需要一些基本的个人信息才能得以完成,当您撤回同意或授权后,我们无法继续为您提供撤回同意或授权所对应的服务,也不再处理您相应的个人信息。但您撤回同意或授权的决定,不会影响此前基于您的授权而开展的个人信息处理。
</p>
<p>
7.4 注销账户
</p>
<p>
7.4.1
您随时可注销此前注册的账户,您可以通过伏龙AI平台企业微信交流群,寻找技术人员进行注销等用户信息删除业务申请。
</p>
<p>
7.4.2
在注销账户之后,我们将停止为您提供产品或服务,并依据您的要求,删除您的个人信息,法律法规另有规定的除外。
</p>
<p>
7.5 响应您的请求
</p>
<p>
7.5.1
如果您无法通过上述方式查询、更正、补充或删除您的个人信息,或您需要查询、更正、补充或删除您在使用我们产品及/或服务时所产生的其他个人信息,或您认为我们存在任何违反法律法规或与您关于个人信息的收集或使用的约定,可通过我们在本隐私权声明中提供的联系方式联系我们。
</p>
<p>
7.5.2
为了保障安全,我们可能需要您提供书面请求,或以其它方式证明您的身份,我们将在收到您反馈并验证您的身份后的30天内答复您的请求。对于您合理的请求,我们原则上不收取费用,但对多次重复、超出合理限度的请求,我们将视情况收取一定成本费用。对于那些无端重复、需要过多技术手段(例如,需要开发新系统或从根本上改变现行惯例)、给他人合法权益带来风险或者非常不切实际(例如,涉及备份磁带上存放的信息)的请求,我们可能会予以拒绝。
</p>
<p>
7.5.3 在以下情形中,按照法律法规要求,我们将可能无法响应您的请求: <br />
(1)与国家安全、国防安全直接相关的;<br />
(2)与公共安全、公共卫生、重大公共利益直接相关的;<br />
(3)与犯罪侦查、起诉、审判和执行判决等直接相关的;<br />
(4)有充分证据表明您存在主观恶意或滥用权利的;<br />
(5)响应您的请求将导致您或其他个人、组织的合法权益受到严重损害的;
<br />(6)涉及商业秘密的。
</p>
<p class="bold">
八、我们如何处理未成年人的信息
在提供平台服务中我们推定您具有相应的民事行为能力。如您为未成年人,我们要求您请您的父母或者其他监护人仔细阅读本隐私权声明,并在征得您的父母或其他监护人的同意的前提下使用我们的服务或向我们提供信息。
</p>
<p>
8.1
对于经父母或监护人明确同意而收集、处理未成年人个人信息的情况,我们只会在法律允许的范围内、或者父母或监护人明确同意,或者出于保护未成年人所必要的情况下,收集和使用此类信息。
</p>
<p>
8.2
如果我们在未事先获得可证实的父母明确同意的情况下收集、使用了未成年人的个人信息,我们将设法尽快删除相关信息。
</p>
<p>
8.3
如您为未成年人的父母或监护人,当您对您所监护的未成年人的信息处理存在疑问时,请通过下文中的联系方式联系我们。
</p>
<p class="bold">
九、本隐私权声明如何更新
</p>
<p>
9.1 我们的隐私权声明可能会变更。
</p>
<p>
9.2
未经您明确同意,我们不会限制您依据本隐私声明所应享有的权利。我们会通过在本平台上发布对隐私权声明所做的任何变更。
</p>

<p>
9.3
对于重大变更,我们还会提供更为显著的通知(包括对于某些服务,我们会通过邮件通知或网站公示的方式进行通知甚至向您提供弹窗提示,说明隐私权政策的具体变更内容)。
</p>
<p>
9.3.1 本隐私权声明所指的重大变更包括但不限于: <br />
(1)我们的服务模式发生重大变化。如处理个人信息的目的、处理的个人信息类型、个人信息的使用方式等;<br />
(2)我们在所有权结构、组织架构等方面发生重大变化。如业务调整、破产并购等引起的所有者变更等;<br />
(3)个人信息共享、转移或公开披露的主要对象发生变化;<br />
(4)您参与个人信息处理方面的权利及其行使方式发生重大变化;<br />
(5)我们负责处理个人信息安全的责任部门、联络方式及投诉渠道发生变化;<br />
(6)个人信息安全影响评估报告表明存在高风险。<br />
</p>
<p class="bold">
十、如何联系我们
</p>
<p>
10.1 您可以通过平台客户端或者电话与客服取得联系,反馈您的意见或投诉。
</p>
<p>
10.2 我们还设立了用户反馈专用邮箱,您可以将您的问题发送至以下邮箱地址 vloong@thinkenergy.tech
,或拨打我们的客服热线 010-53399339 联系我们,我们将在15个工作日内核实并处理您反馈的问题。
</p>
<p>
10.3
如果您对我们的回复不满意,特别是您认为我们的个人信息处理行为损害了您的合法权益,您还可以向网信、电信、公安及工商等监管部门进行投诉或举报,或者向有管辖权的法院提起诉讼。
</p>
</div>
</template>

+ 8
- 17
webapp/src/views/register.vue View File

@@ -1,18 +1,10 @@
/** Copyright 2020 Tianshu AI Platform. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* =============================================================
*/
/** Copyright 2020 Tianshu AI Platform. All Rights Reserved. * * Licensed under the Apache License,
Version 2.0 (the "License"); * you may not use this file except in compliance with the License. *
You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless
required by applicable law or agreed to in writing, software * distributed under the License is
distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied. * See the License for the specific language governing permissions and * limitations under
the License. * ============================================================= */

<template>
<div style="height: 100%;">
@@ -24,7 +16,6 @@
label-width="26%"
class="register-form"
>
<h2 class="register-title">之江天枢人工智能开源平台</h2>
<el-form-item label="用户名" prop="username">
<el-input v-model="registerForm.username" placeholder="请输入用户名" />
</el-form-item>
@@ -269,7 +260,7 @@ export default {
width: 360px;

.el-form-item {
margin-bottom: 15px;
// margin-bottom: 15px;
}
}



+ 18
- 20
webapp/src/views/resetpassword.vue View File

@@ -1,18 +1,10 @@
/** Copyright 2020 Tianshu AI Platform. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* =============================================================
*/
/** Copyright 2020 Tianshu AI Platform. All Rights Reserved. * * Licensed under the Apache License,
Version 2.0 (the "License"); * you may not use this file except in compliance with the License. *
You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless
required by applicable law or agreed to in writing, software * distributed under the License is
distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied. * See the License for the specific language governing permissions and * limitations under
the License. * ============================================================= */

<template>
<div style="height: 100%;">
@@ -25,7 +17,6 @@
label-width="0px"
class="register-form"
>
<h2 class="register-title">之江天枢人工智能开源平台</h2>
<el-form-item prop="email">
<el-input v-model="registerForm.email" auto-complete="on" placeholder="请输入您的邮箱">
<i slot="prefix" class="el-input__icon el-icon-message" />
@@ -36,6 +27,7 @@
<i slot="prefix" class="el-input__icon el-icon-circle-check" />
</el-input>
<el-button
class="my-btn"
:loading="codeLoading"
style="width: 41%;"
:disabled="isDisabled"
@@ -57,6 +49,7 @@
<el-button
type="primary"
size="medium"
class="my-btn"
style="width: 100%;"
@click="submitForm('registerForm')"
>修改密码</el-button
@@ -223,14 +216,19 @@ export default {
text-align: center;
}

@media screen and (max-width: 1000px) {
.register-title {
font-size: 1.3em;
.my-btn {
height: 60px !important;
}
}

.register-form {
width: 360px;
::v-deep .el-input__inner {
height: 60px !important;
}
* {
font-size: 20px !important;
}

.input-icon {
width: 14px;


+ 7
- 15
webapp/src/views/system/authCode/index.vue View File

@@ -1,18 +1,10 @@
/** Copyright 2020 Tianshu AI Platform. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* =============================================================
*/
/** Copyright 2020 Tianshu AI Platform. All Rights Reserved. * * Licensed under the Apache License,
Version 2.0 (the "License"); * you may not use this file except in compliance with the License. *
You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless
required by applicable law or agreed to in writing, software * distributed under the License is
distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied. * See the License for the specific language governing permissions and * limitations under
the License. * ============================================================= */

<template>
<div class="app-container">


+ 7
- 15
webapp/src/views/trainingJob/components/jobDetail.vue View File

@@ -1,18 +1,10 @@
/** Copyright 2020 Tianshu AI Platform. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* =============================================================
*/
/** Copyright 2020 Tianshu AI Platform. All Rights Reserved. * * Licensed under the Apache License,
Version 2.0 (the "License"); * you may not use this file except in compliance with the License. *
You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless
required by applicable law or agreed to in writing, software * distributed under the License is
distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied. * See the License for the specific language governing permissions and * limitations under
the License. * ============================================================= */

<template>
<div class="job-detail-container">


+ 8
- 15
webapp/src/views/trainingJob/detail.vue View File

@@ -1,18 +1,10 @@
/** Copyright 2020 Tianshu AI Platform. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* =============================================================
*/
/** Copyright 2020 Tianshu AI Platform. All Rights Reserved. * * Licensed under the Apache License,
Version 2.0 (the "License"); * you may not use this file except in compliance with the License. *
You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless
required by applicable law or agreed to in writing, software * distributed under the License is
distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied. * See the License for the specific language governing permissions and * limitations under
the License. * ============================================================= */

<template>
<div class="app-container">
@@ -169,6 +161,7 @@
<log-dialog ref="logDialog" />
<!--右边侧边栏-->
<el-drawer
append-to-body
:visible.sync="drawerVisible"
:with-header="false"
:direction="'rtl'"


+ 7
- 15
webapp/src/views/trainingJob/index.vue View File

@@ -1,18 +1,10 @@
/** Copyright 2020 Tianshu AI Platform. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* =============================================================
*/
/** Copyright 2020 Tianshu AI Platform. All Rights Reserved. * * Licensed under the Apache License,
Version 2.0 (the "License"); * you may not use this file except in compliance with the License. *
You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless
required by applicable law or agreed to in writing, software * distributed under the License is
distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied. * See the License for the specific language governing permissions and * limitations under
the License. * ============================================================= */

<template>
<div class="app-container">


+ 12
- 15
webapp/src/views/trainingJob/jobList.vue View File

@@ -1,18 +1,10 @@
/** Copyright 2020 Tianshu AI Platform. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* =============================================================
*/
/** Copyright 2020 Tianshu AI Platform. All Rights Reserved. * * Licensed under the Apache License,
Version 2.0 (the "License"); * you may not use this file except in compliance with the License. *
You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless
required by applicable law or agreed to in writing, software * distributed under the License is
distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied. * See the License for the specific language governing permissions and * limitations under
the License. * ============================================================= */

<template>
<div>
@@ -54,6 +46,9 @@
<span>{{ parseTime(scope.row.createTime) }}</span>
</template>
</el-table-column>

<el-table-column v-if="isAdmin" prop="originUserId" label="创建人" />

<el-table-column label="操作" width="200px" fixed="right">
<template slot-scope="scope">
<!--状态:0为待处理,1为运行中 -->
@@ -83,6 +78,7 @@
<script>
import CRUD, { presenter, header, crud } from '@crud/crud';
import pagination from '@crud/Pagination';
import { mapGetters } from 'vuex';
import crudJob, { stop as stopJob, del as deleteJob } from '@/api/trainingJob/job';
import DropdownHeader from '@/components/DropdownHeader';
import { generateMap } from '@/utils';
@@ -127,6 +123,7 @@ export default {
};
},
computed: {
...mapGetters(['isAdmin']),
jobStatusList() {
const list = [{ label: '全部', value: null }];
Object.keys(this.statusNameMap).forEach((status) => {


+ 7
- 15
webapp/src/views/trainingJob/jobParam.vue View File

@@ -1,18 +1,10 @@
/** Copyright 2020 Tianshu AI Platform. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* =============================================================
*/
/** Copyright 2020 Tianshu AI Platform. All Rights Reserved. * * Licensed under the Apache License,
Version 2.0 (the "License"); * you may not use this file except in compliance with the License. *
You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless
required by applicable law or agreed to in writing, software * distributed under the License is
distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied. * See the License for the specific language governing permissions and * limitations under
the License. * ============================================================= */

<template>
<div>


+ 1
- 1
webapp/src/views/visual/Layout.vue View File

@@ -1576,7 +1576,7 @@ export default {
}

.category-selected {
background-color: #d8dfff !important;
background-color: #dbf1f1 !important;
}

.tag-search {


Loading…
Cancel
Save