This commit is contained in:
oneao committed 2026-02-27 22:09:50 +08:00
1 parent 1b1a54f7dd
commit fc005e0fb4
22 files changed
+300 -193

No files matched your search

-10
View File
@@ -1,10 +0,0 @@
package handler
import (
"github.com/gofiber/fiber/v3"
)
// Hello handle api status
func Hello(c fiber.Ctx) error {
panic("测试 panic")
}
@@ -53,11 +53,24 @@ func CreateSpace(c fiber.Ctx) error {
spaceId := uniqueid.NextId()
err := db.WithTx(c.Context(), func(q *repo.Queries) error {
// 查询是否存在空间
countSpaces, err3 := q.CountUserSpaces(c.Context(), userID)
if err3 != nil {
return err3
}
isDefault := 0
if countSpaces == 0 {
isDefault = 1
}
// 创建空间
params := repo.InsertSpaceParams{
ID: spaceId,
Name: dto.Name,
InviteCode: inviteCode,
OwnerID: userID,
}
err := q.InsertSpace(c.Context(), params)
@@ -68,10 +81,13 @@ func CreateSpace(c fiber.Ctx) error {
// 将创建用户默认添加到该空间内
spaceMemberParams := repo.InsertSpaceMemberParams{
ID: uniqueid.NextId(),
SpaceID: spaceId,
UserID: userID,
Role: 0,
ID: uniqueid.NextId(),
SpaceID: spaceId,
UserID: userID,
Role: 0,
IsDefault: int16(isDefault),
UserName: dto.UserName,
SortNumber: dto.SortNumber,
}
err = q.InsertSpaceMember(c.Context(), spaceMemberParams)
@@ -98,6 +114,41 @@ func CreateSpace(c fiber.Ctx) error {
return responsex.OK(c, vo)
}
func ListUserSpaces(c fiber.Ctx) error {
vo := new(types.ListSpacesVO)
userID, err := middleware.GetUserID(c)
if err != nil {
return err
}
rows, err := db.Queries.ListSpacesByUserId(c.Context(), userID)
if err != nil {
return err
}
userSpaces := make([]types.UserSpace, 0, len(rows))
for _, row := range rows {
userSpaces = append(userSpaces, types.UserSpace{
Id: row.ID,
OwnerId: row.OwnerID,
Name: row.Name,
Role: row.Role,
MemberCount: row.MemberCount,
IsDefault: row.IsDefault,
UserName: row.UserName,
SortNumber: row.SortNumber,
})
}
vo.Spaces = userSpaces
return responsex.OK(c, vo)
}
func initFinanceCategory(ctx context.Context, q *repo.Queries, spaceId int64, userId int64) error {
categoryDefaults, err := q.ListFinanceCategoryDefault(ctx)
if err != nil {
+6 -11
View File
@@ -12,23 +12,18 @@ import (
func SetupRouters(app *fiber.App) {
api := app.Group(config.GetConf().Server.BaseUrl)
// 1️⃣ 公开接口(无需登录)
publicGroup := api.Group("")
// 2️⃣ 需要登录
authGroup := api.Group("", middleware.Auth())
//
//// 3️⃣ 需要登录 + 需要空间
//spaceGroup := api.Group("", middleware.Auth(), middleware.SpaceGuard())
// --------------------
// auth
authRouter := publicGroup.Group("/auth")
authRouter := api.Group("/auth")
authRouter.Post("/login/qq", auth.LoginQq)
authRouter.Post("/login/wechat", auth.LoginWechat)
// 空间操作
authGroup.Post("/space/create", space.CreateSpace)
spaceRouter := api.Group("/space").Use(middleware.Auth())
spaceRouter.Post("/create", space.CreateSpace)
spaceRouter.Post("/list", space.ListUserSpaces)
// authGroup.Get("/user/profile", user.GetProfile)
// spaceGroup.Get("/space/info", space.GetInfo)
}
+19 -1
View File
@@ -1,10 +1,28 @@
package types
type CreateSpaceDTO struct {
Name string `json:"name" validate:"required"`
Name string `json:"name" validate:"required"`
UserName string `json:"user_name" validate:"required"`
SortNumber int32 `json:"sort_number" validate:"required"`
}
type CreateSpaceVO struct {
SpaceId int64 `json:"space_id"`
InviteCode string `json:"invite_code"`
SortNumber int32 `json:"sort_number"`
}
type UserSpace struct {
Id int64 `json:"id"`
OwnerId int64 `json:"owner_id"`
Name string `json:"name"`
Role int16 `json:"role"`
MemberCount int64 `json:"member_count"`
IsDefault int16 `json:"is_default"`
UserName string `json:"user_name"`
SortNumber int32 `json:"sort_number"`
}
type ListSpacesVO struct {
Spaces []UserSpace `json:"spaces"`
}
+24 -2
View File
@@ -6,8 +6,8 @@ SELECT * FROM space WHERE id = $1;
-- 创建空间
-- name: InsertSpace :exec
INSERT INTO space (
id,name,invite_code,create_time,update_time
) VALUES ($1,$2,$3,NOW(),NOW());
id,name,invite_code,owner_id,create_time,update_time
) VALUES ($1,$2,$3,$4,NOW(),NOW());
-- 删除空间
-- name: DeleteSpace :exec
@@ -16,3 +16,25 @@ DELETE FROM space WHERE id = $1;
-- 根据邀请码获取
-- name: GetSpaceByInviteCode :one
SELECT * FROM space WHERE invite_code = $1;
-- name: ListSpacesByUserId :many
SELECT
s.id,
s.owner_id,
s.name,
sm.role,
COALESCE(mc.member_count, 0) AS member_count,
sm.is_default,
sm.user_name,
sm.sort_number
FROM space s
JOIN space_member sm
ON s.id = sm.space_id
LEFT JOIN (
SELECT space_id, COUNT(*) AS member_count
FROM space_member
GROUP BY space_id
) mc
ON s.id = mc.space_id
WHERE sm.user_id = $1
ORDER BY sm.is_default DESC, sm.sort_number ASC;
@@ -6,8 +6,8 @@ WHERE user_id = $1
AND space_id = $2;
-- name: InsertSpaceMember :exec
INSERT INTO space_member(id,space_id,user_id,role,is_default,join_time,update_time)
VALUES ($1,$2,$3,$4,$5,NOW(),NOW());
INSERT INTO space_member(id,space_id,user_id,role,is_default,user_name,sort_number,join_time,update_time)
VALUES ($1,$2,$3,$4,$5,$6,$7,NOW(),NOW());
-- name: CountUserSpaces :one
SELECT COUNT(1)
+3
View File
@@ -35,6 +35,7 @@ type Space struct {
ID int64
Name string
InviteCode string
OwnerID int64
CreateTime pgtype.Timestamptz
UpdateTime pgtype.Timestamptz
}
@@ -45,6 +46,8 @@ type SpaceMember struct {
UserID int64
Role int16
IsDefault int16
UserName string
SortNumber int32
JoinTime pgtype.Timestamptz
UpdateTime pgtype.Timestamptz
}
+76 -5
View File
@@ -20,7 +20,7 @@ func (q *Queries) DeleteSpace(ctx context.Context, id int64) error {
}
const getSpaceById = `-- name: GetSpaceById :one
SELECT id, name, invite_code, create_time, update_time FROM space WHERE id = $1
SELECT id, name, invite_code, owner_id, create_time, update_time FROM space WHERE id = $1
`
// 根据id获取分享空间信息
@@ -31,6 +31,7 @@ func (q *Queries) GetSpaceById(ctx context.Context, id int64) (Space, error) {
&i.ID,
&i.Name,
&i.InviteCode,
&i.OwnerID,
&i.CreateTime,
&i.UpdateTime,
)
@@ -38,7 +39,7 @@ func (q *Queries) GetSpaceById(ctx context.Context, id int64) (Space, error) {
}
const getSpaceByInviteCode = `-- name: GetSpaceByInviteCode :one
SELECT id, name, invite_code, create_time, update_time FROM space WHERE invite_code = $1
SELECT id, name, invite_code, owner_id, create_time, update_time FROM space WHERE invite_code = $1
`
// 根据邀请码获取
@@ -49,6 +50,7 @@ func (q *Queries) GetSpaceByInviteCode(ctx context.Context, inviteCode string) (
&i.ID,
&i.Name,
&i.InviteCode,
&i.OwnerID,
&i.CreateTime,
&i.UpdateTime,
)
@@ -57,18 +59,87 @@ func (q *Queries) GetSpaceByInviteCode(ctx context.Context, inviteCode string) (
const insertSpace = `-- name: InsertSpace :exec
INSERT INTO space (
id,name,invite_code,create_time,update_time
) VALUES ($1,$2,$3,NOW(),NOW())
id,name,invite_code,owner_id,create_time,update_time
) VALUES ($1,$2,$3,$4,NOW(),NOW())
`
type InsertSpaceParams struct {
ID int64
Name string
InviteCode string
OwnerID int64
}
// 创建空间
func (q *Queries) InsertSpace(ctx context.Context, arg InsertSpaceParams) error {
_, err := q.db.Exec(ctx, insertSpace, arg.ID, arg.Name, arg.InviteCode)
_, err := q.db.Exec(ctx, insertSpace,
arg.ID,
arg.Name,
arg.InviteCode,
arg.OwnerID,
)
return err
}
const listSpacesByUserId = `-- name: ListSpacesByUserId :many
SELECT
s.id,
s.owner_id,
s.name,
sm.role,
COALESCE(mc.member_count, 0) AS member_count,
sm.is_default,
sm.user_name,
sm.sort_number
FROM space s
JOIN space_member sm
ON s.id = sm.space_id
LEFT JOIN (
SELECT space_id, COUNT(*) AS member_count
FROM space_member
GROUP BY space_id
) mc
ON s.id = mc.space_id
WHERE sm.user_id = $1
ORDER BY sm.is_default DESC, sm.sort_number ASC
`
type ListSpacesByUserIdRow struct {
ID int64
OwnerID int64
Name string
Role int16
MemberCount int64
IsDefault int16
UserName string
SortNumber int32
}
func (q *Queries) ListSpacesByUserId(ctx context.Context, userID int64) ([]ListSpacesByUserIdRow, error) {
rows, err := q.db.Query(ctx, listSpacesByUserId, userID)
if err != nil {
return nil, err
}
defer rows.Close()
var items []ListSpacesByUserIdRow
for rows.Next() {
var i ListSpacesByUserIdRow
if err := rows.Scan(
&i.ID,
&i.OwnerID,
&i.Name,
&i.Role,
&i.MemberCount,
&i.IsDefault,
&i.UserName,
&i.SortNumber,
); err != nil {
return nil, err
}
items = append(items, i)
}
if err := rows.Err(); err != nil {
return nil, err
}
return items, nil
}
@@ -43,16 +43,18 @@ func (q *Queries) GetUserSpaceRole(ctx context.Context, arg GetUserSpaceRolePara
}
const insertSpaceMember = `-- name: InsertSpaceMember :exec
INSERT INTO space_member(id,space_id,user_id,role,is_default,join_time,update_time)
VALUES ($1,$2,$3,$4,$5,NOW(),NOW())
INSERT INTO space_member(id,space_id,user_id,role,is_default,user_name,sort_number,join_time,update_time)
VALUES ($1,$2,$3,$4,$5,$6,$7,NOW(),NOW())
`
type InsertSpaceMemberParams struct {
ID int64
SpaceID int64
UserID int64
Role int16
IsDefault int16
ID int64
SpaceID int64
UserID int64
Role int16
IsDefault int16
UserName string
SortNumber int32
}
func (q *Queries) InsertSpaceMember(ctx context.Context, arg InsertSpaceMemberParams) error {
@@ -62,6 +64,8 @@ func (q *Queries) InsertSpaceMember(ctx context.Context, arg InsertSpaceMemberPa
arg.UserID,
arg.Role,
arg.IsDefault,
arg.UserName,
arg.SortNumber,
)
return err
}
+3
View File
@@ -27,6 +27,7 @@ create table space
primary key,
name varchar(255) not null,
invite_code varchar(30) not null,
owner_id bigint not null,
create_time timestamp with time zone default now(),
update_time timestamp with time zone default now()
);
@@ -39,6 +40,8 @@ create table space_member
user_id bigint not null,
role smallint default 2 not null,
is_default smallint default 0 not null,
user_name varchar(255) not null,
sort_number integer default 0 not null,
join_time timestamp with time zone default now(),
update_time timestamp with time zone default now()
);
+4 -2
View File
@@ -46,12 +46,14 @@ func CreateToken(ctx context.Context, userID int64) (string, error) {
// VerifyToken 校验 token 并返回 claims
func VerifyToken(ctx context.Context, tokenString string) (*CustomClaims, bool) {
if tokenString == "" || manager == nil {
if tokenString == "" {
return nil, false
}
m := getManager()
token, err := jwt.ParseWithClaims(tokenString, &CustomClaims{}, func(token *jwt.Token) (interface{}, error) {
return []byte(manager.secret), nil
return []byte(m.secret), nil
})
if err != nil || !token.Valid {