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

Skip to content

Commit bc9e7ac

Browse files
committed
发布项目功能放开使用;增加项目管理后台
1 parent bebfaec commit bc9e7ac

File tree

14 files changed

+302
-16
lines changed

14 files changed

+302
-16
lines changed
Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
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 admin
8+
9+
import (
10+
"net/http"
11+
"strconv"
12+
13+
"filter"
14+
"logger"
15+
"service"
16+
)
17+
18+
// 所有开源项目(分页)
19+
// /admin/community/project/list
20+
func ProjectListHandler(rw http.ResponseWriter, req *http.Request) {
21+
curPage, limit := parsePage(req)
22+
23+
projects, total := service.FindProjectByPage(nil, curPage, limit)
24+
25+
if projects == nil {
26+
logger.Errorln("[ProjectListHandler]sql find error")
27+
rw.WriteHeader(http.StatusInternalServerError)
28+
return
29+
}
30+
31+
data := map[string]interface{}{
32+
"datalist": projects,
33+
"total": total,
34+
"totalPages": (total + limit - 1) / limit,
35+
"page": curPage,
36+
"limit": limit,
37+
}
38+
39+
// 设置内容模板
40+
req.Form.Set(filter.CONTENT_TPL_KEY, "/template/admin/project/list.html,/template/admin/project/query.html")
41+
filter.SetData(req, data)
42+
}
43+
44+
// /admin/community/project/query.html
45+
func ProjectQueryHandler(rw http.ResponseWriter, req *http.Request) {
46+
curPage, limit := parsePage(req)
47+
48+
conds := parseConds(req, []string{"id", "domain", "title"})
49+
50+
projects, total := service.FindProjectByPage(conds, curPage, limit)
51+
52+
if projects == nil {
53+
logger.Errorln("[ProjectQueryHandler]sql find error")
54+
rw.WriteHeader(http.StatusInternalServerError)
55+
return
56+
}
57+
58+
data := map[string]interface{}{
59+
"datalist": projects,
60+
"total": total,
61+
"totalPages": (total + limit - 1) / limit,
62+
"page": curPage,
63+
"limit": limit,
64+
}
65+
66+
// 设置内容模板
67+
req.Form.Set(filter.CONTENT_TPL_KEY, "/template/admin/project/query.html")
68+
filter.SetData(req, data)
69+
}
70+
71+
// 更新状态
72+
// uri: /admin/community/project/update_status
73+
func UpdateProjectStatusHandler(rw http.ResponseWriter, req *http.Request) {
74+
id, err := strconv.Atoi(req.PostFormValue("id"))
75+
if err != nil {
76+
rw.WriteHeader(http.StatusBadRequest)
77+
return
78+
}
79+
80+
status, err := strconv.Atoi(req.FormValue("status"))
81+
if err != nil {
82+
rw.WriteHeader(http.StatusBadRequest)
83+
return
84+
}
85+
86+
var data = make(map[string]interface{})
87+
88+
user, _ := filter.CurrentUser(req)
89+
90+
err = service.UpdateProjectStatus(id, status, user["username"].(string))
91+
if err != nil {
92+
logger.Errorln("UpdateProjectStatusHandler error:", err)
93+
data["ok"] = 0
94+
data["error"] = "更新状态失败"
95+
} else {
96+
data["ok"] = 1
97+
data["msg"] = "更新状态成功"
98+
}
99+
100+
filter.SetData(req, data)
101+
}

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,7 @@ func NewProjectHandler(rw http.ResponseWriter, req *http.Request) {
110110
}
111111

