From 210068d4fbe31a1d074f1b6b6c40bc4916f862c4 Mon Sep 17 00:00:00 2001 From: Han Joker <540090808@qq.com> Date: Wed, 6 Mar 2024 16:43:16 +0800 Subject: [PATCH] new init --- .gitignore | 4 +- backend/customer/internal/data/README.md | 1 + backend/customer/internal/data/data.go | 69 ++++++++++ backend/customer/internal/data/greeter.go | 42 ++++++ backend/driver/internal/data/README.md | 1 + backend/driver/internal/data/data.go | 67 ++++++++++ backend/driver/internal/data/driver.go | 132 +++++++++++++++++++ backend/driver/internal/data/greeter.go | 42 ++++++ backend/map/internal/data/README.md | 1 + backend/map/internal/data/data.go | 24 ++++ backend/map/internal/data/greeter.go | 42 ++++++ backend/valuation/internal/data/README.md | 1 + backend/valuation/internal/data/data.go | 86 ++++++++++++ backend/valuation/internal/data/greeter.go | 42 ++++++ backend/valuation/internal/data/valuation.go | 23 ++++ 15 files changed, 575 insertions(+), 2 deletions(-) create mode 100644 backend/customer/internal/data/README.md create mode 100644 backend/customer/internal/data/data.go create mode 100644 backend/customer/internal/data/greeter.go create mode 100644 backend/driver/internal/data/README.md create mode 100644 backend/driver/internal/data/data.go create mode 100644 backend/driver/internal/data/driver.go create mode 100644 backend/driver/internal/data/greeter.go create mode 100644 backend/map/internal/data/README.md create mode 100644 backend/map/internal/data/data.go create mode 100644 backend/map/internal/data/greeter.go create mode 100644 backend/valuation/internal/data/README.md create mode 100644 backend/valuation/internal/data/data.go create mode 100644 backend/valuation/internal/data/greeter.go create mode 100644 backend/valuation/internal/data/valuation.go diff --git a/.gitignore b/.gitignore index 53513d0..80eaf82 100644 --- a/.gitignore +++ b/.gitignore @@ -39,5 +39,5 @@ bin/ *.swp # vols -data/ -volumns/ \ No newline at end of file +/data/ +/volumes/ diff --git a/backend/customer/internal/data/README.md b/backend/customer/internal/data/README.md new file mode 100644 index 0000000..599c41b --- /dev/null +++ b/backend/customer/internal/data/README.md @@ -0,0 +1 @@ +# Data diff --git a/backend/customer/internal/data/data.go b/backend/customer/internal/data/data.go new file mode 100644 index 0000000..ff6fdf1 --- /dev/null +++ b/backend/customer/internal/data/data.go @@ -0,0 +1,69 @@ +package data + +import ( + "customer/internal/biz" + "customer/internal/conf" + "fmt" + "github.com/go-redis/redis/v9" + "gorm.io/driver/mysql" + "gorm.io/gorm" + + "github.com/go-kratos/kratos/v2/log" + "github.com/google/wire" +) + +// ProviderSet is data providers. +// 增加 NewCustomerData 的 provider +var ProviderSet = wire.NewSet(NewData, NewGreeterRepo, NewCustomerData) + +// Data . +type Data struct { + // TODO wrapped database client + + // 操作Redis的客户端 + Rdb *redis.Client + + // 操作MySQL的客户端 + Mdb *gorm.DB +} + +// NewData . +func NewData(c *conf.Data, logger log.Logger) (*Data, func(), error) { + data := &Data{} + + // 一,初始化 Rdb + // 连接redis,使用服务的配置,c就是解析之后的配置信息 + redisURL := fmt.Sprintf("redis://%s/1?dial_timeout=%d", c.Redis.Addr, 1) + options, err := redis.ParseURL(redisURL) + if err != nil { + data.Rdb = nil + log.Fatal(err) + } + // new client 不会立即连接,建立客户端,需要执行命令时才会连接 + data.Rdb = redis.NewClient(options) + + // 二,初始Mdb + // 连接mysql,使用配置 + dsn := c.Database.Source + db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{}) + if err != nil { + data.Mdb = nil + log.Fatal(err) + } + data.Mdb = db + // 三,开发阶段,自动迁移表。发布阶段,表结构稳定,不需要migrate. + migrateTable(db) + + cleanup := func() { + // 清理了 Redis 连接 + _ = data.Rdb.Close() + log.NewHelper(logger).Info("closing the data resources") + } + return data, cleanup, nil +} + +func migrateTable(db *gorm.DB) { + if err := db.AutoMigrate(&biz.Customer{}); err != nil { + log.Info("customer table migrate error, err:", err) + } +} diff --git a/backend/customer/internal/data/greeter.go b/backend/customer/internal/data/greeter.go new file mode 100644 index 0000000..e04cda5 --- /dev/null +++ b/backend/customer/internal/data/greeter.go @@ -0,0 +1,42 @@ +package data + +import ( + "context" + + "customer/internal/biz" + + "github.com/go-kratos/kratos/v2/log" +) + +type greeterRepo struct { + data *Data + log *log.Helper +} + +// NewGreeterRepo . +func NewGreeterRepo(data *Data, logger log.Logger) biz.GreeterRepo { + return &greeterRepo{ + data: data, + log: log.NewHelper(logger), + } +} + +func (r *greeterRepo) Save(ctx context.Context, g *biz.Greeter) (*biz.Greeter, error) { + return g, nil +} + +func (r *greeterRepo) Update(ctx context.Context, g *biz.Greeter) (*biz.Greeter, error) { + return g, nil +} + +func (r *greeterRepo) FindByID(context.Context, int64) (*biz.Greeter, error) { + return nil, nil +} + +func (r *greeterRepo) ListByHello(context.Context, string) ([]*biz.Greeter, error) { + return nil, nil +} + +func (r *greeterRepo) ListAll(context.Context) ([]*biz.Greeter, error) { + return nil, nil +} diff --git a/backend/driver/internal/data/README.md b/backend/driver/internal/data/README.md new file mode 100644 index 0000000..599c41b --- /dev/null +++ b/backend/driver/internal/data/README.md @@ -0,0 +1 @@ +# Data diff --git a/backend/driver/internal/data/data.go b/backend/driver/internal/data/data.go new file mode 100644 index 0000000..2dfb905 --- /dev/null +++ b/backend/driver/internal/data/data.go @@ -0,0 +1,67 @@ +package data + +import ( + "driver/internal/biz" + "driver/internal/conf" + "fmt" + "github.com/go-redis/redis/v9" + "gorm.io/driver/mysql" + "gorm.io/gorm" + + "github.com/go-kratos/kratos/v2/log" + "github.com/google/wire" +) + +// ProviderSet is data providers. +var ProviderSet = wire.NewSet(NewData, NewGreeterRepo, NewDriverInterface) + +// Data . +type Data struct { + // TODO wrapped database client + // 操作MySQL的客户端 + Mdb *gorm.DB + // 操作Redis的客户端 + Rdb *redis.Client + // 中间件服务器配置 + cs *conf.Service +} + +// NewData . +func NewData(c *conf.Data, cs *conf.Service, logger log.Logger) (*Data, func(), error) { + data := &Data{ + cs: cs, + } + // 连接redis,使用服务的配置,c就是解析之后的配置信息 + redisURL := fmt.Sprintf("redis://%s/2?dial_timeout=%d", c.Redis.Addr, 1) + options, err := redis.ParseURL(redisURL) + if err != nil { + data.Rdb = nil + log.Fatal(err) + } + // new client 不会立即连接,建立客户端,需要执行命令时才会连接 + data.Rdb = redis.NewClient(options) + + // 初始Mdb + // 连接mysql,使用配置 + dsn := c.Database.Source + db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{}) + if err != nil { + data.Mdb = nil + log.Fatal(err) + } + data.Mdb = db + // 三,开发阶段,自动迁移表。发布阶段,表结构稳定,不需要migrate. + migrateTable(db) + + cleanup := func() { + log.NewHelper(logger).Info("closing the data resources") + } + return data, cleanup, nil +} + +func migrateTable(db *gorm.DB) { + // 自动迁移相关表 + if err := db.AutoMigrate(&biz.Driver{}); err != nil { + log.Fatal(err) + } +} diff --git a/backend/driver/internal/data/driver.go b/backend/driver/internal/data/driver.go new file mode 100644 index 0000000..1c61bb1 --- /dev/null +++ b/backend/driver/internal/data/driver.go @@ -0,0 +1,132 @@ +package data + +import ( + "context" + "database/sql" + "driver/api/verifyCode" + "driver/internal/biz" + "github.com/go-kratos/kratos/contrib/registry/consul/v2" + "github.com/go-kratos/kratos/v2/transport/grpc" + "github.com/hashicorp/consul/api" + "time" +) + +type DriverData struct { + data *Data +} + +func NewDriverInterface(data *Data) biz.DriverInterface { + return &DriverData{data: data} +} + +// 获取token的实现 +func (dt *DriverData) GetToken(ctx context.Context, tel string) (string, error) { + // 1.数据表查询 + driver := biz.Driver{} + if err := dt.data.Mdb.Where("telephone=?", tel).First(&driver).Error; err != nil { + return "", err + } + + // 2.返回token + return driver.Token.String, nil +} + +// 获取已存储的验证码验证码 +func (dt *DriverData) GetSavedVerifyCode(ctx context.Context, tel string) (string, error) { + return dt.data.Rdb.Get(ctx, "DVC:"+tel).Result() +} + +// 存储token到数据表 +func (dt *DriverData) SaveToken(ctx context.Context, tel, token string) error { + + //先获取司机信息 + driver := biz.Driver{} + if err := dt.data.Mdb.Where("telephone=?", tel).First(&driver).Error; err != nil { + return err + } + + //再更新司机信息 + driver.Token = sql.NullString{ + String: token, + Valid: true, + } + if err := dt.data.Mdb.Save(&driver).Error; err != nil { + return err + } + + return nil +} + +// 初始化司机信息 +func (dt *DriverData) InitDriverInfo(ctx context.Context, tel string) (*biz.Driver, error) { + // 入库,设置状态未stop + driver := biz.Driver{} + driver.Telephone = tel + driver.Status = sql.NullString{ + String: "stop", + Valid: true, + } + if err := dt.data.Mdb.Create(&driver).Error; err != nil { + return nil, err + } + + return &driver, nil +} + +func (dt *DriverData) GetVerifyCode(ctx context.Context, tel string) (string, error) { + // grpc 请求 + consulConfig := api.DefaultConfig() + consulConfig.Address = dt.data.cs.Consul.Address + consulClient, err := api.NewClient(consulConfig) + dis := consul.New(consulClient) + if err != nil { + return "", err + } + endpoint := "discovery:///VerifyCode" + conn, err := grpc.DialInsecure( + ctx, + grpc.WithEndpoint(endpoint), // 目标服务的名字 + grpc.WithDiscovery(dis), // 使用服务发现 + ) + if err != nil { + return "", err + } + //关闭 + defer conn.Close() + + // 2.2,发送获取验证码请求 + client := verifyCode.NewVerifyCodeClient(conn) + reply, err := client.GetVerifyCode(ctx, &verifyCode.GetVerifyCodeRequest{ + Length: 6, + Type: 1, + }) + if err != nil { + return "", err + } + + // 三,redis的临时存储 + // 设置key, customer-verify-code + status := dt.data.Rdb.Set(ctx, "DVC:"+tel, reply.Code, 60*time.Second) + if _, err := status.Result(); err != nil { + return "", err + } + return reply.Code, nil +} + +// 获取号码对应的验证码 +func (dt *DriverData) FetchVerifyCode(ctx context.Context, telephone string) (string, error) { + status := dt.data.Rdb.Get(context.Background(), "DVC:"+telephone) + code, err := status.Result() // status.String() + if err != nil { + return "", err + } + return code, nil +} + +func (dt *DriverData) FetchInfoByTel(ctx context.Context, tel string) (*biz.Driver, error) { + driver := &biz.Driver{} + if err := dt.data.Mdb.Where("telephone=?", tel).First(driver).Error; err != nil { + return nil, err + } + return driver, nil +} diff --git a/backend/driver/internal/data/greeter.go b/backend/driver/internal/data/greeter.go new file mode 100644 index 0000000..0eeba6b --- /dev/null +++ b/backend/driver/internal/data/greeter.go @@ -0,0 +1,42 @@ +package data + +import ( + "context" + + "driver/internal/biz" + + "github.com/go-kratos/kratos/v2/log" +) + +type greeterRepo struct { + data *Data + log *log.Helper +} + +// NewGreeterRepo . +func NewGreeterRepo(data *Data, logger log.Logger) biz.GreeterRepo { + return &greeterRepo{ + data: data, + log: log.NewHelper(logger), + } +} + +func (r *greeterRepo) Save(ctx context.Context, g *biz.Greeter) (*biz.Greeter, error) { + return g, nil +} + +func (r *greeterRepo) Update(ctx context.Context, g *biz.Greeter) (*biz.Greeter, error) { + return g, nil +} + +func (r *greeterRepo) FindByID(context.Context, int64) (*biz.Greeter, error) { + return nil, nil +} + +func (r *greeterRepo) ListByHello(context.Context, string) ([]*biz.Greeter, error) { + return nil, nil +} + +func (r *greeterRepo) ListAll(context.Context) ([]*biz.Greeter, error) { + return nil, nil +} diff --git a/backend/map/internal/data/README.md b/backend/map/internal/data/README.md new file mode 100644 index 0000000..599c41b --- /dev/null +++ b/backend/map/internal/data/README.md @@ -0,0 +1 @@ +# Data diff --git a/backend/map/internal/data/data.go b/backend/map/internal/data/data.go new file mode 100644 index 0000000..0bf0eb2 --- /dev/null +++ b/backend/map/internal/data/data.go @@ -0,0 +1,24 @@ +package data + +import ( + "map/internal/conf" + + "github.com/go-kratos/kratos/v2/log" + "github.com/google/wire" +) + +// ProviderSet is data providers. +var ProviderSet = wire.NewSet(NewData, NewGreeterRepo) + +// Data . +type Data struct { + // TODO wrapped database client +} + +// NewData . +func NewData(c *conf.Data, logger log.Logger) (*Data, func(), error) { + cleanup := func() { + log.NewHelper(logger).Info("closing the data resources") + } + return &Data{}, cleanup, nil +} diff --git a/backend/map/internal/data/greeter.go b/backend/map/internal/data/greeter.go new file mode 100644 index 0000000..b58b489 --- /dev/null +++ b/backend/map/internal/data/greeter.go @@ -0,0 +1,42 @@ +package data + +import ( + "context" + + "map/internal/biz" + + "github.com/go-kratos/kratos/v2/log" +) + +type greeterRepo struct { + data *Data + log *log.Helper +} + +// NewGreeterRepo . +func NewGreeterRepo(data *Data, logger log.Logger) biz.GreeterRepo { + return &greeterRepo{ + data: data, + log: log.NewHelper(logger), + } +} + +func (r *greeterRepo) Save(ctx context.Context, g *biz.Greeter) (*biz.Greeter, error) { + return g, nil +} + +func (r *greeterRepo) Update(ctx context.Context, g *biz.Greeter) (*biz.Greeter, error) { + return g, nil +} + +func (r *greeterRepo) FindByID(context.Context, int64) (*biz.Greeter, error) { + return nil, nil +} + +func (r *greeterRepo) ListByHello(context.Context, string) ([]*biz.Greeter, error) { + return nil, nil +} + +func (r *greeterRepo) ListAll(context.Context) ([]*biz.Greeter, error) { + return nil, nil +} diff --git a/backend/valuation/internal/data/README.md b/backend/valuation/internal/data/README.md new file mode 100644 index 0000000..599c41b --- /dev/null +++ b/backend/valuation/internal/data/README.md @@ -0,0 +1 @@ +# Data diff --git a/backend/valuation/internal/data/data.go b/backend/valuation/internal/data/data.go new file mode 100644 index 0000000..1ef3953 --- /dev/null +++ b/backend/valuation/internal/data/data.go @@ -0,0 +1,86 @@ +package data + +import ( + "gorm.io/driver/mysql" + "gorm.io/gorm" + "gorm.io/gorm/clause" + "valuation/internal/biz" + "valuation/internal/conf" + + "github.com/go-kratos/kratos/v2/log" + "github.com/google/wire" +) + +// ProviderSet is data providers. +var ProviderSet = wire.NewSet(NewData, NewGreeterRepo, NewPriceRuleInterface) + +// Data . +type Data struct { + // TODO wrapped database client + // 操作MySQL的客户端 + Mdb *gorm.DB +} + +// NewData . +func NewData(c *conf.Data, logger log.Logger) (*Data, func(), error) { + data := &Data{} + // 初始Mdb + // 连接mysql,使用配置 + dsn := c.Database.Source + db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{}) + if err != nil { + data.Mdb = nil + log.Fatal(err) + } + data.Mdb = db + // 三,开发阶段,自动迁移表。发布阶段,表结构稳定,不需要migrate. + migrateTable(db) + + cleanup := func() { + log.NewHelper(logger).Info("closing the data resources") + } + return data, cleanup, nil +} + +func migrateTable(db *gorm.DB) { + if err := db.AutoMigrate(&biz.PriceRule{}); err != nil { + log.Info("price_rule table migrate error, err:", err) + } + // 插入一些riceRule的测试数据 + rules := []biz.PriceRule{ + { + Model: gorm.Model{ID: 1}, + PriceRuleWork: biz.PriceRuleWork{ + CityID: 1, + StartFee: 300, + DistanceFee: 35, + DurationFee: 10, // 5m + StartAt: 7, + EndAt: 23, + }, + }, + { + Model: gorm.Model{ID: 2}, + PriceRuleWork: biz.PriceRuleWork{ + CityID: 1, + StartFee: 350, + DistanceFee: 35, + DurationFee: 10, // 5m + StartAt: 23, + EndAt: 24, + }, + }, + { + Model: gorm.Model{ID: 3}, + PriceRuleWork: biz.PriceRuleWork{ + CityID: 1, + StartFee: 400, + DistanceFee: 35, + DurationFee: 10, // 5m + StartAt: 0, + EndAt: 7, + }, + }, + } + db.Clauses(clause.OnConflict{UpdateAll: true}).Create(rules) +} diff --git a/backend/valuation/internal/data/greeter.go b/backend/valuation/internal/data/greeter.go new file mode 100644 index 0000000..7863d58 --- /dev/null +++ b/backend/valuation/internal/data/greeter.go @@ -0,0 +1,42 @@ +package data + +import ( + "context" + + "valuation/internal/biz" + + "github.com/go-kratos/kratos/v2/log" +) + +type greeterRepo struct { + data *Data + log *log.Helper +} + +// NewGreeterRepo . +func NewGreeterRepo(data *Data, logger log.Logger) biz.GreeterRepo { + return &greeterRepo{ + data: data, + log: log.NewHelper(logger), + } +} + +func (r *greeterRepo) Save(ctx context.Context, g *biz.Greeter) (*biz.Greeter, error) { + return g, nil +} + +func (r *greeterRepo) Update(ctx context.Context, g *biz.Greeter) (*biz.Greeter, error) { + return g, nil +} + +func (r *greeterRepo) FindByID(context.Context, int64) (*biz.Greeter, error) { + return nil, nil +} + +func (r *greeterRepo) ListByHello(context.Context, string) ([]*biz.Greeter, error) { + return nil, nil +} + +func (r *greeterRepo) ListAll(context.Context) ([]*biz.Greeter, error) { + return nil, nil +} diff --git a/backend/valuation/internal/data/valuation.go b/backend/valuation/internal/data/valuation.go new file mode 100644 index 0000000..1eb8762 --- /dev/null +++ b/backend/valuation/internal/data/valuation.go @@ -0,0 +1,23 @@ +package data + +import ( + "valuation/internal/biz" +) + +type PriceRuleData struct { + data *Data +} + +func NewPriceRuleInterface(data *Data) biz.PriceRuleInterface { + return &PriceRuleData{data: data} +} + +// PriceRuleData 实现 PriceRuleInterface +func (prd *PriceRuleData) GetRule(cityid uint, curr int) (*biz.PriceRule, error) { + pr := &biz.PriceRule{} + result := prd.data.Mdb.Where("city_id=? AND start_at <= ? AND end_at > ?", cityid, curr, curr).First(pr) + if result.Error != nil { + return nil, result.Error + } + return pr, nil +}