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

Skip to content

Commit 3214127

Browse files
committed
项目管理后台
1 parent 1f62dd2 commit 3214127

File tree

5 files changed

+332
-1
lines changed

5 files changed

+332
-1
lines changed

src/http/controller/admin/project.go

Lines changed: 142 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,142 @@
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+
"logic"
11+
"model"
12+
"net/http"
13+
"strings"
14+
15+
"github.com/labstack/echo"
16+
)
17+
18+
type ProjectController struct{}
19+
20+
// 注册路由
21+
func (self ProjectController) RegisterRoute(g *echo.Group) {
22+
g.GET("/crawl/project/list", self.ProjectList)
23+
g.POST("/crawl/project/query.html", self.ProjectQuery)
24+
g.Match([]string{"GET", "POST"}, "/crawl/project/new", self.CrawlProject)
25+
g.Match([]string{"GET", "POST"}, "/crawl/project/modify", self.Modify)
26+
}
27+
28+
// ProjectList 所有文章(分页)
29+
func (ProjectController) ProjectList(ctx echo.Context) error {
30+
curPage, limit := parsePage(ctx)
31+
articles, total := logic.DefaultArticle.FindArticleByPage(ctx, nil, curPage, limit)
32+
33+
if articles == nil {
34+
return ctx.HTML(http.StatusInternalServerError, "500")
35+
}
36+
37+
data := map[string]interface{}{
38+
"datalist": articles,
39+
"total": total,
40+
"totalPages": (total + limit - 1) / limit,
41+
"page": curPage,
42+
"limit": limit,
43+
}
44+
45+
return render(ctx, "article/list.html,article/query.html", data)
46+
}
47+
48+
// ProjectQuery
49+
func (ProjectController) ProjectQuery(ctx echo.Context) error {
50+
curPage, limit := parsePage(ctx)
51+
conds := parseConds(ctx, []string{"id", "domain", "title"})
52+
53+
articles, total := logic.DefaultArticle.FindArticleByPage(ctx, conds, curPage, limit)
54+
55+
if articles == nil {
56+
return ctx.HTML(http.StatusInternalServerError, "500")
57+
}
58+
59+
data := map[string]interface{}{
60+
"datalist": articles,
61+
"total": total,
62+
"totalPages": (total + limit - 1) / limit,
63+
"page": curPage,
64+
"limit": limit,
65+
}
66+
67+
return renderQuery(ctx, "article/query.html", data)
68+
}
69+
70+
// CrawlProject
71+
func (ProjectController) CrawlProject(ctx echo.Context) error {
72+
var data = make(map[string]interface{})
73+
74+
if ctx.FormValue("submit") == "1" {
75+
urls := strings.Split(ctx.FormValue("urls"), "\n")
76+
77+
var errMsg string
78+
for _, projectUrl := range urls {
79+
err := logic.DefaultProject.ParseProjectList(strings.TrimSpace(projectUrl))
80+
if err != nil {
81+
errMsg = err.Error()
82+
}
83+
}
84+
85+
if errMsg != "" {
86+
return fail(ctx, 1, errMsg)
87+
}
88+
return success(ctx, nil)
89+
}
90+
91+
return render(ctx, "project/new.html", data)
92+
}
93+
94+
// Modify
95+
func (self ProjectController) Modify(ctx echo.Context) error {
96+
var data = make(map[string]interface{})
97+
98+
if ctx.FormValue("submit") == "1" {
99+
user := ctx.Get("user").(*model.Me)
100+
errMsg, err := logic.DefaultArticle.Modify(ctx, user, ctx.FormParams())
101+
if err != nil {
102+
return fail(ctx, 1, errMsg)
103+
}
104+
return success(ctx, nil)
105+
}
106+
article, err := logic.DefaultArticle.FindById(ctx, ctx.QueryParam("id"))
107+
if err != nil {
108+
return ctx.Redirect(http.StatusSeeOther, ctx.Echo().URI(echo.HandlerFunc(self.ProjectList)))
109+
}
110+
111+
data["article"] = article
112+
data["statusSlice"] = model.ArticleStatusSlice
113+
data["langSlice"] = model.LangSlice
114+
115+
return render(ctx, "article/modify.html", data)
116+
117+
}
118+
119+
// /crawl/article/del
120+
// func DelArticleHandler(rw http.ResponseWriter, req *http.Request) {
121+
// var data = make(map[string]interface{})
122+
123+
// id := req.FormValue("id")
124+
125+
// if _, err := strconv.Atoi(id); err != nil {
126+
// data["ok"] = 0
127+
// data["error"] = "id不是整型"
128+
129+
// filter.SetData(req, data)
130+
// return
131+
// }
132+
133+
// if err := service.DelArticle(id); err != nil {
134+
// data["ok"] = 0
135+
// data["error"] = "删除失败!"
136+
// } else {
137+
// data["ok"] = 1
138+
// data["msg"] = "删除成功!"
139+
// }
140+
141+
// filter.SetData(req, data)
142+
// }

