c_base.js 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336
  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. async function deleteFile(id){
  162. let err,res;
  163. [err,res] = await handle(d_base.deleteFile(id));
  164. if(err){
  165. log.error(`[删除文件] 删除数据异常 ${err.message}`);
  166. return [err,null];
  167. }
  168. return [null,res];
  169. }
  170. /**
  171. * 文件上传
  172. * @param type
  173. * @param files
  174. * @returns {Promise<[{eMsg: string, eCode: number},null]|*[][]|[{eMsg: string, eCode: *},null]|*[]>}
  175. */
  176. async function uploadFile(type, files){
  177. // 文件类型一般不会被改变,只移动文件至对应的存储目录,并将路径存储到数据库中.只存储文件名
  178. let err,res,newFileName;
  179. let uploadPath = config_path.files;
  180. let fileNameArr = [];// 文件存储路径数组
  181. // 文件转存,使用newFileName作为路径
  182. if(type === dbField.db_base.fileType.image){
  183. uploadPath = config_path.images;
  184. }else if(type === dbField.db_base.fileType.video){
  185. uploadPath = config_path.videos;
  186. }
  187. let keys = Object.keys(files);
  188. // 遍历转移文件
  189. for(let fileKey of keys){
  190. let file = files[fileKey];
  191. // 判断当前文件是否为数组
  192. if(!file.newFilename && file.length){
  193. for(let f of file){
  194. // console.log(f);
  195. // console.log(f.newFilename);
  196. log.info(`[文件上传] 开始移动文件 ${f.newFilename} to ${uploadPath}`);
  197. [err,newFileName] = await mvFile(f,uploadPath, f.newFilename);
  198. if(err){
  199. return [err,null];
  200. }
  201. // console.log('移动文件成功' + newFileName);
  202. fileNameArr.push(newFileName);
  203. }
  204. }else if(file.newFilename){
  205. [err,newFileName] = await mvFile(file,uploadPath,file.newFilename);
  206. if(err){
  207. return [err,null];
  208. }
  209. fileNameArr.push(newFileName);
  210. }else{
  211. // 文件调用异常
  212. log.error(`[文件上传] 文件调用异常,fileObj\n: ${JSON.stringify(file)}`);
  213. return [
  214. {
  215. eCode:codeMap.ServerError,
  216. eMsg:`文件调用异常`
  217. },null];
  218. }
  219. }
  220. // 存储至数据库
  221. // console.log(type);
  222. [err,res] = await handle(d_base.uploadFiles(type,fileNameArr,getUnixTimeStamp()));
  223. if(err){
  224. log.error(`[文件上传] 文件入库失败 ${err.message}`);
  225. return [{eCode: codeMap.SaveError,eMsg: `文件存储失败!!!`},null];
  226. }
  227. log.info(`[文件上传] 文件上传成功 ${res.affectedRows}`);
  228. return [null,fileNameArr];
  229. }
  230. /**
  231. * 搜索文件
  232. * @param type
  233. * @param key
  234. * @param l
  235. * @param p
  236. * @returns {Promise<err[]|{arr, total: number, limit, page}[]>}
  237. */
  238. async function searchFiles(type = 0, key, l, p){
  239. let err,res;
  240. let _params = {
  241. key: key,
  242. }
  243. // console.log(type);
  244. // type为 数据库值加一,因为数据库中存储值从0开始,而前端显示从1开始
  245. if((type - 1) !== dbField.db_base.fileType.all){
  246. _params.type = type;
  247. }
  248. // console.log(_params);
  249. [err,res] = await searchHandle('搜索文件失败', d_base.loadFiles, _params, l, p);
  250. if(err){
  251. log.info(`[文件资源] 加载失败 ${err.eDetail||err.message}`)
  252. return [err,null];
  253. }
  254. // console.log(res);
  255. res.arr = res.arr.map(item=>{
  256. console.log(item);
  257. item.filePath = filePathToUrl(item.fileType,item.filePath);
  258. return item;
  259. });
  260. return [null,res];
  261. }
  262. async function deleteFile(fileId){
  263. let err,res,rmRes;
  264. // 获取文件信息
  265. [err,res] = await handle(d_base.getFileById(fileId));
  266. if(err){
  267. log.info(`[文件资源] 获取文件信息失败 ${err.message}`);
  268. return [{eCode:codeMap.ServerError,eMsg:`删除文件失败,无法查找文件`},null];
  269. }
  270. if(!res.length){
  271. log.info(`[文件资源] 获取文件信息失败,无法找到文件`);
  272. return [{eCode:codeMap.NotFound,eMsg:`删除文件失败,无法查找文件`},null];
  273. }
  274. let fileData = res[0];
  275. let filePath = filePathToUrl(fileData.fileType,fileData.filePath);
  276. [err,res,rmRes] = await handleAll(d_base.deleteFile(fileId),rmFile(filePath));
  277. if(err){
  278. console.log(err);
  279. log.info(`[文件资源] 删除文件${fileId}失败 ${err.message}`);
  280. return [{eCode:codeMap.SaveError,eMsg:`删除文件失败`},null];
  281. }
  282. return [null,true];
  283. }
  284. async function getTypes(){
  285. // 同时获取所有需要获取的基础数据
  286. let err,pType,nType;
  287. // todo 同时获取所有需要获取的基础数据
  288. [err,pType,nType] = await handleAll(
  289. d_product.loadTypes(),
  290. d_news.loadTypes()
  291. );
  292. if (err) {
  293. log.error(`[基础数据] 获取基础数据类型分类失败 ${err.message}`);
  294. return [{eCode: codeMap.ServerError, eMsg: `获取基础数据失败`}, null];
  295. }
  296. // 合并数据
  297. let types = {
  298. pType,
  299. nType
  300. };
  301. log.info(`[基础数据] 类型分类获取成功 程序类型数量:${pType.length} 文章类型数量:${nType.length}`);
  302. return [null,types];
  303. }
  304. module.exports = {
  305. getEnableCarousel,
  306. getAllCarousel,
  307. addCarousel,
  308. deleteCarousel,
  309. updateCarousel,
  310. uploadFile,
  311. searchFiles,
  312. deleteFile,
  313. getTypes,
  314. }