Browse Source

Merge branch 'dev_zxr' of HuangKaiSheng/seecoder-devcloud-frontend into dev

ZhaoXingRui 5 years ago
parent
commit
22a7a27a5f
44 changed files with 687 additions and 109 deletions
  1. 2 0
      .eslintrc.js
  2. 2 0
      mock/index.js
  3. 121 0
      mock/routers/apitest.js
  4. 27 0
      mock/routers/autotest.js
  5. 23 0
      mock/routers/database.js
  6. 87 0
      mock/routers/functest.js
  7. 3 1
      src/api/devcloud/autotest.ts
  8. 5 1
      src/api/devcloud/functest.ts
  9. BIN
      src/assets/example.png
  10. 1 0
      src/assets/icon_new/bug-hover.svg
  11. 1 0
      src/assets/icon_new/bug-using.svg
  12. 1 0
      src/assets/icon_new/bug.svg
  13. 0 0
      src/assets/icon_new/database-hover.svg
  14. 0 0
      src/assets/icon_new/database-using.svg
  15. 0 0
      src/assets/icon_new/database.svg
  16. 1 0
      src/assets/icon_new/git-hover.svg
  17. 1 0
      src/assets/icon_new/git-using.svg
  18. 1 0
      src/assets/icon_new/git.svg
  19. 1 0
      src/assets/icon_new/link-hover.svg
  20. 1 0
      src/assets/icon_new/link-using.svg
  21. 1 0
      src/assets/icon_new/link.svg
  22. 1 0
      src/assets/icon_new/pipeline-hover.svg
  23. 1 0
      src/assets/icon_new/pipeline-using.svg
  24. 1 0
      src/assets/icon_new/pipeline.svg
  25. 1 0
      src/assets/icon_new/schedule-hover.svg
  26. 1 0
      src/assets/icon_new/schedule-using.svg
  27. 1 0
      src/assets/icon_new/schedule.svg
  28. 1 0
      src/assets/icon_new/task-hover.svg
  29. 1 0
      src/assets/icon_new/task-using.svg
  30. 1 0
      src/assets/icon_new/task.svg
  31. 1 0
      src/assets/icon_new/test-hover.svg
  32. 1 0
      src/assets/icon_new/test-using.svg
  33. 1 0
      src/assets/icon_new/test.svg
  34. 1 1
      src/components/CommonDrawer.vue
  35. 8 2
      src/components/GeneralTable.vue
  36. 9 6
      src/components/RequirementDrawer.vue
  37. 83 25
      src/components/SideBar.vue
  38. 1 1
      src/components/Tree.vue
  39. 4 0
      src/element-plus.ts
  40. 4 0
      src/router/index.ts
  41. 92 69
      src/views/Project/APITest.vue
  42. 110 0
      src/views/Project/Commit.vue
  43. 11 2
      src/views/Project/Invite.vue
  44. 73 1
      src/views/Project/Schedule.vue

+ 2 - 0
.eslintrc.js

@@ -20,5 +20,7 @@ module.exports = {
     'linebreak-style': [0, 'error', 'windows'],
     'import/no-cycle': 0,
     '@typescript-eslint/no-this-alias': ['off'],
+    'import/no-extraneous-dependencies': ['error', { devDependencies: true }],
+    '@typescript-eslint/no-var-requires': 0,
   },
 };

+ 2 - 0
mock/index.js

@@ -30,6 +30,8 @@ app.use(`${prefix}/tree`, require('./routers/tree'));
 app.use(`${prefix}/bug_list`, require('./routers/buglist'));
 app.use(`${prefix}/stages`, require('./routers/stage'));
 app.use(`${prefix}/commits`, require('./routers/commits'));
+app.use(`${prefix}/test`, require('./routers/apitest'));
+app.use(`${prefix}/func_test`, require('./routers/functest'));
 
 app.listen(4000);
 

+ 121 - 0
mock/routers/apitest.js

@@ -0,0 +1,121 @@
+const router = require('express').Router();
+
+const Mock = require();
+const wrapper = require('../wrapper');
+
+const { Random } = Mock;
+
+router.post('/create', (req, res) => {
+  res.json(wrapper('success'));
+});
+
+router.get('/list', (req, res) => {
+  res.json(wrapper(
+    Mock.mock([
+      {
+        testId: 18,
+        testName: Random.csentence(5, 20),
+        projectId: 45,
+        createTime: Random.datetime(),
+        username: 'ZhaoXR',
+        url: 'https://zhidao.baidu.com/question/1899892881196615220.html',
+        params: [{}],
+        'method|1': ['get', 'post'],
+        qps: 150,
+      },
+      {
+        testId: 19,
+        testName: Random.csentence(5, 20),
+        projectId: 45,
+        createTime: Random.datetime(),
+        username: 'ZhaoXR',
+        url: 'http://localhost:3000',
+        params: [{}],
+        'method|1': ['get', 'post'],
+        qps: 30,
+      },
+      {
+        testId: 20,
+        testName: Random.csentence(5, 20),
+        projectId: 45,
+        createTime: Random.datetime(),
+        username: 'ZhaoXR',
+        url: 'http://localhost:3000/project/1/apitest',
+        params: [{}],
+        'method|1': ['get', 'post'],
+        qps: 10,
+      },
+      {
+        testId: 21,
+        testName: Random.csentence(5, 20),
+        projectId: 45,
+        createTime: Random.datetime(),
+        username: 'ZhaoXR',
+        url: 'localhost:3000',
+        params: [{}],
+        'method|1': ['get', 'post'],
+        qps: 20,
+      },
+    ]),
+  ));
+});
+
+router.get('/delete', (req, res) => {
+  res.json(wrapper('success'));
+});
+
+router.get('/execute', (req, res) => {
+  res.json(wrapper('success'));
+});
+
+router.get('/result', (req, res) => {
+  res.json(wrapper(
+    Mock.mock([
+      {
+        id: 11,
+        testId: 18,
+        executeTime: Random.datetime(),
+        success: 20,
+        failure: 0,
+        timeList: [3, 3, 4, 4, 5, 5, 5, 6, 6, 6, 2, 3, 3, 2, 4, 3, 2, 2, 4, 4],
+        maxTime: 6,
+        minTime: 2,
+        averageTime: 3,
+        pipelineRecordId: -1,
+      },
+      {
+        id: 12,
+        testId: 18,
+        executeTime: Random.datetime(),
+        success: 20,
+        failure: 0,
+        timeList: [2, 3, 3, 4, 4, 4, 5, 5, 5, 6, 4, 4, 5, 5, 6, 6, 7, 4, 5, 5],
+        maxTime: 7,
+        minTime: 2,
+        averageTime: 4,
+        pipelineRecordId: -1,
+      },
+    ]),
+  ));
+});
+
+router.get('/latest', (req, res) => {
+  res.json(wrapper(
+    Mock.mock([
+      {
+        id: 12,
+        testId: 18,
+        executeTime: Random.datetime(),
+        success: 20,
+        failure: 0,
+        timeList: [2, 3, 3, 4, 4, 4, 5, 5, 5, 6, 4, 4, 5, 5, 6, 6, 7, 4, 5, 5],
+        maxTime: 7,
+        minTime: 2,
+        averageTime: 4,
+        pipelineRecordId: -1,
+      },
+    ]),
+  ));
+});
+
+module.exports = router;

+ 27 - 0
mock/routers/autotest.js

@@ -0,0 +1,27 @@
+const router = require('express').Router();
+
+const Mock = require();
+const wrapper = require('../wrapper');
+
+const { Random } = Mock;
+
+router.get('/list', (req, res) => {
+  res.json(wrapper(
+    Mock.mock({
+      'data|5-10': [{
+        'id|+1': 1,
+        testId: 18,
+        executeTime: Random.datetime(),
+        success: 20,
+        failure: 0,
+        timeList: [2, 3, 3, 4, 4, 4, 5, 5, 5, 6, 4, 4, 5, 5, 6, 6, 7, 4, 5, 5],
+        maxTime: 7,
+        minTime: 2,
+        averageTime: 4,
+        pipelineRecordId: -1,
+      }],
+    }).data,
+  ));
+});
+
+module.exports = router;

+ 23 - 0
mock/routers/database.js

@@ -0,0 +1,23 @@
+const router = require('express').Router();
+
+const Mock = require();
+const wrapper = require('../wrapper');
+
+const { Random } = Mock;
+
+router.get('/instances', (req, res) => {
+  res.json(wrapper(
+    Mock.mock({
+      'data|5': [{
+        'id|+1': 1,
+        name: Random.csentence(2, 10),
+      }],
+    }).data,
+  ));
+});
+
+router.post('/exec', (req, res) => {
+  res.json(wrapper('success'));
+});
+
+module.exports = router;

+ 87 - 0
mock/routers/functest.js