src/http/controller/admin/routes.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import "github.com/labstack/echo"
1111
func RegisterRoutes(g *echo.Group) {
1212
new(AuthorityController).RegisterRoute(g)
1313
new(ArticleController).RegisterRoute(g)
14+
new(ProjectController).RegisterRoute(g)
1415
new(RuleController).RegisterRoute(g)
1516
new(ReadingController).RegisterRoute(g)
1617
new(ToolController).RegisterRoute(g)

template/admin/project/modify.html

Lines changed: 161 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,161 @@
1+
{{define "content"}}
2+
<div class="pageheader notab">
3+
<h1 class="pagetitle">修改文章</h1>
4+
</div><!--pageheader-->
5+
6+
<div id="contentwraapper" class="contentwrapper">
7+
<div id="tooltip" class="red"></div>
8+
<form method="POST" action="/admin/crawl/article/modify" class="stdform_q">
9+
<input type="hidden" id="id" name="id" value="{{.article.Id}}" />
10+
<div class="contenttitle2">
11+
<h3>基本信息</h3>
12+
</div>
13+
<div>
14+
<p>
15+
<label>文章ID</label>
16+
<span class="field txt">
17+
{{.article.Id}}
18+
</span>
19+
</p>
20+
</div>
21+
<div>
22+
<p>
23+
<label for="title">标题</label>
24+
<span class="field">
25+
<input id="title" type="text" name="title" class="mediuminput required" value="{{.article.Title}}" />
26+
</span>
27+
</p>
28+
</div>
29+
<div>
30+
<p>
31+
<label for="url">文章原始链接</label>
32+
<span class="field">
33+
<input id="url" type="text" name="url" class="mediuminput required {url:true}" value="{{.article.Url}}" />&nbsp;<a href="{{.article.Url}}" target="_blank" style="color:blue;">查看</a>
34+
</span>
35+
</p>
36+
</div>
37+
<div>
38+
<p>
39+
<label>内容</label>
40+
<span class="field">
41+
<textarea name="content" rows="25" cols="144">{{noescape .article.Content}}</textarea>
42+
</span>
43+
</p>
44+
</div>
45+
<div>
46+
<p>
47+
<label for="author">作者(带HTML)</label>
48+
<span class="field">
49+
<input id="author" type="text" name="author" class="smallinput required" value="{{.article.Author}}" />
50+
</span>
51+
</p>
52+
<p>
53+
<label for="author_txt">作者(纯文本)</label>
54+
<span class="field">
55+
<input id="author_txt" type="text" name="author_txt" class="smallinput required" value="{{.article.AuthorTxt}}" />
56+
</span>
57+
</p>
58+
</div>
59+
<div>
60+
<p>
61+
<label for="pub_date">发布时间</label>
62+
<span class="field">
63+
<input id="pub_date" type="text" name="pub_date" class="smallinput required" value="{{.article.PubDate}}" />
64+
</span>
65+
</p>
66+
<p>
67+
<label>语言</label>
68+
<span class="field">
69+
<select name="lang" class="uniformselect">
70+
{{range $i, $v := .langSlice}}
71+
<option value="{{$i}}"{{if eq $i $.article.Lang}} selected{{end}}>{{$v}}</option>
72+
{{end}}
73+
</select>
74+
</span>
75+
</p>
76+
</div>
77+
<div>
78+
<p>
79+
<label for="tags">tags</label>
80+
<span class="field">
81+
<input id="tags" type="text" name="tags" class="smallinput" value="{{.article.Tags}}" />
82+
</span>
83+
</p>
84+
<p>
85+
<label>状态</label>
86+
<span class="field">
87+
<select name="status" class="uniformselect">
88+
{{range $i, $v := .statusSlice}}
89+
<option value="{{$i}}"{{if eq $i $.article.Status}} selected{{end}}>{{$v}}</option>
90+
{{end}}
91+
</select>
92+
</span>
93+
</p>
94+
</div>
95+
<div style="border:1px dashed;">
96+
<p>
97+
<label>推荐封面</label>
98+
<span class="upload_img_single"></span>
99+
</p>
100+
<p>
101+
<span class="field">
102+
<input type="text" name="cover" class="mediuminput img_url {url:true}" value="{{.article.Cover}}"/>
103+
</span>
104+
</p>
105+
<p>
106+
<span class="field">
107+
<a class="show_img" href="{{.article.Cover}}" target="_blank"><img class="show_img" src="{{.article.Cover}}" width="100" height="100"/></a>
108+
</span>
109+
</p>
110+
</div>
111+
<div>
112+
<p>
113+
<label>抓取时间</label>
114+
<span class="field txt">
115+
{{.article.Ctime}}
116+
</span>
117+
</p>
118+
<p>
119+
<label>最后修改时间</label>
120+
<span class="field txt">
121+
{{.article.Mtime}}
122+
</span>
123+
</p>
124+
<p>
125+
<label>最后操作人</label>
126+
<span class="field txt">
127+
<a class="normal" href="/admin/user/user/detail?username={{.article.OpUser}}" target="_blank">{{.article.OpUser}}</a>
128+
</span>
129+
</p>
130+
</div>
131+
<div class="contenttitle2">
132+
<h3>操作</h3>
133+
</div>
134+
<div>
135+
<p>
136+
<label>&nbsp;</label>
137+
<input type="submit" class="submit radius2" value="提交" />
138+
</p>
139+
</div>
140+
</form>
141+
<img id="loaders" src="/static/img/loaders/loader7.gif" alt="" class="hide">
142+
<div id="toast"></div>
143+
<br/>
144+
<br/>
145+
</div><!--contentwrapper-->
146+
{{end}}
147+
148+
{{define "css"}}
149+
<link href="/static/css/jquery.cftoaster.1.0.1.css" media="screen" rel="stylesheet" type="text/css">
150+
<link href="/static/css/Huploadify.css" media="screen" rel="stylesheet" type="text/css">
151+
{{end}}
152+
153+
{{define "js"}}
154+
<script type="text/javascript" src="/static/js/libs/jquery.validate.min.js"></script>
155+
<script type="text/javascript" src="/static/js/libs/jquery.metadata.js"></script>
156+
<script type="text/javascript" src="/static/js/libs/jquery.validate.msg.cn.js"></script>
157+
<script type="text/javascript" src="/static/js/libs/jquery.cftoaster.1.0.1.js"></script>
158+
<script type="text/javascript" src="/static/js/libs/jquery.Huploadify.js"></script>
159+
<script type="text/javascript" src="/static/js/admin/forms.js"></script>
160+
<script type="text/javascript" src="/static/js/upload.js?v=1.0"></script>
161+
{{end}}

template/admin/project/new.html

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
{{define "content"}}
2+
<div class="pageheader notab">
3+
<h1 class="pagetitle">抓取开源项目</h1>
4+
</div><!--pageheader-->
5+
6+
<div id="contentwraapper" class="contentwrapper">
7+
<div id="tooltip" class="red"></div>
8+
<form method="POST" action="/admin/crawl/project/new" class="stdform">
9+
<div>
10+
<p>
11+
<label for="url">项目列表URL</label>
12+
<span class="field">
13+
<textarea name="urls" rows="20" class="required"></textarea>&nbsp;一行一个
14+
</span>
15+
</p>
16+
</div>
17+
<div style="margin: 0 auto; width: 500px;"><input class="submit_btn" type="submit" name="save" value="提交" /></a></div>
18+
</form>
19+
<img id="loaders" src="/static/img/loaders/loader7.gif" alt="" class="hide"><blockquote></blockquote>
20+
</div><!--contentwrapper-->
21+
{{end}}
22+
23+
{{define "js"}}
24+
<script type="text/javascript" src="/static/js/libs/jquery.validate.min.js"></script>
25+
<script type="text/javascript" src="/static/js/libs/jquery.validate.msg.cn.js"></script>
26+
<script type="text/javascript" src="/static/js/admin/forms.js"></script>
27+
{{end}}

template/search.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@
4747
<div class="row">
4848
<div>
4949
<h2>
50-
<a href="/{{if eq .Objtype 0}}topics{{else if eq .Objtype 1}}articles{{else}}resources{{end}}/{{.Objid}}" target="_blank" title="{{.Title}}">{{noescape .HlTitle}}</a></h2>
50+
<a href="/{{if eq .Objtype 0}}topics{{else if eq .Objtype 1}}articles{{else if eq .Objtype 2}}resources{{else if eq .Objtype 4}}p{{else}}wiki{{end}}/{{.Objid}}" target="_blank" title="{{.Title}}">{{noescape .HlTitle}}</a></h2>
5151
{{if .Content}}
5252
<p class="text">{{noescape .HlContent}}<a href="/articles/{{.Objid}}" target="_blank" title="阅读全文">阅读全文</a></p>
5353
{{end}}

0 commit comments

Comments
 (0)