Przeglądaj źródła

上线前版本提交

asd123a20 1 rok temu
rodzic
commit
3d89299c82

+ 27 - 0
app/controller/catalogue.js

@@ -0,0 +1,27 @@
+'use strict';
+const Controller = require('egg').Controller;
+
+class CatalogueController extends Controller {
+  async create() {
+    const res = await this.ctx.service.catalogue.create(this.ctx.request.body);
+    this.ctx.body = res;
+  }
+  async update() {
+    const res = await this.ctx.service.catalogue.update(this.ctx.request.body);
+    this.ctx.body = res;
+  }
+  async delete() {
+    const res = await this.ctx.service.catalogue.delete(this.ctx.params);
+    this.ctx.body = res;
+  }
+  async query() {
+    const res = await this.ctx.service.catalogue.query(this.ctx.query);
+    this.ctx.body = res;
+  }
+  async fetch() {
+    const res = await this.ctx.service.catalogue.fetch(this.ctx.query);
+    this.ctx.body = res;
+  }
+}
+
+module.exports = CatalogueController;

+ 23 - 0
app/controller/column.js

@@ -0,0 +1,23 @@
+'use strict';
+const Controller = require('egg').Controller;
+
+class ColumnController extends Controller {
+  async create() {
+    const res = await this.ctx.service.column.create(this.ctx.request.body);
+    this.ctx.body = res;
+  }
+  async update() {
+    const res = await this.ctx.service.column.update(this.ctx.request.body);
+    this.ctx.body = res;
+  }
+  async delete() {
+    const res = await this.ctx.service.column.delete(this.ctx.params);
+    this.ctx.body = res;
+  }
+  async query() {
+    const res = await this.ctx.service.column.query(this.ctx.query);
+    this.ctx.body = res;
+  }
+}
+
+module.exports = ColumnController;

+ 1 - 1
app/controller/page.js

@@ -30,7 +30,7 @@ class PageController extends Controller {
   }
   async detailscode() {
     const { ctx } = this;
-    const res = await ctx.service.page.detailscode(ctx.query);
+    const res = await ctx.service.page.detailscode(ctx.params);
     ctx.body = res;
   }
 }

+ 4 - 0
app/model/AdminUser.js

@@ -35,6 +35,10 @@ module.exports = app => {
     id: {
       type: String,
     },
+    // 盐值
+    salt: {
+      type: String,
+    },
   });
   return mongoose.model('AdminUser', AdminUserSchema);
 };

+ 4 - 0
app/model/Content.js

@@ -43,6 +43,10 @@ module.exports = app => {
     menus: {
       type: String,
     },
+    // 绑定栏目
+    columns: {
+      type: Array,
+    },
     // 文章年
     year: {
       type: String,

+ 2 - 0
app/model/Menu.js

@@ -33,6 +33,8 @@ module.exports = app => {
     pages: {
       type: String,
     },
+    // 绑定栏目
+    column: { type: Array, required: false },
   });
   return mongoose.model('Menu', MenuSchema);
 };

+ 4 - 0
app/model/Page.js

@@ -34,6 +34,10 @@ module.exports = app => {
     id: {
       type: String,
     },
+    // 数据编码
+    code: {
+      type: String,
+    },
   });
   return mongoose.model('Page', PageSchema);
 };

+ 29 - 0
app/model/catalogue.js

@@ -0,0 +1,29 @@
+'use strict';
+const Schema = require('mongoose').Schema;
+const SchemaDefine = {
+  // 封面
+  thumbnail: { type: String },
+  // 内容
+  content: { type: String, required: false },
+  // 标题
+  name: { type: String, required: true },
+  // 描述
+  describe: { type: String, required: false },
+  // 状态
+  status: { type: String, required: true },
+  // 文件路经
+  url: { type: String, required: false },
+  // 文件名
+  filename: { type: String, required: false },
+  // 发布时间
+  date: { type: String, required: true },
+  // 期刊栏目
+  column: { type: String, required: false },
+  // 绑定栏目ID
+  bind: { type: Array, required: true },
+};
+const schema = new Schema(SchemaDefine);
+module.exports = app => {
+  const { mongoose } = app;
+  return mongoose.model('catalogue', schema, 'catalogue');
+};

