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

Skip to content

Commit 31cb12a

Browse files
author
xuxinhua
committed
代码分享
1 parent eefbea8 commit 31cb12a

File tree

14 files changed

+745
-4
lines changed

14 files changed

+745
-4
lines changed
Lines changed: 148 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,148 @@
1+
// Copyright 2014 The StudyGolang Authors. All rights reserved.
2+
// Use of this source code is governed by a BSD-style
3+
// license that can be found in the LICENSE file.
4+
// http://studygolang.com
5+
// Author:polaris [email protected]
6+
7+
package controller
8+
9+
import (
10+
"fmt"
11+
"html/template"
12+
"net/http"
13+
"strconv"
14+
15+
"filter"
16+
"github.com/studygolang/mux"
17+
"model"
18+
"service"
19+
"util"
20+
)
21+
22+
// 在需要评论(喜欢)且要回调的地方注册评论(喜欢)对象
23+
func init() {
24+
// 注册评论(喜欢)对象
25+
service.RegisterCommentObject(model.TYPE_CODE, service.CodeComment{})
26+
service.RegisterLikeObject(model.TYPE_CODE, service.CodeLike{})
27+
}
28+
29+
// 代码片段列表页
30+
// uri: /codes
31+
func CodesHandler(rw http.ResponseWriter, req *http.Request) {
32+
33+
page, _ := strconv.Atoi(req.FormValue("p"))
34+
if page == 0 {
35+
page = 1
36+
}
37+
38+
codes, userMap, total := service.FindCodes(page)
39+
pageHtml := service.GetPageHtml(page, total, req.URL.Path)
40+
41+
req.Form.Set(filter.CONTENT_TPL_KEY, "/template/codes/list.html")
42+
filter.SetData(req, map[string]interface{}{"activeCodes": "active", "codes": codes, "page": template.HTML(pageHtml), "userMap": userMap})
43+
}
44+
45+
// 代码详细页
46+
// uri: /codes/{id:[0-9]+}
47+
func CodeDetailHandler(rw http.ResponseWriter, req *http.Request) {
48+
vars := mux.Vars(req)
49+
50+
article, prevNext, err := service.FindArticlesById(vars["id"])
51+
if err != nil {
52+
util.Redirect(rw, req, "/articles")
53+
return
54+
}
55+
56+
if article == nil || article.Id == 0 || article.Status == model.StatusOffline {
57+
util.Redirect(rw, req, "/articles")
58+
return
59+
}
60+
61+
likeFlag := 0
62+
hadCollect := 0
63+
user, ok := filter.CurrentUser(req)
64+
if ok {
65+
uid := user["uid"].(int)
66+
likeFlag = service.HadLike(uid, article.Id, model.TYPE_ARTICLE)
67+
hadCollect = service.HadFavorite(uid, article.Id, model.TYPE_ARTICLE)
68+
}
69+
70+
service.Views.Incr(req, model.TYPE_ARTICLE, article.Id)
71+
72+
// 为了阅读数即时看到
73+
article.Viewnum++
74+
75+
// 设置内容模板
76+
req.Form.Set(filter.CONTENT_TPL_KEY, "/template/articles/detail.html,/template/common/comment.html")
77+
// 设置模板数据
78+
filter.SetData(req, map[string]interface{}{"activeArticles": "active", "article": article, "prev": prevNext[0], "next": prevNext[1], "likeflag": likeFlag, "hadcollect": hadCollect})
79+
}
80+
81+
// 分享代码
82+
// uri: /codes/new{json:(|.json)}
83+
func NewCodeHandler(rw http.ResponseWriter, req *http.Request) {
84+
vars := mux.Vars(req)
85+
title := req.PostFormValue("title")
86+
// 请求新建分享代码页面
87+
if title == "" || req.Method != "POST" || vars["json"] == "" {
88+
req.Form.Set(filter.CONTENT_TPL_KEY, "/template/codes/new.html")
89+
filter.SetData(req, map[string]interface{}{"activeCodes": "active"})
90+
return
91+
}
92+
93+
errMsg := ""
94+
resForm := req.PostFormValue("form")
95+
if resForm == model.LinkForm {
96+
if req.PostFormValue("url") == "" {
97+
errMsg = "url不能为空"
98+
}
99+
} else {
100+
if req.PostFormValue("content") == "" {
101+
errMsg = "内容不能为空"
102+
}
103+
}
104+
if errMsg != "" {
105+
fmt.Fprint(rw, `{"ok": 0, "error":"`+errMsg+`"}`)
106+
return
107+
}
108+
109+
user, _ := filter.CurrentUser(req)
110+
err := service.PublishResource(user, req.PostForm)
111+
if err != nil {
112+
fmt.Fprint(rw, `{"ok": 0, "error":"内部服务错误,请稍候再试!"}`)
113+
return
114+
}
115+
116+
fmt.Fprint(rw, `{"ok": 1, "data":""}`)
117+
}
118+
119+
// 修改資源
120+
// uri: /codes/modify{json:(|.json)}
121+
func ModifyCodeHandler(rw http.ResponseWriter, req *http.Request) {
122+
id := req.FormValue("id")
123+
if id == "" {
124+
util.Redirect(rw, req, "/resources")
125+
return
126+
}
127+
128+
vars := mux.Vars(req)
129+
// 请求编辑資源页面
130+
if req.Method != "POST" || vars["json"] == "" {
131+
resource := service.FindResourceById(id)
132+
req.Form.Set(filter.CONTENT_TPL_KEY, "/template/resources/new.html")
133+
filter.SetData(req, map[string]interface{}{"resource": resource, "activeResources": "active", "categories": service.AllCategory})
134+
return
135+
}
136+
137+
user, _ := filter.CurrentUser(req)
138+
err := service.PublishResource(user, req.PostForm)
139+
if err != nil {
140+
if err == service.NotModifyAuthorityErr {
141+
rw.WriteHeader(http.StatusForbidden)
142+
return
143+
}
144+
fmt.Fprint(rw, `{"ok": 0, "error":"内部服务错误!"}`)
145+
return
146+
}
147+
fmt.Fprint(rw, `{"ok": 1, "data":""}`)
148+
}
Lines changed: 114 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,114 @@
1+
// Copyright 2014 The StudyGolang Authors. All rights reserved.
2+
// Use of this source code is governed by a BSD-style
3+
// license that can be found in the LICENSE file.
4+
// http://studygolang.com
5+
// Author:polaris [email protected]
6+
7+
package model
8+
9+
import (
10+
"logger"
11+
"util"
12+
)
13+
14+
// 代码片段分享
15+
type CodeShare struct {
16+
Id int `json:"id"`
17+
Title string `json:"title"`
18+
Remark string `json:"remark"`
19+
Code string `json:"code"`
20+
Viewnum int `json:"viewnum"`
21+
Cmtnum int `json:"cmtnum"`
22+
Likenum int `json:"likenum"`
23+
OpUser string `json:"op_user"`
24+
Ctime string `json:"ctime"`
25+
26+
// 数据库访问对象
27+
*Dao
28+
}
29+
30+
func NewCodeShare() *CodeShare {
31+
return &CodeShare{
32+
Dao: &Dao{tablename: "code_share"},
33+
}
34+
}
35+
36+
func (this *CodeShare) Insert() (int64, error) {
37+
this.prepareInsertData()
38+
result, err := this.Dao.Insert()
39+
if err != nil {
40+
return 0, err
41+
}
42+
return result.LastInsertId()
43+
}
44+
45+
func (this *CodeShare) Find(selectCol ...string) error {
46+
return this.Dao.Find(this.colFieldMap(), selectCol...)
47+
}
48+
49+
func (this *CodeShare) FindAll(selectCol ...string) ([]*CodeShare, error) {
50+
if len(selectCol) == 0 {
51+
selectCol = util.MapKeys(this.colFieldMap())
52+
}
53+
rows, err := this.Dao.FindAll(selectCol...)
54+
if err != nil {
55+
return nil, err
56+
}
57+
// TODO:
58+
codeShareList := make([]*CodeShare, 0, 10)
59+
logger.Debugln("selectCol", selectCol)
60+
colNum := len(selectCol)
61+
for rows.Next() {
62+
codeShare := NewCodeShare()
63+
err = this.Scan(rows, colNum, codeShare.colFieldMap(), selectCol...)
64+
if err != nil {
65+
logger.Errorln("CodeShare FindAll Scan Error:", err)
66+
continue
67+
}
68+
codeShareList = append(codeShareList, codeShare)
69+
}
70+
return codeShareList, nil
71+
}
72+
73+
// 为了支持连写
74+
func (this *CodeShare) Where(condition string, args ...interface{}) *CodeShare {
75+
this.Dao.Where(condition, args...)
76+
return this
77+
}
78+
79+
// 为了支持连写
80+
func (this *CodeShare) Set(clause string, args ...interface{}) *CodeShare {
81+
this.Dao.Set(clause, args...)
82+
return this
83+
}
84+
85+
// 为了支持连写
86+
func (this *CodeShare) Limit(limit string) *CodeShare {
87+
this.Dao.Limit(limit)
88+
return this
89+
}
90+
91+
// 为了支持连写
92+
func (this *CodeShare) Order(order string) *CodeShare {
93+
this.Dao.Order(order)
94+
return this
95+
}
96+
97+
func (this *CodeShare) prepareInsertData() {
98+
this.columns = []string{"title", "remark", "code", "op_user"}
99+
this.colValues = []interface{}{this.Title, this.Remark, this.Code, this.OpUser}
100+
}
101+
102+
func (this *CodeShare) colFieldMap() map[string]interface{} {
103+
return map[string]interface{}{
104+
"id": &this.Id,
105+
"title": &this.Title,
106+
"remark": &this.Remark,
107+
"code": &this.Code,
108+
"viewnum": &this.Viewnum,
109+
"cmtnum": &this.Cmtnum,
110+
"likenum": &this.Likenum,
111+
"op_user": &this.OpUser,
112+
"ctime": &this.Ctime,
113+
}
114+
}

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ const (
1818
TYPE_RESOURCE // 资源
1919
TYPE_WIKI // WIKI
2020
TYPE_PROJECT // 开源项目
21+
TYPE_CODE // 代码片段
2122
)
2223

