ProjectAdd.vue 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574
  1. <template>
  2. <div class="create-container">
  3. <div class="create-body">
  4. <div class="title">创建项目</div>
  5. <el-tabs tabPosition="top" type="card">
  6. <el-tab-pane label="单个创建项目">
  7. <el-form :model="project" :rules="rules" ref="project" label-width="12%" class="demo-report">
  8. <el-form-item label="项目名称" prop="name">
  9. <el-input v-if="isModifyMode" v-model="project.name"></el-input>
  10. <!--<span v-if="!isModifyMode">{{project.name}}</span>-->
  11. </el-form-item>
  12. <el-form-item label="项目描述" prop="name">
  13. <el-input v-if="isModifyMode" v-model="project.description"></el-input>
  14. <!--<span v-if="!isModifyMode">{{project.description}}</span>-->
  15. </el-form-item>
  16. <el-form-item label="联系人姓名" prop="name">
  17. <el-input v-if="isModifyMode" v-model="project.contactName"></el-input>
  18. <!--<span v-if="!isModifyMode">{{project.contactName}}</span>-->
  19. </el-form-item>
  20. <el-form-item label="联系人电话" prop="name">
  21. <el-input v-if="isModifyMode" v-model="project.contactPhone"></el-input>
  22. <!--<span v-if="!isModifyMode">{{project.contactPhone}}</span>-->
  23. </el-form-item>
  24. <el-form-item label="项目定价" prop="name">
  25. <el-input v-if="isModifyMode" v-model="project.price"></el-input>
  26. <!--<span v-if="!isModifyMode">{{project.price}}</span>-->
  27. </el-form-item>
  28. <el-form-item label="平台" prop="platform">
  29. <el-checkbox-group v-if="isModifyMode" v-model="project.platform">
  30. <el-checkbox label="0">IOS</el-checkbox>
  31. <el-checkbox label="1">ANDROID</el-checkbox>
  32. <el-checkbox label="2">WEB</el-checkbox>
  33. </el-checkbox-group>
  34. <!--<span-->
  35. <!--v-if="!isModifyMode"-->
  36. <!--class="badge"-->
  37. <!--v-for="item in project.platform"-->
  38. <!--&gt;{{platformType[item]}}</span>-->
  39. </el-form-item>
  40. <el-form-item label="服务类型" prop="type">
  41. <el-checkbox-group v-if="isModifyMode" v-model="project.type">
  42. <span v-for="(item,index) in serviceType" :key="index">
  43. <el-checkbox :label="item" name="type">{{item}}&nbsp;&nbsp;&nbsp;&nbsp;</el-checkbox>
  44. </span>
  45. </el-checkbox-group>
  46. </el-form-item>
  47. <el-form-item prop="file" label="项目需求文档">
  48. <el-upload
  49. v-if="isModifyMode"
  50. drag
  51. class="upload-demo"
  52. action=""
  53. :on-remove="handleRemove"
  54. :before-remove="beforeRemove"
  55. multiple
  56. :limit="1"
  57. :on-exceed="handleExceed"
  58. :before-upload="beforeFileUpload"
  59. :http-request="uploadRequireDoc"
  60. :file-list="project.requireDoc"
  61. >
  62. <i class="el-icon-upload"></i>
  63. <div class="el-upload__text">
  64. 将文件拖到此处,或
  65. <em>点击上传</em>
  66. </div>
  67. <div class="el-upload__tip" slot="tip">请上传报告文件</div>
  68. </el-upload>
  69. <!--<div v-if="!isModifyMode">-->
  70. <!--<span v-if="project.file==null || project.file.length === 0">暂无文件</span>-->
  71. <!--<a :href="project.file[0]" v-if="project.file!=null && project.file.length > 0"><i-->
  72. <!--class="fa fa-file-text-o"></i>-->
  73. <!--{{project.file[0]}}</a>-->
  74. <!--</div>-->
  75. </el-form-item>
  76. <el-form-item prop="file" label="项目待测文件">
  77. <el-upload
  78. v-if="isModifyMode"
  79. drag
  80. class="upload-demo"
  81. action=""
  82. :on-remove="handleRemove"
  83. :before-remove="beforeRemove"
  84. multiple
  85. :limit="1"
  86. :on-exceed="handleExceed"
  87. :http-request="uploadApkFile"
  88. :before-upload="beforeFileUpload"
  89. :file-list="project.file"
  90. >
  91. <i class="el-icon-upload"></i>
  92. <div class="el-upload__text">
  93. 将文件拖到此处,或
  94. <em>点击上传</em>
  95. </div>
  96. <div class="el-upload__tip" slot="tip">请上传报告文件</div>
  97. </el-upload>
  98. <!--<div v-if="!isModifyMode">-->
  99. <!--<span v-if="project.file==null || project.file.length === 0">暂无文件</span>-->
  100. <!--<a :href="project.file[0]" v-if="project.file!=null && project.file.length > 0"><i-->
  101. <!--class="fa fa-file-text-o"></i>-->
  102. <!--{{project.file[0]}}</a>-->
  103. <!--</div>-->
  104. </el-form-item>
  105. <el-form-item label="项目截止时间" prop="datetime">
  106. <div class="block" v-if="isModifyMode">
  107. <el-date-picker
  108. v-model="project.datetime"
  109. type="datetime"
  110. placeholder="选择截止时间"
  111. align="right"
  112. :picker-options="pickerOptions"
  113. ></el-date-picker>
  114. </div>
  115. <span v-if="!isModifyMode">{{new Date(project.datetime)}}</span>
  116. </el-form-item>
  117. <!--<el-form-item v-if="!isModifyMode">-->
  118. <!--<div class="btn btn-medium btn-info" @click="modifyInfo()">修改</div>-->
  119. <!--<div class="btn btn-medium" @click="cancelModify()">返回</div>-->
  120. <!--</el-form-item>-->
  121. <el-form-item v-if="isModifyMode">
  122. <div class="btn btn-primary btn-info" @click="submitInfo()">确认提交</div>
  123. </el-form-item>
  124. </el-form>
  125. </el-tab-pane>
  126. <el-tab-pane label="批量创建项目">
  127. <el-form :model="project" :rules="rules" ref="project" label-width="12%" class="demo-report">
  128. <el-form-item prop="file" label="Excel模板文件">
  129. <div>
  130. <a :href="downloadFile"><i
  131. class="fa fa-file-text-o"></i>
  132. {{downloadFile}}</a>
  133. </div>
  134. </el-form-item>
  135. <el-form-item type="file" prop="file" label="Excel文件">
  136. <el-upload
  137. v-if="isModifyMode"
  138. drag
  139. class="upload-demo"
  140. action=""
  141. :on-remove="handleRemove"
  142. :before-remove="beforeRemove"
  143. :limit="1"
  144. :on-exceed="handleExceed"
  145. :before-upload="beforeFileUpload"
  146. :http-request="uploadProjectCreateExcelFile"
  147. :file-list="project.excelFile"
  148. >
  149. <i class="el-icon-upload"></i>
  150. <div class="el-upload__text">
  151. 将文件拖到此处,或
  152. <em>点击上传</em>
  153. </div>
  154. <div class="el-upload__tip" slot="tip">请上传报告文件</div>
  155. </el-upload>
  156. <!--<div v-if="!isModifyMode">-->
  157. <!--<span v-if="project.file==null">暂无文件</span>-->
  158. <!--<a :href="project.file" v-if="project.file!=null"><i class="fa fa-file-text-o"></i>-->
  159. <!--{{project.file}}</a>-->
  160. <!--</div>-->
  161. </el-form-item>
  162. <el-form-item v-if="isModifyMode">
  163. <div class="btn btn-primary btn-info" @click="ensureSubmitExcel()">确认提交</div>
  164. </el-form-item>
  165. </el-form>
  166. <el-dialog
  167. title="您添加的项目"
  168. :visible.sync="dialogVisible"
  169. width="80%"
  170. :before-close="handleDialogClose"
  171. center>
  172. <span>
  173. <el-table
  174. :data="projectList"
  175. style="width: auto">
  176. <el-table-column
  177. prop="projectDetails.name"
  178. label="项目名称">
  179. </el-table-column>
  180. <el-table-column
  181. prop="projectDetails.platform"
  182. label="项目测试平台">
  183. </el-table-column>
  184. <el-table-column
  185. prop="projectDetails.contactName"
  186. label="项目联系人">
  187. </el-table-column>
  188. <el-table-column
  189. prop="projectDetails.contactPhone"
  190. label="联系方式">
  191. </el-table-column>
  192. <el-table-column
  193. prop="projectDetails.type"
  194. label="项目测试类型">
  195. </el-table-column>
  196. <el-table-column
  197. prop="projectDetails.desc"
  198. label="项目需求描述">
  199. </el-table-column>
  200. <el-table-column
  201. prop="projectDetails.desc"
  202. label="测试报告内容">
  203. </el-table-column>
  204. <el-table-column
  205. prop="projectDetails.desc"
  206. label="测试报告结论">
  207. </el-table-column>
  208. </el-table>
  209. </span>
  210. <span slot="footer" class="dialog-footer">
  211. <el-button @click="handleDialogClose">取消</el-button>
  212. <el-button type="primary" @click="ensureSubmitExcel">确认</el-button>
  213. </span>
  214. </el-dialog>
  215. </el-tab-pane>
  216. </el-tabs>
  217. </div>
  218. </div>
  219. </template>
  220. <script>
  221. import Http from '@/js/http.js'
  222. import Apis from '@/js/api.js'
  223. import PlatformType from '@/constants/enum/platform-type.js'
  224. import {notify} from '@/constants/index'
  225. import {getAllServiceTypes} from '@/js/index'
  226. export default {
  227. name: 'ProjectAdd',
  228. data () {
  229. return {
  230. userId: 0,
  231. dialogVisible: false,
  232. isModifyMode: true,
  233. serviceType: [],
  234. platform: PlatformType,
  235. isFormSubmit: true,
  236. downloadFile: '123.xls',
  237. project: {
  238. name: '',
  239. description: '',
  240. contactName: '',
  241. contactPhone: '',
  242. platform: [],
  243. type: [],
  244. requireDoc: [],
  245. requireDocUrl: '',
  246. file: [],
  247. fileUrl: '',
  248. excelFile: [],
  249. excelFileUrl: '',
  250. price: '',
  251. datetime: ''
  252. },
  253. projectList: [
  254. {
  255. 'projectDetails': {
  256. 'id': 'PROJECT-2019081319025',
  257. 'name': '网易云测试',
  258. 'contactName': '孙加辉',
  259. 'contactPhone': '13628972489',
  260. 'type': [
  261. 1
  262. ],
  263. 'platform': [
  264. 1,
  265. 0
  266. ],
  267. 'desc': '无',
  268. 'doc': '',
  269. 'file': '',
  270. 'resource': 1,
  271. 'location': {
  272. 'provinceCode': '江苏',
  273. 'cityCode': '南京'
  274. },
  275. 'institution': 1,
  276. 'datetime': '2019-08-13T11:14:08.192+0000',
  277. 'price': 30000.0,
  278. 'budget': 30000.0,
  279. 'usage': null
  280. },
  281. 'taskList': [
  282. {
  283. 'id': 'TASK-LDSM-2019081319013',
  284. 'projectId': 'PROJECT-2019081319025',
  285. 'title': '网易云测试-安全漏洞扫描',
  286. 'description': null,
  287. 'quotePrice': 30000.0,
  288. 'fixedPrice': 30000.0,
  289. 'resource': 0,
  290. 'location': {
  291. 'provinceCode': '江苏',
  292. 'cityCode': '南京'
  293. },
  294. 'institution': 1,
  295. 'serviceType': 1,
  296. 'status': 5,
  297. 'datetime': '2019-08-13T11:14:08.192+0000'
  298. }
  299. ],
  300. 'reportList': null
  301. },
  302. {
  303. 'projectDetails': {
  304. 'id': 'PROJECT-2019081319026',
  305. 'name': '网易测试',
  306. 'contactName': '孙加辉',
  307. 'contactPhone': '0797-8877663',
  308. 'type': [
  309. 4,
  310. 3
  311. ],
  312. 'platform': [
  313. 2
  314. ],
  315. 'desc': '无',
  316. 'doc': '',
  317. 'file': '',
  318. 'resource': 1,
  319. 'location': {
  320. 'provinceCode': '江苏',
  321. 'cityCode': '南京'
  322. },
  323. 'institution': 1,
  324. 'datetime': '2019-08-13T11:14:08.194+0000',
  325. 'price': 30000.0,
  326. 'budget': 30000.0,
  327. 'usage': null
  328. },
  329. 'taskList': [
  330. {
  331. 'id': 'TASK-GNCS-2019081319006',
  332. 'projectId': 'PROJECT-2019081319026',
  333. 'title': '网易测试-功能测试',
  334. 'description': null,
  335. 'quotePrice': 30000.0,
  336. 'fixedPrice': 30000.0,
  337. 'resource': 0,
  338. 'location': {
  339. 'provinceCode': '江苏',
  340. 'cityCode': '南京'
  341. },
  342. 'institution': 1,
  343. 'serviceType': 4,
  344. 'status': 5,
  345. 'datetime': '2019-08-13T11:14:08.194+0000'
  346. }
  347. ],
  348. 'reportList': null
  349. }
  350. ],
  351. excelFile: {},
  352. rules: {
  353. // name: [
  354. // {required: true, message: '请输入报告名称', trigger: 'blur'}
  355. // // { min: 3, max: 5, message: "长度在 3 到 5 个字符", trigger: "blur" }
  356. // ],
  357. // abstract: [
  358. // {
  359. // required: true,
  360. // message: '请输入摘要信息',
  361. // trigger: 'change'
  362. // }
  363. // ],
  364. // type: [
  365. // {required: true, message: '请选择报告类型', trigger: 'change'}
  366. // ],
  367. // conclusion: [
  368. // {required: true, message: '请输入报告结论', trigger: 'blur'}
  369. // ]
  370. },
  371. pickerOptions: {
  372. shortcuts: [
  373. {
  374. text: '今天',
  375. onClick (picker) {
  376. picker.$emit('pick', new Date())
  377. }
  378. },
  379. {
  380. text: '昨天',
  381. onClick (picker) {
  382. const date = new Date()
  383. date.setTime(date.getTime() - 3600 * 1000 * 24)
  384. picker.$emit('pick', date)
  385. }
  386. },
  387. {
  388. text: '一周前',
  389. onClick (picker) {
  390. const date = new Date()
  391. date.setTime(date.getTime() - 3600 * 1000 * 24 * 7)
  392. picker.$emit('pick', date)
  393. }
  394. }
  395. ]
  396. },
  397. tableData: [{
  398. date: '2016-05-02',
  399. name: '王小虎',
  400. address: '上海市普陀区金沙江路 1518 弄'
  401. }, {
  402. date: '2016-05-04',
  403. name: '王小虎',
  404. address: '上海市普陀区金沙江路 1517 弄'
  405. }, {
  406. date: '2016-05-01',
  407. name: '王小虎',
  408. address: '上海市普陀区金沙江路 1519 弄'
  409. }, {
  410. date: '2016-05-03',
  411. name: '王小虎',
  412. address: '上海市普陀区金沙江路 1516 弄'
  413. }]
  414. }
  415. },
  416. mounted () {
  417. this.$nextTick(() => {
  418. this.init()
  419. })
  420. },
  421. methods: {
  422. init () {
  423. this.setServiceType()
  424. },
  425. //加载数据
  426. loadData: function () {
  427. },
  428. modifyInfo () {
  429. this.isModifyMode = true
  430. },
  431. submitInfo () {
  432. //this.isModifyMode = false
  433. const newProject = {
  434. userId: 3,
  435. name: this.project.name,
  436. description: this.project.description,
  437. contactName: this.project.contactName,
  438. contactPhone: this.project.contactPhone,
  439. platform: this.project.platform,
  440. type: this.project.type,
  441. doc: this.project.requireDocUrl,
  442. file: this.project.fileUrl,
  443. price: this.project.price,
  444. datetime: this.project.datetime
  445. }
  446. Http.post(Apis.PROJECT.ADD_PROJECT, newProject).then((res) => {
  447. notify('success', '项目添加成功')
  448. console.log(res)
  449. }).catch(error => {
  450. notify('error', error.data.msg)
  451. })
  452. },
  453. // cancelModify () {
  454. // this.isModifyMode = false
  455. // },
  456. handleRemove (file, fileList) {
  457. console.log(file, fileList)
  458. },
  459. handleExceed (files, fileList) {
  460. this.$message.warning(
  461. `当前限制选择 1 个文件,本次选择了 ${
  462. files.length
  463. } 个文件,共选择了 ${files.length + fileList.length} 个文件`
  464. )
  465. },
  466. beforeRemove (file, fileList) {
  467. return this.$confirm(`确定移除 ${file.name}?`)
  468. },
  469. beforeFileUpload () {
  470. },
  471. uploadProjectCreateExcelFile (param) {
  472. const formData = new FormData()
  473. let config = {
  474. //添加请求头
  475. headers: {'Content-Type': 'multipart/form-data'},
  476. }
  477. formData.append('file', param.file)
  478. Http.upload(Apis.PROJECT.ADD_PROJECT_BY_EXCEL, formData, config).then((res) => {
  479. console.log(res)
  480. this.projectList = res.data
  481. this.showDialog()
  482. //notify('success', '项目添加成功')
  483. }).catch(error => {
  484. notify('error', error)
  485. })
  486. },
  487. uploadRequireDoc (param) {
  488. const formData = new FormData()
  489. let config = {
  490. //添加请求头
  491. headers: {'Content-Type': 'multipart/form-data'},
  492. }
  493. formData.append('file', param.file)
  494. Http.upload(Apis.FILE.REQUIREMENT_FILE.replace('{userId}', 3), formData, config).then((res) => {
  495. console.log('上传成功')
  496. this.project.requireDocUrl = res.data
  497. console.log(res.data)
  498. notify('success', '上传成功')
  499. }).catch(error => {
  500. notify('error', error.data.msg)
  501. })
  502. },
  503. uploadApkFile (param) {
  504. const formData = new FormData()
  505. let config = {
  506. //添加请求头
  507. headers: {'Content-Type': 'multipart/form-data'},
  508. }
  509. formData.append('file', param.file)
  510. Http.upload(Apis.FILE.APK.replace('{userId}', 3), formData, config).then((res) => {
  511. console.log('上传成功')
  512. this.project.fileUrl = res.data
  513. console.log(res)
  514. notify('success', '上传成功')
  515. }).catch(error => {
  516. notify('error', error.data.msg)
  517. })
  518. },
  519. handleDialogClose (done) {
  520. this.$confirm('确认退出?退出前请记录下登录账号和密码,否则无法找回!!!')
  521. .then(_ => {
  522. //done()
  523. this.hideDialog()
  524. })
  525. .catch(_ => {
  526. })
  527. },
  528. ensureSubmitExcel () {
  529. notify('success', '添加成功')
  530. // Http.post('',this.projectList).then((res)=>{
  531. //
  532. // }).catch((error)=>{
  533. //
  534. // })
  535. },
  536. showDialog () {
  537. this.dialogVisible = true
  538. },
  539. hideDialog () {
  540. this.dialogVisible = false
  541. this.resetForm()
  542. },
  543. setServiceType () {
  544. this.serviceType = getAllServiceTypes()
  545. }
  546. },
  547. created: function () {
  548. }
  549. }
  550. </script>
  551. <style scoped>
  552. .el-radio {
  553. margin: 10px 20px 10px 0;
  554. }
  555. .el-form-item /deep/ .el-tabs__content {
  556. max-height: 120px !important;
  557. overflow: auto;
  558. }
  559. .el-row {
  560. margin-bottom: 10px;
  561. }
  562. .el-input {
  563. width: 400px;
  564. }
  565. </style>