master
Han Joker 4 months ago
parent f6b87c0f65
commit 210068d4fb

4
.gitignore vendored

@ -39,5 +39,5 @@ bin/
*.swp
# vols
data/
volumns/
/data/
/volumes/

@ -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)
}
}

@ -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
}

@ -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)
}
}

@ -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
}

@ -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
}

@ -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
}

@ -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
}

@ -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)
}

@ -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
}

@ -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
}
Loading…
Cancel
Save