2324
var PathUrlMap = map[int]string{
@@ -26,6 +27,7 @@ var PathUrlMap = map[int]string{
2627
TYPE_RESOURCE: "/resources/",
2728
TYPE_WIKI: "/wiki/",
2829
TYPE_PROJECT: "/p/",
30+
TYPE_CODE: "/codes/",
2931
}
3032

3133
var TypeNameMap = map[int]string{
@@ -34,6 +36,7 @@ var TypeNameMap = map[int]string{
3436
TYPE_RESOURCE: "资源",
3537
TYPE_WIKI: "Wiki",
3638
TYPE_PROJECT: "项目",
39+
TYPE_CODE: "代码",
3740
}
3841

3942
// 评论信息(通用)

websites/code/studygolang/src/server/studygolang/router.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,12 @@ func initRouter() *mux.Router {
9696
router.HandleFunc("/resources/new{json:(|.json)}", NewResourceHandler).AppendFilterChain(loginFilterChain)
9797
router.HandleFunc("/resources/modify{json:(|.json)}", ModifyResourceHandler).AppendFilterChain(loginFilterChain)
9898

99+
// 资源
100+
router.HandleFunc("/codes", CodesHandler)
101+
router.HandleFunc("/codes/{id:[0-9]+}", CodeDetailHandler)
102+
router.HandleFunc("/codes/new{json:(|.json)}", NewCodeHandler).AppendFilterChain(loginFilterChain)
103+
router.HandleFunc("/codes/modify{json:(|.json)}", ModifyCodeHandler).AppendFilterChain(loginFilterChain)
104+
99105
// 评论
100106
router.HandleFunc("/comment/{objid:[0-9]+}.json", CommentHandler).AppendFilterChain(loginFilterChain)
101107
router.HandleFunc("/object/comments.json", ObjectCommentsHandler)

0 commit comments

Comments
 (0)