@@ -0,0 +1,87 @@
+const router = require('express').Router();
+
+const Mock = require();
+const wrapper = require('../wrapper');
+
+const { Random } = Mock;
+
+router.get('', (req, res) => {
+  res.json(wrapper(
+    Mock.mock({
+      'data|5-10': [{
+        'id|+1': 1,
+        projectId: 101,
+        title: Random.csentence(5, 20),
+        'pass|1': [0, 1],
+      }],
+    }).data,
+  ));
+});
+
+router.get('/steps', (req, res) => {
+  res.json(wrapper(
+    Mock.mock({
+      'data|5-10': [{
+        'id|+1': 1,
+        testCaseId: 1,
+        description: Random.csentence(10, 30),
+        expectation: Random.csentence(10, 30),
+        'state|1': ['待测试', '已测试', '出现bug'],
+      }],
+    }).data,
+  ));
+});
+
+router.post('', (req, res) => {
+  res.json(wrapper('success'));
+});
+
+router.put('', (req, res) => {
+  res.json(wrapper('success'));
+});
+
+router.put('/finish', (req, res) => {
+  res.json(wrapper('success'));
+});
+
+router.put('/reopen', (req, res) => {
+  res.json(wrapper('success'));
+});
+
+router.delete('', (req, res) => {
+  res.json(wrapper('success'));
+});
+
+router.post('/steps', (req, res) => {
+  res.json(wrapper('success'));
+});
+
+router.put('/steps', (req, res) => {
+  res.json(wrapper('success'));
+});
+
+router.delete('/steps', (req, res) => {
+  res.json(wrapper('success'));
+});
+
+router.put('/steps/state', (req, res) => {
+  res.json(wrapper('success'));
+});
+
+router.get('/record/latest', (req, res) => {
+  res.json(wrapper(
+    Mock.mock(
+      {
+        'data|10': [{
+          'id|+1': 1,
+          pipelineId: 1,
+          timestamp: Random.datetime(),
+          'operationType|1': ['完成测试', '重新开放测试'],
+          pipelineRecordId: -1,
+        }],
+      },
+    ).data,
+  ));
+});
+
+module.exports = router;

+ 3 - 1
src/api/devcloud/autotest.ts

@@ -2,4 +2,6 @@ import axios from '@/utils/axios';
 
 import { AUTOTEST_PREFIX } from './prefix';
 
-export const getAutoTestResultByProjectId = (projectId: number) => axios.get(`${AUTOTEST_PREFIX}/list/${projectId}`);
+export const getAutoTestResultByProjectId = (projectId: number, testId: number) => axios.get(
+  `${AUTOTEST_PREFIX}/list?projectId=${projectId}&testId=${testId}`,
+);

+ 5 - 1
src/api/devcloud/functest.ts

@@ -4,7 +4,9 @@ import { FUNCTEST_PREFIX } from './prefix';
 
 export const getTestCases = (projectId: number) => axios.get(`${FUNCTEST_PREFIX}?projectId=${projectId}`);
 
-export const createTestCase = (projectId: number, title: string) => axios.post(`${FUNCTEST_PREFIX}?projectId=${projectId}&title=${title}`);
+export const createTestCase = (projectId: number, title: string, taskId: number) => axios.post(
+  `${FUNCTEST_PREFIX}?projectId=${projectId}&title=${title}&taskId=${taskId}`,
+);
 
 export const deleteTestCase = (testCaseId: number) => axios.delete(`${FUNCTEST_PREFIX}?testCaseId=${testCaseId}`);
 
@@ -31,3 +33,5 @@ export const updateTestCaseStepState = (testStepId: number, state: string) => ax
 export const deleteTestCaseStep = (testStepId: number) => axios.delete(`${FUNCTEST_PREFIX}/steps?testStepId=${testStepId}`);
 
 export const getLatestRecord = (projectId: number) => axios.get(`${FUNCTEST_PREFIX}/record/latest?projectId=${projectId}`);
+
+export const getTreeIdList = (projectId: number) => axios.get(`${FUNCTEST_PREFIX}/taskList?projectId=${projectId}`);

BIN
src/assets/example.png


+ 1 - 0
src/assets/icon_new/bug-hover.svg

@@ -0,0 +1 @@
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg class="icon" width="200px" height="200.00px" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"><path d="M940 512H792V412c76.8 0 139-62.2 139-139 0-4.4-3.6-8-8-8h-60c-4.4 0-8 3.6-8 8 0 34.8-28.2 63-63 63H232c-34.8 0-63-28.2-63-63 0-4.4-3.6-8-8-8h-60c-4.4 0-8 3.6-8 8 0 76.8 62.2 139 139 139v100H84c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h148v96c0 6.5 0.2 13 0.7 19.3C164.1 728.6 116 796.7 116 876c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8 0-44.2 23.9-82.9 59.6-103.7 6 17.2 13.6 33.6 22.7 49 24.3 41.5 59 76.2 100.5 100.5S460.5 960 512 960s99.8-13.9 141.3-38.2c41.5-24.3 76.2-59 100.5-100.5 9.1-15.5 16.7-31.9 22.7-49C812.1 793.1 836 831.8 836 876c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8 0-79.3-48.1-147.4-116.7-176.7 0.4-6.4 0.7-12.8 0.7-19.3v-96h148c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zM716 680c0 36.8-9.7 72-27.8 102.9-17.7 30.3-43 55.6-73.3 73.3-20.1 11.8-42 20-64.9 24.3V484c0-4.4-3.6-8-8-8h-60c-4.4 0-8 3.6-8 8v396.5c-22.9-4.3-44.8-12.5-64.9-24.3-30.3-17.7-55.6-43-73.3-73.3C317.7 752 308 716.8 308 680V412h408v268z" fill="#2c2c2c" /><path d="M304 280h56c4.4 0 8-3.6 8-8 0-28.3 5.9-53.2 17.1-73.5 10.6-19.4 26-34.8 45.4-45.4C450.9 142 475.7 136 504 136h16c28.3 0 53.2 5.9 73.5 17.1 19.4 10.6 34.8 26 45.4 45.4C650 218.9 656 243.7 656 272c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8 0-40-8.8-76.7-25.9-108.1-17.2-31.5-42.5-56.8-74-74C596.7 72.8 560 64 520 64h-16c-40 0-76.7 8.8-108.1 25.9-31.5 17.2-56.8 42.5-74 74C304.8 195.3 296 232 296 272c0 4.4 3.6 8 8 8z" fill="#2c2c2c" /></svg>

+ 1 - 0
src/assets/icon_new/bug-using.svg

@@ -0,0 +1 @@
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg class="icon" width="200px" height="200.00px" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"><path d="M940 512H792V412c76.8 0 139-62.2 139-139 0-4.4-3.6-8-8-8h-60c-4.4 0-8 3.6-8 8 0 34.8-28.2 63-63 63H232c-34.8 0-63-28.2-63-63 0-4.4-3.6-8-8-8h-60c-4.4 0-8 3.6-8 8 0 76.8 62.2 139 139 139v100H84c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h148v96c0 6.5 0.2 13 0.7 19.3C164.1 728.6 116 796.7 116 876c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8 0-44.2 23.9-82.9 59.6-103.7 6 17.2 13.6 33.6 22.7 49 24.3 41.5 59 76.2 100.5 100.5S460.5 960 512 960s99.8-13.9 141.3-38.2c41.5-24.3 76.2-59 100.5-100.5 9.1-15.5 16.7-31.9 22.7-49C812.1 793.1 836 831.8 836 876c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8 0-79.3-48.1-147.4-116.7-176.7 0.4-6.4 0.7-12.8 0.7-19.3v-96h148c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zM716 680c0 36.8-9.7 72-27.8 102.9-17.7 30.3-43 55.6-73.3 73.3-20.1 11.8-42 20-64.9 24.3V484c0-4.4-3.6-8-8-8h-60c-4.4 0-8 3.6-8 8v396.5c-22.9-4.3-44.8-12.5-64.9-24.3-30.3-17.7-55.6-43-73.3-73.3C317.7 752 308 716.8 308 680V412h408v268z" fill="#1296db" /><path d="M304 280h56c4.4 0 8-3.6 8-8 0-28.3 5.9-53.2 17.1-73.5 10.6-19.4 26-34.8 45.4-45.4C450.9 142 475.7 136 504 136h16c28.3 0 53.2 5.9 73.5 17.1 19.4 10.6 34.8 26 45.4 45.4C650 218.9 656 243.7 656 272c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8 0-40-8.8-76.7-25.9-108.1-17.2-31.5-42.5-56.8-74-74C596.7 72.8 560 64 520 64h-16c-40 0-76.7 8.8-108.1 25.9-31.5 17.2-56.8 42.5-74 74C304.8 195.3 296 232 296 272c0 4.4 3.6 8 8 8z" fill="#1296db" /></svg>

+ 1 - 0
src/assets/icon_new/bug.svg

@@ -0,0 +1 @@
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg class="icon" width="200px" height="200.00px" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"><path d="M940 512H792V412c76.8 0 139-62.2 139-139 0-4.4-3.6-8-8-8h-60c-4.4 0-8 3.6-8 8 0 34.8-28.2 63-63 63H232c-34.8 0-63-28.2-63-63 0-4.4-3.6-8-8-8h-60c-4.4 0-8 3.6-8 8 0 76.8 62.2 139 139 139v100H84c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h148v96c0 6.5 0.2 13 0.7 19.3C164.1 728.6 116 796.7 116 876c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8 0-44.2 23.9-82.9 59.6-103.7 6 17.2 13.6 33.6 22.7 49 24.3 41.5 59 76.2 100.5 100.5S460.5 960 512 960s99.8-13.9 141.3-38.2c41.5-24.3 76.2-59 100.5-100.5 9.1-15.5 16.7-31.9 22.7-49C812.1 793.1 836 831.8 836 876c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8 0-79.3-48.1-147.4-116.7-176.7 0.4-6.4 0.7-12.8 0.7-19.3v-96h148c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zM716 680c0 36.8-9.7 72-27.8 102.9-17.7 30.3-43 55.6-73.3 73.3-20.1 11.8-42 20-64.9 24.3V484c0-4.4-3.6-8-8-8h-60c-4.4 0-8 3.6-8 8v396.5c-22.9-4.3-44.8-12.5-64.9-24.3-30.3-17.7-55.6-43-73.3-73.3C317.7 752 308 716.8 308 680V412h408v268z" fill="#8a8a8a" /><path d="M304 280h56c4.4 0 8-3.6 8-8 0-28.3 5.9-53.2 17.1-73.5 10.6-19.4 26-34.8 45.4-45.4C450.9 142 475.7 136 504 136h16c28.3 0 53.2 5.9 73.5 17.1 19.4 10.6 34.8 26 45.4 45.4C650 218.9 656 243.7 656 272c0 4.4 3.6 8 8 8h56c4.4 0 8-3.6 8-8 0-40-8.8-76.7-25.9-108.1-17.2-31.5-42.5-56.8-74-74C596.7 72.8 560 64 520 64h-16c-40 0-76.7 8.8-108.1 25.9-31.5 17.2-56.8 42.5-74 74C304.8 195.3 296 232 296 272c0 4.4 3.6 8 8 8z" fill="#8a8a8a" /></svg>

