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

Skip to content

Commit 50b4651

Browse files
committed
改造成更通用的,可以后台配置,适合任意社区使用
1 parent d2a4040 commit 50b4651

31 files changed

+963
-144
lines changed

config/db.sql

Lines changed: 56 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,23 @@
1+
CREATE TABLE `website_setting` (
2+
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
3+
`name` varchar(63) NOT NULL DEFAULT '' COMMENT '网站名称',
4+
`domain` varchar(63) NOT NULL DEFAULT '' COMMENT '网站域名',
5+
`title_suffix` varchar(63) NOT NULL DEFAULT '' COMMENT '标题后缀',
6+
`favicon` varchar(127) NOT NULL DEFAULT '' COMMENT '自定义favicon',
7+
`logo` varchar(127) NOT NULL DEFAULT '' COMMENT '自定义logo',
8+
`start_year` int unsigned NOT NULL DEFAULT 0 COMMENT '网站运营开始年份',
9+
`blog_url` varchar(127) NOT NULL DEFAULT '' COMMENT '独立博客url,没有则留空',
10+
`slogan` varchar(127) NOT NULL DEFAULT '' COMMENT '网站slogan,在页脚最后',
11+
`beian` varchar(63) NOT NULL DEFAULT '' COMMENT '网站备案信息',
12+
`reading_menu` varchar(127) NOT NULL DEFAULT '' COMMENT '技术晨读菜单名,留空则用默认的',
13+
`docs_menu` varchar(255) NOT NULL DEFAULT '' COMMENT '官方文档菜单,json格式,留空则用默认',
14+
`footer_nav` varchar(1022) NOT NULL DEFAULT '' COMMENT '底部导航,json格式',
15+
`friends_logo` varchar(255) NOT NULL DEFAULT '' COMMENT '底部友情logo,json格式',
16+
`created_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT '创建时间',
17+
`updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '最后更新时间',
18+
PRIMARY KEY (`id`)
19+
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='网站设置信息';
20+
121
CREATE TABLE IF NOT EXISTS `topics` (
222
`tid` int unsigned NOT NULL AUTO_INCREMENT,
323
`title` varchar(255) NOT NULL,
@@ -182,16 +202,17 @@ CREATE TABLE IF NOT EXISTS `system_message` (
182202
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT 'system_message 系统消息表';
183203

184204
CREATE TABLE IF NOT EXISTS `wiki` (
185-
`id` int unsigned NOT NULL AUTO_INCREMENT,
205+
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
186206
`title` varchar(255) NOT NULL COMMENT 'wiki标题',
187207
`content` longtext NOT NULL COMMENT 'wiki内容',
188208
`uri` varchar(50) NOT NULL COMMENT 'uri',
189-
`uid` int unsigned NOT NULL COMMENT '作者',
190-
`cuid` varchar(100) NOT NULL DEFAULT '' COMMENT '贡献者',
191-
`ctime` timestamp NOT NULL DEFAULT 0,
209+
`uid` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '作者',
210+
`cuid` varchar(100) NOT NULL DEFAULT '' COMMENT '贡献者uid,多个逗号分隔',
211+
`viewnum` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '浏览数',
212+
`ctime` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
192213
`mtime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
193214
PRIMARY KEY (`id`),
194-
UNIQUE KEY (`uri`)
215+
UNIQUE KEY `uri` (`uri`)
195216
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT 'wiki页';
196217

197218
CREATE TABLE IF NOT EXISTS `resource` (
@@ -399,7 +420,7 @@ CREATE TABLE `book` (
399420
PRIMARY KEY (`id`),
400421
KEY `name` (`name`),
401422
KEY `created_at` (`created_at`)
402-
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='Go语言图书表';
423+
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='图书表';
403424

404425
CREATE TABLE IF NOT EXISTS `advertisement` (
405426
`id` int unsigned NOT NULL AUTO_INCREMENT,
@@ -417,4 +438,32 @@ CREATE TABLE IF NOT EXISTS `page_ad` (
417438
`source` varchar(20) NOT NULL DEFAULT '' COMMENT '广告来源,如 baidu_union,shiyanlou',
418439
`ctime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
419440
PRIMARY KEY (`id`)
420-
)ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT '页面广告管理表';
441+
)ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT '页面广告管理表';
442+
443+
CREATE TABLE IF NOT EXISTS `friend_link` (
444+
`id` int unsigned NOT NULL AUTO_INCREMENT,
445+
`name` varchar(15) NOT NULL DEFAULT '' COMMENT '链接名',
446+
`url` varchar(255) NOT NULL DEFAULT '' COMMENT '链接URL',
447+
`seq` smallint unsigned NOT NULL DEFAULT 100 COMMENT '排序',
448+
`logo` varchar(63) NOT NULL DEFAULT '' COMMENT 'LOGO url',
449+
`created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
450+
PRIMARY KEY (`id`)
451+
)ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT '友情链接';
452+
453+
CREATE TABLE IF NOT EXISTS `learning_material` (
454+
`id` int unsigned NOT NULL AUTO_INCREMENT,
455+
`title` varchar(31) NOT NULL DEFAULT '' COMMENT '标题',
456+
`url` varchar(63) NOT NULL DEFAULT '' COMMENT '资料URL',
457+
`type` tinyint unsigned NOT NULL DEFAULT 0 COMMENT '类型,0-文本;1-视频',
458+
`seq` smallint unsigned NOT NULL DEFAULT 100 COMMENT '排序',
459+
`first_url` varchar(63) NOT NULL DEFAULT '' COMMENT '开始学习的url',
460+
`created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
461+
PRIMARY KEY (`id`)
462+
)ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT '成体系的学习资料';
463+
464+
CREATE TABLE IF NOT EXISTS `default_avatar` (
465+
`id` int unsigned NOT NULL AUTO_INCREMENT,
466+
`filename` varchar(31) NOT NULL DEFAULT '' COMMENT '图像文件名',
467+
`created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
468+
PRIMARY KEY (`id`)
469+
)ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT '默认头像';

config/init.sql

Lines changed: 8 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -48,40 +48,16 @@ VALUES
4848
(35, '项目查询', 15, 34, '/admin/community/project/query.html', '', '2014-11-03 21:55:07', '2014-11-03 21:55:01'),
4949
(36, '项目上下线', 15, 34, '/admin/community/project/update_status', '', '2014-11-03 21:55:26', '2014-11-03 21:55:19'),
5050
(37, '规则查询', 19, 21, '/admin/crawl/rule/query.html', '', '2014-11-08 12:38:20', '2014-11-08 12:38:13'),
51-
(38, '用户修改', 1, 12, '/admin/user/user/modify', '', '2015-07-14 13:53:53', '2015-07-14 13:53:53');
51+
(38, '用户修改', 1, 12, '/admin/user/user/modify', '', '2015-07-14 13:53:53', '2015-07-14 13:53:53'),
52+
(39, '设置', 0, 0, '', '', '2017-05-21 16:03:00', '2017-05-21 16:03:59'),
53+
(40, '常规', 39, 0, '/admin/setting/genneral/modify', '', '2017-05-21 16:05:00', '2017-05-21 16:05:46'),
54+
(41, '导航', 39, 0, '/admin/setting/nav/modify', '', '2017-05-21 18:01:00', '2017-05-21 18:01:16');
5255

53-
INSERT INTO `topics_node` (`nid`, `parent`, `name`, `intro`, `ctime`)
56+
INSERT INTO `website_setting` (`id`, `name`, `domain`, `title_suffix`, `favicon`, `logo`, `start_year`, `blog_url`, `reading_menu`, `docs_menu`, `slogan`, `beian`, `friends_logo`, `footer_nav`, `created_at`, `updated_at`)
5457
VALUES
55-
(1, 0, 'Golang', 'Go语言基本问题探讨', '2013-03-15 14:38:09'),
56-
(2, 1, 'Go基础', 'Go语言基础、语法、规范等', '2013-03-15 14:38:09'),
57-
(3, 1, 'Go标准库', 'Go语言标准库使用、例子、源码等', '2013-03-15 14:38:09'),
58-
(4, 1, 'Go源码', '深入Go语言内部实现,分享Go语言源码学习心得', '2013-03-15 14:38:09'),
59-
(5, 1, 'Go Web开发', '用Go语言进行Web开发', '2013-03-15 14:38:09'),
60-
(6, 1, 'Go问与答', '任何关于Go语言的问题都可以到这里提', '2013-03-15 14:38:09'),
61-
(7, 1, 'Go动态', 'Go语言相关资讯和最新动态', '2013-03-15 14:38:09'),
62-
(8, 1, 'Go开发工具', '交流Go开发工具的使用', '2013-03-15 14:38:09'),
63-
(9, 0, '开源控', 'Golang本身开源,自然gopher们都是开源控', '2013-03-15 14:38:09'),
64-
(10, 9, 'Go Web框架', '开源的Go Web框架,你知道多少?使用了吗?', '2013-03-15 14:38:09'),
65-
(11, 9, 'Go第三方库', '第三方Go库,你都用了哪些?', '2013-03-15 14:38:09'),
66-
(12, 9, 'Go代码分享', '和gopher们分享您自己的Go代码吧', '2013-03-15 14:38:09'),
67-
(13, 9, 'Go资料', '好多Go语言资料啊,学习学习……', '2013-03-15 14:38:09'),
68-
(14, 0, 'Study Golang', 'Golang China,Go语言学习园地,中文社区', '2013-03-15 14:38:09'),
69-
(15, 14, '社区公告', '社区最新动态、公共以及其他信息', '2013-03-15 14:38:09'),
70-
(16, 14, '反馈', '使用过程中遇到了问题,可以在这里提交', '2013-03-15 14:38:09'),
71-
(17, 14, '社区开发', '对开发该社区感兴趣的可以一起加入进来哦', '2013-03-15 14:38:09'),
72-
(18, 0, '分享', '分享生活、学习、工作等方方面面', '2013-03-18 18:02:21'),
73-
(19, 18, 'Markdown', '当下Markdown是相当火,本站就使用Markdown发帖,有必要聊聊它的使用', '2013-03-18 18:05:08'),
74-
(20, 1, 'Go实战', 'Go语言实际使用经验交流', '2013-03-20 17:43:00'),
75-
(21, 1, 'Go工具链', '(go tool chain)Go提供的各种工具学习、使用', '2013-05-09 16:23:57'),
76-
(22, 18, '招聘', '发布Go语言招聘信息', '2013-10-23 20:56:38'),
77-
(23, 18, '杂谈', 'Go相关或不太相关的杂谈', '2014-04-02 22:39:07'),
78-
(24, 0, '其他语言', '非Go语言的相关交流', '2016-04-09 09:06:30'),
79-
(25, 24, 'Python交流', '关于Python语言的交流', '2016-04-09 09:06:49');
58+
(1, 'Go语言中文网', 'studygolang.com', '| Go语言中文网 | Golang中文社区 | Golang中国', '/static/img/go.ico', '/static/img/logo1.png', 2013, 'http://blog.studygolang.com', '', '', 'Go语言中文网,中国 Golang 社区,致力于构建完善的 Golang 中文社区,Go语言爱好者的学习家园。', '京ICP备14030343号-1', '[{\"image\":\"http://p3.ucai.cn/static/i3/mission/moblie_ucai_logo.png\",\"url\":\"http://www.ucai.cn/?fr=studygolang\",\"name\":\"\",\"width\":\"175px\",\"height\":\"45px\"},{\"image\":\"http://studygolang.qiniudn.com/ad/aliyun_logo2.png\",\"url\":\"http://www.ucai.cn/?fr=studygolang\",\"name\":\"\",\"width\":\"300px\",\"height\":\"60px\"},{\"image\":\"http://qiniutek.com/images/logo-2.png\",\"url\":\"https://portal.qiniu.com/signup?code=3lfz4at7pxfma\",\"name\":\"\",\"width\":\"290px\",\"height\":\"45px\"}]', '[{\"name\":\"关于\",\"url\":\"/wiki/about\",\"outer_site\":false},{\"name\":\"贡献者\",\"url\":\"/wiki/contributors\",\"outer_site\":false},{\"name\":\"帮助推广\",\"url\":\"/wiki\",\"outer_site\":false},{\"name\":\"反馈\",\"url\":\"/topics/node/16\",\"outer_site\":false},{\"name\":\"Github\",\"url\":\"https://github.com/studygolang\",\"outer_site\":true},{\"name\":\"新浪微博\",\"url\":\"http://weibo.com/studygolang\",\"outer_site\":true},{\"name\":\"内嵌Wide\",\"url\":\"/wide/playground\",\"outer_site\":false},{\"name\":\"免责声明\",\"url\":\"/wiki/duty\",\"outer_site\":false}]', '2017-05-21 10:22:00', '2017-05-21 21:30:56');
8059

81-
INSERT INTO `resource_category` (`catid`, `name`, `intro`, `ctime`)
60+
INSERT INTO `friend_link` (`id`, `name`, `url`, `seq`, `logo`, `created_at`)
8261
VALUES
83-
(1, '精彩文章', '分享来自互联网关于Go语言的精彩文章', '2013-03-23 20:23:29'),
84-
(2, '开源项目', '收集优秀的开源项目、第三方库', '2013-03-23 20:23:29'),
85-
(3, 'Go语言资料', 'Go语言书籍、资料,提供下载地址或在线链接', '2013-03-23 20:23:29'),
86-
(4, '其他资源', '分享跟Go相关或其他有用的资源', '2013-03-25 23:35:07');
62+
(1, 'Go语言中文网', 'http://studygolang.com', 0, '', '2017-05-21 14:52:07');
8763

src/global/app.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ import (
2626
"flag"
2727
"fmt"
2828
"io"
29+
"model"
2930
"os"
3031
"time"
3132

@@ -45,6 +46,8 @@ type app struct {
4546
Version string
4647
Date time.Time
4748

49+
Copyright string
50+
4851
// 启动时间
4952
LaunchTime time.Time
5053
Uptime time.Duration
@@ -92,6 +95,15 @@ func (this *app) SetUptime() {
9295
this.Uptime = time.Now().Sub(this.LaunchTime)
9396
}
9497

98+
func (this *app) SetCopyright(websiteSetting *model.WebsiteSetting) {
99+
curYear := time.Now().Year()
100+
if curYear == websiteSetting.StartYear {
101+
this.Copyright = fmt.Sprintf("%d %s", websiteSetting.StartYear, websiteSetting.Domain)
102+
} else {
103+
this.Copyright = fmt.Sprintf("%d-%d %s", websiteSetting.StartYear, curYear, websiteSetting.Domain)
104+
}
105+
}
106+
95107
func PrintVersion(w io.Writer) {
96108
if !flag.Parsed() {
97109
flag.Parse()

src/http/controller/admin/routes.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,4 +15,5 @@ func RegisterRoutes(g *echo.Group) {
1515
new(RuleController).RegisterRoute(g)
1616
new(ReadingController).RegisterRoute(g)
1717
new(ToolController).RegisterRoute(g)
18+
new(SettingController).RegisterRoute(g)
1819
}

src/http/controller/admin/setting.go

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
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+
12+
"github.com/labstack/echo"
13+
)
14+
15+
type SettingController struct{}
16+
17+
// 注册路由
18+
func (self SettingController) RegisterRoute(g *echo.Group) {
19+
g.Match([]string{"GET", "POST"}, "/setting/genneral/modify", self.GenneralModify)
20+
g.Match([]string{"GET", "POST"}, "/setting/nav/modify", self.NavModify)
21+
}
22+
23+
// GenneralModify 常规选项修改
24+
func (self SettingController) GenneralModify(ctx echo.Context) error {
25+
if ctx.FormValue("submit") == "1" {
26+
err := logic.DefaultSetting.Update(ctx, ctx.FormParams())
27+
if err != nil {
28+
return fail(ctx, 1, err.Error())
29+
}
30+
31+
return success(ctx, nil)
32+
}
33+
34+
return render(ctx, "setting/genneral.html", nil)
35+
}
36+
37+
// NavModify 菜单、导航修改
38+
func (self SettingController) NavModify(ctx echo.Context) error {
39+
if ctx.FormValue("submit") == "1" {
40+
err := logic.DefaultSetting.Update(ctx, ctx.FormParams())
41+
if err != nil {
42+
return fail(ctx, 1, err.Error())
43+
}
44+
45+
return success(ctx, nil)
46+
}
47+
return render(ctx, "setting/menu_nav.html", nil)
48+
}

src/http/controller/index.go

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ func (IndexController) Index(ctx echo.Context) error {
5858
}
5959
}
6060

61-
// Golang 资源
61+
// 资源
6262
resources := logic.DefaultResource.FindBy(ctx, 10)
6363

6464
books := logic.DefaultGoBook.FindBy(ctx, 24)
@@ -68,7 +68,18 @@ func (IndexController) Index(ctx echo.Context) error {
6868
books = books[bookStart : bookStart+bookNum]
6969
}
7070

71-
return render(ctx, "index.html", map[string]interface{}{"topics": topicsList, "articles": recentArticles, "likeflags": likeFlags, "resources": resources, "books": books})
71+
// 学习资料
72+
materials := logic.DefaultLearningMaterial.FindAll(ctx)
73+
74+
return render(ctx, "index.html",
75+
map[string]interface{}{
76+
"topics": topicsList,
77+
"articles": recentArticles,
78+
"likeflags": likeFlags,
79+
"resources": resources,
80+
"books": books,
81+
"materials": materials,
82+
})
7283
}
7384

7485
// WrapUrl 包装链接

src/http/controller/sidebar.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ func (self SidebarController) RegisterRoute(g *echo.Group) {
3232
g.GET("/nodes/hot", self.HotNodes)
3333
g.GET("/users/active", self.ActiveUser)
3434
g.GET("/users/newest", self.NewestUser)
35+
g.GET("/friend/links", self.FriendLinks)
3536
}
3637

3738
// RecentReading 技术晨读
@@ -140,3 +141,9 @@ func (SidebarController) NewestUser(ctx echo.Context) error {
140141
newestUsers := logic.DefaultUser.FindNewUsers(ctx, 9)
141142
return success(ctx, newestUsers)
142143
}
144+
145+
// FriendLinks 友情链接
146+
func (SidebarController) FriendLinks(ctx echo.Context) error {
147+
friendLinks := logic.DefaultFriendLink.FindAll(ctx)
148+
return success(ctx, friendLinks)
149+
}

src/http/http.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -212,6 +212,7 @@ func executeTpl(ctx echo.Context, tpl *template.Template, data map[string]interf
212212
data["wshost"] = global.App.Host + ":" + global.App.Port
213213
}
214214
global.App.SetUptime()
215+
global.App.SetCopyright(logic.WebsiteSetting)
215216

216217
isHttps := goutils.MustBool(ctx.Request().Header().Get("X-Https"))
217218
cdnDomain := global.App.CDNHttp
@@ -224,6 +225,8 @@ func executeTpl(ctx echo.Context, tpl *template.Template, data map[string]interf
224225

225226
data["online_users"] = map[string]int{"online": logic.Book.Len(), "maxonline": logic.MaxOnlineNum()}
226227

228+
data["setting"] = logic.WebsiteSetting
229+
227230
buf := new(bytes.Buffer)
228231
err := tpl.Execute(buf, data)
229232
if err != nil {

src/logic/article.go

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@ import (
1717
"time"
1818

1919
"github.com/PuerkitoBio/goquery"
20-
"github.com/polaris1119/config"
2120
"github.com/polaris1119/logger"
2221
"github.com/polaris1119/times"
2322
"golang.org/x/net/context"
@@ -217,8 +216,8 @@ func (self ArticleLogic) Publish(ctx context.Context, me *model.Me, form url.Val
217216
objLog := GetLogger(ctx)
218217

219218
article := &model.Article{
220-
Domain: config.ConfigFile.MustValue("global", "domain", "studygolang.com"),
221-
Name: config.ConfigFile.MustValue("global", "website_name", "Go语言中文网"),
219+
Domain: WebsiteSetting.Domain,
220+
Name: WebsiteSetting.Name,
222221
Author: me.Username,
223222
AuthorTxt: me.Username,
224223
Title: form.Get("title"),

src/logic/data.go

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,10 @@ var (
3535
catRWMutex sync.RWMutex
3636
// 资源分类
3737
AllCategory []*model.ResourceCat
38+
39+
WebsiteSetting = &model.WebsiteSetting{}
40+
41+
DefaultAvatars []string
3842
)
3943

4044
// 将所有 权限 加载到内存中;后台修改权限时,重新加载一次
@@ -153,6 +157,36 @@ func LoadNodes() error {
153157
return nil
154158
}
155159

160+
func LoadWebsiteSetting() error {
161+
_, err := MasterDB.Get(WebsiteSetting)
162+
if err != nil {
163+
logger.Errorln("LoadWebsiteSetting read fail:", err)
164+
return err
165+
}
166+
167+
logger.Infoln("LoadWebsiteSetting successfully!")
168+
169+
return nil
170+
}
171+
172+
func LoadDefaultAvatar() error {
173+
defaultAvatars := make([]*model.DefaultAvatar, 0)
174+
err := MasterDB.Find(&defaultAvatars)
175+
if err != nil {
176+
logger.Errorln("LoadDefaultAvatar Find fail:", err)
177+
return err
178+
}
179+
180+
DefaultAvatars = make([]string, len(defaultAvatars))
181+
for i, defaultAvatar := range defaultAvatars {
182+
DefaultAvatars[i] = defaultAvatar.Filename
183+
}
184+
185+
logger.Infoln("LoadDefaultAvatar successfully!")
186+
187+
return nil
188+
}
189+
156190
// 获得单个节点名
157191
func GetNodeName(nid int) string {
158192
nodeRWMutex.RLock()

0 commit comments

Comments
 (0)