c_base.js 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402
  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.json");
  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. else {
  143. updateData.valueShowText = updateItems.value;
  144. }
  145. updateData.value = updateItems.value;
  146. }
  147. if (!isEmpty(updateItems.sort)){
  148. updateData.sort = toNumber(updateItems.sort);
  149. }
  150. if (!isEmpty(updateItems.state)){
  151. updateData.state = updateItems.state;
  152. }
  153. if(updateItems.fileId){
  154. updateData.fileId = updateItems.fileId;
  155. // todo 检测文件id是否存在
  156. }
  157. console.log(updateData);
  158. [err,res] = await handle(d_base.updateCarousel(id,updateData,unixTime));
  159. if(err){
  160. console.log(err);
  161. log.error(`[修改轮播] 数据更新失败,${err.message}`);
  162. return [{eCode: codeMap.SaveError, eMsg: `数据更新失败,请稍后重试`},null];
  163. }
  164. return [null,res];
  165. }
  166. /**
  167. * 文件上传
  168. * @param type
  169. * @param files
  170. * @returns {Promise<[{eMsg: string, eCode: number},null]|*[][]|[{eMsg: string, eCode: *},null]|*[]>}
  171. */
  172. async function uploadFile(type, files){
  173. // 文件类型一般不会被改变,只移动文件至对应的存储目录,并将路径存储到数据库中.只存储文件名
  174. let err,res,newFileName;
  175. let uploadPath = config_path.files;
  176. let fileNameArr = [];// 文件存储路径数组
  177. // 文件转存,使用newFileName作为路径
  178. if(type === dbField.db_base.fileType.image){
  179. uploadPath = config_path.images;
  180. }else if(type === dbField.db_base.fileType.video){
  181. uploadPath = config_path.videos;
  182. }
  183. let keys = Object.keys(files);
  184. // 遍历转移文件
  185. for(let fileKey of keys){
  186. let file = files[fileKey];
  187. // 判断当前文件是否为数组
  188. if(!file.newFilename && file.length){
  189. for(let f of file){
  190. // console.log(f);
  191. // console.log(f.newFilename);
  192. log.info(`[文件上传] 开始移动文件 ${f.newFilename} to ${uploadPath}`);
  193. [err,newFileName] = await mvFile(f,uploadPath, f.newFilename);
  194. if(err){
  195. return [err,null];
  196. }
  197. // console.log('移动文件成功' + newFileName);
  198. fileNameArr.push(newFileName);
  199. }
  200. }else if(file.newFilename){
  201. [err,newFileName] = await mvFile(file,uploadPath,file.newFilename);
  202. if(err){
  203. return [err,null];
  204. }
  205. fileNameArr.push(newFileName);
  206. }else{
  207. // 文件调用异常
  208. log.error(`[文件上传] 文件调用异常,fileObj\n: ${JSON.stringify(file)}`);
  209. return [
  210. {
  211. eCode:codeMap.ServerError,
  212. eMsg:`文件调用异常`
  213. },null];
  214. }
  215. }
  216. // 存储至数据库
  217. // console.log(type);
  218. [err,res] = await handle(d_base.uploadFiles(type,fileNameArr,getUnixTimeStamp()));
  219. if(err){
  220. log.error(`[文件上传] 文件入库失败 ${err.message}`);
  221. return [{eCode: codeMap.SaveError,eMsg: `文件存储失败!!!`},null];
  222. }
  223. log.info(`[文件上传] 文件上传成功 ${res.affectedRows}`);
  224. return [null,fileNameArr];
  225. }
  226. /**
  227. * 搜索文件
  228. * @param type
  229. * @param key
  230. * @param l
  231. * @param p
  232. * @returns {Promise<err[]|{arr, total: number, limit, page}[]>}
  233. */
  234. async function searchFiles(type = 0, key, l, p){
  235. let err,res;
  236. let _params = {
  237. key: key,
  238. }
  239. // console.log(type);
  240. // type为 数据库值加一,因为数据库中存储值从0开始,而前端显示从1开始
  241. if((type - 1) !== dbField.db_base.fileType.all){
  242. _params.type = type;
  243. }
  244. // console.log(_params);
  245. [err,res] = await searchHandle('搜索文件失败', d_base.loadFiles, _params, null, l, p);
  246. if(err){
  247. log.info(`[文件资源] 加载失败 ${err.eDetail||err.message}`)
  248. return [err,null];
  249. }
  250. // console.log(res);
  251. res.arr = res.arr.map(item=>{
  252. console.log(item);
  253. item.filePath = filePathToUrl(item.fileType,item.filePath);
  254. return item;
  255. });
  256. return [null,res];
  257. }
  258. async function deleteFile(fileId){
  259. let err,res,rmRes;
  260. // 获取文件信息
  261. [err,res] = await handle(d_base.getFileById(fileId));
  262. if(err){
  263. log.info(`[文件资源] 获取文件信息失败 ${err.message}`);
  264. return [{eCode:codeMap.ServerError,eMsg:`删除文件失败,无法查找文件`},null];
  265. }
  266. if(!res.length){
  267. log.info(`[文件资源] 获取文件信息失败,无法找到文件`);
  268. return [{eCode:codeMap.NotFound,eMsg:`删除文件失败,无法查找文件`},null];
  269. }
  270. let fileData = res[0];
  271. let filePath = filePathToUrl(fileData.fileType,fileData.filePath);
  272. [err,res,rmRes] = await handleAll(d_base.deleteFile(fileId),rmFile(filePath));
  273. if(err){
  274. console.log(err);
  275. log.info(`[文件资源] 删除文件${fileId}失败 ${err.message}`);
  276. return [{eCode:codeMap.SaveError,eMsg:`删除文件失败`},null];
  277. }
  278. return [null,true];
  279. }
  280. async function getBaseData(){
  281. // 同时获取所有需要获取的基础数据
  282. let err,pType,nType,carousel,baseInfo,products,articles;
  283. // todo 同时获取所有需要获取的基础数据
  284. [err, products, articles, baseInfo, pType, nType, carousel] = await handleAll(
  285. d_product.searchProducts('array', {}, '', 1, 4),
  286. d_news.searchAllNewsMini('array', {}, '', 1, 5),
  287. d_base.getBaseInfo(),
  288. d_product.loadTypes(),
  289. d_news.loadTypes(),
  290. d_base.getCarousel({state: dbField.db_base.carouselState.enable}),
  291. );
  292. if (err) {
  293. log.error(`[基础数据] 获取基础数据类型分类失败 ${err.message}`);
  294. return [{eCode: codeMap.ServerError, eMsg: `获取基础数据失败`}, null];
  295. }
  296. baseInfo = baseInfo? baseInfo[0]: {};
  297. baseInfo.products = products;
  298. baseInfo.news = articles;
  299. // 合并数据
  300. let baseData = {
  301. baseInfo,
  302. pType,
  303. nType,
  304. carousel,
  305. };
  306. // 轮播数据转换
  307. carousel = carousel.map(item=>{
  308. item.filePath = filePathToUrl(item.fileType,item.filePath);
  309. return item;
  310. });
  311. // todo 缓存接口数据
  312. log.info(`[基础数据] 类型分类获取成功
  313. 展示程序数据数量:${products.length}
  314. 展示文章数据数量:${articles.length}
  315. 程序类型数量:${pType.length}
  316. 文章类型数量:${nType.length}
  317. 轮播数据数量:${carousel.length}
  318. `);
  319. return [null,baseData];
  320. }
  321. async function getBaseInfo(){
  322. let err,res;
  323. [err,res] = await handle(d_base.getBaseInfo());
  324. if(err){
  325. log.error(`[基础数据] 获取基础数据失败 ${err.message}`);
  326. return [{eCode: codeMap.ServerError, eMsg: `获取基础数据失败`}, null];
  327. }
  328. if(!res.length){
  329. log.error(`[基础数据] 获取基础数据失败,数据库中无基础数据`);
  330. return []
  331. }
  332. res = res[0];
  333. return [null,res];
  334. }
  335. async function editBaseInfo(data){
  336. let err,res;
  337. let baseId = data.id;
  338. [err,res] = await handle(d_base.getBaseInfo(baseId));
  339. if(err){
  340. log.error(`[基础数据] 获取基础数据失败 ${err.message}`);
  341. return [{eCode: codeMap.ServerError, eMsg: `获取基础数据失败`}, null];
  342. }
  343. if(!res.length){
  344. log.error(`[基础数据] 编辑基础数据失败,数据库中无基础数据 尝试添加`);
  345. // 新增数据
  346. [err,res] = await handle(d_base.addBaseInfo(data));
  347. if(err){
  348. log.error(`[基础数据] 新增基础数据失败 ${err.message}`);
  349. return [{eCode: codeMap.ServerError, eMsg: `新增基础数据失败`}, null];
  350. }
  351. log.info(`[基础数据] 新增基础数据成功`);
  352. return [null,true];
  353. }
  354. let baseInfo = res[0];
  355. // console.log(data);
  356. [err,res] = await handle(d_base.editBaseInfo(data, baseInfo.id));
  357. if(err){
  358. log.error(`[基础数据] 编辑基础数据失败 ${err.message}`);
  359. return [{eCode: codeMap.ServerError, eMsg: `编辑基础数据失败`}, null];
  360. }
  361. log.info(`[基础数据] 编辑基础数据成功`);
  362. return [null,true];
  363. }
  364. module.exports = {
  365. getEnableCarousel,
  366. getAllCarousel,
  367. addCarousel,
  368. deleteCarousel,
  369. updateCarousel,
  370. uploadFile,
  371. searchFiles,
  372. deleteFile,
  373. getBaseData,
  374. getBaseInfo,
  375. editBaseInfo
  376. }