Skip to content

Commit db7bef9

Browse files
committed
feat: add a api to get the comment configuration.
1 parent 748dae7 commit db7bef9

File tree

12 files changed

+325
-17
lines changed

12 files changed

+325
-17
lines changed

app/controller/api/base.js

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44

55
'use strict';
66

7+
const _ = require('lodash');
8+
79
const Controller = require('egg').Controller;
810
const Model = require('modelman').Model;
911
const is = require('ispro');
@@ -134,6 +136,24 @@ class BaseController extends Controller {
134136
return true;
135137
}
136138

139+
/**
140+
* 获取当前用户可展示数据
141+
*/
142+
async uinfo(isReturnAnonymous = false) {
143+
const { ctx, service, config } = this;
144+
let user = _.cloneDeep(ctx.locals.currentUser.user);
145+
if (!user._id) {
146+
if (isReturnAnonymous === true) {
147+
let _user = await service.api.back.user.findOne({_id: config.constant.anonymousUserId});
148+
user = _user._doc;
149+
}
150+
}
151+
delete user._id;
152+
delete user.password;
153+
user.token = ctx.locals.currentUser.token;
154+
return user;
155+
}
156+
137157
/**
138158
* 记录请求
139159
*/

app/controller/api/front/comment.js

Lines changed: 30 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,29 @@
44

55
'use strict';
66

7-
const BaseController = require('../base');
7+
const xss = require('xss');
88
const marked = require('marked');
99
const _ = require('lodash');
1010

11+
const BaseController = require('../base');
1112
const modelPath = `${process.cwd()}/app/model/proto`;
1213
let commentModel = require(`${modelPath}/comment`);
1314