File diff suppressed because it is too large
+ 0 - 0
src/assets/icon_new/database-hover.svg


File diff suppressed because it is too large
+ 0 - 0
src/assets/icon_new/database-using.svg


File diff suppressed because it is too large
+ 0 - 0
src/assets/icon_new/database.svg


+ 1 - 0
src/assets/icon_new/git-hover.svg

@@ -0,0 +1 @@
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg class="icon" width="200px" height="200.00px" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"><path d="M101.6 443.4c0 50.6 32.4 120 83 137v2c-37.6 16.6-48 101.2 2 131.6v2C132 734 96 768.6 96 828.4c0 103 97.6 131.6 183 131.6 104 0 181.4-37.4 181.4-152 0-141-202-89-202-165.6 0-27 14.4-37.4 39.4-42.6 83-15.4 135-80 135-164.4 0-14.6-3-28.4-8-42 13.4-3 26.4-6.6 39.4-11v-101c-34.4 13.6-71.4 23.6-109 23.6-107.6-62-253.6 2.6-253.6 138.4z m175.4 327.6c34 0 82.4 6 82.4 50 0 43.6-39 52.6-75.4 52.6-34.6 0-86.6-5.4-86.6-50.4 0.2-44.6 44.2-52.2 79.6-52.2zM270.6 512c-44 0-62.6-26-62.6-67.6 0-98.6 122-97.6 122-1 0 40.6-16 68.6-59.4 68.6zM928 611v98c-26.6 14.6-61 19.6-91 19.6-107 0-119.6-84.4-119.6-171.4v-175.4h1v-2c-14 0-14.6-3.2-48 2v-95h48c0-44.6 0.6-62-3-82.4h113.4c-4 27.6-3 55-3 82.4h102v95s-38.6-2-102-2V562c0 29.6 6.6 65.6 43.6 65.6 19.6 0 42.6-5.6 58.6-16.6zM636 137.4c0 37.4-29 72.4-67.6 72.4-39.6 0-69-34.4-69-72.4 0-38.6 29-73.4 69-73.4C608 64 636 100 636 137.4z m-12.4 149c-3.6 29.2-3.2 399.6 0 435.6h-111c3.2-36.2 3.6-406 0-435.6h111z" fill="#2c2c2c" /></svg>

+ 1 - 0
src/assets/icon_new/git-using.svg

@@ -0,0 +1 @@
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg class="icon" width="200px" height="200.00px" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"><path d="M101.6 443.4c0 50.6 32.4 120 83 137v2c-37.6 16.6-48 101.2 2 131.6v2C132 734 96 768.6 96 828.4c0 103 97.6 131.6 183 131.6 104 0 181.4-37.4 181.4-152 0-141-202-89-202-165.6 0-27 14.4-37.4 39.4-42.6 83-15.4 135-80 135-164.4 0-14.6-3-28.4-8-42 13.4-3 26.4-6.6 39.4-11v-101c-34.4 13.6-71.4 23.6-109 23.6-107.6-62-253.6 2.6-253.6 138.4z m175.4 327.6c34 0 82.4 6 82.4 50 0 43.6-39 52.6-75.4 52.6-34.6 0-86.6-5.4-86.6-50.4 0.2-44.6 44.2-52.2 79.6-52.2zM270.6 512c-44 0-62.6-26-62.6-67.6 0-98.6 122-97.6 122-1 0 40.6-16 68.6-59.4 68.6zM928 611v98c-26.6 14.6-61 19.6-91 19.6-107 0-119.6-84.4-119.6-171.4v-175.4h1v-2c-14 0-14.6-3.2-48 2v-95h48c0-44.6 0.6-62-3-82.4h113.4c-4 27.6-3 55-3 82.4h102v95s-38.6-2-102-2V562c0 29.6 6.6 65.6 43.6 65.6 19.6 0 42.6-5.6 58.6-16.6zM636 137.4c0 37.4-29 72.4-67.6 72.4-39.6 0-69-34.4-69-72.4 0-38.6 29-73.4 69-73.4C608 64 636 100 636 137.4z m-12.4 149c-3.6 29.2-3.2 399.6 0 435.6h-111c3.2-36.2 3.6-406 0-435.6h111z" fill="#1296db" /></svg>

+ 1 - 0
src/assets/icon_new/git.svg

@@ -0,0 +1 @@
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg class="icon" width="200px" height="200.00px" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"><path d="M101.6 443.4c0 50.6 32.4 120 83 137v2c-37.6 16.6-48 101.2 2 131.6v2C132 734 96 768.6 96 828.4c0 103 97.6 131.6 183 131.6 104 0 181.4-37.4 181.4-152 0-141-202-89-202-165.6 0-27 14.4-37.4 39.4-42.6 83-15.4 135-80 135-164.4 0-14.6-3-28.4-8-42 13.4-3 26.4-6.6 39.4-11v-101c-34.4 13.6-71.4 23.6-109 23.6-107.6-62-253.6 2.6-253.6 138.4z m175.4 327.6c34 0 82.4 6 82.4 50 0 43.6-39 52.6-75.4 52.6-34.6 0-86.6-5.4-86.6-50.4 0.2-44.6 44.2-52.2 79.6-52.2zM270.6 512c-44 0-62.6-26-62.6-67.6 0-98.6 122-97.6 122-1 0 40.6-16 68.6-59.4 68.6zM928 611v98c-26.6 14.6-61 19.6-91 19.6-107 0-119.6-84.4-119.6-171.4v-175.4h1v-2c-14 0-14.6-3.2-48 2v-95h48c0-44.6 0.6-62-3-82.4h113.4c-4 27.6-3 55-3 82.4h102v95s-38.6-2-102-2V562c0 29.6 6.6 65.6 43.6 65.6 19.6 0 42.6-5.6 58.6-16.6zM636 137.4c0 37.4-29 72.4-67.6 72.4-39.6 0-69-34.4-69-72.4 0-38.6 29-73.4 69-73.4C608 64 636 100 636 137.4z m-12.4 149c-3.6 29.2-3.2 399.6 0 435.6h-111c3.2-36.2 3.6-406 0-435.6h111z" fill="#8a8a8a" /></svg>

+ 1 - 0
src/assets/icon_new/link-hover.svg

@@ -0,0 +1 @@
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg class="icon" width="200px" height="200.00px" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"><path d="M806.436327 515.549842l-60.954135-59.830547-40.278275 41.03859 60.954136 59.829524c21.571252 21.179326 33.479442 49.352936 33.479442 79.209881-0.056282 29.887644-11.90819 57.97632-33.479442 79.184299l-60.954136 59.8285c-33.706616 33.117192-88.536275 33.145845-122.301219 0L461.011824 655.152065c-21.571252-21.206955-33.453859-49.268002-33.453859-79.182252-0.028653-29.858992 11.882608-58.004973 33.031234-78.81898l42.374002-39.886349-39.451445-41.851093-42.781277 40.306927c-32.724244 32.078539-50.72928 74.80251-50.700627 120.250518 0 45.475637 18.005037 88.143327 50.700627 120.219818l121.892921 119.686677c27.977136 27.472647 64.717848 41.152177 101.401255 41.152177 36.740712 0 73.480401-13.67953 101.456514-41.152177l60.954135-59.856129c32.695591-32.078539 50.671975-74.745205 50.727233-120.221866 0.001023-45.448007-18.030619-88.170956-50.72621-120.249494z" fill="#2c2c2c" /><path d="M298.43233 257.439789c44.941472-44.100316 118.029948-44.100316 162.915138 0l101.612056 99.71485c21.573298 21.209002 33.427253 49.297678 33.483535 79.156669 0 29.886621-11.910237 58.030555-33.483535 79.239557l-60.968462 59.829524 40.295671 41.03859 60.951065-59.830547c32.695591-32.078539 50.731327-74.801487 50.731327-120.277124-0.060375-45.448007-18.035736-88.114674-50.731327-120.220842l-101.610009-99.715873c-67.047911-65.840413-176.314282-65.896694-243.47578 0l-40.614942 39.88635c-32.695591 32.106168-50.701651 74.773858-50.701651 120.220841-0.028653 45.475637 17.975361 88.199608 50.701651 120.278147l40.614942 39.887373 40.279298-41.039613-40.614942-39.88635c-21.574321-21.178303-33.483535-49.351913-33.45386-79.239557 0-29.857969 11.879538-57.946644 33.45386-79.155646l40.615965-39.886349z" fill="#2c2c2c" /></svg>

+ 1 - 0
src/assets/icon_new/link-using.svg

