Commit 1584eb4bb5401523aaed59ad2fd726baa00ef5e7
1 parent
d7ecc295
修复创建唯一索引的bug
Showing
15 changed files
with
186 additions
and
78 deletions
 
Show diff stats
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
| ... | ... | @@ -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 | ... | ... | 
| ... | ... | @@ -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 | ... | ... |