admin.js 60 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793
  1. var express = require('express');
  2. var router = express.Router();
  3. router.caseSensitive = true;
  4. var url = require('url');
  5. //管理员对象
  6. var AdminUser = require("../models/AdminUser");
  7. //管理员用户组对象
  8. var AdminGroup = require("../models/AdminGroup");
  9. // 文档对象
  10. var Content = require("../models/Content");
  11. //数据操作日志
  12. var DataOptionLog = require("../models/DataOptionLog");
  13. //文章类别对象
  14. var ContentCategory = require("../models/ContentCategory");
  15. //文章标签对象
  16. var ContentTags = require("../models/ContentTags");
  17. //文章模板对象
  18. var ContentTemplate = require("../models/ContentTemplate");
  19. var TemplateItems = require("../models/TemplateItems");
  20. //文章留言对象
  21. var Message = require("../models/Message");
  22. //注册用户对象
  23. var User = require("../models/User");
  24. //广告对象
  25. var Ads = require("../models/Ads");
  26. var AdsItems = require("../models/AdsItems");
  27. //数据校验
  28. var validator = require('validator');
  29. //短id
  30. var shortid = require('shortid');
  31. //系统操作
  32. var system = require("../util/system");
  33. //系统缓存
  34. var cache = require("../util/cache");
  35. //站点配置
  36. var settings = require("../models/db/settings");
  37. var adminFunc = require("../models/db/adminFunc");
  38. //加密类
  39. var crypto = require("crypto");
  40. //数据库操作对象
  41. var DbOpt = require("../models/Dbopt");
  42. //系统日志对象
  43. var SystemOptionLog = require("../models/SystemOptionLog");
  44. //消息对象
  45. var Notify = require("../models/Notify");
  46. var UserNotify = require("../models/UserNotify");
  47. //文件操作
  48. var unzip = require('unzip');
  49. var fs = require('fs');
  50. var iconv = require('iconv-lite');
  51. var http = require('http');
  52. var request = require('request');
  53. /* GET home page. */
  54. var PW = require('png-word');
  55. var RW = require('../util/randomWord');
  56. var rw = RW('abcdefghijklmnopqrstuvwxyz1234567890');
  57. var pngword = new PW(PW.GRAY);
  58. //管理员登录页面
  59. router.get('/', function(req, res) {
  60. req.session.vnum = rw.random(4);
  61. res.render('manage/adminLogin',{ title: settings.SITETITLE , description : 'DoraCMS后台管理登录'});
  62. });
  63. //刷新验证码
  64. router.get('/vnum',function(req, res){
  65. var word = req.session.vnum;
  66. pngword.createPNG(word,function(word){
  67. res.end(word);
  68. })
  69. });
  70. // 管理员登录提交请求
  71. router.post('/doLogin', function(req, res) {
  72. var userName = req.body.userName;
  73. var password = req.body.password;
  74. var vnum = req.body.vnum;
  75. var newPsd = DbOpt.encrypt(password,settings.encrypt_key);
  76. if(vnum != req.session.vnum){
  77. req.session.vnum = rw.random(4);
  78. res.end('验证码有误!');
  79. }else{
  80. if(validator.isUserName(userName) && validator.isPsd(password)){
  81. AdminUser.findOne({'userName':userName,'password':newPsd}).populate('group').exec(function(err,user){
  82. if(err){
  83. res.end(err);
  84. }
  85. if(user) {
  86. req.session.adminPower = user.group.power;
  87. req.session.adminlogined = true;
  88. req.session.adminUserInfo = user;
  89. //获取管理员通知信息
  90. adminFunc.getAdminNotices(req,res,function(noticeObj){
  91. req.session.adminNotices = noticeObj;
  92. // 存入操作日志
  93. SystemOptionLog.addUserLoginLogs(req,res,adminFunc.getClienIp(req));
  94. res.end("success");
  95. });
  96. }else{
  97. console.log("登录失败");
  98. res.end("用户名或密码错误");
  99. }
  100. });
  101. }else{
  102. res.end(settings.system_illegal_param)
  103. }
  104. }
  105. });
  106. // 管理员退出
  107. router.get('/logout', function(req, res) {
  108. req.session.adminlogined = false;
  109. req.session.adminPower = '';
  110. req.session.adminUserInfo = '';
  111. res.redirect("/admin");
  112. });
  113. //-------------------------后台模块访问入口开始----------------------------
  114. //管理主界面
  115. router.get('/manage', function(req, res) {
  116. res.render('manage/main', adminFunc.setPageInfo(req,res,settings.SYSTEMMANAGE));
  117. });
  118. //获取系统首页数据集合
  119. router.get('/manage/getMainInfo', function(req, res) {
  120. adminFunc.setMainInfos(req, res);
  121. });
  122. //系统用户管理(list)
  123. router.get('/manage/adminUsersList', function(req, res) {
  124. res.render('manage/adminUsersList', adminFunc.setPageInfo(req,res,settings.adminUsersList));
  125. });
  126. //系统用户组管理(list)
  127. router.get('/manage/adminGroupList', function(req, res) {
  128. res.render('manage/adminGroupList', adminFunc.setPageInfo(req,res,settings.adminGroupList));
  129. });
  130. //广告管理(list)
  131. router.get('/manage/adsList', function(req, res) {
  132. res.render('manage/adsList', adminFunc.setPageInfo(req,res,settings.adsList));
  133. });
  134. //文件管理界面(list)
  135. router.get('/manage/filesList', function(req, res) {
  136. res.render('manage/filesList', adminFunc.setPageInfo(req,res,settings.filesList));
  137. });
  138. //数据备份
  139. router.get('/manage/backUpData', function(req, res) {
  140. res.render('manage/backUpData', adminFunc.setPageInfo(req,res,settings.backUpData));
  141. });
  142. router.get('/manage/systemLogs', function(req, res) {
  143. res.render('manage/systemLogs', adminFunc.setPageInfo(req,res,settings.systemLogs));
  144. });
  145. //文档列表页面
  146. router.get('/manage/contentList', function(req, res) {
  147. res.render('manage/contentList', adminFunc.setPageInfo(req,res,settings.contentList));
  148. });
  149. //文档类别列表页面
  150. router.get('/manage/contentCategorys', function(req, res) {
  151. res.render('manage/contentCategorys', adminFunc.setPageInfo(req,res,settings.contentCategorys));
  152. });
  153. //文档标签管理(list)
  154. router.get('/manage/contentTags', function(req, res) {
  155. res.render('manage/contentTags', adminFunc.setPageInfo(req,res,settings.contentTags));
  156. });
  157. //模板配置
  158. router.get('/manage/contentTemps', function(req, res) {
  159. res.render('manage/contentTemps', adminFunc.setPageInfo(req,res,settings.contentTemps));
  160. });
  161. //模板编辑
  162. router.get('/manage/contentTempsEdit', function(req, res) {
  163. res.render('manage/contentTempsEdit', adminFunc.setPageInfo(req,res,settings.contentTempsEdit));
  164. });
  165. //文档留言管理(list)
  166. router.get('/manage/messageList', function(req, res) {
  167. res.render('manage/messageList', adminFunc.setPageInfo(req,res,settings.messageList));
  168. });
  169. //注册用户管理(list)
  170. router.get('/manage/regUsersList', function(req, res) {
  171. res.render('manage/regUsersList', adminFunc.setPageInfo(req,res,settings.regUsersList));
  172. });
  173. //管理员公告列表页面
  174. router.get('/manage/systemNotice', function(req, res) {
  175. req.query.area = 'announce';
  176. res.render('manage/adminNotice', adminFunc.setPageInfo(req,res,settings.systemNotice));
  177. });
  178. //用户消息管理列表
  179. router.get('/manage/userNotice', function(req, res) {
  180. res.render('manage/userNotice', adminFunc.setPageInfo(req,res,settings.userNotice));
  181. });
  182. //系统消息列表
  183. router.get('/manage/sysTemBackStageNotice', function(req, res) {
  184. req.query.area = 'systemNotice';
  185. adminFunc.renderToManagePage(req, res,'manage/systemNotice',settings.sysTemBackStageNotice);
  186. });
  187. //-------------------------后台模块访问入口结束----------------------------
  188. //-------------------------对象列表查询开始(带分页)-------------------------------
  189. router.get('/manage/getDocumentList/:defaultUrl',function(req,res){
  190. var targetObj = adminFunc.getTargetObj(req.params.defaultUrl);
  191. var params = url.parse(req.url,true);
  192. var keywords = params.query.searchKey;
  193. var area = params.query.area;
  194. var keyPr = [];
  195. //携带可能的查询条件
  196. if(keywords){
  197. var reKey = new RegExp(keywords, 'i');
  198. if(targetObj == Content){
  199. keyPr.push({'comments' : { $regex: reKey } });
  200. keyPr.push({'title' : { $regex: reKey } });
  201. }else if(targetObj == AdminUser){
  202. keyPr = {'userName' : { $regex: reKey} };
  203. }else if(targetObj == User){
  204. keyPr.push({'userName' : { $regex: reKey } });
  205. keyPr.push({'name' : { $regex: reKey } });
  206. }else if(targetObj == ContentTags){
  207. keyPr.push({'alias' : { $regex: reKey } });
  208. keyPr.push({'name' : { $regex: reKey } });
  209. }else if(targetObj == Ads){
  210. keyPr.push({'name' : { $regex: reKey } });
  211. }
  212. }
  213. keyPr = adminFunc.setQueryByArea(req,keyPr,targetObj,area);
  214. DbOpt.pagination(targetObj,req, res,keyPr);
  215. });
  216. //-------------------------对象列表查询结束(带分页)-------------------------------
  217. //-------------------------对象删除开始-------------------------
  218. router.get('/manage/:defaultUrl/del',function(req,res){
  219. var currentPage = req.params.defaultUrl;
  220. var params = url.parse(req.url,true);
  221. var targetObj = adminFunc.getTargetObj(currentPage);
  222. if(targetObj == Message){
  223. removeMessage(req,res)
  224. }else if(targetObj == Notify){
  225. adminFunc.delNotifiesById(req,res,params.query.uid,function(){
  226. res.end("success");
  227. });
  228. }else if(targetObj == UserNotify){
  229. //管理员删除系统消息
  230. if(currentPage == settings.sysTemBackStageNotice[0]){
  231. }
  232. }else if(targetObj == AdminGroup){
  233. if(params.query.uid == req.session.adminUserInfo.group._id){
  234. res.end('当前用户拥有的权限信息不能删除!');
  235. }else{
  236. DbOpt.del(targetObj,req,res,"del one obj success");
  237. }
  238. }else if(targetObj == AdminUser){
  239. if(params.query.uid == req.session.adminUserInfo._id){
  240. res.end('不能删除当前登录的管理员!');
  241. }else{
  242. Message.find({'adminAuthor' : params.query.uid},function(err,docs){
  243. if(err){
  244. res.end(err)
  245. }
  246. if(docs && docs.length>0){
  247. res.end('请清理您的评论后再删除该用户!');
  248. }else{
  249. DbOpt.del(targetObj,req,res,"del one obj success");
  250. }
  251. });
  252. }
  253. }else if(targetObj == ContentTemplate){
  254. removeTemplate(req,res);
  255. }else if(targetObj == Ads){
  256. removeAds(req,res);
  257. }else if(targetObj == TemplateItems){
  258. removeTemplateItem(req,res);
  259. }else{
  260. DbOpt.del(targetObj,req,res,"del one obj success");
  261. }
  262. });
  263. //批量删除对象
  264. router.get('/manage/:defaultUrl/batchDel',function(req,res){
  265. var currentPage = req.params.defaultUrl;
  266. var params = url.parse(req.url,true);
  267. var targetObj = adminFunc.getTargetObj(currentPage);
  268. var ids = params.query.ids;
  269. var idsArr = ids.split(',');
  270. if(targetObj == Message || targetObj == AdminGroup || targetObj == AdminUser || targetObj == Notify){
  271. res.end(settings.system_batch_delete_not_allowed);
  272. }else if(targetObj == UserNotify){
  273. //管理员删除系统消息
  274. if(currentPage == settings.sysTemBackStageNotice[0]){
  275. var nids = params.query.expandIds;
  276. var nidsArr = nids.split(',');
  277. if(nidsArr.length > 0){
  278. for(var i=0;i<nidsArr.length;i++){
  279. adminFunc.delNotifiesById(req,res,nidsArr[i]);
  280. }
  281. //更新消息数
  282. adminFunc.getAdminNotices(req,res,function(noticeObj){
  283. req.session.adminNotices = noticeObj;
  284. res.end('success');
  285. });
  286. }
  287. }
  288. }else{
  289. targetObj.remove({'_id':{$in: idsArr}},function(err){
  290. if(err){
  291. res.end(err);
  292. }else{
  293. res.end("success");
  294. }
  295. });
  296. }
  297. });
  298. //-------------------------对象删除结束-------------------------
  299. //-------------------------获取单个对象数据开始-------------------------
  300. router.get('/manage/:defaultUrl/item',function(req,res){
  301. var currentPage = req.params.defaultUrl;
  302. var targetObj = adminFunc.getTargetObj(currentPage);
  303. var params = url.parse(req.url,true);
  304. var targetId = params.query.uid;
  305. if(targetObj == AdminUser){
  306. AdminUser.getOneItem(res,targetId,function(user){
  307. return res.json(user);
  308. });
  309. }else if(targetObj == Ads){
  310. Ads.getOneAds(res,targetId,function(doc){
  311. return res.json(doc);
  312. });
  313. }else{
  314. DbOpt.findOne(targetObj,req, res,"find one obj success");
  315. }
  316. });
  317. //-------------------------获取单个对象数据结束-------------------------
  318. //-------------------------更新单条记录(执行更新)开始--------------------
  319. router.post('/manage/:defaultUrl/modify',function(req,res){
  320. var currentPage = req.params.defaultUrl;
  321. var targetObj = adminFunc.getTargetObj(currentPage);
  322. var params = url.parse(req.url,true);
  323. if(targetObj == AdminUser || targetObj == User){
  324. req.body.password = DbOpt.encrypt(req.body.password,settings.encrypt_key);
  325. }else if(targetObj == AdminGroup){
  326. if(params.query.uid == req.session.adminUserInfo.group._id){
  327. req.session.adminPower = req.body.power;
  328. }
  329. }else if(targetObj == ContentCategory){
  330. ContentCategory.updateCategoryTemps(req,res,params.query.uid);
  331. }
  332. DbOpt.updateOneByID(targetObj,req, res,"update one obj success")
  333. });
  334. //-------------------------更新单条记录(执行更新)结束--------------------
  335. //-------------------------对象新增开始-------------------------
  336. router.post('/manage/:defaultUrl/addOne',function(req,res){
  337. var currentPage = req.params.defaultUrl;
  338. var targetObj = adminFunc.getTargetObj(currentPage);
  339. if(targetObj == AdminUser){
  340. addOneAdminUser(req,res);
  341. }else if(targetObj == ContentCategory){
  342. addOneCategory(req,res)
  343. }else if(targetObj == Content){
  344. req.body.author = req.session.adminUserInfo._id;
  345. DbOpt.addOne(targetObj,req, res);
  346. }else if(targetObj == ContentTags){
  347. addOneContentTags(req,res)
  348. }else if(targetObj == ContentTemplate){
  349. addOneContentTemps(req,res)
  350. }else if(targetObj == Ads){
  351. addOneAds(req,res)
  352. }else if(targetObj == Message){
  353. replyMessage(req,res);
  354. }else if(targetObj == Notify){
  355. addOneNotice(req,res);
  356. }else{
  357. DbOpt.addOne(targetObj,req, res);
  358. }
  359. });
  360. //-------------------------对象新增结束-------------------------
  361. //----------------获取指定对象列表数据(不分页)开始-----------------
  362. //系统管理员用户组列表
  363. router.get('/manage/adminGroupList/list', function(req, res) {
  364. DbOpt.findAll(AdminGroup,req, res,"request adminGroupList")
  365. });
  366. //文件夹列表查询
  367. router.get('/manage/filesList/list', function(req, res) {
  368. var params = url.parse(req.url,true);
  369. var path = params.query.filePath;
  370. //避免伪造路径
  371. if(path.indexOf('../') >= 0){
  372. res.json({});
  373. }else{
  374. var filePath = system.scanFolder(settings.UPDATEFOLDER,path);
  375. // 对返回结果做初步排序
  376. filePath.sort(function(a,b){return a.type == "folder" || b.type == "folder"});
  377. return res.json({
  378. pathsInfo : filePath
  379. });
  380. }
  381. });
  382. //文章类别列表
  383. router.get('/manage/contentCategorys/list', function(req, res) {
  384. return res.json(ContentCategory.find({}).sort({'sortId': 1}));
  385. });
  386. //所有标签列表
  387. router.get('/manage/contentTags/list', function(req, res) {
  388. DbOpt.findAll(ContentTags,req, res,"request ContentTags List")
  389. });
  390. //所有默认模板列表
  391. router.get('/manage/contentTemps/list', function(req, res) {
  392. ContentTemplate.getDefaultTemp(res,function(doc){
  393. if(doc){
  394. return res.json(doc.items);
  395. }else{
  396. return res.json({});
  397. }
  398. });
  399. });
  400. //----------------获取指定对象列表数据(不分页)结束-----------------
  401. //删除留言
  402. function removeMessage(req,res){
  403. var params = url.parse(req.url,true);
  404. var targetId = params.query.uid;
  405. Message.findOne({_id : targetId},'contentId',function(err,result){
  406. if(err){
  407. res.end(err);
  408. }else{
  409. if(result && result.contentId){
  410. var contentId = result.contentId;
  411. Content.findOne({_id : contentId},function(err,contentObj){
  412. if(err){
  413. res.end(err);
  414. }else{
  415. Message.remove({_id : params.query.uid},function(err){
  416. if(contentObj && contentObj.commentNum && contentObj.commentNum > 0){
  417. contentObj.commentNum = contentObj.commentNum -1 ;
  418. contentObj.save(function(err){
  419. if(err){
  420. res.end(err);
  421. }else{
  422. res.end("success");
  423. }
  424. });
  425. }else{
  426. res.end("success");
  427. }
  428. });
  429. }
  430. });
  431. }
  432. }
  433. });
  434. }
  435. //添加系统用户
  436. function addOneAdminUser(req,res){
  437. var errors;
  438. var userName = req.body.userName;
  439. if(validator.isUserName(userName)){
  440. AdminUser.findOne({userName:req.body.userName},function(err,user){
  441. if(user){
  442. errors = "该用户名已存在!";
  443. res.end(errors);
  444. }else{
  445. if(!req.body.group){
  446. errors = "请选择用户组!";
  447. }
  448. if(errors){
  449. res.end(errors)
  450. }else{
  451. // 密码加密
  452. req.body.password = DbOpt.encrypt(req.body.password,settings.encrypt_key);
  453. req.body.group = new AdminGroup({_id : req.body.group});
  454. DbOpt.addOne(AdminUser,req, res);
  455. }
  456. }
  457. })
  458. }else{
  459. res.end(settings.system_illegal_param)
  460. }
  461. }
  462. //------------------------------------------系统用户管理结束
  463. //------------------------------------------文件管理器开始
  464. //文件删除
  465. router.get('/manage/filesList/fileDel', function(req, res) {
  466. var params = url.parse(req.url,true);
  467. var path = settings.UPDATEFOLDER + params.query.filePath;
  468. if(adminFunc.checkAdminPower(req,settings.filesList[0] + '_del')){
  469. if(path){
  470. system.deleteFolder(req, res, path,function(){
  471. res.end('success');
  472. });
  473. }else{
  474. res.end(settings.system_noPower);
  475. }
  476. }else{
  477. res.end(settings.system_noPower);
  478. }
  479. });
  480. //文件重命名
  481. router.post('/manage/filesList/fileReName', function(req, res) {
  482. var newPath = settings.UPDATEFOLDER + req.body.newPath;
  483. var path = settings.UPDATEFOLDER + req.body.path;
  484. if(adminFunc.checkAdminPower(req,settings.filesList[0] + '_modify')){
  485. if(path && newPath){
  486. system.reNameFile(req,res,path,newPath);
  487. }else{
  488. res.end(settings.system_noPower);
  489. }
  490. }else{
  491. res.end(settings.system_noPower);
  492. }
  493. });
  494. //修改文件内容读取文件信息
  495. router.get('/manage/filesList/getFileInfo', function(req, res) {
  496. if(adminFunc.checkAdminPower(req,settings.filesList[0] + '_view')){
  497. var params = url.parse(req.url,true);
  498. var path = settings.UPDATEFOLDER + params.query.filePath;
  499. if((params.query.filePath).indexOf('../') >= 0){
  500. res.end(settings.system_noPower);
  501. }
  502. if(path){
  503. system.readFile(req,res,path);
  504. }else{
  505. res.end(settings.system_noPower);
  506. }
  507. }else{
  508. return res.json({
  509. fileData : {}
  510. })
  511. }
  512. });
  513. //修改文件内容更新文件信息
  514. router.post('/manage/filesList/updateFileInfo', function(req, res) {
  515. var fileContent = req.body.code;
  516. var path = settings.UPDATEFOLDER + req.body.path;
  517. if(adminFunc.checkAdminPower(req,settings.filesList[0] + '_modify')){
  518. if(path){
  519. system.writeFile(req,res,path,fileContent);
  520. }else{
  521. res.end(settings.system_noPower);
  522. }
  523. }else{
  524. res.end(settings.system_noPower);
  525. }
  526. });
  527. //------------------------------------------文件管理器结束
  528. //------------------------------------------数据管理开始
  529. //备份数据库执行
  530. router.get('/manage/backupDataManage/backUp', function(req, res) {
  531. if(adminFunc.checkAdminPower(req,settings.backUpData[0] + '_backup')) {
  532. system.backUpData(res, req);
  533. }else{
  534. res.end(settings.system_noPower);
  535. }
  536. });
  537. //备份数据记录删除
  538. router.get('/manage/backupDataManage/delItem', function(req, res) {
  539. var params = url.parse(req.url,true);
  540. var forderPath = params.query.filePath;
  541. var targetId = params.query.uid;
  542. if(shortid.isValid(targetId)){
  543. if(adminFunc.checkAdminPower(req,settings.backUpData[0] + '_del')){
  544. DataOptionLog.remove({_id : targetId},function(err,result){
  545. if(err){
  546. res.end(err);
  547. }else{
  548. if(forderPath){
  549. system.deleteFolder(req, res,forderPath,function(){
  550. res.end('success');
  551. });
  552. }else{
  553. res.end("删除出错");
  554. }
  555. }
  556. })
  557. }else{
  558. res.end(settings.system_noPower);
  559. }
  560. }else{
  561. res.end(settings.system_illegal_param);
  562. }
  563. });
  564. //------------------------------------------数据管理结束
  565. //------------------------------------------文档管理面开始
  566. //文档添加页面(默认)
  567. router.get('/manage/content/add/:key', function(req, res) {
  568. var contentType = req.params.key;
  569. var targetPath;
  570. if(contentType == "plug"){
  571. targetPath = 'manage/addPlugs';
  572. }else{
  573. targetPath = 'manage/addContent';
  574. }
  575. res.render(targetPath, adminFunc.setPageInfo(req,res,settings.contentList));
  576. });
  577. //文档编辑页面
  578. router.get('/manage/content/edit/:type/:content', function(req, res) {
  579. var contentType = req.params.type;
  580. var targetPath;
  581. if(contentType == "plug"){
  582. targetPath = 'manage/addPlugs';
  583. }else{
  584. targetPath = 'manage/addContent';
  585. }
  586. res.render(targetPath, adminFunc.setPageInfo(req,res,settings.contentList));
  587. });
  588. //文章置顶
  589. router.get('/manage/ContentList/topContent', function(req, res) {
  590. var params = url.parse(req.url,true);
  591. var contentId = params.query.uid;
  592. var isTop = Number(params.query.isTop);
  593. if(shortid.isValid(contentId)){
  594. if(adminFunc.checkAdminPower(req,settings.contentList[0] + '_top')){
  595. Content.update({_id : contentId}, {'isTop' : isTop}, function (err,result) {
  596. if(err) throw err;
  597. res.end("success");
  598. })
  599. }else{
  600. res.end(settings.system_noPower);
  601. }
  602. }else{
  603. res.end(settings.system_illegal_param);
  604. }
  605. });
  606. //------------------------------------------文档分类管理开始
  607. //添加新类别
  608. function addOneCategory(req,res){
  609. var errors;
  610. var newObj = new ContentCategory(req.body);
  611. if(errors){
  612. res.end(errors);
  613. }else{
  614. newObj.save(function(err){
  615. if(err){
  616. console.log(err);
  617. }else{
  618. // 组合类别路径
  619. if(newObj.parentID == "0"){
  620. newObj.defaultUrl = newObj.homePage;
  621. }else{
  622. newObj.defaultUrl = newObj.defaultUrl + "/" +newObj.homePage;
  623. }
  624. // 保存完毕存储父类别结构
  625. newObj.sortPath = newObj.sortPath + "," +newObj._id.toString();
  626. newObj.save(function(err){
  627. console.log('save new type ok!');
  628. res.end("success");
  629. });
  630. }
  631. });
  632. }
  633. }
  634. //------------------------------------------文档标签开始
  635. //添加文档标签
  636. function addOneContentTags(req,res){
  637. var errors;
  638. var name = req.body.name;
  639. var alias = req.body.alias;
  640. var query=ContentTags.find().or([{'name' : name},{alias : alias}]);
  641. // 标签或别名不允许重复
  642. query.exec(function(err,tags){
  643. if(tags.length > 0){
  644. errors = "名称或者别名已存在!";
  645. res.end(errors);
  646. }else{
  647. DbOpt.addOne(ContentTags,req, res);
  648. }
  649. });
  650. }
  651. //------------------------------------------文档标签结束
  652. //------------------------------------------文档模板开始
  653. //文档模板管理(list)
  654. //添加文档模板
  655. function addOneContentTemps(req,res){
  656. var name = req.body.name;
  657. ContentTemplate.find({'name' : name},function(err,temp){
  658. if(err){
  659. res.end(err);
  660. }else{
  661. if(temp && temp.length > 0){
  662. res.end("名称不可重复!");
  663. }else{
  664. DbOpt.addOne(ContentTemplate,req, res);
  665. }
  666. }
  667. });
  668. }
  669. //读取模板文件夹信息
  670. router.get('/manage/contentTemps/folderList', function(req, res) {
  671. var params = url.parse(req.url,true);
  672. var targetForder = params.query.defaultTemp;
  673. var filePath = system.scanJustFolder(settings.SYSTEMTEMPFORDER + targetForder);
  674. var newFilePath = [];
  675. for(var i=0;i<filePath.length;i++){
  676. var fileObj = filePath[i];
  677. if(fileObj.name.split('-')[1] == 'stage'){
  678. newFilePath.push(fileObj);
  679. }
  680. }
  681. // 对返回结果做初步排序
  682. newFilePath.sort(function(a,b){return a.type == "folder" || b.type == "folder"});
  683. return res.json(newFilePath);
  684. });
  685. //安装模板 包含1、从服务器下载安装包 2、解压缩到本地目录 3、入库
  686. router.get('/manage/installTemp',function(req,res){
  687. if(adminFunc.checkAdminPower(req,settings.contentTemps[0] + '_add')){
  688. // App variables
  689. var params = url.parse(req.url,true);
  690. var tempId = params.query.tempId;
  691. request(settings.DORACMSAPI + '/system/template/getItem?tempId=' + tempId, function (error, response, body) {
  692. if (!error && response.statusCode == 200) {
  693. var tempObj = JSON.parse(body);
  694. var file_url = tempObj.filePath;
  695. var file_targetForlder = tempObj.alias;
  696. var DOWNLOAD_DIR = settings.SYSTEMTEMPFORDER + file_targetForlder.trim()+'/';
  697. var target_path = DOWNLOAD_DIR + url.parse(file_url).pathname.split('/').pop();
  698. if( fs.existsSync(DOWNLOAD_DIR) ) {
  699. res.end('您已安装该模板');
  700. }
  701. fs.mkdir(DOWNLOAD_DIR,0777,function(err){
  702. if(err){
  703. console.log(err);
  704. }
  705. else {
  706. download_file_httpget(file_url,function(){
  707. //下载完成后解压缩
  708. var extract = unzip.Extract({ path: DOWNLOAD_DIR });
  709. extract.on('error', function(err) {
  710. console.log(err);
  711. //解压异常处理
  712. });
  713. extract.on('finish', function() {
  714. console.log("解压完成!!");
  715. //解压完成处理入库操作
  716. var tempItem = new TemplateItems();
  717. tempItem.forder = "2-stage-default";
  718. tempItem.name = '默认模板';
  719. tempItem.isDefault = true;
  720. tempItem.save(function(err){
  721. if(err){
  722. res.end(err);
  723. }else{
  724. var newTemp = new ContentTemplate(tempObj);
  725. newTemp.using = false;
  726. newTemp.items.push(tempItem);
  727. newTemp.save(function(err1){
  728. if(err1){
  729. res.end(err1);
  730. }else{
  731. res.end('success');
  732. }
  733. });
  734. }
  735. });
  736. });
  737. fs.createReadStream(target_path).pipe(extract);
  738. });
  739. }
  740. });
  741. var download_file_httpget = function(file_url,callBack) {
  742. var options = {
  743. host: url.parse(file_url).host,
  744. port: 80,
  745. path: url.parse(file_url).pathname
  746. };
  747. var file_name = url.parse(file_url).pathname.split('/').pop();
  748. var file = fs.createWriteStream(DOWNLOAD_DIR + file_name);
  749. http.get(options, function(res) {
  750. res.on('data', function(data) {
  751. file.write(data);
  752. }).on('end', function() {
  753. file.end();
  754. callBack(DOWNLOAD_DIR);
  755. });
  756. });
  757. };
  758. }
  759. });
  760. }else{
  761. res.end(settings.system_noPower);
  762. }
  763. });
  764. //上传自定义模板
  765. router.post('/manage/updateCMSTemplate',function(req,res){
  766. var adminId = req.query.adminId;
  767. if(!shortid.isValid(adminId)){
  768. res.end(settings.system_illegal_param);
  769. }
  770. //uploadify上传会导致session丢失,暂时在第一道用原始方式鉴权,第一道并不安全,第二道会继续校验(安全)
  771. AdminUser.findOne({'_id':adminId}).populate('group').exec(function(err,doc){
  772. if(err){
  773. res.end(err);
  774. }else{
  775. var power = false;
  776. var uPower = doc.group.power;
  777. if(uPower){
  778. var newPowers = eval(uPower);
  779. var key = settings.contentTemps[0] + '_import';
  780. for(var i=0;i<newPowers.length;i++) {
  781. var checkedId = newPowers[i].split(':')[0];
  782. if(checkedId == key && newPowers[i].split(':')[1]){
  783. power = true;
  784. break;
  785. }
  786. }
  787. }
  788. if(power){
  789. system.uploadTemp(req,res,function(fname){
  790. var target_path = settings.SYSTEMTEMPFORDER + fname +'.zip';
  791. var DOWNLOAD_DIR = settings.SYSTEMTEMPFORDER + fname +'/';
  792. if( fs.existsSync(DOWNLOAD_DIR) ) {
  793. res.end('您已安装该模板');
  794. return;
  795. }
  796. var realType = system.getFileMimeType(target_path);
  797. if(realType.fileType != 'zip'){
  798. fs.unlinkSync(target_path);
  799. res.end('类型不正确');
  800. return;
  801. }
  802. fs.mkdir(DOWNLOAD_DIR,0777,function(err1) {
  803. if (err1) {
  804. console.log(err1);
  805. }
  806. else {
  807. //下载完成后解压缩
  808. var extract = unzip.Extract({ path: DOWNLOAD_DIR });
  809. extract.on('error', function(err) {
  810. console.log(err);
  811. //解压异常处理
  812. res.end(err);
  813. });
  814. extract.on('finish', function() {
  815. console.log("解压完成!!");
  816. //解压完成处理入库操作
  817. res.end('success&'+fname);
  818. });
  819. fs.createReadStream(target_path).pipe(extract);
  820. }
  821. });
  822. })
  823. }else{
  824. res.end(settings.system_noPower);
  825. }
  826. }
  827. });
  828. });
  829. //校验是否已经解压完成
  830. router.get('/manage/chekcIfUnzipSuccess',function(req,res){
  831. var params = url.parse(req.url,true);
  832. var targetForder = params.query.tempId;
  833. var tempForder = settings.SYSTEMTEMPFORDER + targetForder;
  834. var DOWNLOAD_DIR = settings.SYSTEMTEMPFORDER + targetForder + '/tempconfig.json';
  835. var DIST_DIR = settings.SYSTEMTEMPFORDER + targetForder + '/dist';
  836. var PUBLIC_DIR = settings.SYSTEMTEMPFORDER + targetForder + '/public';
  837. var USERS_DIR = settings.SYSTEMTEMPFORDER + targetForder + '/users';
  838. var TWOSTAGEDEFAULT_DIR = settings.SYSTEMTEMPFORDER + targetForder + '/2-stage-default';
  839. //权限校验
  840. if(adminFunc.checkAdminPower(req,settings.contentTemps[0] + '_import')){
  841. req.session.checkTempCount = 0;
  842. var tempTask = setInterval(function(){
  843. if( fs.existsSync(DOWNLOAD_DIR) && fs.existsSync(DIST_DIR) && fs.existsSync(PUBLIC_DIR)
  844. && fs.existsSync(USERS_DIR) && fs.existsSync(TWOSTAGEDEFAULT_DIR)) {
  845. clearInterval(tempTask);
  846. res.end('has');
  847. }else{
  848. req.session.checkTempCount = req.session.checkTempCount + 1;
  849. //请求超时,文件不完整
  850. if(req.session.checkTempCount > 10){
  851. system.deleteFolder(req, res,tempForder,function(){
  852. system.deleteFolder(req, res,tempForder + '.zip',function(){
  853. clearInterval(tempTask);
  854. res.end('imperfect');
  855. });
  856. });
  857. }
  858. }
  859. },3000);
  860. }else{
  861. system.deleteFolder(req, res,tempForder,function(){
  862. system.deleteFolder(req, res,tempForder + '.zip',function(){
  863. res.end('nopower');
  864. });
  865. });
  866. }
  867. });
  868. //初始化导入模板的数据
  869. router.get('/manage/initTempData',function(req,res){
  870. var params = url.parse(req.url,true);
  871. var targetForder = params.query.tempId;
  872. var tempForder = settings.SYSTEMTEMPFORDER + targetForder;
  873. if(adminFunc.checkAdminPower(req,settings.contentTemps[0] + '_import')){
  874. if(targetForder){
  875. var jsonPath = tempForder + '/tempconfig.json';
  876. fs.readFile(jsonPath,"binary",function (error,data) {
  877. if (error) {
  878. res.end(error)
  879. } else {
  880. //处理中文乱码问题
  881. var buf = new Buffer(data, 'binary');
  882. var newData = iconv.decode(buf, 'utf-8');
  883. var tempInfoData = eval("("+newData+")")[0];
  884. if(tempInfoData && tempInfoData.name && tempInfoData.alias && tempInfoData.version && tempInfoData.sImg && tempInfoData.author && tempInfoData.comment){
  885. adminFunc.checkTempInfo(tempInfoData,targetForder,function(data){
  886. if(data != 'success'){
  887. system.deleteFolder(req, res,tempForder,function(){
  888. system.deleteFolder(req, res,tempForder + '.zip',function(){
  889. res.end(data);
  890. });
  891. });
  892. }else{
  893. //复制静态文件到公共目录
  894. var fromPath = settings.SYSTEMTEMPFORDER + targetForder + '/dist/';
  895. var targetPath = settings.TEMPSTATICFOLDER + targetForder;
  896. system.copyForder(fromPath,targetPath);
  897. var tempItem = new TemplateItems();
  898. tempItem.forder = "2-stage-default";
  899. tempItem.name = '默认模板';
  900. tempItem.isDefault = true;
  901. tempItem.save(function(err){
  902. if(err){
  903. res.end(err);
  904. }else{
  905. var tempObj = {
  906. name: tempInfoData.name,
  907. alias : tempInfoData.alias,
  908. version : tempInfoData.version,
  909. sImg: '/themes/' + targetForder + tempInfoData.sImg,
  910. author: tempInfoData.author,
  911. comment : tempInfoData.comment
  912. };
  913. var newTemp = new ContentTemplate(tempObj);
  914. newTemp.using = false;
  915. newTemp.items.push(tempItem);
  916. newTemp.save(function(err1){
  917. if(err1){
  918. res.end(err1);
  919. }else{
  920. system.deleteFolder(req, res,tempForder + '.zip',function(){
  921. res.end('success');
  922. });
  923. }
  924. });
  925. }
  926. });
  927. }
  928. });
  929. }else{
  930. system.deleteFolder(req, res,tempForder,function(){
  931. system.deleteFolder(req, res,tempForder + '.zip',function(){
  932. res.end('请正确填写配置文件');
  933. });
  934. });
  935. }
  936. }
  937. });
  938. }else{
  939. res.end('文件不完整,请稍后重试!');
  940. }
  941. }else{
  942. res.end(settings.system_noPower);
  943. }
  944. });
  945. //启用模板
  946. router.get('/manage/enableTemp',function(req,res){
  947. var params = url.parse(req.url,true);
  948. var tempId = params.query.tempId;
  949. var alias = params.query.alias;
  950. if(adminFunc.checkAdminPower(req,settings.contentTemps[0] + '_modify')){
  951. var tempPath = system.scanJustFolder(settings.SYSTEMTEMPFORDER + alias);
  952. var distPath = false;
  953. for(var i=0;i<tempPath.length;i++){
  954. var fileObj = tempPath[i];
  955. if(fileObj.name == 'dist'){
  956. distPath = true;
  957. break;
  958. }
  959. }
  960. //服务器配置不同解压缩时间有所差异,暂时用该办法控制
  961. if(!distPath){
  962. res.end('服务器正在解压缩,请10s后重试!')
  963. }else{
  964. ContentTemplate.setTempState('',false,function(err){
  965. if(err){
  966. res.end(err);
  967. }else{
  968. ContentTemplate.setTempState(tempId,true,function(err1,doc){
  969. if(err1){
  970. res.end(err1);
  971. }else{
  972. //复制静态文件到公共目录
  973. var fromPath = settings.SYSTEMTEMPFORDER + doc.alias + '/dist/';
  974. var targetPath = settings.TEMPSTATICFOLDER + doc.alias;
  975. system.copyForder(fromPath,targetPath);
  976. ContentTemplate.getDefaultTemp(res,function(temp){
  977. if(temp){
  978. cache.set(settings.session_secret + '_siteTemplate', temp , 1000 * 60 * 60 * 24); // 修改默认模板缓存
  979. }
  980. //重置类别模板
  981. ContentCategory.update({},{$set:{contentTemp:''}},{multi : true},function(err2){
  982. if(err2){
  983. res.end(err2);
  984. }else{
  985. res.end('success');
  986. }
  987. });
  988. });
  989. }
  990. })
  991. }
  992. })
  993. }
  994. }else{
  995. res.end(settings.system_noPower);
  996. }
  997. });
  998. //添加模板单元
  999. router.post('/manage/templateItem/addNew',function(req,res){
  1000. var params = url.parse(req.url,true);
  1001. var defaultTemp = params.query.defaultTemp;
  1002. if(adminFunc.checkAdminPower(req,settings.CONTENTTEMPITEMS[0] + '_add')){
  1003. var tempItem = new TemplateItems(req.body);
  1004. tempItem.save(function(err){
  1005. if(err){
  1006. res.end(err);
  1007. }else{
  1008. ContentTemplate.getDefaultTemp(res,function(doc){
  1009. if(doc){
  1010. doc.items.push(tempItem);
  1011. doc.save(function(err1){
  1012. if(err1){
  1013. res.end(err1);
  1014. }else{
  1015. cache.set(settings.session_secret + '_siteTemplate', doc , 1000 * 60 * 60 * 24); // 修改默认模板缓存
  1016. res.end('success');
  1017. }
  1018. });
  1019. }else{
  1020. res.end(settings.system_illegal_param);
  1021. }
  1022. });
  1023. }
  1024. });
  1025. }else{
  1026. res.end(settings.system_noPower);
  1027. }
  1028. });
  1029. //删除模板单元
  1030. function removeTemplateItem(req,res){
  1031. var params = url.parse(req.url,true);
  1032. var targetId = params.query.uid;
  1033. if(shortid.isValid(targetId)){
  1034. TemplateItems.remove({_id : params.query.uid},function(err,result){
  1035. if(err){
  1036. res.end(err);
  1037. }else{
  1038. ContentTemplate.getDefaultTemp(res,function(doc){
  1039. if(doc){
  1040. var items = doc.items;
  1041. for(var i=0;i<items.length;i++){
  1042. if(items[i] == targetId){
  1043. items.splice(i,1);
  1044. break;
  1045. }
  1046. }
  1047. doc.items = items;
  1048. doc.save(function(err){
  1049. if(err){
  1050. res.end(err);
  1051. }else{
  1052. //更新缓存
  1053. cache.set(settings.session_secret + '_siteTemplate', doc , 1000 * 60 * 60 * 24); // 修改默认模板缓存
  1054. res.end("success");
  1055. }
  1056. });
  1057. }else{
  1058. res.end(settings.system_illegal_param);
  1059. }
  1060. });
  1061. }
  1062. })
  1063. }else{
  1064. res.end(settings.system_illegal_param);
  1065. }
  1066. }
  1067. //删除指定模板
  1068. function removeTemplate(req,res){
  1069. var params = url.parse(req.url,true);
  1070. var targetId = params.query.uid;
  1071. if(shortid.isValid(targetId)){
  1072. adminFunc.delRefObjById(res,ContentTemplate,TemplateItems,targetId,function(doc){
  1073. //删除模板文件夹
  1074. var tempPath = settings.SYSTEMTEMPFORDER + doc.alias;
  1075. var tempStaticPath = settings.TEMPSTATICFOLDER + doc.alias;
  1076. system.deleteFolder(req, res,tempPath,function(){
  1077. system.deleteFolder(req, res,tempStaticPath,function(){
  1078. res.end('success');
  1079. });
  1080. });
  1081. });
  1082. }else{
  1083. res.end(settings.system_illegal_param);
  1084. }
  1085. }
  1086. //获取右侧模板文件树
  1087. router.get('/manage/contentTemps/tempListByFolder', function(req, res) {
  1088. var params = url.parse(req.url,true);
  1089. var targetTemp = params.query.targetTemp;
  1090. if(adminFunc.checkAdminPower(req,settings.contentTemps[0] + '_view')){
  1091. if(targetTemp == 'undefined'){
  1092. ContentTemplate.getDefaultTemp(res,function(temp){
  1093. if(temp){
  1094. var tempTree = setTempData(temp.alias);
  1095. return res.json(tempTree);
  1096. }else{
  1097. return res.json({});
  1098. }
  1099. });
  1100. }else{
  1101. var tempTree = setTempData(targetTemp);
  1102. return res.json(tempTree);
  1103. }
  1104. }else{
  1105. return res.json({});
  1106. }
  1107. });
  1108. function setTempData(targetTemp){
  1109. var tempTree = [];
  1110. tempTree.push({
  1111. id : 'public',
  1112. pId:0,
  1113. name:"公用模块",
  1114. open:false
  1115. });
  1116. tempTree.push({
  1117. id : 'users',
  1118. pId:0,
  1119. name:"用户模块",
  1120. open:true
  1121. });
  1122. tempTree.push({
  1123. id : 'styles',
  1124. pId:0,
  1125. name:"模板样式",
  1126. open:true
  1127. });
  1128. tempTree.push({
  1129. id : 'js',
  1130. pId:0,
  1131. name:"模板js",
  1132. open:true
  1133. });
  1134. //读取ejs模板
  1135. var newPubPath = adminFunc.setTempParentId(system.scanFolder(settings.SYSTEMTEMPFORDER,targetTemp + "/public"),'public');
  1136. var newUserPath = adminFunc.setTempParentId(system.scanFolder(settings.SYSTEMTEMPFORDER,targetTemp + "/users"),'users');
  1137. newPubPath = newPubPath.concat(newUserPath);
  1138. //读取静态文件
  1139. if( fs.existsSync(settings.TEMPSTATICFOLDER + targetTemp) ) {
  1140. var newStylePath = adminFunc.setTempParentId(system.scanFolder(settings.TEMPSTATICFOLDER , targetTemp + "/css"),'styles');
  1141. var newJsPath = adminFunc.setTempParentId(system.scanFolder(settings.TEMPSTATICFOLDER , targetTemp + "/js"),'js');
  1142. newPubPath = newPubPath.concat(newStylePath).concat(newJsPath)
  1143. }
  1144. //读取模板单元
  1145. var filePath = system.scanJustFolder(settings.SYSTEMTEMPFORDER + targetTemp);
  1146. var tempUnit = [];
  1147. tempUnit.push({
  1148. id : 'tempUnit',
  1149. pId:0,
  1150. name : '模板单元',
  1151. open:true
  1152. });
  1153. for(var i=0;i<filePath.length;i++){
  1154. var fileObj = filePath[i];
  1155. if(fileObj.name.split('-')[1] == 'stage'){
  1156. tempUnit.push({
  1157. id : fileObj.name,
  1158. pId: 'tempUnit',
  1159. name : fileObj.name,
  1160. open:true
  1161. });
  1162. var unitArr = system.scanFolder(settings.SYSTEMTEMPFORDER , targetTemp + '/' + fileObj.name);
  1163. var newUnitArr = adminFunc.setTempParentId(unitArr,fileObj.name);
  1164. tempUnit = tempUnit.concat(newUnitArr);
  1165. }
  1166. }
  1167. if(tempUnit.length > 0){
  1168. newPubPath = newPubPath.concat(tempUnit);
  1169. }
  1170. //读取根目录下的所有文件
  1171. var rootArr = system.scanFolder(settings.SYSTEMTEMPFORDER , targetTemp);
  1172. var newRootArr = [];
  1173. for(var j=0;j<rootArr.length;j++){
  1174. var rootObj = rootArr[j];
  1175. if(rootObj.type == 'ejs'){
  1176. var rootFile = adminFunc.setTempParentId(rootObj,0);
  1177. newRootArr.push(rootFile);
  1178. }
  1179. }
  1180. if(newRootArr.length > 0) {
  1181. newPubPath = newPubPath.concat(newRootArr);
  1182. }
  1183. tempTree = tempTree.concat(newPubPath);
  1184. tempTree.sort();
  1185. return tempTree;
  1186. }
  1187. //修改文件内容读取文件信息
  1188. router.get('/manage/contentTemps/getFileInfo', function(req, res) {
  1189. if(adminFunc.checkAdminPower(req,settings.contentTemps[0] + '_view')){
  1190. var params = url.parse(req.url,true);
  1191. if((params.query.filePath).indexOf('../') >= 0){
  1192. res.end(settings.system_noPower);
  1193. }
  1194. var path = adminFunc.getTempBaseFile(params.query.filePath) + params.query.filePath;
  1195. if(path){
  1196. system.readFile(req,res,path);
  1197. }else{
  1198. res.end(settings.system_noPower);
  1199. }
  1200. }else{
  1201. return res.json({
  1202. fileData : {}
  1203. })
  1204. }
  1205. });
  1206. //修改文件内容更新文件信息
  1207. router.post('/manage/contentTemps/updateFileInfo', function(req, res) {
  1208. var fileContent = req.body.code;
  1209. if((req.body.path).indexOf('../') >= 0){
  1210. res.end(settings.system_noPower);
  1211. }
  1212. var path = adminFunc.getTempBaseFile(req.body.path) + req.body.path;
  1213. if(adminFunc.checkAdminPower(req,settings.contentTemps[0] + '_modify')){
  1214. if(path){
  1215. system.writeFile(req,res,path,fileContent);
  1216. }else{
  1217. res.end(settings.system_noPower);
  1218. }
  1219. }else{
  1220. res.end(settings.system_noPower);
  1221. }
  1222. });
  1223. //获取已安装的所有模板
  1224. router.get('/manage/contentTemps/tempFolderList', function(req, res) {
  1225. if(adminFunc.checkAdminPower(req,settings.contentTemps[0] + '_view')){
  1226. ContentTemplate.find({}).sort({using : -1}).populate('items').exec(function(err,docs){
  1227. if(err){
  1228. res.end(err);
  1229. }else{
  1230. return res.json(docs);
  1231. }
  1232. });
  1233. }else{
  1234. return res.json({});
  1235. }
  1236. });
  1237. //------------------------------------------文档模板结束
  1238. //------------------------------------------文档留言开始
  1239. //管理员回复用户
  1240. function replyMessage(req,res){
  1241. var errors;
  1242. var contentId = req.body.contentId;
  1243. var contentTitle = req.body.contentTitle;
  1244. var adminAuthorId = req.session.adminUserInfo._id;
  1245. var replyId = req.body.replyId;
  1246. var replyEmail = req.body.replyEmail;
  1247. var content = req.body.content;
  1248. var utype = req.body.utype;
  1249. var relationMsgId = req.body.relationMsgId;
  1250. if(!shortid.isValid(contentId) || !contentTitle){
  1251. errors = settings.system_illegal_param;
  1252. }
  1253. if(!adminAuthorId || !replyId){
  1254. errors = settings.system_illegal_param;
  1255. }
  1256. if(replyEmail && !validator.isEmail(replyEmail)){
  1257. errors = settings.system_illegal_param;
  1258. }
  1259. if(errors){
  1260. res.end(errors);
  1261. }else{
  1262. req.body.adminAuthor = new AdminUser({_id : adminAuthorId , userName : req.session.adminUserInfo.userName});
  1263. req.body.replyAuthor = new User({_id : replyId , email : replyEmail});
  1264. var newMsg = new Message(req.body);
  1265. newMsg.save(function(){
  1266. // 更新评论数
  1267. Content.updateCommentNum(contentId,'add',function(){
  1268. // 给用户发送提醒邮件
  1269. system.sendEmail(settings.email_notice_user_contentMsg,newMsg,function(err){
  1270. if(err){
  1271. res.end(err);
  1272. }
  1273. });
  1274. res.end("success");
  1275. });
  1276. });
  1277. }
  1278. }
  1279. //------------------------------文档留言结束------------
  1280. //--------------------广告管理开始---------------------------
  1281. //广告添加页面
  1282. router.get('/manage/ads/addTxt', function(req, res) {
  1283. adminFunc.renderToManagePage(req, res,'manage/addTxtAds',settings.adsList);
  1284. });
  1285. //初始化添加图片广告
  1286. router.get('/manage/ads/addImg', function(req, res) {
  1287. if(adminFunc.checkAdminPower(req,settings.adsList[0] + '_add')){
  1288. var newImgAds = new Ads({
  1289. name : '默认图片广告',
  1290. state : '1',
  1291. type : '1'
  1292. });
  1293. newImgAds.save(function(err){
  1294. if(err){
  1295. res.end(err);
  1296. }
  1297. res.redirect('/admin/manage/ads/addImgAds/'+newImgAds._id);
  1298. })
  1299. }else{
  1300. adminFunc.renderToManagePage(req, res,'manage/addSliderAds',settings.adsList);
  1301. }
  1302. });
  1303. router.get('/manage/ads/addImgAds/:defaultUrl', function(req, res) {
  1304. adminFunc.renderToManagePage(req, res,'manage/addSliderAds',settings.adsList);
  1305. });
  1306. //添加图片广告单元
  1307. router.post('/manage/adsItems/addItem', function(req, res) {
  1308. var params = url.parse(req.url,true);
  1309. var adsId = params.query.adsId;
  1310. if(adminFunc.checkAdminPower(req,settings.adsList[0] + '_add')){
  1311. Ads.findOne({'_id' : adsId},function(err,doc){
  1312. if(doc){
  1313. newAdsItem = new AdsItems(req.body);
  1314. newAdsItem.save(function(err){
  1315. if(err){
  1316. res.end(err);
  1317. }else{
  1318. doc.items.push(newAdsItem);
  1319. doc.save(function(err1){
  1320. if(err1){
  1321. res.end(err1);
  1322. }
  1323. res.end("success");
  1324. });
  1325. }
  1326. });
  1327. }else{
  1328. res.end(settings.system_illegal_param);
  1329. }
  1330. })
  1331. }else{
  1332. res.end(settings.system_noPower);
  1333. }
  1334. });
  1335. //修改图片广告单元
  1336. router.post('/manage/adsItems/modifyItem', function(req, res) {
  1337. var params = url.parse(req.url,true);
  1338. var adsId = params.query.adsId;
  1339. if(adminFunc.checkAdminPower(req,settings.adsList[0] + '_modify')){
  1340. Ads.findOne({'_id' : adsId},function(err,doc){
  1341. if(doc){
  1342. DbOpt.updateOneByID(AdsItems,req,res,'');
  1343. }else{
  1344. res.end(settings.system_illegal_param);
  1345. }
  1346. })
  1347. }else{
  1348. res.end(settings.system_noPower);
  1349. }
  1350. });
  1351. //删除图片单元
  1352. router.get('/manage/adsItems/delItem', function(req, res) {
  1353. var params = url.parse(req.url,true);
  1354. var adsId = params.query.adsId;
  1355. if(adminFunc.checkAdminPower(req,settings.adsList[0] + '_del')){
  1356. adminFunc.delSonRefObjById(res,Ads,AdsItems,adsId,params.query.uid,function(){
  1357. res.end("success");
  1358. });
  1359. }else{
  1360. res.end(settings.system_noPower);
  1361. }
  1362. });
  1363. //查询单个图片单元
  1364. router.get('/manage/adsItems/findItem',function(req,res){
  1365. if(adminFunc.checkAdminPower(req,settings.adsList[0] + '_view')){
  1366. DbOpt.findOne(AdsItems,req,res,'');
  1367. }else{
  1368. res.end(settings.system_noPower);
  1369. }
  1370. });
  1371. //新增广告(文本广告)
  1372. function addOneAds(req,res){
  1373. var name = req.body.name;
  1374. var type = req.body.type;
  1375. var title = req.body.title;
  1376. var link = req.body.link;
  1377. if(adminFunc.checkAdminPower(req,settings.adsList[0] + '_add')){
  1378. var adsItemObj = new AdsItems({
  1379. title : req.body.title,
  1380. link : req.body.link
  1381. });
  1382. adsItemObj.save(function(err){
  1383. if(err){
  1384. res.end(err);
  1385. }else{
  1386. var adsObj = new Ads(req.body);
  1387. adsObj.items.push(adsItemObj);
  1388. adsObj.save(function(err1){
  1389. if(err1){
  1390. res.end(err1);
  1391. }
  1392. res.end('success');
  1393. })
  1394. }
  1395. })
  1396. }else{
  1397. res.end(settings.system_noPower);
  1398. }
  1399. }
  1400. //广告编辑页面
  1401. router.get('/manage/ads/edit/:content', function(req, res) {
  1402. adminFunc.renderToManagePage(req, res,'manage/addTxtAds',settings.adsList);
  1403. });
  1404. //修改文本广告
  1405. router.post('/manage/sysTemManage_ads/modifyTxtAds', function(req, res) {
  1406. var params = url.parse(req.url,true);
  1407. var adsId = params.query.uid;
  1408. var name = req.body.name;
  1409. var type = req.body.type;
  1410. var state = req.body.state;
  1411. var title = req.body.title;
  1412. var link = req.body.link;
  1413. if(adminFunc.checkAdminPower(req,settings.adsList[0] + '_modify')){
  1414. Ads.findOneAndUpdate({'_id':adsId},{$set : {'name':name,'type':type,'state':state}},function(err,doc){
  1415. if(err){
  1416. res.end(err);
  1417. }
  1418. if(doc){
  1419. AdsItems.update({'_id' : doc.items[0]},{$set : {'title':title,'link':link}},function(err1){
  1420. if(err1){
  1421. res.end(err1)
  1422. }else{
  1423. res.end('success');
  1424. }
  1425. })
  1426. }else{
  1427. res.end(settings.system_illegal_param)
  1428. }
  1429. });
  1430. }else{
  1431. res.end(settings.system_noPower);
  1432. }
  1433. });
  1434. //删除指定广告
  1435. function removeAds(req,res){
  1436. var params = url.parse(req.url,true);
  1437. var targetId = params.query.uid;
  1438. adminFunc.delRefObjById(res,Ads,AdsItems,targetId,function(){
  1439. res.end('success');
  1440. });
  1441. }
  1442. //--------------------消息管理开始---------------------------
  1443. //管理员公告编辑页面
  1444. router.get('/manage/adminNotice/edit/:noticeId', function(req, res) {
  1445. res.render('manage/addNotice', adminFunc.setPageInfo(req,res,settings.systemNotice));
  1446. });
  1447. //管理员公告新增页面
  1448. router.get('/manage/adminNotice/add', function(req, res) {
  1449. res.render('manage/addNotice', adminFunc.setPageInfo(req,res,settings.systemNotice));
  1450. });
  1451. function addOneNotice(req,res){
  1452. req.body.type = '1';
  1453. req.body.adminSender = new AdminUser({_id : req.session.adminUserInfo._id});
  1454. var notify = new Notify(req.body);
  1455. notify.save(function(err){
  1456. if(err){
  1457. res.end(err);
  1458. }else{
  1459. User.find({},'_id',function (err,users) {
  1460. if(err){
  1461. res.end(err);
  1462. }else{
  1463. if(users.length > 0){
  1464. for(var i=0;i<users.length;i++){
  1465. var userNotify = new UserNotify();
  1466. userNotify.user = users[i]._id;
  1467. userNotify.notify = notify;
  1468. userNotify.save(function(err){
  1469. if(err){
  1470. res.end(err);
  1471. }
  1472. });
  1473. }
  1474. }
  1475. res.end('success');
  1476. }
  1477. });
  1478. }
  1479. });
  1480. }
  1481. //设置为已读消息
  1482. router.get('/userNotify/setHasRead',function(req,res){
  1483. var params = url.parse(req.url,true);
  1484. var currentId = params.query.msgId;
  1485. if(adminFunc.checkAdminPower(req,settings.sysTemBackStageNotice[0] + '_modify')){
  1486. if(currentId){
  1487. UserNotify.setHasRead(currentId,function(err){
  1488. if(err){
  1489. res.end(err);
  1490. }else{
  1491. adminFunc.getAdminNotices(req,res,function(noticeObj){
  1492. req.session.adminNotices = noticeObj;
  1493. res.end('success');
  1494. });
  1495. }
  1496. });
  1497. }else{
  1498. res.end(settings.system_illegal_param);
  1499. }
  1500. }else{
  1501. res.end(settings.system_noPower);
  1502. }
  1503. });
  1504. module.exports = router;