@@ -0,0 +1 @@
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg class="icon" width="200px" height="200.00px" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"><path d="M806.436327 515.549842l-60.954135-59.830547-40.278275 41.03859 60.954136 59.829524c21.571252 21.179326 33.479442 49.352936 33.479442 79.209881-0.056282 29.887644-11.90819 57.97632-33.479442 79.184299l-60.954136 59.8285c-33.706616 33.117192-88.536275 33.145845-122.301219 0L461.011824 655.152065c-21.571252-21.206955-33.453859-49.268002-33.453859-79.182252-0.028653-29.858992 11.882608-58.004973 33.031234-78.81898l42.374002-39.886349-39.451445-41.851093-42.781277 40.306927c-32.724244 32.078539-50.72928 74.80251-50.700627 120.250518 0 45.475637 18.005037 88.143327 50.700627 120.219818l121.892921 119.686677c27.977136 27.472647 64.717848 41.152177 101.401255 41.152177 36.740712 0 73.480401-13.67953 101.456514-41.152177l60.954135-59.856129c32.695591-32.078539 50.671975-74.745205 50.727233-120.221866 0.001023-45.448007-18.030619-88.170956-50.72621-120.249494z" fill="#1296db" /><path d="M298.43233 257.439789c44.941472-44.100316 118.029948-44.100316 162.915138 0l101.612056 99.71485c21.573298 21.209002 33.427253 49.297678 33.483535 79.156669 0 29.886621-11.910237 58.030555-33.483535 79.239557l-60.968462 59.829524 40.295671 41.03859 60.951065-59.830547c32.695591-32.078539 50.731327-74.801487 50.731327-120.277124-0.060375-45.448007-18.035736-88.114674-50.731327-120.220842l-101.610009-99.715873c-67.047911-65.840413-176.314282-65.896694-243.47578 0l-40.614942 39.88635c-32.695591 32.106168-50.701651 74.773858-50.701651 120.220841-0.028653 45.475637 17.975361 88.199608 50.701651 120.278147l40.614942 39.887373 40.279298-41.039613-40.614942-39.88635c-21.574321-21.178303-33.483535-49.351913-33.45386-79.239557 0-29.857969 11.879538-57.946644 33.45386-79.155646l40.615965-39.886349z" fill="#1296db" /></svg>

+ 1 - 0
src/assets/icon_new/link.svg

@@ -0,0 +1 @@
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg class="icon" width="200px" height="200.00px" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"><path d="M806.436327 515.549842l-60.954135-59.830547-40.278275 41.03859 60.954136 59.829524c21.571252 21.179326 33.479442 49.352936 33.479442 79.209881-0.056282 29.887644-11.90819 57.97632-33.479442 79.184299l-60.954136 59.8285c-33.706616 33.117192-88.536275 33.145845-122.301219 0L461.011824 655.152065c-21.571252-21.206955-33.453859-49.268002-33.453859-79.182252-0.028653-29.858992 11.882608-58.004973 33.031234-78.81898l42.374002-39.886349-39.451445-41.851093-42.781277 40.306927c-32.724244 32.078539-50.72928 74.80251-50.700627 120.250518 0 45.475637 18.005037 88.143327 50.700627 120.219818l121.892921 119.686677c27.977136 27.472647 64.717848 41.152177 101.401255 41.152177 36.740712 0 73.480401-13.67953 101.456514-41.152177l60.954135-59.856129c32.695591-32.078539 50.671975-74.745205 50.727233-120.221866 0.001023-45.448007-18.030619-88.170956-50.72621-120.249494z" fill="#8a8a8a" /><path d="M298.43233 257.439789c44.941472-44.100316 118.029948-44.100316 162.915138 0l101.612056 99.71485c21.573298 21.209002 33.427253 49.297678 33.483535 79.156669 0 29.886621-11.910237 58.030555-33.483535 79.239557l-60.968462 59.829524 40.295671 41.03859 60.951065-59.830547c32.695591-32.078539 50.731327-74.801487 50.731327-120.277124-0.060375-45.448007-18.035736-88.114674-50.731327-120.220842l-101.610009-99.715873c-67.047911-65.840413-176.314282-65.896694-243.47578 0l-40.614942 39.88635c-32.695591 32.106168-50.701651 74.773858-50.701651 120.220841-0.028653 45.475637 17.975361 88.199608 50.701651 120.278147l40.614942 39.887373 40.279298-41.039613-40.614942-39.88635c-21.574321-21.178303-33.483535-49.351913-33.45386-79.239557 0-29.857969 11.879538-57.946644 33.45386-79.155646l40.615965-39.886349z" fill="#8a8a8a" /></svg>

+ 1 - 0
src/assets/icon_new/pipeline-hover.svg

@@ -0,0 +1 @@
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg class="icon" width="200px" height="200.00px" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"><path d="M176 48c50.752 0 93.76 33.728 107.52 80h436.48a208 208 0 0 1 11.776 415.68l-11.776 0.32h-68.672a112 112 0 0 1-214.656 0.128L304 544a144 144 0 0 0-9.856 287.68L304 832h436.48a112.256 112.256 0 0 1 107.52-80 112 112 0 0 1 0 224A112.256 112.256 0 0 1 740.48 896H304a208 208 0 0 1-11.776-415.68L304 480h132.672a112 112 0 0 1 214.72 0h68.608a144 144 0 0 0 9.856-287.68L720 192H283.52a112.256 112.256 0 0 1-107.52 80 112 112 0 0 1 0-224z m672 768a48 48 0 1 0 0 96 48 48 0 0 0 0-96zM544 464a48 48 0 0 0-40.704 22.592l-1.792 3.072a47.808 47.808 0 0 0-4.608 31.68l1.6 5.952 1.792 4.48 3.2 5.888 3.968 5.44-2.624-3.392a48 48 0 0 0 79.744-2.048l1.92-3.392 1.28-2.496 1.728-4.48a48 48 0 0 0-1.728-35.072l-1.28-2.56-1.792-3.072-1.6-2.432A48 48 0 0 0 544 464z m-368-352a48 48 0 1 0 0 96 48 48 0 0 0 0-96z" fill="#2c2c2c" /></svg>

+ 1 - 0
src/assets/icon_new/pipeline-using.svg

@@ -0,0 +1 @@
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg class="icon" width="200px" height="200.00px" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"><path d="M176 48c50.752 0 93.76 33.728 107.52 80h436.48a208 208 0 0 1 11.776 415.68l-11.776 0.32h-68.672a112 112 0 0 1-214.656 0.128L304 544a144 144 0 0 0-9.856 287.68L304 832h436.48a112.256 112.256 0 0 1 107.52-80 112 112 0 0 1 0 224A112.256 112.256 0 0 1 740.48 896H304a208 208 0 0 1-11.776-415.68L304 480h132.672a112 112 0 0 1 214.72 0h68.608a144 144 0 0 0 9.856-287.68L720 192H283.52a112.256 112.256 0 0 1-107.52 80 112 112 0 0 1 0-224z m672 768a48 48 0 1 0 0 96 48 48 0 0 0 0-96zM544 464a48 48 0 0 0-40.704 22.592l-1.792 3.072a47.808 47.808 0 0 0-4.608 31.68l1.6 5.952 1.792 4.48 3.2 5.888 3.968 5.44-2.624-3.392a48 48 0 0 0 79.744-2.048l1.92-3.392 1.28-2.496 1.728-4.48a48 48 0 0 0-1.728-35.072l-1.28-2.56-1.792-3.072-1.6-2.432A48 48 0 0 0 544 464z m-368-352a48 48 0 1 0 0 96 48 48 0 0 0 0-96z" fill="#1296db" /></svg>

+ 1 - 0
src/assets/icon_new/pipeline.svg

@@ -0,0 +1 @@
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg class="icon" width="200px" height="200.00px" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"><path d="M176 48c50.752 0 93.76 33.728 107.52 80h436.48a208 208 0 0 1 11.776 415.68l-11.776 0.32h-68.672a112 112 0 0 1-214.656 0.128L304 544a144 144 0 0 0-9.856 287.68L304 832h436.48a112.256 112.256 0 0 1 107.52-80 112 112 0 0 1 0 224A112.256 112.256 0 0 1 740.48 896H304a208 208 0 0 1-11.776-415.68L304 480h132.672a112 112 0 0 1 214.72 0h68.608a144 144 0 0 0 9.856-287.68L720 192H283.52a112.256 112.256 0 0 1-107.52 80 112 112 0 0 1 0-224z m672 768a48 48 0 1 0 0 96 48 48 0 0 0 0-96zM544 464a48 48 0 0 0-40.704 22.592l-1.792 3.072a47.808 47.808 0 0 0-4.608 31.68l1.6 5.952 1.792 4.48 3.2 5.888 3.968 5.44-2.624-3.392a48 48 0 0 0 79.744-2.048l1.92-3.392 1.28-2.496 1.728-4.48a48 48 0 0 0-1.728-35.072l-1.28-2.56-1.792-3.072-1.6-2.432A48 48 0 0 0 544 464z m-368-352a48 48 0 1 0 0 96 48 48 0 0 0 0-96z" fill="#8a8a8a" /></svg>

+ 1 - 0
src/assets/icon_new/schedule-hover.svg

