Commit 1584eb4bb5401523aaed59ad2fd726baa00ef5e7

Authored by zhangqijia
1 parent d7ecc295

修复创建唯一索引的bug

actions/accountaction.go
... ... @@ -14,7 +14,7 @@ func (s *AccountServer) RegisterHandler(ctx context.Context, in *pb.Register) (*
14 14 if !ok {
15 15 account.Phone = in.Phone
16 16 account.Password = utils.Md5V(in.Password)
17   - account.Uid = conf.SnowFlack.NextVal()
  17 + account.Uid = conf.SnowFlack.NextValStr()
18 18 account.Device = "123123"
19 19 account.Create()
20 20 }else {
... ... @@ -27,7 +27,29 @@ func (s *AccountServer) RegisterHandler(ctx context.Context, in *pb.Register) (*
27 27 }
28 28  
29 29 func (s *AccountServer) CreateTokenHandler(ctx context.Context, in *pb.AccountInfo) (*pb.CreateTokenRsp, error) {
  30 + m := models.NewAccount(in.Phone)
  31 + if err := m.Load(); err != nil {
  32 + return &pb.CreateTokenRsp{
  33 + Rsp: &pb.PubRsp{
  34 + Code: 1,
  35 + Msg: err.Error(),
  36 + },
  37 + }, nil
  38 + }
  39 +
  40 + if m.Password != utils.Md5V(in.Password) {
  41 + return &pb.CreateTokenRsp{
  42 + Rsp: &pb.PubRsp{
  43 + Code: 2,
  44 + Msg: "password error",
  45 + },
  46 + }, nil
  47 + }
  48 +
30 49 return &pb.CreateTokenRsp{
  50 + Rsp: &pb.PubRsp{
  51 + Code: 0,
  52 + },
31 53 Token: utils.CreateToken(in),
32 54 GameService: &pb.ServiceInfo{
33 55 Id: "1",
... ...
actions/basic.go
... ... @@ -5,7 +5,6 @@ import (
5 5 "net"
6 6 "pro2d/components/db"
7 7 "pro2d/conf"
8   - "pro2d/utils"
9 8 )
10 9  
11 10 type BasicServer struct {
... ... @@ -20,10 +19,7 @@ func NewServer(db string) *BasicServer {
20 19  
21 20 func (b *BasicServer) Start(sConf *conf.SConf) (net.Listener, error) {
22 21 //初始化数据库
23   - err := db.Connect(conf.GlobalConf.MongoConf.User, conf.GlobalConf.MongoConf.Password, conf.GlobalConf.MongoConf.Host, conf.GlobalConf.MongoConf.Port, conf.GlobalConf.MongoConf.MaxNum, conf.GlobalConf.MongoConf.TimeOut, sConf.DBName)
24   - if err != nil {
25   - utils.Sugar.Errorf("mongodb init error: %v", err)
26   - }
  22 + db.MongoDatabase = db.MongoClient.Database(sConf.DBName)
27 23  
28 24 listing := fmt.Sprintf(":%d", sConf.Port)
29 25 lis, err := net.Listen("tcp", listing)
... ...
components/db/mongo.go
... ... @@ -8,6 +8,8 @@ import (
8 8 "go.mongodb.org/mongo-driver/mongo/options"
9 9 "go.mongodb.org/mongo-driver/mongo/readpref"
10 10 "go.mongodb.org/mongo-driver/x/bsonx"
  11 + "pro2d/utils"
  12 + "reflect"
11 13 "sort"
12 14 "strconv"
13 15 "time"
... ... @@ -19,7 +21,7 @@ var (
19 21 )
20 22  
21 23 //初始化
22   -func Connect(user, password, host string,port int, MaxNum int, timeOut int, dbname string) error {
  24 +func Connect(user, password, host string,port int, MaxNum int, timeOut int) error {
23 25 var uri string
24 26 if user!= "" {
25 27 //uri = fmt.Sprintf("mongodb://%s:%s@%s:%d/%s?w=majority", conf.User, conf.Password, conf.Host, conf.Port, conf.DBName)
... ... @@ -46,7 +48,7 @@ func Connect(user, password, host string,port int, MaxNum int, timeOut int, dbna
46 48 return err
47 49 }
48 50  
49   - MongoDatabase = MongoClient.Database(dbname)
  51 + //MongoDatabase = MongoClient.Database(dbname)
50 52 return nil
51 53 }
52 54  
... ... @@ -85,17 +87,18 @@ func GetBsonM(key string, value interface{}) interface{} {
85 87 return bson.M{key: value}
86 88 }
87 89  
88   -func NewMongoColl(collection string, pri, schema interface{}) *MgoColl {
  90 +func NewMongoColl(key string, schema interface{}) *MgoColl {
89 91 return &MgoColl{
90   - collection: MongoDatabase.Collection(collection),
91   -
92   - pri: pri,
  92 + collection: MongoDatabase.Collection(utils.GetCollName(schema)),
  93 + pri: GetBsonM(utils.GetPriKey(schema), key),
93 94 schema: schema,
94 95 }
95 96 }
96 97  
97   -func (m *MgoColl)SetDatabase(databases string) {
98   - //m.db = databases
  98 +func FindOne(pri interface{}, schema interface{}) error {
  99 + s := reflect.TypeOf(schema)
  100 + r := MongoDatabase.Collection(s.Name()).FindOne(context.TODO(), pri)
  101 + return r.Decode(schema)
99 102 }
100 103  
101 104 // 查询单个
... ... @@ -106,21 +109,6 @@ func (m *MgoColl) FindOneKV(key string, value interface{}) *mongo.SingleResult {
106 109 return singleResult
107 110 }
108 111  
109   -func (m *MgoColl) FindOne(pri interface{}) *mongo.SingleResult {
110   - //collection.
111   - singleResult := m.collection.FindOne(context.TODO(), pri)
112   - return singleResult
113   -}
114   -
115   -//插入单个
116   -func (m *MgoColl) InsertOne(value interface{}) *mongo.InsertOneResult {
117   - insertResult, err := m.collection.InsertOne(context.TODO(), value)
118   - if err != nil {
119   - fmt.Println(err)
120   - }
121   - return insertResult
122   -}
123   -
124 112 //查询集合里有多少数据
125 113 func (m *MgoColl) CollectionCount() (string, int64) {
126 114 size, _ := m.collection.EstimatedDocumentCount(context.TODO())
... ... @@ -219,7 +207,7 @@ func (m *MgoColl) UpdateOne(filter interface{}, update interface{})*mongo.Update
219 207  
220 208  
221 209 func (m *MgoColl) Load() error{
222   - r := m.FindOne(m.pri)
  210 + r := m.collection.FindOne(context.TODO(), m.pri)
223 211 err := r.Decode(m.schema)
224 212 if err != nil {
225 213 return err
... ... @@ -227,8 +215,8 @@ func (m *MgoColl) Load() error{
227 215 return nil
228 216 }
229 217  
230   -func (m *MgoColl) Create() {
231   - m.InsertOne(m.schema)
  218 +func (m *MgoColl) Create() (*mongo.InsertOneResult, error){
  219 + return m.collection.InsertOne(context.TODO(), m.schema)
232 220 }
233 221  
234 222 func (m *MgoColl) Update(update interface{}) {
... ...
conf/conf.go
... ... @@ -5,6 +5,7 @@ import (
5 5 lumberjack "gopkg.in/natefinch/lumberjack.v2"
6 6 "gopkg.in/yaml.v3"
7 7 "io/ioutil"
  8 + "pro2d/components/db"
8 9 "pro2d/utils"
9 10 )
10 11  
... ... @@ -73,4 +74,8 @@ func init() {
73 74 //初始化雪花算法
74 75 SnowFlack = utils.NewSnowflake(GlobalConf.WorkerID, GlobalConf.DatacenterID)
75 76  
  77 + err = db.Connect(GlobalConf.MongoConf.User, GlobalConf.MongoConf.Password, GlobalConf.MongoConf.Host, GlobalConf.MongoConf.Port, GlobalConf.MongoConf.MaxNum, GlobalConf.MongoConf.TimeOut)
  78 + if err != nil {
  79 + utils.Sugar.Errorf("connect db err: %v", err)
  80 + }
76 81 }
77 82 \ No newline at end of file
... ...
models/account.go
... ... @@ -23,7 +23,7 @@ func NewAccount(phone string) *AccountModel {
23 23 Phone: phone,
24 24 }
25 25 account := &AccountModel{
26   - MgoColl: db.NewMongoColl( "account", db.GetBsonM("phone", phone), ac),
  26 + MgoColl: db.NewMongoColl(phone, ac),
27 27 AccountInfo: ac,
28 28 }
29 29  
... ...
models/equip.go 0 → 100644
... ... @@ -0,0 +1,24 @@
  1 +package models
  2 +
  3 +import (
  4 + "pro2d/components/db"
  5 + "pro2d/protos/pb"
  6 + "strconv"
  7 +)
  8 +
  9 +type EquipModels struct {
  10 + *db.MgoColl
  11 + Equip *pb.Equipment
  12 +}
  13 +
  14 +func NewEquip(id int64) *EquipModels{
  15 + data := &pb.Equipment{
  16 + Id: id,
  17 + }
  18 + m := &EquipModels {
  19 + MgoColl: db.NewMongoColl(strconv.Itoa(int(id)), data),
  20 + Equip: data,
  21 + }
  22 +
  23 + return m
  24 +}
0 25 \ No newline at end of file
... ...
models/hero.go
... ... @@ -3,6 +3,7 @@ package models
3 3 import (
4 4 "pro2d/components/db"
5 5 "pro2d/protos/pb"
  6 + "strconv"
6 7 )
7 8  
8 9 type HeroModel struct {
... ... @@ -24,7 +25,7 @@ func NewHero(id int64) *HeroModel {
24 25 Id: id,
25 26 }
26 27 m := &HeroModel{
27   - MgoColl: db.NewMongoColl("hero", db.GetBsonM("id", h.Id), h),
  28 + MgoColl: db.NewMongoColl(strconv.Itoa(int(id)), h),
28 29 Hero: h,
29 30 }
30 31 return m
... ...
models/init.go
... ... @@ -8,13 +8,12 @@ import (
8 8  
9 9 func InitDoc(schema ...interface{}) {
10 10 for _, s := range schema {
11   - for coll, key := range utils.FindIndex(s) {
12   - if err := db.CreateCollection(coll); err != nil {
13   - continue
14   - }
  11 + coll, keys := utils.FindIndex(s)
  12 + for _, index := range keys {
  13 + db.CreateCollection(coll)
15 14  
16   - utils.Sugar.Debugf("InitDoc collect: %v, createIndex: %s", coll, key)
17   - res, err := db.SetUnique(coll, key)
  15 + utils.Sugar.Debugf("InitDoc collect: %v, createIndex: %s", coll, index)
  16 + res, err := db.SetUnique(coll, index)
18 17 if err != nil {
19 18 utils.Sugar.Errorf("InitDoc unique: %s, err: %v", res, err)
20 19 continue
... ...
models/init_test.go
... ... @@ -3,25 +3,18 @@ package models
3 3 import (
4 4 "context"
5 5 "pro2d/components/db"
6   - "pro2d/conf"
7 6 _ "pro2d/conf"
8   - "pro2d/utils"
9 7 "testing"
10 8 )
11 9  
12 10  
13 11 func TestInitModels(t *testing.T) {
14   - err := db.Connect(conf.GlobalConf.MongoConf.User, conf.GlobalConf.MongoConf.Password, conf.GlobalConf.MongoConf.Host, conf.GlobalConf.MongoConf.Port, conf.GlobalConf.MongoConf.MaxNum, conf.GlobalConf.MongoConf.TimeOut,"account")
15   - if err != nil {
16   - utils.Sugar.Errorf("mongodb init error: %v", err)
17   - }
18 12  
  13 + db.MongoDatabase = db.MongoClient.Database("account")
19 14 InitAccountServerModels()
20 15 db.MongoClient.Disconnect(context.TODO())
21   - err = db.Connect(conf.GlobalConf.MongoConf.User, conf.GlobalConf.MongoConf.Password, conf.GlobalConf.MongoConf.Host, conf.GlobalConf.MongoConf.Port, conf.GlobalConf.MongoConf.MaxNum, conf.GlobalConf.MongoConf.TimeOut,"game")
22   - if err != nil {
23   - utils.Sugar.Errorf("mongodb init error: %v", err)
24   - }
  16 +
  17 + db.MongoDatabase = db.MongoClient.Database("game")
25 18 InitGameServerModels()
26 19 db.MongoClient.Disconnect(context.TODO())
27 20 }
28 21 \ No newline at end of file
... ...
models/prop.go 0 → 100644
... ... @@ -0,0 +1,24 @@
  1 +package models
  2 +
  3 +import (
  4 + "pro2d/components/db"
  5 + "pro2d/protos/pb"
  6 + "strconv"
  7 +)
  8 +
  9 +type PropModels struct {
  10 + *db.MgoColl
  11 + Prop *pb.Prop
  12 +}
  13 +
  14 +func NewProp(id int64) *PropModels{
  15 + data := &pb.Prop{
  16 + Id: id,
  17 + }
  18 + m := &PropModels{
  19 + MgoColl: db.NewMongoColl(strconv.Itoa(int(id)), data),
  20 + Prop: data,
  21 + }
  22 +
  23 + return m
  24 +}
0 25 \ No newline at end of file
... ...
models/role.go
... ... @@ -4,30 +4,34 @@ import (
4 4 "fmt"
5 5 "pro2d/components/db"
6 6 "pro2d/protos/pb"
  7 + "strconv"
7 8 )
8 9  
9 10 type RoleModel struct {
10 11 *db.MgoColl
11 12 Role *pb.Role
12 13 Heros HeroMap
13   - Teams *pb.Team
  14 + Teams *TeamModel
14 15 Equip *pb.Equipment
15 16 Prop *pb.Prop
16 17 }
17 18  
18   -func RoleExistByUid(uid int64) (bool, *RoleModel){
19   - m := NewRole(uid)
20   - if err := m.Load(); err != nil {
21   - return false, m
  19 +func RoleExistByUid(uid string) (bool, *RoleModel){
  20 + data := &pb.Role{Uid: uid}
  21 +
  22 + if err := db.FindOne(db.GetBsonM("uid", uid), data); err != nil {
  23 + return false, nil
22 24 }
  25 + m := NewRole(data.Id)
  26 + m.Load()
23 27 return true, m
24 28 }
25 29  
26   -func NewRole(uid int64) *RoleModel {
27   - r := &pb.Role{Uid: uid}
  30 +func NewRole(id int64) *RoleModel {
  31 + data := &pb.Role{Id: id}
28 32 m := &RoleModel{
29   - MgoColl: db.NewMongoColl("role", db.GetBsonM("uid", r.Uid), r),
30   - Role: r,
  33 + MgoColl: db.NewMongoColl(strconv.Itoa(int(id)), data),
  34 + Role: data,
31 35 Heros: make(HeroMap),
32 36 }
33 37 return m
... ...
models/role_test.go
1 1 package models
2 2  
3 3 import (
  4 + "fmt"
  5 + "pro2d/components/db"
  6 + "pro2d/conf"
4 7 "pro2d/protos/pb"
  8 + "pro2d/utils"
5 9 "testing"
6 10 )
7 11  
8 12 func TestNewRole(t *testing.T) {
9 13 //db.MongoDBClient.Database(conf.GlobalConf.AccountConf.DBName).Drop(context.Background())
10 14 //db.MongoDBClient.Database(conf.GlobalConf.GameConf.DBName).Drop(context.Background())
  15 + db.MongoDatabase = db.MongoClient.Database("game")
11 16  
12   - var uid int64 = 1
13   - var role *RoleModel
14   - if ok, role := RoleExistByUid(uid); ok {
15   - role.Role.Device = "111111"
  17 + var uid = conf.SnowFlack.NextValStr()
  18 + ok, role := RoleExistByUid(uid)
  19 + if ok {
  20 + //uid存在 , 更新角色
  21 + role.Role.Device = "222222"
16 22 role.AddHero(&pb.Hero{
17 23 Id: 1,
18 24 RoleId: role.Role.Id,
... ... @@ -24,12 +30,20 @@ func TestNewRole(t *testing.T) {
24 30 })
25 31 role.Save()
26 32 }else {
27   - role = NewRole(uid)
28   - role.Role.Id = 1
29   - role.Role.Device = "222222"
  33 + //uid不存在,创建角色
  34 + role = NewRole(1)
  35 + role.Role.Uid = uid
  36 + role.Role.Device = "111111"
30 37 role.Role.Level = 0
31   - role.Create()
32   - role.SetUnique("uid")
  38 + i, err := role.Create()
  39 + fmt.Println(i, err)
33 40 }
34 41 print(role)
  42 +}
  43 +
  44 +func TestRoleIndex(t *testing.T) {
  45 + coll, keys := utils.FindIndex(pb.Role{})
  46 + for _, index := range keys {
  47 + utils.Sugar.Debugf("coll: %s, key: %s", coll, index)
  48 + }
35 49 }
36 50 \ No newline at end of file
... ...
models/team.go
... ... @@ -3,6 +3,7 @@ package models
3 3 import (
4 4 "pro2d/components/db"
5 5 "pro2d/protos/pb"
  6 + "strconv"
6 7 )
7 8  
8 9 type TeamModel struct {
... ... @@ -15,7 +16,7 @@ func NewTeam(id int64) *TeamModel{
15 16 Id: id,
16 17 }
17 18 m := &TeamModel{
18   - MgoColl: db.NewMongoColl( "team", data, data),
  19 + MgoColl: db.NewMongoColl(strconv.Itoa(int(id)), data),
19 20 Team: data,
20 21 }
21 22  
... ...
test/client.go
... ... @@ -64,16 +64,26 @@ func main() {
64 64 }
65 65 defer conn.Close()
66 66 c := pb.NewAccountClient(conn)
67   - //err = Register(c,"17683852936", "123456")
68   - //if err != nil {
69   - // utils.Sugar.Errorf("register err: %v", err)
70   - // return
71   - //}
  67 + err = Register(c,"17683852936", "123456")
  68 + if err != nil {
  69 + utils.Sugar.Errorf("register err: %v", err)
  70 + return
  71 + }
72 72 rsp, err := c.CreateTokenHandler(context.Background(), &pb.AccountInfo{
73 73 Phone: "17683852936",
74 74 Password: "123456",
75 75 })
76 76  
  77 + if err != nil {
  78 + utils.Sugar.Errorf("createtoken err: %v", err)
  79 + return
  80 + }
  81 +
  82 + if rsp.Rsp.Code != 0 {
  83 + utils.Sugar.Errorf("createtoken err: %v", rsp.Rsp.Msg)
  84 + return
  85 + }
  86 +
77 87 Login(rsp.GameService.Address, rsp.Token)
78 88  
79 89  
... ...
utils/utils.go
... ... @@ -5,18 +5,45 @@ import (
5 5 "strings"
6 6 )
7 7  
  8 +func GetCollName(schema interface{}) string {
  9 + s := reflect.TypeOf(schema)
  10 + if s.Kind() == reflect.Ptr {
  11 + s = reflect.TypeOf(schema).Elem()
  12 + }
  13 +
  14 + return strings.ToLower(s.Name())
  15 +}
8 16  
9   -func FindIndex(schema interface{}) map[string]string{
  17 +func GetPriKey(schema interface{}) string {
10 18 s := reflect.TypeOf(schema)
11   - tb := make(map[string]string)
  19 + if s.Kind() == reflect.Ptr {
  20 + s = reflect.TypeOf(schema).Elem()
  21 + }
  22 + var pri string
  23 + for i := 0; i < s.NumField(); i++ {
  24 + if s.Field(i).Tag.Get("pri") == "1" {
  25 + pri = strings.ToLower(s.Field(i).Name)
  26 + break
  27 + }
  28 + }
  29 + return pri
  30 +}
  31 +
  32 +func FindIndex(schema interface{}) (string, []string){
  33 + s := reflect.TypeOf(schema)
  34 + if s.Kind() == reflect.Ptr {
  35 + s = reflect.TypeOf(schema).Elem()
  36 + }
  37 +
  38 + var index []string
12 39 for i := 0; i < s.NumField(); i++ {
13 40 if s.Field(i).Tag.Get("index") != "" {
14 41 js := strings.Split(s.Field(i).Tag.Get("json"), ",")
15 42 if len(js) == 0 {
16 43 continue
17 44 }
18   - tb[strings.ToLower(s.Name())] = js[0]
  45 + index = append(index, js[0])
19 46 }
20 47 }
21   - return tb
  48 + return strings.ToLower(s.Name()), index
22 49 }
23 50 \ No newline at end of file
... ...