Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
C
courseSign
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
JIRA
JIRA
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Registry
Registry
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
szh
courseSign
Commits
1996b12a
Commit
1996b12a
authored
Nov 22, 2024
by
szh
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
add device code
parent
d447e2b6
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
12 changed files
with
786 additions
and
4 deletions
+786
-4
course_action_users.go
server/api/v1/course/course_action_users.go
+106
-2
course_users.go
server/api/v1/course/course_users.go
+59
-0
docs.go
server/docs/docs.go
+220
-0
swagger.json
server/docs/swagger.json
+220
-0
swagger.yaml
server/docs/swagger.yaml
+148
-0
router.go
server/initialize/router.go
+1
-0
course_users.go
server/model/course/course_users.go
+1
-0
courser_action_users.go
server/model/course/request/courser_action_users.go
+9
-2
jwt.go
server/model/system/request/jwt.go
+1
-0
course_action_users.go
server/router/course/course_action_users.go
+10
-0
course_users.go
server/router/course/course_users.go
+1
-0
utils.go
server/utils/utils.go
+10
-0
No files found.
server/api/v1/course/course_action_users.go
View file @
1996b12a
...
...
@@ -9,6 +9,7 @@ import (
"courseSign/server/model/course"
courseReq
"courseSign/server/model/course/request"
"courseSign/server/service"
"courseSign/server/utils"
"github.com/gin-gonic/gin"
"go.uber.org/zap"
"gorm.io/gorm"
...
...
@@ -297,4 +298,108 @@ func (courseActionUsersApi *CourseActionUsersApi) GetMyAction(c *gin.Context) {
PageSize
:
pageInfo
.
PageSize
,
},
"获取成功"
,
c
)
}
}
\ No newline at end of file
}
// WebSignAction 设备码签到
// @Tags CourseActionUsers
// @Summary 设备码签到
// @accept application/json
// @Produce application/json
// @Param data body courseReq.ReqCode true "设备码签到"
// @Success 200 {string} string "{"success":true,"data":{},"msg":"获取成功"}"
// @Router /courseActionUsers/signActionWeb [post]
func
(
courseActionUsersApi
*
CourseActionUsersApi
)
WebSignAction
(
c
*
gin
.
Context
)
{
var
reqCode
courseReq
.
ReqCode
err
:=
c
.
ShouldBindJSON
(
&
reqCode
)
if
err
!=
nil
{
response
.
FailWithMessage
(
err
.
Error
(),
c
)
return
}
if
reqCode
.
DeviceCode
==
""
||
reqCode
.
Aid
==
0
{
response
.
FailWithMessage
(
"invalid params"
,
c
)
return
}
j
:=
utils
.
NewJWT
()
cliams
,
err
:=
j
.
ParseToken
(
reqCode
.
DeviceCode
)
if
err
!=
nil
{
response
.
FailWithMessage
(
err
.
Error
(),
c
)
return
}
actionInfo
,
err
:=
courseActionService
.
GetCourseAction
(
uint
(
reqCode
.
Aid
))
if
err
!=
nil
{
response
.
FailWithMessage
(
err
.
Error
(),
c
)
return
}
user
,
err
:=
courseUsersService
.
GetCourseUsersByAddr
(
cliams
.
Username
)
if
err
!=
nil
{
response
.
FailWithMessage
(
err
.
Error
(),
c
)
return
}
if
user
.
Invitor
==
""
{
response
.
FailWithMessage
(
"没有推荐者"
,
c
)
return
}
//检查活动是否已签到
actionSign
,
err
:=
courseActionUsersService
.
GetCourseActionUsersByUidAndAid
(
reqCode
.
Aid
,
int
(
user
.
ID
))
if
err
!=
nil
&&
err
!=
gorm
.
ErrRecordNotFound
{
response
.
FailWithMessage
(
err
.
Error
(),
c
)
return
}
if
actionSign
.
ID
>
0
{
response
.
FailWithMessage
(
"已签到"
,
c
)
return
}
// 检查课程活动 信息
courseAction
,
err
:=
courseActionService
.
GetCourseAction
(
uint
(
*
actionInfo
.
Cid
))
if
err
!=
nil
{
response
.
FailWithMessage
(
err
.
Error
(),
c
)
return
}
if
!*
courseAction
.
IsShow
{
response
.
FailWithMessage
(
"活动已下线"
,
c
)
return
}
if
courseAction
.
ActionEnd
.
Unix
()
<
time
.
Now
()
.
Unix
()
{
response
.
FailWithMessage
(
"活动已结束"
,
c
)
return
}
courseSign
,
err
:=
courseSignupService
.
GetCourseSignupByUidAndCid
(
uint
(
*
actionInfo
.
Cid
),
user
.
ID
)
if
err
!=
nil
&&
err
!=
gorm
.
ErrRecordNotFound
{
response
.
FailWithMessage
(
err
.
Error
(),
c
)
return
}
else
if
err
!=
nil
&&
err
==
gorm
.
ErrRecordNotFound
{
response
.
FailWithMessage
(
"课程未报名"
,
c
)
return
}
if
courseSign
.
ID
>
0
&&
!*
courseSign
.
IsPass
{
response
.
FailWithMessage
(
"报名审核未通过"
,
c
)
return
}
signDate
:=
utils
.
GetTodayTime
(
time
.
DateOnly
)
courseActionUsers
:=
&
course
.
CourseActionUsers
{}
*
courseActionUsers
.
Uid
=
int
(
user
.
ID
)
*
courseActionUsers
.
Aid
=
int
(
actionInfo
.
ID
)
courseActionUsers
.
Cid
=
actionInfo
.
Cid
courseActionUsers
.
SignDate
=
&
signDate
if
err
:=
courseActionUsersService
.
CreateCourseActionUsers
(
*
courseActionUsers
);
err
!=
nil
{
global
.
GVA_LOG
.
Error
(
"创建失败!"
,
zap
.
Error
(
err
))
response
.
FailWithMessage
(
"创建失败"
,
c
)
}
else
{
response
.
OkWithMessage
(
"创建成功"
,
c
)
}
}
server/api/v1/course/course_users.go
View file @
1996b12a
...
...
@@ -270,11 +270,15 @@ func (courseUsersApi *CourseUsersApi) MetaMaskLogin(c *gin.Context) {
return
}
// device token
deviceCode
:=
utils
.
CreateDeviceCode
(
loginUser
.
Addr
)
j
:=
&
utils
.
JWT
{
SigningKey
:
[]
byte
(
global
.
GVA_CONFIG
.
JWT
.
SigningKey
)}
// 唯一签名
claims
:=
j
.
CreateClaims
(
systemReq
.
BaseClaims
{
//ID: user.ID,
NickName
:
loginUser
.
Addr
,
Username
:
loginUser
.
Addr
,
DeviceCode
:
deviceCode
,
})
token
,
err
:=
j
.
CreateToken
(
claims
)
if
err
!=
nil
{
...
...
@@ -282,6 +286,7 @@ func (courseUsersApi *CourseUsersApi) MetaMaskLogin(c *gin.Context) {
response
.
FailWithMessage
(
"获取token失败"
,
c
)
return
}
// jwt token
if
jwtStr
,
err
:=
jwtService
.
GetRedisJWT
(
loginUser
.
Addr
);
err
==
redis
.
Nil
{
if
err
:=
jwtService
.
SetRedisJWT
(
token
,
loginUser
.
Addr
);
err
!=
nil
{
global
.
GVA_LOG
.
Error
(
"设置登录状态失败!"
,
zap
.
Error
(
err
))
...
...
@@ -305,6 +310,28 @@ func (courseUsersApi *CourseUsersApi) MetaMaskLogin(c *gin.Context) {
}
// if deviceStr, err := jwtService.GetRedisJWT(deviceCode); err == redis.Nil {
// if err := jwtService.SetRedisJWT(deviceAddr, deviceCode); err != nil {
// global.GVA_LOG.Error("设置登录状态失败!", zap.Error(err))
// response.FailWithMessage("设置登录状态失败", c)
// return
// }
// } else if err != nil {
// global.GVA_LOG.Error("设置设备码状态失败!", zap.Error(err))
// response.FailWithMessage("设置设备码状态失败", c)
// } else {
// var blackJWT system.JwtBlacklist
// blackJWT.Jwt = deviceStr
// if err := jwtService.JsonInBlacklist(blackJWT); err != nil {
// response.FailWithMessage("device code作废失败", c)
// return
// }
// if err := jwtService.SetRedisJWT(deviceAddr, deviceCode); err != nil {
// response.FailWithMessage("设置设备码状态失败", c)
// return
// }
// }
_
,
err
=
courseUsersService
.
GetCourseUsersByAddr
(
loginUser
.
Invitor
)
if
err
!=
nil
&&
err
==
gorm
.
ErrRecordNotFound
{
response
.
FailWithMessage
(
"邀请者不存在"
,
c
)
...
...
@@ -336,4 +363,35 @@ func (courseUsersApi *CourseUsersApi) MetaMaskLogin(c *gin.Context) {
return
}
response
.
OkWithData
(
token
,
c
)
}
// GetDeviceCode 获取设备码
// @Tags DeviceCode
// @Summary 分页获取CourseUsers列表
// @Security ApiKeyAuth
// @accept application/json
// @Produce application/json
// @Param data query courseReq.CourseUsersSearch true "分页获取CourseUsers列表"
// @Success 200 {string} string "{"success":true,"data":{},"msg":"获取成功"}"
// @Router /courseUsers/getCode [get]
func
(
courseUsersApi
*
CourseUsersApi
)
GetDeviceCode
(
c
*
gin
.
Context
)
{
var
pageInfo
courseReq
.
CourseUsersSearch
err
:=
c
.
ShouldBindQuery
(
&
pageInfo
)
if
err
!=
nil
{
response
.
FailWithMessage
(
err
.
Error
(),
c
)
return
}
deviceStr
,
err
:=
jwtService
.
GetRedisJWT
(
c
.
Request
.
Header
.
Get
(
"address"
))
if
err
==
redis
.
Nil
{
response
.
FailWithMessage
(
"code not exists"
,
c
)
return
}
j
:=
utils
.
NewJWT
()
claims
,
err
:=
j
.
ParseToken
(
deviceStr
)
if
err
!=
nil
{
response
.
FailWithMessage
(
err
.
Error
(),
c
)
return
}
response
.
OkWithData
(
claims
.
DeviceCode
,
c
)
}
\ No newline at end of file
server/docs/docs.go
View file @
1996b12a
This diff is collapsed.
Click to expand it.
server/docs/swagger.json
View file @
1996b12a
This diff is collapsed.
Click to expand it.
server/docs/swagger.yaml
View file @
1996b12a
...
...
@@ -785,6 +785,8 @@ definitions:
properties
:
actionBanner
:
type
:
string
actionDesc
:
type
:
string
actionEnd
:
type
:
string
actionName
:
...
...
@@ -940,6 +942,11 @@ definitions:
createdAt
:
description
:
创建时间
type
:
string
deviceCode
:
description
:
|-
CourseSignup `gorm:"foreignKey:Uid"`
CourseActionUsers `gorm:"foreignKey:Uid"`
type: string
id
:
description
:
主键ID
type
:
integer
...
...
@@ -1470,6 +1477,13 @@ definitions:
example
:
用户名
type
:
string
type
:
object
request.ReqCode
:
properties
:
aid
:
type
:
integer
deviceCode
:
type
:
string
type
:
object
request.RollBack
:
properties
:
deleteTable
:
...
...
@@ -3795,6 +3809,9 @@ paths:
name
:
actionBanner
type
:
string
-
in
:
query
name
:
actionDesc
type
:
string
-
in
:
query
name
:
actionEnd
type
:
string
-
in
:
query
...
...
@@ -3852,6 +3869,9 @@ paths:
name
:
actionBanner
type
:
string
-
in
:
query
name
:
actionDesc
type
:
string
-
in
:
query
name
:
actionEnd
type
:
string
-
in
:
query
...
...
@@ -3911,6 +3931,9 @@ paths:
name
:
actionBanner
type
:
string
-
in
:
query
name
:
actionDesc
type
:
string
-
in
:
query
name
:
actionEnd
type
:
string
-
in
:
query
...
...
@@ -3986,6 +4009,9 @@ paths:
name
:
actionBanner
type
:
string
-
in
:
query
name
:
actionDesc
type
:
string
-
in
:
query
name
:
actionEnd
type
:
string
-
in
:
query
...
...
@@ -4396,6 +4422,27 @@ paths:
summary
:
创建CourseActionUsers
tags
:
-
CourseActionUsers
/courseActionUsers/signActionWeb
:
post
:
consumes
:
-
application/json
parameters
:
-
description
:
设备码签到
in
:
body
name
:
data
required
:
true
schema
:
$ref
:
'
#/definitions/request.ReqCode'
produces
:
-
application/json
responses
:
"
200"
:
description
:
'
{"success":true,"data":{},"msg":"获取成功"}'
schema
:
type
:
string
summary
:
设备码签到
tags
:
-
CourseActionUsers
/courseActionUsers/updateCourseActionUsers
:
put
:
consumes
:
...
...
@@ -5346,6 +5393,12 @@ paths:
in
:
query
name
:
createdAt
type
:
string
-
description
:
|-
CourseSignup `gorm:"foreignKey:Uid"`
CourseActionUsers `gorm:"foreignKey:Uid"`
in: query
name: deviceCode
type: string
-
description
:
主键ID
in
:
query
name
:
id
...
...
@@ -5405,6 +5458,12 @@ paths:
in
:
query
name
:
createdAt
type
:
string
-
description
:
|-
CourseSignup `gorm:"foreignKey:Uid"`
CourseActionUsers `gorm:"foreignKey:Uid"`
in: query
name: deviceCode
type: string
-
description
:
主键ID
in
:
query
name
:
id
...
...
@@ -5444,6 +5503,89 @@ paths:
summary
:
用id查询CourseUsers
tags
:
-
CourseUsers
/courseUsers/getCode
:
get
:
consumes
:
-
application/json
parameters
:
-
in
:
query
name
:
address
type
:
string
-
in
:
query
name
:
age
type
:
integer
-
in
:
query
name
:
company
type
:
string
-
description
:
创建时间
in
:
query
name
:
createdAt
type
:
string
-
description
:
|-
CourseSignup `gorm:"foreignKey:Uid"`
CourseActionUsers `gorm:"foreignKey:Uid"`
in: query
name: deviceCode
type: string
-
in
:
query
name
:
endCreatedAt
type
:
string
-
description
:
主键ID
in
:
query
name
:
id
type
:
integer
-
in
:
query
name
:
invitor
type
:
string
-
in
:
query
name
:
isAdmin
type
:
boolean
-
description
:
关键字
in
:
query
name
:
keyword
type
:
string
-
in
:
query
name
:
name
type
:
string
-
description
:
页码
in
:
query
name
:
page
type
:
integer
-
description
:
每页大小
in
:
query
name
:
pageSize
type
:
integer
-
in
:
query
name
:
phone
type
:
string
-
in
:
query
name
:
photo
type
:
string
-
in
:
query
name
:
position
type
:
string
-
in
:
query
name
:
sex
type
:
boolean
-
in
:
query
name
:
startCreatedAt
type
:
string
-
description
:
更新时间
in
:
query
name
:
updatedAt
type
:
string
produces
:
-
application/json
responses
:
"
200"
:
description
:
'
{"success":true,"data":{},"msg":"获取成功"}'
schema
:
type
:
string
security
:
-
ApiKeyAuth
:
[]
summary
:
分页获取CourseUsers列表
tags
:
-
DeviceCode
/courseUsers/getCourseUsersList
:
get
:
consumes
:
...
...
@@ -5462,6 +5604,12 @@ paths:
in
:
query
name
:
createdAt
type
:
string
-
description
:
|-
CourseSignup `gorm:"foreignKey:Uid"`
CourseActionUsers `gorm:"foreignKey:Uid"`
in: query
name: deviceCode
type: string
-
in
:
query
name
:
endCreatedAt
type
:
string
...
...
server/initialize/router.go
View file @
1996b12a
...
...
@@ -70,6 +70,7 @@ func Routers() *gin.Engine {
courseRouter
.
InitCourseBannersPubRouter
(
AppGroup
)
courseRouter
.
InitCourseListPubRouter
(
AppGroup
)
courseRouter
.
InitCourseActionWebRouter
(
AppGroup
)
courseRouter
.
InitCourseActionUsersPubRouter
(
AppGroup
)
}
PrivateGroup
:=
Router
.
Group
(
global
.
GVA_CONFIG
.
System
.
RouterPrefix
)
PrivateGroup
.
Use
(
middleware
.
JWTAuth
())
.
Use
(
middleware
.
CasbinHandler
())
...
...
server/model/course/course_users.go
View file @
1996b12a
...
...
@@ -22,6 +22,7 @@ type CourseUsers struct {
// CourseSignup `gorm:"foreignKey:Uid"`
// CourseActionUsers `gorm:"foreignKey:Uid"`
DeviceCode
string
`json:"deviceCode" form:"deviceCode" gorm:"-"`
}
...
...
server/model/course/request/courser_action_users.go
View file @
1996b12a
package
request
import
(
"courseSign/server/model/course"
"courseSign/server/model/common/request"
"time"
"courseSign/server/model/common/request"
"courseSign/server/model/course"
)
type
CourseActionUsersSearch
struct
{
...
...
@@ -12,3 +13,8 @@ type CourseActionUsersSearch struct{
EndCreatedAt
*
time
.
Time
`json:"endCreatedAt" form:"endCreatedAt"`
request
.
PageInfo
}
type
ReqCode
struct
{
Aid
int
`json:"aid" form:"aid"`
DeviceCode
string
`json:"deviceCode" form:"deviceCode"`
}
\ No newline at end of file
server/model/system/request/jwt.go
View file @
1996b12a
...
...
@@ -18,4 +18,5 @@ type BaseClaims struct {
Username
string
NickName
string
AuthorityId
uint
DeviceCode
string
}
server/router/course/course_action_users.go
View file @
1996b12a
...
...
@@ -35,4 +35,13 @@ func (s *CourseActionUsersRouter) InitCourseActionUsersMetaMaskRouter(Router *gi
courseActionUsersRouter
.
POST
(
"signAction"
,
courseActionUsersApi
.
SignAction
)
// 新建CourseActionUsers
courseActionUsersRouter
.
GET
(
"myAction"
,
courseActionUsersApi
.
GetMyAction
)
// 新建CourseActionUsers
}
}
// InitCourseActionUsersPubRouter 初始化 CourseActionUsers 路由信息
func
(
s
*
CourseActionUsersRouter
)
InitCourseActionUsersPubRouter
(
Router
*
gin
.
RouterGroup
)
{
courseActionUsersRouter
:=
Router
.
Group
(
"courseActionUsers"
)
.
Use
(
middleware
.
OperationRecord
())
var
courseActionUsersApi
=
v1
.
ApiGroupApp
.
CourseApiGroup
.
CourseActionUsersApi
{
courseActionUsersRouter
.
POST
(
"signActionWeb"
,
courseActionUsersApi
.
WebSignAction
)
// 新建CourseActionUsers
}
}
\ No newline at end of file
server/router/course/course_users.go
View file @
1996b12a
...
...
@@ -33,6 +33,7 @@ func (s *CourseUsersRouter) InitCourseUsersMetaMaskRouter(Router *gin.RouterGrou
var
courseUsersApi
=
v1
.
ApiGroupApp
.
CourseApiGroup
.
CourseUsersApi
{
courseUsersRouter
.
GET
(
"findUsers"
,
courseUsersApi
.
FindCourseUsersMM
)
// 根据ID,addr获取用户信息
courseUsersRouter
.
GET
(
"getCode"
,
courseUsersApi
.
GetDeviceCode
)
// 获取设备码
}
}
...
...
server/utils/utils.go
View file @
1996b12a
...
...
@@ -2,13 +2,16 @@ package utils
import
(
"crypto/md5"
"encoding/base64"
"encoding/hex"
"fmt"
"log"
"math"
"math/rand"
"net/url"
"sort"
"strings"
"time"
)
func
MapToSortUrlEncode
(
paramsMap
map
[
string
]
string
)
string
{
...
...
@@ -49,4 +52,10 @@ func Decimal(value float64, num int) float64 {
func
UniqueId
(
id
int64
)
string
{
return
fmt
.
Sprintf
(
"addr-%d"
,
id
)
}
func
CreateDeviceCode
(
addr
string
)
string
{
rand
.
Seed
(
time
.
Now
()
.
UnixNano
())
rr
:=
rand
.
Intn
(
1e4
)
return
base64
.
StdEncoding
.
EncodeToString
([]
byte
(
fmt
.
Sprintf
(
"%s-%d"
,
addr
,
rr
)))
}
\ No newline at end of file
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment