瀏覽代碼

个人中心项目任务添加状态

sunjh 6 年之前
父節點
當前提交
59b5d97c7c

+ 47 - 12
src/components/Mine.vue

@@ -52,31 +52,66 @@
     <!--</el-row>-->
     <!--</div>-->
     <div class="mine-body" style="text-align: center;">
-      <el-tabs  tabPosition="top" v-loading="loading" style="width: 90%;margin-left: 5%">
-        <el-tab-pane v-if="rolesPermissions.isAgency" label="未完成任务">
+      <el-tabs  v-loading="loading" style="width: 90%;margin-left: 5%">
+        <el-tab-pane label="未完成任务">
+          <el-row v-if="unFinishedTaskList != null && unFinishedTaskList.length != 0" type="flex" align="middle" justify="center"  style="font-size: 14px;">
+
+            <el-col :span="6">任务封面</el-col>
+            <el-col :span="5">任务名称</el-col>
+            <el-col :span="5">任务类型</el-col>
+            <el-col :span="4">任务预算</el-col>
+            <el-col :span="4">操作</el-col>
+          </el-row>
           <span v-if="unFinishedTaskList == null || unFinishedTaskList.length == 0"> 暂无任务 </span>
           <task-item v-if="unFinishedTaskList != null || unFinishedTaskList.length > 0"
-                     v-for="(item,index) in unFinishedTaskList" :key="index" :task="item"/>
+                     v-for="(item,index1) in unFinishedTaskList" :key="index1" :task="item"/>
         </el-tab-pane>
-        <el-tab-pane v-if="rolesPermissions.isAgency" label="已完成任务">
+        <el-tab-pane label="已完成任务">
+          <el-row v-if="finishedTaskList != null && finishedTaskList.length != 0" type="flex" align="middle" justify="center"  style="font-size: 14px;">
+
+            <el-col :span="6">任务封面</el-col>
+            <el-col :span="5">任务名称</el-col>
+            <el-col :span="5">任务类型</el-col>
+            <el-col :span="4">任务预算</el-col>
+            <el-col :span="4">操作</el-col>
+          </el-row>
           <span v-if="finishedTaskList == null || finishedTaskList.length == 0"> 暂无任务 </span>
           <task-item v-if="finishedTaskList != null || finishedTaskList.length > 0"
-                     v-for="(item,index) in finishedTaskList" :key="index" :task="item"/>
+                     v-for="(item,index2) in finishedTaskList" :key="index2" :task="item"/>
         </el-tab-pane>
-        <el-tab-pane label="我的项目">
 
+        <el-tab-pane label="我的项目">
           <span v-if="myProjects == null || myProjects.length == 0"> 暂无项目 </span>
+          <el-row v-if="myProjects != null && myProjects.length != 0" type="flex" align="middle" justify="center"  style="font-size: 14px;">
+            <el-col :span="6">项目图片</el-col>
+            <el-col :span="6">项目名称</el-col>
+            <el-col :span="6">项目平台</el-col>
+            <el-col :span="2">项目预算</el-col>
+            <el-col :span="4">操作</el-col>
+          </el-row>
           <project-item v-if="myProjects != null || myProjects.length > 0"
-                        v-for="(item,index) in myProjects" :key="index" :projectItem="item"/>
+                        v-for="(item,index3) in myProjects" :key="index3" :projectItem="item"/>
         </el-tab-pane>
-        <el-tab-pane v-if="rolesPermissions.isRegionManager" label="处理中项目">
-
+        <el-tab-pane label="处理中项目">
+          <el-row v-if="handlingProjects != null && handlingProjects.length != 0" type="flex" align="middle" justify="center"  style="font-size: 14px;">
+            <el-col :span="6">项目图片</el-col>
+            <el-col :span="6">项目名称</el-col>
+            <el-col :span="6">项目平台</el-col>
+            <el-col :span="2">项目预算</el-col>
+            <el-col :span="4">操作</el-col>
+          </el-row>
           <span v-if="handlingProjects == null || handlingProjects.length == 0"> 暂无项目 </span>
           <project-item v-if="handlingProjects != null || handlingProjects.length > 0"
-                        v-for="(item,index) in handlingProjects" :key="index" :projectItem="item"/>
+                        v-for="(item,index4) in handlingProjects" :key="index4" :projectItem="item"/>
         </el-tab-pane>
-        <el-tab-pane v-if="rolesPermissions.isRegionManager" label="可接收项目">
-
+        <el-tab-pane label="可接收项目">
+          <el-row v-if="acceptableProjects != null && acceptableProjects.length != 0" type="flex" align="middle" justify="center"  style="font-size: 14px;">
+            <el-col :span="6">项目图片</el-col>
+            <el-col :span="6">项目名称</el-col>
+            <el-col :span="6">项目平台</el-col>
+            <el-col :span="2">项目预算</el-col>
+            <el-col :span="4">操作</el-col>
+          </el-row>
           <span v-if="acceptableProjects == null || acceptableProjects.length == 0"> 暂无项目 </span>
           <project-item v-if="acceptableProjects != null || acceptableProjects.length > 0"
                         v-for="(item,index) in acceptableProjects" :key="index" :projectItem="item"/>

+ 60 - 16
src/components/commons/ProjectItem.vue

@@ -1,22 +1,39 @@
 <template>
   <div class="project-item-container">
