chanjs 1.0.22 → 1.0.23

Sign up to get free protection for your applications and to get access to all the features.
package/README.md CHANGED
@@ -76,7 +76,7 @@ Chan.js 基于express 纯js研发的轻量级mvc框架。基于函数式编程
76
76
  * 多模块mvc
77
77
  * 插件mvc
78
78
  * 支持cors跨域配置
79
- * mysql数据库支持
79
+ * mysql数据库支持
80
80
  * 路由控制
81
81
  * art-template模板
82
82
  * 静态资源
package/core/chan.js CHANGED
@@ -5,29 +5,30 @@ const Controller = require("./lib/controller/controller.js")
5
5
  const Service = require("./lib/service/service.js")
6
6
  const path = require("path");
7
7
  const fs = require("fs");
8
- const core = require("./lib/core.js");
8
+ const core = require("./lib/index.js");
9
9
  const cors = require('cors');
10
10
 
11
11
  /**
12
12
  * @description 基于express封装的mvc框架,遵循约定优于配置原则
13
13
  */
14
14
  class Chan {
15
+ static config = {};
16
+ //模块
17
+ static modules = {};
18
+ //插件
19
+ static plugins = {};
20
+ //工具
21
+ static helper = {};
22
+ static Controller = null;
23
+ static Service = null;
15
24
  constructor(options={}) {
16
25
  //配置
17
26
  Chan.config = {...config,...options};
18
- //模块
19
- Chan.modules ={};
20
- //插件
21
- Chan.plugins ={};
22
- //工具
23
- Chan.helper ={};
24
-
25
27
  //控制器基类
26
28
  Chan.Controller = Controller;
27
-
28
29
  //应用实例
29
30
  this.app = express();
30
- this.app.config = Chan.config;
31
+ // this.app.config = Chan.config;
31
32
  this.router = express.Router();
32
33
  //加载配置
33
34
  this.loadConfig();
@@ -54,17 +55,18 @@ class Chan {
54
55
 
55
56
  // 加载配置
56
57
  loadConfig() {
57
- const configPath = path.join(config.APP_PATH, "config/index.js");
58
+ const configPath = path.join(Chan.config.APP_PATH, "config/index.js");
58
59
  if (fs.existsSync(configPath)) {
59
60
  const config = require(configPath);
60
- let allConfig = {...Chan.config,...config};
61
- this.app.config = Chan.config = allConfig;
61
+ // let allConfig = {...Chan.config,...config};
62
+ // this.app.config = Chan.config = allConfig;
63
+ Chan.config = {...Chan.config,...config};
62
64
  }
63
65
  }
64
66
 
65
67
  // 加载扩展
66
68
  loadExtends() {
67
- const extendPath = path.join(config.APP_PATH, "extend");
69
+ const extendPath = path.join(Chan.config.APP_PATH, "extend");
68
70
  if (fs.existsSync(extendPath)) {
69
71
  let controllers = fs
70
72
  .readdirSync(extendPath)
@@ -82,7 +84,16 @@ class Chan {
82
84
  //数据库操作
83
85
  loadKnex(){
84
86
  // 连接数据库
85
- const {host,port,user,password,database,client='mysql2',charset} = Chan.config.database;
87
+ const {
88
+ host='localhost',
89
+ port='3306',
90
+ user,
91
+ password,
92
+ database,
93
+ client='mysql2',
94
+ charset='utf8mb4'
95
+ } = Chan.config.database;
96
+
86
97
  const knex = require("knex")({
87
98
  client: client,
88
99
  connection: {
@@ -93,7 +104,7 @@ class Chan {
93
104
  database,
94
105
  charset,
95
106
  },
96
- debug: config.debug, //指明是否开启debug模式,默认为true表示开启
107
+ debug: Chan.config.debug, //指明是否开启debug模式,默认为true表示开启
97
108
  pool: {
98
109
  //指明数据库连接池的大小,默认为{min: 2, max: 10}
99
110
  min: 0,
@@ -108,6 +119,7 @@ class Chan {
108
119
  },
109
120
  },
110
121
  });
122
+
111
123
  //数据库操作实例
112
124
  Chan.knex = knex;
113
125
  //数据库操作基类
@@ -140,14 +152,15 @@ class Chan {
140
152
  * @description app核心模块:日志、favicon 图标、cookie、json、url、模板引擎、静态资源
141
153
  */
142
154
  loadCore(){
143
- core(this.app);
155
+ console.log()
156
+ core(this.app, Chan.config);
144
157
  }
145
158
 
146
159
  /**
147
160
  * @description 模块加载入口(路由&控制器& 服务)
148
161
  */
149
162
  loadModules(modules='modules') {
150
- const configPath = path.join(config.APP_PATH,modules);
163
+ const configPath = path.join(Chan.config.APP_PATH,modules);
151
164
  if (fs.existsSync(configPath)) {
152
165
  const dirs = fs
153
166
  .readdirSync(configPath, { withFileTypes: true })
@@ -185,7 +198,7 @@ class Chan {
185
198
  * @param {*} moduleName 模块名称
186
199
  */
187
200
  loadServices(modules,moduleName) {
188
- const servicesDir = path.join(config.APP_PATH, modules, moduleName,"service");
201
+ const servicesDir = path.join(Chan.config.APP_PATH, modules, moduleName,"service");
189
202
  if (fs.existsSync(servicesDir)) {
190
203
  let services = fs
191
204
  .readdirSync(servicesDir)
@@ -208,7 +221,7 @@ class Chan {
208
221
  * @param {*} moduleName 模块名称
209
222
  */
210
223
  loadControllers(modules,moduleName) {
211
- const controllersDir = path.join(config.APP_PATH, modules, moduleName,"controller");
224
+ const controllersDir = path.join(Chan.config.APP_PATH, modules, moduleName,"controller");
212
225
  if (fs.existsSync(controllersDir)) {
213
226
  let controllers = fs
214
227
  .readdirSync(controllersDir)
@@ -229,7 +242,7 @@ class Chan {
229
242
  * @param {*} moduleName 模块名称
230
243
  */
231
244
  loadRoutes(modules,moduleName) {
232
- const routersDir = path.join(config.APP_PATH, modules, moduleName,"router.js");
245
+ const routersDir = path.join(Chan.config.APP_PATH, modules, moduleName,"router.js");
233
246
  if (fs.existsSync(routersDir)) {
234
247
  const routes = require(routersDir);
235
248
  routes({router:this.router,modules:Chan[modules],app:this.app});
@@ -239,10 +252,10 @@ class Chan {
239
252
  //通用路由,加载错误处理和500路由和爬虫处理
240
253
  loadCommonRouter(){
241
254
  try {
242
- const baseRouterPath = path.join(config.APP_PATH, "router.js");
255
+ const baseRouterPath = path.join(Chan.config.APP_PATH, "router.js");
243
256
  if (fs.existsSync(baseRouterPath)) {
244
257
  const _router = require(baseRouterPath);
245
- _router(this.app, this.router);
258
+ _router(this.app, this.router,Chan.config);
246
259
  }
247
260
  } catch (error) {
248
261
  console.log(error);
@@ -250,7 +263,7 @@ class Chan {
250
263
  }
251
264
 
252
265
  run() {
253
- const port = this.app.config.port || '81';
266
+ const port = Chan.config.port || '81';
254
267
  this.app.listen(port, () => {
255
268
  console.log(`Server is running on port ${port}`);
256
269
  });
@@ -3,10 +3,10 @@ const cookieParser = require("cookie-parser");
3
3
  const favicon = require("serve-favicon");
4
4
  const morgan = require("morgan");
5
5
  const path = require("path");
6
- const view = require("./middleware/view.js");
7
- module.exports = async function (app) {
6
+ const template = require("./middleware/template.js");
7
+ module.exports = async function (app,config) {
8
8
  const { logger, APP_PATH, cookieKey, maxAge, JSON_LIMIT, appName, version } =
9
- app.config;
9
+ config;
10
10
  //日志
11
11
  app.use(morgan(logger.level));
12
12
 
@@ -21,7 +21,7 @@ module.exports = async function (app) {
21
21
  app.use(express.urlencoded({ extended: false }));
22
22
 
23
23
  //配置模板引擎
24
- view(app);
24
+ template(app,config);
25
25
 
26
26
  //使用静态资源 ,
27
27
  app.use(
@@ -33,7 +33,7 @@ module.exports = async function (app) {
33
33
 
34
34
  //设置头信息
35
35
  app.use((req, res, next) => {
36
- res.setHeader("mvc", "Chanjs");
36
+ res.setHeader("Create-By", "Chanjs");
37
37
  res.setHeader("X-Powered-By", appName);
38
38
  res.setHeader(appName, version);
39
39
  next();
@@ -1,7 +1,7 @@
1
1
  const path = require("path");
2
- module.exports = (app) => {
2
+ module.exports = (app,config) => {
3
3
  const
4
- { APP_PATH, views,env } = app.config;
4
+ { APP_PATH, views,env } = config;
5
5
  //默认home view
6
6
  const home = path.join(APP_PATH, `modules/web/view`);
7
7
  //合并插件中的view
@@ -1,28 +1,191 @@
1
1
  class BaseService {
2
+ /**
3
+ * @description 构造函数
4
+ * @param {*} knex - knex实例
5
+ * @param {*} model - 模型名称
6
+ */
2
7
  constructor(knex, model='') {
3
8
  this.knex = knex;
4
9
  this.model = model;
5
10
  }
6
11
 
12
+ /**
13
+ * @description 查找所有符合条件的记录
14
+ * @param {*} query - 查询条件,例如:{name: 'test', age: 18}
15
+ * @returns {Promise} 返回符合条件的记录
16
+ */
17
+ query(query) {
18
+ return this.knex(this.model).where(query);
19
+ }
20
+
21
+ /**
22
+ * @description 查询表所有记录,慎用
23
+ * @returns {Promise} 返回所有记录
24
+ */
7
25
  all() {
8
26
  return this.knex(this.model).select();
9
27
  }
10
28
 
11
- detail(id) {
29
+ /**
30
+ * @description 查询指定id的记录
31
+ * @param {*} id
32
+ * @returns {Promise} 返回指定id的记录
33
+ */
34
+ findById(id) {
35
+ return this.knex(this.model).where('id', id).first();
36
+ }
37
+
38
+ /**
39
+ * @description 查询分页数据
40
+ * @param {*} current
41
+ * @param {*} pageSize
42
+ * @param {*} query
43
+ * @returns {Promise} 返回分页数据
44
+ */
45
+ async findListAndQuery(current = 1, pageSize = 10, query = {}) {
46
+ const offset = (current - 1) * pageSize;
47
+
48
+ let countQuery = this.knex(this.model).count('* as total');
49
+ let dataQuery = this.knex(this.model);
50
+
51
+ // 应用查询条件
52
+ for (const key in query) {
53
+ dataQuery = dataQuery.where(key, query[key]);
54
+ countQuery = countQuery.where(key, query[key]);
55
+ }
56
+
57
+ // 获取总记录数
58
+ const total = await countQuery.first();
59
+
60
+ // 获取分页数据
61
+ const data = await dataQuery.offset(offset).limit(pageSize);
62
+
63
+ return { data, total: parseInt(total.total, 10) };
64
+ }
65
+
66
+ /**
67
+ * @description 查询指定id的记录
68
+ * @param {*} id - 记录id
69
+ * @returns {Promise} 返回指定id的记录
70
+ */
71
+ findOneById(id) {
12
72
  return this.knex(this.model).where('id', id).select();
13
73
  }
14
74
 
75
+ /**
76
+ * @description 查询指定条件的记录
77
+ * @param {Object} query - {<key>:<value>}
78
+ * @returns {Promise} 返回指定条件的记录
79
+ */
80
+ findOne(query) {
81
+ return this.knex(this.model).where(query).first();
82
+ }
83
+
84
+ /**
85
+ * @description 更新指定id的记录
86
+ * @param {*} id - 记录id
87
+ * @param {*} params - {<key>:<value>}
88
+ * @returns {Promise} 返回更新后的记录
89
+ */
90
+ findOneAndUpdate(id, params) {
91
+ return this.knex(this.model).where('id', id).update(params).returning('*');
92
+ }
93
+
94
+
95
+ /**
96
+ * @description 查询指定条件的记录数量
97
+ * @param {*} query - {<key>:<value>}
98
+ * @returns {Promise} 返回指定条件的记录数量
99
+ */
100
+ count(query) {
101
+ return this.knex(this.model).where(query).count('* as total').first();
102
+ }
103
+
104
+ /**
105
+ * @description 插入一条记录
106
+ * @param {*} params - {<key>:<value>}
107
+ * @returns {Promise} 返回插入后的记录
108
+ */
15
109
  insert(params) {
16
110
  return this.knex(this.model).insert(params);
17
111
  }
18
112
 
19
- update(id, params) {
113
+ /**
114
+ * @description 插入多条记录
115
+ * @param {*} records - [{<key>:<value>}, {<key>:<value>}, ...]
116
+ * @returns {Promise} 返回插入后的记录
117
+ */
118
+ insertMany(records) {
119
+ return this.knex(this.model).insert(records);
120
+ }
121
+
122
+ /**
123
+ * @description 更新指定id的记录
124
+ * @param {*} id - 记录id
125
+ * @param {*} params - {<key>:<value>}
126
+ * @returns {Promise} 返回更新后的记录
127
+ */
128
+ updateById(id, params) {
20
129
  return this.knex(this.model).where('id', id).update(params);
21
130
  }
22
131
 
23
- delete(id) {
132
+ /**
133
+ * @description 更新数据
134
+ * @param {*} query - {<key>:<value>}
135
+ * @param {*} update - {<key>:<value>}
136
+ * @returns {Promise<*>} - 返回更新后的数据
137
+ */
138
+ update(query, update) {
139
+ return this.knex(this.model).where(query).update(update);
140
+ }
141
+
142
+ /**
143
+ * @description 查询并更新
144
+ * @param {*} query - {<key>:<value>}
145
+ * @param {*} update - {<key>:<value>}
146
+ * @returns {Promise<*>} - 返回更新后的记录
147
+ */
148
+ findAndModify(query, update) {
149
+ return this.knex(this.model).where(query).update(update);
150
+ }
151
+
152
+ /**
153
+ *
154
+ * @param {*} id - id
155
+ * @param {*} update - {<key>:<value>}
156
+ * @returns {Promise<*>} - 返回更新后的记录
157
+ */
158
+ findByIdAndUpdate(id, update) {
159
+ return this.knex(this.model).where('id', id).update(update);
160
+ }
161
+
162
+ /**
163
+ * @description 根据条件更新记录
164
+ * @param {*} query - {<key>:<value>}
165
+ * @param {*} update - {<key>:<value>}
166
+ * @returns {Promise} - 返回更新后的记录
167
+ */
168
+ findOneAndUpdate(query, update) {
169
+ return this.knex(this.model).where(query).update(update);
170
+ }
171
+
172
+ /**
173
+ * @description 根据id删除一条记录
174
+ * @param {*} id - 记录id
175
+ * @returns {Promise} - 返回删除的记录
176
+ */
177
+ findByIdAndRemove(id) {
24
178
  return this.knex(this.model).where('id', id).del();
25
179
  }
180
+
181
+ /**
182
+ * @description 根据条件删除一条记录
183
+ * @param {*} query
184
+ * @returns {Promise} - 返回删除的记录
185
+ */
186
+ findOneAndRemove(query) {
187
+ return this.knex(this.model).where(query).del();
188
+ }
26
189
  }
27
190
 
28
191
  const Service = (knex, model='') => {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "chanjs",
3
- "version": "1.0.22",
3
+ "version": "1.0.23",
4
4
  "description": "Chan.js基于express 纯js研发的轻量级mvc框架。",
5
5
  "main": "core/chan.js",
6
6
  "module": "core/chan.js",
@@ -22,5 +22,8 @@
22
22
  "knex": "^3.1.0",
23
23
  "morgan": "^1.10.0",
24
24
  "mysql2": "^3.11.0"
25
- }
25
+ },
26
+ "__npminstall_done": true,
27
+ "_from": "chanjs@1.0.22",
28
+ "_resolved": "https://registry.npmmirror.com/chanjs/-/chanjs-1.0.22.tgz"
26
29
  }
package/core/lib/base.js DELETED
@@ -1,35 +0,0 @@
1
- const express = require("express");
2
- const cookieParser = require("cookie-parser");
3
- const favicon = require("serve-favicon");
4
- const morgan = require("morgan");
5
- const path = require("path");
6
-
7
- const view = require("./middleware/view.js");
8
- module.exports = async function (app) {
9
-
10
- const { logger,APP_PATH, cookieKey, maxAge } = app.config;
11
- //日志
12
- app.use(morgan(logger.level));
13
-
14
- // favicon 图标
15
- app.use(favicon(path.join(APP_PATH, "public/favicon.ico")));
16
-
17
- //cookie
18
- app.use(cookieParser(cookieKey));
19
-
20
- //解析接口 json & url
21
- app.use(express.json());
22
- app.use(express.urlencoded({ extended: false }));
23
-
24
- //配置模板引擎
25
- view(app);
26
-
27
- //使用静态资源 ,
28
- app.use(
29
- "/public",
30
- express.static(path.join(APP_PATH, "public"), {
31
- maxAge:maxAge,
32
- })
33
- );
34
-
35
- };
@@ -1,31 +0,0 @@
1
- const path = require("path");
2
- const dealRouter = (app,router) => {
3
-
4
- const {config:{template='default',APP_PATH}} = app;
5
- //机器人抓取
6
- router.get("/robots.txt", function (req, res, next) {
7
- res.type('text/plain');
8
- res.sendFile(path.join(APP_PATH, "/public/robots.txt"));
9
- });
10
-
11
- //404处理
12
- router.use((req, res, next) => {
13
- let ip = req.headers["x-forwarded-for"] || req.ip;
14
- console.log("404-->", `${req.method}-${decodeURI(req.url)}-${ip}`);
15
- res.render(`${template}/404.html`);
16
- });
17
-
18
- //处理错误
19
- router.use((err, req, res) => {
20
- console.error("500-->", req.method, req.url, err);
21
- let data = { url: req.url, method: req.method, error: err.message };
22
- if (req.is("html") || req.is("html") == null) {
23
- res.render(`${template}/500.html`, { data });
24
- } else {
25
- res.json({ code: 500, data, msg: data.error });
26
- }
27
- });
28
-
29
- };
30
-
31
- module.exports = dealRouter;