useComment.ts 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407
  1. import { useMessage } from '/@/hooks/web/useMessage';
  2. import { defHttp } from '/@/utils/http/axios';
  3. import { useGlobSetting } from '/@/hooks/setting';
  4. const globSetting = useGlobSetting();
  5. const baseUploadUrl = globSetting.uploadUrl;
  6. import { ref, toRaw, unref, reactive } from 'vue';
  7. import { uploadMyFile } from '/@/api/common/api';
  8. import excel from '/@/assets/svg/fileType/excel.svg';
  9. import other from '/@/assets/svg/fileType/other.svg';
  10. import pdf from '/@/assets/svg/fileType/pdf.svg';
  11. import txt from '/@/assets/svg/fileType/txt.svg';
  12. import word from '/@/assets/svg/fileType/word.svg';
  13. import { getFileAccessHttpUrl } from '/@/utils/common/compUtils';
  14. import { createImgPreview } from '/@/components/Preview';
  15. enum Api {
  16. list = '/sys/comment/listByForm',
  17. addText = '/sys/comment/addText',
  18. deleteOne = '/sys/comment/deleteOne',
  19. fileList = '/sys/comment/fileList',
  20. logList = '/sys/dataLog/queryDataVerList',
  21. queryById = '/sys/comment/queryById',
  22. getFileViewDomain = '/sys/comment/getFileViewDomain',
  23. }
  24. // 文件预览地址的domain 在后台配置的
  25. let onlinePreviewDomain = '';
  26. /**
  27. * 获取文件预览的domain
  28. */
  29. const getViewFileDomain = () => defHttp.get({ url: Api.getFileViewDomain });
  30. /**
  31. * 列表接口
  32. * @param params
  33. */
  34. export const list = (params) => defHttp.get({ url: Api.list, params });
  35. /**
  36. * 查询单条记录
  37. * @param params
  38. */
  39. export const queryById = (id) => {
  40. let params = { id: id };
  41. return defHttp.get({ url: Api.queryById, params },{ isTransformResponse: false });
  42. };
  43. /**
  44. * 文件列表接口
  45. * @param params
  46. */
  47. export const fileList = (params) => defHttp.get({ url: Api.fileList, params });
  48. /**
  49. * 删除单个
  50. */
  51. export const deleteOne = (params) => {
  52. return defHttp.delete({ url: Api.deleteOne, params }, { joinParamsToUrl: true });
  53. };
  54. /**
  55. * 保存
  56. * @param params
  57. */
  58. export const saveOne = (params) => {
  59. let url = Api.addText;
  60. return defHttp.post({ url: url, params }, { isTransformResponse: false });
  61. };
  62. /**
  63. * 数据日志列表接口
  64. * @param params
  65. */
  66. export const getLogList = (params) => defHttp.get({ url: Api.logList, params }, {isTransformResponse: false});
  67. /**
  68. * 文件上传接口
  69. */
  70. export const uploadFileUrl = `${baseUploadUrl}/sys/comment/addFile`;
  71. export function useCommentWithFile(props) {
  72. let uploadData = {
  73. biz: 'comment',
  74. commentId: '',
  75. };
  76. const { createMessage } = useMessage();
  77. const buttonLoading = ref(false);
  78. //确定按钮触发
  79. async function saveCommentAndFiles(obj, fileList) {
  80. buttonLoading.value = true;
  81. setTimeout(() => {
  82. buttonLoading.value = false;
  83. }, 500);
  84. await saveComment(obj);
  85. await uploadFiles(fileList);
  86. }
  87. /**
  88. * 保存评论
  89. */
  90. async function saveComment(obj) {
  91. const {fromUserId, toUserId, commentId, commentContent} = obj;
  92. let commentData = {
  93. tableName: props.tableName,
  94. tableDataId: props.dataId,
  95. fromUserId,
  96. commentContent,
  97. toUserId: '',
  98. commentId: ''
  99. };
  100. if(toUserId){
  101. commentData.toUserId = toUserId;
  102. }
  103. if(commentId){
  104. commentData.commentId = commentId;
  105. }
  106. uploadData.commentId = '';
  107. const res = await saveOne(commentData);
  108. if (res.success) {
  109. uploadData.commentId = res.result;
  110. } else {
  111. createMessage.warning(res.message);
  112. return Promise.reject('保存评论失败');
  113. }
  114. }
  115. async function uploadOne(file) {
  116. let url = uploadFileUrl;
  117. const formData = new FormData();
  118. formData.append('file', file);
  119. formData.append('tableName', props.tableName);
  120. formData.append('tableDataId', props.dataId);
  121. Object.keys(uploadData).map((k) => {
  122. formData.append(k, uploadData[k]);
  123. });
  124. return new Promise((resolve, reject) => {
  125. uploadMyFile(url, formData).then((res: any) => {
  126. console.log('uploadMyFile', res);
  127. if (res && res.data) {
  128. if (res.data.result == 'success') {
  129. resolve(1);
  130. } else {
  131. createMessage.warning(res.data.message);
  132. reject();
  133. }
  134. } else {
  135. reject();
  136. }
  137. });
  138. });
  139. }
  140. async function uploadFiles(fileList) {
  141. if (fileList && fileList.length > 0) {
  142. for (let i = 0; i < fileList.length; i++) {
  143. let file = toRaw(fileList[i]);
  144. await uploadOne(file.originFileObj);
  145. }
  146. }
  147. }
  148. return {
  149. saveCommentAndFiles,
  150. buttonLoading,
  151. };
  152. }
  153. export function uploadMu(fileList) {
  154. const formData = new FormData();
  155. // let arr = []
  156. for(let file of fileList){
  157. formData.append('files[]', file.originFileObj);
  158. }
  159. console.log(formData)
  160. let url = `${baseUploadUrl}/sys/comment/addFile2`;
  161. uploadMyFile(url, formData).then((res: any) => {
  162. console.log('uploadMyFile', res);
  163. });
  164. }
  165. /**
  166. * 显示文件列表
  167. */
  168. export function useFileList() {
  169. const imageSrcMap = reactive({});
  170. const typeMap = {
  171. xls: excel,
  172. xlsx: excel,
  173. pdf: pdf,
  174. txt: txt,
  175. docx: word,
  176. doc: word,
  177. };
  178. function getBackground(item) {
  179. console.log('获取文件背景图', item);
  180. if (isImage(item)) {
  181. return 'none'
  182. } else {
  183. const name = item.name;
  184. if(!name){
  185. return 'none';
  186. }
  187. const suffix = name.substring(name.lastIndexOf('.') + 1);
  188. console.log('suffix', suffix)
  189. let bg = typeMap[suffix];
  190. if (!bg) {
  191. bg = other;
  192. }
  193. return bg;
  194. }
  195. }
  196. function getBase64(file, id){
  197. return new Promise((resolve, reject) => {
  198. //声明js的文件流
  199. let reader = new FileReader();
  200. if(file){
  201. //通过文件流将文件转换成Base64字符串
  202. reader.readAsDataURL(file);
  203. //转换成功后
  204. reader.onload = function () {
  205. let base = reader.result;
  206. console.log('base', base)
  207. imageSrcMap[id] = base;
  208. console.log('imageSrcMap', imageSrcMap)
  209. resolve(base)
  210. }
  211. }else{
  212. reject();
  213. }
  214. })
  215. }
  216. function handleImageSrc(file){
  217. if(isImage(file)){
  218. let id = file.uid;
  219. getBase64(file, id);
  220. }
  221. }
  222. function downLoad(file) {
  223. let url = getFileAccessHttpUrl(file.url);
  224. if (url) {
  225. window.open(url);
  226. }
  227. }
  228. function getFileSize(item) {
  229. let size = item.fileSize;
  230. if (!size) {
  231. return '0B';
  232. }
  233. let temp = Math.round(size / 1024);
  234. return temp + ' KB';
  235. }
  236. const selectFileList = ref<any[]>([]);
  237. function beforeUpload(file) {
  238. handleImageSrc(file);
  239. selectFileList.value = [...selectFileList.value, file];
  240. console.log('selectFileList', unref(selectFileList));
  241. return false
  242. }
  243. function handleRemove(file) {
  244. const index = selectFileList.value.indexOf(file);
  245. const newFileList = selectFileList.value.slice();
  246. newFileList.splice(index, 1);
  247. selectFileList.value = newFileList;
  248. }
  249. function isImage(item){
  250. const type = item.type||'';
  251. if (type.indexOf('image') >= 0) {
  252. return true;
  253. }
  254. return false;
  255. }
  256. function getImageSrc(file){
  257. if(isImage(file)){
  258. let id = file.uid;
  259. if(id){
  260. if(imageSrcMap[id]){
  261. return imageSrcMap[id];
  262. }
  263. }else if(file.url){
  264. //数据库中地址
  265. let url = getFileAccessHttpUrl(file.url);
  266. return url;
  267. }
  268. }
  269. return ''
  270. }
  271. /**
  272. * 显示图片
  273. * @param item
  274. */
  275. function getImageAsBackground(item){
  276. let url = getImageSrc(item);
  277. if(url){
  278. return {
  279. "backgroundImage": "url('"+url+"')"
  280. }
  281. }
  282. return {}
  283. }
  284. /**
  285. * 预览列表 cell 图片
  286. * @param text
  287. */
  288. async function viewImage(file) {
  289. if(isImage(file)){
  290. let text = getImageSrc(file)
  291. if (text) {
  292. let imgList = [text];
  293. createImgPreview({ imageList: imgList });
  294. }
  295. }else{
  296. if(file.url){
  297. //数据库中地址
  298. let url = getFileAccessHttpUrl(file.url);
  299. await initViewDomain();
  300. //本地测试需要将文件地址的localhost/127.0.0.1替换成IP, 或是直接修改全局domain
  301. //url = url.replace('localhost', '192.168.1.100')
  302. //如果集成的KkFileview-v3.3.0+ 需要对url再做一层base64编码 encodeURIComponent(encryptByBase64(url))
  303. window.open(onlinePreviewDomain+'?officePreviewType=pdf&url='+encodeURIComponent(url));
  304. }
  305. }
  306. }
  307. /**
  308. * 初始化domain
  309. */
  310. async function initViewDomain(){
  311. if(!onlinePreviewDomain){
  312. onlinePreviewDomain = await getViewFileDomain();
  313. }
  314. if(!onlinePreviewDomain.startsWith('http')){
  315. onlinePreviewDomain = 'http://'+ onlinePreviewDomain;
  316. }
  317. }
  318. return {
  319. selectFileList,
  320. getBackground,
  321. getFileSize,
  322. downLoad,
  323. beforeUpload,
  324. handleRemove,
  325. isImage,
  326. getImageSrc,
  327. getImageAsBackground,
  328. viewImage
  329. };
  330. }
  331. /**
  332. * 用于emoji渲染
  333. */
  334. export function useEmojiHtml(globalEmojiIndex){
  335. const COLONS_REGEX = new RegExp('([^:]+)?(:[a-zA-Z0-9-_+]+:(:skin-tone-[2-6]:)?)','g');
  336. function getHtml(text) {
  337. if(!text){
  338. return ''
  339. }
  340. return text.replace(COLONS_REGEX, function (match, p1, p2) {
  341. const before = p1 || ''
  342. if (endsWith(before, 'alt="') || endsWith(before, 'data-text="')) {
  343. return match
  344. }
  345. let emoji = globalEmojiIndex.findEmoji(p2)
  346. if (!emoji) {
  347. return match
  348. }
  349. return before + emoji2Html(emoji)
  350. })
  351. return text;
  352. }
  353. function endsWith(str, temp){
  354. return str.endsWith(temp)
  355. }
  356. function emoji2Html(emoji) {
  357. let style = `position: absolute;top: -3px;left: 3px;width: 18px; height: 18px;background-position: ${emoji.getPosition()}`
  358. return `<span style="width: 24px" class="emoji-mart-emoji"><span class="my-emoji-icon emoji-set-apple emoji-type-image" style="${style}"> </span> </span>`
  359. }
  360. return {
  361. globalEmojiIndex,
  362. getHtml
  363. }
  364. }
  365. /**
  366. * 获取modal窗体高度
  367. */
  368. export function getModalHeight(){
  369. return window.innerHeight;
  370. }