Commit 3592dfd3747ba9d086918986319e82dac1745af3

Authored by zhangqijia
1 parent eb417b0b

重构models, 索引唯一索引

Makefile
... ... @@ -4,6 +4,7 @@ all: ge build run
4 4  
5 5 ge:
6 6 protoc -I./protos --go_out=./protos --go-grpc_out=./protos ./protos/*proto
  7 + protoc-go-inject-tag -input=./protos/pb/*.pb.go
7 8  
8 9 test:
9 10 go run test/client.go
... ...
README.md
... ... @@ -12,6 +12,11 @@
12 12 * proto gorm 查询
13 13  
14 14 ## 环境安装
  15 +protoc-go-inject-tag: 目的是往protos文件中打入自定义标签
  16 +```shell
  17 +$ go get github.com/favadi/protoc-go-inject-tag
  18 +```
  19 +
15 20 etcd
16 21 ```shell
17 22 $ go get go.etcd.io/etcd/client/v3
... ...
actions/accountaction.go
... ... @@ -10,7 +10,7 @@ import (
10 10 )
11 11  
12 12 func (s *AccountServer) RegisterHandler(ctx context.Context, in *pb.Register) (*pb.PubRsp, error) {
13   - ok, account := models.AccountExistByPhone(s.DBName, in.Phone)
  13 + ok, account := models.AccountExistByPhone(in.Phone)
14 14 if !ok {
15 15 account.Phone = in.Phone
16 16 account.Password = utils.Md5V(in.Password)
... ...
actions/basic.go
... ... @@ -3,7 +3,9 @@ package actions
3 3 import (
4 4 "fmt"
5 5 "net"
  6 + "pro2d/components/db"
6 7 "pro2d/conf"
  8 + "pro2d/utils"
7 9 )
8 10  
9 11 type BasicServer struct {
... ... @@ -17,6 +19,12 @@ func NewServer(db string) *BasicServer {
17 19 }
18 20  
19 21 func (b *BasicServer) Start(sConf *conf.SConf) (net.Listener, error) {
  22 + //初始化数据库
  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 + }
  27 +
20 28 listing := fmt.Sprintf(":%d", sConf.Port)
21 29 lis, err := net.Listen("tcp", listing)
22 30 if err != nil {
... ...
actions/server.go
... ... @@ -5,6 +5,7 @@ import (
5 5 "google.golang.org/grpc"
6 6 "google.golang.org/grpc/reflection"
7 7 "pro2d/conf"
  8 + "pro2d/models"
8 9 "pro2d/protos/pb"
9 10 "pro2d/utils"
10 11 )
... ... @@ -35,6 +36,8 @@ func (s *AccountServer)Start() error {
35 36 return err
36 37 }
37 38  
  39 + models.InitAccountServerModels()
  40 +
38 41 //new一个grpc
39 42 gs := grpc.NewServer(grpc.UnaryInterceptor(AccountServerInterceptor))
40 43  
... ... @@ -52,7 +55,6 @@ func (s *AccountServer)Stop() {
52 55 s.BasicServer.Close()
53 56 }
54 57  
55   -
56 58 type GameServer struct{
57 59 pb.UnimplementedGameServer
58 60 *BasicServer
... ... @@ -78,6 +80,8 @@ func (s *GameServer)Start() error {
78 80 return err
79 81 }
80 82  
  83 + models.InitGameServerModels()
  84 +
81 85 //new一个grpc
82 86 gs := grpc.NewServer(grpc.UnaryInterceptor(GameServerInterceptor))
83 87  
... ...
cmd/account.go 0 → 100644
... ... @@ -0,0 +1,17 @@
  1 +package main
  2 +
  3 +import (
  4 + "pro2d/actions"
  5 + "pro2d/utils"
  6 +)
  7 +
  8 +func main() {
  9 + err := make(chan error)
  10 + server := actions.NewAccountServer()
  11 + go func() {
  12 + defer server.Stop()
  13 + err <- server.Start()
  14 + }()
  15 +
  16 + utils.Sugar.Errorf("server error: %v", <- err)
  17 +}
... ...
cmd/game.go 0 → 100644
... ... @@ -0,0 +1,19 @@
  1 +package main
  2 +
  3 +import (
  4 + "pro2d/actions"
  5 + "pro2d/utils"
  6 +)
  7 +
  8 +func main() {
  9 + err := make(chan error)
  10 +
  11 +
  12 + server := actions.NewGameServer()
  13 + go func() {
  14 + defer server.Stop()
  15 + err <- server.Start()
  16 + }()
  17 +
  18 + utils.Sugar.Errorf("server error: %v", <- err)
  19 +}
... ...
components/db/mongo.go
... ... @@ -8,14 +8,18 @@ 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 + "sort"
11 12 "strconv"
12 13 "time"
13 14 )
14 15  
15   -var MongoDBClient *mongo.Client
  16 +var (
  17 + MongoClient *mongo.Client
  18 + MongoDatabase *mongo.Database
  19 +)
16 20  
17 21 //初始化
18   -func Connect(user, password, host string,port int, MaxNum int, timeOut int) error {
  22 +func Connect(user, password, host string,port int, MaxNum int, timeOut int, dbname string) error {
19 23 var uri string
20 24 if user!= "" {
21 25 //uri = fmt.Sprintf("mongodb://%s:%s@%s:%d/%s?w=majority", conf.User, conf.Password, conf.Host, conf.Port, conf.DBName)
... ... @@ -33,19 +37,42 @@ func Connect(user, password, host string,port int, MaxNum int, timeOut int) erro
33 37 o.SetMaxPoolSize(uint64(MaxNum))
34 38 // 发起链接
35 39 var err error
36   - MongoDBClient, err = mongo.Connect(ctx, o)
  40 + MongoClient , err = mongo.Connect(ctx, o)
37 41 if err != nil {
38 42 return err
39 43 }
40 44 // 判断服务是不是可用
41   - if err = MongoDBClient.Ping(context.Background(), readpref.Primary()); err != nil {
  45 + if err = MongoClient.Ping(context.Background(), readpref.Primary()); err != nil {
42 46 return err
43 47 }
  48 +
  49 + MongoDatabase = MongoClient.Database(dbname)
44 50 return nil
45 51 }
46 52  
  53 +func CreateCollection(collection string) error {
  54 + colls, _ := MongoDatabase.ListCollectionNames(context.TODO(), bson.D{})
  55 + pos := sort.SearchStrings(colls, collection)
  56 + if pos != len(colls) {
  57 + if collection == colls[pos] {
  58 + return MongoDatabase.CreateCollection(context.TODO(), collection)
  59 + }
  60 + }
  61 + return MongoDatabase.CreateCollection(context.TODO(), collection)
  62 +}
  63 +
  64 +func SetUnique(collection string, key string) (string, error) {
  65 + return MongoDatabase.Collection(collection).Indexes().CreateOne(
  66 + context.TODO(),
  67 + mongo.IndexModel{
  68 + Keys : bsonx.Doc{{key, bsonx.Int32(1)}},
  69 + Options: options.Index().SetUnique(true),
  70 + },
  71 + )
  72 +}
  73 +
47 74 type MgoColl struct {
48   - mgo *mongo.Collection
  75 + collection *mongo.Collection
49 76  
50 77 pri interface{}
51 78 schema interface{}
... ... @@ -58,9 +85,9 @@ func GetBsonM(key string, value interface{}) interface{} {
58 85 return bson.M{key: value}
59 86 }
60 87  
61   -func NewMongoColl(database, collection string, pri, schema interface{}) *MgoColl {
  88 +func NewMongoColl(collection string, pri, schema interface{}) *MgoColl {
62 89 return &MgoColl{
63   - mgo: MongoDBClient.Database(database).Collection(collection),
  90 + collection: MongoDatabase.Collection(collection),
64 91  
65 92 pri: pri,
66 93 schema: schema,
... ... @@ -75,19 +102,19 @@ func (m *MgoColl)SetDatabase(databases string) {
75 102 func (m *MgoColl) FindOneKV(key string, value interface{}) *mongo.SingleResult {
76 103 //collection.
77 104 filter := bson.D{ {key, value}}
78   - singleResult := m.mgo.FindOne(context.TODO(), filter)
  105 + singleResult := m.collection.FindOne(context.TODO(), filter)
79 106 return singleResult
80 107 }
81 108  
82 109 func (m *MgoColl) FindOne(pri interface{}) *mongo.SingleResult {
83 110 //collection.
84   - singleResult := m.mgo.FindOne(context.TODO(), pri)
  111 + singleResult := m.collection.FindOne(context.TODO(), pri)
85 112 return singleResult
86 113 }
87 114  
88 115 //插入单个
89 116 func (m *MgoColl) InsertOne(value interface{}) *mongo.InsertOneResult {
90   - insertResult, err := m.mgo.InsertOne(context.TODO(), value)
  117 + insertResult, err := m.collection.InsertOne(context.TODO(), value)
91 118 if err != nil {
92 119 fmt.Println(err)
93 120 }
... ... @@ -96,8 +123,8 @@ func (m *MgoColl) InsertOne(value interface{}) *mongo.InsertOneResult {
96 123  
97 124 //查询集合里有多少数据
98 125 func (m *MgoColl) CollectionCount() (string, int64) {
99   - size, _ := m.mgo.EstimatedDocumentCount(context.TODO())
100   - return m.mgo.Name(), size
  126 + size, _ := m.collection.EstimatedDocumentCount(context.TODO())
  127 + return m.collection.Name(), size
101 128 }
102 129  
103 130 //按选项查询集合 Skip 跳过 Limit 读取数量 sort 1 ,-1 . 1 为最初时间读取 , -1 为最新时间读取
... ... @@ -108,7 +135,7 @@ func (m *MgoColl) CollectionDocuments(Skip, Limit int64, sort int) *mongo.Cursor
108 135 {}}
109 136 findOptions := options.Find().SetSort(SORT).SetLimit(Limit).SetSkip(Skip)
110 137 //findOptions.SetLimit(i)
111   - temp, _ := m.mgo.Find(context.Background(), filter, findOptions)
  138 + temp, _ := m.collection.Find(context.Background(), filter, findOptions)
112 139 return temp
113 140 }
114 141  
... ... @@ -126,8 +153,8 @@ func (m *MgoColl) ParsingId(result string) (time.Time, uint64) {
126 153 func (m *MgoColl) DeleteAndFind(key string, value interface{}) (int64, *mongo.SingleResult) {
127 154 filter := bson.D{
128 155 {key, value}}
129   - singleResult := m.mgo.FindOne(context.TODO(), filter)
130   - DeleteResult, err := m.mgo.DeleteOne(context.TODO(), filter, nil)
  156 + singleResult := m.collection.FindOne(context.TODO(), filter)
  157 + DeleteResult, err := m.collection.DeleteOne(context.TODO(), filter, nil)
131 158 if err != nil {
132 159 fmt.Println("删除时出现错误,你删不掉的~")
133 160 }
... ... @@ -137,7 +164,7 @@ func (m *MgoColl) DeleteAndFind(key string, value interface{}) (int64, *mongo.Si
137 164 //删除文章
138 165 func (m *MgoColl) Delete(key string, value interface{}) int64 {
139 166 filter := bson.D{ {key, value}}
140   - count, err := m.mgo.DeleteOne(context.TODO(), filter, nil)
  167 + count, err := m.collection.DeleteOne(context.TODO(), filter, nil)
141 168 if err != nil {
142 169 fmt.Println(err)
143 170 }
... ... @@ -149,7 +176,7 @@ func (m *MgoColl) Delete(key string, value interface{}) int64 {
149 176 func (m *MgoColl) DeleteMany(key string, value interface{}) int64 {
150 177 filter := bson.D{ {key, value}}
151 178  
152   - count, err := m.mgo.DeleteMany(context.TODO(), filter)
  179 + count, err := m.collection.DeleteMany(context.TODO(), filter)
153 180 if err != nil {
154 181 fmt.Println(err)
155 182 }
... ... @@ -157,8 +184,8 @@ func (m *MgoColl) DeleteMany(key string, value interface{}) int64 {
157 184 }
158 185  
159 186 //索引
160   -func (m *MgoColl) Index(key string){
161   - m.mgo.Indexes().CreateOne(
  187 +func (m *MgoColl) SetUnique(key string){
  188 + m.collection.Indexes().CreateOne(
162 189 context.Background(),
163 190 mongo.IndexModel{
164 191 Keys : bsonx.Doc{{key, bsonx.Int32(1)}},
... ... @@ -172,7 +199,7 @@ func (m *MgoColl) FindOneAndUpdate(filter interface{}, update interface{})*mongo
172 199 //filter := bson.M{"name": "x", "array.name": "b"}
173 200 //update := bson.M{"array.$[item].detail": "test"}
174 201  
175   - res := m.mgo.FindOneAndUpdate(context.Background(),
  202 + res := m.collection.FindOneAndUpdate(context.Background(),
176 203 filter,
177 204 bson.M{"$set": update})
178 205 if res.Err() != nil {
... ... @@ -182,7 +209,7 @@ func (m *MgoColl) FindOneAndUpdate(filter interface{}, update interface{})*mongo
182 209 }
183 210  
184 211 func (m *MgoColl) UpdateOne(filter interface{}, update interface{})*mongo.UpdateResult {
185   - res, err := m.mgo.UpdateOne(context.TODO(), filter, update)
  212 + res, err := m.collection.UpdateOne(context.TODO(), filter, update)
186 213 if err != nil {
187 214 return nil
188 215 }
... ...
conf/conf.go
... ... @@ -5,7 +5,6 @@ import (
5 5 lumberjack "gopkg.in/natefinch/lumberjack.v2"
6 6 "gopkg.in/yaml.v3"
7 7 "io/ioutil"
8   - "pro2d/components/db"
9 8 "pro2d/utils"
10 9 )
11 10  
... ... @@ -74,9 +73,4 @@ func init() {
74 73 //初始化雪花算法
75 74 SnowFlack = utils.NewSnowflake(GlobalConf.WorkerID, GlobalConf.DatacenterID)
76 75  
77   - //初始化数据库
78   - err = db.Connect(GlobalConf.MongoConf.User, GlobalConf.MongoConf.Password, GlobalConf.MongoConf.Host, GlobalConf.MongoConf.Port, GlobalConf.MongoConf.MaxNum, GlobalConf.MongoConf.TimeOut)
79   - if err != nil {
80   - utils.Sugar.Errorf("mongodb init error: %v", err)
81   - }
82 76 }
83 77 \ No newline at end of file
... ...
... ... @@ -4,9 +4,7 @@ go 1.17
4 4  
5 5 require (
6 6 github.com/dgrijalva/jwt-go v3.2.0+incompatible
7   - github.com/garyburd/redigo v1.6.3
8 7 github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b
9   - github.com/golang/protobuf v1.5.2
10 8 go.mongodb.org/mongo-driver v1.8.3
11 9 go.uber.org/zap v1.17.0
12 10 google.golang.org/grpc v1.38.0
... ... @@ -16,7 +14,10 @@ require (
16 14 )
17 15  
18 16 require (
  17 + github.com/favadi/protoc-go-inject-tag v1.3.0 // indirect
  18 + github.com/garyburd/redigo v1.6.3 // indirect
19 19 github.com/go-stack/stack v1.8.0 // indirect
  20 + github.com/golang/protobuf v1.5.2 // indirect
20 21 github.com/golang/snappy v0.0.1 // indirect
21 22 github.com/klauspost/compress v1.13.6 // indirect
22 23 github.com/pkg/errors v0.9.1 // indirect
... ...
... ... @@ -13,6 +13,8 @@ github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymF
13 13 github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
14 14 github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=
15 15 github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
  16 +github.com/favadi/protoc-go-inject-tag v1.3.0 h1:JPrmsmc/uBShG85uY5xGZIa5WJ0IaNZn6LZhQR9tIQE=
  17 +github.com/favadi/protoc-go-inject-tag v1.3.0/go.mod h1:SSkUBgfqw2IJ2p7NPNKWk0Idwxt/qIt2LQgFPUgRGtc=
16 18 github.com/garyburd/redigo v1.6.3 h1:HCeeRluvAgMusMomi1+6Y5dmFOdYV/JzoRrrbFlkGIc=
17 19 github.com/garyburd/redigo v1.6.3/go.mod h1:rTb6epsqigu3kYKBnaF028A7Tf/Aw5s0cqA47doKKqw=
18 20 github.com/go-stack/stack v1.8.0 h1:5SgMzNM5HxrEjV0ww2lTmX6E2Izsfxas4+YHWRs3Lsk=
... ...
models/account.go
... ... @@ -10,20 +10,20 @@ type AccountModel struct {
10 10 *pb.AccountInfo
11 11 }
12 12  
13   -func AccountExistByPhone(database, phone string) (bool, *AccountModel){
14   - m := NewAccount(database, phone)
  13 +func AccountExistByPhone(phone string) (bool, *AccountModel){
  14 + m := NewAccount(phone)
15 15 if err := m.Load(); err != nil {
16 16 return false, m
17 17 }
18 18 return true, m
19 19 }
20 20  
21   -func NewAccount(database, phone string) *AccountModel {
  21 +func NewAccount(phone string) *AccountModel {
22 22 ac := &pb.AccountInfo{
23 23 Phone: phone,
24 24 }
25 25 account := &AccountModel{
26   - MgoColl: db.NewMongoColl(database, "account", db.GetBsonM("phone", phone), ac),
  26 + MgoColl: db.NewMongoColl( "account", db.GetBsonM("phone", phone), ac),
27 27 AccountInfo: ac,
28 28 }
29 29  
... ...
models/hero.go
... ... @@ -2,7 +2,6 @@ package models
2 2  
3 3 import (
4 4 "pro2d/components/db"
5   - "pro2d/conf"
6 5 "pro2d/protos/pb"
7 6 )
8 7  
... ... @@ -20,11 +19,13 @@ func GetHeros(hm HeroMap) map[string]*pb.Hero {
20 19 return h
21 20 }
22 21  
23   -func NewHero(h *pb.Hero) *HeroModel {
  22 +func NewHero(id int64) *HeroModel {
  23 + h := &pb.Hero{
  24 + Id: id,
  25 + }
24 26 m := &HeroModel{
25   - MgoColl: db.NewMongoColl(conf.GlobalConf.GameConf.DBName, "hero", db.GetBsonM("id", h.Id), h),
  27 + MgoColl: db.NewMongoColl("hero", db.GetBsonM("id", h.Id), h),
26 28 Hero: h,
27 29 }
28   - m.Load()
29 30 return m
30 31 }
... ...
models/init.go 0 → 100644
... ... @@ -0,0 +1,40 @@
  1 +package models
  2 +
  3 +import (
  4 + "pro2d/components/db"
  5 + "pro2d/protos/pb"
  6 + "pro2d/utils"
  7 +)
  8 +
  9 +func InitDoc(schema ...interface{}) {
  10 + for _, s := range schema {
  11 + for coll, key := range utils.FindIndex(s) {
  12 + if err := db.CreateCollection(coll); err != nil {
  13 + utils.Sugar.Errorf("InitDoc err: %v", err)
  14 + continue
  15 + }
  16 +
  17 + res, err := db.SetUnique(coll, key)
  18 + if err != nil {
  19 + utils.Sugar.Errorf("InitDoc unique: %s, err: %v", res, err)
  20 + continue
  21 + }
  22 + }
  23 + }
  24 +}
  25 +
  26 +func InitAccountServerModels() {
  27 + var schema []interface{} = []interface{}{
  28 + pb.AccountInfo{},
  29 + }
  30 + InitDoc(schema...)
  31 +}
  32 +
  33 +func InitGameServerModels() {
  34 + var schema []interface{} = []interface{}{
  35 + pb.Hero{},
  36 + pb.Role{},
  37 + pb.Team{},
  38 + }
  39 + InitDoc(schema...)
  40 +}
0 41 \ No newline at end of file
... ...
models/init_test.go 0 → 100644
... ... @@ -0,0 +1,27 @@
  1 +package models
  2 +
  3 +import (
  4 + "context"
  5 + "pro2d/components/db"
  6 + "pro2d/conf"
  7 + _ "pro2d/conf"
  8 + "pro2d/utils"
  9 + "testing"
  10 +)
  11 +
  12 +
  13 +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 +
  19 + InitAccountServerModels()
  20 + 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 + }
  25 + InitGameServerModels()
  26 + db.MongoClient.Disconnect(context.TODO())
  27 +}
0 28 \ No newline at end of file
... ...
models/role.go
... ... @@ -3,7 +3,6 @@ package models
3 3 import (
4 4 "fmt"
5 5 "pro2d/components/db"
6   - "pro2d/conf"
7 6 "pro2d/protos/pb"
8 7 )
9 8  
... ... @@ -17,20 +16,20 @@ type RoleModel struct {
17 16 }
18 17  
19 18 func RoleExistByUid(uid int64) (bool, *RoleModel){
20   - m := NewRole(&pb.Role{Uid: uid})
  19 + m := NewRole(uid)
21 20 if err := m.Load(); err != nil {
22 21 return false, m
23 22 }
24 23 return true, m
25 24 }
26 25  
27   -func NewRole(r *pb.Role) *RoleModel {
  26 +func NewRole(uid int64) *RoleModel {
  27 + r := &pb.Role{Uid: uid}
28 28 m := &RoleModel{
29   - MgoColl: db.NewMongoColl(conf.GlobalConf.GameConf.DBName, "role", db.GetBsonM("uid", r.Uid), r),
  29 + MgoColl: db.NewMongoColl("role", db.GetBsonM("uid", r.Uid), r),
30 30 Role: r,
31 31 Heros: make(HeroMap),
32 32 }
33   - m.Load()
34 33 return m
35 34 }
36 35  
... ... @@ -41,7 +40,8 @@ func (m *RoleModel) LoadHero() {
41 40 }
42 41  
43 42 func (m *RoleModel) AddHero(hero *pb.Hero) {
44   - h := NewHero(hero)
  43 + h := NewHero(hero.Id)
  44 + h.Hero = hero
45 45 h.Create()
46 46 m.Heros[fmt.Sprintf("%d%d", m.Role.Id, h.Hero.Id)] = h
47 47 }
48 48 \ No newline at end of file
... ...
models/role_test.go
... ... @@ -24,12 +24,12 @@ func TestNewRole(t *testing.T) {
24 24 })
25 25 role.Save()
26 26 }else {
27   - role = NewRole(&pb.Role{Uid: uid})
  27 + role = NewRole(uid)
28 28 role.Role.Id = 1
29 29 role.Role.Device = "222222"
30 30 role.Role.Level = 0
31 31 role.Create()
32   - role.Index("uid")
  32 + role.SetUnique("uid")
33 33 }
34 34 print(role)
35 35 }
36 36 \ No newline at end of file
... ...
models/team.go 0 → 100644
... ... @@ -0,0 +1,23 @@
  1 +package models
  2 +
  3 +import (
  4 + "pro2d/components/db"
  5 + "pro2d/protos/pb"
  6 +)
  7 +
  8 +type TeamModel struct {
  9 + *db.MgoColl
  10 + Team *pb.Team
  11 +}
  12 +
  13 +func NewTeam(id int64) *TeamModel{
  14 + data := &pb.Team{
  15 + Id: id,
  16 + }
  17 + m := &TeamModel{
  18 + MgoColl: db.NewMongoColl( "team", data, data),
  19 + Team: data,
  20 + }
  21 +
  22 + return m
  23 +}
0 24 \ No newline at end of file
... ...
1   -Subproject commit 5e17b3850ca4465a7d824b8a268f38fc7ac3a9ac
  1 +Subproject commit e1f50907a33f6a142cad9db325e80d9027979420
... ...
utils/utils.go
1   -package utils
2 1 \ No newline at end of file
  2 +package utils
  3 +
  4 +import (
  5 + "reflect"
  6 + "strings"
  7 +)
  8 +
  9 +
  10 +func FindIndex(schema interface{}) map[string]string{
  11 + s := reflect.TypeOf(schema)
  12 + tb := make(map[string]string)
  13 + for i := 0; i < s.NumField(); i++ {
  14 + if s.Field(i).Tag.Get("index") != "" {
  15 + js := strings.Split(s.Field(i).Tag.Get("json"), ",")
  16 + if len(js) == 0 {
  17 + continue
  18 + }
  19 + tb[strings.ToLower(s.Name())] = js[0]
  20 + }
  21 + }
  22 + return tb
  23 +}
3 24 \ No newline at end of file
... ...