-    <span class="col-xl-2 col-lg-3 col-md-4 col-sm-1" style="width: 150px">
-      <img class="project-cover" src="@/assets/img/home_ban1.jpg">
-    </span>
-    <span class="project-title col-md-2 col-sm-10" style="width: 150px;font-size: 12px">{{project.name}}</span>
-    <span class="project-title col-md-2 col-sm-10" style="width: 10%;font-size: 12px">{{project.id}}</span>
-    <span class="col-md-2 col-sm-10" style="width: 10%">
-      <span
-        style="font-size: 10px;"
-        v-bind:class="['badge',{ 'ios-platform': item=='IOS','android-platform': item=='ANDROID','web-platform': item=='WEB'}]"
-        v-for="item in project.platform"
-      >{{item}}</span>
-    </span>
-    <span class="col-md-1 col-sm-5" style="width: 10%;font-size: 12px"><div class="badge">¥{{project.budget}}</div></span>
-    <span class="project-td" style="width: 15%">
-      <span class="btn btn-small btn-info" @click="goToProjectDetail(project.id)">查看详情</span>
-    </span>
+    <!--<span class="col-xl-2 col-lg-3 col-md-4 col-sm-1" style="width: 150px">-->
+      <!--<img class="project-cover" src="@/assets/img/home_ban1.jpg">-->
+    <!--</span>-->
+    <!--<span class="project-title col-md-2 col-sm-10" style="width: 150px;font-size: 12px">{{project.name}}</span>-->
+    <!--<span class="project-title col-md-2 col-sm-10" style="width: 10%;font-size: 12px">{{project.id}}</span>-->
+    <!--<span class="col-md-2 col-sm-10" style="width: 10%">-->
+      <!--<span-->
+        <!--style="font-size: 10px;"-->
+        <!--v-bind:class="['badge',{ 'ios-platform': item=='IOS','android-platform': item=='ANDROID','web-platform': item=='WEB'}]"-->
+        <!--v-for="item in project.platform"-->
+      <!--&gt;{{item}}</span>-->
+    <!--</span>-->
+    <!--<span class="col-md-1 col-sm-5" style="width: 10%;font-size: 12px"><div class="badge">¥{{project.budget}}</div></span>-->
+    <!--<span class="project-td" style="width: 15%">-->
+      <!--<span class="btn btn-small btn-info" @click="goToProjectDetail(project.id)">查看详情</span>-->
+    <!--</span>-->
+    <el-row type="flex" align="middle" justify="center"  style="font-size: 14px;">
+      <el-badge :value="project.statusVO.text" class="item" :type="project.statusVO.style">
+        <el-col :span="6"><img class="project-cover" src="@/assets/img/home_ban1.jpg"></el-col>
+      </el-badge>
+      <el-col :span="6">{{project.name}}</el-col>
+      <!--<el-col :span="4">{{project.id}}</el-col>-->
+      <el-col :span="6">
+        <span style="font-size: 10px;" v-bind:class="['badge',{ 'ios-platform': item=='IOS','android-platform': item=='ANDROID','web-platform': item=='WEB'}]"
+              v-for="item in project.platform"
+        >{{item}}</span>
+      </el-col>
+      <el-col :span="2"><div class="badge">¥{{project.budget}}</div></el-col>
+      <el-col :span="4"><span class="btn btn-small btn-info" @click="goToProjectDetail(project.id)">查看详情</span></el-col>
+    </el-row>
+
+
   </div>
+
 </template>
 
 <script>
