c_base.js 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338
  1. const {handle, handleAll} = require('../tools/handle_cjs');
  2. const d_base = require("../database/d_base");
  3. const d_product = require("../database/d_product");
  4. const d_news = require("../database/d_news");
  5. const codeMap = require("../map/rcodeMap");
  6. const dbField = require("../map/dbField");
  7. const {searchHandle} = require("../tools/searchSql");
  8. const {isEmpty, toNumber} = require("../tools/typeTool_cjs");
  9. const config_path = require("../configs/path");
  10. const {isArray} = require("ant-design-vue/lib/_util/vue-types/utils");
  11. const {mvFile, rmFile} = require("../tools/saveFiles_cjs");
  12. const {getUnixTimeStamp} = require("../tools/time_cjs");
  13. const {filePathToUrl} = require("../tools/filePathTool");
  14. const log = require("../logger").logger("c_base","info");
  15. // 获取启用的轮播列表
  16. async function getEnableCarousel(){
  17. let err,res;
  18. [err,res] = await handle(d_base.getCarousel({
  19. state: dbField.db_base.carouselState.enable
  20. }));
  21. // console.log(res);
  22. if(err){
  23. return [err,null];
  24. }
  25. // 路径转换
  26. res = res.map(item=>{
  27. item.filePath = filePathToUrl(item.fileType,item.filePath);
  28. return item;
  29. });
  30. return [null,res];
  31. }
  32. async function getAllCarousel(){
  33. let err,res;
  34. [err,res] = await handle(d_base.getCarousel());
  35. // console.log(res);
  36. if(err){
  37. return [err,null];
  38. }
  39. // 路径转换
  40. res = res.map(item=>{
  41. item.filePath = filePathToUrl(item.fileType,item.filePath);
  42. return item;
  43. });
  44. return [null,res];
  45. }
  46. async function addCarousel(sort,fileId,type,value){
  47. let err,res;
  48. let valueData = {};
  49. let valueShowText = '';
  50. let updateTime = getUnixTimeStamp();
  51. // 根据type判断value
  52. if(type !== dbField.db_base.carouselType.href){
  53. if(type === dbField.db_base.carouselType.production){
  54. [err,res] = await handle(d_product.getProductById(value));
  55. }else if(type === dbField.db_base.carouselType.news){
  56. // 获取新闻信息
  57. [err,res] = await handle(d_news.getNewsById(value));
  58. }
  59. if(err){
  60. console.log(err);
  61. log.info(`[新增轮播] 检索产品信息失败`);
  62. return [{eCode: codeMap.ServerError, eMsg: `检索数据异常`},null];
  63. }
  64. if(isEmpty(res)){
  65. log.info(`[新增轮播] 无法找到对应的产品或者文章信息`);
  66. return [{eCode: codeMap.NotFound, eMsg: `无法找到对应的产品或者文章信息`},null];
  67. }
  68. valueData = res[0];
  69. }
  70. valueShowText = valueData.title;
  71. [err,res] = await handle(d_base.addCarousel(
  72. sort,fileId,type,value,valueShowText,updateTime
  73. ));
  74. if(err){
  75. log.info(`[新增轮播] 导入数据异常`)
  76. return [err,null];
  77. }
  78. return [null,res];
  79. }
  80. async function deleteCarousel(id){
  81. let err,res;
  82. [err,res] = await handle(d_base.deleteCarousel(id));
  83. if(err){
  84. log.info(`[删除轮播] 删除数据异常`);
  85. return [err,null];
  86. }
  87. return [null,res];
  88. }
  89. async function updateCarousel(id,updateItems){
  90. let err,res;
  91. let rawData = {};
  92. let unixTime = getUnixTimeStamp();
  93. let updateData = {};
  94. let typeKeys = Object.keys(dbField.db_base.carouselType);
  95. let typeString = '';
  96. let typeShowText = '';
  97. let carouselType = dbField.db_base.carouselType.href;
  98. // 判断是否需要更新type
  99. if (updateItems.value){
  100. // 获取基础type值
  101. if(!isEmpty(updateItems.type)){
  102. typeString = updateItems.type;
  103. updateData.type = updateItems.type;
  104. }else{
  105. [err,res] = await handle(d_base.getCarouselById(id));
  106. if(err){
  107. log.error(`[修改轮播] 获取轮播基础数据时异常 ${err.message}`);
  108. return [{eCode: codeMap.ServerError, eMsg: `获取轮播基础数据异常`},null];
  109. }
  110. if(isEmpty(res)){
  111. log.info(`[修改轮播] 无法通过id找到轮播数据`);
  112. return [{eCode: codeMap.NotFound, eMsg: `请检测id是否正确`},null];
  113. }
  114. rawData = res[0];
  115. typeString = rawData.type;
  116. }
  117. console.log(toNumber(typeString))
  118. // 需要更新具体值
  119. if(toNumber(typeString) !== dbField.db_base.carouselType.href){
  120. if(toNumber(typeString) === dbField.db_base.carouselType.production){
  121. typeShowText = '产品';
  122. // 获取产品信息
  123. [err,res] = await handle(d_product.getProductById(updateItems.value));
  124. }else if(toNumber(typeString) === dbField.db_base.carouselType.news){
  125. typeShowText = '文章';
  126. // 获取新闻信息
  127. [err,res] = await handle(d_news.getNewsById(updateItems.value));
  128. }else {
  129. return [{eCode: codeMap.NotParam, eMsg: `轮播类型异常! carouseType:${typeString} typeof:${typeof typeString}`},null];
  130. }
  131. if(err){
  132. console.log(err);
  133. log.error(`[修改轮播] 检索${typeShowText}信息失败 ${err.message}}`);
  134. return [{eCode: codeMap.ServerError, eMsg: `检索${typeShowText}数据异常`},null];
  135. }
  136. if(isEmpty(res)){
  137. log.info(`[修改轮播] 无法找到对应的${typeShowText}数据`);
  138. return [{eCode: codeMap.NotFound, eMsg: `无法找到对应的产品或者文章信息`},null];
  139. }
  140. updateData.valueShowText = res[0].title;
  141. }
  142. updateData.value = updateItems.value;
  143. }
  144. if (!isEmpty(updateItems.sort)){
  145. updateData.sort = toNumber(updateItems.sort);
  146. }
  147. if (!isEmpty(updateItems.state)){
  148. updateData.state = updateItems.state;
  149. }
  150. if(updateItems.fileId){
  151. updateData.fileId = updateItems.fileId;
  152. // todo 检测文件id是否存在
  153. }
  154. console.log(updateData);
  155. [err,res] = await handle(d_base.updateCarousel(id,updateData,unixTime));
  156. if(err){
  157. console.log(err);
  158. log.error(`[修改轮播] 数据更新失败,${err.message}`);
  159. return [{eCode: codeMap.SaveError, eMsg: `数据更新失败,请稍后重试`},null];
  160. }
  161. return [null,res];
  162. }
  163. /**
  164. * 文件上传
  165. * @param type
  166. * @param files
  167. * @returns {Promise<[{eMsg: string, eCode: number},null]|*[][]|[{eMsg: string, eCode: *},null]|*[]>}
  168. */
  169. async function uploadFile(type, files){
  170. // 文件类型一般不会被改变,只移动文件至对应的存储目录,并将路径存储到数据库中.只存储文件名
  171. let err,res,newFileName;
  172. let uploadPath = config_path.files;
  173. let fileNameArr = [];// 文件存储路径数组
  174. // 文件转存,使用newFileName作为路径
  175. if(type === dbField.db_base.fileType.image){
  176. uploadPath = config_path.images;
  177. }else if(type === dbField.db_base.fileType.video){
  178. uploadPath = config_path.videos;
  179. }
  180. let keys = Object.keys(files);
  181. // 遍历转移文件
  182. for(let fileKey of keys){
  183. let file = files[fileKey];
  184. // 判断当前文件是否为数组
  185. if(!file.newFilename && file.length){
  186. for(let f of file){
  187. // console.log(f);
  188. // console.log(f.newFilename);
  189. log.info(`[文件上传] 开始移动文件 ${f.newFilename} to ${uploadPath}`);
  190. [err,newFileName] = await mvFile(f,uploadPath, f.newFilename);
  191. if(err){
  192. return [err,null];
  193. }
  194. // console.log('移动文件成功' + newFileName);
  195. fileNameArr.push(newFileName);
  196. }
  197. }else if(file.newFilename){
  198. [err,newFileName] = await mvFile(file,uploadPath,file.newFilename);
  199. if(err){
  200. return [err,null];
  201. }
  202. fileNameArr.push(newFileName);
  203. }else{
  204. // 文件调用异常
  205. log.error(`[文件上传] 文件调用异常,fileObj\n: ${JSON.stringify(file)}`);
  206. return [
  207. {
  208. eCode:codeMap.ServerError,
  209. eMsg:`文件调用异常`
  210. },null];
  211. }
  212. }
  213. // 存储至数据库
  214. // console.log(type);
  215. [err,res] = await handle(d_base.uploadFiles(type,fileNameArr,getUnixTimeStamp()));
  216. if(err){
  217. log.error(`[文件上传] 文件入库失败 ${err.message}`);
  218. return [{eCode: codeMap.SaveError,eMsg: `文件存储失败!!!`},null];
  219. }
  220. log.info(`[文件上传] 文件上传成功 ${res.affectedRows}`);
  221. return [null,fileNameArr];
  222. }
  223. /**
  224. * 搜索文件
  225. * @param type
  226. * @param key
  227. * @param l
  228. * @param p
  229. * @returns {Promise<err[]|{arr, total: number, limit, page}[]>}
  230. */
  231. async function searchFiles(type = 0, key, l, p){
  232. let err,res;
  233. let _params = {
  234. key: key,
  235. }
  236. // console.log(type);
  237. // type为 数据库值加一,因为数据库中存储值从0开始,而前端显示从1开始
  238. if((type - 1) !== dbField.db_base.fileType.all){
  239. _params.type = type;
  240. }
  241. // console.log(_params);
  242. [err,res] = await searchHandle('搜索文件失败', d_base.loadFiles, _params, null, l, p);
  243. if(err){
  244. log.info(`[文件资源] 加载失败 ${err.eDetail||err.message}`)
  245. return [err,null];
  246. }
  247. // console.log(res);
  248. res.arr = res.arr.map(item=>{
  249. console.log(item);
  250. item.filePath = filePathToUrl(item.fileType,item.filePath);
  251. return item;
  252. });
  253. return [null,res];
  254. }
  255. async function deleteFile(fileId){
  256. let err,res,rmRes;
  257. // 获取文件信息
  258. [err,res] = await handle(d_base.getFileById(fileId));
  259. if(err){
  260. log.info(`[文件资源] 获取文件信息失败 ${err.message}`);
  261. return [{eCode:codeMap.ServerError,eMsg:`删除文件失败,无法查找文件`},null];
  262. }
  263. if(!res.length){
  264. log.info(`[文件资源] 获取文件信息失败,无法找到文件`);
  265. return [{eCode:codeMap.NotFound,eMsg:`删除文件失败,无法查找文件`},null];
  266. }
  267. let fileData = res[0];
  268. let filePath = filePathToUrl(fileData.fileType,fileData.filePath);
  269. [err,res,rmRes] = await handleAll(d_base.deleteFile(fileId),rmFile(filePath));
  270. if(err){
  271. console.log(err);
  272. log.info(`[文件资源] 删除文件${fileId}失败 ${err.message}`);
  273. return [{eCode:codeMap.SaveError,eMsg:`删除文件失败`},null];
  274. }
  275. return [null,true];
  276. }
  277. async function getBaseData(){
  278. // 同时获取所有需要获取的基础数据
  279. let err,pType,nType,carousel;
  280. // todo 同时获取所有需要获取的基础数据
  281. [err,pType,nType,carousel] = await handleAll(
  282. d_product.loadTypes(),
  283. d_news.loadTypes(),
  284. d_base.getCarousel({state: dbField.db_base.carouselState.enable}),
  285. );
  286. if (err) {
  287. log.error(`[基础数据] 获取基础数据类型分类失败 ${err.message}`);
  288. return [{eCode: codeMap.ServerError, eMsg: `获取基础数据失败`}, null];
  289. }
  290. // 合并数据
  291. let baseData = {
  292. pType,
  293. nType,
  294. carousel,
  295. };
  296. // 轮播数据转换
  297. carousel = carousel.map(item=>{
  298. item.filePath = filePathToUrl(item.fileType,item.filePath);
  299. return item;
  300. });
  301. log.info(`[基础数据] 类型分类获取成功
  302. 程序类型数量:${pType.length}
  303. 文章类型数量:${nType.length}
  304. 轮播数据数量:${carousel.length}
  305. `);
  306. return [null,baseData];
  307. }
  308. module.exports = {
  309. getEnableCarousel,
  310. getAllCarousel,
  311. addCarousel,
  312. deleteCarousel,
  313. updateCarousel,
  314. uploadFile,
  315. searchFiles,
  316. deleteFile,
  317. getBaseData,
  318. }