+ 11 - 0
app/model/column.js

@@ -0,0 +1,11 @@
+'use strict';
+const Schema = require('mongoose').Schema;
+const SchemaDefine = {
+  code: { type: String, required: true },
+  name: { type: String, required: true },
+};
+const schema = new Schema(SchemaDefine);
+module.exports = app => {
+  const { mongoose } = app;
+  return mongoose.model('column', schema, 'column');
+};

+ 16 - 0
app/public/adminMenu.js

@@ -16,6 +16,14 @@ module.exports = [
     parentId: '1',
     module: '@wokes',
   },
+  {
+    title: '栏目管理',
+    path: '/wokes/column',
+    id: '1-6',
+    icons: 'el-icon-menu',
+    parentId: '1',
+    module: '@wokes',
+  },
   {
     title: '文章管理',
     path: '/wokes/content',
@@ -48,6 +56,14 @@ module.exports = [
     parentId: '1',
     module: '@wokes',
   },
+  {
+    title: '期刊管理',
+    path: '/wokes/journal',
+    id: '1-7',
+    icons: 'el-icon-files',
+    parentId: '1',
+    module: '@wokes',
+  },
   // 系统管理
   {
     title: '系统管理',

+ 13 - 2
app/router.js

@@ -6,8 +6,13 @@
 module.exports = app => {
   const { router, controller } = app;
   const jwt = app.middleware.jwt(app.config.jwt);
+  // 栏目
+  router.post('/api/column/create', controller.column.create);
+  router.post('/api/column/update', controller.column.update);
+  router.delete('/api/column/delete/:id', controller.column.delete);
+  router.get('/api/column/query', controller.column.query);
   // 系统用户
-  router.post('/api/adminUser/create', jwt, controller.adminUser.create);
+  router.post('/api/adminUser/create', controller.adminUser.create);
   router.post('/api/adminUser/update', jwt, controller.adminUser.update);
   router.post('/api/adminUser/pwdUpdate', jwt, controller.adminUser.pwdUpdate);
   router.delete('/api/adminUser/delete/:id', jwt, controller.adminUser.del);
@@ -41,7 +46,7 @@ module.exports = app => {
   router.delete('/api/page/delete/:id', jwt, controller.page.del);
   router.get('/api/page/query', controller.page.query);
   router.get('/api/page/details/:id', controller.page.details);
-  router.get('/api/page/details', controller.page.detailscode);
+  router.get('/api/page/detailscode/:code', controller.page.detailscode);
   // 文件
   router.post('/api/files/create', jwt, controller.files.create);
   router.post('/api/files/update', jwt, controller.files.update);
@@ -69,4 +74,10 @@ module.exports = app => {
   router.get('/api/configuration/query', controller.configuration.query);
   // 系统菜单
   router.get('/api/adminmenu/query', controller.adminnenu.query);
+  // 期刊目录
+  router.post('/api/catalogue/create', controller.catalogue.create);
+  router.post('/api/catalogue/update', controller.catalogue.update);
+  router.delete('/api/catalogue/delete/:id', controller.catalogue.delete);
+  router.get('/api/catalogue/query', controller.catalogue.query);
+  router.get('/api/catalogue/fetch', controller.catalogue.fetch);
 };

+ 4 - 4
app/service/adminUser.js

@@ -21,7 +21,7 @@ class adminUserService extends Service {
     // sm3 加盐加密
     password = sm3(`${password}:${salt}`);
     try {
-      const res = await model.create({ acct, password, userName, phone, createAt, state, roleList });
+      const res = await model.create({ acct, password, userName, phone, createAt, state, roleList, salt });
       return { errmsg: '', errcode: 0, res };
     } catch (error) {
       console.log(error);
@@ -44,10 +44,10 @@ class adminUserService extends Service {
       throw new Error('修改失败');
     }
   }
-  async pwdUpdate({ password, userName, confirmPwd }) {
-    assert(userName, '用户名不存在');
+  async pwdUpdate({ acct, password, userName, confirmPwd }) {
+    assert(acct, '账号不存在');
     const { AdminUser: model } = this.ctx.model;
-    const user = await model.findOne({ userName });
+    const user = await model.findOne({ acct });
     if (!user) return { errcode: -1001, errmsg: '用户不存在', data: '' };
     const cpwd = sm3(`${confirmPwd}:${user.salt}`);
     if (user.password !== cpwd) return { errcode: -1001, errmsg: '原密码不正确', data: '' };

+ 82 - 0
app/service/catalogue.js

@@ -0,0 +1,82 @@
+'use strict';
+
+const assert = require('assert');
+const Service = require('egg').Service;
+class CatalogueService extends Service {
+  constructor(ctx) {
+    super(ctx);
+    this.model = this.ctx.model.Catalogue;
+  }
+  async create({ content, name, describe, status, url, date, column, bind, filename, thumbnail }) {
+    assert(name, '名称不存在');
+    assert(date, '发布时间不存在');
+    assert(status, '状态不存在');
+    assert(bind, '绑定ID不存在');
+    try {
+      const res = await this.model.create({ content, name, describe, status, url, date, column, bind, filename, thumbnail });
+      return { errcode: 0, errmsg: 'ok', data: res };
+    } catch (error) {
+      throw error;
+    }
+  }
+  async update({ id, content, name, describe, status, url, date, column, bind, filename, thumbnail }) {
+    assert(id, 'id不存在');
+    try {
+      await this.model.updateOne({ _id: id }, { content, name, describe, status, url, date, column, bind, filename, thumbnail });
+      return { errcode: 0, errmsg: 'ok', data: '' };
+    } catch (error) {
+      throw error;
+    }
+  }
+  async delete({ id }) {
+    assert(id, 'id不存在');
+    try {
+      console.log(this.model);
+      await this.model.deleteOne({ _id: id });
+      return { errcode: 0, errmsg: 'ok', data: '' };
+    } catch (error) {
+      throw error;
+    }
+  }
+  async query({ skip, limit, name, status, date, column, bind }) {
+    const filter = {};
+    const arr = { name, status, date, column, bind };
+    for (const e in arr) {
+      let datas;
+      if (e === 'bind') {
+        console.log(arr[e]);
+        datas = `{ "${e}": { "$elemMatch": { "$eq": "${arr[e]}" } } }`;
+      } else {
+        datas = `{ "${e}": { "$regex": "${arr[e]}" } }`;
+      }
+      if (arr[e]) {
+        filter.$or = [];
+        filter.$or.push(JSON.parse(datas));
+      }
+    }
+    try {
+      const total = await this.model.find({ ...filter });
+      let res;
+      if (skip && limit) {
+        res = await this.model.find({ ...filter }, { content: false }).skip(Number(skip) * Number(limit)).limit(Number(limit))
+          .sort({ date: 1 });
+      } else {
+        res = await this.model.find({ ...filter }, { content: false }).sort({ date: 1 });
+      }
+      return { errcode: 0, errmsg: 'ok', data: res, total: total.length };
+    } catch (error) {
+      throw error;
+    }
+  }
+  async fetch({ id }) {
+    assert(id, 'id不存在');
+    try {
+      const res = await this.model.findOne({ _id: id });
+      return { errcode: 0, errmsg: 'ok', data: res };
+    } catch (error) {
+      throw error;
+    }
+  }
+}
+
+module.exports = CatalogueService;

+ 65 - 0
app/service/column.js

@@ -0,0 +1,65 @@
+'use strict';
+
+const assert = require('assert');
+const Service = require('egg').Service;
+class ColumnService extends Service {
+  constructor(ctx) {
+    super(ctx);
+    this.model = this.ctx.model.Column;
+    this.content = this.ctx.model.Content;
+    this.menu = this.ctx.model.Menu;
+    this.imgnews = this.ctx.model.Imgnews;
+  }
+  async create({ name, code }) {
+    assert(name, '名称不存在');
+    assert(code, '编码不存在');
+    try {
+      const res = await this.model.findOne({ code });
+      if (res) return { errcode: -1001, errmsg: '编码已存在', data: '' };
+      const item = await this.model.create({ name, code });
+      return { errcode: 0, errmsg: '', data: item };
+    } catch (error) {
+      throw error;
+    }
+  }
+  async update({ id, name }) {
+    assert(id, 'id不存在');
+    try {
+      const res = await this.model.findOne({ _id: id });
+      if (!res) return { errcode: -1001, errmsg: '数据不存在', data: '' };
+      await this.model.updateOne({ _id: id }, { name });
+      return { errcode: 0, errmsg: '', data: 'update' };
+    } catch (error) {
+      throw error;
+    }
+  }
+  async delete({ id }) {
+    assert(id, 'id不存在');
+    try {
+      await this.model.remove({ _id: id });
+      return { errcode: 0, errmsg: '', data: 'delete' };
+    } catch (error) {
+      throw error;
+    }
+  }
+  async query({ skip, limit, code, name }) {
+    const filter = {};
+    if (name || code) filter.$or = [];
+    if (code) filter.$or.push({ code: { $regex: code } });
+    if (name) filter.$or.push({ name: { $regex: name } });
+    try {
+      let res;
+      const total = await this.model.find({ ...filter });
+      if (skip && limit) {
+        res = await this.model.find({ ...filter }).skip(Number(skip) * Number(limit)).limit(Number(limit));
+      } else {
+        res = await this.model.find({ ...filter });
+      }
+      return { errcode: 0, errmsg: '', data: res, total: total.length };
+    } catch (error) {
+      throw error;
+    }
+  }
+}
+
+module.exports = ColumnService;

+ 22 - 13
app/service/content.js

@@ -4,7 +4,7 @@ const Service = require('egg').Service;
 const assert = require('assert');
 const moment = require('moment');
 class ContentService extends Service {
-  async create({ title, thumbnail, annex, content, istop, menus, date, annexname, term, sort }) {
+  async create({ title, thumbnail, annex, content, istop, menus, date, annexname, term, sort, columns }) {
     assert(title, '标题不存在');
     // assert(thumbnail, '缩略图不存在');
     assert(content, '内容不存在');
@@ -16,13 +16,13 @@ class ContentService extends Service {
     const slug = text.substring(0, 200);
     try {
       const year = date.slice(0, 4) + '年';
-      await model.create({ title, slug, thumbnail, annex, content, istop, menus, createAt, year, date, annexname, term, hits: 0, sort });
+      await model.create({ title, slug, thumbnail, annex, content, istop, menus, createAt, year, date, annexname, term, hits: 0, sort, columns });
       return { errmsg: '', errcode: 0 };
     } catch (error) {
       throw new Error('添加失败');
     }
   }
-  async update({ title, thumbnail, annex, content, istop, menus, date, annexname, term, _id, sort }) {
+  async update({ title, thumbnail, annex, content, istop, menus, date, annexname, term, _id, sort, columns }) {
     assert(_id, 'id不存在');
     const { Content: model } = this.ctx.model;
     let text = content.replace(new RegExp('</?[^>]+>', 'gm'), '');
@@ -30,7 +30,7 @@ class ContentService extends Service {
     const slug = text.substring(0, 200);
     const year = date.slice(0, 4) + '年';
     try {
-      await model.findById(_id).update({ title, slug, thumbnail, annex, content, istop, menus, year, date, annexname, term, sort });
+      await model.findById(_id).update({ title, slug, thumbnail, annex, content, istop, menus, year, date, annexname, term, sort, columns });
       return { errmsg: '', errcode: 0 };
     } catch (error) {
       throw new Error('修改失败');
@@ -61,12 +61,23 @@ class ContentService extends Service {
       throw new Error('删除失败');
     }
   }
-  async query({ skip, limit, title, code }) {
+  async query({ skip, limit, title, code, columns }) {
     const { Content: model } = this.ctx.model;
     const filter = {};
-    if (title) filter.title = title;
-    // 后续修改字段 columns - menus
-    if (code) filter.menus = code;
+    const arr = { title, code, columns };
+    for (const e in arr) {
+      let datas;
+      if (e === 'columns') {
+        console.log(arr[e]);
+        datas = `{ "${e}": { "$elemMatch": { "$eq": "${arr[e]}" } } }`;
+      } else {
+        datas = `{ "${e}": { "$regex": "${arr[e]}" } }`;
+      }
+      if (arr[e]) {
+        filter.$or = [];
+        filter.$or.push(JSON.parse(datas));
+      }
+    }
     let total = 0;
     try {
       let res;
@@ -88,12 +99,10 @@ class ContentService extends Service {
     try {
       const res = await model.find();
       for (let i = 0; i < res.length; i++) {
-        const content = res[i].content;
-        let txet = content.replace(new RegExp(/\/files\/images\/\d{6}\//, 'gm'), '/filespath/resource/');
-        txet = txet.replace(new RegExp(/JPG/, 'gm'), 'jpg');
-        await model.findById(res[i]._id).update({ ...res, content: txet });
+        const columns = [ res[i].menus ];
+        await model.findById(res[i]._id).update({ ...res, columns });
       }
-      return { errmsg: '', errcode: 0, res };
+      return { errmsg: '', errcode: 0 };
     } catch (error) {
       throw new Error('删除失败');
     }

+ 3 - 2
app/service/files.js

@@ -74,10 +74,10 @@ class FilesService extends Service {
       const index = filename.indexOf('.');
       const fileType = filename.slice(index, filename.length);
       const uuid = uuidv1();
-      const filepath = `/filespath/${type === 'files' ? 'files' : 'resource'}/${uuid}${fileType}`;
+      const filepath = `/filespath/${type}/${uuid}${fileType}`;
       const paths = path.join(`${this.app.config.filespath}${filepath}`);
 
-      // const filepath = `/public/${type === 'files' ? 'files' : 'resource'}/${uuid}${fileType}`;
+      // const filepath = `/public/${type}/${uuid}${fileType}`;
       // const paths = path.join(this.app.baseDir, `/app${filepath}`);
       // 存储
       const result = await new Promise((resolve, reject) => {
@@ -102,6 +102,7 @@ class FilesService extends Service {
       await this.ctx.service.files.create({ name: filename, path: filepath, type });
       return { errmsg: '', errcode: 0, data: { name: filename, path: filepath } };
     } catch (error) {
+      console.log(error, 'error');
       throw new Error('上传失败');
     }
   }

+ 4 - 7
app/service/menu.js

@@ -4,7 +4,7 @@ const Service = require('egg').Service;
 const assert = require('assert');
 const moment = require('moment');
 class MenuService extends Service {
-  async create({ name, code, state, type, uri, en, sort, pages }) {
+  async create({ name, code, state, type, uri, en, sort, pages, column }) {
     assert(name, '名称不存在');
     assert(code, '编码不存在');
     assert(state, '状态不存在');
@@ -16,17 +16,17 @@ class MenuService extends Service {
     try {
       const isdata = await model.find({ code });
       if (isdata.length > 0) return { errmsg: '编码已存在', errcode: -2001 };
-      await model.create({ name, code, createAt, state, type, uri, en, sort: Number(sort), pages });
+      await model.create({ name, code, createAt, state, type, uri, en, sort: Number(sort), pages, column });
       return { errmsg: '', errcode: 0 };
     } catch (error) {
       throw new Error('添加失败');
     }
   }
-  async update({ name, state, _id, uri, en, sort, pages }) {
+  async update({ name, state, _id, uri, en, sort, pages, column }) {
     assert(_id, 'id不存在');
     const { Menu: model } = this.ctx.model;
     try {
-      await model.findById(_id).update({ name, state, uri, en, sort: Number(sort), pages });
+      await model.findById(_id).update({ name, state, uri, en, sort: Number(sort), pages, column });
       return { errmsg: '', errcode: 0 };
     } catch (error) {
       throw new Error('修改失败');
@@ -51,9 +51,6 @@ class MenuService extends Service {
           if (list.length > 0) {
             return { errmsg: '存在绑定文章,请先删除文章', errcode: -1001 };
           }
-          // list.filter(async p => {
-          //   await Contentmodel.findById(p._id).update({ menus: '' });
-          // });
           break;
         }
         default: {

+ 6 - 6
app/service/page.js

@@ -4,30 +4,30 @@ const Service = require('egg').Service;
 const assert = require('assert');
 const moment = require('moment');
 class PageService extends Service {
-  async create({ title, annex, content, istop, annexname, date }) {
+  async create({ title, annex, content, istop, annexname, date, code }) {
     assert(title, '标题不存在');
     assert(content, '内容不存在');
-    assert(content, '内容不存在');
+    assert(code, '编码不存在');
     const { Page: model } = this.ctx.model;
     const createAt = moment().format('x');
     try {
       let text = content.replace(new RegExp('</?[^>]+>', 'gm'), '');
       text = text.replace('\\s*|\t|\r|\n', '');
       const slug = text.substring(0, 200);
-      await model.create({ title, slug, date, annex, content, istop, createAt, annexname });
+      await model.create({ title, slug, date, annex, content, istop, createAt, annexname, code });
       return { errmsg: '', errcode: 0 };
     } catch (error) {
       throw new Error('添加失败');
     }
   }
-  async update({ title, annex, content, istop, _id, annexname, date }) {
+  async update({ title, annex, content, istop, _id, annexname, date, code }) {
     assert(_id, 'id不存在');
     const { Page: model } = this.ctx.model;
     try {
       let text = content.replace(new RegExp('</?[^>]+>', 'gm'), '');
       text = text.replace('\\s*|\t|\r|\n', '');
       const slug = text.substring(0, 200);
-      await model.findById(_id).update({ title, date, slug, annex, content, istop, annexname });
+      await model.findById(_id).update({ title, date, slug, annex, content, istop, annexname, code });
       return { errmsg: '', errcode: 0 };
     } catch (error) {
       throw new Error('修改失败');
@@ -63,7 +63,7 @@ class PageService extends Service {
     assert(code, 'code不存在');
     const { Page: model } = this.ctx.model;
     try {
-      const res = await model.find({ menu: code });
+      const res = await model.findOne({ code });
       return { errmsg: '', errcode: 0, data: res };
     } catch (error) {
       throw new Error('删除失败');

+ 9 - 12
config/config.default.js

@@ -24,6 +24,11 @@ module.exports = appInfo => {
       ignoreJSON: true,
     },
   };
+  config.cluster = {
+    listen: {
+      port: 18099,
+    },
+  };
   config.cors = {
     origin: '*',
     allowMethods: 'GET,HEAD,PUT,POST,DELETE,PATCH,OPTIONS',
@@ -50,8 +55,11 @@ module.exports = appInfo => {
   config.userSecret = '123456';
   config.filespath = '/var/www/jjzh';
   // 数据库配置
+  config.mongoose = {
+    url: 'mongodb://127.0.0.1:27017/cms',
+  };
   // config.mongoose = {
-  //   url: 'mongodb://127.0.0.1:27017/cms',
+  //   url: 'mongodb://127.0.0.1:27018/cms',
   //   options: {
   //     user: 'root',
   //     pass: 'cms@cc-lotus',
@@ -61,17 +69,6 @@ module.exports = appInfo => {
   //     useUnifiedTopology: true,
   //   },
   // };
-  config.mongoose = {
-    url: 'mongodb://127.0.0.1:27017/cms',
-    options: {
-      // user: 'root',
-      // pass: 'cms@cc-lotus',
-      // authSource: 'admin',
-      // useNewUrlParser: true,
-      // useCreateIndex: true,
-      // useUnifiedTopology: true,
-    },
-  };
   // 异常捕获 路由拦截
   config.middleware = [ 'errorHandler' ];
   config.errorHandler = {

+ 1 - 0
config/error.log

@@ -0,0 +1 @@
+2022/12/13 13:57:45 [emerg] 1#1: "stream" directive is duplicate in /etc/nginx/nginx.conf:27

+ 1 - 0
config/routerMondel.js

@@ -14,4 +14,5 @@ module.exports = {
   'banner': '轮播图管理',
   'configuration': '站点配置',
   'power': '系统鉴权',
+  'catalogue': '期刊管理',
 };