projectDetail.vue 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751
  1. <template>
  2. <section>
  3. <!--工具条-->
  4. <el-col :span="24" class="toolbar" style="padding-bottom: 0px;">
  5. <el-form :inline="true">
  6. <el-form-item>
  7. <el-button type="text" @click="backToList" icon="el-icon-back" class="back">返回</el-button>
  8. </el-form-item>
  9. <el-form-item class="divLine">
  10. </el-form-item>
  11. <el-form-item>
  12. <span class="projectTitle">{{proDetail.projectName}}</span>
  13. </el-form-item>
  14. </el-form>
  15. </el-col>
  16. <el-col :span="24" :style="allDetail">
  17. <el-col :span="24" class="title">项目基本信息
  18. <i class="el-icon-edit editDetail" v-if="user.id == proDetail.managerId || user.id == proDetail.creatorId" @click="edit"></i>
  19. </el-col>
  20. <el-col :span="24" class="main">
  21. <el-col :span="6" class="detail">
  22. 项目编号:
  23. <span class="info">{{proDetail.projectNo}}</span>
  24. </el-col>
  25. <el-col :span="6" class="detail">
  26. 项目经理:
  27. <span class="info">{{proDetail.manager}}</span>
  28. </el-col>
  29. <el-col :span="6" class="detail">
  30. 资产方审批人:
  31. <span class="info">{{proDetail.ownerApprover}}</span>
  32. </el-col>
  33. <el-col :span="6" class="detail">
  34. 生产方审批人:
  35. <span class="info">{{proDetail.customerApprover}}</span>
  36. </el-col>
  37. <el-col :span="24" class="detail">
  38. 生产方公司:
  39. <span class="info" v-for="(item, index) in proDetail.customCompanies">
  40. {{item.companyName}}
  41. <span v-if="index != proDetail.customCompanies.length-1">、</span>
  42. </span>
  43. </el-col>
  44. <el-col :span="24" class="detail">
  45. 项目模具:
  46. <span class="info model" v-for="(item, index) in proDetail.models">
  47. <span @click="toMold(item.id)">{{item.modelName}}({{item.modelNo}})</span>
  48. <span v-if="index != proDetail.models.length-1">、</span>
  49. </span>
  50. </el-col>
  51. <el-col :span="24" class="detail">
  52. 资产方人员:
  53. <span class="info" v-for="(item, index) in proDetail.ownerUsers">
  54. {{item.username}}
  55. <span v-if="index != proDetail.ownerUsers.length-1">、</span>
  56. </span>
  57. </el-col>
  58. <el-col :span="24" class="detail">
  59. 生产方人员:
  60. <span class="info" v-for="(item, index) in proDetail.customUsers">
  61. {{item.username}}
  62. <span v-if="index != proDetail.customUsers.length-1">、</span>
  63. </span>
  64. </el-col>
  65. </el-col>
  66. <el-col :span="24" class="title">项目文档
  67. <!-- update == 1 -->
  68. <el-upload v-if="user.id == proDetail.managerId" class="upload-demo" action="customize" :http-request="uploadFile" :show-file-list="false" multiple :limit="5" style="float:right;">
  69. <el-button size="small" type="primary" :loading="upLoading">点击上传</el-button>
  70. </el-upload>
  71. </el-col>
  72. <el-col :span="24">
  73. <el-table :data="files" highlight-current-row v-loading="listLoading" height="400" style="width: 100%;">
  74. <el-table-column type="index" width="40"></el-table-column>
  75. <el-table-column prop="fileName" label="名称" sortable></el-table-column>
  76. <el-table-column prop="fileSize" label="大小" width="150" align="center" sortable></el-table-column>
  77. <el-table-column prop="uploader" label="上传者" width="120" align="center" sortable></el-table-column>
  78. <el-table-column prop="indate" label="上传时间" width="200" align="center" sortable></el-table-column>
  79. <el-table-column label="操作" width="220" align="center" sortable>
  80. <template slot-scope="scope" v-if="download == 1">
  81. <el-button size="small" @click="dowloadFile(scope.row.id)">
  82. <a :href="scope.row.url" :download="scope.row.fileName">下载</a>
  83. </el-button>
  84. <el-button size="small" type="danger" @click="fileDel(scope.row.id)" v-if="scope.row.uploaderId == user.id">删除</el-button>
  85. </template>
  86. <template slot-scope="scope" v-else>
  87. -
  88. </template>
  89. </el-table-column>
  90. </el-table>
  91. </el-col>
  92. <el-col :span="24" class="title">操作记录</el-col>
  93. <el-table :data="opers" highlight-current-row v-loading="oplistLoading" height="400" style="width: 100%;">
  94. <el-table-column type="index" width="40"></el-table-column>
  95. <el-table-column prop="content" label="操作" width="120" sortable></el-table-column>
  96. <el-table-column prop="fileName" label="操作文档名称" sortable></el-table-column>
  97. <el-table-column prop="operator" label="操作人" width="120" align="center" sortable></el-table-column>
  98. <el-table-column prop="indate" label="操作时间" width="200" align="center" sortable></el-table-column>
  99. </el-table>
  100. </el-col>
  101. <!--编辑界面-->
  102. <el-dialog title="编辑项目" v-if="editFormVisible" :visible.sync="editFormVisible" :close-on-click-modal="false" customClass='customWidth'>
  103. <el-form :model="editForm" label-width="120px" :rules="formRules" ref="editForm">
  104. <el-col :span="24">
  105. <el-form-item label="项目名称" prop="projectName">
  106. <el-input v-model="editForm.projectName" autocomplete="off" placeholder="请输入项目名称" style="width:510px"></el-input>
  107. </el-form-item>
  108. </el-col>
  109. <el-col :span="24">
  110. <el-form-item label="生产方公司" prop="customerCompany">
  111. <el-select v-model="editForm.customerCompany" clearable filterable multiple placeholder="请选择生产方公司" @change="companyChange" value-key='id' style="width:510px">
  112. <el-option v-for="item in company" :key="item.companyName" :label="item.companyName" :value="item">
  113. </el-option>
  114. </el-select>
  115. </el-form-item>
  116. </el-col>
  117. <el-col :span="24">
  118. <el-form-item label="项目经理" prop="managerId">
  119. <el-select v-model="editForm.managerId" clearable filterable placeholder="请选择项目经理" value-key='id' style="width:510px">
  120. <el-option v-for="item in charger" :key="item.id" :label="item.username" :value="item">
  121. </el-option>
  122. </el-select>
  123. </el-form-item>
  124. </el-col>
  125. <el-col :span="12">
  126. <el-form-item label="资产方审批人" prop="ownerApproverId">
  127. <el-select v-model="editForm.ownerApproverId" clearable filterable placeholder="请选择资产方审批人" value-key='id' style="width:190px">
  128. <el-option v-for="item in assets" :key="item.id" :label="item.username" :value="item.id">
  129. </el-option>
  130. </el-select>
  131. </el-form-item>
  132. </el-col>
  133. <el-col :span="12">
  134. <el-form-item label="生产方审批人" prop="customerApproverId">
  135. <el-select v-model="editForm.customerApproverId" clearable filterable placeholder="请选择生产方审批人" value-key='id' style="width:190px">
  136. <el-option v-for="item in produce" :key="item.id" :label="item.username" :value="item.id">
  137. </el-option>
  138. </el-select>
  139. </el-form-item>
  140. </el-col>
  141. <el-col :span="24">
  142. <el-form-item label="项目模具">
  143. <el-select v-model="editForm.modelIds" clearable filterable multiple placeholder="请选择项目模具" style="width:510px">
  144. <el-option v-for="item in molds" :key="item.id" :label="item.modelName" :value="item.id">
  145. </el-option>
  146. </el-select>
  147. </el-form-item>
  148. </el-col>
  149. <el-col :span="24">
  150. <el-form-item label="资产方参与人">
  151. <el-select v-model="editForm.assets" clearable filterable multiple placeholder="请选择资产方参与人" style="width:510px">
  152. <el-option v-for="item in assets" :key="item.id" :label="item.username" :value="item.id">
  153. </el-option>
  154. </el-select>
  155. </el-form-item>
  156. </el-col>
  157. <el-col :span="24">
  158. <el-form-item label="生产方参与人">
  159. <el-select v-model="editForm.produce" clearable filterable multiple placeholder="请选择生产方参与人" style="width:510px">
  160. <el-option v-for="item in produce" :key="item.id" :label="item.username" :value="item.id">
  161. </el-option>
  162. </el-select>
  163. </el-form-item>
  164. </el-col>
  165. </el-form>
  166. <div slot="footer" class="dialog-footer">
  167. <el-button @click.native="editFormVisible = false">取消</el-button>
  168. <el-button type="primary" @click.native="addSubmit" :loading="editLoading">提交</el-button>
  169. </div>
  170. </el-dialog>
  171. </section>
  172. </template>
  173. <script>
  174. import util from "../../common/js/util";
  175. export default {
  176. data() {
  177. return {
  178. detailId: this.$route.params.id,
  179. user: JSON.parse(sessionStorage.getItem('user')),
  180. //临时数据
  181. proDetail: {},
  182. files: [],
  183. opers: [],
  184. allDetail: {
  185. overflow: 'auto',
  186. padding: '0px 5px',
  187. height: 0
  188. },
  189. listLoading: false,
  190. upLoading: false,
  191. oplistLoading: false,
  192. activePage: 0,
  193. update: 0,
  194. download: 0,
  195. view: 0,
  196. approve: 0,
  197. company:[],
  198. assets: [],
  199. produce: [],
  200. charger: [],
  201. formRules: {
  202. projectName: [
  203. { required: true, message: '请输入项目名称', trigger: 'blur' }
  204. ],
  205. customerCompany: [
  206. { required: true, message: '请选择客户公司', trigger: 'blur' }
  207. ],
  208. managerId: [
  209. { required: true, message: '请选择项目经理', trigger: ['blur','change'] }
  210. ],
  211. ownerApproverId: [
  212. { required: true, message: '请选择资产方审批人', trigger: ['blur','change'] }
  213. ],
  214. customerApproverId: [
  215. { required: true, message: '请选择生产方审批人', trigger: ['blur','change'] }
  216. ]
  217. },
  218. editFormVisible: false,//新增界面是否显示
  219. editLoading: false,
  220. //新增界面数据
  221. editForm: {
  222. projectName: '',
  223. customerCompany: [],
  224. managerId: '',
  225. ownerApproverId: '',
  226. customerApproverId: '',
  227. modelIds: [],
  228. assets: [],
  229. produce: []
  230. }
  231. };
  232. },
  233. methods: {
  234. //返回
  235. backToList() {
  236. this.$router.go(-1);
  237. // this.$router.push("/project");
  238. },
  239. toMold(id) {
  240. this.$router.push('/moldList/' + id);
  241. },
  242. handleClick(tab, event) {
  243. },
  244. //获取详情
  245. getDetail() {
  246. this.http.post(this.port.project.projectDetail, {
  247. id: this.detailId
  248. }, res => {
  249. if (res.code == "ok") {
  250. this.update = res.data.update;
  251. this.download = res.data.download;
  252. this.view = res.data.view;
  253. this.approve = res.data.approve;
  254. var list = res.data.vo;
  255. var approves = res.data.vo.approves;
  256. for(var i in approves){
  257. if(approves[i].subordinateType == 0){
  258. list.ownerApprover = approves[i].approverName;
  259. } else {
  260. list.customerApprover = approves[i].approverName;
  261. }
  262. }
  263. this.proDetail = list;
  264. if(this.user.parentId != 0){
  265. this.getMsg();
  266. }
  267. } else {
  268. this.$message({
  269. message: res.msg,
  270. type: 'error'
  271. });
  272. }
  273. }, error => {
  274. this.$message({
  275. message: error,
  276. type: 'error'
  277. });
  278. })
  279. },
  280. getFileList() {
  281. this.listLoading = true;
  282. // 获取文档列表
  283. this.http.post(this.port.project.fileList, {
  284. projectId: this.detailId
  285. }, res => {
  286. this.listLoading = false;
  287. if (res.code == "ok") {
  288. this.files = res.data;
  289. } else {
  290. this.$message({
  291. message: res.msg,
  292. type: 'error'
  293. });
  294. }
  295. }, error => {
  296. this.listLoading = false;
  297. this.$message({
  298. message: error,
  299. type: 'error'
  300. });
  301. })
  302. },
  303. getOperList() {
  304. this.oplistLoading = true;
  305. // 获取文档列表
  306. this.http.post(this.port.project.operList, {
  307. projectId: this.detailId
  308. }, res => {
  309. this.oplistLoading = false;
  310. if (res.code == "ok") {
  311. this.opers = res.data;
  312. } else {
  313. this.$message({
  314. message: res.msg,
  315. type: 'error'
  316. });
  317. }
  318. }, error => {
  319. this.oplistLoading = false;
  320. this.$message({
  321. message: error,
  322. type: 'error'
  323. });
  324. })
  325. },
  326. //获取信息
  327. getMsg() {
  328. // 获取人员
  329. var compIds = this.user.companyId;
  330. for(var i in this.proDetail.customCompanies){
  331. compIds += "," + this.proDetail.customCompanies[i].companyId;
  332. }
  333. this.http.post(this.port.project.getUserById, {
  334. companyIds: compIds,
  335. id: this.user.id
  336. } , res => {
  337. if (res.code == "ok") {
  338. var list = res.data , assets = [] , produce = [];
  339. for(var i in list) {
  340. if(list[i].companyId == this.user.companyId){
  341. console.log(list[i])
  342. if(list[i].id != this.user.id){
  343. if(list[i].id != this.proDetail.managerId){
  344. assets.push(list[i])
  345. }
  346. }
  347. } else {
  348. produce.push(list[i])
  349. }
  350. }
  351. this.charger = res.data;
  352. this.assets = assets;
  353. this.produce = produce;
  354. } else {
  355. this.$message({
  356. message: res.msg,
  357. type: 'error'
  358. });
  359. }
  360. }, error => {
  361. this.$message({
  362. message: error,
  363. type: 'error'
  364. });
  365. })
  366. // 获取公司
  367. this.http.post(this.port.base.addCompanyListToProject, {
  368. parentId: this.user.parentId,
  369. id: this.user.id
  370. }, res => {
  371. if (res.code == "ok") {
  372. var list = res.data , array = [];
  373. for(var i in list){
  374. if(list[i].id != this.user.companyId){
  375. array.push(list[i])
  376. }
  377. }
  378. this.company = array;
  379. } else {
  380. this.$message({
  381. message: res.msg,
  382. type: 'error'
  383. });
  384. }
  385. }, error => {
  386. this.$message({
  387. message: error,
  388. type: 'error'
  389. });
  390. })
  391. // 获取模具
  392. this.http.post(this.port.mold.modelList, {
  393. parentId: this.user.parentId,
  394. id: this.user.id
  395. }, res => {
  396. if (res.code == "ok") {
  397. this.molds = res.data;
  398. } else {
  399. this.$message({
  400. message: res.msg,
  401. type: 'error'
  402. });
  403. }
  404. }, error => {
  405. this.$message({
  406. message: error,
  407. type: 'error'
  408. });
  409. })
  410. },
  411. //选择公司切换人员
  412. companyChange() {
  413. var param = {} ,
  414. str = this.user.companyId;
  415. for(var i in this.editForm.customerCompany){
  416. str += "," + this.editForm.customerCompany[i].id;
  417. }
  418. param.companyIds = str;
  419. param.id = this.user.id
  420. this.http.post(this.port.project.getUserById, param , res => {
  421. if (res.code == "ok") {
  422. var list = res.data , assets = [] , produce = [];
  423. for(var i in list) {
  424. if(list[i].companyId == this.user.companyId){
  425. assets.push(list[i])
  426. } else {
  427. produce.push(list[i])
  428. }
  429. }
  430. this.charger = res.data;
  431. this.assets = assets;
  432. this.produce = produce;
  433. } else {
  434. this.$message({
  435. message: res.msg,
  436. type: 'error'
  437. });
  438. }
  439. }, error => {
  440. this.$message({
  441. message: error,
  442. type: 'error'
  443. });
  444. })
  445. },
  446. //打开编辑页面
  447. edit() {
  448. this.editFormVisible = true;
  449. var compArr = [] ,
  450. manager = {} ,
  451. ownerApproverId = '' ,
  452. customerApproverId = '' ,
  453. moldArr = [] ,
  454. assets = [] ,
  455. produce = [];
  456. for(var i in this.proDetail.customCompanies){
  457. for(var j in this.company){
  458. if(this.company[j].id == this.proDetail.customCompanies[i].companyId){
  459. compArr.push(this.company[j])
  460. }
  461. }
  462. }
  463. for(var i in this.charger){
  464. if(this.charger[i].id == this.proDetail.managerId){
  465. manager = this.charger[i];
  466. }
  467. }
  468. for(var i in this.proDetail.approves) {
  469. if(this.proDetail.approves[i].subordinateType == 0){
  470. ownerApproverId = this.proDetail.approves[i].approverId;
  471. } else {
  472. customerApproverId = this.proDetail.approves[i].approverId;
  473. }
  474. }
  475. for(var i in this.molds){
  476. for(var j in this.proDetail.models){
  477. if(this.molds[i].id == this.proDetail.models[j].id){
  478. moldArr.push(this.molds[i].id)
  479. }
  480. }
  481. }
  482. for(var i in this.proDetail.ownerUsers){
  483. assets.push(this.proDetail.ownerUsers[i].id)
  484. }
  485. for(var i in this.proDetail.customUsers){
  486. produce.push(this.proDetail.customUsers[i].id)
  487. }
  488. this.editForm = {
  489. id: this.proDetail.id,
  490. projectName: this.proDetail.projectName,
  491. customerCompany: compArr,
  492. managerId: manager,
  493. ownerApproverId: ownerApproverId,
  494. customerApproverId: customerApproverId,
  495. modelIds: moldArr,
  496. assets: assets,
  497. produce: produce
  498. }
  499. },
  500. //提交
  501. addSubmit() {
  502. this.$refs.editForm.validate((valid) => {
  503. if (valid) {
  504. var cId = "",
  505. cName = "",
  506. modelIds = "",
  507. userIds = "";
  508. for(var i in this.editForm.customerCompany){
  509. cId += this.editForm.customerCompany[i].id + ",";
  510. cName += this.editForm.customerCompany[i].companyName + ",";
  511. }
  512. cId = cId.substring(0,cId.length-1);
  513. cName = cName.substring(0,cName.length-1);
  514. for(var i in this.editForm.modelIds){
  515. modelIds += this.editForm.modelIds[i] + ","
  516. }
  517. modelIds = modelIds.substring(0,modelIds.length-1);
  518. for(var i in this.editForm.assets){
  519. if(i == this.editForm.assets.length -1){
  520. userIds += this.editForm.assets[i]
  521. } else {
  522. userIds += this.editForm.assets[i] + ","
  523. }
  524. }
  525. if(userIds != "" && this.editForm.produce.length != 0){
  526. userIds += ","
  527. }
  528. for(var i in this.editForm.produce){
  529. if(i == this.editForm.produce.length -1){
  530. userIds += this.editForm.produce[i]
  531. } else {
  532. userIds += this.editForm.produce[i] + ","
  533. }
  534. }
  535. this.editLoading = true;
  536. this.http.post(this.port.project.addProject, {
  537. id: this.editForm.id,
  538. projectName: this.editForm.projectName,
  539. customerCompanyIds: cId,
  540. customerCompanyNames: cName,
  541. manager: this.editForm.managerId.username,
  542. managerId: this.editForm.managerId.id,
  543. ownerApproverId: this.editForm.ownerApproverId,
  544. customerApproverId: this.editForm.customerApproverId,
  545. modelIds: modelIds,
  546. userIds: userIds,
  547. flag: 1
  548. } , res => {
  549. this.editLoading = false;
  550. this.editFormVisible = false;
  551. if (res.code == "ok") {
  552. this.$message({
  553. message: '修改成功',
  554. type: 'success'
  555. });
  556. this.getDetail();
  557. } else {
  558. this.$message({
  559. message: res.msg,
  560. type: 'error'
  561. });
  562. }
  563. }, error => {
  564. this.editLoading = false;
  565. this.editFormVisible = false;
  566. this.$message({
  567. message: error,
  568. type: 'error'
  569. });
  570. })
  571. }
  572. });
  573. },
  574. //上传
  575. uploadFile(params) {
  576. this.upLoading = true;
  577. var fileObj = params.file;
  578. var form = new FormData();
  579. form.append("projectId", this.proDetail.id);
  580. form.append("file", fileObj);
  581. this.http.uploadFile(this.port.project.uploadFile, form , res => {
  582. this.upLoading = false;
  583. if (res.code == "ok") {
  584. this.$message({
  585. message: '上传成功',
  586. type: 'success'
  587. });
  588. this.getFileList();
  589. this.getOperList();
  590. } else {
  591. this.$message({
  592. message: res.msg,
  593. type: 'error'
  594. });
  595. }
  596. }, error => {
  597. this.upLoading = false;
  598. this.$message({
  599. message: error,
  600. type: 'error'
  601. });
  602. })
  603. },
  604. //下载
  605. dowloadFile(id) {
  606. this.http.post(this.port.project.dowloadFile, {
  607. id: id
  608. }, res => {
  609. this.getOperList();
  610. }, error => {
  611. })
  612. },
  613. //删除上传文件
  614. fileDel(id) {
  615. this.$confirm('确认删除该文档吗?', '提示', {
  616. type: 'warning'
  617. }).then(() => {
  618. this.http.post(this.port.project.delFile, {
  619. id: id
  620. }, res => {
  621. if (res.code == "ok") {
  622. this.$message({
  623. message: '删除成功',
  624. type: 'success'
  625. });
  626. this.getFileList();
  627. this.getOperList();
  628. } else {
  629. this.$message({
  630. message: res.msg,
  631. type: 'error'
  632. });
  633. }
  634. }, error => {
  635. this.$message({
  636. message: error,
  637. type: 'error'
  638. });
  639. })
  640. });
  641. },
  642. },
  643. created() {
  644. let height = window.innerHeight;
  645. this.allDetail.height = height - 170 + "px";
  646. const that = this;
  647. window.onresize = function temp() {
  648. that.allDetail.height = window.innerHeight - 170;
  649. };
  650. },
  651. mounted() {
  652. this.getDetail();
  653. this.getFileList();
  654. this.getOperList();
  655. }
  656. };
  657. </script>
  658. <style scoped>
  659. a {
  660. text-decoration:none;
  661. color: #333;
  662. }
  663. .allDetail {
  664. overflow-y: auto;
  665. }
  666. .toolbar .el-form-item {
  667. font-size: 14px;
  668. vertical-align: middle;
  669. }
  670. .back {
  671. font-size:16px;
  672. }
  673. .divLine {
  674. width: 2px;
  675. background: #c3c3c3;
  676. height: 100%;
  677. }
  678. .projectTitle {
  679. font-size: 18px;
  680. color: #333;
  681. }
  682. .title {
  683. padding-left: 10px;
  684. padding-bottom: 0px;
  685. margin: 20px 0;
  686. font-size: 16px;
  687. line-height: 24px;
  688. border-left: 1px #20a0ff solid;
  689. position: relative;
  690. }
  691. .upload-demo {
  692. position: absolute;
  693. right: 0;
  694. top: -5px;
  695. }
  696. .editDetail {
  697. margin-left: 10px;
  698. color:#20a0ff;
  699. cursor: pointer;
  700. }
  701. .info {
  702. color: grey;
  703. }
  704. .model {
  705. cursor: pointer;
  706. color:#20a0ff;
  707. }
  708. .main {
  709. padding-left: 10px;
  710. }
  711. .detail {
  712. margin-bottom: 20px;
  713. }
  714. </style>