@@ -0,0 +1 @@
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg class="icon" width="200px" height="200.00px" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"><path d="M946.176 173.056h-118.784V148.48a90.624 90.624 0 1 0-181.248 0v24.576H377.856V148.48a90.624 90.624 0 1 0-181.248 0v24.576H77.824a38.4 38.4 0 0 0-38.4 38.4v729.6a38.4 38.4 0 0 0 38.4 38.4h870.4a38.4 38.4 0 0 0 38.4-38.4V211.456a38.4 38.4 0 0 0-40.448-38.4z m-248.832-24.576a39.424 39.424 0 1 1 78.848 0v121.344a39.424 39.424 0 0 1-78.848 0V148.48z m-449.536 0a39.424 39.424 0 1 1 78.848 0v121.344a39.424 39.424 0 0 1-78.848 0V148.48z m659.968 754.176H116.224V249.856h80.384v20.48a90.624 90.624 0 0 0 181.248 0v-20.48h268.288v20.48a90.624 90.624 0 0 0 181.248 0v-20.48h80.384v652.8z" fill="#2c2c2c" /><path d="M662.528 446.464l-196.608 204.8-102.4-106.496a38.4 38.4 0 1 0-56.32 51.2l132.096 134.656a38.4 38.4 0 0 0 27.136 11.264 38.4 38.4 0 0 0 27.648-11.776L716.8 499.712a38.4 38.4 0 0 0-54.272-53.248z" fill="#2c2c2c" /></svg>

+ 1 - 0
src/assets/icon_new/schedule-using.svg

@@ -0,0 +1 @@
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg class="icon" width="200px" height="200.00px" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"><path d="M946.176 173.056h-118.784V148.48a90.624 90.624 0 1 0-181.248 0v24.576H377.856V148.48a90.624 90.624 0 1 0-181.248 0v24.576H77.824a38.4 38.4 0 0 0-38.4 38.4v729.6a38.4 38.4 0 0 0 38.4 38.4h870.4a38.4 38.4 0 0 0 38.4-38.4V211.456a38.4 38.4 0 0 0-40.448-38.4z m-248.832-24.576a39.424 39.424 0 1 1 78.848 0v121.344a39.424 39.424 0 0 1-78.848 0V148.48z m-449.536 0a39.424 39.424 0 1 1 78.848 0v121.344a39.424 39.424 0 0 1-78.848 0V148.48z m659.968 754.176H116.224V249.856h80.384v20.48a90.624 90.624 0 0 0 181.248 0v-20.48h268.288v20.48a90.624 90.624 0 0 0 181.248 0v-20.48h80.384v652.8z" fill="#1296db" /><path d="M662.528 446.464l-196.608 204.8-102.4-106.496a38.4 38.4 0 1 0-56.32 51.2l132.096 134.656a38.4 38.4 0 0 0 27.136 11.264 38.4 38.4 0 0 0 27.648-11.776L716.8 499.712a38.4 38.4 0 0 0-54.272-53.248z" fill="#1296db" /></svg>

+ 1 - 0
src/assets/icon_new/schedule.svg

@@ -0,0 +1 @@
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg class="icon" width="200px" height="200.00px" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"><path d="M946.176 173.056h-118.784V148.48a90.624 90.624 0 1 0-181.248 0v24.576H377.856V148.48a90.624 90.624 0 1 0-181.248 0v24.576H77.824a38.4 38.4 0 0 0-38.4 38.4v729.6a38.4 38.4 0 0 0 38.4 38.4h870.4a38.4 38.4 0 0 0 38.4-38.4V211.456a38.4 38.4 0 0 0-40.448-38.4z m-248.832-24.576a39.424 39.424 0 1 1 78.848 0v121.344a39.424 39.424 0 0 1-78.848 0V148.48z m-449.536 0a39.424 39.424 0 1 1 78.848 0v121.344a39.424 39.424 0 0 1-78.848 0V148.48z m659.968 754.176H116.224V249.856h80.384v20.48a90.624 90.624 0 0 0 181.248 0v-20.48h268.288v20.48a90.624 90.624 0 0 0 181.248 0v-20.48h80.384v652.8z" fill="#8a8a8a" /><path d="M662.528 446.464l-196.608 204.8-102.4-106.496a38.4 38.4 0 1 0-56.32 51.2l132.096 134.656a38.4 38.4 0 0 0 27.136 11.264 38.4 38.4 0 0 0 27.648-11.776L716.8 499.712a38.4 38.4 0 0 0-54.272-53.248z" fill="#8a8a8a" /></svg>

+ 1 - 0
src/assets/icon_new/task-hover.svg

@@ -0,0 +1 @@
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg class="icon" width="200px" height="200.00px" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"><path d="M831.825 63.94H191.94c-70.692 0-128 57.308-128 128v639.885c0 70.692 57.308 128 128 128h639.885c70.692 0 128-57.308 128-128V191.94c0-70.692-57.308-128-128-128zM895.885 832a63.835 63.835 0 0 1-63.973 63.886H192.088c-17.112 0-33.27-6.575-45.372-18.676s-18.836-28.098-18.836-45.21V192a64.236 64.236 0 0 1 64.208-64.12h639.824A64.038 64.038 0 0 1 895.885 192V832z" fill="#2c2c2c" /><path d="M791.998 351.852H536a31.97 31.97 0 0 0 0 63.94h256a31.97 31.97 0 0 0 0-63.94z m0 256.121H536a31.97 31.97 0 0 0 0 63.94h256a31.97 31.97 0 0 0 0-63.94z m-447.996-79.975c-61.856 0-111.986 50.144-111.986 111.985S282.16 751.97 344.002 751.97s111.985-50.144 111.985-111.986-50.13-111.985-111.985-111.985z m33.982 145.982a48.045 48.045 0 1 1 14.088-33.982 47.746 47.746 0 0 1-14.088 33.986z m39.412-376.586L311.999 402.787l-41.391-41.395a31.97 31.97 0 1 0-45.213 45.213l63.997 64.002a31.97 31.97 0 0 0 45.214 0l128-128a31.97 31.97 0 0 0-45.21-45.213z" fill="#2c2c2c" /></svg>

+ 1 - 0
src/assets/icon_new/task-using.svg

@@ -0,0 +1 @@
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg class="icon" width="200px" height="200.00px" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"><path d="M831.825 63.94H191.94c-70.692 0-128 57.308-128 128v639.885c0 70.692 57.308 128 128 128h639.885c70.692 0 128-57.308 128-128V191.94c0-70.692-57.308-128-128-128zM895.885 832a63.835 63.835 0 0 1-63.973 63.886H192.088c-17.112 0-33.27-6.575-45.372-18.676s-18.836-28.098-18.836-45.21V192a64.236 64.236 0 0 1 64.208-64.12h639.824A64.038 64.038 0 0 1 895.885 192V832z" fill="#1296db" /><path d="M791.998 351.852H536a31.97 31.97 0 0 0 0 63.94h256a31.97 31.97 0 0 0 0-63.94z m0 256.121H536a31.97 31.97 0 0 0 0 63.94h256a31.97 31.97 0 0 0 0-63.94z m-447.996-79.975c-61.856 0-111.986 50.144-111.986 111.985S282.16 751.97 344.002 751.97s111.985-50.144 111.985-111.986-50.13-111.985-111.985-111.985z m33.982 145.982a48.045 48.045 0 1 1 14.088-33.982 47.746 47.746 0 0 1-14.088 33.986z m39.412-376.586L311.999 402.787l-41.391-41.395a31.97 31.97 0 1 0-45.213 45.213l63.997 64.002a31.97 31.97 0 0 0 45.214 0l128-128a31.97 31.97 0 0 0-45.21-45.213z" fill="#1296db" /></svg>

+ 1 - 0
src/assets/icon_new/task.svg

@@ -0,0 +1 @@
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg class="icon" width="200px" height="200.00px" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"><path d="M831.825 63.94H191.94c-70.692 0-128 57.308-128 128v639.885c0 70.692 57.308 128 128 128h639.885c70.692 0 128-57.308 128-128V191.94c0-70.692-57.308-128-128-128zM895.885 832a63.835 63.835 0 0 1-63.973 63.886H192.088c-17.112 0-33.27-6.575-45.372-18.676s-18.836-28.098-18.836-45.21V192a64.236 64.236 0 0 1 64.208-64.12h639.824A64.038 64.038 0 0 1 895.885 192V832z" fill="#8a8a8a" /><path d="M791.998 351.852H536a31.97 31.97 0 0 0 0 63.94h256a31.97 31.97 0 0 0 0-63.94z m0 256.121H536a31.97 31.97 0 0 0 0 63.94h256a31.97 31.97 0 0 0 0-63.94z m-447.996-79.975c-61.856 0-111.986 50.144-111.986 111.985S282.16 751.97 344.002 751.97s111.985-50.144 111.985-111.986-50.13-111.985-111.985-111.985z m33.982 145.982a48.045 48.045 0 1 1 14.088-33.982 47.746 47.746 0 0 1-14.088 33.986z m39.412-376.586L311.999 402.787l-41.391-41.395a31.97 31.97 0 1 0-45.213 45.213l63.997 64.002a31.97 31.97 0 0 0 45.214 0l128-128a31.97 31.97 0 0 0-45.21-45.213z" fill="#8a8a8a" /></svg>

+ 1 - 0
src/assets/icon_new/test-hover.svg

@@ -0,0 +1 @@
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg class="icon" width="200px" height="200.00px" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"><path d="M893.3 800H128.2V130.2h768.6L893.3 800z m-705.1-60h645.5l2.9-549.8H188.2V740zM219.1 834.7h586v60h-586z" fill="#2c2c2c" /><path d="M369.4 606.7L225.6 463.1l143.8-143.9 42.4 42.4L310.5 463l101.3 101.2zM657.2 606.7l-42.3-42.5L716.2 463 614.8 361.6l42.5-42.4L801 463.1zM494.7 612.6l-57.1-18.4c37.2-115.3 57.6-179.8 89.1-280.7l57.3 17.9c-31.6 101.1-52 165.7-89.3 281.2z" fill="#2c2c2c" /></svg>

