index.js 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406
  1. var express = require('express');
  2. const XLSX = require('xlsx');
  3. var router = express.Router();
  4. const {queryDatabase} = require('../db/mysql')
  5. /* 数据看板接口*/
  6. router.get('/result_info', function(req, res, next) {
  7. let strDate = req.query.date
  8. console.log(strDate);
  9. const sql = `SELECT * FROM result_table_${strDate}`;
  10. queryDatabase(sql,(err,results)=>{
  11. if(err){
  12. res.status(500).json({ error: '查询数据失败' });
  13. return;
  14. }
  15. res.json(results);
  16. console.log(results);
  17. })
  18. // res.render('index', { title: 'Express' });
  19. });
  20. //下载客户表_研发表展示
  21. router.get("/get_customer_table",function(req,res,next){
  22. const pageNum = parseInt(req.query.pageNum) || 1; // 获取页码,默认第1页
  23. const pageSize = parseInt(req.query.pageSize) || 10; // 获取每页条数,默认10条
  24. const offset = (pageNum - 1) * pageSize; // 计算偏移量
  25. console.log(req.query);
  26. const mainSql = `SELECT c.user_name, c.remark_name, c.external_userid, c.from_service, GROUP_CONCAT(e.enterprise_label SEPARATOR ',') AS enterpris_label, c.loss_status, c.add_time, c.min_join_group_time, c.max_withdraw_group_time, c.delete_time FROM customer_table c LEFT JOIN enterprise_label_table e ON c.external_userid = e.external_userid GROUP BY c.external_userid LIMIT ${offset}, ${pageSize}`;
  27. // 查询总记录数的语句,只统计customer_table表中的记录数,不涉及关联表的计数影响
  28. const countSql = `SELECT COUNT(*) AS total_count FROM customer_table c`;
  29. queryDatabase( mainSql, (mainErr, results) => {
  30. if (mainErr) {
  31. console.error('查询客户数据失败:', mainErr);
  32. res.status(500).json({ success: false, message: '查询客户数据失败' });
  33. return;
  34. }
  35. queryDatabase(countSql,(countErr, countResult) => {
  36. if (countErr) {
  37. console.error('查询客户数据总记录数失败:', countErr);
  38. res.status(500).json({ success: false, message: '查询客户数据总记录数失败' });
  39. return;
  40. }
  41. const total = countResult[0].total_count;
  42. res.json({
  43. success: true,
  44. data: results,
  45. total: total,
  46. currentPage: pageNum,
  47. pageSize: pageSize
  48. });
  49. })
  50. })
  51. })
  52. //获取标签表不重复的全部标签列表
  53. router.get("/get_lable_all", function(req,res,next){
  54. const sql = `SELECT DISTINCT enterprise_label FROM enterprise_label_table`;
  55. queryDatabase(sql,(err,results)=>{
  56. if(err){
  57. res.status(500).json({ error: '查询数据失败' });
  58. return;
  59. }
  60. let labels = results.map(row => row.enterprise_label);
  61. res.json({ success: true, data: labels });
  62. })
  63. })
  64. router.get("/query",function(req,res,next){
  65. const { user_name, from_service, enterpris_label, loss_status, add_time, min_join_group_time, max_withdraw_group_time, delete_time } = req.body;
  66. console.log(req.body);
  67. // 构建模糊查询的条件语句部分
  68. let conditions = [];
  69. if (user_name) {
  70. conditions.push(`c.user_name LIKE '%${user_name}%'`);
  71. }
  72. if (from_service) {
  73. conditions.push(`c.from_service LIKE '%${from_service}%'`);
  74. }
  75. if (enterpris_label.length > 0) {
  76. const labelConditions = enterpris_label.map(label => `e.enterprise_label LIKE '%${label}%'`);
  77. conditions.push(`(${labelConditions.join(' OR ')})`);
  78. }
  79. if (loss_status.length > 0) {
  80. const statusConditions = loss_status.map(status => `c.loss_status LIKE '%${status}%'`);
  81. conditions.push(`(${statusConditions.join(' OR ')})`);
  82. }
  83. if (add_time) {
  84. conditions.push(`c.add_time LIKE '%${add_time}%'`);
  85. }
  86. if (min_join_group_time) {
  87. conditions.push(`c.min_join_group_time LIKE '%${min_join_group_time}%'`);
  88. }
  89. if (max_withdraw_group_time) {
  90. conditions.push(`c.max_withdraw_group_time LIKE '%${max_withdraw_group_time}%'`);
  91. }
  92. if (delete_time) {
  93. conditions.push(`c.delete_time LIKE '%${delete_time}%'`);
  94. }
  95. // 组合完整的查询条件语句
  96. let whereClause = '';
  97. if (conditions.length > 0) {
  98. whereClause = 'WHERE ';
  99. whereClause += conditions.join(' AND ');
  100. }
  101. const mainSql = `
  102. SELECT
  103. c.add_time,
  104. c.delete_time,
  105. GROUP_CONCAT(e.enterprise_label SEPARATOR ',') AS enterpris_label,
  106. c.external_userid,
  107. c.from_service,
  108. c.loss_status,
  109. c.max_withdraw_group_time,
  110. c.min_join_group_time,
  111. c.remark_name,
  112. c.user_name
  113. FROM
  114. customer_table c
  115. LEFT JOIN
  116. enterprise_label_table e ON c.external_userid = e.external_userid
  117. ${whereClause}
  118. GROUP BY
  119. c.external_userid
  120. `;
  121. queryDatabase(mainSql,(err,results)=>{
  122. if(err){
  123. res.status(500).json({ error: '查询数据失败' });
  124. return;
  125. }
  126. res.json({ success: true, data: results });
  127. })
  128. })
  129. //下载入群表格的excel接口
  130. router.get('/join_group', function(req,res,next){
  131. const sql = 'SELECT * FROM join_group_table';
  132. queryDatabase(sql,(err,results)=>{
  133. if(err){
  134. res.status(500).json({ error: '查询数据失败' });
  135. return;
  136. }
  137. // 定义表头数组,与数据库字段对应
  138. const headers = ["序号", "群用户名称", "入群的用户id", "入群名称", "入群时间"];
  139. // 将查询结果处理为包含表头的二维数组形式,方便转换为Excel工作表
  140. const dataWithHeaders = [headers].concat(results.map(item => [
  141. item.id,
  142. item.join_user_name,
  143. item.join_user_id,
  144. item.join_content,
  145. // 将时间戳转换为年月日格式
  146. new Date(item.join_group_time * 1000).toLocaleDateString()
  147. ]));
  148. // 使用xlsx库将处理后的数据转换为Excel工作簿对象
  149. const worksheet = XLSX.utils.aoa_to_sheet(dataWithHeaders);
  150. const workbook = XLSX.utils.book_new();
  151. XLSX.utils.book_append_sheet(workbook, worksheet, 'Sheet1');
  152. // 将工作簿对象转换为二进制数据
  153. const excelBuffer = XLSX.write(workbook, { bookType: 'xlsx', type: 'buffer' });
  154. // 设置响应头,告知浏览器这是一个Excel文件下载
  155. res.setHeader('Content-Type', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
  156. res.setHeader('Content-Disposition', 'attachment; filename="join_group_table.xlsx"');
  157. // 将Excel文件数据发送给浏览器
  158. res.send(excelBuffer);
  159. })
  160. })
  161. //下载删除朋友表格的excel接口
  162. router.get('/delete_friend',function(req,res,next){
  163. const sql = 'SELECT * FROM delete_friend_table';
  164. queryDatabase(sql,(err,results)=>{
  165. if(err){
  166. res.status(500).json({ error: '查询数据失败' });
  167. return;
  168. }
  169. // 定义表头数组,与数据库字段对应
  170. const headers = ["序号", "删除的用户名", "删除用户id", "删除内容", "删除时间"];
  171. // 将查询结果处理为包含表头的二维数组形式,方便转换为Excel工作表
  172. const dataWithHeaders = [headers].concat(results.map(item => [
  173. item.id,
  174. item.delete_user_name,
  175. item.delete_user_id,
  176. item.delete_content,
  177. // 将时间戳转换为年月日格式
  178. new Date(item.delete_time * 1000).toLocaleDateString()
  179. ]));
  180. // 使用xlsx库将处理后的数据转换为Excel工作簿对象
  181. const worksheet = XLSX.utils.aoa_to_sheet(dataWithHeaders);
  182. const workbook = XLSX.utils.book_new();
  183. XLSX.utils.book_append_sheet(workbook, worksheet, 'Sheet1');
  184. // 将工作簿对象转换为二进制数据
  185. const excelBuffer = XLSX.write(workbook, { bookType: 'xlsx', type: 'buffer' });
  186. // 设置响应头,告知浏览器这是一个Excel文件下载
  187. res.setHeader('Content-Type', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
  188. res.setHeader('Content-Disposition', 'attachment; filename="join_group_table.xlsx"');
  189. // 将Excel文件数据发送给浏览器
  190. res.send(excelBuffer);
  191. })
  192. })
  193. //下载群用户表格的excel接口
  194. router.get('/group_user',function(req,res,next){
  195. const sql = 'SELECT * FROM group_user_table';
  196. queryDatabase(sql,(err,results)=>{
  197. if(err){
  198. res.status(500).json({ error: '查询数据失败' });
  199. return;
  200. }
  201. // 定义表头数组,与数据库字段对应
  202. const headers = ["序号", "群用户名称", "群用户id", "群内容", "群时间"];
  203. // 将查询结果处理为包含表头的二维数组形式,方便转换为Excel工作表
  204. const dataWithHeaders = [headers].concat(results.map(item => [
  205. item.id,
  206. item.group_user_name,
  207. item.group_user_id,
  208. item.group_content,
  209. // 将时间戳转换为年月日格式
  210. new Date(item.group_time * 1000).toLocaleDateString()
  211. ]));
  212. // 使用xlsx库将处理后的数据转换为Excel工作簿对象
  213. const worksheet = XLSX.utils.aoa_to_sheet(dataWithHeaders);
  214. const workbook = XLSX.utils.book_new();
  215. XLSX.utils.book_append_sheet(workbook, worksheet, 'Sheet1');
  216. // 将工作簿对象转换为二进制数据
  217. const excelBuffer = XLSX.write(workbook, { bookType: 'xlsx', type: 'buffer' });
  218. // 设置响应头,告知浏览器这是一个Excel文件下载
  219. res.setHeader('Content-Type', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
  220. res.setHeader('Content-Disposition', 'attachment; filename="join_group_table.xlsx"');
  221. // 将Excel文件数据发送给浏览器
  222. res.send(excelBuffer);
  223. })
  224. })
  225. //下载结论表格的excel接口
  226. router.get('/result',function(req,res,next){
  227. const sql = 'SELECT * FROM result_table_1210';
  228. queryDatabase(sql,(err,results)=>{
  229. if(err){
  230. res.status(500).json({ error: '查询数据失败' });
  231. return;
  232. }
  233. // 定义表头数组,与数据库字段对应
  234. const headers = ["序号", "客户表去水ID个数", "累计社群人数", "已退群的ID个数", "目前社群内人数","重复在群的ID的数量","今日新增客户人数","7日内新增客户人数","30日内新增客户人数"];
  235. // 将查询结果处理为包含表头的二维数组形式,方便转换为Excel工作表
  236. const dataWithHeaders = [headers].concat(results.map(item => [
  237. item.id,
  238. item.customer_num,
  239. item.community_num,
  240. item.withdrawed_num,
  241. item.in_community_num,
  242. item.in_many_group_num,
  243. item.number_of_new_customers_added_today,
  244. item.number_of_new_customers_added_within_7_days,
  245. item.number_of_new_customers_added_within_30_days,
  246. ]));
  247. // 使用xlsx库将处理后的数据转换为Excel工作簿对象
  248. const worksheet = XLSX.utils.aoa_to_sheet(dataWithHeaders);
  249. const workbook = XLSX.utils.book_new();
  250. XLSX.utils.book_append_sheet(workbook, worksheet, 'Sheet1');
  251. // 将工作簿对象转换为二进制数据
  252. const excelBuffer = XLSX.write(workbook, { bookType: 'xlsx', type: 'buffer' });
  253. // 设置响应头,告知浏览器这是一个Excel文件下载
  254. res.setHeader('Content-Type', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
  255. res.setHeader('Content-Disposition', 'attachment; filename="join_group_table.xlsx"');
  256. // 将Excel文件数据发送给浏览器
  257. res.send(excelBuffer);
  258. })
  259. })
  260. //下载水军表格的excel接口
  261. router.get('/trolls',function(req,res,next){
  262. const sql = 'SELECT * FROM shang_and_di_table';
  263. queryDatabase(sql,(err,results)=>{
  264. if(err){
  265. res.status(500).json({ error: '查询数据失败' });
  266. return;
  267. }
  268. // 定义表头数组,与数据库字段对应
  269. const headers = ["序号", "水军名称","水军备注","水军ID"];
  270. // 将查询结果处理为包含表头的二维数组形式,方便转换为Excel工作表
  271. const dataWithHeaders = [headers].concat(results.map(item => [
  272. item.id,
  273. item.s_d_name,
  274. item.s_d_remark,
  275. item.s_d_id
  276. ]));
  277. // 使用xlsx库将处理后的数据转换为Excel工作簿对象
  278. const worksheet = XLSX.utils.aoa_to_sheet(dataWithHeaders);
  279. const workbook = XLSX.utils.book_new();
  280. XLSX.utils.book_append_sheet(workbook, worksheet, 'Sheet1');
  281. // 将工作簿对象转换为二进制数据
  282. const excelBuffer = XLSX.write(workbook, { bookType: 'xlsx', type: 'buffer' });
  283. // 设置响应头,告知浏览器这是一个Excel文件下载
  284. res.setHeader('Content-Type', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
  285. res.setHeader('Content-Disposition', 'attachment; filename="join_group_table.xlsx"');
  286. // 将Excel文件数据发送给浏览器
  287. res.send(excelBuffer);
  288. })
  289. })
  290. //下载退出群表格的excel接口
  291. router.get('/withdrawal',function(req,res,next){
  292. const sql = 'SELECT * FROM withdrawal_group_table';
  293. queryDatabase(sql,(err,results)=>{
  294. if(err){
  295. res.status(500).json({ error: '查询数据失败' });
  296. return;
  297. }
  298. // 定义表头数组,与数据库字段对应
  299. const headers = ["序号", "退群的用户名称","退群的用户ID","退群内容","退群时间"];
  300. // 将查询结果处理为包含表头的二维数组形式,方便转换为Excel工作表
  301. const dataWithHeaders = [headers].concat(results.map(item => [
  302. item.id,
  303. item.withdrawal_user_name,
  304. item.withdrawal_user_id,
  305. item.withdrawal_content,
  306. // 将时间戳转换为年月日格式
  307. new Date(item.withdrawal_group_time * 1000).toLocaleDateString()
  308. ]));
  309. // 使用xlsx库将处理后的数据转换为Excel工作簿对象
  310. const worksheet = XLSX.utils.aoa_to_sheet(dataWithHeaders);
  311. const workbook = XLSX.utils.book_new();
  312. XLSX.utils.book_append_sheet(workbook, worksheet, 'Sheet1');
  313. // 将工作簿对象转换为二进制数据
  314. const excelBuffer = XLSX.write(workbook, { bookType: 'xlsx', type: 'buffer' });
  315. // 设置响应头,告知浏览器这是一个Excel文件下载
  316. res.setHeader('Content-Type', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
  317. res.setHeader('Content-Disposition', 'attachment; filename="join_group_table.xlsx"');
  318. // 将Excel文件数据发送给浏览器
  319. res.send(excelBuffer);
  320. })
  321. })
  322. module.exports = router;