Skip to content

Commit 8550be2

Browse files
authored
Merge branch 'master' into develop
2 parents ef0a434 + d1d85d4 commit 8550be2

7 files changed

Lines changed: 158 additions & 41 deletions

File tree

README.md

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,9 +33,9 @@ Lin-CMS 是林间有风团队经过大量项目实践所提炼出的一套**内
3333

3434
### 当前最新版本
3535

36-
lin-cms-koa(当前示例工程):0.3.6
36+
lin-cms-koa(当前示例工程):0.3.9
3737

38-
lin-mizar(核心库) :0.3.5
38+
lin-mizar(核心库) :0.3.8
3939

4040
### 文档地址
4141

@@ -63,7 +63,20 @@ QQ 群号:643205479 / 814597236
6363

6464
## 版本日志
6565

66-
最新版本 `0.3.6`
66+
最新版本 `0.3.9`
67+
68+
### 0.3.9
69+
70+
1. `F` 修复 logger 第二次模板解析错误的问题
71+
2. `U` 更新 lin-mizar 到 0.3.8
72+
73+
### 0.3.8
74+
75+
1. `F` 修复 缺少 mysql2
76+
77+
### 0.3.7
78+
79+
1. `U` 优化 编辑用户至少选择一个分组
6780

6881
### 0.3.6
6982

app/api/v1/book.js

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,6 @@ import { getSafeParamId } from '../../lib/util';
1010
import { BookNotFound } from '../../lib/exception';
1111
import { BookDao } from '../../dao/book';
1212

