Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit b3549c5

Browse files
committed
支持 @ 消息通知
1 parent fe2e491 commit b3549c5

File tree

14 files changed

+160
-29
lines changed

14 files changed

+160
-29
lines changed

websites/code/studygolang/src/filter/login.go

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,14 @@
77
package filter
88

99
import (
10+
"net/http"
11+
"strings"
12+
1013
"config"
1114
"github.com/gorilla/context"
1215
"github.com/gorilla/sessions"
1316
"github.com/studygolang/mux"
1417
"logger"
15-
"net/http"
1618
"service"
1719
"util"
1820
)
@@ -24,7 +26,13 @@ type LoginFilter struct {
2426

2527
func (this *LoginFilter) PreFilter(rw http.ResponseWriter, req *http.Request) bool {
2628
logger.Debugln("LoginFilter PreFilter...")
29+
2730
if _, ok := CurrentUser(req); !ok {
31+
// 异步请求,却又需要登录,则返回403
32+
if strings.HasSuffix(req.URL.Path, ".json") {
33+
rw.WriteHeader(http.StatusForbidden)
34+
return false
35+
}
2836
logger.Debugln("需要登录")
2937
// 支持跳转回原来访问的页面
3038
NewFlash(rw, req).AddFlash(req.RequestURI, "uri")

websites/code/studygolang/src/model/message.go

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -127,10 +127,12 @@ func (this *Message) colFieldMap() map[string]interface{} {
127127
const (
128128
// 和comment中objtype保持一致(除了@)
129129
MsgtypeTopicReply = iota // 回复我的主题
130-
MsgtypeBlogComment // 评论我的博客
130+
MsgtypeARTICLEComment // 评论我的博文
131131
MsgtypeResourceComment // 评论我的资源
132132
MsgtypeWikiComment // 评论我的Wiki页
133-
MsgtypeAtMe // @提到我
133+
MsgtypeProjectComment // 评论我的项目
134+
135+
MsgtypeAtMe = 10 // @提到我
134136
)
135137

136138
// 短消息

websites/code/studygolang/src/service/article.go

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -375,6 +375,16 @@ func SaveRule(form url.Values, opUser string) (errMsg string, err error) {
375375
return
376376
}
377377

378+
// 提供给其他service调用(包内)
379+
func getArticles(ids map[int]int) map[int]*model.Article {
380+
articles := FindArticlesByIds(util.MapIntKeys(ids))
381+
articleMap := make(map[int]*model.Article, len(articles))
382+
for _, article := range articles {
383+
articleMap[article.Id] = article
384+
}
385+
return articleMap
386+
}
387+
378388
// 博文评论
379389
type ArticleComment struct{}
380390

websites/code/studygolang/src/service/comment.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -267,6 +267,7 @@ func PostComment(uid, objid int, form url.Values) (*model.Comment, error) {
267267

268268
// @某人 发系统消息
269269
go SendSysMsgAtUids(form.Get("uid"), ext)
270+
go SendSysMsgAtUsernames(form.Get("usernames"), ext)
270271

271272
return comment, nil
272273
}

websites/code/studygolang/src/service/message.go

Lines changed: 70 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -106,11 +106,49 @@ func SendSysMsgAtUids(uids string, ext map[string]interface{}) bool {
106106
return true
107107
}
108108

109+
// 给被@的用户发系统消息
110+
func SendSysMsgAtUsernames(usernames string, ext map[string]interface{}) bool {
111+
if usernames == "" {
112+
return true
113+
}
114+
message := model.NewSystemMessage()
115+
message.Msgtype = model.MsgtypeAtMe
116+
message.SetExt(ext)
117+
118+
msg := NewMessage(WsMsgNotify, 1)
119+
120+
usernameSlice := strings.Split(usernames, ",")
121+
for _, username := range usernameSlice {
122+
username = strings.TrimSpace(username)
123+
user := FindUserByUsername(username)
124+
// @ 的用户不存在
125+
if user == nil {
126+
continue
127+
}
128+
129+
uid := user.Uid
130+
if from, ok := ext["uid"]; ok {
131+
// 自己的动作不发系统消息
132+
if uid == from.(int) {
133+
continue
134+
}
135+
}
136+
message.To = uid
137+
if _, err := message.Insert(); err != nil {
138+
logger.Errorln("message service SendSysMsgAtUsernames Error:", err)
139+
continue
140+
}
141+
// 通过 WebSocket 通知对方
142+
go Book.PostMessage(uid, msg)
143+
}
144+
return true
145+
}
146+
109147
// 获得某人的系统消息
110148
// 系统消息类型不同,在ext中存放的字段也不一样,如下:
111149
// model.MsgtypeTopicReply/MsgtypeResourceComment/MsgtypeWikiComment存放都为:
112150
// {"uid":xxx,"objid":xxx}
113-
// model.MsgtypeAtMe为:{"uid":xxx,"cid":xxx,"objid":xxx,"objtype":xxx}
151+
// model.MsgtypeAtMe 为:{"uid":xxx,"cid":xxx,"objid":xxx,"objtype":xxx}
114152
func FindSysMsgsByUid(uid string) []map[string]interface{} {
115153
messages, err := model.NewSystemMessage().Where("to=" + uid).Order("ctime DESC").FindAll()
116154
if err != nil {
@@ -119,8 +157,10 @@ func FindSysMsgsByUid(uid string) []map[string]interface{} {
119157
}
120158

121159
tids := make(map[int]int)
160+
articleIds := make(map[int]int)
122161
resIds := make(map[int]int)
123162
wikiIds := make(map[int]int)
163+
pids := make(map[int]int)
124164
// 评论ID
125165
cids := make(map[int]int)
126166

@@ -149,11 +189,13 @@ func FindSysMsgsByUid(uid string) []map[string]interface{} {
149189
case model.TYPE_TOPIC:
150190
tids[objid] = objid
151191
case model.TYPE_ARTICLE:
152-
//tids[objid] = objid
192+
articleIds[objid] = objid
153193
case model.TYPE_RESOURCE:
154194
resIds[objid] = objid
155195
case model.TYPE_WIKI:
156196
wikiIds[objid] = objid
197+
case model.TYPE_PROJECT:
198+
pids[objid] = objid
157199
}
158200
}
159201
if val, ok := ext["cid"]; ok {
@@ -170,8 +212,10 @@ func FindSysMsgsByUid(uid string) []map[string]interface{} {
170212
userMap := GetUserInfos(uids)
171213
commentMap := getComments(cids)
172214
topicMap := getTopics(tids)
215+
articleMap := getArticles(articleIds)
173216
resourceMap := getResources(resIds)
174217
wikiMap := getWikis(wikiIds)
218+
projectMap := getProjects(pids)
175219

176220
result := make([]map[string]interface{}, len(messages))
177221
for i, message := range messages {
@@ -200,18 +244,36 @@ func FindSysMsgsByUid(uid string) []map[string]interface{} {
200244
title = "评论时提到了你,在"
201245
switch int(ext["objtype"].(float64)) {
202246
case model.TYPE_TOPIC:
203-
objTitle = topicMap[objid].Title
204-
objUrl = "/topics/" + strconv.Itoa(topicMap[objid].Tid)
247+
topic := topicMap[objid]
248+
objTitle = topic.Title
249+
objUrl = "/topics/" + strconv.Itoa(topic.Tid) + "#commentForm"
205250
title += "主题:"
206251
case model.TYPE_ARTICLE:
252+
article := articleMap[objid]
253+
objTitle = article.Title
254+
objUrl = "/articles/" + strconv.Itoa(article.Id) + "#commentForm"
255+
title += "博文:"
207256
case model.TYPE_RESOURCE:
208-
objTitle = resourceMap[objid].Title
209-
objUrl = "/resources/" + strconv.Itoa(resourceMap[objid].Id)
257+
resource := resourceMap[objid]
258+
objTitle = resource.Title
259+
objUrl = "/resources/" + strconv.Itoa(resource.Id) + "#commentForm"
210260
title += "资源:"
211261
case model.TYPE_WIKI:
212-
objTitle = wikiMap[objid].Title
213-
objUrl = "/wiki/" + strconv.Itoa(wikiMap[objid].Id)
262+
wiki := wikiMap[objid]
263+
objTitle = wiki.Title
264+
objUrl = "/wiki/" + strconv.Itoa(wiki.Id) + "#commentForm"
214265
title += "wiki:"
266+
case model.TYPE_PROJECT:
267+
project := projectMap[objid]
268+
objTitle = project.Category + project.Name
269+
objUrl = "/p/"
270+
if project.Uri != "" {
271+
objUrl += project.Uri
272+
} else {
273+
objUrl += strconv.Itoa(project.Id)
274+
}
275+
objUrl += "#commentForm"
276+
title += "项目:"
215277
}
216278
}
217279
tmpMap["objtitle"] = objTitle

websites/code/studygolang/src/service/project.go

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,16 @@ func getProjectOwner(id int) int {
146146
return user.Uid
147147
}
148148

149+
// 提供给其他service调用(包内)
150+
func getProjects(ids map[int]int) map[int]*model.OpenProject {
151+
projects := FindProjectsByIds(util.MapIntKeys(ids))
152+
projectMap := make(map[int]*model.OpenProject, len(projects))
153+
for _, project := range projects {
154+
projectMap[project.Id] = project
155+
}
156+
return projectMap
157+
}
158+
149159
// 项目评论
150160
type ProjectComment struct{}
151161

websites/code/studygolang/static/js/comment.js

Lines changed: 41 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -203,12 +203,16 @@
203203

204204
var objid = $('.page-comment').data('objid'),
205205
objtype = $('.page-comment').data('objtype');
206+
207+
var usernames = analyzeAt(content);
208+
206209
$.ajax({
207210
type:"post",
208211
url: '/comment/'+objid+'.json',
209212
data: {
210213
"objtype":objtype,
211-
"content":content
214+
"content":content,
215+
"usernames": usernames.join(',')
212216
},
213217
dataType: 'json',
214218
success: function(data){
@@ -223,6 +227,20 @@
223227

224228
$('.page-comment .words ul').append(oneCmt);
225229
$('.page-comment .words').removeClass('hide');
230+
231+
emojify.setConfig({
232+
// emojify_tag_type : 'span',
233+
only_crawl_id : null,
234+
img_dir : 'http://www.emoji-cheat-sheet.com/graphics/emojis',
235+
ignored_tags : { //忽略以下几种标签内的emoji识别
236+
'SCRIPT' : 1,
237+
'TEXTAREA': 1,
238+
'A' : 1,
239+
'PRE' : 1,
240+
'CODE' : 1
241+
}
242+
});
243+
emojify.run($('.page-comment .words ul li:last').get(0));
226244

227245
var $cmtNumObj = $('.page-comment .words h3 .cmtnum'),
228246
cmtNum = parseInt($cmtNumObj.text(), 10) + 1;
@@ -247,15 +265,28 @@
247265
});
248266
}
249267

250-
// @ 本站其他人
251-
$('.page-comment #commentForm textarea').atwho({
252-
at: "@",
253-
data: "/at/users.json"
254-
}).atwho({
255-
at: ":",
256-
data: window.emojis,
257-
tpl:"<li data-value='${key}'><img src='http://www.emoji-cheat-sheet.com/graphics/emojis/${name}.png' height='20' width='20' /> ${name}</li>"
258-
});
268+
if ($("#is_login_status").val() == 1) {
269+
// @ 本站其他人
270+
$('.page-comment #commentForm textarea').atwho({
271+
at: "@",
272+
data: "/at/users.json"
273+
}).atwho({
274+
at: ":",
275+
data: window.emojis,
276+
tpl:"<li data-value='${key}'><img src='http://www.emoji-cheat-sheet.com/graphics/emojis/${name}.png' height='20' width='20' /> ${name}</li>"
277+
});
278+
}
279+
280+
// 分析 @ 的用户
281+
var analyzeAt = function(text) {
282+
var usernames = [];
283+
284+
String(text).replace(/[^@]*@([^\s@]{4,20})\s*/g, function (match, username) {
285+
usernames.push(username);
286+
});
287+
288+
return usernames;
289+
}
259290

260291
});
261292
}).call(this)

websites/code/studygolang/template/articles/detail.html

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,7 @@ <h3><span class="cmtnum">{{.article.Cmtnum}}</span>条评论</h3>
118118
<div class="row box_white sidebar">
119119
<div class="top">
120120
<ul class="list-inline text-center">
121-
<li class="first"><a href="/topics" target="_blank" class="cur" title="点击更多">最新帖子</a>|</li>
121+
<li class="first"><a href="/topics" target="_blank" class="cur" title="点击更多">最新主题</a>|</li>
122122
<li class="second"><a href="/resources" target="_blank" title="点击更多">最新资源</a>|</li>
123123
<li class="last"><a href="javascript:;">最新评论</a></li>
124124
</ul>
@@ -143,10 +143,17 @@ <h3><span class="cmtnum">{{.article.Cmtnum}}</span>条评论</h3>
143143
</div>
144144
</div>
145145
{{end}}
146+
{{define "css"}}
147+
<link href="/static/css/jquery.atwho.min.css" rel="stylesheet">
148+
{{end}}
146149
{{define "js"}}
147150
<script type="text/javascript" src="/static/js/libs/jquery.autogrowtextarea.min.js"></script>
148151
<script type="text/javascript" src="/static/js/libs/marked.min.js"></script>
149152
<script type="text/javascript" src="/static/js/libs/highlight.min.js"></script>
153+
<script type="text/javascript" src="/static/js/libs/jquery.caret.min.js"></script>
154+
<script type="text/javascript" src="/static/js/libs/jquery.atwho.min.js"></script>
155+
<script type="text/javascript" src="/static/js/libs/emojify.min.js"></script>
156+
<script type="text/javascript" src="/static/js/libs/emojis.js"></script>
150157
<script type="text/javascript" src="/static/js/comment.js"></script>
151158
<script type="text/javascript">
152159
// 需要加载的侧边栏

websites/code/studygolang/template/articles/list.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ <h2><a href="/articles/{{.Id}}" target="_blank" title="{{.Title}}">{{.Title}}</a
8585
<div class="row box_white sidebar">
8686
<div class="top">
8787
<ul class="list-inline text-center">
88-
<li class="first"><a href="/topics" target="_blank" class="cur" title="点击更多">最新话题</a>|</li>
88+
<li class="first"><a href="/topics" target="_blank" class="cur" title="点击更多">最新主题</a>|</li>
8989
<li class="second"><a href="/resources" target="_blank" title="点击更多">最新资源</a>|</li>
9090
<li class="last"><a href="javascript:;">最新评论</a></li>
9191
</ul>

websites/code/studygolang/template/index.html

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
<div class="row box_white">
1515
<div class="col-md-6 recent-list">
1616
<div class="title">
17-
<h3><a href="/topics">最新话题</a></h3>
17+
<h3><a href="/topics">最新主题</a></h3>
1818
<a class="pull-right more" href="/topics">更多&gt;&gt;</a>
1919
</div>
2020
<ul class="clearfix list-unstyled">
@@ -241,7 +241,7 @@ <h3><a href="javascript:">学习资料</a></h3>
241241
</div>
242242
</div>
243243
<div class="box" style="margin: 0 20px;">
244-
<a class="btn btn-default btn-sm" href="/topics/new">发布话题</a>&nbsp;&nbsp;
244+
<a class="btn btn-default btn-sm" href="/topics/new">发布主题</a>&nbsp;&nbsp;
245245
<a class="btn btn-default btn-sm" href="/resources/new">分享资源</a>
246246
</div>
247247
{{else}}

websites/code/studygolang/template/projects/detail.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,7 @@ <h3><span class="cmtnum">{{.project.Cmtnum}}</span>条评论</h3>
134134
<div class="top">
135135
<ul class="list-inline text-center">
136136
<li class="first"><a href="/articles" target="_blank" class="cur" title="点击更多">最新博文</a>|</li>
137-
<li class="second"><a href="/topics" target="_blank" title="点击更多">最新话题</a>|</li>
137+
<li class="second"><a href="/topics" target="_blank" title="点击更多">最新主题</a>|</li>
138138
<li class="last"><a href="javascript:;">最新评论</a></li>
139139
</ul>
140140
<p class="bar"></p>

websites/code/studygolang/template/projects/list.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ <h3 class="title"><i class="glyphicon glyphicon-list"></i>&nbsp;<a href="/articl
7676
<div class="row box_white sidebar">
7777
<div class="top">
7878
<ul class="list-inline text-center">
79-
<li class="first"><a href="/topics" target="_blank" class="cur" title="点击更多">最新话题</a>|</li>
79+
<li class="first"><a href="/topics" target="_blank" class="cur" title="点击更多">最新主题</a>|</li>
8080
<li class="second"><a href="/resources" target="_blank" title="点击更多">最新资源</a>|</li>
8181
<li class="last"><a href="javascript:;">最新评论</a></li>
8282
</ul>

websites/code/studygolang/template/projects/new.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,7 @@
132132
<div class="row box_white sidebar">
133133
<div class="top">
134134
<ul class="list-inline text-center">
135-
<li class="first"><a href="/topics" target="_blank" class="cur" title="点击更多">最新帖子</a>|</li>
135+
<li class="first"><a href="/topics" target="_blank" class="cur" title="点击更多">最新主题</a>|</li>
136136
<li class="second"><a href="/resources" target="_blank" title="点击更多">最新资源</a>|</li>
137137
<li class="last"><a href="javascript:;">最新评论</a></li>
138138
</ul>

websites/code/studygolang/template/readings/list.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ <h3 class="title"><i class="glyphicon glyphicon-list"></i>&nbsp;<a href="/articl
6666
<div class="row box_white sidebar">
6767
<div class="top">
6868
<ul class="list-inline text-center">
69-
<li class="first"><a href="/topics" target="_blank" class="cur" title="点击更多">最新话题</a>|</li>
69+
<li class="first"><a href="/topics" target="_blank" class="cur" title="点击更多">最新主题</a>|</li>
7070
<li class="second"><a href="/resources" target="_blank" title="点击更多">最新资源</a>|</li>
7171
<li class="last"><a href="javascript:;">最新评论</a></li>
7272
</ul>

0 commit comments

Comments
 (0)