+ 1 - 0
src/assets/icon_new/test-using.svg

@@ -0,0 +1 @@
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg class="icon" width="200px" height="200.00px" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"><path d="M893.3 800H128.2V130.2h768.6L893.3 800z m-705.1-60h645.5l2.9-549.8H188.2V740zM219.1 834.7h586v60h-586z" fill="#1296db" /><path d="M369.4 606.7L225.6 463.1l143.8-143.9 42.4 42.4L310.5 463l101.3 101.2zM657.2 606.7l-42.3-42.5L716.2 463 614.8 361.6l42.5-42.4L801 463.1zM494.7 612.6l-57.1-18.4c37.2-115.3 57.6-179.8 89.1-280.7l57.3 17.9c-31.6 101.1-52 165.7-89.3 281.2z" fill="#1296db" /></svg>

+ 1 - 0
src/assets/icon_new/test.svg

@@ -0,0 +1 @@
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg class="icon" width="200px" height="200.00px" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"><path d="M893.3 800H128.2V130.2h768.6L893.3 800z m-705.1-60h645.5l2.9-549.8H188.2V740zM219.1 834.7h586v60h-586z" fill="#8a8a8a" /><path d="M369.4 606.7L225.6 463.1l143.8-143.9 42.4 42.4L310.5 463l101.3 101.2zM657.2 606.7l-42.3-42.5L716.2 463 614.8 361.6l42.5-42.4L801 463.1zM494.7 612.6l-57.1-18.4c37.2-115.3 57.6-179.8 89.1-280.7l57.3 17.9c-31.6 101.1-52 165.7-89.3 281.2z" fill="#8a8a8a" /></svg>

+ 1 - 1
src/components/CommonDrawer.vue

@@ -139,7 +139,7 @@
               </template>
               <template v-else>
                 <el-row style="margin: 0px 25px;">
-                  没有子需求
+                  没有子节点
                 </el-row>
               </template>
               </template>

+ 8 - 2
src/components/GeneralTable.vue

@@ -17,6 +17,12 @@
       align="center"
       width="80"
     ></ElTableColumn>
+    <ElTableColumn
+      prop="projectId"
+      label="所属项目ID"
+      align="center"
+      width="100"
+    ></ElTableColumn>
     <ElTableColumn
       label="优先级"
       align="center"
@@ -49,9 +55,9 @@
     ></ElTableColumn>
     <ElTableColumn
       prop="timeToTake"
-      label="预期耗时"
+      label="预期耗时(人日)"
       align="center"
-      width="100"
+      width="120"
     ></ElTableColumn>
     <ElTableColumn
       label="开始时间"

+ 9 - 6
src/components/RequirementDrawer.vue

@@ -8,7 +8,7 @@
     }">
     <template #title>
       <el-row class="entry-row">
-        <el-col :span="2">
+        <el-col :span="3">
           <div class="node-type">{{type}}</div>
         </el-col>
         <el-col :span="4">
@@ -48,7 +48,10 @@
           >
             <el-tab-pane label="基本信息" name="basic_info">
               <el-row class="entry-row" style="margin-top: 15px">
-                <h4>需求描述</h4>
+                <h4 v-if="type == '需求'">需求描述</h4>
+                <h4 v-else-if="type == '特性'">特性描述</h4>
+                <h4 v-else-if="type == '用户故事'">用户故事描述</h4>
+                <h4 v-else>任务描述</h4>
               </el-row>
               <el-row class="entry-row">
                 <div v-if="isEditing">
@@ -56,10 +59,10 @@
                             type="textarea"
                             maxlength="120"
                             show-word-limit
-                            :rows="3" style="width: 300px;" v-model="editedRequirement.description" />
+                            :rows="3" style="width: 500px;" v-model="editedRequirement.description" />
                   <br/>
                 </div>
-                <p v-else>{{description}}</p>
+                <p style="white-space: pre-wrap" v-else>{{description}}</p>
               </el-row>
               <!-- 状态、优先级等 -->
               <el-row class="entry-row" style="margin-top: 15px">
@@ -127,7 +130,7 @@
               <!-- 相关需求 -->
               <template v-if="showSons">
               <el-row class="entry-row" style="margin-top: 15px">
-                <h4>子需求</h4>
+                <h4>子节点</h4>
               </el-row>
               <template v-if="(childs && childs.length) || false">
                 <el-row style="margin: 10px 25px;" v-for="item in childs" :key="item.id">
@@ -136,7 +139,7 @@
               </template>
               <template v-else>
                 <el-row style="margin: 0px 25px;">
-                  没有子需求
+                  没有子节点
                 </el-row>
               </template>
               </template>

+ 83 - 25
src/components/SideBar.vue

@@ -1,8 +1,21 @@
 <template>
   <el-menu :default-active="active" class="side-bar" :collapse="true" :router="true">
-    <el-menu-item v-for="tab in sidebar" :index="tab.name" :key="tab.name" v-show="!tab.hide">
+    <el-menu-item v-for="tab in sidebar" :index="tab.name" :key="tab.name" v-show="!tab.hide" style="height: 70px;">
       <el-tooltip placement="right" :content="tab.description">
-        <i class="icon" :target="tab.name"></i>
+        <i class="icon" :target="tab.name">
+          <div v-if="calculateLength(tab.description) === 1" class="title" style="margin-left: 2px;">
+            {{tab.description}}
+          </div>
+          <div v-else-if="calculateLength(tab.description) === 2" class="title" style="margin-left: -3px;">
+            {{tab.description}}
+          </div>
+          <div v-else-if="calculateLength(tab.description) === 3" class="title" style="margin-left: -8px;">
+            {{tab.description}}
+          </div>
+          <div v-else class="title" style="margin-left: -3px;">
+            {{tab.description.slice(0, 3)}}
+          </div>
+        </i>
       </el-tooltip>
     </el-menu-item>
   </el-menu>
@@ -13,11 +26,11 @@ const sidebar = [
   { name: 'schedule', description: '项目规划', hide: false },
   { name: 'taskList', description: '任务列表', hide: false },
   { name: 'bugList', description: '缺陷列表', hide: false },
-  { name: 'pipeline', description: '流水线产物', hide: false },
+  { name: 'pipeline', description: '流水线产物', hide: false },
   { name: 'database', description: '数据库', hide: false },
   { name: 'apitest', description: '测试', hide: false },
-  { name: 'statistics', description: '详细数据', hide: true },
   { name: 'invite', description: '项目关联', hide: false },
+  { name: 'git', description: '提交记录', hide: false },
 ];
 
 export default {
@@ -33,6 +46,20 @@ export default {
       return li[li.length - 1];
     },
   },
+  methods: {
+    calculateLength(name) {
+      if (name.length === 2) {
+        return 1;
+      }
+      if (name.length === 3) {
+        return 2;
+      }
+      if (name.length === 4) {
+        return 3;
+      }
+      return 0;
+    },
+  },
 };
 </script>
 
@@ -57,30 +84,36 @@ export default {
   }
 }
 .icon[target=schedule]{
-  background-image: url("../assets/icon/navigation.svg");
+  background-image: url("../assets/icon_new/schedule.svg");
   .el-menu-item:hover & {
-    background-image: url("../assets/icon/navigation-hover.svg");
+    background-image: url("../assets/icon_new/schedule-hover.svg");
+    color: #2c2c2c;
   }
   .el-menu-item.is-active & {
-    background-image: url("../assets/icon/navigation-using.svg");
+    background-image: url("../assets/icon_new/schedule-using.svg");
+    color: #1296db;
   }
 }
 .icon[target=taskList]{
-  background-image: url("../assets/icon/task.svg");
+  background-image: url("../assets/icon_new/task.svg");
   .el-menu-item:hover & {
-    background-image: url("../assets/icon/task-hover.svg");
+    background-image: url("../assets/icon_new/task-hover.svg");
+    color: #2c2c2c;
   }
   .el-menu-item.is-active & {
-    background-image: url("../assets/icon/task-using.svg");
+    background-image: url("../assets/icon_new/task-using.svg");
+    color: #1296db;
   }
 }
 .icon[target=bugList]{
-  background-image: url("../assets/icon/bug.svg");
+  background-image: url("../assets/icon_new/bug.svg");
   .el-menu-item:hover & {
-    background-image: url("../assets/icon/bug-hover.svg");
+    background-image: url("../assets/icon_new/bug-hover.svg");
+    color: #2c2c2c;
   }
   .el-menu-item.is-active & {
-    background-image: url("../assets/icon/bug-using.svg");
+    background-image: url("../assets/icon_new/bug-using.svg");
+    color: #1296db;
   }
 }
 .icon[target=statistics]{
@@ -93,39 +126,64 @@ export default {
   }
 }
 .icon[target=pipeline]{
-  background-image: url("../assets/icon/training.svg");
+  background-image: url("../assets/icon_new/pipeline.svg");
   .el-menu-item:hover & {
-    background-image: url("../assets/icon/training-hover.svg");
+    background-image: url("../assets/icon_new/pipeline-hover.svg");
+    color: #2c2c2c;
   }
   .el-menu-item.is-active & {
-    background-image: url("../assets/icon/training-using.svg");
+    background-image: url("../assets/icon_new/pipeline-using.svg");
+    color: #1296db;
   }
 }
 .icon[target=database]{
-  background-image: url("../assets/icon/database.svg");
+  background-image: url("../assets/icon_new/database.svg");
   .el-menu-item:hover & {
-    background-image: url("../assets/icon/database-hover.svg");
+    background-image: url("../assets/icon_new/database-hover.svg");
+    color: #2c2c2c;
   }
   .el-menu-item.is-active & {
-    background-image: url("../assets/icon/database-using.svg");
+    background-image: url("../assets/icon_new/database-using.svg");
+    color: #1296db;
   }
 }
 .icon[target=apitest]{
-   background-image: url("../assets/icon/test.svg");
+   background-image: url("../assets/icon_new/test.svg");
   .el-menu-item:hover & {
-    background-image: url("../assets/icon/test-hover.svg");
+    background-image: url("../assets/icon_new/test-hover.svg");
+    color: #2c2c2c;
   }
   .el-menu-item.is-active & {
-    background-image: url("../assets/icon/test-using.svg");
+    background-image: url("../assets/icon_new/test-using.svg");
+    color: #1296db;
   }
 }
 .icon[target=invite]{
-   background-image: url("../assets/icon/link.svg");
+   background-image: url("../assets/icon_new/link.svg");
+  .el-menu-item:hover & {
+    background-image: url("../assets/icon_new/link-hover.svg");
+    color: #2c2c2c;
+  }
+  .el-menu-item.is-active & {
+    background-image: url("../assets/icon_new/link-using.svg");
+    color: #1296db;
+  }
+}
+.icon[target=git]{
+  background-image: url("../assets/icon_new/git.svg");
   .el-menu-item:hover & {
-    background-image: url("../assets/icon/link-hover.svg");
+    background-image: url("../assets/icon_new/git-hover.svg");
+    color: #2c2c2c;
   }
   .el-menu-item.is-active & {
-    background-image: url("../assets/icon/link-using.svg");
+    background-image: url("../assets/icon_new/git-using.svg");
+    color: #1296db;
   }
 }
