TraceCommentCreate.vue 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499
  1. <template>
  2. <div>
  3. <div>
  4. <Navbar title="创建评论" :is-go-back="true" />
  5. <div>
  6. <div class="form-group">
  7. <label for="exampleInputEmail2">评论内容</label>
  8. <div id="summernote" />
  9. <!-- <textarea style="width: 100%;"
  10. id="hcqk"
  11. class="form-control"
  12. rows="5"
  13. v-model="content"></textarea> -->
  14. </div>
  15. <div>
  16. <input
  17. ref="fileInput"
  18. autocomplete="off"
  19. type="file"
  20. class="form-control file-input"
  21. @change="onFileChanges"
  22. />
  23. <label for="attachment">
  24. <a
  25. role="button"
  26. class="btn btn-primary btn-sm"
  27. @click="clickButton"
  28. >
  29. <i class="fa fa-upload" />
  30. &nbsp; 上传附件
  31. </a>
  32. </label>
  33. </div>
  34. <div style="margin-top: 10px">
  35. <ul class="list-group">
  36. <li v-for="item in files" :key="item" class="list-group-item">
  37. <span class="badge" @click="download(item)">下载</span>
  38. <span class="badge" @click="removeFile(item)">删除</span>
  39. {{ item }}
  40. </li>
  41. </ul>
  42. </div>
  43. <div>
  44. <div style="margin-top: 10px">
  45. <button type="text" class="btn btn-default" @click="photograph">
  46. 确认
  47. </button>
  48. <button type="text" class="btn btn-default" @click="back">
  49. 取消
  50. </button>
  51. </div>
  52. </div>
  53. </div>
  54. </div>
  55. <Loading v-if="loading" />
  56. </div>
  57. </template>
  58. <script>
  59. import UpladFile from '../widget/UpladFile.js';
  60. import Common from '../common/Common.js';
  61. import { Notify } from 'pc-component-v3';
  62. import { DownloadService } from 'pc-component-v3';
  63. import { message } from 'ant-design-vue';
  64. export default {
  65. components: {
  66. UpladFile,
  67. },
  68. data: function () {
  69. return {
  70. traceId: null,
  71. content: '',
  72. images: [],
  73. className: 'com.leanwo.prodog.trace.model.TraceComment',
  74. files: [],
  75. traceConfigDto: {},
  76. summernoteInitSuccess: false, // summernote初始化成功
  77. loading: false,
  78. };
  79. },
  80. mounted: function () {
  81. var _self = this;
  82. $('.input-tan').focus(function () {
  83. document.activeElement.blur();
  84. });
  85. this.initData();
  86. this.getTraceConfig();
  87. $('#summernote').summernote({
  88. toolbar: [
  89. [
  90. 'insert',
  91. [
  92. 'link',
  93. 'picture',
  94. 'video',
  95. 'audio',
  96. 'hr',
  97. 'table', //插件
  98. 'fontname',
  99. 'fontsize',
  100. 'color',
  101. 'bold',
  102. 'italic',
  103. 'underline',
  104. 'strikethrough',
  105. 'clear', //字体样式
  106. 'style',
  107. 'ol',
  108. 'ul',
  109. 'paragraph',
  110. 'height', //段落样式
  111. 'fullscreen',
  112. 'codeview',
  113. 'undo',
  114. 'redo',
  115. 'help', //Misc
  116. ],
  117. ],
  118. ],
  119. height: 400,
  120. minHeight: 300,
  121. maxHeight: 500,
  122. focus: true,
  123. lang: 'zh-CN',
  124. callbacks: {
  125. onImageUpload: function (files, editor, $editable) {
  126. _self.sendFile(files[0], editor, $editable);
  127. },
  128. },
  129. });
  130. _self.summernoteInitSuccess = true;
  131. },
  132. beforeUnmount: function () {
  133. if (this.summernoteInitSuccess == true) {
  134. $('#summernote').summernote('destroy');
  135. }
  136. },
  137. methods: {
  138. /**
  139. * 点击上传按钮事件
  140. * @return {[type]} [description]
  141. */
  142. clickButton: function () {
  143. $(this.$refs.fileInput).click();
  144. },
  145. /**
  146. * 初始化数据
  147. * @author GuoZhiBo 20171201
  148. */
  149. initData: function () {
  150. var _self = this;
  151. this.traceId = Number(this.$route.params.traceId);
  152. },
  153. /**
  154. * 监听文件改变事件
  155. * @author GuoZhiBo 20171201
  156. */
  157. onFileChange(e) {
  158. var _self = this;
  159. var files = e.target.files || e.dataTransfer.files;
  160. if (!files.length) return;
  161. _self.uploadImage(files[0]);
  162. },
  163. /**
  164. * 上传图片
  165. * @author GuoZhiBo 20171201
  166. */
  167. uploadImage: function (selectedFile) {
  168. var _self = this;
  169. if (selectedFile == undefined) {
  170. return;
  171. }
  172. if (!/image\/\w+/.test(selectedFile.type)) {
  173. Notify.error('提示', '请确保文件为图像类型!');
  174. return;
  175. }
  176. UpladFile.photoCompress(
  177. selectedFile,
  178. {
  179. quality: 0.2,
  180. },
  181. function (base64Codes) {
  182. var bl = UpladFile.convertBase64UrlToBlob(base64Codes);
  183. var rst = new FormData();
  184. rst.append('images', bl, 'file_' + Date.parse(new Date()) + '.jpg');
  185. rst.append('className', 'com.leanwo.prodog.trace.model.TraceComment');
  186. _self.loading=true;
  187. $.ajax({
  188. url: Common.getApiURL('file/imageUpload'),
  189. type: 'post',
  190. beforeSend: function (request) {
  191. Common.addTokenToRequest(request);
  192. },
  193. data: rst,
  194. contentType: false,
  195. processData: false,
  196. success: function (data) {
  197. _self.loading=false;
  198. if (data.errorCode == 0) {
  199. if (data.datas) {
  200. var imageName = data.datas[0];
  201. _self.addImg(imageName);
  202. }
  203. } else {
  204. message.error(data.errorMessage);
  205. }
  206. },
  207. error: function (XMLHttpRequest, textStatus, errorThrown) {
  208. _self.loading=false;
  209. Common.processException(XMLHttpRequest, textStatus, errorThrown);
  210. },
  211. });
  212. return rst.file;
  213. },
  214. );
  215. },
  216. /**
  217. * 添加图片
  218. * @author GuoZhiBo 20171201
  219. */
  220. addImg: function (imageName) {
  221. var _self = this;
  222. _self.images.push(imageName);
  223. },
  224. /**
  225. * 获取图片地址
  226. * @param {String} item 图片名称
  227. * @return {String} 图片URL地址
  228. */
  229. getImageSrc: function (item) {
  230. var _self = this;
  231. if (item != undefined && item != null) {
  232. return Common.getResourceUrl(
  233. 'image',
  234. 'com.leanwo.prodog.trace.model.TraceComment',
  235. item,
  236. );
  237. } else {
  238. return '';
  239. }
  240. },
  241. /**
  242. * 获取图片路径供外部调用
  243. * @return {Array} 图片地址
  244. */
  245. getImages: function () {
  246. return this.images;
  247. },
  248. /**
  249. * 删除图片
  250. *@author GuoZhiBo 20171201
  251. */
  252. deleteImg(index) {
  253. var _self = this;
  254. _self.images.splice(index, 1);
  255. },
  256. //----------文件------------
  257. /**
  258. * 删除文件
  259. * @param {String} item 文件Name
  260. */
  261. removeFile: function (index) {
  262. var _self = this;
  263. _self.files.splice(index, 1);
  264. },
  265. /**
  266. * 选择文件发生改变
  267. * @param {[type]} e [description]
  268. * @return {[type]} [description]
  269. */
  270. onFileChanges: function (e) {
  271. var files = e.target.files || e.dataTransfer.files;
  272. if (!files.length) return;
  273. this.uploadFile(files[0]);
  274. },
  275. /**
  276. * 上传文件
  277. * @param {File} selectedFile 选择的文件
  278. */
  279. uploadFile: function (selectedFile) {
  280. var _self = this;
  281. if (selectedFile == undefined) {
  282. return;
  283. }
  284. var size = undefined;
  285. if (
  286. _self.traceConfigDto.commentAttachmentSize != undefined &&
  287. _self.traceConfigDto.commentAttachmentSize != null
  288. ) {
  289. size = _self.traceConfigDto.commentAttachmentSize;
  290. }
  291. //当系统没有配置附件大小时默认8m
  292. if (size == undefined) {
  293. size = 8;
  294. }
  295. if (selectedFile.size != undefined && selectedFile.size != null) {
  296. if (selectedFile.size / 1024 <= 1024 * size) {
  297. var formData = new FormData();
  298. formData.append('files', selectedFile);
  299. formData.append('className', _self.className);
  300. _self.loading=true;
  301. $.ajax({
  302. url: Common.getApiURL('file/classFileUpload'),
  303. type: 'post',
  304. beforeSend: function (request) {
  305. Common.addTokenToRequest(request);
  306. },
  307. data: formData,
  308. contentType: false,
  309. processData: false,
  310. success: function (data) {
  311. _self.loading=false;
  312. if (data.errorCode == 0) {
  313. if (data.datas) {
  314. var fileName = data.datas[0];
  315. _self.files.push(fileName);
  316. }
  317. } else {
  318. message.error(data.errorMessage);
  319. }
  320. },
  321. error: function (XMLHttpRequest, textStatus, errorThrown) {
  322. _self.loading=false;
  323. Common.processException(XMLHttpRequest, textStatus, errorThrown);
  324. },
  325. });
  326. } else {
  327. Notify.error(
  328. '提示',
  329. '文件大小不能超过' + size + 'M,可在任务配置功能中配置!',
  330. );
  331. }
  332. } else {
  333. Notify.error('提示', '上传的文件为空!');
  334. }
  335. },
  336. /**
  337. * 获取任务管理配置
  338. */
  339. getTraceConfig: function () {
  340. var _self = this;
  341. $.ajax({
  342. url: Common.getApiURL('TraceConfigResource/queryTraceConfigDto'),
  343. type: 'get',
  344. dataType: 'json',
  345. beforeSend: function (request) {
  346. Common.addTokenToRequest(request);
  347. },
  348. success: function (data) {
  349. _self.traceConfigDto = data;
  350. },
  351. error: function (XMLHttpRequest, textStatus, errorThrown) {
  352. Common.processException(XMLHttpRequest, textStatus, errorThrown);
  353. },
  354. });
  355. },
  356. /**
  357. * 获取文件地址
  358. * @param {String} item 图片名称
  359. * @return {String} 图片URL地址
  360. */
  361. getFileSrc: function (item) {
  362. var _self = this;
  363. if (item != undefined && item != null) {
  364. return Common.getResourceUrl('file', _self.className, item);
  365. } else {
  366. return '';
  367. }
  368. },
  369. /**
  370. * 下载文件
  371. * @param {String} fileName 文件名
  372. * @return {void}
  373. */
  374. download: function (fileName) {
  375. var _self = this;
  376. DownloadService.fileDownload(_self.className, fileName);
  377. },
  378. //内容图片上传
  379. sendFile: function (file, editor, $editable) {
  380. var _self = this;
  381. UpladFile.photoCompress(
  382. file,
  383. {
  384. quality: 1,
  385. },
  386. function (base64Codes) {
  387. var bl = UpladFile.convertBase64UrlToBlob(base64Codes);
  388. var rst = new FormData();
  389. rst.append('images', bl, 'file_' + Date.parse(new Date()) + '.jpg');
  390. rst.append('className', _self.className);
  391. $.ajax({
  392. url: Common.getApiURL('file/imageUpload'),
  393. type: 'post',
  394. data: rst,
  395. contentType: false,
  396. processData: false,
  397. beforeSend: function (request) {
  398. Common.addTokenToRequest(request);
  399. },
  400. success: function (data) {
  401. if (data.errorCode == 0) {
  402. if (data.datas) {
  403. var imageName = data.datas[0];
  404. $('#summernote').summernote(
  405. 'insertImage',
  406. Common.getResourceUrl('image', _self.className, imageName),
  407. 'image name',
  408. );
  409. }
  410. } else {
  411. message.error(data.errorMessage);
  412. }
  413. },
  414. error: function () {
  415. Notify.error('提示', '上传失败!');
  416. return;
  417. },
  418. });
  419. return rst.file;
  420. },
  421. );
  422. },
  423. /**
  424. * 保存评论表数据
  425. * @author GuoZhiBo 20171201
  426. */
  427. photograph: function () {
  428. var _self = this;
  429. _self.content = $('#summernote').summernote('code');
  430. if (_self.content != '' && _self.content != null) {
  431. var traceComment = {
  432. traceId: _self.traceId,
  433. content: _self.content,
  434. attachments: _self.files.join(','),
  435. };
  436. _self.loading=true;
  437. $.ajax({
  438. url: Common.getApiURL('TraceCommentResource/saveTraceComment'),
  439. type: 'post',
  440. contentType: 'application/json',
  441. beforeSend: function (request) {
  442. Common.addTokenToRequest(request);
  443. },
  444. data: JSON.stringify(traceComment),
  445. success: function (data) {
  446. _self.loading=false;
  447. _self.back();
  448. },
  449. error: function (XMLHttpRequest, textStatus, errorThrown) {
  450. _self.loading=false;
  451. Common.processException(XMLHttpRequest, textStatus, errorThrown);
  452. },
  453. });
  454. } else {
  455. Notify.error('提示', '请填写评论内容!');
  456. }
  457. },
  458. back: function () {
  459. history.back();
  460. },
  461. },
  462. };
  463. </script>
  464. <style scoped>
  465. .mui-divs3 {
  466. margin-top: 10px;
  467. }
  468. .file-input {
  469. width: 0.1px;
  470. height: 0.1px;
  471. opacity: 0;
  472. overflow: hidden;
  473. position: absolute;
  474. z-index: -1;
  475. }
  476. .badge {
  477. cursor: pointer;
  478. background-color: #428bca;
  479. color: white;
  480. }
  481. </style>