112112
user, _ := filter.CurrentUser(req)
113-
err := service.PublishProject(user["username"].(string), req.PostForm)
113+
err := service.PublishProject(user, req.PostForm)
114114
if err != nil {
115115
fmt.Fprint(rw, `{"ok": 0, "error":"内部服务错误!"}`)
116116
return
@@ -136,7 +136,8 @@ func ModifyProjectHandler(rw http.ResponseWriter, req *http.Request) {
136136
return
137137
}
138138

139-
err := service.PublishProject("", req.PostForm)
139+
user, _ := filter.CurrentUser(req)
140+
err := service.PublishProject(user, req.PostForm)
140141
if err != nil {
141142
fmt.Fprint(rw, `{"ok": 0, "error":"内部服务错误!"}`)
142143
return

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -177,6 +177,11 @@ func initRouter() *mux.Router {
177177
subrouter.HandleFunc("/community/comment/modify", admin.ModifyCommentHandler)
178178
subrouter.HandleFunc("/community/comment/del", admin.DelCommentHandler)
179179

180+
// 开源项目管理
181+
subrouter.HandleFunc("/community/project/list", admin.ProjectListHandler)
182+
subrouter.HandleFunc("/community/project/query.html", admin.ProjectQueryHandler)
183+
subrouter.HandleFunc("/community/project/update_status", admin.UpdateProjectStatusHandler)
184+
180185
///////////////// 抓取管理 //////////////////////////
181186
// 文章管理
182187
subrouter.HandleFunc("/crawl/article/list", admin.ArticleListHandler)

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

Lines changed: 46 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,18 +17,26 @@ import (
1717
"util"
1818
)
1919

20-
func PublishProject(username string, form url.Values) (err error) {
20+
func PublishProject(user map[string]interface{}, form url.Values) (err error) {
2121
isModify := form.Get("id") != ""
2222

2323
if !isModify && ProjectUriExists(form.Get("uri")) {
2424
err = errors.New("uri存在")
2525
return
2626
}
2727

28+
username := user["username"].(string)
29+
2830
project := model.NewOpenProject()
2931
util.ConvertAssign(project, form)
3032

31-
if !isModify {
33+
if isModify {
34+
isAdmin := user["isadmin"].(bool)
35+
if project.Username != username && !isAdmin {
36+
err = errors.New("没有修改权限")
37+
return
38+
}
39+
} else {
3240
project.Username = username
3341
project.Ctime = util.TimeNow()
3442
}
@@ -54,6 +62,16 @@ func PublishProject(username string, form url.Values) (err error) {
5462
return
5563
}
5664

65+
func UpdateProjectStatus(id, status int, username string) error {
66+
if status < model.StatusNew || status > model.StatusOffline {
67+
return errors.New("status is illegal")
68+
}
69+
70+
logger.Infoln("UpdateProjectStatus by username:", username)
71+
72+
return model.NewOpenProject().Set("status=?", status).Where("id=?", id).Update()
73+
}
74+
5775
func ProjectUriExists(uri string) bool {
5876
project := model.NewOpenProject()
5977
err := project.Where("uri=?", uri).Find("id")
@@ -110,6 +128,32 @@ func FindProject(uniq string) *model.OpenProject {
110128
return project
111129
}
112130

131+
// 获取开源项目列表(分页,后台用)
132+
func FindProjectByPage(conds map[string]string, curPage, limit int) ([]*model.OpenProject, int) {
133+
conditions := make([]string, 0, len(conds))
134+
for k, v := range conds {
135+
conditions = append(conditions, k+"="+v)
136+
}
137+
138+
project := model.NewOpenProject()
139+
140+
limitStr := strconv.Itoa((curPage-1)*limit) + "," + strconv.Itoa(limit)
141+
projectList, err := project.Where(strings.Join(conditions, " AND ")).Order("id DESC").Limit(limitStr).
142+
FindAll()
143+
if err != nil {
144+
logger.Errorln("project service FindProjectByPage Error:", err)
145+
return nil, 0
146+
}
147+
148+
total, err := project.Count()
149+
if err != nil {
150+
logger.Errorln("project service FindProjectByPage COUNT Error:", err)
151+
return nil, 0
152+
}
153+
154+
return projectList, total
155+
}
156+
113157
// 获取多个项目详细信息
114158
func FindProjectsByIds(ids []int) []*model.OpenProject {
115159
if len(ids) == 0 {

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,7 @@ func FindCurrentUser(username string) (user map[string]interface{}, err error) {
113113
"uid": userInfo.Uid,
114114
"username": userInfo.Username,
115115
"email": userInfo.Email,
116+
"avatar": userInfo.Avatar,
116117
}
117118

118119
// 获取未读消息数

websites/code/studygolang/static/css/admin/revise.css

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,3 +92,5 @@ td .emtd {
9292
.newline {word-wrap: break-word; word-break: break-all;}
9393

9494
.blue {color: blue;}
95+
96+
.actions a {color: blue;}

websites/code/studygolang/static/css/main.css

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,8 @@ html, body { background: #F2F2F2; font-family: "Helvetica Neue", Helvetica, Aria
113113
/* blog 详情页 */
114114
.page {}
115115
.page .title { padding-top: 21px }
116+
.page .title h1 { position: relative; }
117+
.page .title h1 .edit { font-size: 15px; position: absolute; top: -10px;}
116118
.page .meta {height: 28px;line-height: 28px;border-bottom: dotted 1px #D8D8D8; margin: 0 30px;}
117119
.page .meta .p-author {float: left;font-family: "NSimSun";font-size: 12px;color: #888888;}
118120
.page .meta .p-author a {color: #272727;}

websites/code/studygolang/static/js/admin/datalist.js

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,17 @@ jQuery(document).ready(function($) {
1010
if (!answer) {
1111
return false;
1212
}
13-
var action = $(target).attr("ajax-action");
13+
var action = $(target).attr("ajax-action"),
14+
data = 'format=json',
15+
id = $(target).data('id');
16+
if (id != "") {
17+
data += "&id="+id;
18+
}
19+
1420
$.ajax({
1521
url : action,
16-
type : 'get',
17-
data : 'format=json',
22+
type : 'post',
23+
data : data,
1824
dataType : 'json',
1925
success : function(data) {
2026
if (data.ok == 1) {

websites/code/studygolang/static/js/projects.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@
1515
dataType: 'json',
1616
success: function(data){
1717
if(data.ok){
18+
$form.get(0).reset();
19+
1820
comTip("发布成功!");
1921

2022
setTimeout(function(){
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
{{define "content"}}
2+
<div class="pageheader notab">
3+
<h1 class="pagetitle">开源项目管理</h1>
4+
<span class="pagedesc">管理所有Go相关开源项目信息</span>
5+
</div><!--pageheader-->
6+
7+
<div id="contentwrapper" class="contentwrapper">
8+
<form id="queryform" class="stdform_q" action="" method="get">
9+
<div>
10+
<p>
11+
<label>项目ID</label>
12+
<span class="field"><input type="text" id="q_id" name="id" class="smallinput" value=""/></span>
13+
</p>
14+
<p>
15+
<label>项目名</label>
16+
<span class="field"><input type="text" id="q_name" name="name" class="smallinput" value=""/></span>
17+
</p>
18+
</div>
19+
<div>
20+
<p>
21+
<label>创建时间</label>
22+
<span class="field">
23+
<input type="text" id="create_time_min" name="create_time_min" class="smallinput date_time" style="width:80px;" value=""/>
24+
<input type="text" id="create_time_max" name="create_time_max" class="smallinput date_time" style="width:80px;" value=""/>
25+
</span>
26+
</p>
27+
</div>
28+
<div>
29+
<p>
30+
<label>&nbsp;</label>
31+
<span class="field"><button id="queryform_sub" class="submit radius2">查询</button></span>
32+
</p>
33+
</div>
34+
</form>
35+
<div class="contenttitle2">
36+
<h3>数据列表</h3>
37+
</div>
38+
<div id="query_result">
39+
{{template "querylist" .}}
40+
</div>
41+
<img id="loaders" src="/static/img/loaders/loader7.gif" alt="" class="hide">
42+
43+
</div><!--contentwrapper-->
44+
45+
<br clear="all" />
46+
{{end}}
47+
{{define "js"}}
48+
<script type="text/javascript" src="/static/js/libs/jquery.jqpagination.min.js"></script>
49+
<script type="text/javascript">
50+
// 需要传入下面js的变量定义
51+
var GLOBAL_CONF = {
52+
"action_query" : "/admin/community/project/query.html",
53+
"query_params" : {
54+
'id' : '#q_id',
55+
'name' : '#q_name',
56+
'create_time_min' : '#create_time_min',
57+
'create_time_max' : '#create_time_max'
58+
}
59+
};
60+
</script>
61+
<script type="text/javascript" src="/static/js/admin/datalist.js"></script>
62+
{{end}}
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
{{define "querylist"}}
2+
<h4>总数:{{ .total }}</h4><br/>
3+
<table id="logo_table" cellpadding="0" cellspacing="0" border="0" class="stdtable">
4+
<thead class="center">
5+
<tr>
6+
<td width="3%">项目ID</td>
7+
<td width="5%">项目名</td>
8+
<td width="5%">项目类别</td>
9+
<td width="8%">个性uri</td>
10+
<td width="5%">源码地址</td>
11+
<td width="5%">作者</td>
12+
<td width="3%">状态</td>
13+
<td width="3%">发布人</td>
14+
<td width="5%">创建时间</td>
15+
<td width="8%">操作</td>
16+
</tr>
17+
</thead>
18+
<tbody class="center">
19+
{{range .datalist}}
20+
<tr>
21+
<td><a href="/p/{{.Id}}" target="_blank" class="blue">{{.Id}}</a></td>
22+
<td>{{.Name}}</td>
23+
<td>{{.Category}}</td>
24+
<td><a href="/p/{{.Uri}}" target="_blank" class="blue">{{.Uri}}</a></td>
25+
<td>{{ .Src }}</td>
26+
<td>{{ .Author }}</td>
27+
<td class="status">{{.Status}}</td>
28+
<td>{{.Username}}</td>
29+
<td>{{ .Ctime }}</td>
30+
<td class="actions">
31+
{{if eq .Status 1}}
32+
<a data-type="ajax-submit" href="#" submit-redirect="#"
33+
ajax-action="/admin/community/project/update_status?status=2"
34+
data-id="{{.Id}}"
35+
ajax-hint="是否确定要下线?"
36+
success-hint="下线成功">下线</a>
37+
{{else}}
38+
<a data-type="ajax-submit" href="#" submit-redirect="#"
39+
ajax-action="/admin/community/project/update_status?status=1"
40+
data-id="{{.Id}}"
41+
ajax-hint="是否确定要上线?"
42+
success-hint="上线成功">上线</a>
43+
{{end}}
44+
</td>
45+
</tr>
46+
{{end}}
47+
</tbody>
48+
</table>
49+
50+
<div class="gigantic pagination">
51+
<a href="#" class="first" data-action="first">&laquo;</a>
52+
<a href="#" class="previous" data-action="previous">&lsaquo;</a>
53+
<input type="text" readonly="readonly" data-max-page="40" />
54+
<a href="#" class="next" data-action="next">&rsaquo;</a>
55+
<a href="#" class="last" data-action="last">&raquo;</a>
56+
</div>
57+
58+
<input type="hidden" id="totalPages" value="{{ .totalPages }}"/>
59+
<input type="hidden" id="cur_page" value="{{ .page }}"/>
60+
<input type="hidden" id="limit" value="{{ .limit }}"/>
61+
62+
{{end}}

0 commit comments

Comments
 (0)