Compare commits

...

6 Commits

34 changed files with 174 additions and 169 deletions

View File

@@ -2,11 +2,11 @@ package app
import ( import (
"fmt" "fmt"
"git.hlsq.asia/mmorpg/service-common/discover/common" "git.hlsq.asia/alex/service-common/discover/common"
"git.hlsq.asia/mmorpg/service-common/log" "git.hlsq.asia/alex/service-common/log"
"git.hlsq.asia/mmorpg/service-common/module" "git.hlsq.asia/alex/service-common/module"
"git.hlsq.asia/mmorpg/service-qgdzs/config" "git.hlsq.asia/alex/service-qgdzs/config"
"git.hlsq.asia/mmorpg/service-qgdzs/internal/grpc_server" "git.hlsq.asia/alex/service-qgdzs/internal/grpcserver"
"github.com/judwhite/go-svc" "github.com/judwhite/go-svc"
"sync" "sync"
) )
@@ -16,15 +16,13 @@ type Program struct {
} }
func (p *Program) Init(_ svc.Environment) error { func (p *Program) Init(_ svc.Environment) error {
if err := config.LoadConfig(); err != nil { p.moduleList = append(p.moduleList, &module.Log{Cfg: config.Get().Log})
return err
}
p.moduleList = append(p.moduleList, &module.Base{Log: config.Get().Log})
p.moduleList = append(p.moduleList, &module.DB{Cfg: config.Get().DB, AppName: config.Get().App.Name}) p.moduleList = append(p.moduleList, &module.DB{Cfg: config.Get().DB, AppName: config.Get().App.Name})
p.moduleList = append(p.moduleList, &module.Grpc{Server: grpc_server.NewServer(config.Get().Serve.Grpc)}) p.moduleList = append(p.moduleList, &module.Snowflake{})
p.moduleList = append(p.moduleList, &module.Grpc{Server: grpcserver.NewServer(config.Get().Serve.Grpc)})
p.moduleList = append(p.moduleList, &ModuleTimer{}) p.moduleList = append(p.moduleList, &ModuleTimer{})
p.moduleList = append(p.moduleList, &module.Prometheus{MetricCfg: config.Get().Metric}) p.moduleList = append(p.moduleList, &module.Prometheus{Cfg: config.Get().Metric})
p.moduleList = append(p.moduleList, &module.Tracer{MetricCfg: config.Get().Metric, ServiceName: common.KeyDiscoverServiceNameQgdzs}) p.moduleList = append(p.moduleList, &module.Tracer{Cfg: config.Get().Metric, ServiceName: common.KeyDiscoverServiceNameQgdzs})
p.moduleList = append(p.moduleList, &module.Discover{}) p.moduleList = append(p.moduleList, &module.Discover{})
for _, m := range p.moduleList { for _, m := range p.moduleList {

View File

@@ -1,8 +1,8 @@
package app package app
import ( import (
"git.hlsq.asia/mmorpg/service-common/module" "git.hlsq.asia/alex/service-common/module"
"git.hlsq.asia/mmorpg/service-qgdzs/internal/timer" "git.hlsq.asia/alex/service-qgdzs/internal/timer"
"sync" "sync"
) )

View File

@@ -1,6 +1,6 @@
package config package config
import "git.hlsq.asia/mmorpg/service-common/config" import "git.hlsq.asia/alex/service-common/config"
const path = "./config" const path = "./config"

2
deploy/Jenkinsfile vendored
View File

@@ -3,7 +3,7 @@ pipeline {
environment { environment {
// 仓库 // 仓库
REPO_URL = 'https://git.hlsq.asia/mmorpg/service-qgdzs.git' REPO_URL = 'https://git.hlsq.asia/alex/service-qgdzs.git'
REPO_CREDENTIALS_ID = '80805ba2-f4ac-4d84-aee6-d4cce5fc0a96' REPO_CREDENTIALS_ID = '80805ba2-f4ac-4d84-aee6-d4cce5fc0a96'
// Registry // Registry

4
go.mod
View File

@@ -1,9 +1,9 @@
module git.hlsq.asia/mmorpg/service-qgdzs module git.hlsq.asia/alex/service-qgdzs
go 1.24.0 go 1.24.0
require ( require (
git.hlsq.asia/mmorpg/service-common v0.0.0-20260206145147-5a0f4b71d430 git.hlsq.asia/alex/service-common master
github.com/judwhite/go-svc v1.2.1 github.com/judwhite/go-svc v1.2.1
github.com/robfig/cron/v3 v3.0.1 github.com/robfig/cron/v3 v3.0.1
google.golang.org/grpc v1.77.0 google.golang.org/grpc v1.77.0

4
go.sum
View File

@@ -1,7 +1,7 @@
filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA= filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA=
filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4= filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4=
git.hlsq.asia/mmorpg/service-common v0.0.0-20260206145147-5a0f4b71d430 h1:8aNIgKpU6HBg7h4ENjuGWshap+VxeKUmLE0IvFoWbug= git.hlsq.asia/alex/service-common v0.0.0-20260211064821-558677bc3a2e h1:MNVS1NXNVn4DeTZPcvvA8YFM8afCzZedLPUYMffNgZs=
git.hlsq.asia/mmorpg/service-common v0.0.0-20260206145147-5a0f4b71d430/go.mod h1:mMhZcumphj6gaVTppVYsMTkd+5HupmQgAc53Pd4MH9I= git.hlsq.asia/alex/service-common v0.0.0-20260211064821-558677bc3a2e/go.mod h1:mMhZcumphj6gaVTppVYsMTkd+5HupmQgAc53Pd4MH9I=
github.com/BurntSushi/toml v1.2.0 h1:Rt8g24XnyGTyglgET/PRUNlrUeu9F5L+7FilkXfZgs0= github.com/BurntSushi/toml v1.2.0 h1:Rt8g24XnyGTyglgET/PRUNlrUeu9F5L+7FilkXfZgs0=
github.com/BurntSushi/toml v1.2.0/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= github.com/BurntSushi/toml v1.2.0/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ=
github.com/IBM/sarama v1.46.3 h1:njRsX6jNlnR+ClJ8XmkO+CM4unbrNr/2vB5KK6UA+IE= github.com/IBM/sarama v1.46.3 h1:njRsX6jNlnR+ClJ8XmkO+CM4unbrNr/2vB5KK6UA+IE=

View File

@@ -1,7 +1,7 @@
package ai package ai
import ( import (
"git.hlsq.asia/mmorpg/service-common/log" "git.hlsq.asia/alex/service-common/log"
) )
type Client struct { type Client struct {

View File

@@ -7,7 +7,7 @@ package model
import ( import (
"time" "time"
"git.hlsq.asia/mmorpg/service-common/utils" "git.hlsq.asia/alex/service-common/utils"
"gorm.io/gorm" "gorm.io/gorm"
) )

View File

@@ -7,7 +7,7 @@ package model
import ( import (
"time" "time"
"git.hlsq.asia/mmorpg/service-common/utils" "git.hlsq.asia/alex/service-common/utils"
"gorm.io/gorm" "gorm.io/gorm"
) )

View File

@@ -7,7 +7,7 @@ package model
import ( import (
"time" "time"
"git.hlsq.asia/mmorpg/service-common/utils" "git.hlsq.asia/alex/service-common/utils"
"gorm.io/gorm" "gorm.io/gorm"
) )

View File

@@ -7,7 +7,7 @@ package model
import ( import (
"time" "time"
"git.hlsq.asia/mmorpg/service-common/utils" "git.hlsq.asia/alex/service-common/utils"
"gorm.io/gorm" "gorm.io/gorm"
) )

View File

@@ -7,7 +7,7 @@ package model
import ( import (
"time" "time"
"git.hlsq.asia/mmorpg/service-common/utils" "git.hlsq.asia/alex/service-common/utils"
"gorm.io/gorm" "gorm.io/gorm"
) )

View File

@@ -16,7 +16,7 @@ import (
"gorm.io/plugin/dbresolver" "gorm.io/plugin/dbresolver"
"git.hlsq.asia/mmorpg/service-qgdzs/internal/dao/model" "git.hlsq.asia/alex/service-qgdzs/internal/dao/model"
) )
func newCategory(db *gorm.DB, opts ...gen.DOOption) category { func newCategory(db *gorm.DB, opts ...gen.DOOption) category {

View File

@@ -16,7 +16,7 @@ import (
"gorm.io/plugin/dbresolver" "gorm.io/plugin/dbresolver"
"git.hlsq.asia/mmorpg/service-qgdzs/internal/dao/model" "git.hlsq.asia/alex/service-qgdzs/internal/dao/model"
) )
func newPointCard(db *gorm.DB, opts ...gen.DOOption) pointCard { func newPointCard(db *gorm.DB, opts ...gen.DOOption) pointCard {

View File

@@ -16,7 +16,7 @@ import (
"gorm.io/plugin/dbresolver" "gorm.io/plugin/dbresolver"
"git.hlsq.asia/mmorpg/service-qgdzs/internal/dao/model" "git.hlsq.asia/alex/service-qgdzs/internal/dao/model"
) )
func newPointRecord(db *gorm.DB, opts ...gen.DOOption) pointRecord { func newPointRecord(db *gorm.DB, opts ...gen.DOOption) pointRecord {

View File

@@ -16,7 +16,7 @@ import (
"gorm.io/plugin/dbresolver" "gorm.io/plugin/dbresolver"
"git.hlsq.asia/mmorpg/service-qgdzs/internal/dao/model" "git.hlsq.asia/alex/service-qgdzs/internal/dao/model"
) )
func newQuestion(db *gorm.DB, opts ...gen.DOOption) question { func newQuestion(db *gorm.DB, opts ...gen.DOOption) question {

View File

@@ -16,7 +16,7 @@ import (
"gorm.io/plugin/dbresolver" "gorm.io/plugin/dbresolver"
"git.hlsq.asia/mmorpg/service-qgdzs/internal/dao/model" "git.hlsq.asia/alex/service-qgdzs/internal/dao/model"
) )
func newRecord(db *gorm.DB, opts ...gen.DOOption) record { func newRecord(db *gorm.DB, opts ...gen.DOOption) record {

View File

@@ -2,9 +2,9 @@ package repository
import ( import (
"context" "context"
"git.hlsq.asia/mmorpg/service-common/db/redis" "git.hlsq.asia/alex/service-common/db/redis"
"git.hlsq.asia/mmorpg/service-qgdzs/internal/dao/model" "git.hlsq.asia/alex/service-qgdzs/internal/dao/model"
"git.hlsq.asia/mmorpg/service-qgdzs/internal/dao/query" "git.hlsq.asia/alex/service-qgdzs/internal/dao/query"
) )
type CategoryDao struct { type CategoryDao struct {

View File

@@ -2,8 +2,8 @@ package repository
import ( import (
"fmt" "fmt"
"git.hlsq.asia/mmorpg/service-common/db/mysql" "git.hlsq.asia/alex/service-common/db/mysql"
"git.hlsq.asia/mmorpg/service-qgdzs/internal/dao/query" "git.hlsq.asia/alex/service-qgdzs/internal/dao/query"
) )
var dbName mysql.DBName = "qgdzs_db" var dbName mysql.DBName = "qgdzs_db"

View File

@@ -3,10 +3,10 @@ package repository
import ( import (
"context" "context"
"errors" "errors"
"git.hlsq.asia/mmorpg/service-common/db/redis" "git.hlsq.asia/alex/service-common/db/redis"
"git.hlsq.asia/mmorpg/service-common/utils" "git.hlsq.asia/alex/service-common/utils"
"git.hlsq.asia/mmorpg/service-qgdzs/internal/dao/model" "git.hlsq.asia/alex/service-qgdzs/internal/dao/model"
"git.hlsq.asia/mmorpg/service-qgdzs/internal/dao/query" "git.hlsq.asia/alex/service-qgdzs/internal/dao/query"
) )
type PointCardDao struct { type PointCardDao struct {

View File

@@ -3,10 +3,10 @@ package repository
import ( import (
"context" "context"
"errors" "errors"
"git.hlsq.asia/mmorpg/service-common/db/redis" "git.hlsq.asia/alex/service-common/db/redis"
"git.hlsq.asia/mmorpg/service-common/utils" "git.hlsq.asia/alex/service-common/utils"
"git.hlsq.asia/mmorpg/service-qgdzs/internal/dao/model" "git.hlsq.asia/alex/service-qgdzs/internal/dao/model"
"git.hlsq.asia/mmorpg/service-qgdzs/internal/dao/query" "git.hlsq.asia/alex/service-qgdzs/internal/dao/query"
"gorm.io/gorm" "gorm.io/gorm"
) )

View File

@@ -2,10 +2,10 @@ package repository
import ( import (
"context" "context"
"git.hlsq.asia/mmorpg/service-common/db/redis" "git.hlsq.asia/alex/service-common/db/redis"
"git.hlsq.asia/mmorpg/service-common/utils" "git.hlsq.asia/alex/service-common/utils"
"git.hlsq.asia/mmorpg/service-qgdzs/internal/dao/model" "git.hlsq.asia/alex/service-qgdzs/internal/dao/model"
"git.hlsq.asia/mmorpg/service-qgdzs/internal/dao/query" "git.hlsq.asia/alex/service-qgdzs/internal/dao/query"
"gorm.io/gorm" "gorm.io/gorm"
"time" "time"
) )

View File

@@ -2,9 +2,9 @@ package repository
import ( import (
"context" "context"
"git.hlsq.asia/mmorpg/service-common/db/redis" "git.hlsq.asia/alex/service-common/db/redis"
"git.hlsq.asia/mmorpg/service-qgdzs/internal/dao/model" "git.hlsq.asia/alex/service-qgdzs/internal/dao/model"
"git.hlsq.asia/mmorpg/service-qgdzs/internal/dao/query" "git.hlsq.asia/alex/service-qgdzs/internal/dao/query"
"time" "time"
) )

View File

@@ -1,37 +1,36 @@
package grpc_server package grpcserver
import ( import (
"context" "context"
"encoding/json" "encoding/json"
"git.hlsq.asia/mmorpg/service-common/db/kafka" "git.hlsq.asia/alex/service-common/db/kafka"
"git.hlsq.asia/mmorpg/service-common/proto/rs/grpc_pb" "git.hlsq.asia/alex/service-common/proto/rs/rspb"
"git.hlsq.asia/mmorpg/service-common/utils" "git.hlsq.asia/alex/service-common/utils"
"git.hlsq.asia/mmorpg/service-qgdzs/internal/dao/repository" "git.hlsq.asia/alex/service-qgdzs/internal/dao/repository"
"git.hlsq.asia/mmorpg/service-qgdzs/internal/timer"
) )
// 玩法 - 类目答题 // 玩法 - 类目答题
// GetAllCategory 获取所有类目 // GetAllCategory 获取所有类目
func (s *Server) GetAllCategory(ctx context.Context, req *grpc_pb.GetAllCategoryReq) (*grpc_pb.GetAllCategoryResp, error) { func (s *Server) GetAllCategory(ctx context.Context, req *rspb.GetAllCategoryReq) (*rspb.GetAllCategoryResp, error) {
categoryList, err := repository.NewCategoryDao(ctx, s.query).FindAll() categoryList, err := repository.NewCategoryDao(ctx, s.query).FindAll()
if err != nil { if err != nil {
return nil, utils.ErrorsWrap(err) return nil, utils.ErrorsWrap(err)
} }
categories := make([]*grpc_pb.GetAllCategoryItem, 0) categories := make([]*rspb.GetAllCategoryItem, 0)
for _, category := range categoryList { for _, category := range categoryList {
categories = append(categories, &grpc_pb.GetAllCategoryItem{ categories = append(categories, &rspb.GetAllCategoryItem{
Sn: category.Sn, Sn: category.Sn,
Category: category.Category, Category: category.Category,
}) })
} }
return &grpc_pb.GetAllCategoryResp{ return &rspb.GetAllCategoryResp{
Categories: categories, Categories: categories,
}, nil }, nil
} }
// CategoryGetQuestion 获取题目 // CategoryGetQuestion 获取题目
func (s *Server) CategoryGetQuestion(ctx context.Context, req *grpc_pb.CategoryGetQuestionReq) (*grpc_pb.CategoryGetQuestionResp, error) { func (s *Server) CategoryGetQuestion(ctx context.Context, req *rspb.CategoryGetQuestionReq) (*rspb.CategoryGetQuestionResp, error) {
question, err := repository.NewQuestionDao(ctx, s.query).FindByRandom(req.CategorySn) question, err := repository.NewQuestionDao(ctx, s.query).FindByRandom(req.CategorySn)
if err != nil { if err != nil {
return nil, utils.ErrorsWrap(err) return nil, utils.ErrorsWrap(err)
@@ -41,7 +40,7 @@ func (s *Server) CategoryGetQuestion(ctx context.Context, req *grpc_pb.CategoryG
return nil, utils.ErrorsWrapF(err, "data: %v", question.Options) return nil, utils.ErrorsWrapF(err, "data: %v", question.Options)
} }
category, _ := repository.NewCategoryDao(ctx, s.query).FindNameBySn(question.CategorySn) category, _ := repository.NewCategoryDao(ctx, s.query).FindNameBySn(question.CategorySn)
return &grpc_pb.CategoryGetQuestionResp{ return &rspb.CategoryGetQuestionResp{
Sn: question.Sn, Sn: question.Sn,
Question: question.Question, Question: question.Question,
Options: options, Options: options,
@@ -51,7 +50,7 @@ func (s *Server) CategoryGetQuestion(ctx context.Context, req *grpc_pb.CategoryG
} }
// CategoryAnswerQuestion 回答题目 // CategoryAnswerQuestion 回答题目
func (s *Server) CategoryAnswerQuestion(ctx context.Context, req *grpc_pb.CategoryAnswerQuestionReq) (*grpc_pb.CategoryAnswerQuestionResp, error) { func (s *Server) CategoryAnswerQuestion(ctx context.Context, req *rspb.CategoryAnswerQuestionReq) (*rspb.CategoryAnswerQuestionResp, error) {
utils.ShouldBindUsn(ctx, &req.USN) utils.ShouldBindUsn(ctx, &req.USN)
question, err := repository.NewQuestionDao(ctx, s.query).FindBySn(req.Sn) question, err := repository.NewQuestionDao(ctx, s.query).FindBySn(req.Sn)
@@ -64,7 +63,7 @@ func (s *Server) CategoryAnswerQuestion(ctx context.Context, req *grpc_pb.Catego
} }
// 保存答题记录 // 保存答题记录
if req.USN != 0 { if req.USN != 0 {
kafka.NewProducer().Produce(ctx, &timer.TopicQuestionAnswer{ kafka.NewProducer().Produce(ctx, &kafka.TopicQuestionAnswer{
MessageSn: utils.SnowflakeInstance().Generate().Int64(), MessageSn: utils.SnowflakeInstance().Generate().Int64(),
USN: req.USN, USN: req.USN,
QuestionSn: question.Sn, QuestionSn: question.Sn,
@@ -74,15 +73,15 @@ func (s *Server) CategoryAnswerQuestion(ctx context.Context, req *grpc_pb.Catego
// 类目答题正确给5分,错误不得分 // 类目答题正确给5分,错误不得分
if req.Answer == question.Answer { if req.Answer == question.Answer {
kafka.NewProducer().Produce(ctx, &timer.TopicAddPoint{ kafka.NewProducer().Produce(ctx, &kafka.TopicAddPoint{
MessageSn: utils.SnowflakeInstance().Generate().Int64(), MessageSn: utils.SnowflakeInstance().Generate().Int64(),
Source: timer.AddPointSourceCategory, Source: kafka.AddPointSourceCategory,
USN: req.USN, USN: req.USN,
Point: 5, Point: 5,
}) })
} }
} }
return &grpc_pb.CategoryAnswerQuestionResp{ return &rspb.CategoryAnswerQuestionResp{
Answer: question.Answer, Answer: question.Answer,
Explanation: question.Explanation, Explanation: question.Explanation,
}, nil }, nil

View File

@@ -0,0 +1,30 @@
package grpcserver
import (
"context"
"fmt"
"git.hlsq.asia/alex/service-common/proto/rs/rspb"
"git.hlsq.asia/alex/service-common/utils"
"git.hlsq.asia/alex/service-qgdzs/internal/ai"
)
func (s *Server) CustomAnswerQuestion(ctx context.Context, req *rspb.CustomAnswerQuestionReq) (*rspb.CustomAnswerQuestionResp, error) {
answer := ""
err := ai.NewAIClient(false, "", 0.9).
RequestAI(
[]string{
fmt.Sprintf(req.Question),
},
func(content string, i int) error {
if i == 0 {
return nil
}
answer = content
return nil
},
)
if err != nil {
return nil, utils.ErrorsWrap(err)
}
return &rspb.CustomAnswerQuestionResp{Answer: answer}, nil
}

View File

@@ -1,17 +1,17 @@
package grpc_server package grpcserver
import ( import (
"git.hlsq.asia/mmorpg/service-common/config" "git.hlsq.asia/alex/service-common/config"
"git.hlsq.asia/mmorpg/service-common/discover/common" "git.hlsq.asia/alex/service-common/discover/common"
"git.hlsq.asia/mmorpg/service-common/net/grpc/service" "git.hlsq.asia/alex/service-common/net/grpc/service"
"git.hlsq.asia/mmorpg/service-common/proto/rs/grpc_pb" "git.hlsq.asia/alex/service-common/proto/rs/rspb"
"git.hlsq.asia/mmorpg/service-qgdzs/internal/dao/query" "git.hlsq.asia/alex/service-qgdzs/internal/dao/query"
"git.hlsq.asia/mmorpg/service-qgdzs/internal/dao/repository" "git.hlsq.asia/alex/service-qgdzs/internal/dao/repository"
"google.golang.org/grpc" "google.golang.org/grpc"
) )
type Server struct { type Server struct {
grpc_pb.UnimplementedQgdzsServer rspb.UnimplementedQgdzsServer
service.Base service.Base
query *query.Query query *query.Query
} }
@@ -35,7 +35,7 @@ func (s *Server) OnCustomGrpcServerOption() []grpc.ServerOption {
} }
func (s *Server) OnInit(serve *grpc.Server) { func (s *Server) OnInit(serve *grpc.Server) {
grpc_pb.RegisterQgdzsServer(serve, s) rspb.RegisterQgdzsServer(serve, s)
s.query = repository.Query() s.query = repository.Query()
} }

View File

@@ -1,8 +1,8 @@
package grpc_server package grpcserver
import ( import (
"context" "context"
"git.hlsq.asia/mmorpg/service-common/db/redis" "git.hlsq.asia/alex/service-common/db/redis"
) )
// 答题总数排行榜 // 答题总数排行榜

View File

@@ -1,48 +1,48 @@
package grpc_server package grpcserver
import ( import (
"context" "context"
"git.hlsq.asia/mmorpg/service-common/net/http/http_resp" "git.hlsq.asia/alex/service-common/net/http/httpresp"
"git.hlsq.asia/mmorpg/service-common/proto/rs/grpc_pb" "git.hlsq.asia/alex/service-common/proto/rs/rspb"
"git.hlsq.asia/mmorpg/service-common/utils" "git.hlsq.asia/alex/service-common/utils"
"git.hlsq.asia/mmorpg/service-qgdzs/internal/dao/repository" "git.hlsq.asia/alex/service-qgdzs/internal/dao/repository"
) )
// 模块 - 学识分 // 模块 - 学识分
// GetPointRecord 获取学识分获取记录 // GetPointRecord 获取学识分获取记录
func (s *Server) GetPointRecord(ctx context.Context, req *grpc_pb.GetPointRecordReq) (*grpc_pb.GetPointRecordResp, error) { func (s *Server) GetPointRecord(ctx context.Context, req *rspb.GetPointRecordReq) (*rspb.GetPointRecordResp, error) {
if !utils.ShouldBindUsn(ctx, &req.USN) { if !utils.ShouldBindUsn(ctx, &req.USN) {
return nil, http_resp.ParamError return nil, httpresp.ParamError
} }
records, count, err := repository.NewPointRecordsDao(ctx, s.query).FindByUSN(req.USN, int(req.Page), int(req.PageSize)) records, count, err := repository.NewPointRecordsDao(ctx, s.query).FindByUSN(req.USN, int(req.Page), int(req.PageSize))
if err != nil { if err != nil {
return nil, utils.ErrorsWrap(err) return nil, utils.ErrorsWrap(err)
} }
resp := make([]*grpc_pb.GetPointRecordItem, 0) resp := make([]*rspb.GetPointRecordItem, 0)
for _, record := range records { for _, record := range records {
resp = append(resp, &grpc_pb.GetPointRecordItem{ resp = append(resp, &rspb.GetPointRecordItem{
Source: record.Source, Source: record.Source,
Point: record.Point, Point: record.Point,
CreateTime: record.CreatedAt.Unix(), CreateTime: record.CreatedAt.Unix(),
}) })
} }
return &grpc_pb.GetPointRecordResp{ return &rspb.GetPointRecordResp{
Count: int32(count), Count: int32(count),
Records: resp, Records: resp,
}, nil }, nil
} }
// GetPoint 获取学识分 // GetPoint 获取学识分
func (s *Server) GetPoint(ctx context.Context, req *grpc_pb.GetPointReq) (*grpc_pb.GetPointResp, error) { func (s *Server) GetPoint(ctx context.Context, req *rspb.GetPointReq) (*rspb.GetPointResp, error) {
if !utils.ShouldBindUsn(ctx, &req.USN) { if !utils.ShouldBindUsn(ctx, &req.USN) {
return nil, http_resp.ParamError return nil, httpresp.ParamError
} }
pointCard, err := repository.NewPointCardDao(ctx, s.query).FindPointByUserSn(req.USN) pointCard, err := repository.NewPointCardDao(ctx, s.query).FindPointByUserSn(req.USN)
if err != nil { if err != nil {
return nil, utils.ErrorsWrap(err) return nil, utils.ErrorsWrap(err)
} }
return &grpc_pb.GetPointResp{ return &rspb.GetPointResp{
Point: pointCard.Point, Point: pointCard.Point,
}, nil }, nil
} }

View File

@@ -1,17 +1,17 @@
package grpc_server package grpcserver
import ( import (
"context" "context"
"encoding/json" "encoding/json"
"errors" "errors"
"fmt" "fmt"
"git.hlsq.asia/mmorpg/service-common/db/redis" "git.hlsq.asia/alex/service-common/db/redis"
"git.hlsq.asia/mmorpg/service-common/log" "git.hlsq.asia/alex/service-common/log"
"git.hlsq.asia/mmorpg/service-common/proto/rs/grpc_pb" "git.hlsq.asia/alex/service-common/proto/rs/rspb"
"git.hlsq.asia/mmorpg/service-common/utils" "git.hlsq.asia/alex/service-common/utils"
"git.hlsq.asia/mmorpg/service-qgdzs/internal/ai" "git.hlsq.asia/alex/service-qgdzs/internal/ai"
"git.hlsq.asia/mmorpg/service-qgdzs/internal/dao/model" "git.hlsq.asia/alex/service-qgdzs/internal/dao/model"
"git.hlsq.asia/mmorpg/service-qgdzs/internal/dao/repository" "git.hlsq.asia/alex/service-qgdzs/internal/dao/repository"
"gorm.io/gorm" "gorm.io/gorm"
"time" "time"
) )
@@ -53,7 +53,7 @@ type Question struct {
Difficulty int32 `json:"difficulty"` // 难度分 Difficulty int32 `json:"difficulty"` // 难度分
} }
func (s *Server) GenerateQuestion(ctx context.Context, req *grpc_pb.GenerateQuestionReq) (*grpc_pb.GenerateQuestionResp, error) { func (s *Server) GenerateQuestion(ctx context.Context, req *rspb.GenerateQuestionReq) (*rspb.GenerateQuestionResp, error) {
categoryDao := repository.NewCategoryDao(ctx, s.query, redis.GetCacheClient()) categoryDao := repository.NewCategoryDao(ctx, s.query, redis.GetCacheClient())
category, err := categoryDao.FindAll() category, err := categoryDao.FindAll()
if err != nil { if err != nil {

View File

@@ -1,19 +1,18 @@
package grpc_server package grpcserver
import ( import (
"context" "context"
"encoding/json" "encoding/json"
"git.hlsq.asia/mmorpg/service-common/db/kafka" "git.hlsq.asia/alex/service-common/db/kafka"
"git.hlsq.asia/mmorpg/service-common/proto/rs/grpc_pb" "git.hlsq.asia/alex/service-common/proto/rs/rspb"
"git.hlsq.asia/mmorpg/service-common/utils" "git.hlsq.asia/alex/service-common/utils"
"git.hlsq.asia/mmorpg/service-qgdzs/internal/dao/repository" "git.hlsq.asia/alex/service-qgdzs/internal/dao/repository"
"git.hlsq.asia/mmorpg/service-qgdzs/internal/timer"
) )
// 玩法 - 随机答题 // 玩法 - 随机答题
// QuicklyGetQuestion 获取题目 // QuicklyGetQuestion 获取题目
func (s *Server) QuicklyGetQuestion(ctx context.Context, req *grpc_pb.QuicklyGetQuestionReq) (*grpc_pb.QuicklyGetQuestionResp, error) { func (s *Server) QuicklyGetQuestion(ctx context.Context, req *rspb.QuicklyGetQuestionReq) (*rspb.QuicklyGetQuestionResp, error) {
question, err := repository.NewQuestionDao(ctx, s.query).FindByRandom(0) question, err := repository.NewQuestionDao(ctx, s.query).FindByRandom(0)
if err != nil { if err != nil {
return nil, utils.ErrorsWrap(err) return nil, utils.ErrorsWrap(err)
@@ -23,7 +22,7 @@ func (s *Server) QuicklyGetQuestion(ctx context.Context, req *grpc_pb.QuicklyGet
return nil, utils.ErrorsWrapF(err, "data: %v", question.Options) return nil, utils.ErrorsWrapF(err, "data: %v", question.Options)
} }
category, _ := repository.NewCategoryDao(ctx, s.query).FindNameBySn(question.CategorySn) category, _ := repository.NewCategoryDao(ctx, s.query).FindNameBySn(question.CategorySn)
return &grpc_pb.QuicklyGetQuestionResp{ return &rspb.QuicklyGetQuestionResp{
Sn: question.Sn, Sn: question.Sn,
Question: question.Question, Question: question.Question,
Options: options, Options: options,
@@ -33,7 +32,7 @@ func (s *Server) QuicklyGetQuestion(ctx context.Context, req *grpc_pb.QuicklyGet
} }
// QuicklyAnswerQuestion 回答题目 // QuicklyAnswerQuestion 回答题目
func (s *Server) QuicklyAnswerQuestion(ctx context.Context, req *grpc_pb.QuicklyAnswerQuestionReq) (*grpc_pb.QuicklyAnswerQuestionResp, error) { func (s *Server) QuicklyAnswerQuestion(ctx context.Context, req *rspb.QuicklyAnswerQuestionReq) (*rspb.QuicklyAnswerQuestionResp, error) {
utils.ShouldBindUsn(ctx, &req.USN) utils.ShouldBindUsn(ctx, &req.USN)
question, err := repository.NewQuestionDao(ctx, s.query).FindBySn(req.Sn) question, err := repository.NewQuestionDao(ctx, s.query).FindBySn(req.Sn)
@@ -46,7 +45,7 @@ func (s *Server) QuicklyAnswerQuestion(ctx context.Context, req *grpc_pb.Quickly
} }
// 保存答题记录 // 保存答题记录
if req.USN != 0 { if req.USN != 0 {
kafka.NewProducer().Produce(ctx, &timer.TopicQuestionAnswer{ kafka.NewProducer().Produce(ctx, &kafka.TopicQuestionAnswer{
MessageSn: utils.SnowflakeInstance().Generate().Int64(), MessageSn: utils.SnowflakeInstance().Generate().Int64(),
USN: req.USN, USN: req.USN,
QuestionSn: question.Sn, QuestionSn: question.Sn,
@@ -54,7 +53,7 @@ func (s *Server) QuicklyAnswerQuestion(ctx context.Context, req *grpc_pb.Quickly
Answer: req.Answer, Answer: req.Answer,
}) })
} }
return &grpc_pb.QuicklyAnswerQuestionResp{ return &rspb.QuicklyAnswerQuestionResp{
Answer: question.Answer, Answer: question.Answer,
Explanation: question.Explanation, Explanation: question.Explanation,
}, nil }, nil

View File

@@ -1,19 +1,18 @@
package grpc_server package grpcserver
import ( import (
"context" "context"
"encoding/json" "encoding/json"
"git.hlsq.asia/mmorpg/service-common/db/kafka" "git.hlsq.asia/alex/service-common/db/kafka"
"git.hlsq.asia/mmorpg/service-common/proto/rs/grpc_pb" "git.hlsq.asia/alex/service-common/proto/rs/rspb"
"git.hlsq.asia/mmorpg/service-common/utils" "git.hlsq.asia/alex/service-common/utils"
"git.hlsq.asia/mmorpg/service-qgdzs/internal/dao/repository" "git.hlsq.asia/alex/service-qgdzs/internal/dao/repository"
"git.hlsq.asia/mmorpg/service-qgdzs/internal/timer"
) )
// 玩法 - 随机答题 // 玩法 - 随机答题
// RandomGetQuestion 获取题目 // RandomGetQuestion 获取题目
func (s *Server) RandomGetQuestion(ctx context.Context, req *grpc_pb.RandomGetQuestionReq) (*grpc_pb.RandomGetQuestionResp, error) { func (s *Server) RandomGetQuestion(ctx context.Context, req *rspb.RandomGetQuestionReq) (*rspb.RandomGetQuestionResp, error) {
question, err := repository.NewQuestionDao(ctx, s.query).FindByRandom(0) question, err := repository.NewQuestionDao(ctx, s.query).FindByRandom(0)
if err != nil { if err != nil {
return nil, utils.ErrorsWrap(err) return nil, utils.ErrorsWrap(err)
@@ -23,7 +22,7 @@ func (s *Server) RandomGetQuestion(ctx context.Context, req *grpc_pb.RandomGetQu
return nil, utils.ErrorsWrapF(err, "data: %v", question.Options) return nil, utils.ErrorsWrapF(err, "data: %v", question.Options)
} }
category, _ := repository.NewCategoryDao(ctx, s.query).FindNameBySn(question.CategorySn) category, _ := repository.NewCategoryDao(ctx, s.query).FindNameBySn(question.CategorySn)
return &grpc_pb.RandomGetQuestionResp{ return &rspb.RandomGetQuestionResp{
Sn: question.Sn, Sn: question.Sn,
Question: question.Question, Question: question.Question,
Options: options, Options: options,
@@ -33,7 +32,7 @@ func (s *Server) RandomGetQuestion(ctx context.Context, req *grpc_pb.RandomGetQu
} }
// RandomAnswerQuestion 回答题目 // RandomAnswerQuestion 回答题目
func (s *Server) RandomAnswerQuestion(ctx context.Context, req *grpc_pb.RandomAnswerQuestionReq) (*grpc_pb.RandomAnswerQuestionResp, error) { func (s *Server) RandomAnswerQuestion(ctx context.Context, req *rspb.RandomAnswerQuestionReq) (*rspb.RandomAnswerQuestionResp, error) {
utils.ShouldBindUsn(ctx, &req.USN) utils.ShouldBindUsn(ctx, &req.USN)
question, err := repository.NewQuestionDao(ctx, s.query).FindBySn(req.Sn) question, err := repository.NewQuestionDao(ctx, s.query).FindBySn(req.Sn)
@@ -46,7 +45,7 @@ func (s *Server) RandomAnswerQuestion(ctx context.Context, req *grpc_pb.RandomAn
} }
// 保存答题记录 // 保存答题记录
if req.USN != 0 { if req.USN != 0 {
kafka.NewProducer().Produce(ctx, &timer.TopicQuestionAnswer{ kafka.NewProducer().Produce(ctx, &kafka.TopicQuestionAnswer{
MessageSn: utils.SnowflakeInstance().Generate().Int64(), MessageSn: utils.SnowflakeInstance().Generate().Int64(),
USN: req.USN, USN: req.USN,
QuestionSn: question.Sn, QuestionSn: question.Sn,
@@ -56,15 +55,15 @@ func (s *Server) RandomAnswerQuestion(ctx context.Context, req *grpc_pb.RandomAn
// 随机答题正确给10分,错误不得分 // 随机答题正确给10分,错误不得分
if req.Answer == question.Answer { if req.Answer == question.Answer {
kafka.NewProducer().Produce(ctx, &timer.TopicAddPoint{ kafka.NewProducer().Produce(ctx, &kafka.TopicAddPoint{
MessageSn: utils.SnowflakeInstance().Generate().Int64(), MessageSn: utils.SnowflakeInstance().Generate().Int64(),
Source: timer.AddPointSourceRandom, Source: kafka.AddPointSourceRandom,
USN: req.USN, USN: req.USN,
Point: 10, Point: 10,
}) })
} }
} }
return &grpc_pb.RandomAnswerQuestionResp{ return &rspb.RandomAnswerQuestionResp{
Answer: question.Answer, Answer: question.Answer,
Explanation: question.Explanation, Explanation: question.Explanation,
}, nil }, nil

View File

@@ -1,28 +1,28 @@
package grpc_server package grpcserver
import ( import (
"context" "context"
"encoding/json" "encoding/json"
"git.hlsq.asia/mmorpg/service-common/net/http/http_resp" "git.hlsq.asia/alex/service-common/net/http/httpresp"
"git.hlsq.asia/mmorpg/service-common/proto/rs/grpc_pb" "git.hlsq.asia/alex/service-common/proto/rs/rspb"
"git.hlsq.asia/mmorpg/service-common/utils" "git.hlsq.asia/alex/service-common/utils"
"git.hlsq.asia/mmorpg/service-qgdzs/internal/dao/repository" "git.hlsq.asia/alex/service-qgdzs/internal/dao/repository"
) )
// 模块 - 答题记录 // 模块 - 答题记录
// GetRecord 获取答题记录 // GetRecord 获取答题记录
func (s *Server) GetRecord(ctx context.Context, req *grpc_pb.GetRecordReq) (*grpc_pb.GetRecordResp, error) { func (s *Server) GetRecord(ctx context.Context, req *rspb.GetRecordReq) (*rspb.GetRecordResp, error) {
if !utils.ShouldBindUsn(ctx, &req.USN) { if !utils.ShouldBindUsn(ctx, &req.USN) {
return nil, http_resp.ParamError return nil, httpresp.ParamError
} }
records, count, err := repository.NewRecordDao(ctx, s.query).FindByUSN(req.USN, int(req.Page), int(req.PageSize)) records, count, err := repository.NewRecordDao(ctx, s.query).FindByUSN(req.USN, int(req.Page), int(req.PageSize))
if err != nil { if err != nil {
return nil, utils.ErrorsWrap(err) return nil, utils.ErrorsWrap(err)
} }
resp := make([]*grpc_pb.GetRecordItem, 0) resp := make([]*rspb.GetRecordItem, 0)
for _, record := range records { for _, record := range records {
resp = append(resp, &grpc_pb.GetRecordItem{ resp = append(resp, &rspb.GetRecordItem{
QuestionSn: record.QuestionSn, QuestionSn: record.QuestionSn,
Question: record.Question, Question: record.Question,
Difficulty: record.Difficulty, Difficulty: record.Difficulty,
@@ -32,14 +32,14 @@ func (s *Server) GetRecord(ctx context.Context, req *grpc_pb.GetRecordReq) (*grp
CreateTime: record.CreatedAt.Unix(), CreateTime: record.CreatedAt.Unix(),
}) })
} }
return &grpc_pb.GetRecordResp{ return &rspb.GetRecordResp{
Count: int32(count), Count: int32(count),
Records: resp, Records: resp,
}, nil }, nil
} }
// GetQuestionInfo 获取具体的题目 // GetQuestionInfo 获取具体的题目
func (s *Server) GetQuestionInfo(ctx context.Context, req *grpc_pb.GetQuestionInfoReq) (*grpc_pb.GetQuestionInfoResp, error) { func (s *Server) GetQuestionInfo(ctx context.Context, req *rspb.GetQuestionInfoReq) (*rspb.GetQuestionInfoResp, error) {
question, err := repository.NewQuestionDao(ctx, s.query).FindBySn(req.QuestionSn) question, err := repository.NewQuestionDao(ctx, s.query).FindBySn(req.QuestionSn)
if err != nil { if err != nil {
return nil, utils.ErrorsWrap(err) return nil, utils.ErrorsWrap(err)
@@ -49,7 +49,7 @@ func (s *Server) GetQuestionInfo(ctx context.Context, req *grpc_pb.GetQuestionIn
return nil, utils.ErrorsWrapF(err, "data: %v", question.Options) return nil, utils.ErrorsWrapF(err, "data: %v", question.Options)
} }
category, _ := repository.NewCategoryDao(ctx, s.query).FindNameBySn(question.CategorySn) category, _ := repository.NewCategoryDao(ctx, s.query).FindNameBySn(question.CategorySn)
return &grpc_pb.GetQuestionInfoResp{ return &rspb.GetQuestionInfoResp{
Question: question.Question, Question: question.Question,
Options: options, Options: options,
Category: category, Category: category,

View File

@@ -3,11 +3,11 @@ package timer
import ( import (
"context" "context"
"errors" "errors"
"git.hlsq.asia/mmorpg/service-common/db/kafka" "git.hlsq.asia/alex/service-common/db/kafka"
"git.hlsq.asia/mmorpg/service-common/log" "git.hlsq.asia/alex/service-common/log"
"git.hlsq.asia/mmorpg/service-common/utils" "git.hlsq.asia/alex/service-common/utils"
"git.hlsq.asia/mmorpg/service-qgdzs/internal/dao/model" "git.hlsq.asia/alex/service-qgdzs/internal/dao/model"
"git.hlsq.asia/mmorpg/service-qgdzs/internal/dao/repository" "git.hlsq.asia/alex/service-qgdzs/internal/dao/repository"
"gorm.io/gorm" "gorm.io/gorm"
) )
@@ -20,15 +20,7 @@ func startConsumer() {
} }
type TopicQuestionAnswer struct { type TopicQuestionAnswer struct {
MessageSn int64 `json:"messageSn"` kafka.TopicQuestionAnswer
USN int64 `json:"usn"`
QuestionSn int64 `json:"questionSn"`
QuestionAnswer string `json:"questionAnswer"`
Answer string `json:"answer"`
}
func (t *TopicQuestionAnswer) Name() string {
return "qgdzs.question.answer"
} }
func (t *TopicQuestionAnswer) OnMessage(ctx context.Context) error { func (t *TopicQuestionAnswer) OnMessage(ctx context.Context) error {
@@ -60,23 +52,7 @@ func (t *TopicQuestionAnswer) OnMessage(ctx context.Context) error {
} }
type TopicAddPoint struct { type TopicAddPoint struct {
MessageSn int64 `json:"messageSn"` kafka.TopicAddPoint
Source AddPointSource `json:"source"`
USN int64 `json:"usn"`
Point int64 `json:"point"`
}
type AddPointSource int32
const (
AddPointSourceUnKnown = 0
AddPointSourceRandom = 1
AddPointSourceCategory = 2
AddPointSourceQuickly = 3
)
func (t *TopicAddPoint) Name() string {
return "qgdzs.user.point"
} }
func (t *TopicAddPoint) OnMessage(ctx context.Context) error { func (t *TopicAddPoint) OnMessage(ctx context.Context) error {

View File

@@ -2,12 +2,16 @@ package main
import ( import (
"fmt" "fmt"
"git.hlsq.asia/mmorpg/service-qgdzs/app" "git.hlsq.asia/alex/service-qgdzs/app"
"git.hlsq.asia/alex/service-qgdzs/config"
"github.com/judwhite/go-svc" "github.com/judwhite/go-svc"
"syscall" "syscall"
) )
func main() { func main() {
if err := config.LoadConfig(); err != nil {
fmt.Println(err)
}
if err := svc.Run(&app.Program{}, syscall.SIGINT, syscall.SIGTERM, syscall.SIGKILL); err != nil { if err := svc.Run(&app.Program{}, syscall.SIGINT, syscall.SIGTERM, syscall.SIGKILL); err != nil {
fmt.Println(err) fmt.Println(err)
} }