chanjs 1.0.22 → 1.0.23

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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;