c_base.js 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337
  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. // 判断是否需要更新type
  98. if (updateItems.value){
  99. // 获取基础type值
  100. if(!isEmpty(updateItems.type)){
  101. typeString = updateItems.type;
  102. updateData.type = updateItems.type;
  103. }else{
  104. [err,res] = await handle(d_base.getCarouselById(id));
  105. if(err){
  106. log.error(`[修改轮播] 获取轮播基础数据时异常 ${err.message}`);
  107. return [{eCode: codeMap.ServerError, eMsg: `获取轮播基础数据异常`},null];
  108. }
  109. if(isEmpty(res)){
  110. log.info(`[修改轮播] 无法通过id找到轮播数据`);
  111. return [{eCode: codeMap.NotFound, eMsg: `请检测id是否正确`},null];
  112. }
  113. rawData = res[0];
  114. typeString = rawData.type;
  115. }
  116. // 需要更新具体值
  117. if(typeString !== dbField.db_base.carouselType.href){
  118. if(updateItems.type === dbField.db_base.carouselType.production){
  119. typeShowText = '产品';
  120. // 获取产品信息
  121. [err,res] = await handle(d_product.getProductById(updateItems.value));
  122. }else if(typeString === dbField.db_base.carouselType.news){
  123. typeShowText = '文章';
  124. // 获取新闻信息
  125. [err,res] = await handle(d_news.getNewsById(updateItems.value));
  126. }else {
  127. return [{eCode: codeMap.NotParam, eMsg: `轮播类型异常!`},null];
  128. }
  129. if(err){
  130. console.log(err);
  131. log.error(`[修改轮播] 检索${typeShowText}信息失败 ${err.message}}`);
  132. return [{eCode: codeMap.ServerError, eMsg: `检索${typeShowText}数据异常`},null];
  133. }
  134. if(isEmpty(res)){
  135. log.info(`[修改轮播] 无法找到对应的${typeShowText}数据`);
  136. return [{eCode: codeMap.NotFound, eMsg: `无法找到对应的产品或者文章信息`},null];
  137. }
  138. updateData.valueShowText = res[0].title;
  139. }
  140. updateData.value = updateItems.value;
  141. }
  142. if (!isEmpty(updateItems.sort)){
  143. updateData.sort = toNumber(updateItems.sort);
  144. }
  145. if (!isEmpty(updateItems.state)){
  146. updateData.state = updateItems.state;
  147. }
  148. if(updateItems.fileId){
  149. updateData.fileId = updateItems.fileId;
  150. // todo 检测文件id是否存在
  151. }
  152. console.log(updateData);
  153. [err,res] = await handle(d_base.updateCarousel(id,updateData,unixTime));
  154. if(err){
  155. console.log(err);
  156. log.error(`[修改轮播] 数据更新失败,${err.message}`);
  157. return [{eCode: codeMap.SaveError, eMsg: `数据更新失败,请稍后重试`},null];
  158. }
  159. return [null,res];
  160. }
  161. /**
  162. * 文件上传
  163. * @param type
  164. * @param files
  165. * @returns {Promise<[{eMsg: string, eCode: number},null]|*[][]|[{eMsg: string, eCode: *},null]|*[]>}
  166. */
  167. async function uploadFile(type, files){
  168. // 文件类型一般不会被改变,只移动文件至对应的存储目录,并将路径存储到数据库中.只存储文件名
  169. let err,res,newFileName;
  170. let uploadPath = config_path.files;
  171. let fileNameArr = [];// 文件存储路径数组
  172. // 文件转存,使用newFileName作为路径
  173. if(type === dbField.db_base.fileType.image){
  174. uploadPath = config_path.images;
  175. }else if(type === dbField.db_base.fileType.video){
  176. uploadPath = config_path.videos;
  177. }
  178. let keys = Object.keys(files);
  179. // 遍历转移文件
  180. for(let fileKey of keys){
  181. let file = files[fileKey];
  182. // 判断当前文件是否为数组
  183. if(!file.newFilename && file.length){
  184. for(let f of file){
  185. // console.log(f);
  186. // console.log(f.newFilename);
  187. log.info(`[文件上传] 开始移动文件 ${f.newFilename} to ${uploadPath}`);
  188. [err,newFileName] = await mvFile(f,uploadPath, f.newFilename);
  189. if(err){
  190. return [err,null];
  191. }
  192. // console.log('移动文件成功' + newFileName);
  193. fileNameArr.push(newFileName);
  194. }
  195. }else if(file.newFilename){
  196. [err,newFileName] = await mvFile(file,uploadPath,file.newFilename);
  197. if(err){
  198. return [err,null];
  199. }
  200. fileNameArr.push(newFileName);
  201. }else{
  202. // 文件调用异常
  203. log.error(`[文件上传] 文件调用异常,fileObj\n: ${JSON.stringify(file)}`);
  204. return [
  205. {
  206. eCode:codeMap.ServerError,
  207. eMsg:`文件调用异常`
  208. },null];
  209. }
  210. }
  211. // 存储至数据库
  212. // console.log(type);
  213. [err,res] = await handle(d_base.uploadFiles(type,fileNameArr,getUnixTimeStamp()));
  214. if(err){
  215. log.error(`[文件上传] 文件入库失败 ${err.message}`);
  216. return [{eCode: codeMap.SaveError,eMsg: `文件存储失败!!!`},null];
  217. }
  218. log.info(`[文件上传] 文件上传成功 ${res.affectedRows}`);
  219. return [null,fileNameArr];
  220. }
  221. /**
  222. * 搜索文件
  223. * @param type
  224. * @param key
  225. * @param l
  226. * @param p
  227. * @returns {Promise<err[]|{arr, total: number, limit, page}[]>}
  228. */
  229. async function searchFiles(type = 0, key, l, p){
  230. let err,res;
  231. let _params = {
  232. key: key,
  233. }
  234. // console.log(type);
  235. // type为 数据库值加一,因为数据库中存储值从0开始,而前端显示从1开始
  236. if((type - 1) !== dbField.db_base.fileType.all){
  237. _params.type = type;
  238. }
  239. // console.log(_params);
  240. [err,res] = await searchHandle('搜索文件失败', d_base.loadFiles, _params, l, p);
  241. if(err){
  242. log.info(`[文件资源] 加载失败 ${err.eDetail||err.message}`)
  243. return [err,null];
  244. }
  245. // console.log(res);
  246. res.arr = res.arr.map(item=>{
  247. console.log(item);
  248. item.filePath = filePathToUrl(item.fileType,item.filePath);
  249. return item;
  250. });
  251. return [null,res];
  252. }
  253. async function deleteFile(fileId){
  254. let err,res,rmRes;
  255. // 获取文件信息
  256. [err,res] = await handle(d_base.getFileById(fileId));
  257. if(err){
  258. log.info(`[文件资源] 获取文件信息失败 ${err.message}`);
  259. return [{eCode:codeMap.ServerError,eMsg:`删除文件失败,无法查找文件`},null];
  260. }
  261. if(!res.length){
  262. log.info(`[文件资源] 获取文件信息失败,无法找到文件`);
  263. return [{eCode:codeMap.NotFound,eMsg:`删除文件失败,无法查找文件`},null];
  264. }
  265. let fileData = res[0];
  266. let filePath = filePathToUrl(fileData.fileType,fileData.filePath);
  267. [err,res,rmRes] = await handleAll(d_base.deleteFile(fileId),rmFile(filePath));
  268. if(err){
  269. console.log(err);
  270. log.info(`[文件资源] 删除文件${fileId}失败 ${err.message}`);
  271. return [{eCode:codeMap.SaveError,eMsg:`删除文件失败`},null];
  272. }
  273. return [null,true];
  274. }
  275. async function getBaseData(){
  276. // 同时获取所有需要获取的基础数据
  277. let err,pType,nType,carousel;
  278. // todo 同时获取所有需要获取的基础数据
  279. [err,pType,nType,carousel] = await handleAll(
  280. d_product.loadTypes(),
  281. d_news.loadTypes(),
  282. d_base.getCarousel({state: dbField.db_base.carouselState.enable}),
  283. );
  284. if (err) {
  285. log.error(`[基础数据] 获取基础数据类型分类失败 ${err.message}`);
  286. return [{eCode: codeMap.ServerError, eMsg: `获取基础数据失败`}, null];
  287. }
  288. // 合并数据
  289. let baseData = {
  290. pType,
  291. nType,
  292. carousel,
  293. };
  294. // 轮播数据转换
  295. carousel = carousel.map(item=>{
  296. item.filePath = filePathToUrl(item.fileType,item.filePath);
  297. return item;
  298. });
  299. log.info(`[基础数据] 类型分类获取成功
  300. 程序类型数量:${pType.length}
  301. 文章类型数量:${nType.length}
  302. 轮播数据数量:${carousel.length}
  303. `);
  304. return [null,baseData];
  305. }
  306. module.exports = {
  307. getEnableCarousel,
  308. getAllCarousel,
  309. addCarousel,
  310. deleteCarousel,
  311. updateCarousel,
  312. uploadFile,
  313. searchFiles,
  314. deleteFile,
  315. getBaseData,
  316. }