@@ -73,4 +90,31 @@ export default {
   .project-td {
     padding: 15px;
   }
+
+  .el-row {
+    margin-bottom: 20px;
+    &:last-child {
+      margin-bottom: 0;
+    }
+  }
+  .el-col {
+    border-radius: 4px;
+  }
+  .bg-purple-dark {
+    background: #99a9bf;
+  }
+  .bg-purple {
+    background: #d3dce6;
+  }
+  .bg-purple-light {
+    background: #e5e9f2;
+  }
+  .grid-content {
+    border-radius: 4px;
+    min-height: 36px;
+  }
+  .row-bg {
+    padding: 10px 0;
+    background-color: #f9fafc;
+  }
 </style>

+ 15 - 17
src/components/commons/TaskItem.vue

@@ -1,22 +1,19 @@
 <template>
   <div class="task-item-container">
-       <span class="col-xl-2 col-lg-3 col-md-4 col-sm-1">
-        <img class="task-cover" src="@/assets/img/home_ban1.jpg">
-      </span>
-    <span class="task-title col-md-2 col-sm-10">{{taskTable.title}}</span>
-    <span class="col-md-1 col-sm-5 ">{{taskTable.serviceType}}</span>
-    <span class="col-md-1 col-sm-5 ">
-      <span class="badge">
-      ¥{{taskTable.quotePrice==null?0:taskTable.quotePrice}}</span>
-      </span>
-    <!--<span class="col-md-1 col-sm-5 ">{{platformType}}</span>-->
-    <span class="col-md-1 col-sm-5">
-        {{taskStatus[taskTable.status]}}
-    </span>
-    <span class="task-td">
-       <span class="btn btn-medium btn-info" @click="goToTaskDetail(taskTable.projectId,taskTable.id)">查看详情</span>
-       </span>
+    <el-row type="flex" align="middle" justify="center" style="font-size: 14px;">
+      <el-badge :value="taskTable.statusVO.text" class="item" :type="taskTable.statusVO.style">
+        <el-col :span="6"><img class="task-cover" src="@/assets/img/home_ban1.jpg"></el-col>
+      </el-badge>
 
+      <el-col :span="5">{{taskTable.title}}</el-col>
+      <!--<el-col :span="4">{{project.id}}</el-col>-->
+      <el-col :span="5">{{taskTable.serviceType}}</el-col>
+      <el-col :span="4">
+        <div class="badge">¥{{taskTable.quotePrice==null?0:taskTable.quotePrice}}</div>
+      </el-col>
+      <el-col :span="4"><span class="btn btn-medium btn-info" @click="goToTaskDetail(taskTable.projectId,taskTable.id)">查看详情</span>
+      </el-col>
+    </el-row>
   </div>
 </template>
 
@@ -55,7 +52,8 @@ export default {
 
 <style lang="less" scoped>
   .task-item-container {
-    padding: 20px;
+    padding-top: 10px;
+    padding-bottom: 10px;
     border: 1px solid #eee;
     margin: 15px 5px;
     span {

+ 20 - 5
src/components/project/Project.vue

@@ -144,8 +144,9 @@
             </div>
           </el-upload>
           <span v-if="!isModifyMode">
-            <a :href="project.requireDocUrl" v-if="project.requireDocUrl!=null && project.requireDocUrl!=''"><el-link :underline="false" type="primary"><i
-            class="el-icon-document"></i>下载文档</el-link></a>
+            <a :href="project.requireDocUrl" v-if="project.requireDocUrl!=null && project.requireDocUrl!=''"><el-link
+              :underline="false" type="primary"><i
+              class="el-icon-document"></i>下载文档</el-link></a>
             <i v-if="project.requireDocUrl==null || project.requireDocUrl==''" class="el-icon-document">暂无文档</i>
           </span>
         </el-form-item>
@@ -170,8 +171,9 @@
             </div>
           </el-upload>
           <span v-if="!isModifyMode">
-            <a v-if="project.fileUrl!=null && project.fileUrl!=''" :href="project.fileUrl"><el-link :underline="false" type="primary"><i
-            class="el-icon-document"></i>下载文件</el-link></a>
+            <a v-if="project.fileUrl!=null && project.fileUrl!=''" :href="project.fileUrl"><el-link :underline="false"
+                                                                                                    type="primary"><i
+              class="el-icon-document"></i>下载文件</el-link></a>
             <i v-if="project.fileUrl==null || project.fileUrl==''" class="el-icon-document">下载文件</i>
           </span>
         </el-form-item>
@@ -267,6 +269,7 @@ import ResourceType from '@/constants/enum/resource-type'
 import provincecity from '@/components/commons/ProvinceCity'
 import {notify} from '@/constants/index'
 import {
+  checkFileType,
   ensureEndProject,
   getAllInstitutions,
   getAllPlatformTypes,
@@ -639,7 +642,15 @@ export default {
       })
     },
     handleDelete (index, id) {
-      this.task.splice(index, 1)
+      this.$confirm('确认删除该任务?')
+        .then(_ => {
+          //done()
+          notify('success','删除成功')
+        })
+        .catch(_ => {
+          notify('error','删除失败')
+        })
+      //this.task.splice(index, 1)
     },
     beforeApkUpload (file) {
       const isAPK = file.type === 'application/vnd.android.package-archive'
@@ -724,6 +735,10 @@ export default {
     beforeRemove (file, fileList) {
       //return this.$confirm(`确定移除 ${file.name}?`)
     },
+    beforeUploadRequireDoc () {
+    },
+    beforeUploadApkFile () {
+    },
     uploadRequireDoc (param) {
       this.showLoading()
       const formData = new FormData()

+ 39 - 38
src/components/project/ProjectCreate.vue

@@ -18,7 +18,8 @@
           </el-input>
         </el-form-item>
         <el-form-item label="需求描述" prop="desc">
-          <el-input autosize type="textarea" style="width: 400px" v-model="project.desc" placeholder="请输入对项目的描述"></el-input>
+          <el-input autosize type="textarea" style="width: 400px" v-model="project.desc"
+                    placeholder="请输入对项目的描述"></el-input>
         </el-form-item>
 
         <!--<el-form-item label="价格" prop="price">-->
@@ -66,6 +67,7 @@
         </el-form-item>
         <el-form-item label="需求文档" prop="doc">
           <el-upload
+            style="width: 400px"
             drag
             class="upload-demo"
             action=""
@@ -87,6 +89,7 @@
         <el-form-item label="安装包" prop="file">
           <el-upload
             drag
+            style="width: 400px"
             class="upload-demo"
             action=""
             :on-remove="handleRemove"
@@ -132,6 +135,7 @@ import provinceCityJSON from '@/constants/provinceCity.json'
 import ResourceType from '@/constants/enum/resource-type'
 import {notify} from '@/constants/index'
 import {
+  checkFileType,
   getAllInstitutions,
   getAllPlatformTypes,
   getAllServiceTypes,
@@ -263,24 +267,24 @@ export default {
     institutionArray (val) {
       this.institutionArray = val
     },
-    'project.institution' () {
-      if (this.project.institution) {
-        this.$refs.addFormProvince.resetProviceCity()
-        this.project.location = {provinceCode: '', cityCode: ''}
-      }
-    },
-    'project.location' () {
-      if (this.project.location.provinceCode || this.project.location.cityCode) {
-        this.project.institution = ''
-      }
-    },
-    'project.resource' () {
-      if (this.project.resource == '2') {
-        this.$refs.addFormProvince.resetProviceCity()
-        this.project.institution = ''
-        this.project.location = {provinceCode: '', cityCode: ''}
-      }
-    },
+    // 'project.institution' () {
+    //   if (this.project.institution) {
+    //     this.$refs.addFormProvince.resetProviceCity()
+    //     this.project.location = {provinceCode: '', cityCode: ''}
+    //   }
+    // },
+    // 'project.location' () {
+    //   if (this.project.location.provinceCode || this.project.location.cityCode) {
+    //     this.project.institution = ''
+    //   }
+    // },
+    // 'project.resource' () {
+    //   if (this.project.resource == '2') {
+    //     this.$refs.addFormProvince.resetProviceCity()
+    //     this.project.institution = ''
+    //     this.project.location = {provinceCode: '', cityCode: ''}
+    //   }
+    // },
     deep: true
   },
   methods: {
@@ -382,27 +386,18 @@ export default {
       this.project.budget = ''
     },
     beforeApkUpload (file) {
-      console.log(file)
-      const isAPK = file.type === 'application/vnd.android.package-archive'
-      const isDMG = file.type === 'application/octet-stream'
-
-      if (!isAPK && !isDMG) {
-        this.$message.error('上传安装包只能是 APK 或 DMG 格式!')
-      }
-      return isAPK || isDMG
+      const fileType = ['exe', 'apk', 'dmg']
+      return checkFileType(file, fileType, this.beforeApkUploadError)
+    },
+    beforeApkUploadError () {
+      this.$message.error('上传文件只能是exe,dmg,apk格式!')
     },
     beforeFileUpload (file) {
-      const isPDF = file.type === 'application/pdf'
-      const isDOC = file.type === 'application/vnd.openxmlformats-officedocument.wordprocessingml.document'
-      const isEXCEL = file.type === 'application/vnd.ms-excel'
-      const isXLS = file.type === 'application/x-xls'
-      const isTXT = file.type === 'text/plain'
-      const isXLSX = file.type === 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
-      //console.log(file)
-      if (!(isDOC || isEXCEL || isPDF || isTXT || isXLS || isXLSX)) {
-        this.$message.error('上传文件只能是 PDF 、 DOC 、DOCX 、XLS、TXT、XLSX 格式!')
-      }
-      return isDOC || isEXCEL || isPDF || isTXT || isXLS || isXLSX
+      const fileTypeList = ['pdf', 'xls', 'xlsx', 'doc', 'docx', 'txt']
+      return checkFileType(file, fileTypeList, this.beforeFileUploadError)
+    },
+    beforeFileUploadError () {
+      this.$message.error('上传文件只能是 PDF 、 DOC 、DOCX 、XLS、TXT、XLSX 格式!')
     },
     loadData () {
       Http.get(Apis.PAGE.PROJECT_DETAIL_PAGE).then((res) => {
@@ -437,6 +432,9 @@ export default {
         this.project.requireDocUrl = res.data
         //console.log(this.project.doc)
         //console.log(res.data)
+      }).catch((error) => {
+        this.hideLoading()
+        notify('error', '需求文档上传失败:' + error.data)
       })
 
     },
@@ -453,6 +451,9 @@ export default {
         notify('success', '文件上传成功')
         this.project.fileUrl = res.data
         console.log(res)
+      }).catch((error) => {
+        this.hideLoading()
+        notify('error', '文件上传失败:' + error.data)
       })
     },
     setServiceType () {

+ 4 - 6
src/components/report/ProjectReport.vue

@@ -224,12 +224,10 @@ export default {
       return isDOC || isEXCEL || isPDF || isTXT || isXLS || isXLSX
     },
     back () {
-      if (window.history.length <= 1) {
-        this.$router.push({path: '/'})
-        return false
-      } else {
-        this.$router.go(-1)
-      }
+      this.$router.push({
+        name: 'Project',
+        params: {projectId: this.projectId}
+      })
     },
     loadData () {
       //pro1564487183259

+ 1 - 1
src/components/task/Task.vue

@@ -535,7 +535,7 @@ export default {
       this.taskOperationControl = res.taskOperationControl
       this.task.status = res.crowdTaskVO.status
       this.task.institution = res.crowdTaskVO.institution
-      notify('success', '结束结束成功!')
+      notify('success', '结束任务成功!')
     },
     //结束任务失败时的回调函数
     endTaskFail (error) {

+ 44 - 0
src/js/fileService.js

@@ -0,0 +1,44 @@
+import Http from './http'
+import Apis from './api'
+//上传文档
+export const uploadFile = (url, file) => {
+  const formData = new FormData()
+  let config = {
+    //添加请求头
+    headers: {'Content-Type': 'multipart/form-data'},
+  }
+  formData.append('file', file)
+  return Http.upload(url, formData, config)
+}
+
+//上传图片
+export const uploadImage = (file, uploadImageSuccess, uploadImageFail) => {
+  const formData = new FormData()
+  let config = {
+    //添加请求头
+    headers: {'Content-Type': 'multipart/form-data'},
+  }
+  formData.append('file', file)
+  Http.upload(Apis.FILE.UPLOAD_IMAGE, formData, config).then((res) => {
+    uploadImageSuccess(res)
+  }).catch((error) => {
+    uploadImageFail(error)
+  })
+}
+
+//上传图片前检测
+export const beforeUploadImage = () => {
+
+}
+
+//上传文档前检测
+export const beforeUploadFile = () => {
+
+}
+export const checkFileType = (file, typeList, checkFileTypeError) => {
+  var fileType = file.name.split('.')[file.name.split('.').length - 1].toLowerCase()
+  if (!typeList.includes(fileType)) {
+    checkFileTypeError()
+  }
+  return typeList.includes(fileType)
+}

+ 135 - 0
src/js/generalService.js

@@ -0,0 +1,135 @@
+import Http from './http'
+import Apis from './api'
+import ProvinceJson from '../constants/provinceCity'
+//存session
+export const storageSave = (key, value) => {
+  sessionStorage.setItem(key, JSON.stringify(value))
+}
+
+//取session
+export const storageGet = (key) => {
+  // return new Promise((resolve) => {
+  //   resolve(JSON.parse(sessionStorage.getItem(key)))
+  // })
+  return JSON.parse(sessionStorage.getItem(key))
+}
+
+//获取用户id
+export const getUserIdentity = () => {
+  return Http.get(Apis.USER.GET_USER_IDENTITY)
+}
+
+//获取所有测评能力
+export const getAllAbilities = () => {
+  return ['接口测试', '安全漏洞扫描', '风险评估服务', '源代码安全审计服务', '功能测试服务', '性能测试', '功能和易用性测试']
+  //return Http.get(Apis.GENERAL.GET_ALL_ABILITIES)
+}
+
+//获取所有测评资源种类
+export const getAllAgencyResourceTypes = () => {
+  return ['人力资源', '服务器资源', '专用设备']
+  //return Http.get(Apis.GENERAL.GET_ALL_ABILITIES)
+}
+
+//获取所有服务类型
+export const getAllServiceTypes = () => {
+  const data = ['接口测试', '安全漏洞扫描', '风险评估服务', '源代码安全审计服务', '功能测试服务', '性能测试', '功能和易用性测试']
+  return new Promise((resolve) => {
+    resolve(data)
+  })
+  //return Http.get(Apis.GENERAL.GET_ALL_ABILITIES)
+}
+
+//获取所有报告类型
+export const getAllReportTypes = () => {
+  const data = ['项目可行性报告', '项目测试方案', '项目测试报告', '项目缺陷报告', '项目用例报告', '其他']
+  return new Promise((resolve) => {
+    resolve(data)
+  })
+  //return Http.get(Apis.GENERAL.GET_ALL_ABILITIES)
+}
+
+//获取所有平台类型
+export const getAllPlatformTypes = () => {
+  return ['ANDROID', 'IOS', 'WEB']
+  //return Http.get(Apis.GENERAL.GET_ALL_ABILITIES)
+}
+//获取所有定向发布的目标
+export const getAllInstitutions = () => {
+  return Http.get(Apis.GENERAL.GET_ALL_INSTITUTIONS)
+}
+
+//获取所有测评机构
+export const getAllAgencies = () => {
+  // const data = [{
+  //   id: 1,
+  //   name: '慕测'
+  // }, {
+  //   id: 2,
+  //   name: '南大'
+  // }]
+  //
+  // return new Promise((resolve) => {
+  //   resolve(data)
+  // })
+  return Http.get(Apis.GENERAL.GET_ALL_AGENCIES)
+}
+
+//通过代码获取省、市名称
+export const getProvinceNameByProvinceCode = (provinceCode, cityCode) => {
+  for (var i = 0; i < ProvinceJson.provinces.length; i++) {
+    if (ProvinceJson.provinces[i].code == provinceCode) {
+      for (var j = 0; j < ProvinceJson.provinces[i].cities.length; j++) {
+        if (ProvinceJson.provinces[i].cities[j].code == cityCode) {
+          return {
+            'provinceCode': ProvinceJson.provinces[i].name,
+            'cityCode': ProvinceJson.provinces[i].cities[j].name
+          }
+        }
+      }
+    }
+  }
+  return {
+    'provinceCode': '江苏省',
+    'cityCode': '南京市'
+  }
+}
+//通过名称获取省、市代码
+export const getProvinceCodeByProvinceName = (provinceName, cityName) => {
+  for (var i = 0; i < ProvinceJson.provinces.length; i++) {
+    if (ProvinceJson.provinces[i].name == provinceName) {
+      for (var j = 0; j < ProvinceJson.provinces[i].cities.length; j++) {
+        if (ProvinceJson.provinces[i].cities[j].name == cityName) {
+          return {
+            'provinceCode': ProvinceJson.provinces[i].code,
+            'cityCode': ProvinceJson.provinces[i].cities[j].code
+          }
+        }
+      }
+    }
+  }
+  return {
+    'provinceCode': '3200',
+    'cityCode': '3201'
+  }
+}
+
+//获取批量上传项目模板文件
+export const getGreenChannelAddProjectExcelTemplateFile = (getTemplateExcelSuccess, getTemplateExcelFail) => {
+  const data = {
+    fileUrl: 'http://mooctest-crowd-service.oss-cn-hangzhou.aliyuncs.com/Others/%E9%A1%B9%E7%9B%AE%E5%AF%BC%E5%85%A5%E6%A8%A1%E6%9D%BF.xlsx'
+  }
+  new Promise((resolve) => {
+    resolve(data)
+  }).then((res) => {
+    getTemplateExcelSuccess(res)
+  }).catch((error) => {
+    getTemplateExcelFail(error)
+  })
+  // Http.get(Apis.FILE.GET_TEMPLATE_EXCEL_FILE).then((res) => {
+  //   getTemplateExcelSuccess(res)
+  // }).catch((error) => {
+  //   getTemplateExcelFail(error)
+  // })
+}
+

+ 81 - 11
src/js/index.js

@@ -1,6 +1,43 @@
 import Http from './http'
 import Apis from './api'
 import ProvinceJson from '../constants/provinceCity'
+import {} from './reportService'
+import {} from './projectService'
+import {} from './taskService'
+import {} from './userService'
+import {} from './generalService'
+import {} from './fileService'
+
+export {
+  //获取用户信息
+  //用户登出
+
+  //创建项目
+  //修改项目
+  //获取项目
+  //删除项目
+
+  //创建任务
+  //修改任务
+  //获取任务
+  //删除任务
+
+  //创建项目报告
+  //创建任务报告
+  //修改项目报告
+  //修改任务报告
+  //获取项目报告详情
+  //获取任务报告详情
+  //删除项目报告
+  //删除任务报告
+
+  //上传图片
+  //上传文档
+  //校验上传格式
+  //上传需求文档
+  //上传安装包
+  //上传批量创建项目文件
+}
 
 export const defaultValue = {
   name: '普通用户',
@@ -103,14 +140,18 @@ export const uploadFile = (url, file) => {
 }
 
 //上传图片
-export const uploadImage = (file) => {
+export const uploadImage = (file, uploadImageSuccess, uploadImageFail) => {
   const formData = new FormData()
   let config = {
     //添加请求头
     headers: {'Content-Type': 'multipart/form-data'},
   }
   formData.append('file', file)
-  return Http.upload(Apis.FILE.UPLOAD_IMAGE, formData, config)
+  Http.upload(Apis.FILE.UPLOAD_IMAGE, formData, config).then((res) => {
+    uploadImageSuccess(res)
+  }).catch((error) => {
+    uploadImageFail(error)
+  })
 }
 
 //上传图片前检测
@@ -139,8 +180,12 @@ export const getProject = (projectId) => {
 }
 
 //删除项目
-export const deleteProject = (projectId) => {
-
+export const deleteProject = (projectId, deleteProjectSuccess, deleteProjectFail) => {
+  Http.put(Apis.PROJECT.DELETE_PROJECT.replace('{projectId}', projectId), {}).then((res) => {
+    deleteProjectSuccess(res)
+  }).catch((error) => {
+    deleteProjectFail(error)
+  })
 }
 
 //区域管理员提出接收项目申请
@@ -207,8 +252,12 @@ export const getTask = (projectId, taskId, getTaskSuccess, getTaskFail) => {
 }
 
 //删除任务
-export const udeleteTask = () => {
-
+export const deleteTask = (projectId, taskId, deleteTaskSuccess, deleteTaskFail) => {
+  Http.put(Apis.TASK.DELETE_TASK.replace('{projectId}', projectId).replace('taskId', taskId), {}).then((res) => {
+    deleteTaskSuccess(res)
+  }).catch((error) => {
+    deleteTaskFail(error)
+  })
 }
 
 //测评机构接受任务
@@ -272,9 +321,22 @@ export const getReport = () => {
 
 }
 
-//删除报告
-export const deleteReport = () => {
+//删除项目报告
+export const deleteProjectReport = (projectId, reportId, deleteProjectReportSuccess, deleteProjectReportFail) => {
+  Http.put(Apis.REPORT.DELETE_PROJECT_REPORT.replace('{projectId}', projectId).replace('{reportId}', reportId), {}).then((res) => {
+    deleteProjectReportSuccess(res)
+  }).catch((error) => {
+    deleteProjectReportFail(error)
+  })
+}
 
+//删除任务报告
+export const deleteTaskReport = (projectId, taskId, reportId, deleteTaskReportSuccess, deleteTaskReportFail) => {
+  Http.put(Apis.REPORT.DELETE_TASK_REPORT.replace('{projectId}', projectId).replace('{taskId}', taskId).replace('{reportId}', reportId), {}).then((res) => {
+    deleteTaskReportSuccess(res)
+  }).catch((error) => {
+    deleteTaskReportFail(error)
+  })
 }
 
 //获取所有测评能力
@@ -404,13 +466,13 @@ export const getProvinceCodeByProvinceName = (provinceName, cityName) => {
 //获取批量上传项目模板文件
 export const getGreenChannelAddProjectExcelTemplateFile = (getTemplateExcelSuccess, getTemplateExcelFail) => {
   const data = {
-    fileUrl:'http://mooctest-crowd-service.oss-cn-hangzhou.aliyuncs.com/Others/%E9%A1%B9%E7%9B%AE%E5%AF%BC%E5%85%A5%E6%A8%A1%E6%9D%BF.xlsx'
+    fileUrl: 'http://mooctest-crowd-service.oss-cn-hangzhou.aliyuncs.com/Others/%E9%A1%B9%E7%9B%AE%E5%AF%BC%E5%85%A5%E6%A8%A1%E6%9D%BF.xlsx'
   }
   new Promise((resolve) => {
     resolve(data)
-  }).then((res)=>{
+  }).then((res) => {
     getTemplateExcelSuccess(res)
-  }).catch((error)=>{
+  }).catch((error) => {
     getTemplateExcelFail(error)
   })
   // Http.get(Apis.FILE.GET_TEMPLATE_EXCEL_FILE).then((res) => {
@@ -528,3 +590,11 @@ export const updateEnterpriseAuthInfo = (userId, authInfo) => {
   // })
   return Http.put(Apis.USER.UPDATE_ENTERPRISE_AUTHENTICATION_INFO.replace('{userId}', userId), authInfo)
 }
+//
+export const checkFileType = (file, typeList, checkFileTypeError) => {
+  var fileType = file.name.split('.')[file.name.split('.').length - 1].toLowerCase()
+  if (!typeList.includes(fileType)) {
+    checkFileTypeError()
+  }
+  return typeList.includes(fileType)
+}

+ 65 - 0
src/js/projectService.js

@@ -0,0 +1,65 @@
+import Http from './http'
+import Apis from './api'
+//创建项目
+export const createProject = (project) => {
+  return Http.post(Apis.PROJECT.CREATE_PROJECT, project)
+}
+
+//修改项目
+export const updateProject = (project, projectId) => {
+  return Http.put(Apis.PROJECT.UPDATE_PROJECT.replace('{projectId}', projectId), project)
+}
+
+//查看项目
+export const getProject = (projectId) => {
+  Http.get(Apis.PROJECT.GET_PROJECT.replace('{projectId}', projectId))
+}
+
+//删除项目
+export const deleteProject = (projectId, deleteProjectSuccess, deleteProjectFail) => {
+  Http.put(Apis.PROJECT.DELETE_PROJECT.replace('{projectId}', projectId), {}).then((res) => {
+    deleteProjectSuccess(res)
+  }).catch((error) => {
+    deleteProjectFail(error)
+  })
+}
+
+//区域管理员提出接收项目申请
+export const receiveProjectRequest = (projectId, userId, receiveProjectSuccess, receiveProjectFail) => {
+  console.log('调用')
+  Http.put(Apis.PROJECT.ACCEPT_PROJECT.replace('{projectId}', projectId).replace('{userId}', userId), {}).then((res) => {
+    console.log(res)
+    receiveProjectSuccess(res)
+
+  }).catch((error) => {
+    console.log(error)
+    receiveProjectFail(error)
+  })
+}
+
+//区域管理员拒绝项目
+export const rejectProject = (projectId, rejectProjectSuccess, rejectProjectFail) => {
+  Http.put(Apis.PROJECT.REJECT_PROJECT.replace('{projectId}', projectId), {}).then((res) => {
+    rejectProjectSuccess(res)
+  }).catch((error) => {
+    rejectProjectFail(error)
+  })
+}
+
+//区域管理员提出结束项目申请
+export const submitProjectRequest = (projectId, submitProjectReuqestSuccess, submitProjectRequestFail) => {
+  Http.put(Apis.PROJECT.SUBMIT_PROJECT.replace('{projectId}', projectId), {}).then((res) => {
+    submitProjectReuqestSuccess(res)
+  }).catch((error) => {
+    submitProjectRequestFail(error)
+  })
+}
+
+//用户确认结束项目
+export const ensureEndProject = (projectId, endProjectSuccess, endProjectFail) => {
+  Http.put(Apis.PROJECT.END_PROJECT.replace('{projectId}', projectId), {}).then((res) => {
+    endProjectSuccess(res)
+  }).catch((error) => {
+    endProjectFail(error)
+  })
+}

+ 44 - 0
src/js/reportService.js

@@ -0,0 +1,44 @@
+import Http from './http'
+import Apis from './api'
+//创建项目报告
+export const createProjectReport = () => {
+
+}
+
+//创建任务报告
+export const createTaskReport = () => {
+
+}
+
+//修改项目报告
+export const updateProjectReport = () => {
+
+}
+
+//修改任务报告
+export const updateTaskReport = () => {
+
+}
+
+//查看报告
+export const getReport = () => {
+
+}
+
+//删除项目报告
+export const deleteProjectReport = (projectId, reportId, deleteProjectReportSuccess, deleteProjectReportFail) => {
+  Http.put(Apis.REPORT.DELETE_PROJECT_REPORT.replace('{projectId}', projectId).replace('{reportId}', reportId), {}).then((res) => {
+    deleteProjectReportSuccess(res)
+  }).catch((error) => {
+    deleteProjectReportFail(error)
+  })
+}
+
+//删除任务报告
+export const deleteTaskReport = (projectId, taskId, reportId, deleteTaskReportSuccess, deleteTaskReportFail) => {
+  Http.put(Apis.REPORT.DELETE_TASK_REPORT.replace('{projectId}', projectId).replace('{taskId}', taskId).replace('{reportId}', reportId), {}).then((res) => {
+    deleteTaskReportSuccess(res)
+  }).catch((error) => {
+    deleteTaskReportFail(error)
+  })
+}

+ 69 - 0
src/js/taskService.js

@@ -0,0 +1,69 @@
+import Http from './http'
+import Apis from './api'
+//创建任务
+export const createTask = (projectId, task) => {
+  return Http.post(Apis.TASK.CREATE_TASK.replace('{projectId}', projectId), task)
+}
+
+//修改任务
+export const updateTask = (projectId, taskId, task, updateTaskSuccess, updateTaskFail) => {
+  Http.put(Apis.TASK.UPDATE_TASK.replace('{projectId}', projectId).replace('{taskId}', taskId), task).then((res) => {
+    updateTaskSuccess(res)
+  }).catch((error) => {
+    updateTaskFail(error)
+  })
+}
+
+//查看任务
+export const getTask = (projectId, taskId, getTaskSuccess, getTaskFail) => {
+  Http.get(Apis.TASK.GET_TASK.replace('{projectId}', projectId).replace('{taskId}', taskId), {}).then((res) => {
+    getTaskSuccess(res)
+  }).catch((error) => {
+    getTaskFail(error)
+  })
+}
+
+//删除任务
+export const deleteTask = (projectId, taskId, deleteTaskSuccess, deleteTaskFail) => {
+  Http.put(Apis.TASK.DELETE_TASK.replace('{projectId}', projectId).replace('taskId', taskId), {}).then((res) => {
+    deleteTaskSuccess(res)
+  }).catch((error) => {
+    deleteTaskFail(error)
+  })
+}
+
+//测评机构接受任务
+export const receiveTaskRequest = (projectId, taskId, userId, receiveTaskRequestSuccess, receiveTaskRequestFail) => {
+  Http.put(Apis.TASK.ACCEPT_TASK.replace('{projectId}', projectId).replace('{taskId}', taskId).replace('{userId}', userId), {}).then((res) => {
+    receiveTaskRequestSuccess(res)
+  }).catch((error) => {
+    receiveTaskRequestFail(error)
+  })
+
+}
+
+//测评机构提出结束任务申请
+export const submitTaskRequest = (projectId, taskId, submitTaskSuccess, submitTaskFail) => {
+  Http.put(Apis.TASK.SUBMIT_TASK.replace('{projectId}', projectId).replace('{taskId}', taskId), {}).then((res) => {
+    submitTaskSuccess(res)
+  }).catch((error) => {
+    submitTaskFail(error)
+  })
+}
+
+export const rejectTask = (projectId, taskId, rejectTaskSuccess, rejectTaskFail) => {
+  Http.put(Apis.TASK.REJECT_TASK.replace('{projectId}', projectId).replace('{taskId}', taskId), {}).then((res) => {
+    rejectTaskSuccess(res)
+  }).catch((error) => {
+    rejectTaskFail(error)
+  })
+}
+
+//区域管理员确认结束任务
+export const ensureEndTask = (projectId, taskId, endTaskSuccess, endTaskFail) => {
+  Http.put(Apis.TASK.END_TASK.replace('{projectId}', projectId).replace('{taskId}', taskId), {}).then((res) => {
+    endTaskSuccess(res)
+  }).catch((error) => {
+    endTaskFail(error)
+  })
+}

+ 203 - 0
src/js/userService.js

@@ -0,0 +1,203 @@
+import Http from './http'
+import Apis from './api'
+//获取用户信息
+export const getCurrentUser = () => {
+  // const data = {
+  //   userVO: {
+  //     id: 3,
+  //     photo: 'http://www.mooctest.net/assets/img/mooctest.png',
+  //     name: '郭超',
+  //     roleList: ['区域管理员', '个人用户', '企业用户', '测评机构', '系统管理员'],
+  //     mobile: '110',
+  //     email: '12345@qq.com',
+  //   },
+  //   agency: '',
+  // }
+  // return new Promise((resolve) => {
+  //   resolve(data)
+  // })
+  return Http.get(Apis.USER.GET_CURRENT_USER)
+}
+//
+export const getRolesPermissions = (roleList) => {
+  const roles = {
+    regionManager: 'RegionalManager',
+    individualUser: 'generalUser',
+    enterpriseUser: 'enterpriseUser',
+    agency: 'evaluationAgency',
+    systemAdministrator: 'SystemAdministrator'
+  }
+  const permissions = {
+    isRegionManager: false,
+    isIndividualUser: false,
+    isEnterpriseUser: false,
+    isAgency: false,
+    isSystemAdministrator: false
+  }
+  if (roleList.includes(roles.regionManager)) {
+    permissions.isRegionManager = true
+    permissions.isEnterpriseUser = true
+    permissions.isIndividualUser = true
+  }
+  if (roleList.includes(roles.agency)) {
+    permissions.isAgency = true
+    permissions.isEnterpriseUser = true
+    permissions.isIndividualUser = true
+  }
+  if (roleList.includes(roles.enterpriseUser)) {
+    permissions.isEnterpriseUser = true
+  }
+  if (roleList.includes(roles.individualUser)) {
+    permissions.isIndividualUser = true
+  }
+  if (roleList.includes(roles.systemAdministrator)) {
+    permissions.isSystemAdministrator = true
+    permissions.isRegionManager = true
+    permissions.isAgency = true
+    permissions.isEnterpriseUser = true
+    permissions.isIndividualUser = true
+  }
+  return permissions
+}
+
+export const logout = () => {
+  sessionStorage.removeItem('user')
+  sessionStorage.removeItem('rolesPermissions')
+  return Http.get(Apis.USER.LOGOUT)
+}
+//获取当前角色可访问的url
+export const getAuthUrls = () => {
+  return [
+    '/', '/home', '/square', '/mine', '/project/create',
+    '/project/:projectId', '/project/:projectId/task/create',
+    '/project/:projectId/task/:taskId', '/project/:projectId/analyse',
+    '/report/create', '/report/:reportId', '/greenChannel/addProject', '/greenChannel/addAgency',
+    '/authentication/individual', '/authentication/enterprise',
+    '/authentication/agency', '/authentication/index'
+  ]
+  //return Http.get(Apis.USER.GET_AUTH_URLS)
+}
+
+//上传个人认证信息
+export const uploadIndividualAuthenticationInfo = () => {
+  Http.post(Apis)
+}
+
+//上传企业认证信息
+export const uploadEnterpriseAuthenticationInfo = () => {
+
+}
+
+//上传机构认证信息
+export const uploadAgencyAuthenticationInfo = () => {
+
+}
+
+//获取所有认证消息
+export const getAllAuthentications = () => {
+  return [{
+    userVO: {},
+    type: '',
+    status: '',
+    authenticationDetail: {}
+  }]
+}
+
+export const getCurrentAuthenInfo = () => {
+  const individualData = {
+    type: '个人',//企业、机构、个人
+    //共有
+    id: 1,
+    userId: 3,
+    bankAccount: '621000999000999000',
+    address: '江苏科技大厦',
+    status: '认证失败',
+    rejectReason: '太强',
+    createTime: '2019.13.12',
+    //个人
+    realName: '李白',
+    IDCard: '32092111111111',
+    IDCardPhoto: 'http://www.mooctest.net/assets/img/mooctest.png',
+  }
+  const enterpriseData = {
+    type: '企业',//企业、机构、个人
+    //共有
+    id: 1,
+    userId: 3,
+    bankAccount: '621000999000999000',
+    address: '江苏科技大厦1901',
+    status: '',
+    rejectReason: '',
+    createTime: '',
+    //企业
+    companyName: '慕测呀',
+    legalPersonName: '郭超啊',
+    businessLicensePhoto: null,
+    unifiedSocialCreditCode: '1900000000086',
+
+  }
+  const agencyData = {
+    type: '机构',//企业、机构、个人
+    //共有
+    id: 1,
+    userId: 3,
+    bankAccount: '100000000086',
+    address: '江苏科技大厦1901',
+    status: '',
+    rejectReason: '123123123',
+    createTime: '',
+    //机构
+    evaluationAgencyName: '慕测科技',
+    evaluationAgencyAbilityList: ['接口测试', '安全漏洞扫描', '风险评估服务', '源代码安全审计服务', '功能测试服务', '性能测试', '功能和易用性测试'],
+    evaluationAgencyResourceList: [
+      {
+        id: 0,
+        type: '人力资源',
+        name: '专家',
+        totalNum: 100,
+        availableNum: 3,
+      },
+      {
+        id: 1,
+        type: '人力资源',
+        name: '程序员',
+        totalNum: 100,
+        availableNum: 3,
+      }
+    ],
+    agencyPhoto: 'http://www.mooctest.net/assets/img/mooctest.png',
+  }
+  return new Promise((resolve) => {
+    resolve(enterpriseData)
+  })
+}
+//放弃认证
+export const deleteAuthInfo = () => {
+  const data = {}
+  return new Promise((resolve) => {
+    resolve(data)
+  })
+  //return Http.get(Apis.GENERAL.GET_ALL_ABILITIES)
+}
+//
+export const updateIndividualAuthInfo = (userId, authInfo) => {
+  // const data = {}
+  // return new Promise((resolve) => {
+  //   resolve(data)
+  // })
+  return Http.put(Apis.USER.UPDATE_INDIVIDUAL_AUTHENTICATION_INFO.replace('{userId}', userId), authInfo)
+}
+export const updateAgencyAuthInfo = (userId, authInfo) => {
+  // const data = {}
+  // return new Promise((resolve) => {
+  //   resolve(data)
+  // })
+  return Http.put(Apis.USER.UPDATE_AGENCY_AUTHENTICATION_INFO.replace('{userId}', userId), authInfo)
+}
+export const updateEnterpriseAuthInfo = (userId, authInfo) => {
+  // const data = {}
+  // return new Promise((resolve) => {
+  //   resolve(data)
+  // })
+  return Http.put(Apis.USER.UPDATE_ENTERPRISE_AUTHENTICATION_INFO.replace('{userId}', userId), authInfo)
+}

+ 2 - 0
src/main.js

@@ -9,6 +9,7 @@ import {getAuthUrls, getCurrentUser, getRolesPermissions, storageGet, storageSav
 import {notify} from '@/constants/index'
 import {
   Avatar,
+  Badge,
   Button,
   ButtonGroup,
   Card,
@@ -162,6 +163,7 @@ Vue.use(Dropdown)
 Vue.use(DropdownItem)
 Vue.use(DropdownMenu)
 Vue.use(Image)
+Vue.use(Badge)
 
 Vue.prototype.$msgbox = MessageBox
 Vue.prototype.$alert = MessageBox.alert