+.title{
+  font-size: 9px;
+  margin-top: 12px;
+  font-style: normal;
+}
+
 </style>

+ 1 - 1
src/components/Tree.vue

@@ -118,7 +118,7 @@ export default {
       this.data.forEach((item) => {
         if (item.positionY && item.positionY > maxPositionY) maxPositionY = item.positionY;
       });
-      this.drawLine((maxPositionY * 140 + 100).toFixed(0));
+      this.drawLine((maxPositionY * 180 + 100).toFixed(0));
       // 返回col
       return colList;
     },

+ 4 - 0
src/element-plus.ts

@@ -40,6 +40,8 @@ import {
   ElTableColumn,
   ElTabs,
   ElTag,
+  ElTimeline,
+  ElTimelineItem,
   ElTooltip,
 } from 'element-plus';
 
@@ -87,6 +89,8 @@ export const Components = [
   ElTableColumn,
   ElTabs,
   ElTag,
+  ElTimeline,
+  ElTimelineItem,
   ElTooltip,
 ];
 

+ 4 - 0
src/router/index.ts

@@ -66,6 +66,10 @@ const routes: Array<RouteRecordRaw> = [
         path: 'invite',
         component: () => import(/* webpackChunkName: "project" */'@/views/Project/Invite.vue'),
       },
+      {
+        path: 'git',
+        component: () => import(/* webpackChunkName: "project" */'@/views/Project/Commit.vue'),
+      },
     ],
   }),
 ];

+ 92 - 69
src/views/Project/APITest.vue

@@ -164,6 +164,70 @@
                     </el-table-column>
                   </el-table>
                 </el-tab-pane>
+                <el-tab-pane label="自动化测试结果" name="autoTest_result">
+                  <h5>注:Max、Min、Average的单位均为ms</h5>
+                  <ElTable :data="autoTestResult" width="100%">
+                    <ElTableColumn
+                      prop="id"
+                      label="ID"
+                      align="center"
+                      width="60">
+                    </ElTableColumn>
+<!--                    <ElTableColumn-->
+<!--                      prop="testId"-->
+<!--                      label="所属测试ID"-->
+<!--                      align="center"-->
+<!--                      width="100">-->
+<!--                    </ElTableColumn>-->
+                    <ElTableColumn
+                      prop="executeTime"
+                      label="执行时间"
+                      align="center"
+                      width="100">
+                    </ElTableColumn>
+<!--                    <ElTableColumn-->
+<!--                      prop="timeList"-->
+<!--                      label="执行时间列表"-->
+<!--                      align="center">-->
+<!--                    </ElTableColumn>-->
+                    <ElTableColumn
+                      prop="success"
+                      label="成功"
+                      align="center"
+                      width="100">
+                    </ElTableColumn>
+                    <ElTableColumn
+                      prop="failure"
+                      label="失败"
+                      align="center"
+                      width="100">
+                    </ElTableColumn>
+                    <ElTableColumn
+                      prop="maxTime"
+                      label="Max"
+                      align="center"
+                      width="100">
+                    </ElTableColumn>
+                    <ElTableColumn
+                      prop="minTime"
+                      label="Min"
+                      align="center"
+                      width="100">
+                    </ElTableColumn>
+                    <ElTableColumn
+                      prop="averageTime"
+                      label="Average"
+                      align="center"
+                      width="100">
+                    </ElTableColumn>
+                    <ElTableColumn
+                      prop="pipelineHistoryId"
+                      label="流水线ID"
+                      align="center"
+                      width="100">
+                    </ElTableColumn>
+                  </ElTable>
+                </el-tab-pane>
               </el-tabs>
             </el-col>
           </el-row>
@@ -317,9 +381,15 @@
         </ElTableColumn>
         <ElTableColumn
           prop="title"
-          label="title"
+          label="标题"
           align="center">
         </ElTableColumn>
+        <ElTableColumn
+          prop="taskId"
+          label="关联的任务ID"
+          align="center"
+          width="150">
+        </ElTableColumn>
         <ElTableColumn
           prop="pass"
           label="执行状态"
@@ -344,7 +414,8 @@
         </ElTableColumn>
         <ElTableColumn
           label="详情"
-          align="center">
+          align="center"
+          width="120">
           <template #default="scope">
             <ElButton
               @click="handleTestCasesClick('steps', scope.row.id)"
@@ -435,7 +506,7 @@
           :model="createTestCaseForm"
           ref="createTestCaseForm"
           label-position="right"
-          label-width="60px"
+          label-width="70px"
           label-suffix=":"
           class="create-APITest-form">
           <el-form-item label="title" prop="title">
@@ -445,6 +516,14 @@
               :rows="5"
               placeholder="请输入测试用例的标题"></el-input>
           </el-form-item>
+          <el-form-item label="taskId" prop="taskId">
+            <el-select v-model="createTestCaseForm.taskId">
+              <el-option
+                v-for="item in taskIdList"
+                :key="item"
+                :value="item"></el-option>
+            </el-select>
+          </el-form-item>
         </el-form>
         <template #footer>
           <span class="dialog-footer">
@@ -478,7 +557,7 @@
             <el-col :span="20">
               <el-row class="entry-row" style="margin-top: 15px; margin-bottom: 30px">
                 <el-col :span="2">
-                  <h4>title: </h4>
+                  <h4>标题: </h4>
                 </el-col>
                 <el-col :span="18">
                   <div>{{detailTestCaseInfo.title}}</div>
@@ -638,69 +717,6 @@
         </template>
       </el-dialog>
     </ElTabPane>
-    <ElTabPane label="自动化测试结果" name="autotest">
-      <ElTable :data="autoTestResult" width="100%">
-        <ElTableColumn
-          prop="id"
-          label="ID"
-          align="center"
-          width="60">
-        </ElTableColumn>
-        <ElTableColumn
-          prop="testId"
-          label="所属测试ID"
-          align="center"
-          width="100">
-        </ElTableColumn>
-        <ElTableColumn
-          prop="executeTime"
-          label="执行时间"
-          align="center"
-          width="100">
-        </ElTableColumn>
-        <ElTableColumn
-          prop="timeList"
-          label="执行时间列表"
-          align="center">
-        </ElTableColumn>
-        <ElTableColumn
-          prop="success"
-          label="success"
-          align="center"
-          width="100">
-        </ElTableColumn>
-        <ElTableColumn
-          prop="failure"
-          label="failure"
-          align="center"
-          width="100">
-        </ElTableColumn>
-        <ElTableColumn
-          prop="maxTime"
-          label="Max"
-          align="center"
-          width="100">
-        </ElTableColumn>
-        <ElTableColumn
-          prop="minTime"
-          label="Min"
-          align="center"
-          width="100">
-        </ElTableColumn>
-        <ElTableColumn
-          prop="averageTime"
-          label="Average"
-          align="center"
-          width="100">
-        </ElTableColumn>
-        <ElTableColumn
-          prop="pipelineRecordId"
-          label="流水线ID"
-          align="center"
-          width="100">
-        </ElTableColumn>
-      </ElTable>
-    </ElTabPane>
   </ElTabs>
 </template>
 
@@ -744,6 +760,7 @@ export default {
       createTestCaseForm: {
         projectId: -1,
         title: '',
+        taskId: '',
       },
       stepsDrawer: false,
       detailTestCaseInfo: [],
@@ -757,13 +774,15 @@ export default {
       deployHistoryInfo: {},
       deployHistoryDrawer: false,
       autoTestResult: [],
+      taskIdList: [],
     };
   },
   async mounted() {
     this.currentProjectId = this.$store.state.workspace.currentProjectId;
     this.apitests = await APITestAPI.getAPITestInfosByProjectId(this.$store.state.workspace.currentProjectId);
     this.testcases = await FuncTestAPI.getTestCases(this.$store.state.workspace.currentProjectId);
-    this.autoTestResult = await AutoTestAPI.getAutoTestResultByProjectId(this.$store.state.workspace.currentProjectId);
+    this.taskIdList = await FuncTestAPI.getTreeIdList(this.$store.state.workspace.currentProjectId);
+    // this.autoTestResult = await AutoTestAPI.getAutoTestResultByProjectId(this.$store.state.workspace.currentProjectId);
   },
   methods: {
     async handleClick(action, id) {
@@ -800,6 +819,8 @@ export default {
             }
           });
           this.testResults = await APITestAPI.getAPITestResultByTestId(id);
