index.js 9.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274
  1. /*引入包初始化*/
  2. global.express=require('express');
  3. const app=express();
  4. const bodyParser=require('body-parser');
  5. const path=require('path');
  6. const multer=require('multer');
  7. // const session=require('express-session');
  8. const fs=require('fs');
  9. const ws=require('express-ws')(app);
  10. const events = require("events");
  11. global.emitter = new events.EventEmitter();
  12. global.mongoose=require('mongoJs');
  13. global.redis=require('redis');
  14. global.utl=require('utl');/*工具加载*/
  15. const Time=require('dayFn');/*定时方法加载*/
  16. const SeasonInit=require('seasonInit');/*赛季段位加载*/
  17. const QBank=require('QBank/getQBank');/*题库加载*/
  18. const redis_utl=require("utl");
  19. const settings=require('settings');
  20. global.uploadFile=multer({dest:__dirname+'/asset/img/'}).any();
  21. global.audioFile=multer({dest:__dirname+'/asset/audio/'}).any();
  22. global.videoFile=multer({dest:__dirname+'/asset/video/'}).any();
  23. app.use(bodyParser.json());
  24. app.use(bodyParser.urlencoded({extended: false}));
  25. // app.set("trust proxy",1);/*有反向代理时设置 session */
  26. /*session 内存缓存*/
  27. // app.use(session({
  28. // secret:"dyfn.com",
  29. // name:"content",
  30. // resave: false,
  31. // rolling:true,
  32. // saveUninitialized: true,
  33. // cookie:{
  34. // maxAge:60*60*1000
  35. // }
  36. // }))
  37. /* session缓存 header判断 */
  38. app.use(function (req,res,next) {
  39. res.header("Access-Control-Allow-Credentials", "true");
  40. res.header("Access-Control-Allow-Origin", req.headers.origin);
  41. res.header("Access-Control-Allow-Headers", "Content-Type,name,token");
  42. res.header("Access-Control-Allow-Methods","*");
  43. let reqdata=utl.copy(req.headers);
  44. if(reqdata.name!="sp"&&!reqdata.upgrade){
  45. if(!uri.includes(reqdata.host)){
  46. res.send(utl.resData({},405,"已失效"));
  47. return;
  48. }
  49. }
  50. var API=[""];
  51. var edt=path.parse(req.url);
  52. if(edt.ext===""&&edt.name!==""){
  53. var ApiName=edt.name.indexOf("?")>=0?edt.name.substr(0,edt.name.indexOf("?")):edt.name;
  54. try {
  55. if(reqdata.token){
  56. redis_utl.ttl(reqdata.token).then(ttl_reply=>{
  57. if(ttl_reply>0){
  58. redis_utl.get(reqdata.token).then(get_reply=>{
  59. redis_utl.expire(reqdata.token,global.user_session_time)
  60. if(~edt.name.indexOf('del')){
  61. if(get_reply.access.includes(admin)){
  62. next();
  63. }else {
  64. res.send(utl.resData({},401,"无此权限"))
  65. }
  66. }else {
  67. let reqData=Object.keys(req.body).length?req.body:req.query;
  68. if(reqData.pageSize&&ApiName!="classList"&&(reqData.pageSize<=0||reqData.pageSize>20)){
  69. Object.keys(req.body).length?req.body.pageSize=1:req.query.pageSize=1;
  70. }
  71. next();
  72. }
  73. })
  74. }else {
  75. res.send(utl.resData({},403,"登录已失效"))
  76. }
  77. })
  78. }else {
  79. res.send(utl.resData({},403,"登录已失效"))
  80. }
  81. }catch (e) {
  82. res.send(utl.resData({},403,"登录已失效"))
  83. }
  84. }else {
  85. next();
  86. }
  87. })
  88. /*引入静态文件*/
  89. app.use(express.static('web'));
  90. app.use(express.static('page'));
  91. app.use(express.static('uploadFile'));
  92. app.use(express.static('audio'));
  93. /*程序设置*/
  94. global.admin="";/*权限*/
  95. global.API_prefix="";/*接口前缀*/
  96. global.idLen=24;/*id长度判断设置*/
  97. settings.getSettings().then(data=>{
  98. global.user_session_time=data.sessionTime;
  99. global.tokenLen=data.tokenLen;/*token长度设置*/
  100. global.MaxShare=data.MaxShare;/*最大分享积分*/
  101. global.invitationPoint=data.invitationPoint;/*邀请新人积分*/
  102. global.subscribePoint=data.subscribePoint;/*关注公众号积分*/
  103. global.signDefault=data.signPoint;/*连续签到积分*/
  104. global.rechargeShare=data.rechargeShare;/*充值邀请人提成积分*/
  105. console.log('settings loaded.')
  106. }).catch(err=>{
  107. console.log('settings Load failed!')
  108. })
  109. const QBanks=new QBank({});/*初始题库*/
  110. const QBankLV=10;/*题目级别*/
  111. global.bankLV=[];/*缓存题库*/
  112. for(let i=1;i<=QBankLV;i++){
  113. QBanks.getExercises(i).then(data=>{/*题库 缓存*/
  114. if(!data.length){
  115. console.log("QBank"+i+" is null!")
  116. }
  117. global.bankLV[i]=data
  118. console.log("QBank"+i+" loaded.")
  119. });
  120. }
  121. /*定时执行任务*/
  122. const schedule=new Time({});
  123. schedule.init();/*每小时59分时更新数据库用户活跃数据 每天23:59:59时处理用户活跃数据并初始化*/
  124. /*赛季段位加载*/
  125. const rank=new SeasonInit();/*初始赛季段位*/
  126. rank.init().then(data=>{/*加载赛季段位*/
  127. if(!data){
  128. console.log("rank Load failed!")
  129. } else {
  130. if(!Object.keys(data.lastKnowledge).length){
  131. console.log("knowledge Load failed!")
  132. }else if(!Object.keys(data.lastQualify).length){
  133. console.log("qualify Load failed!")
  134. }else if(!data.knowledge){
  135. console.log("knowledge's rank Load failed!")
  136. }else if(!data.qualify){
  137. console.log("qualify's rank Load failed!")
  138. }
  139. }
  140. global.lastKnowledge=data.lastKnowledge;/*知识赛季信息*/
  141. global.lastQualify=data.lastQualify;/*资质赛季信息*/
  142. global.knowledgeRank=data.knowledge;/*知识段位*/
  143. global.qualifyRank=data.qualify;/*资质段位*/
  144. global.mixKnowledgeRank=Math.floor(data.knowledge.length*.6);/*最低降段段位*/
  145. global.mixQualifyRank=Math.floor(data.qualify.length*.6);/*最低降段段位*/
  146. });
  147. /*引入api路由*/
  148. const Home = require('router/home.js');
  149. const Pay = require('router/pay.js');
  150. const Login = require('router/login.js');
  151. const Knowledge = require('router/knowledge.js');
  152. const Qualify = require('router/qualify.js');
  153. const Course = require('router/course.js');
  154. const Class = require('router/class.js');
  155. const Recharge = require('router/recharge.js');
  156. const User = require('router/user.js');
  157. const Init = require('router/init.js');
  158. const Points = require('router/points.js');
  159. const QusBank =require('router/QBank.js');
  160. const Game =require('router/game.js');
  161. const Upload =require('router/upload.js');
  162. const Setting =require('router/setting.js');
  163. /*配置api路由*/
  164. /*对战 ws*/
  165. const gameFn=require("main");
  166. global.wsList={};
  167. app.ws('/.....',function (ws,req) {
  168. ws.on('message', function(msg) {
  169. try {
  170. let message=JSON.parse(decodeURIComponent(msg));
  171. if(message.token){
  172. redis_utl.get(message.token).then(get_reply=>{
  173. if(get_reply){
  174. redis_utl.expire(message.token,global.user_session_time)
  175. if(!wsList.hasOwnProperty(get_reply._id)){
  176. ws.token=get_reply.token;
  177. wsList[get_reply._id]=ws;
  178. }else {
  179. if(wsList[get_reply._id].token!==get_reply.token){
  180. ws.token=get_reply.token;
  181. wsList[get_reply._id]=ws;
  182. }
  183. }
  184. gameFn.controller(message,get_reply._id)
  185. }else {
  186. ws.send(encodeURIComponent(JSON.stringify({'mes':"token is bad"})))
  187. }
  188. })
  189. }else {
  190. ws.send(encodeURIComponent(JSON.stringify({'mes':"token is undefined"})))
  191. }
  192. }catch (e) {
  193. redis_utl.get(ws.token).then(get_reply=>{
  194. if(get_reply){
  195. delete wsList[get_reply._id]
  196. }
  197. })
  198. ws.close()
  199. }
  200. });
  201. ws.on('close',function () {
  202. redis_utl.get(ws.token).then(get_reply=>{
  203. if(get_reply){
  204. delete wsList[get_reply._id]
  205. }
  206. })
  207. ws.close()
  208. })
  209. })
  210. emitter.on('sendMes', function(userId=[],mesData) {
  211. for(let i=0;i<userId.length;i++){
  212. if(wsList.hasOwnProperty(userId[i])){
  213. if(wsList[userId[i]].readyState===1){
  214. wsList[userId[i]].send(encodeURIComponent(JSON.stringify(mesData)))
  215. }else {
  216. delete wsList[userId[i]]
  217. }
  218. }
  219. }
  220. });
  221. /*服务器端口*/
  222. app.listen('',function(){
  223. console.log('server running.')
  224. })
  225. /*服务器路由*/
  226. app.get('*',function(req,res){
  227. var edt=path.parse(req.url);
  228. var uri="";
  229. // var deviceAgent = req.headers["user-agent"].toLowerCase()
  230. // var agentID = deviceAgent.match(/(iphone|ipod|ipad|android)/)
  231. // var version = deviceAgent.match(/(version)/);
  232. if(edt.dir==='/'){
  233. if(!edt.name){
  234. edt.name='index';
  235. //if(agentID&&version){
  236. // console.log(111,'手机、pid')
  237. uri='/index.html';
  238. //}else{
  239. //res.send('该服务不支持电脑访问')
  240. // }
  241. }else if(edt.dir==='/'&&edt.base==='spAdmin'){
  242. uri='index.html';
  243. }else {
  244. if(edt.name!=='favicon'){
  245. uri='/'+edt.name+edt.ext;
  246. }
  247. }
  248. }else{
  249. uri=path.join(edt.dir,edt.base);
  250. }
  251. try{
  252. fs.readFileSync(__dirname+uri);
  253. res.sendFile(__dirname+uri);
  254. }catch(e){
  255. res.sendFile(__dirname+'/page/404.html');
  256. }
  257. })