13-
console.log(disableLoading)
14-
1513
// book 的红图实例
1614
const bookApi = new LinRouter({
1715
prefix: '/v1/book',

app/middleware/logger.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ function findAuthAndModule (ctx) {
7474
return routeMetaInfo.get(endpoint);
7575
}
7676

77-
/** f
77+
/**
7878
* 解析模板
7979
* @param template 消息模板
8080
* @param user 用户

app/validator/admin.js

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -40,11 +40,8 @@ class ResetPasswordValidator extends PositiveIdValidator {
4040
class UpdateUserInfoValidator extends PositiveIdValidator {
4141
validateGroupIds (data) {
4242
const ids = data.body.group_ids;
43-
if (isOptional(ids)) {
44-
return true;
45-
}
46-
if (!Array.isArray(ids)) {
47-
return [false, '每个id值必须为正整数'];
43+
if (!Array.isArray(ids) || ids.length < 1) {
44+
return [false, '至少选择一个分组'];
4845
}
4946
for (let id of ids) {
5047
if (typeof id === 'number') {

package.json

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "lin-cms-koa",
3-
"version": "0.3.6",
3+
"version": "0.3.8",
44
"description": "simple and practical CMS implememted by koa",
55
"main": "app/starter.js",
66
"scripts": {
@@ -52,7 +52,8 @@
5252
"koa-bodyparser": "^4.2.1",
5353
"koa-mount": "^4.0.0",
5454
"koa-static": "^5.0.0",
55-
"lin-mizar": "^0.3.5",
55+
"lin-mizar": "^0.3.8",
56+
"mysql2": "^2.1.0",
5657
"sequelize": "^5.21.13",
5758
"validator": "^13.1.1"
5859
}

test/api/cms/admin.test.js

Lines changed: 100 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -20,24 +20,29 @@ describe('/cms/admin', () => {
2020

2121
let token;
2222

23-
beforeAll(async (done) => {
23+
beforeAll(async done => {
2424
console.log('start admin');
2525
// 初始化 app
2626
app = await createApp();
2727
done();
2828
});
2929

30-
afterAll(async (done) => {
30+
afterAll(async done => {
3131
setTimeout(async () => {
3232
await sequelize.close();
3333
done();
3434
}, 500);
3535
});
3636

37-
beforeEach(async (done) => {
37+
beforeEach(async done => {
3838
await sequelize.sync({ force: true });
3939
await UserModel.create({ username: 'root', nickname: 'root' });
40-
await UserIdentityModel.create({ user_id: 1, identity_type: IdentityType.Password, identifier: 'root', credential: 'sha1$c419e500$1$84869e5560ebf3de26b6690386484929456d6c07' });
40+
await UserIdentityModel.create({
41+
user_id: 1,
42+
identity_type: IdentityType.Password,
43+
identifier: 'root',
44+
credential: 'sha1$c419e500$1$84869e5560ebf3de26b6690386484929456d6c07'
45+
});
4146
await GroupModel.create({ name: 'root', info: '超级用户组', level: 1 });
4247
await GroupModel.create({ name: 'guest', info: '游客组', level: 2 });
4348
await UserGroupModel.create({ user_id: 1, group_id: 1 });
@@ -85,12 +90,21 @@ describe('/cms/admin', () => {
8590
});
8691

8792
it('插入用户信息、分组、权限,查询所有用户', async () => {
88-
const user = await UserModel.create({ username: 'shirmy', email: 'shirmy@gmail.com' });
93+
const user = await UserModel.create({
94+
username: 'shirmy',
95+
email: 'shirmy@gmail.com'
96+
});
8997
const group = await GroupModel.create({ name: '研发组', info: '研发大佬' });
9098
await UserGroupModel.create({ group_id: group.id, user_id: user.id });
9199

92-
const permission = await PermissionModel.create({ name: '查看信息', module: '信息' });
93-
await GroupPermissionModel.create({ group_id: group.id, permission_id: permission.id });
100+
const permission = await PermissionModel.create({
101+
name: '查看信息',
102+
module: '信息'
103+
});
104+
await GroupPermissionModel.create({
105+
group_id: group.id,
106+
permission_id: permission.id
107+
});
94108

95109
const response = await request(app.callback())
96110
.get('/cms/admin/users')
@@ -108,7 +122,10 @@ describe('/cms/admin', () => {
108122
});
109123

110124
it('修改用户密码', async () => {
111-
const user = await UserModel.create({ username: 'shirmy', email: 'shirmy@gmail.com' });
125+
const user = await UserModel.create({
126+
username: 'shirmy',
127+
email: 'shirmy@gmail.com'
128+
});
112129
const group = await GroupModel.create({ name: '研发组', info: '研发大佬' });
113130
await UserGroupModel.create({ group_id: group.id, user_id: user.id });
114131
await UserIdentityModel.create({
@@ -136,7 +153,10 @@ describe('/cms/admin', () => {
136153
});
137154

138155
it('删除用户', async () => {
139-
const user = await UserModel.create({ username: 'shirmy', email: 'shirmy@gmail.com' });
156+
const user = await UserModel.create({
157+
username: 'shirmy',
158+
email: 'shirmy@gmail.com'
159+
});
140160
const group = await GroupModel.create({ name: '研发组', info: '研发大佬' });
141161
await UserGroupModel.create({ group_id: group.id, user_id: user.id });
142162

@@ -152,7 +172,10 @@ describe('/cms/admin', () => {
152172
});
153173

154174
it('更新用户', async () => {
155-
const user = await UserModel.create({ username: 'shirmy', email: 'shirmy@gmail.com' });
175+
const user = await UserModel.create({
176+
username: 'shirmy',
177+
email: 'shirmy@gmail.com'
178+
});
156179
const group = await GroupModel.create({ name: '研发组', info: '研发大佬' });
157180
await UserGroupModel.create({ group_id: group.id, user_id: user.id });
158181

@@ -170,8 +193,14 @@ describe('/cms/admin', () => {
170193

171194
it('查询所有权限组及其权限', async () => {
172195
const group = await GroupModel.create({ name: '研发组', info: '研发大佬' });
173-
const permission = await PermissionModel.create({ name: '查看信息', module: '信息' });
174-
await GroupPermissionModel.create({ group_id: group.id, permission_id: permission.id });
196+
const permission = await PermissionModel.create({
197+
name: '查看信息',
198+
module: '信息'
199+
});
200+
await GroupPermissionModel.create({
201+
group_id: group.id,
202+
permission_id: permission.id
203+
});
175204

176205
const response = await request(app.callback())
177206
.get('/cms/admin/group')
@@ -186,8 +215,14 @@ describe('/cms/admin', () => {
186215

187216
it('查询所有权限组', async () => {
188217
const group = await GroupModel.create({ name: '研发组', info: '研发大佬' });
189-
const permission = await PermissionModel.create({ name: '查看信息', module: '信息' });
190-
await GroupPermissionModel.create({ group_id: group.id, permission_id: permission.id });
218+
const permission = await PermissionModel.create({
219+
name: '查看信息',
220+
module: '信息'
221+
});
222+
await GroupPermissionModel.create({
223+
group_id: group.id,
224+
permission_id: permission.id
225+
});
191226

192227
const response = await request(app.callback())
193228
.get('/cms/admin/group/all')
@@ -201,8 +236,14 @@ describe('/cms/admin', () => {
201236

202237
it('查询一个权限组及其权限', async () => {
203238
const group = await GroupModel.create({ name: '研发组', info: '研发大佬' });
204-
const permission = await PermissionModel.create({ name: '查看信息', module: '信息' });
205-
await GroupPermissionModel.create({ group_id: group.id, permission_id: permission.id });
239+
const permission = await PermissionModel.create({
240+
name: '查看信息',
241+
module: '信息'
242+
});
243+
await GroupPermissionModel.create({
244+
group_id: group.id,
245+
permission_id: permission.id
246+
});
206247

207248
const response = await request(app.callback())
208249
.get(`/cms/admin/group/${group.id}`)
@@ -211,12 +252,17 @@ describe('/cms/admin', () => {
211252
expect(response.status).toBe(200);
212253
expect(response.type).toMatch(/json/);
213254
expect(get(response, 'body.name')).toBe(group.name);
214-
const hasPermission = !!get(response, 'body.permissions').find(v => v.id === permission.id);
255+
const hasPermission = !!get(response, 'body.permissions').find(
256+
v => v.id === permission.id
257+
);
215258
expect(hasPermission).toBeTruthy();
216259
});
217260

218261
it('新建权限组', async () => {
219-
const permission = await PermissionModel.create({ name: '查看信息', module: '信息' });
262+
const permission = await PermissionModel.create({
263+
name: '查看信息',
264+
module: '信息'
265+
});
220266

221267
const response = await request(app.callback())
222268
.post('/cms/admin/group')
@@ -234,8 +280,14 @@ describe('/cms/admin', () => {
234280

235281
it('更新一个权限组', async () => {
236282
const group = await GroupModel.create({ name: '研发组', info: '研发大佬' });
237-
const permission = await PermissionModel.create({ name: '查看信息', module: '信息' });
238-
await GroupPermissionModel.create({ group_id: group.id, permission_id: permission.id });
283+
const permission = await PermissionModel.create({
284+
name: '查看信息',
285+
module: '信息'
286+
});
287+
await GroupPermissionModel.create({
288+
group_id: group.id,
289+
permission_id: permission.id
290+
});
239291

240292
const response = await request(app.callback())
241293
.put(`/cms/admin/group/${group.id}`)
@@ -267,7 +319,10 @@ describe('/cms/admin', () => {
267319

268320
it('分配单个权限', async () => {
269321
const group = await GroupModel.create({ name: '研发组', info: '研发大佬' });
270-
const permission = await PermissionModel.create({ name: '查看信息', module: '信息' });
322+
const permission = await PermissionModel.create({
323+
name: '查看信息',
324+
module: '信息'
325+
});
271326

272327
const response = await request(app.callback())
273328
.post('/cms/admin/permission/dispatch')
@@ -285,8 +340,14 @@ describe('/cms/admin', () => {
285340

286341
it('分配多个权限', async () => {
287342
const group = await GroupModel.create({ name: '研发组', info: '研发大佬' });
288-
const permission = await PermissionModel.create({ name: '查看信息', module: '信息' });
289-
const permission1 = await PermissionModel.create({ name: '查看研发组的信息', module: '信息' });
343+
const permission = await PermissionModel.create({
344+
name: '查看信息',
345+
module: '信息'
346+
});
347+
const permission1 = await PermissionModel.create({
348+
name: '查看研发组的信息',
349+
module: '信息'
350+
});
290351

291352
const response = await request(app.callback())
292353
.post('/cms/admin/permission/dispatch/batch')
@@ -304,10 +365,22 @@ describe('/cms/admin', () => {
304365

305366
it('删除多个权限', async () => {
306367
const group = await GroupModel.create({ name: '研发组', info: '研发大佬' });
307-
const permission = await PermissionModel.create({ name: '查看信息', module: '信息' });
308-
const permission1 = await PermissionModel.create({ name: '查看研发组的信息', module: '信息' });
309-
await GroupPermissionModel.create({ group_id: group.id, permission_id: permission.id });
310-
await GroupPermissionModel.create({ group_id: group.id, permission_id: permission1.id });
368+
const permission = await PermissionModel.create({
369+
name: '查看信息',
370+
module: '信息'
371+
});
372+
const permission1 = await PermissionModel.create({
373+
name: '查看研发组的信息',
374+
module: '信息'
375+
});
376+
await GroupPermissionModel.create({
377+
group_id: group.id,
378+
permission_id: permission.id
379+
});
380+
await GroupPermissionModel.create({
381+
group_id: group.id,
382+
permission_id: permission1.id
383+
});
311384

312385
const response = await request(app.callback())
313386
.post('/cms/admin/permission/remove')

yarn.lock

Lines changed: 36 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -900,6 +900,11 @@ ansi-styles@^4.1.0:
900900
"@types/color-name" "^1.1.1"
901901
color-convert "^2.0.1"
902902

903+
ansicolors@~0.3.2:
904+
version "0.3.2"
905+
resolved "http://192.168.199.38:8081/nexus/content/groups/npm_all/ansicolors/-/ansicolors-0.3.2.tgz#665597de86a9ffe3aa9bfbe6cae5c6ea426b4979"
906+
integrity sha1-ZlWX3oap/+Oqm/vmyuXG6kJrSXk=
907+
903908
any-promise@^1.0.0, any-promise@^1.1.0, any-promise@^1.3.0:
904909
version "1.3.0"
905910
resolved "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f"
@@ -1769,6 +1774,14 @@ capture-stack-trace@^1.0.0:
17691774
resolved "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.1.tgz#a6c0bbe1f38f3aa0b92238ecb6ff42c344d4135d"
17701775
integrity sha512-mYQLZnx5Qt1JgB1WEiMCf2647plpGeQ2NMR/5L0HNZzGQo4fuSPnK+wjfPnKZV0aiJDgzmWqqkV/g7JD+DW0qw==
17711776

1777+
cardinal@^2.1.1:
1778+
version "2.1.1"
1779+
resolved "http://192.168.199.38:8081/nexus/content/groups/npm_all/cardinal/-/cardinal-2.1.1.tgz#7cc1055d822d212954d07b085dea251cc7bc5505"
1780+
integrity sha1-fMEFXYItISlU0HsIXeolHMe8VQU=
1781+
dependencies:
1782+
ansicolors "~0.3.2"
1783+
redeyed "~2.1.0"
1784+
17721785
caseless@~0.12.0:
17731786
version "0.12.0"
17741787
resolved "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc"
@@ -2535,7 +2548,7 @@ espree@^5.0.1:
25352548
acorn-jsx "^5.0.0"
25362549
eslint-visitor-keys "^1.0.0"
25372550

2538-
esprima@^4.0.0, esprima@^4.0.1:
2551+
esprima@^4.0.0, esprima@^4.0.1, esprima@~4.0.0:
25392552
version "4.0.1"
25402553
resolved "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71"
25412554
integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==
@@ -4581,6 +4594,21 @@ mysql2@^1.6.5:
45814594
seq-queue "^0.0.5"
45824595
sqlstring "^2.3.1"
45834596

4597+
mysql2@^2.1.0:
4598+
version "2.1.0"
4599+
resolved "http://192.168.199.38:8081/nexus/content/groups/npm_all/mysql2/-/mysql2-2.1.0.tgz#55ecfd4353114c148cc4c253192dbbfd000e6642"
4600+
integrity sha1-Vez9Q1MRTBSMxMJTGS27/QAOZkI=
4601+
dependencies:
4602+
cardinal "^2.1.1"
4603+
denque "^1.4.1"
4604+
generate-function "^2.3.1"
4605+
iconv-lite "^0.5.0"
4606+
long "^4.0.0"
4607+
lru-cache "^5.1.1"
4608+
named-placeholders "^1.1.2"
4609+
seq-queue "^0.0.5"
4610+
sqlstring "^2.3.1"
4611+
45844612
mz-modules@^2.1.0:
45854613
version "2.1.0"
45864614
resolved "https://registry.npmjs.org/mz-modules/-/mz-modules-2.1.0.tgz#7f529877afd0d42f409a7463b96986d61cfbcf96"
@@ -5242,6 +5270,13 @@ realpath-native@^1.1.0:
52425270
dependencies:
52435271
util.promisify "^1.0.0"
52445272

5273+
redeyed@~2.1.0:
5274+
version "2.1.1"
5275+
resolved "http://192.168.199.38:8081/nexus/content/groups/npm_all/redeyed/-/redeyed-2.1.1.tgz#8984b5815d99cb220469c99eeeffe38913e6cc0b"
5276+
integrity sha1-iYS1gV2ZyyIEacme7v/jiRPmzAs=
5277+
dependencies:
5278+
esprima "~4.0.0"
5279+
52455280
regenerate@^1.2.1:
52465281
version "1.4.1"
52475282
resolved "https://registry.npmjs.org/regenerate/-/regenerate-1.4.1.tgz#cad92ad8e6b591773485fbe05a485caf4f457e6f"

0 commit comments

Comments
 (0)