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

Skip to content

Commit 72ccccb

Browse files
committed
增加积分财富功能
1 parent 2ef47de commit 72ccccb

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

44 files changed

+1354
-47
lines changed

config/db.sql

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,7 @@ CREATE TABLE IF NOT EXISTS `user_info` (
119119
`monlog` varchar(140) NOT NULL DEFAULT '' COMMENT '个人状态,签名,独白',
120120
`introduce` text NOT NULL COMMENT '个人简介',
121121
`unsubscribe` tinyint unsigned NOT NULL DEFAULT 0 COMMENT '是否退订本站邮件,0-否;1-是',
122+
`balance` int unsigned NOT NULL DEFAULT 0 COMMENT '财富余额(铜币)',
122123
`status` tinyint unsigned NOT NULL DEFAULT 0 COMMENT '用户账号状态。0-默认;1-已审核;2-拒绝;3-冻结;4-停号',
123124
`is_root` tinyint unsigned NOT NULL DEFAULT 0 COMMENT '是否超级用户,不受权限控制:1-是',
124125
`ctime` timestamp NOT NULL DEFAULT 0,
@@ -476,3 +477,49 @@ CREATE TABLE IF NOT EXISTS `default_avatar` (
476477
PRIMARY KEY (`id`)
477478
)ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT '默认头像';
478479

480+
CREATE TABLE IF NOT EXISTS `user_setting` (
481+
`id` int unsigned NOT NULL AUTO_INCREMENT,
482+
`key` varchar(31) NOT NULL DEFAULT '' COMMENT '配置项名称',
483+
`value` int NOT NULL DEFAULT 0 COMMENT '配置项值',
484+
`remark` varchar(255) NOT NULL DEFAULT '' COMMENT '配置项说明',
485+
`created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
486+
PRIMARY KEY (`id`),
487+
UNIQUE uniq_key(`key`)
488+
)ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT '用户行为信息设置';
489+
490+
CREATE TABLE IF NOT EXISTS `user_balance_detail` (
491+
`id` int unsigned NOT NULL AUTO_INCREMENT,
492+
`uid` int unsigned NOT NULL DEFAULT 0 COMMENT '用户UID',
493+
`type` tinyint unsigned NOT NULL DEFAULT 1 COMMENT '类型',
494+
`num` int NOT NULL DEFAULT 0 COMMENT '数额,负数表示减少,正数表示增加',
495+
`balance` int unsigned NOT NULL DEFAULT 0 COMMENT '余额(铜币)',
496+
`desc` varchar(1022) NOT NULL DEFAULT '' COMMENT '具体原因,支持html格式',
497+
`created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
498+
PRIMARY KEY (`id`),
499+
INDEX idx_uid(`uid`)
500+
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT '用户余额明细';
501+
502+
CREATE TABLE IF NOT EXISTS `mission` (
503+
`id` int unsigned NOT NULL AUTO_INCREMENT,
504+
`name` varchar(31) NOT NULL DEFAULT '' COMMENT '任务名,如每日登录奖励',
505+
`type` tinyint unsigned NOT NULL DEFAULT 1 COMMENT '类型 1-每日登录奖励,2-初始资本,3-分享获得',
506+
`fixed` int unsigned NOT NULl DEFAULT 0 COMMENT '固定奖励多少铜币',
507+
`min` int unsigned NOT NULL DEFAULT 0 COMMENT '奖励最少铜币,连续型任务',
508+
`max` int unsigned NOT NULL DEFAULT 0 COMMENT '奖励最多铜币,连续型任务',
509+
`incr` int unsigned NOT NULL DEFAULT 0 COMMENT '连续登录增量,连续型任务',
510+
`state` tinyint unsigned NOT NULL DEFAULT 0 COMMENT '状态: 0-正常,未完成;1-已过期;2-已下线',
511+
`created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
512+
PRIMARY KEY (`id`)
513+
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT '任务表';
514+
515+
CREATE TABLE IF NOT EXISTS `user_login_mission` (
516+
`uid` int unsigned NOT NULL DEFAULT 0 COMMENT '用户UID',
517+
`date` int unsigned NOT NULL DEFAULT 0 COMMENT '最新领取日期',
518+
`award` int unsigned NOT NULL DEFAULT 0 COMMENT '最新领取的奖励(铜币)',
519+
`days` int unsigned NOT NULL DEFAULT 0 COMMENT '连续登录领取天数',
520+
`total_days` int unsigned NOT NULL DEFAULT 0 COMMENT '总登录领取天数',
521+
`updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '最后更新时间',
522+
PRIMARY KEY (`uid`)
523+
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT '用户登录任务';
524+
525+

config/init.sql

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,3 +61,13 @@ INSERT INTO `friend_link` (`id`, `name`, `url`, `seq`, `logo`, `created_at`)
6161
VALUES
6262
(1, 'Go语言中文网', 'http://studygolang.com', 0, '', '2017-05-21 14:52:07');
6363

64+
INSERT INTO `user_setting` (`id`, `key`, `value`, `remark`, `created_at`)
65+
VALUES
66+
(1, 'new_user_wait', 0, '新用户注册多久能发布帖子,单位秒,0表示没限制', '2017-05-30 18:11:31'),
67+
(2, 'can_edit_time', 300, '发布后多久内能够编辑,单位秒', '2017-05-30 18:12:53');
68+
69+
INSERT INTO `mission` (`id`, `name`, `type`, `fixed`, `min`, `max`, `incr`, `state`, `created_at`)
70+
VALUES
71+
(1, '初始资本', 2, 2000, 0, 0, 0, 0, '2017-06-03 22:44:59'),
72+
(2, '每日登录任务', 1, 0, 25, 50, 5, 0, '2017-06-05 13:35:16');
73+

src/global/chan.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,4 +9,4 @@ package global
99
var AuthorityChan = make(chan struct{}, 1)
1010
var RoleChan = make(chan struct{}, 1)
1111
var RoleAuthChan = make(chan struct{}, 1)
12-
var UserSetting = make(chan struct{}, 1)
12+
var UserSettingChan = make(chan struct{}, 1)

src/http/controller/article.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ func (self ArticleController) RegisterRoute(g *echo.Group) {
3737

3838
g.Get("/articles/:id", self.Detail)
3939

40-
g.Match([]string{"GET", "POST"}, "/articles/new", self.Create, middleware.NeedLogin(), middleware.Sensivite(), middleware.PublishNotice())
40+
g.Match([]string{"GET", "POST"}, "/articles/new", self.Create, middleware.NeedLogin(), middleware.Sensivite(), middleware.BalanceCheck(), middleware.PublishNotice())
4141
g.Post("/articles/modify", self.Modify, middleware.NeedLogin(), middleware.Sensivite())
4242
}
4343

src/http/controller/balance.go

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
// Copyright 2017 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+
"http/middleware"
11+
"logic"
12+
"model"
13+
14+
"github.com/labstack/echo"
15+
)
16+
17+
type UserRichController struct{}
18+
19+
// 注册路由
20+
func (self UserRichController) RegisterRoute(g *echo.Group) {
21+
g.Get("/balance", self.MyBalance, middleware.NeedLogin())
22+
}
23+
24+
func (UserRichController) MyBalance(ctx echo.Context) error {
25+
me := ctx.Get("user").(*model.Me)
26+
balanceDetails := logic.DefaultUserRich.FindBalanceDetail(ctx, me)
27+
28+
data := map[string]interface{}{
29+
"details": balanceDetails,
30+
}
31+
return render(ctx, "rich/balance.html", data)
32+
}

src/http/controller/comment.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ type CommentController struct{}
2222

2323
func (self CommentController) RegisterRoute(g *echo.Group) {
2424
g.Get("/at/users", self.AtUsers)
25-
g.Post("/comment/:objid", self.Create, middleware.NeedLogin(), middleware.Sensivite(), middleware.PublishNotice())
25+
g.Post("/comment/:objid", self.Create, middleware.NeedLogin(), middleware.Sensivite(), middleware.BalanceCheck(), middleware.PublishNotice())
2626
g.Get("/object/comments", self.CommentList)
2727
}
2828

src/http/controller/index.go

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -71,14 +71,22 @@ func (IndexController) Index(ctx echo.Context) error {
7171
// 学习资料
7272
materials := logic.DefaultLearningMaterial.FindAll(ctx)
7373

74+
hasLoginMisson := false
75+
me, ok := ctx.Get("user").(*model.Me)
76+
if ok {
77+
// 每日登录奖励
78+
hasLoginMisson = logic.DefaultMission.HasLoginMission(ctx, me)
79+
}
80+
7481
return render(ctx, "index.html",
7582
map[string]interface{}{
76-
"topics": topicsList,
77-
"articles": recentArticles,
78-
"likeflags": likeFlags,
79-
"resources": resources,
80-
"books": books,
81-
"materials": materials,
83+
"topics": topicsList,
84+
"articles": recentArticles,
85+
"likeflags": likeFlags,
86+
"resources": resources,
87+
"books": books,
88+
"materials": materials,
89+
"login_mission": hasLoginMisson,
8290
})
8391
}
8492

src/http/controller/mission.go

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
// Copyright 2017 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+
"http/middleware"
11+
"logic"
12+
"model"
13+
"net/http"
14+
"strconv"
15+
16+
"github.com/labstack/echo"
17+
"github.com/polaris1119/times"
18+
)
19+
20+
type MissionController struct{}
21+
22+
// 注册路由
23+
func (self MissionController) RegisterRoute(g *echo.Group) {
24+
g.Get("/mission/daily", self.Daily, middleware.NeedLogin())
25+
g.Get("/mission/daily/redeem", self.DailyRedeem, middleware.NeedLogin())
26+
g.Get("/mission/complete/:id", self.Complete, middleware.NeedLogin())
27+
}
28+
29+
func (MissionController) Daily(ctx echo.Context) error {
30+
me := ctx.Get("user").(*model.Me)
31+
userLoginMission := logic.DefaultMission.FindLoginMission(ctx, me)
32+
33+
data := map[string]interface{}{"login_mission": userLoginMission}
34+
if userLoginMission != nil && times.Format("Ymd") == strconv.Itoa(userLoginMission.Date) {
35+
data["had_redeem"] = true
36+
} else {
37+
data["had_redeem"] = false
38+
}
39+
40+
fr := ctx.QueryParam("fr")
41+
if fr == "redeem" {
42+
data["show_msg"] = true
43+
}
44+
return render(ctx, "mission/daily.html", data)
45+
}
46+
47+
func (MissionController) DailyRedeem(ctx echo.Context) error {
48+
me := ctx.Get("user").(*model.Me)
49+
logic.DefaultMission.RedeemLoginAward(ctx, me)
50+
51+
return ctx.Redirect(http.StatusSeeOther, "/mission/daily?fr=redeem")
52+
}
53+
54+
func (MissionController) Complete(ctx echo.Context) error {
55+
me := ctx.Get("user").(*model.Me)
56+
id := ctx.Param("id")
57+
logic.DefaultMission.Complete(ctx, me, id)
58+
59+
return ctx.Redirect(http.StatusSeeOther, "/balance")
60+
}

src/http/controller/project.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ type ProjectController struct{}
3030
// 注册路由
3131
func (self ProjectController) RegisterRoute(g *echo.Group) {
3232
g.GET("/projects", self.ReadList)
33-
g.Match([]string{"GET", "POST"}, "/project/new", self.Create, middleware.NeedLogin(), middleware.Sensivite(), middleware.PublishNotice())
33+
g.Match([]string{"GET", "POST"}, "/project/new", self.Create, middleware.NeedLogin(), middleware.Sensivite(), middleware.BalanceCheck(), middleware.PublishNotice())
3434
g.Match([]string{"GET", "POST"}, "/project/modify", self.Modify, middleware.NeedLogin(), middleware.Sensivite())
3535
g.GET("/p/:uri", self.Detail)
3636
g.GET("/project/uri", self.CheckExist)

src/http/controller/resource.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ func (self ResourceController) RegisterRoute(g *echo.Group) {
3333
g.GET("/resources", self.ReadList)
3434
g.GET("/resources/cat/:catid", self.ReadCatResources)
3535
g.GET("/resources/:id", self.Detail)
36-
g.Match([]string{"GET", "POST"}, "/resources/new", self.Create, middleware.NeedLogin(), middleware.Sensivite(), middleware.PublishNotice())
36+
g.Match([]string{"GET", "POST"}, "/resources/new", self.Create, middleware.NeedLogin(), middleware.Sensivite(), middleware.BalanceCheck(), middleware.PublishNotice())
3737
g.Match([]string{"GET", "POST"}, "/resources/modify", self.Modify, middleware.NeedLogin(), middleware.Sensivite())
3838
}
3939

src/http/controller/routes.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,8 @@ func RegisterRoutes(g *echo.Group) {
2828
new(ImageController).RegisterRoute(g)
2929
new(CaptchaController).RegisterRoute(g)
3030
new(BookController).RegisterRoute(g)
31+
new(MissionController).RegisterRoute(g)
32+
new(UserRichController).RegisterRoute(g)
3133
new(WebsocketController).RegisterRoute(g)
3234

3335
new(InstallController).RegisterRoute(g)

src/http/controller/topic.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ func (self TopicController) RegisterRoute(g *echo.Group) {
3636
g.GET("/topics/:tid", self.Detail)
3737
g.GET("/topics/node/:nid", self.NodeTopics)
3838

39-
g.Match([]string{"GET", "POST"}, "/topics/new", self.Create, middleware.NeedLogin(), middleware.Sensivite(), middleware.PublishNotice())
39+
g.Match([]string{"GET", "POST"}, "/topics/new", self.Create, middleware.NeedLogin(), middleware.Sensivite(), middleware.BalanceCheck(), middleware.PublishNotice())
4040
g.Match([]string{"GET", "POST"}, "/topics/modify", self.Modify, middleware.NeedLogin(), middleware.Sensivite())
4141
}
4242

src/http/controller/wiki.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ type WikiController struct{}
3030

3131
// 注册路由
3232
func (self WikiController) RegisterRoute(g *echo.Group) {
33-
g.Match([]string{"GET", "POST"}, "/wiki/new", self.Create, middleware.NeedLogin(), middleware.Sensivite())
33+
g.Match([]string{"GET", "POST"}, "/wiki/new", self.Create, middleware.NeedLogin(), middleware.Sensivite(), middleware.BalanceCheck())
3434
g.Match([]string{"GET", "POST"}, "/wiki/modify", self.Modify, middleware.NeedLogin(), middleware.Sensivite())
3535
g.GET("/wiki", self.ReadList)
3636
g.GET("/wiki/:uri", self.Detail)

src/http/middleware/balance_check.go

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
// Copyright 2017 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 middleware
8+
9+
import (
10+
"model"
11+
"net/http"
12+
"util"
13+
14+
"github.com/labstack/echo"
15+
)
16+
17+
// BalanceCheck 用于 echo 框架,用户发布内容校验余额是否足够
18+
func BalanceCheck() echo.MiddlewareFunc {
19+
return func(next echo.HandlerFunc) echo.HandlerFunc {
20+
return func(ctx echo.Context) error {
21+
22+
if util.IsAjax(ctx) {
23+
24+
curUser := ctx.Get("user").(*model.Me)
25+
26+
title := ctx.FormValue("title")
27+
content := ctx.FormValue("content")
28+
if ctx.Request().Method() == "POST" && (title != "" || content != "") {
29+
if ctx.Path() == "/comment/:objid" {
30+
if curUser.Balance < 5 {
31+
return ctx.String(http.StatusOK, `{"ok":0,"error":"对不起,您的账号余额不足!"}`)
32+
}
33+
} else {
34+
if curUser.Balance < 20 {
35+
return ctx.String(http.StatusOK, `{"ok":0,"error":"对不起,您的账号余额不足!"}`)
36+
}
37+
}
38+
}
39+
}
40+
41+
if err := next(ctx); err != nil {
42+
return err
43+
}
44+
45+
return nil
46+
}
47+
}
48+
}

src/http/middleware/notice.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,9 @@
1+
// Copyright 2017 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+
17
package middleware
28

39
import (

src/http/middleware/sensitive.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@
77
package middleware
88

99
import (
10-
"errors"
1110
"logic"
11+
"net/http"
1212
"strings"
1313

1414
"model"
@@ -43,7 +43,7 @@ func Sensivite() echo.MiddlewareFunc {
4343
// 把账号冻结
4444
logic.DefaultUser.UpdateUserStatus(ctx, user.Uid, model.UserStatusFreeze)
4545
logger.Infoln("user=", user.Uid, "publish ad, title=", title, ". freeze")
46-
return errors.New("对不起,您的账号已被冻结!")
46+
return ctx.String(http.StatusOK, `{"ok":0,"error":"对不起,您的账号已被冻结!"}`)
4747
}
4848
}
4949
}
@@ -52,7 +52,7 @@ func Sensivite() echo.MiddlewareFunc {
5252
// 把账号冻结
5353
logic.DefaultUser.UpdateUserStatus(ctx, user.Uid, model.UserStatusFreeze)
5454
logger.Infoln("user=", user.Uid, "publish ad, title=", title, ";content=", content, ". freeze")
55-
return errors.New("对不起,您的账号已被冻结!")
55+
return ctx.String(http.StatusOK, `{"ok":0,"error":"对不起,您的账号已被冻结!"}`)
5656
}
5757

5858
if err := next(ctx); err != nil {

0 commit comments

Comments
 (0)