+          this.autoTestResult = await AutoTestAPI.getAutoTestResultByProjectId(this.$store.state.workspace.currentProjectId, id);
+          console.log(this.autoTestResult);
           this.detailDrawer = true;
           break;
         }
@@ -1005,7 +1026,9 @@ export default {
       this.$refs.createTestCaseForm.validate(async (valid) => {
         if (valid) {
           this.createTestCaseForm.projectId = this.$store.state.workspace.currentProjectId;
-          await FuncTestAPI.createTestCase(this.createTestCaseForm.projectId, this.createTestCaseForm.title);
+          await FuncTestAPI.createTestCase(
+            this.createTestCaseForm.projectId, this.createTestCaseForm.title, this.createTestCaseForm.taskId,
+          );
           this.testcases = await FuncTestAPI.getTestCases(this.$store.state.workspace.currentProjectId);
           this.$refs.createTestCaseForm.resetFields();
           this.showTestCaseCreateModel = false;

+ 110 - 0
src/views/Project/Commit.vue

@@ -0,0 +1,110 @@
+<template>
+  <div class="container">
+    <el-row class="row-item title">
+      <h2>commit记录</h2>
+    </el-row>
+    <div>
+      <ElTimeline>
+        <ElTimelineItem
+          v-for="(git, index) in gits"
+          :key="index"
+          :timestamp="git.timestamp"
+          placement="top">
+          <ElCard>
+            <h3 class="id">#{{git.id}}</h3>
+            <div style="margin-top: 10px; font-size: 16px">{{git.message}}</div>
+            <div style="margin-top: 10px">
+              <el-row>
+                <el-col :span="12">
+                  处理人:<span style="font-weight: bold">{{git.gitlabUsername}}</span>
+                </el-col>
+                <el-col :span="12">
+                  类型:
+                  <span v-if="git.relatedType === 'BUG_ID'" class="node bug">缺陷</span>
+                  <span v-else class="node requirement">需求</span></el-col>
+              </el-row>
+            </div>
+          </ElCard>
+        </ElTimelineItem>
+      </ElTimeline>
+    </div>
+  </div>
+</template>
+
+<script>
+export default {
+  name: 'Commit.vue',
+  data() {
+    return {
+      gits: [
+        {
+          id: '010f2a0ccf522fe6c1408bffdd494782880c1ec9',
+          message: 'fix: working on #942#, 处理bug942',
+          timestamp: '2021-07-10 15:09:36',
+          gitlabUsername: 'xiaofei',
+          relatedType: 'BUG_ID',
+          relatedId: 942,
+        },
+        {
+          id: '030a88a98695d83bdd91937783c08323451d5046',
+          message: 'feat: complete #878# ',
+          timestamp: '2021-07-09 23:18:20',
+          gitlabUsername: '17313',
+          relatedType: 'TREE_ID',
+          relatedId: 878,
+        },
+        {
+          id: '07f536fc5d660d8085d360961ab4fd337df9b8f1',
+          message: 'fix: fixing on #17#',
+          timestamp: '2021-07-08 13:45:22',
+          gitlabUsername: 'suyiiis',
+          relatedType: 'BUG_ID',
+          relatedId: 17,
+        },
+        {
+          id: '0c75b8b675291c1f90a56e912befc38341ec3171',
+          message: 'feat: complete #273#',
+          timestamp: '2021-07-08 10:11:23',
+          gitlabUsername: 'YGcatwhite',
+          relatedType: 'TREE_ID',
+          relatedId: 273,
+        },
+      ],
+    };
+  },
+};
+</script>
+
+<style scoped>
+.container {
+  margin: 50px 100px;
+  width: 30%;
+}
+.row-item {
+  display: flex;
+  flex-direction: row;
+  align-items: center;
+  margin-bottom: 10px;
+}
+.id {
+  width: fit-content;
+  height: 20px;
+  background-color: #2185d0;
+  color: #fff;
+  border: 0 solid transparent;
+  border-radius: .28571429rem;
+}
+.node {
+  width: 15px;
+  color: #FFFFFF;
+  border-radius: 3px;
+  font-size: 14px;
+  text-align: center;
+}
+.bug {
+  background-color: chocolate;
+}
+.requirement {
+  background-color: #42b983;
+}
+</style>

+ 11 - 2
src/views/Project/Invite.vue

@@ -56,8 +56,17 @@ export default {
       ElMessage.success('邀请码将在5分钟后失效,请及时完成操作!');
     },
     async relate() {
-      await ProjectAPI.relateProject(this.$store.state.workspace.currentProjectId, this.targetCode);
-      ElMessage.success('关联成功');
+      await ProjectAPI.relateProject(this.$store.state.workspace.currentProjectId, this.targetCode).then((res) => {
+        if (res === '验证码有效时间为五分钟,已过期') {
+          ElMessage.warning('验证码有效时间为五分钟,已过期');
+        } else if (res === '不可将本项目与自身关联!') {
+          ElMessage.error('不可将本项目与自身关联!');
+        } else if (res === '该项目已与目标项目关联过,无须重复关联') {
+          ElMessage.warning('该项目已与目标项目关联过,无须重复关联');
+        } else {
+          ElMessage.success('关联成功');
+        }
+      });
       this.targetCode = '';
     },
   },

+ 73 - 1
src/views/Project/Schedule.vue

@@ -38,6 +38,14 @@
   </el-card>
   <el-row  style="display: flex;flex-direction: row;align-items: center;margin-bottom: 10px;color: #333333">
     <h4>项目规划</h4>
+    <ElTooltip
+      class="tooltip"
+      effect="dark"
+      :content="'点击查看需求规划四层说明'"
+      placement="right-end"
+    >
+      <i class="el-icon-question" @click="getDetails()" style="cursor: pointer"></i>
+    </ElTooltip>
   </el-row>
   <Tree
     :data="requirements"
@@ -52,6 +60,37 @@
     @change="handleDrawerContentChange"
     @requirement-update="getTreeData"
   ></RequirementDrawer>
+  <ElDrawer
+    v-model="detailDrawer"
+    :size="600">
+    <template #title>
+      <el-row>
+        <el-col :span="8">
+          <span style="font-weight: bold; font-size: 18px; color: black">需求规划四层说明</span>
+        </el-col>
+      </el-row>
+    </template>
+    <ElTable :data="details" width="100%">
+      <ElTableColumn
+        prop="type"
+        label="类型"
+        align="center"
+        width="150">
+      </ElTableColumn>
+      <ElTableColumn
+        prop="explain"
+        label="说明"
+        align="left"
+        header-align="center">
+      </ElTableColumn>
+    </ElTable>
+    <el-row>
+      <el-col :span="8">
+        <span style="font-weight: bold; font-size: 18px; color: black; padding: 20px 20px 20px; margin-top: 20px">举例</span>
+      </el-col>
+    </el-row>
+    <img src="@/assets/example.png" style="height: 400px; width: 100%">
+  </ElDrawer>
 </template>
 
 <script>
@@ -79,6 +118,31 @@ export default {
       addRequirementDrawer: false,
       parentOfAddingRequirement: null,
       requirementInDrawer: {},
+      detailDrawer: false,
+      details: [
+        {
+          type: '需求(Requirement)',
+          explain: '● 需求是⽤户的⼀种期望,是⽤户为了解决问题或达到某些目标所需要的条件或能力。\n'
+                    + '● 是系统或系统部件为了满⾜合同、标准、规范或其他正式⽂档所规定的要求⽽需要具备的条件或能⼒。\n'
+                    + '● 对上述中的一个条件或一种能⼒的⼀种⽂档化表述。\n'
+                    + '● 这里需求的粒度较大,需要继续分解为Feature;并通过Feature继续细化为Story来完成开发和迭代。',
+        },
+        {
+          type: '特性(Feature)',
+          explain: '● 特性是可以给用户带来价值的产品功能或者特性。\n'
+                    + '● 特性向上承接Feature,向下分解为Story。相比需求,Feature更加具体形象,用户更容易理解。\n',
+        },
+        {
+          type: '用户故事(Story)',
+          explain: '● 用户故事是从用户角度对产品需求的详细描述,具有更小的粒度。\n'
+                    + '● 一般是从不同用户出发,对同一个大粒度需求的不同希望。\n',
+        },
+        {
+          type: '任务(Task)',
+          explain: '● 在书写完用户故事后,需要将Story指派给具体成员,并分解为一个或多个任务(Task)。\n'
+                    + '● 需要填写预计工时',
+        },
+      ],
     };
   },
   computed: {
@@ -260,6 +324,9 @@ export default {
         ],
       });
     },
+    getDetails() {
+      this.detailDrawer = true;
+    },
   },
 };
 </script>
@@ -271,5 +338,10 @@ export default {
 .description-card-text{
   margin: 5px 0;
 }
-
+.el-drawer__body{
+  overflow: auto;
+}
+.el-table .cell{
+  white-space: pre-line;
+}
 </style>

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