1415
class CommentController extends BaseController {
16+
17+
/**
18+
* 获取评论配置
19+
*/
20+
async conf() {
21+
const { service } = this;
22+
const comment = await service.api.front.config.alias('comment');
23+
const site = await service.api.front.config.alias('site');
24+
let config = Object.assign(comment.info, {
25+
boolCommentLogin: site.info.boolCommentLogin,
26+
currentUser: await this.uinfo(true)
27+
});
28+
this.throwCorrect(config);
29+
}
1530

1631
/**
1732
* 获取评论列表
@@ -21,7 +36,7 @@ class CommentController extends BaseController {
2136
await this.decorator({
2237
get: {
2338
numberId: {
24-
n: '文章NumberId',
39+
n: '所属文章序号',
2540
type: 'Number',
2641
f: true,
2742
r: true
@@ -49,22 +64,23 @@ class CommentController extends BaseController {
4964
*/
5065
async create() {
5166
const {
52-
service
67+
service,
68+
config
5369
} = this;
5470
await this.decorator({
5571
post: {
56-
articleNumberId: { n: '所属文章序号', type: 'Number', f: true, t: true, r: true }, // 所属文章序号
72+
numberId: { n: '所属文章序号', type: 'Number', f: true, t: true, r: true }, // 所属文章序号
5773
mdContent: { n: '评论内容', type: 'String', f: true, t: false, r: true } // 评论的markdown内容
5874
}
5975
});
6076

61-
let userId = this.userId;
62-
let config = await service.api.front.config.alias('site');
63-
let site = config.info;
77+
let userId = this.userId;
78+
let siteConfig = await service.api.front.config.alias('site');
79+
let site = siteConfig.info;
6480
if (site.boolCommentLogin) {
6581
if (!userId) this.throwError('请登陆后再评论');
6682
} else {
67-
if (!userId) userId = '5c9648d94a4cf500067b6770';
83+
if (!userId) userId = config.constant.anonymousUserId;
6884
}
6985

7086
let params = this.params;
@@ -74,25 +90,26 @@ class CommentController extends BaseController {
7490
if (!user) this.throwError('用户不存在');
7591

7692
// 查找所属文章
77-
let article = await service.api.front.article.numberId(params.articleNumberId);
93+
let article = await service.api.front.article.numberId(params.numberId);
7894
if (!article) this.throwError('文章不存在');
7995

8096
// 赋值
97+
params.articleNumberId = params.numberId;
8198
params.articleId = article._id;
8299
params.userId = userId;
83100

84-
// 转化markdown代码
85-
if (params.mdContent) params.htContent = marked(params.mdContent);
101+
// 转化markdown代码,并过滤潜在的会导致xss攻击的代码。
102+
if (params.mdContent) params.htContent = marked(xss(params.mdContent));
86103

87104
// 创建评论
88105
let createRes = await service.api.front.comment.create(params);
89106

90107
if (createRes._id) {
91108
// 给文章增加评论数
92109
await service.api.front.article.updateComment(article._id);
93-
this.throwCorrect(createRes, '评论创建完成');
110+
this.throwCorrect(createRes, '评论成功');
94111
} else {
95-
this.throwError('评论创建失败');
112+
this.throwError('评论失败,未知错误。');
96113
}
97114
}
98115
}

app/middleware/user_get_info.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ module.exports = options => {
1313
let res = null;
1414
let currentUser = {
1515
user: {},
16+
token: token,
1617
auth: {
1718
isLogin: false,
1819
isExpired: true

app/routes/api/front/comment.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
/** 评论相关api */
22
module.exports = function(app) {
33
const { router, controller } = app;
4-
router.get('/api/front/comment/list', controller.api.front.comment.list); // 评论列表
4+
router.get('/api/front/comment/config', controller.api.front.comment.conf); // 获取评论配置
5+
router.get('/api/front/comment/list', controller.api.front.comment.list); // 获取评论列表
56
router.post('/api/front/comment/create', controller.api.front.comment.create); // 新增评论
67
}
Lines changed: 200 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,200 @@
1+
<!DOCTYPE html>
2+
<!-- saved from url=(0040)chrome-search://local-ntp/local-ntp.html -->
3+
<html darkmode="false"><!-- Copyright 2015 The Chromium Authors. All rights reserved.
4+
Use of this source code is governed by a BSD-style license that can be
5+
found in the LICENSE file. --><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
6+
<link rel="stylesheet" href="chrome-search://local-ntp/animations.css">
7+
<link rel="stylesheet" href="chrome-search://local-ntp/local-ntp-common.css">
8+
<link rel="stylesheet" href="chrome-search://local-ntp/custom-backgrounds.css">
9+
<link rel="stylesheet" href="chrome-search://local-ntp/doodles.css">
10+
<link rel="stylesheet" href="chrome-search://local-ntp/local-ntp.css">
11+
<link rel="stylesheet" href="chrome-search://local-ntp/theme.css">
12+
<link rel="stylesheet" href="chrome-search://local-ntp/voice.css">
13+
<meta http-equiv="Content-Security-Policy" content="object-src &#39;none&#39;;child-src chrome-search://most-visited/ https://*.google.com/ ;script-src &#39;strict-dynamic&#39; &#39;sha256-EVjR8L4xuo0c7UNzAtLmKQoojKIjdHqYIqdanwmukFQ=&#39; &#39;sha256-ps+f+kvXv/saiMZBvZdqrnWV6Gcxo4dQ9UAG6SXPM6M=&#39; &#39;sha256-YUYyUdaHPr4vPwR1MbbgywsO6nfhVmXMpy6ILGW3rKk=&#39; &#39;sha256-ydzrIpu7RPpN+/W1u5M3gE6zl+u6KRMtbQEzdDt/Uao=&#39; &#39;sha256-KNY16OU2yK5dZbn5VtmVD+8Nko2v7x2ZPfUGq+DvZEs=&#39; &#39;sha256-lj3Ybq0OcgGBTQmk7PbTtC0eH6NJaDsZHXnY9olO7Mk=&#39; &#39;sha256-Fd4vl8ndIuN6+ZRznHRIY8SInoMG8RWncO1Y0T/2GtM=&#39;;">
14+
<script src="chrome-search://local-ntp/animations.js" integrity="sha256-EVjR8L4xuo0c7UNzAtLmKQoojKIjdHqYIqdanwmukFQ="></script>
15+
<script src="chrome-search://local-ntp/config.js" integrity="sha256-Fd4vl8ndIuN6+ZRznHRIY8SInoMG8RWncO1Y0T/2GtM="></script>
16+
<script src="chrome-search://local-ntp/custom-backgrounds.js" integrity="sha256-ps+f+kvXv/saiMZBvZdqrnWV6Gcxo4dQ9UAG6SXPM6M="></script>
17+
<script src="chrome-search://local-ntp/doodles.js" integrity="sha256-YUYyUdaHPr4vPwR1MbbgywsO6nfhVmXMpy6ILGW3rKk="></script>
18+
<script src="chrome-search://local-ntp/local-ntp.js" integrity="sha256-ydzrIpu7RPpN+/W1u5M3gE6zl+u6KRMtbQEzdDt/Uao="></script>
19+
<script src="chrome-search://local-ntp/utils.js" integrity="sha256-KNY16OU2yK5dZbn5VtmVD+8Nko2v7x2ZPfUGq+DvZEs="></script>
20+
21+
<meta name="google" value="notranslate">
22+
<meta name="referrer" content="strict-origin">
23+
</head>
24+
<body class="light-chip mac inited" style="background: rgb(255, 255, 255);">
25+
<div id="custom-bg" style="opacity: 0;"></div>
26+
<!-- Container for the OneGoogleBar HTML. -->
27+
<div id="one-google" class="hidden"></div>
28+
29+
<div id="ntp-contents" class="default-theme">
30+
<div id="logo">
31+
<!-- The logo that is displayed in the absence of a doodle. -->
32+
<div id="logo-default" title="Google" class="show-logo"></div>
33+
<!-- Logo displayed when theme prevents doodles. Doesn't fade. -->
34+
<div id="logo-non-white" title="Google"></div>
35+
<!-- A doodle, if any: its link and image. -->
36+
<div id="logo-doodle">
37+
<div id="logo-doodle-container">
38+
<button id="logo-doodle-button">
39+
<img id="logo-doodle-image" tabindex="-1">
40+
</button>
41+
</div>
42+
<iframe id="logo-doodle-iframe" scrolling="no" src="./www_files/saved_resource.html"></iframe>
43+
<!-- A spinner, prompting the doodle. Visible on NTPs with customized
44+
backgrounds. -->
45+
<button id="logo-doodle-notifier" title="点击即可查看今日的涂鸦">
46+
<div class="outer ball0"><div class="inner"></div></div>
47+
<div class="outer ball1"><div class="inner"></div></div>
48+
<div class="outer ball2"><div class="inner"></div></div>
49+
<div class="outer ball3"><div class="inner"></div></div>
50+
</button>
51+
</div>
52+
</div>
53+
54+
<div id="fakebox-container">
55+
<div id="fakebox">
56+
<div id="fakebox-search-icon"></div>
57+
<div id="fakebox-text">在 Google 上搜索,或者输入一个网址</div>
58+
<input id="fakebox-input" autocomplete="off" tabindex="-1" type="url" aria-hidden="true">
59+
<div id="fakebox-cursor"></div>
60+
<button id="fakebox-microphone" title="语音搜索"></button>
61+
</div>
62+
</div>
63+
64+
<!-- TODO(crbug/944624): Remove wrapper after experiment is complete. -->
65+
<div id="user-content-wrapper">
66+
<div id="user-content">
67+
<!-- Search suggestions will be inserted here. -->
68+
<div id="most-visited" class="md-icons">
69+
<!-- The container for the tiles. The MV iframe goes in here. -->
70+
<div id="mv-tiles" class="md-icons"><iframe id="mv-single" name="mv-single" title="常去网站" src="./www_files/single.html"></iframe></div>
71+
<!-- Notification shown when a tile is blacklisted. -->
72+
<div id="mv-notice-container">
73+
<div id="mv-notice" class="notice-hide" role="alert">
74+
<span id="mv-msg">已移除快捷方式</span>
75+
<!-- Links in the notification. -->
76+
<span id="mv-notice-links">
77+
<span id="mv-undo" class="ripple" tabindex="0" role="button">撤消</span>
78+
<span id="mv-restore" class="ripple" tabindex="0" role="button">恢复默认快捷方式</span>
79+
<div id="mv-notice-x" tabindex="0" role="button"></div>
80+
</span>
81+
</div>
82+
</div>
83+
</div>
84+
</div>
85+
</div>
86+
87+
<div id="attribution" style="display: none;"><div id="attribution-text">主题背景创建者:</div></div>
88+
89+
<div id="error-notice-container">
90+
<div id="error-notice" class="notice-hide" role="alert">
91+
<span id="error-notice-icon"></span>
92+
<span id="error-notice-msg"></span>
93+
<span id="error-notice-link" class="ripple" tabindex="0" role="button"></span>
94+
</div>
95+
</div>
96+
97+
<div id="edit-bg" tabindex="0" role="button" class="ep-enhanced">
98+
<div id="edit-bg-icon" aria-label="自定义此页" title="自定义此页"></div>
99+
<span id="edit-bg-text">自定义</span>
100+
</div>
101+
102+
<div id="custom-bg-attr"></div>
103+
</div>
104+
105+
<dialog div="" id="edit-bg-dialog">
106+
<div id="edit-bg-menu">
107+
<div id="edit-bg-title">自定义此页</div>
108+
<div id="edit-bg-default-wallpapers" class="bg-option" tabindex="0">
109+
<div class="bg-option-img"></div>
110+
<div id="edit-bg-default-wallpapers-text" class="bg-option-text">Chrome 背景</div>
111+
</div>
112+
<div id="edit-bg-upload-image" class="bg-option" tabindex="0">
113+
<div class="bg-option-img"></div>
114+
<div id="edit-bg-upload-image-text" class="bg-option-text">上传图片</div>
115+
</div>
116+
<div id="edit-bg-divider"></div>
117+
<div id="custom-links-restore-default" class="bg-option bg-option-disabled" tabindex="-1">
118+
<div class="bg-option-img"></div>
119+
<div id="custom-links-restore-default-text" class="bg-option-text">恢复默认快捷方式</div>
120+
</div>
121+
<div id="edit-bg-restore-default" class="bg-option bg-option-disabled" tabindex="-1">
122+
<div class="bg-option-img"></div>
123+
<div id="edit-bg-restore-default-text" class="bg-option-text">恢复默认背景</div>
124+
</div>
125+
</div>
126+
</dialog>
127+
128+
<dialog id="ddlsd">
129+
<div id="ddlsd-title"></div>
130+
<button id="ddlsd-close"></button>
131+
<div id="ddlsd-content">
132+
<button id="ddlsd-fbb" class="ddlsd-sbtn"></button>
133+
<button id="ddlsd-twb" class="ddlsd-sbtn"></button>
134+
<button id="ddlsd-emb" class="ddlsd-sbtn"></button>
135+
<hr id="ddlsd-hr">
136+
<div id="ddlsd-link">
137+
<button id="ddlsd-copy"></button>
138+
<span id="ddlsd-text-ctr">
139+
<input type="text" id="ddlsd-text" dir="ltr">
140+
</span>
141+
</div>
142+
</div>
143+
</dialog>
144+
145+
<dialog id="bg-sel-menu" class="customize-dialog">
146+
<div id="bg-sel-title-bar">
147+
<div id="bg-sel-back-circle" tabindex="0" role="button" aria-label="后退">
148+
<div id="bg-sel-back"></div>
149+
</div>
150+
<div id="bg-sel-title"></div>
151+
</div>
152+
<div id="bg-sel-tiles" tabindex="0"></div>
153+
<div id="bg-sel-footer">
154+
<label id="bg-daily-refresh" class="switch">
155+
<input type="checkbox">
156+
<span class="toggle"></span>
157+
</label>
158+
<div id="bg-sel-refresh-text">每日刷新</div>
159+
<button id="bg-sel-footer-cancel" class="bg-sel-footer-button paper secondary ripple" tabindex="0" aria-label="取消">取消</button>
160+
<button id="bg-sel-footer-done" class="bg-sel-footer-button paper primary ripple" tabindex="-1" aria-label="完成" disabled="">完成</button>
161+
</div>
162+
</dialog>
163+
164+
<dialog id="voice-overlay-dialog" class="overlay-dialog">
165+
<div id="voice-overlay" class="overlay-hidden">
166+
<button id="voice-close-button" class="close-button">×</button>
167+
<div id="voice-outer" class="outer">
168+
<div class="inner-container">
169+
<div id="voice-button-container" class="button-container">
170+
<!-- The audio level animation. -->
171+
<span id="voice-level" class="level"></span>
172+
<!-- The microphone button. -->
173+
<span id="voice-button" class="button">
174+
<!-- The microphone icon (in CSS). -->
175+
<div class="microphone">
176+
<span class="receiver"></span>
177+
<div class="wrapper">
178+
<span class="stem"></span>
179+
<span class="shell"></span>
180+
</div>
181+
</div>
182+
</span>
183+
</div>
184+
<div class="text-container">
185+
<!-- Low confidence text underneath high confidence text. -->
186+
<span id="voice-text-i" class="voice-text"></span>
187+
<!-- High confidence text on top of low confidence text. -->
188+
<span id="voice-text-f" class="voice-text"></span>
189+
</div>
190+
</div>
191+
</div>
192+
</div>
193+
</dialog>
194+
195+
<div id="one-google-end-of-body"></div>
196+
197+
<script defer="" src="chrome-search://local-ntp/voice.js" integrity="sha256-lj3Ybq0OcgGBTQmk7PbTtC0eH6NJaDsZHXnY9olO7Mk="></script>
198+
199+
200+
<script id="search-suggestions-loader" src="chrome-search://local-ntp/search-suggestions.js"></script><script src="chrome-search://local-ntp/doodle.js"></script><dialog id="custom-links-edit-dialog" class="customize-dialog"><iframe id="custom-links-edit" name="custom-links-edit" title="修改快捷方式" src="./www_files/edit.html"></iframe></dialog><script src="chrome-search://local-ntp/doodle.js?v=22"></script><script id="one-google-loader" src="chrome-search://local-ntp/one-google.js"></script><script id="promo-loader" src="chrome-search://local-ntp/promo.js"></script></body></html>

0 commit comments

Comments
 (0)