commit
3ffb329a1a
@ -0,0 +1,15 @@
|
|||||||
|
{
|
||||||
|
"version": "0.2.0",
|
||||||
|
"configurations": [
|
||||||
|
{
|
||||||
|
"name": "golang",
|
||||||
|
"type": "go",
|
||||||
|
"request": "launch",
|
||||||
|
"mode": "auto",
|
||||||
|
//当运行单个文件时{workspaceFolder}可改为{file}
|
||||||
|
"program": "${workspaceFolder}",
|
||||||
|
"env": {},
|
||||||
|
"args": []
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
@ -0,0 +1,69 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"goproduct/common"
|
||||||
|
"goproduct/proto"
|
||||||
|
"log"
|
||||||
|
"strconv"
|
||||||
|
|
||||||
|
consul "github.com/asim/go-micro/plugins/registry/consul/v4"
|
||||||
|
"go-micro.dev/v4/web"
|
||||||
|
|
||||||
|
"github.com/gin-gonic/gin"
|
||||||
|
"go-micro.dev/v4"
|
||||||
|
"go-micro.dev/v4/registry"
|
||||||
|
)
|
||||||
|
|
||||||
|
//获取远程服务的客户端
|
||||||
|
func getClient() proto.LoginService {
|
||||||
|
//注册到consul
|
||||||
|
consulReg := consul.NewRegistry(func(options *registry.Options) {
|
||||||
|
options.Addrs = []string{"192.168.137.131:8500"}
|
||||||
|
})
|
||||||
|
rpcServer := micro.NewService(
|
||||||
|
micro.Registry(consulReg),
|
||||||
|
)
|
||||||
|
return proto.NewLoginService("shop-user", rpcServer.Client())
|
||||||
|
}
|
||||||
|
func main() {
|
||||||
|
router := gin.Default()
|
||||||
|
|
||||||
|
router.Handle("GET", "toLogin", func(context *gin.Context) {
|
||||||
|
context.String(200, "to Loging ....")
|
||||||
|
})
|
||||||
|
|
||||||
|
router.GET("/login", func(c *gin.Context) {
|
||||||
|
//获取远程服务的客户端
|
||||||
|
client := getClient()
|
||||||
|
//获取页面参数
|
||||||
|
clientId, _ := strconv.Atoi(c.Request.FormValue("clientId"))
|
||||||
|
phone := c.Request.FormValue("phone")
|
||||||
|
systemId, _ := strconv.Atoi(c.Request.FormValue("systemId"))
|
||||||
|
verificationCode := c.Request.FormValue("verificationCode")
|
||||||
|
//拼接请求信息
|
||||||
|
req := &proto.LoginRequest{
|
||||||
|
ClientId: int32(clientId),
|
||||||
|
Phone: phone,
|
||||||
|
SystemId: int32(systemId),
|
||||||
|
VerificationCode: verificationCode,
|
||||||
|
}
|
||||||
|
//远程调用服务
|
||||||
|
resp, err := client.Login(context.TODO(), req)
|
||||||
|
//根据响应做输出
|
||||||
|
if err != nil {
|
||||||
|
log.Println(err.Error())
|
||||||
|
//c.String(http.StatusBadRequest, "search failed !")
|
||||||
|
common.RespFail(c.Writer, resp, "登录失败")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
common.RespOK(c.Writer, resp, "登录成功")
|
||||||
|
})
|
||||||
|
|
||||||
|
service := web.NewService(
|
||||||
|
web.Address(":8081"),
|
||||||
|
web.Handler(router),
|
||||||
|
)
|
||||||
|
service.Run()
|
||||||
|
//router.Run(":6666")
|
||||||
|
}
|
@ -0,0 +1,60 @@
|
|||||||
|
package common
|
||||||
|
|
||||||
|
import (
|
||||||
|
"log"
|
||||||
|
"os"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"github.com/spf13/viper"
|
||||||
|
_ "github.com/spf13/viper/remote"
|
||||||
|
"gorm.io/driver/mysql"
|
||||||
|
"gorm.io/gorm"
|
||||||
|
"gorm.io/gorm/logger"
|
||||||
|
)
|
||||||
|
|
||||||
|
func GetConsulConfig(url string, fileKey string) (*viper.Viper, error) {
|
||||||
|
conf := viper.New()
|
||||||
|
conf.AddRemoteProvider("consul", url, fileKey)
|
||||||
|
conf.SetConfigType("json")
|
||||||
|
err := conf.ReadRemoteConfig()
|
||||||
|
if err != nil {
|
||||||
|
log.Println("viper conf err :", err)
|
||||||
|
}
|
||||||
|
return conf, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
{
|
||||||
|
"host": "192.168.137.131",
|
||||||
|
"port": "3306",
|
||||||
|
"user": "root",
|
||||||
|
"pwd": "mashibing123",
|
||||||
|
"database": "user_center"
|
||||||
|
}
|
||||||
|
**/
|
||||||
|
|
||||||
|
// type MySQLConfig struct {
|
||||||
|
// Host string `json:"host"`
|
||||||
|
// Post string `json:"port"`
|
||||||
|
// User string `json:"user"`
|
||||||
|
// Pwd string `json:"pwd"`
|
||||||
|
// Database string `json:"database"`
|
||||||
|
// }
|
||||||
|
|
||||||
|
func GetMysqlFromConsul(vip *viper.Viper) (db *gorm.DB, err error) {
|
||||||
|
newLogger := logger.New(
|
||||||
|
log.New(os.Stdout, "\r\n", log.LstdFlags),
|
||||||
|
logger.Config{
|
||||||
|
SlowThreshold: time.Second,
|
||||||
|
LogLevel: logger.Info,
|
||||||
|
Colorful: true,
|
||||||
|
},
|
||||||
|
)
|
||||||
|
str := vip.GetString("user") + ":" + vip.GetString("pwd") + "@tcp(" + vip.GetString("host") + ":" + vip.GetString("port") + ")/" + vip.GetString("database") + "?charset=utf8mb4&parseTime=True&loc=Local"
|
||||||
|
db, errr := gorm.Open(mysql.Open(str), &gorm.Config{Logger: newLogger}) //"root:mashibing123@tcp(8.142.25.43:3306)/user_center?charset=utf8mb4&parseTime=True&loc=Local"), &gorm.Config{Logger: newLogger})
|
||||||
|
if errr != nil {
|
||||||
|
log.Println("db err :", errr)
|
||||||
|
}
|
||||||
|
|
||||||
|
return db, nil
|
||||||
|
}
|
@ -0,0 +1,33 @@
|
|||||||
|
package common
|
||||||
|
|
||||||
|
import (
|
||||||
|
"crypto/md5"
|
||||||
|
"encoding/hex"
|
||||||
|
"fmt"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
//小写
|
||||||
|
func Md5Encode(data string) string {
|
||||||
|
h := md5.New()
|
||||||
|
h.Write([]byte(data))
|
||||||
|
tempStr := h.Sum(nil)
|
||||||
|
return hex.EncodeToString(tempStr)
|
||||||
|
}
|
||||||
|
|
||||||
|
//大写
|
||||||
|
func MD5Encode(data string) string {
|
||||||
|
return strings.ToUpper(Md5Encode(data))
|
||||||
|
}
|
||||||
|
|
||||||
|
//加密
|
||||||
|
func MakePassword(plainpwd, salt string) string {
|
||||||
|
return Md5Encode(plainpwd + salt)
|
||||||
|
}
|
||||||
|
|
||||||
|
//解密
|
||||||
|
func ValidPassword(plainpwd, salt string, password string) bool {
|
||||||
|
md := Md5Encode(plainpwd + salt)
|
||||||
|
fmt.Println(md + " " + password)
|
||||||
|
return md == password
|
||||||
|
}
|
@ -0,0 +1,70 @@
|
|||||||
|
package common
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
"fmt"
|
||||||
|
"net/http"
|
||||||
|
)
|
||||||
|
|
||||||
|
type H struct {
|
||||||
|
Code string
|
||||||
|
Message string
|
||||||
|
TraceId string
|
||||||
|
Data interface{}
|
||||||
|
Rows interface{}
|
||||||
|
Total interface{}
|
||||||
|
SkyWalkingDynamicField string
|
||||||
|
}
|
||||||
|
|
||||||
|
func Resp(w http.ResponseWriter, code string, data interface{}, message string) {
|
||||||
|
w.Header().Set("Content-Type", "application/json")
|
||||||
|
w.WriteHeader(http.StatusOK)
|
||||||
|
h := H{
|
||||||
|
Code: code,
|
||||||
|
Data: data,
|
||||||
|
Message: message,
|
||||||
|
}
|
||||||
|
ret, err := json.Marshal(h)
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println(err)
|
||||||
|
}
|
||||||
|
w.Write(ret)
|
||||||
|
}
|
||||||
|
|
||||||
|
func RespList(w http.ResponseWriter, code string, data interface{}, message string, rows interface{}, total interface{}, skyWalkingDynamicField string) {
|
||||||
|
w.Header().Set("Content-Type", "application/json")
|
||||||
|
w.WriteHeader(http.StatusOK)
|
||||||
|
h := H{
|
||||||
|
Code: code,
|
||||||
|
Data: data,
|
||||||
|
Message: message,
|
||||||
|
Rows: rows,
|
||||||
|
Total: total,
|
||||||
|
SkyWalkingDynamicField: skyWalkingDynamicField,
|
||||||
|
}
|
||||||
|
ret, err := json.Marshal(h)
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println(err)
|
||||||
|
}
|
||||||
|
w.Write(ret)
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
200 OKLoginSuccessVO
|
||||||
|
201 Created
|
||||||
|
401 Unauthorized
|
||||||
|
403 Forbidden
|
||||||
|
404 Not Found
|
||||||
|
**/
|
||||||
|
func RespOK(w http.ResponseWriter, data interface{}, message string) {
|
||||||
|
Resp(w, "SUCCESS", data, message)
|
||||||
|
}
|
||||||
|
func RespFail(w http.ResponseWriter, data interface{}, message string) {
|
||||||
|
Resp(w, "TOKEN_FAIL", data, message)
|
||||||
|
}
|
||||||
|
func RespListOK(w http.ResponseWriter, data interface{}, message string, rows interface{}, total interface{}, skyWalkingDynamicField string) {
|
||||||
|
RespList(w, "SUCCESS", data, message, rows, total, skyWalkingDynamicField)
|
||||||
|
}
|
||||||
|
func RespListFail(w http.ResponseWriter, data interface{}, message string, rows interface{}, total interface{}, skyWalkingDynamicField string) {
|
||||||
|
RespList(w, "TOKEN_FAIL", data, message, rows, total, skyWalkingDynamicField)
|
||||||
|
}
|
@ -0,0 +1,27 @@
|
|||||||
|
package model
|
||||||
|
|
||||||
|
import "time"
|
||||||
|
|
||||||
|
type Product struct {
|
||||||
|
//gorm.Model
|
||||||
|
ID int32
|
||||||
|
Name string
|
||||||
|
ProductType int32 `gorm:"default:1"`
|
||||||
|
CategoryId int32
|
||||||
|
StartingPrice float32
|
||||||
|
TotalStock int32 `gorm:"default:'1234'"`
|
||||||
|
MainPicture string `gorm:"default:1"`
|
||||||
|
RemoteAreaPostage float32
|
||||||
|
SingleBuyLimit int32
|
||||||
|
IsEnable int32 `gorm:"default:0"`
|
||||||
|
Remark string `gorm:"default:'1'"`
|
||||||
|
CreateUser int32 `gorm:"default:'1'"`
|
||||||
|
CreateTime time.Time
|
||||||
|
UpdateUser int32
|
||||||
|
UpdateTime time.Time
|
||||||
|
IsDeleted bool
|
||||||
|
}
|
||||||
|
|
||||||
|
func (table *Product) TableName() string {
|
||||||
|
return "product"
|
||||||
|
}
|
@ -0,0 +1,23 @@
|
|||||||
|
package model
|
||||||
|
|
||||||
|
/**
|
||||||
|
"attributeSymbolList": "",
|
||||||
|
"name": "",
|
||||||
|
"sellPrice": 0,
|
||||||
|
"skuId": 0,
|
||||||
|
"stock": 0
|
||||||
|
}
|
||||||
|
**/
|
||||||
|
type ProductSku struct {
|
||||||
|
//gorm.Model
|
||||||
|
SkuId int32 `gorm:"column:id"`
|
||||||
|
Name string
|
||||||
|
ProductId int32 `gorm:"default:1"`
|
||||||
|
AttributeSymbolList string
|
||||||
|
SellPrice float32
|
||||||
|
Stock int32 `gorm:"default:1"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func (table *ProductSku) TableName() string {
|
||||||
|
return "product_sku"
|
||||||
|
}
|
@ -0,0 +1,22 @@
|
|||||||
|
package model
|
||||||
|
|
||||||
|
import "time"
|
||||||
|
|
||||||
|
type User struct {
|
||||||
|
//gorm.Model
|
||||||
|
ID int32
|
||||||
|
Avatar string `gorm:"default:'https://msb-edu-dev.oss-cn-beijing.aliyuncs.com/default-headimg.png'"`
|
||||||
|
ClientId int32 `gorm:"default:1"`
|
||||||
|
Nickname string `gorm:"default:'随机名称'"`
|
||||||
|
Phone string
|
||||||
|
Password string `gorm:"default:'1234'"`
|
||||||
|
SystemId string `gorm:"default:1"`
|
||||||
|
LastLoginTime time.Time
|
||||||
|
CreateTime time.Time
|
||||||
|
IsDeleted int32 `gorm:"default:0"`
|
||||||
|
UnionId string `gorm:"default:'1'"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func (table *User) TableName() string {
|
||||||
|
return "user"
|
||||||
|
}
|
@ -0,0 +1,47 @@
|
|||||||
|
package repository
|
||||||
|
|
||||||
|
import (
|
||||||
|
"errors"
|
||||||
|
"goproduct/domain/model"
|
||||||
|
|
||||||
|
"gorm.io/gorm"
|
||||||
|
)
|
||||||
|
|
||||||
|
/**
|
||||||
|
int32 clientId = 1;
|
||||||
|
string phone = 2;
|
||||||
|
int32 systemId = 3;
|
||||||
|
string verificationCode = 4;
|
||||||
|
**/
|
||||||
|
//接口
|
||||||
|
type IUserRepository interface {
|
||||||
|
Login(int32, string, int32, string) (*model.User, error)
|
||||||
|
}
|
||||||
|
|
||||||
|
//创建实例
|
||||||
|
func NewUserRepository(db *gorm.DB) IUserRepository {
|
||||||
|
return &UserRepository{mysqlDB: db}
|
||||||
|
}
|
||||||
|
|
||||||
|
//数据DB
|
||||||
|
type UserRepository struct {
|
||||||
|
mysqlDB *gorm.DB
|
||||||
|
}
|
||||||
|
|
||||||
|
//重写接口方法
|
||||||
|
func (u *UserRepository) Login(clientId int32, phone string, systemId int32, verificationCode string) (user *model.User, err error) {
|
||||||
|
user = &model.User{}
|
||||||
|
if clientId == 0 && systemId == 0 && verificationCode == "6666" {
|
||||||
|
u.mysqlDB.Where("phone = ? ", phone).Find(user)
|
||||||
|
//未找到就注册一个
|
||||||
|
if user.ID == 0 {
|
||||||
|
user.Phone = phone
|
||||||
|
u.mysqlDB.Create(&user)
|
||||||
|
//u.mysqlDB.Select("Nickname", "Avatar", "Phone", "ClientId").Create(&user)
|
||||||
|
}
|
||||||
|
return user, nil
|
||||||
|
//return user, u.mysqlDB.Where("phone = ? ", phone).Find(user).Error
|
||||||
|
} else {
|
||||||
|
return user, errors.New("参数不匹配")
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,29 @@
|
|||||||
|
package service
|
||||||
|
|
||||||
|
import (
|
||||||
|
"goproduct/domain/model"
|
||||||
|
"goproduct/domain/repository"
|
||||||
|
)
|
||||||
|
|
||||||
|
type IUserDataService interface {
|
||||||
|
Login(int32, string, int32, string) (*model.User, error)
|
||||||
|
}
|
||||||
|
type UserDataService struct {
|
||||||
|
userRepository repository.IUserRepository
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewUserDataService(userRepository repository.IUserRepository) IUserDataService {
|
||||||
|
return &UserDataService{userRepository: userRepository}
|
||||||
|
}
|
||||||
|
|
||||||
|
//重写接口方法
|
||||||
|
func (u *UserDataService) Login(clientId int32, phone string, systemId int32, verificationCode string) (user *model.User, err error) {
|
||||||
|
|
||||||
|
return u.userRepository.Login(clientId, phone, systemId, verificationCode)
|
||||||
|
}
|
||||||
|
|
||||||
|
/* clientId, _ := strconv.Atoi(c.Request.FormValue("clientId"))
|
||||||
|
phone := c.Request.FormValue("phone")
|
||||||
|
systemId, _ := strconv.Atoi(c.Request.FormValue("systemId"))
|
||||||
|
verificationCode := c.Request.FormValue("verificationCode")
|
||||||
|
*/
|
@ -0,0 +1,119 @@
|
|||||||
|
module goproduct
|
||||||
|
|
||||||
|
go 1.17
|
||||||
|
|
||||||
|
require (
|
||||||
|
github.com/jinzhu/inflection v1.0.0 // indirect
|
||||||
|
github.com/jinzhu/now v1.1.5 // indirect
|
||||||
|
go-micro.dev/v4 v4.7.0
|
||||||
|
google.golang.org/protobuf v1.28.0
|
||||||
|
gorm.io/gorm v1.23.8
|
||||||
|
)
|
||||||
|
|
||||||
|
require (
|
||||||
|
github.com/google/uuid v1.3.0 // indirect
|
||||||
|
github.com/miekg/dns v1.1.50 // indirect
|
||||||
|
golang.org/x/net v0.0.0-20220708220712-1185a9018129 // indirect
|
||||||
|
golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f // indirect
|
||||||
|
golang.org/x/sys v0.0.0-20220712014510-0a85c31ab51e // indirect
|
||||||
|
golang.org/x/tools v0.1.11 // indirect
|
||||||
|
gopkg.in/yaml.v3 v3.0.1 // indirect
|
||||||
|
)
|
||||||
|
|
||||||
|
require (
|
||||||
|
github.com/asim/go-micro/plugins/registry/consul/v4 v4.7.0
|
||||||
|
github.com/gin-gonic/gin v1.8.1
|
||||||
|
github.com/spf13/viper v1.12.0
|
||||||
|
gorm.io/driver/mysql v1.3.5
|
||||||
|
)
|
||||||
|
|
||||||
|
require (
|
||||||
|
cloud.google.com/go v0.100.2 // indirect
|
||||||
|
cloud.google.com/go/compute v1.6.1 // indirect
|
||||||
|
cloud.google.com/go/firestore v1.6.1 // indirect
|
||||||
|
github.com/Microsoft/go-winio v0.5.0 // indirect
|
||||||
|
github.com/ProtonMail/go-crypto v0.0.0-20210428141323-04723f9f07d7 // indirect
|
||||||
|
github.com/acomagu/bufpipe v1.0.3 // indirect
|
||||||
|
github.com/armon/go-metrics v0.3.10 // indirect
|
||||||
|
github.com/bitly/go-simplejson v0.5.0 // indirect
|
||||||
|
github.com/coreos/go-semver v0.3.0 // indirect
|
||||||
|
github.com/coreos/go-systemd/v22 v22.3.2 // indirect
|
||||||
|
github.com/cpuguy83/go-md2man/v2 v2.0.0 // indirect
|
||||||
|
github.com/emirpasic/gods v1.12.0 // indirect
|
||||||
|
github.com/fatih/color v1.13.0 // indirect
|
||||||
|
github.com/fsnotify/fsnotify v1.5.4 // indirect
|
||||||
|
github.com/gin-contrib/sse v0.1.0 // indirect
|
||||||
|
github.com/go-git/gcfg v1.5.0 // indirect
|
||||||
|
github.com/go-git/go-billy/v5 v5.3.1 // indirect
|
||||||
|
github.com/go-git/go-git/v5 v5.4.2 // indirect
|
||||||
|
github.com/go-playground/locales v0.14.0 // indirect
|
||||||
|
github.com/go-playground/universal-translator v0.18.0 // indirect
|
||||||
|
github.com/go-playground/validator/v10 v10.10.0 // indirect
|
||||||
|
github.com/go-sql-driver/mysql v1.6.0 // indirect
|
||||||
|
github.com/goccy/go-json v0.9.7 // indirect
|
||||||
|
github.com/gogo/protobuf v1.3.2 // indirect
|
||||||
|
github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect
|
||||||
|
github.com/golang/protobuf v1.5.2 // indirect
|
||||||
|
github.com/google/go-cmp v0.5.8 // indirect
|
||||||
|
github.com/googleapis/gax-go/v2 v2.4.0 // indirect
|
||||||
|
github.com/hashicorp/consul/api v1.12.0 // indirect
|
||||||
|
github.com/hashicorp/go-cleanhttp v0.5.2 // indirect
|
||||||
|
github.com/hashicorp/go-hclog v1.2.0 // indirect
|
||||||
|
github.com/hashicorp/go-immutable-radix v1.3.1 // indirect
|
||||||
|
github.com/hashicorp/go-rootcerts v1.0.2 // indirect
|
||||||
|
github.com/hashicorp/golang-lru v0.5.4 // indirect
|
||||||
|
github.com/hashicorp/hcl v1.0.0 // indirect
|
||||||
|
github.com/hashicorp/serf v0.9.7 // indirect
|
||||||
|
github.com/imdario/mergo v0.3.12 // indirect
|
||||||
|
github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 // indirect
|
||||||
|
github.com/json-iterator/go v1.1.12 // indirect
|
||||||
|
github.com/kevinburke/ssh_config v0.0.0-20201106050909-4977a11b4351 // indirect
|
||||||
|
github.com/leodido/go-urn v1.2.1 // indirect
|
||||||
|
github.com/magiconair/properties v1.8.6 // indirect
|
||||||
|
github.com/mattn/go-colorable v0.1.12 // indirect
|
||||||
|
github.com/mattn/go-isatty v0.0.14 // indirect
|
||||||
|
github.com/mitchellh/go-homedir v1.1.0 // indirect
|
||||||
|
github.com/mitchellh/hashstructure v1.1.0 // indirect
|
||||||
|
github.com/mitchellh/mapstructure v1.5.0 // indirect
|
||||||
|
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
|
||||||
|
github.com/modern-go/reflect2 v1.0.2 // indirect
|
||||||
|
github.com/nxadm/tail v1.4.8 // indirect
|
||||||
|
github.com/oxtoacart/bpool v0.0.0-20190530202638-03653db5a59c // indirect
|
||||||
|
github.com/patrickmn/go-cache v2.1.0+incompatible // indirect
|
||||||
|
github.com/pelletier/go-toml v1.9.5 // indirect
|
||||||
|
github.com/pelletier/go-toml/v2 v2.0.1 // indirect
|
||||||
|
github.com/pkg/errors v0.9.1 // indirect
|
||||||
|
github.com/russross/blackfriday/v2 v2.0.1 // indirect
|
||||||
|
github.com/sagikazarmark/crypt v0.6.0 // indirect
|
||||||
|
github.com/sergi/go-diff v1.1.0 // indirect
|
||||||
|
github.com/shurcooL/sanitized_anchor_name v1.0.0 // indirect
|
||||||
|
github.com/spf13/afero v1.8.2 // indirect
|
||||||
|
github.com/spf13/cast v1.5.0 // indirect
|
||||||
|
github.com/spf13/jwalterweatherman v1.1.0 // indirect
|
||||||
|
github.com/spf13/pflag v1.0.5 // indirect
|
||||||
|
github.com/subosito/gotenv v1.3.0 // indirect
|
||||||
|
github.com/ugorji/go/codec v1.2.7 // indirect
|
||||||
|
github.com/urfave/cli/v2 v2.3.0 // indirect
|
||||||
|
github.com/xanzy/ssh-agent v0.3.0 // indirect
|
||||||
|
go.etcd.io/etcd/api/v3 v3.5.4 // indirect
|
||||||
|
go.etcd.io/etcd/client/pkg/v3 v3.5.4 // indirect
|
||||||
|
go.etcd.io/etcd/client/v2 v2.305.4 // indirect
|
||||||
|
go.etcd.io/etcd/client/v3 v3.5.4 // indirect
|
||||||
|
go.opencensus.io v0.23.0 // indirect
|
||||||
|
go.uber.org/atomic v1.7.0 // indirect
|
||||||
|
go.uber.org/multierr v1.6.0 // indirect
|
||||||
|
go.uber.org/zap v1.17.0 // indirect
|
||||||
|
golang.org/x/crypto v0.0.0-20220411220226-7b82a4e95df4 // indirect
|
||||||
|
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4 // indirect
|
||||||
|
golang.org/x/oauth2 v0.0.0-20220411215720-9780585627b5 // indirect
|
||||||
|
golang.org/x/text v0.3.7 // indirect
|
||||||
|
golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df // indirect
|
||||||
|
google.golang.org/api v0.81.0 // indirect
|
||||||
|
google.golang.org/appengine v1.6.7 // indirect
|
||||||
|
google.golang.org/genproto v0.0.0-20220519153652-3a47de7e79bd // indirect
|
||||||
|
google.golang.org/grpc v1.46.2 // indirect
|
||||||
|
gopkg.in/ini.v1 v1.66.4 // indirect
|
||||||
|
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 // indirect
|
||||||
|
gopkg.in/warnings.v0 v0.1.2 // indirect
|
||||||
|
gopkg.in/yaml.v2 v2.4.0 // indirect
|
||||||
|
)
|
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,48 @@
|
|||||||
|
package handler
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"fmt"
|
||||||
|
"goproduct/common"
|
||||||
|
"goproduct/domain/model"
|
||||||
|
"goproduct/domain/service"
|
||||||
|
"goproduct/proto"
|
||||||
|
"log"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
type User struct {
|
||||||
|
UserDataService service.IUserDataService
|
||||||
|
}
|
||||||
|
|
||||||
|
// 登录 (clientId int32, phone string, systemId int32, verifi
|
||||||
|
func (u *User) Login(ctx context.Context, loginRequest *proto.LoginRequest, loginResp *proto.LoginResp) error {
|
||||||
|
userInfo, err := u.UserDataService.Login(loginRequest.ClientId, loginRequest.GetPhone(), loginRequest.SystemId, loginRequest.VerificationCode)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
fmt.Println(">>>>>>>>>>>>> login success :", userInfo)
|
||||||
|
UserForResp(userInfo, loginResp)
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func UserForResp(userModel *model.User, resp *proto.LoginResp) *proto.LoginResp {
|
||||||
|
timeStr := fmt.Sprintf("%d", time.Now().Unix())
|
||||||
|
resp.Token = common.Md5Encode(timeStr) //"123456"
|
||||||
|
resp.User = &proto.User{}
|
||||||
|
log.Println(userModel)
|
||||||
|
resp.User.Id = userModel.ID
|
||||||
|
resp.User.Avatar = userModel.Avatar
|
||||||
|
resp.User.ClientId = userModel.ClientId
|
||||||
|
resp.User.EmployeeId = 1 //userModel.EmployeeId
|
||||||
|
resp.User.Nickname = userModel.Nickname
|
||||||
|
resp.User.SessionId = resp.Token
|
||||||
|
resp.User.Phone = userModel.Phone
|
||||||
|
//token 过期时间
|
||||||
|
tp, _ := time.ParseDuration("1h")
|
||||||
|
tokenExpireTime := time.Now().Add(tp)
|
||||||
|
expiretimeStr := tokenExpireTime.Format("2006-01-02 15:04:05")
|
||||||
|
resp.User.TokenExpireTime = expiretimeStr
|
||||||
|
resp.User.UnionId = userModel.UnionId
|
||||||
|
return resp
|
||||||
|
}
|
@ -0,0 +1,52 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"goproduct/common"
|
||||||
|
"goproduct/domain/repository"
|
||||||
|
"goproduct/domain/service"
|
||||||
|
"goproduct/handler"
|
||||||
|
"goproduct/proto"
|
||||||
|
"log"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
consul "github.com/asim/go-micro/plugins/registry/consul/v4"
|
||||||
|
"go-micro.dev/v4"
|
||||||
|
"go-micro.dev/v4/registry"
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
consulStr = "http://192.168.137.131:8500"
|
||||||
|
fileKey = "mysql-user"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
//0 配置中心
|
||||||
|
consulConfig, err := common.GetConsulConfig(consulStr, fileKey)
|
||||||
|
if err != nil {
|
||||||
|
log.Println("consulConfig err :", err)
|
||||||
|
}
|
||||||
|
// 1.consul注册中心
|
||||||
|
consulReist := consul.NewRegistry(func(options *registry.Options) {
|
||||||
|
options.Addrs = []string{consulStr}
|
||||||
|
})
|
||||||
|
repcService := micro.NewService(
|
||||||
|
micro.RegisterTTL(time.Second*30),
|
||||||
|
micro.RegisterInterval(time.Second*30),
|
||||||
|
micro.Name("shop-user"),
|
||||||
|
micro.Address(":8081"),
|
||||||
|
micro.Version("v1"),
|
||||||
|
micro.Registry(consulReist),
|
||||||
|
)
|
||||||
|
//2.初始化db
|
||||||
|
db, _ := common.GetMysqlFromConsul(consulConfig)
|
||||||
|
//3.创建服务实例
|
||||||
|
userDataService := service.NewUserDataService(repository.NewUserRepository(db))
|
||||||
|
//4.注册handler
|
||||||
|
proto.RegisterLoginHandler(repcService.Server(), &handler.User{userDataService})
|
||||||
|
|
||||||
|
//5.启动服务
|
||||||
|
if err := repcService.Run(); err != nil {
|
||||||
|
log.Println("start user service err :", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,418 @@
|
|||||||
|
//*
|
||||||
|
// @Auth:ShenZ
|
||||||
|
// @Description:
|
||||||
|
|
||||||
|
// Code generated by protoc-gen-go. DO NOT EDIT.
|
||||||
|
// versions:
|
||||||
|
// protoc-gen-go v1.26.0
|
||||||
|
// protoc v3.18.1
|
||||||
|
// source: user.proto
|
||||||
|
|
||||||
|
package proto
|
||||||
|
|
||||||
|
import (
|
||||||
|
protoreflect "google.golang.org/protobuf/reflect/protoreflect"
|
||||||
|
protoimpl "google.golang.org/protobuf/runtime/protoimpl"
|
||||||
|
reflect "reflect"
|
||||||
|
sync "sync"
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
// Verify that this generated code is sufficiently up-to-date.
|
||||||
|
_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
|
||||||
|
// Verify that runtime/protoimpl is sufficiently up-to-date.
|
||||||
|
_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
|
||||||
|
)
|
||||||
|
|
||||||
|
//*
|
||||||
|
//"avatar": "",
|
||||||
|
//"clientId": 0,
|
||||||
|
//"employeeId": 0,
|
||||||
|
//"id": 0,
|
||||||
|
//"nickname": "",
|
||||||
|
//"phone": "",
|
||||||
|
//"sessionId": "",
|
||||||
|
//"systemId": 0,
|
||||||
|
//"token": "",
|
||||||
|
//"tokenExpireTime": "",
|
||||||
|
//"unionId": ""
|
||||||
|
type User struct {
|
||||||
|
state protoimpl.MessageState
|
||||||
|
sizeCache protoimpl.SizeCache
|
||||||
|
unknownFields protoimpl.UnknownFields
|
||||||
|
|
||||||
|
Avatar string `protobuf:"bytes,1,opt,name=avatar,proto3" json:"avatar,omitempty"`
|
||||||
|
ClientId int32 `protobuf:"varint,2,opt,name=clientId,proto3" json:"clientId,omitempty"`
|
||||||
|
EmployeeId int32 `protobuf:"varint,3,opt,name=employeeId,proto3" json:"employeeId,omitempty"`
|
||||||
|
Nickname string `protobuf:"bytes,4,opt,name=nickname,proto3" json:"nickname,omitempty"`
|
||||||
|
Phone string `protobuf:"bytes,5,opt,name=phone,proto3" json:"phone,omitempty"`
|
||||||
|
SessionId string `protobuf:"bytes,6,opt,name=sessionId,proto3" json:"sessionId,omitempty"`
|
||||||
|
Token string `protobuf:"bytes,7,opt,name=token,proto3" json:"token,omitempty"`
|
||||||
|
TokenExpireTime string `protobuf:"bytes,8,opt,name=tokenExpireTime,proto3" json:"tokenExpireTime,omitempty"`
|
||||||
|
UnionId string `protobuf:"bytes,9,opt,name=unionId,proto3" json:"unionId,omitempty"`
|
||||||
|
Id int32 `protobuf:"varint,10,opt,name=id,proto3" json:"id,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *User) Reset() {
|
||||||
|
*x = User{}
|
||||||
|
if protoimpl.UnsafeEnabled {
|
||||||
|
mi := &file_user_proto_msgTypes[0]
|
||||||
|
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||||
|
ms.StoreMessageInfo(mi)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *User) String() string {
|
||||||
|
return protoimpl.X.MessageStringOf(x)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (*User) ProtoMessage() {}
|
||||||
|
|
||||||
|
func (x *User) ProtoReflect() protoreflect.Message {
|
||||||
|
mi := &file_user_proto_msgTypes[0]
|
||||||
|
if protoimpl.UnsafeEnabled && x != nil {
|
||||||
|
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||||
|
if ms.LoadMessageInfo() == nil {
|
||||||
|
ms.StoreMessageInfo(mi)
|
||||||
|
}
|
||||||
|
return ms
|
||||||
|
}
|
||||||
|
return mi.MessageOf(x)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Deprecated: Use User.ProtoReflect.Descriptor instead.
|
||||||
|
func (*User) Descriptor() ([]byte, []int) {
|
||||||
|
return file_user_proto_rawDescGZIP(), []int{0}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *User) GetAvatar() string {
|
||||||
|
if x != nil {
|
||||||
|
return x.Avatar
|
||||||
|
}
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *User) GetClientId() int32 {
|
||||||
|
if x != nil {
|
||||||
|
return x.ClientId
|
||||||
|
}
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *User) GetEmployeeId() int32 {
|
||||||
|
if x != nil {
|
||||||
|
return x.EmployeeId
|
||||||
|
}
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *User) GetNickname() string {
|
||||||
|
if x != nil {
|
||||||
|
return x.Nickname
|
||||||
|
}
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *User) GetPhone() string {
|
||||||
|
if x != nil {
|
||||||
|
return x.Phone
|
||||||
|
}
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *User) GetSessionId() string {
|
||||||
|
if x != nil {
|
||||||
|
return x.SessionId
|
||||||
|
}
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *User) GetToken() string {
|
||||||
|
if x != nil {
|
||||||
|
return x.Token
|
||||||
|
}
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *User) GetTokenExpireTime() string {
|
||||||
|
if x != nil {
|
||||||
|
return x.TokenExpireTime
|
||||||
|
}
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *User) GetUnionId() string {
|
||||||
|
if x != nil {
|
||||||
|
return x.UnionId
|
||||||
|
}
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *User) GetId() int32 {
|
||||||
|
if x != nil {
|
||||||
|
return x.Id
|
||||||
|
}
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
//请求 request struct
|
||||||
|
type LoginRequest struct {
|
||||||
|
state protoimpl.MessageState
|
||||||
|
sizeCache protoimpl.SizeCache
|
||||||
|
unknownFields protoimpl.UnknownFields
|
||||||
|
|
||||||
|
ClientId int32 `protobuf:"varint,1,opt,name=clientId,proto3" json:"clientId,omitempty"`
|
||||||
|
Phone string `protobuf:"bytes,2,opt,name=phone,proto3" json:"phone,omitempty"`
|
||||||
|
SystemId int32 `protobuf:"varint,3,opt,name=systemId,proto3" json:"systemId,omitempty"`
|
||||||
|
VerificationCode string `protobuf:"bytes,4,opt,name=verificationCode,proto3" json:"verificationCode,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *LoginRequest) Reset() {
|
||||||
|
*x = LoginRequest{}
|
||||||
|
if protoimpl.UnsafeEnabled {
|
||||||
|
mi := &file_user_proto_msgTypes[1]
|
||||||
|
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||||
|
ms.StoreMessageInfo(mi)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *LoginRequest) String() string {
|
||||||
|
return protoimpl.X.MessageStringOf(x)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (*LoginRequest) ProtoMessage() {}
|
||||||
|
|
||||||
|
func (x *LoginRequest) ProtoReflect() protoreflect.Message {
|
||||||
|
mi := &file_user_proto_msgTypes[1]
|
||||||
|
if protoimpl.UnsafeEnabled && x != nil {
|
||||||
|
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||||
|
if ms.LoadMessageInfo() == nil {
|
||||||
|
ms.StoreMessageInfo(mi)
|
||||||
|
}
|
||||||
|
return ms
|
||||||
|
}
|
||||||
|
return mi.MessageOf(x)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Deprecated: Use LoginRequest.ProtoReflect.Descriptor instead.
|
||||||
|
func (*LoginRequest) Descriptor() ([]byte, []int) {
|
||||||
|
return file_user_proto_rawDescGZIP(), []int{1}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *LoginRequest) GetClientId() int32 {
|
||||||
|
if x != nil {
|
||||||
|
return x.ClientId
|
||||||
|
}
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *LoginRequest) GetPhone() string {
|
||||||
|
if x != nil {
|
||||||
|
return x.Phone
|
||||||
|
}
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *LoginRequest) GetSystemId() int32 {
|
||||||
|
if x != nil {
|
||||||
|
return x.SystemId
|
||||||
|
}
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *LoginRequest) GetVerificationCode() string {
|
||||||
|
if x != nil {
|
||||||
|
return x.VerificationCode
|
||||||
|
}
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
|
//响应 resp struct
|
||||||
|
type LoginResp struct {
|
||||||
|
state protoimpl.MessageState
|
||||||
|
sizeCache protoimpl.SizeCache
|
||||||
|
unknownFields protoimpl.UnknownFields
|
||||||
|
|
||||||
|
Token string `protobuf:"bytes,1,opt,name=token,proto3" json:"token,omitempty"`
|
||||||
|
User *User `protobuf:"bytes,2,opt,name=user,proto3" json:"user,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *LoginResp) Reset() {
|
||||||
|
*x = LoginResp{}
|
||||||
|
if protoimpl.UnsafeEnabled {
|
||||||
|
mi := &file_user_proto_msgTypes[2]
|
||||||
|
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||||
|
ms.StoreMessageInfo(mi)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *LoginResp) String() string {
|
||||||
|
return protoimpl.X.MessageStringOf(x)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (*LoginResp) ProtoMessage() {}
|
||||||
|
|
||||||
|
func (x *LoginResp) ProtoReflect() protoreflect.Message {
|
||||||
|
mi := &file_user_proto_msgTypes[2]
|
||||||
|
if protoimpl.UnsafeEnabled && x != nil {
|
||||||
|
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||||
|
if ms.LoadMessageInfo() == nil {
|
||||||
|
ms.StoreMessageInfo(mi)
|
||||||
|
}
|
||||||
|
return ms
|
||||||
|
}
|
||||||
|
return mi.MessageOf(x)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Deprecated: Use LoginResp.ProtoReflect.Descriptor instead.
|
||||||
|
func (*LoginResp) Descriptor() ([]byte, []int) {
|
||||||
|
return file_user_proto_rawDescGZIP(), []int{2}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *LoginResp) GetToken() string {
|
||||||
|
if x != nil {
|
||||||
|
return x.Token
|
||||||
|
}
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *LoginResp) GetUser() *User {
|
||||||
|
if x != nil {
|
||||||
|
return x.User
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
var File_user_proto protoreflect.FileDescriptor
|
||||||
|
|
||||||
|
var file_user_proto_rawDesc = []byte{
|
||||||
|
0x0a, 0x0a, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x05, 0x70, 0x72,
|
||||||
|
0x6f, 0x74, 0x6f, 0x22, 0x94, 0x02, 0x0a, 0x04, 0x55, 0x73, 0x65, 0x72, 0x12, 0x16, 0x0a, 0x06,
|
||||||
|
0x61, 0x76, 0x61, 0x74, 0x61, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x61, 0x76,
|
||||||
|
0x61, 0x74, 0x61, 0x72, 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x64,
|
||||||
|
0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x64,
|
||||||
|
0x12, 0x1e, 0x0a, 0x0a, 0x65, 0x6d, 0x70, 0x6c, 0x6f, 0x79, 0x65, 0x65, 0x49, 0x64, 0x18, 0x03,
|
||||||
|
0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x65, 0x6d, 0x70, 0x6c, 0x6f, 0x79, 0x65, 0x65, 0x49, 0x64,
|
||||||
|
0x12, 0x1a, 0x0a, 0x08, 0x6e, 0x69, 0x63, 0x6b, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01,
|
||||||
|
0x28, 0x09, 0x52, 0x08, 0x6e, 0x69, 0x63, 0x6b, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05,
|
||||||
|
0x70, 0x68, 0x6f, 0x6e, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x68, 0x6f,
|
||||||
|
0x6e, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18,
|
||||||
|
0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x64,
|
||||||
|
0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52,
|
||||||
|
0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x28, 0x0a, 0x0f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x45,
|
||||||
|
0x78, 0x70, 0x69, 0x72, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52,
|
||||||
|
0x0f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x45, 0x78, 0x70, 0x69, 0x72, 0x65, 0x54, 0x69, 0x6d, 0x65,
|
||||||
|
0x12, 0x18, 0x0a, 0x07, 0x75, 0x6e, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x09, 0x20, 0x01, 0x28,
|
||||||
|
0x09, 0x52, 0x07, 0x75, 0x6e, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64,
|
||||||
|
0x18, 0x0a, 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, 0x69, 0x64, 0x22, 0x88, 0x01, 0x0a, 0x0c, 0x4c,
|
||||||
|
0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x63,
|
||||||
|
0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x63,
|
||||||
|
0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x68, 0x6f, 0x6e, 0x65,
|
||||||
|
0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x68, 0x6f, 0x6e, 0x65, 0x12, 0x1a, 0x0a,
|
||||||
|
0x08, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52,
|
||||||
|
0x08, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x49, 0x64, 0x12, 0x2a, 0x0a, 0x10, 0x76, 0x65, 0x72,
|
||||||
|
0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x64, 0x65, 0x18, 0x04, 0x20,
|
||||||
|
0x01, 0x28, 0x09, 0x52, 0x10, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f,
|
||||||
|
0x6e, 0x43, 0x6f, 0x64, 0x65, 0x22, 0x42, 0x0a, 0x09, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65,
|
||||||
|
0x73, 0x70, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28,
|
||||||
|
0x09, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x1f, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72,
|
||||||
|
0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x55,
|
||||||
|
0x73, 0x65, 0x72, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x32, 0x39, 0x0a, 0x05, 0x4c, 0x6f, 0x67,
|
||||||
|
0x69, 0x6e, 0x12, 0x30, 0x0a, 0x05, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x12, 0x13, 0x2e, 0x70, 0x72,
|
||||||
|
0x6f, 0x74, 0x6f, 0x2e, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
|
||||||
|
0x1a, 0x10, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65,
|
||||||
|
0x73, 0x70, 0x22, 0x00, 0x42, 0x0a, 0x5a, 0x08, 0x2e, 0x2f, 0x3b, 0x70, 0x72, 0x6f, 0x74, 0x6f,
|
||||||
|
0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
|
||||||
|
}
|
||||||
|
|
||||||
|
var (
|
||||||
|
file_user_proto_rawDescOnce sync.Once
|
||||||
|
file_user_proto_rawDescData = file_user_proto_rawDesc
|
||||||
|
)
|
||||||
|
|
||||||
|
func file_user_proto_rawDescGZIP() []byte {
|
||||||
|
file_user_proto_rawDescOnce.Do(func() {
|
||||||
|
file_user_proto_rawDescData = protoimpl.X.CompressGZIP(file_user_proto_rawDescData)
|
||||||
|
})
|
||||||
|
return file_user_proto_rawDescData
|
||||||
|
}
|
||||||
|
|
||||||
|
var file_user_proto_msgTypes = make([]protoimpl.MessageInfo, 3)
|
||||||
|
var file_user_proto_goTypes = []interface{}{
|
||||||
|
(*User)(nil), // 0: proto.User
|
||||||
|
(*LoginRequest)(nil), // 1: proto.LoginRequest
|
||||||
|
(*LoginResp)(nil), // 2: proto.LoginResp
|
||||||
|
}
|
||||||
|
var file_user_proto_depIdxs = []int32{
|
||||||
|
0, // 0: proto.LoginResp.user:type_name -> proto.User
|
||||||
|
1, // 1: proto.Login.Login:input_type -> proto.LoginRequest
|
||||||
|
2, // 2: proto.Login.Login:output_type -> proto.LoginResp
|
||||||
|
2, // [2:3] is the sub-list for method output_type
|
||||||
|
1, // [1:2] is the sub-list for method input_type
|
||||||
|
1, // [1:1] is the sub-list for extension type_name
|
||||||
|
1, // [1:1] is the sub-list for extension extendee
|
||||||
|
0, // [0:1] is the sub-list for field type_name
|
||||||
|
}
|
||||||
|
|
||||||
|
func init() { file_user_proto_init() }
|
||||||
|
func file_user_proto_init() {
|
||||||
|
if File_user_proto != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if !protoimpl.UnsafeEnabled {
|
||||||
|
file_user_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
|
||||||
|
switch v := v.(*User); i {
|
||||||
|
case 0:
|
||||||
|
return &v.state
|
||||||
|
case 1:
|
||||||
|
return &v.sizeCache
|
||||||
|
case 2:
|
||||||
|
return &v.unknownFields
|
||||||
|
default:
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
file_user_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
|
||||||
|
switch v := v.(*LoginRequest); i {
|
||||||
|
case 0:
|
||||||
|
return &v.state
|
||||||
|
case 1:
|
||||||
|
return &v.sizeCache
|
||||||
|
case 2:
|
||||||
|
return &v.unknownFields
|
||||||
|
default:
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
file_user_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
|
||||||
|
switch v := v.(*LoginResp); i {
|
||||||
|
case 0:
|
||||||
|
return &v.state
|
||||||
|
case 1:
|
||||||
|
return &v.sizeCache
|
||||||
|
case 2:
|
||||||
|
return &v.unknownFields
|
||||||
|
default:
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
type x struct{}
|
||||||
|
out := protoimpl.TypeBuilder{
|
||||||
|
File: protoimpl.DescBuilder{
|
||||||
|
GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
|
||||||
|
RawDescriptor: file_user_proto_rawDesc,
|
||||||
|
NumEnums: 0,
|
||||||
|
NumMessages: 3,
|
||||||
|
NumExtensions: 0,
|
||||||
|
NumServices: 1,
|
||||||
|
},
|
||||||
|
GoTypes: file_user_proto_goTypes,
|
||||||
|
DependencyIndexes: file_user_proto_depIdxs,
|
||||||
|
MessageInfos: file_user_proto_msgTypes,
|
||||||
|
}.Build()
|
||||||
|
File_user_proto = out.File
|
||||||
|
file_user_proto_rawDesc = nil
|
||||||
|
file_user_proto_goTypes = nil
|
||||||
|
file_user_proto_depIdxs = nil
|
||||||
|
}
|
@ -0,0 +1,89 @@
|
|||||||
|
// Code generated by protoc-gen-micro. DO NOT EDIT.
|
||||||
|
// source: user.proto
|
||||||
|
|
||||||
|
package proto
|
||||||
|
|
||||||
|
import (
|
||||||
|
fmt "fmt"
|
||||||
|
proto "google.golang.org/protobuf/proto"
|
||||||
|
math "math"
|
||||||
|
)
|
||||||
|
|
||||||
|
import (
|
||||||
|
context "context"
|
||||||
|
api "go-micro.dev/v4/api"
|
||||||
|
client "go-micro.dev/v4/client"
|
||||||
|
server "go-micro.dev/v4/server"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Reference imports to suppress errors if they are not otherwise used.
|
||||||
|
var _ = proto.Marshal
|
||||||
|
var _ = fmt.Errorf
|
||||||
|
var _ = math.Inf
|
||||||
|
|
||||||
|
// Reference imports to suppress errors if they are not otherwise used.
|
||||||
|
var _ api.Endpoint
|
||||||
|
var _ context.Context
|
||||||
|
var _ client.Option
|
||||||
|
var _ server.Option
|
||||||
|
|
||||||
|
// Api Endpoints for Login service
|
||||||
|
|
||||||
|
func NewLoginEndpoints() []*api.Endpoint {
|
||||||
|
return []*api.Endpoint{}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Client API for Login service
|
||||||
|
|
||||||
|
type LoginService interface {
|
||||||
|
//rpc 服务
|
||||||
|
Login(ctx context.Context, in *LoginRequest, opts ...client.CallOption) (*LoginResp, error)
|
||||||
|
}
|
||||||
|
|
||||||
|
type loginService struct {
|
||||||
|
c client.Client
|
||||||
|
name string
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewLoginService(name string, c client.Client) LoginService {
|
||||||
|
return &loginService{
|
||||||
|
c: c,
|
||||||
|
name: name,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *loginService) Login(ctx context.Context, in *LoginRequest, opts ...client.CallOption) (*LoginResp, error) {
|
||||||
|
req := c.c.NewRequest(c.name, "Login.Login", in)
|
||||||
|
out := new(LoginResp)
|
||||||
|
err := c.c.Call(ctx, req, out, opts...)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return out, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Server API for Login service
|
||||||
|
|
||||||
|
type LoginHandler interface {
|
||||||
|
//rpc 服务
|
||||||
|
Login(context.Context, *LoginRequest, *LoginResp) error
|
||||||
|
}
|
||||||
|
|
||||||
|
func RegisterLoginHandler(s server.Server, hdlr LoginHandler, opts ...server.HandlerOption) error {
|
||||||
|
type login interface {
|
||||||
|
Login(ctx context.Context, in *LoginRequest, out *LoginResp) error
|
||||||
|
}
|
||||||
|
type Login struct {
|
||||||
|
login
|
||||||
|
}
|
||||||
|
h := &loginHandler{hdlr}
|
||||||
|
return s.Handle(s.NewHandler(&Login{h}, opts...))
|
||||||
|
}
|
||||||
|
|
||||||
|
type loginHandler struct {
|
||||||
|
LoginHandler
|
||||||
|
}
|
||||||
|
|
||||||
|
func (h *loginHandler) Login(ctx context.Context, in *LoginRequest, out *LoginResp) error {
|
||||||
|
return h.LoginHandler.Login(ctx, in, out)
|
||||||
|
}
|
@ -0,0 +1,15 @@
|
|||||||
|
{
|
||||||
|
"version": "0.2.0",
|
||||||
|
"configurations": [
|
||||||
|
{
|
||||||
|
"name": "golang",
|
||||||
|
"type": "go",
|
||||||
|
"request": "launch",
|
||||||
|
"mode": "auto",
|
||||||
|
//当运行单个文件时{workspaceFolder}可改为{file}
|
||||||
|
"program": "${workspaceFolder}",
|
||||||
|
"env": {},
|
||||||
|
"args": []
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
@ -0,0 +1,69 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"gouser/common"
|
||||||
|
"gouser/proto"
|
||||||
|
"log"
|
||||||
|
"strconv"
|
||||||
|
|
||||||
|
consul "github.com/asim/go-micro/plugins/registry/consul/v4"
|
||||||
|
"go-micro.dev/v4/web"
|
||||||
|
|
||||||
|
"github.com/gin-gonic/gin"
|
||||||
|
"go-micro.dev/v4"
|
||||||
|
"go-micro.dev/v4/registry"
|
||||||
|
)
|
||||||
|
|
||||||
|
//获取远程服务的客户端
|
||||||
|
func getClient() proto.LoginService {
|
||||||
|
//注册到consul
|
||||||
|
consulReg := consul.NewRegistry(func(options *registry.Options) {
|
||||||
|
options.Addrs = []string{"192.168.137.131:8500"}
|
||||||
|
})
|
||||||
|
rpcServer := micro.NewService(
|
||||||
|
micro.Registry(consulReg),
|
||||||
|
)
|
||||||
|
return proto.NewLoginService("shop-user", rpcServer.Client())
|
||||||
|
}
|
||||||
|
func main() {
|
||||||
|
router := gin.Default()
|
||||||
|
|
||||||
|
router.Handle("GET", "toLogin", func(context *gin.Context) {
|
||||||
|
context.String(200, "to Loging ....")
|
||||||
|
})
|
||||||
|
|
||||||
|
router.GET("/login", func(c *gin.Context) {
|
||||||
|
//获取远程服务的客户端
|
||||||
|
client := getClient()
|
||||||
|
//获取页面参数
|
||||||
|
clientId, _ := strconv.Atoi(c.Request.FormValue("clientId"))
|
||||||
|
phone := c.Request.FormValue("phone")
|
||||||
|
systemId, _ := strconv.Atoi(c.Request.FormValue("systemId"))
|
||||||
|
verificationCode := c.Request.FormValue("verificationCode")
|
||||||
|
//拼接请求信息
|
||||||
|
req := &proto.LoginRequest{
|
||||||
|
ClientId: int32(clientId),
|
||||||
|
Phone: phone,
|
||||||
|
SystemId: int32(systemId),
|
||||||
|
VerificationCode: verificationCode,
|
||||||
|
}
|
||||||
|
//远程调用服务
|
||||||
|
resp, err := client.Login(context.TODO(), req)
|
||||||
|
//根据响应做输出
|
||||||
|
if err != nil {
|
||||||
|
log.Println(err.Error())
|
||||||
|
//c.String(http.StatusBadRequest, "search failed !")
|
||||||
|
common.RespFail(c.Writer, resp, "登录失败")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
common.RespOK(c.Writer, resp, "登录成功")
|
||||||
|
})
|
||||||
|
|
||||||
|
service := web.NewService(
|
||||||
|
web.Address(":8081"),
|
||||||
|
web.Handler(router),
|
||||||
|
)
|
||||||
|
service.Run()
|
||||||
|
//router.Run(":6666")
|
||||||
|
}
|
@ -0,0 +1,60 @@
|
|||||||
|
package common
|
||||||
|
|
||||||
|
import (
|
||||||
|
"log"
|
||||||
|
"os"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"github.com/spf13/viper"
|
||||||
|
_ "github.com/spf13/viper/remote"
|
||||||
|
"gorm.io/driver/mysql"
|
||||||
|
"gorm.io/gorm"
|
||||||
|
"gorm.io/gorm/logger"
|
||||||
|
)
|
||||||
|
|
||||||
|
func GetConsulConfig(url string, fileKey string) (*viper.Viper, error) {
|
||||||
|
conf := viper.New()
|
||||||
|
conf.AddRemoteProvider("consul", url, fileKey)
|
||||||
|
conf.SetConfigType("json")
|
||||||
|
err := conf.ReadRemoteConfig()
|
||||||
|
if err != nil {
|
||||||
|
log.Println("viper conf err :", err)
|
||||||
|
}
|
||||||
|
return conf, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
{
|
||||||
|
"host": "192.168.137.131",
|
||||||
|
"port": "3306",
|
||||||
|
"user": "root",
|
||||||
|
"pwd": "mashibing123",
|
||||||
|
"database": "user_center"
|
||||||
|
}
|
||||||
|
**/
|
||||||
|
|
||||||
|
// type MySQLConfig struct {
|
||||||
|
// Host string `json:"host"`
|
||||||
|
// Post string `json:"port"`
|
||||||
|
// User string `json:"user"`
|
||||||
|
// Pwd string `json:"pwd"`
|
||||||
|
// Database string `json:"database"`
|
||||||
|
// }
|
||||||
|
|
||||||
|
func GetMysqlFromConsul(vip *viper.Viper) (db *gorm.DB, err error) {
|
||||||
|
newLogger := logger.New(
|
||||||
|
log.New(os.Stdout, "\r\n", log.LstdFlags),
|
||||||
|
logger.Config{
|
||||||
|
SlowThreshold: time.Second,
|
||||||
|
LogLevel: logger.Info,
|
||||||
|
Colorful: true,
|
||||||
|
},
|
||||||
|
)
|
||||||
|
str := vip.GetString("user") + ":" + vip.GetString("pwd") + "@tcp(" + vip.GetString("host") + ":" + vip.GetString("port") + ")/" + vip.GetString("database") + "?charset=utf8mb4&parseTime=True&loc=Local"
|
||||||
|
db, errr := gorm.Open(mysql.Open(str), &gorm.Config{Logger: newLogger}) //"root:mashibing123@tcp(8.142.25.43:3306)/user_center?charset=utf8mb4&parseTime=True&loc=Local"), &gorm.Config{Logger: newLogger})
|
||||||
|
if errr != nil {
|
||||||
|
log.Println("db err :", errr)
|
||||||
|
}
|
||||||
|
|
||||||
|
return db, nil
|
||||||
|
}
|
@ -0,0 +1,33 @@
|
|||||||
|
package common
|
||||||
|
|
||||||
|
import (
|
||||||
|
"crypto/md5"
|
||||||
|
"encoding/hex"
|
||||||
|
"fmt"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
//小写
|
||||||
|
func Md5Encode(data string) string {
|
||||||
|
h := md5.New()
|
||||||
|
h.Write([]byte(data))
|
||||||
|
tempStr := h.Sum(nil)
|
||||||
|
return hex.EncodeToString(tempStr)
|
||||||
|
}
|
||||||
|
|
||||||
|
//大写
|
||||||
|
func MD5Encode(data string) string {
|
||||||
|
return strings.ToUpper(Md5Encode(data))
|
||||||
|
}
|
||||||
|
|
||||||
|
//加密
|
||||||
|
func MakePassword(plainpwd, salt string) string {
|
||||||
|
return Md5Encode(plainpwd + salt)
|
||||||
|
}
|
||||||
|
|
||||||
|
//解密
|
||||||
|
func ValidPassword(plainpwd, salt string, password string) bool {
|
||||||
|
md := Md5Encode(plainpwd + salt)
|
||||||
|
fmt.Println(md + " " + password)
|
||||||
|
return md == password
|
||||||
|
}
|
@ -0,0 +1,70 @@
|
|||||||
|
package common
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
"fmt"
|
||||||
|
"net/http"
|
||||||
|
)
|
||||||
|
|
||||||
|
type H struct {
|
||||||
|
Code string
|
||||||
|
Message string
|
||||||
|
TraceId string
|
||||||
|
Data interface{}
|
||||||
|
Rows interface{}
|
||||||
|
Total interface{}
|
||||||
|
SkyWalkingDynamicField string
|
||||||
|
}
|
||||||
|
|
||||||
|
func Resp(w http.ResponseWriter, code string, data interface{}, message string) {
|
||||||
|
w.Header().Set("Content-Type", "application/json")
|
||||||
|
w.WriteHeader(http.StatusOK)
|
||||||
|
h := H{
|
||||||
|
Code: code,
|
||||||
|
Data: data,
|
||||||
|
Message: message,
|
||||||
|
}
|
||||||
|
ret, err := json.Marshal(h)
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println(err)
|
||||||
|
}
|
||||||
|
w.Write(ret)
|
||||||
|
}
|
||||||
|
|
||||||
|
func RespList(w http.ResponseWriter, code string, data interface{}, message string, rows interface{}, total interface{}, skyWalkingDynamicField string) {
|
||||||
|
w.Header().Set("Content-Type", "application/json")
|
||||||
|
w.WriteHeader(http.StatusOK)
|
||||||
|
h := H{
|
||||||
|
Code: code,
|
||||||
|
Data: data,
|
||||||
|
Message: message,
|
||||||
|
Rows: rows,
|
||||||
|
Total: total,
|
||||||
|
SkyWalkingDynamicField: skyWalkingDynamicField,
|
||||||
|
}
|
||||||
|
ret, err := json.Marshal(h)
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println(err)
|
||||||
|
}
|
||||||
|
w.Write(ret)
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
200 OKLoginSuccessVO
|
||||||
|
201 Created
|
||||||
|
401 Unauthorized
|
||||||
|
403 Forbidden
|
||||||
|
404 Not Found
|
||||||
|
**/
|
||||||
|
func RespOK(w http.ResponseWriter, data interface{}, message string) {
|
||||||
|
Resp(w, "SUCCESS", data, message)
|
||||||
|
}
|
||||||
|
func RespFail(w http.ResponseWriter, data interface{}, message string) {
|
||||||
|
Resp(w, "TOKEN_FAIL", data, message)
|
||||||
|
}
|
||||||
|
func RespListOK(w http.ResponseWriter, data interface{}, message string, rows interface{}, total interface{}, skyWalkingDynamicField string) {
|
||||||
|
RespList(w, "SUCCESS", data, message, rows, total, skyWalkingDynamicField)
|
||||||
|
}
|
||||||
|
func RespListFail(w http.ResponseWriter, data interface{}, message string, rows interface{}, total interface{}, skyWalkingDynamicField string) {
|
||||||
|
RespList(w, "TOKEN_FAIL", data, message, rows, total, skyWalkingDynamicField)
|
||||||
|
}
|
@ -0,0 +1,22 @@
|
|||||||
|
package model
|
||||||
|
|
||||||
|
import "time"
|
||||||
|
|
||||||
|
type User struct {
|
||||||
|
//gorm.Model
|
||||||
|
ID int32
|
||||||
|
Avatar string `gorm:"default:'https://msb-edu-dev.oss-cn-beijing.aliyuncs.com/default-headimg.png'"`
|
||||||
|
ClientId int32 `gorm:"default:1"`
|
||||||
|
Nickname string `gorm:"default:'随机名称'"`
|
||||||
|
Phone string
|
||||||
|
Password string `gorm:"default:'1234'"`
|
||||||
|
SystemId string `gorm:"default:1"`
|
||||||
|
LastLoginTime time.Time
|
||||||
|
CreateTime time.Time
|
||||||
|
IsDeleted int32 `gorm:"default:0"`
|
||||||
|
UnionId string `gorm:"default:'1'"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func (table *User) TableName() string {
|
||||||
|
return "user"
|
||||||
|
}
|
@ -0,0 +1,47 @@
|
|||||||
|
package repository
|
||||||
|
|
||||||
|
import (
|
||||||
|
"errors"
|
||||||
|
"gouser/domain/model"
|
||||||
|
|
||||||
|
"gorm.io/gorm"
|
||||||
|
)
|
||||||
|
|
||||||
|
/**
|
||||||
|
int32 clientId = 1;
|
||||||
|
string phone = 2;
|
||||||
|
int32 systemId = 3;
|
||||||
|
string verificationCode = 4;
|
||||||
|
**/
|
||||||
|
//接口
|
||||||
|
type IUserRepository interface {
|
||||||
|
Login(int32, string, int32, string) (*model.User, error)
|
||||||
|
}
|
||||||
|
|
||||||
|
//创建实例
|
||||||
|
func NewUserRepository(db *gorm.DB) IUserRepository {
|
||||||
|
return &UserRepository{mysqlDB: db}
|
||||||
|
}
|
||||||
|
|
||||||
|
//数据DB
|
||||||
|
type UserRepository struct {
|
||||||
|
mysqlDB *gorm.DB
|
||||||
|
}
|
||||||
|
|
||||||
|
//重写接口方法
|
||||||
|
func (u *UserRepository) Login(clientId int32, phone string, systemId int32, verificationCode string) (user *model.User, err error) {
|
||||||
|
user = &model.User{}
|
||||||
|
if clientId == 0 && systemId == 0 && verificationCode == "6666" {
|
||||||
|
u.mysqlDB.Where("phone = ? ", phone).Find(user)
|
||||||
|
//未找到就注册一个
|
||||||
|
if user.ID == 0 {
|
||||||
|
user.Phone = phone
|
||||||
|
u.mysqlDB.Create(&user)
|
||||||
|
//u.mysqlDB.Select("Nickname", "Avatar", "Phone", "ClientId").Create(&user)
|
||||||
|
}
|
||||||
|
return user, nil
|
||||||
|
//return user, u.mysqlDB.Where("phone = ? ", phone).Find(user).Error
|
||||||
|
} else {
|
||||||
|
return user, errors.New("参数不匹配")
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,29 @@
|
|||||||
|
package service
|
||||||
|
|
||||||
|
import (
|
||||||
|
"gouser/domain/model"
|
||||||
|
"gouser/domain/repository"
|
||||||
|
)
|
||||||
|
|
||||||
|
type IUserDataService interface {
|
||||||
|
Login(int32, string, int32, string) (*model.User, error)
|
||||||
|
}
|
||||||
|
type UserDataService struct {
|
||||||
|
userRepository repository.IUserRepository
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewUserDataService(userRepository repository.IUserRepository) IUserDataService {
|
||||||
|
return &UserDataService{userRepository: userRepository}
|
||||||
|
}
|
||||||
|
|
||||||
|
//重写接口方法
|
||||||
|
func (u *UserDataService) Login(clientId int32, phone string, systemId int32, verificationCode string) (user *model.User, err error) {
|
||||||
|
|
||||||
|
return u.userRepository.Login(clientId, phone, systemId, verificationCode)
|
||||||
|
}
|
||||||
|
|
||||||
|
/* clientId, _ := strconv.Atoi(c.Request.FormValue("clientId"))
|
||||||
|
phone := c.Request.FormValue("phone")
|
||||||
|
systemId, _ := strconv.Atoi(c.Request.FormValue("systemId"))
|
||||||
|
verificationCode := c.Request.FormValue("verificationCode")
|
||||||
|
*/
|
@ -0,0 +1,119 @@
|
|||||||
|
module gouser
|
||||||
|
|
||||||
|
go 1.17
|
||||||
|
|
||||||
|
require (
|
||||||
|
github.com/jinzhu/inflection v1.0.0 // indirect
|
||||||
|
github.com/jinzhu/now v1.1.5 // indirect
|
||||||
|
go-micro.dev/v4 v4.7.0
|
||||||
|
google.golang.org/protobuf v1.28.0
|
||||||
|
gorm.io/gorm v1.23.8
|
||||||
|
)
|
||||||
|
|
||||||
|
require (
|
||||||
|
github.com/google/uuid v1.3.0 // indirect
|
||||||
|
github.com/miekg/dns v1.1.50 // indirect
|
||||||
|
golang.org/x/net v0.0.0-20220708220712-1185a9018129 // indirect
|
||||||
|
golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f // indirect
|
||||||
|
golang.org/x/sys v0.0.0-20220712014510-0a85c31ab51e // indirect
|
||||||
|
golang.org/x/tools v0.1.11 // indirect
|
||||||
|
gopkg.in/yaml.v3 v3.0.1 // indirect
|
||||||
|
)
|
||||||
|
|
||||||
|
require (
|
||||||
|
github.com/asim/go-micro/plugins/registry/consul/v4 v4.7.0
|
||||||
|
github.com/gin-gonic/gin v1.8.1
|
||||||
|
github.com/spf13/viper v1.12.0
|
||||||
|
gorm.io/driver/mysql v1.3.5
|
||||||
|
)
|
||||||
|
|
||||||
|
require (
|
||||||
|
cloud.google.com/go v0.100.2 // indirect
|
||||||
|
cloud.google.com/go/compute v1.6.1 // indirect
|
||||||
|
cloud.google.com/go/firestore v1.6.1 // indirect
|
||||||
|
github.com/Microsoft/go-winio v0.5.0 // indirect
|
||||||
|
github.com/ProtonMail/go-crypto v0.0.0-20210428141323-04723f9f07d7 // indirect
|
||||||
|
github.com/acomagu/bufpipe v1.0.3 // indirect
|
||||||
|
github.com/armon/go-metrics v0.3.10 // indirect
|
||||||
|
github.com/bitly/go-simplejson v0.5.0 // indirect
|
||||||
|
github.com/coreos/go-semver v0.3.0 // indirect
|
||||||
|
github.com/coreos/go-systemd/v22 v22.3.2 // indirect
|
||||||
|
github.com/cpuguy83/go-md2man/v2 v2.0.0 // indirect
|
||||||
|
github.com/emirpasic/gods v1.12.0 // indirect
|
||||||
|
github.com/fatih/color v1.13.0 // indirect
|
||||||
|
github.com/fsnotify/fsnotify v1.5.4 // indirect
|
||||||
|
github.com/gin-contrib/sse v0.1.0 // indirect
|
||||||
|
github.com/go-git/gcfg v1.5.0 // indirect
|
||||||
|
github.com/go-git/go-billy/v5 v5.3.1 // indirect
|
||||||
|
github.com/go-git/go-git/v5 v5.4.2 // indirect
|
||||||
|
github.com/go-playground/locales v0.14.0 // indirect
|
||||||
|
github.com/go-playground/universal-translator v0.18.0 // indirect
|
||||||
|
github.com/go-playground/validator/v10 v10.10.0 // indirect
|
||||||
|
github.com/go-sql-driver/mysql v1.6.0 // indirect
|
||||||
|
github.com/goccy/go-json v0.9.7 // indirect
|
||||||
|
github.com/gogo/protobuf v1.3.2 // indirect
|
||||||
|
github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect
|
||||||
|
github.com/golang/protobuf v1.5.2 // indirect
|
||||||
|
github.com/google/go-cmp v0.5.8 // indirect
|
||||||
|
github.com/googleapis/gax-go/v2 v2.4.0 // indirect
|
||||||
|
github.com/hashicorp/consul/api v1.12.0 // indirect
|
||||||
|
github.com/hashicorp/go-cleanhttp v0.5.2 // indirect
|
||||||
|
github.com/hashicorp/go-hclog v1.2.0 // indirect
|
||||||
|
github.com/hashicorp/go-immutable-radix v1.3.1 // indirect
|
||||||
|
github.com/hashicorp/go-rootcerts v1.0.2 // indirect
|
||||||
|
github.com/hashicorp/golang-lru v0.5.4 // indirect
|
||||||
|
github.com/hashicorp/hcl v1.0.0 // indirect
|
||||||
|
github.com/hashicorp/serf v0.9.7 // indirect
|
||||||
|
github.com/imdario/mergo v0.3.12 // indirect
|
||||||
|
github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 // indirect
|
||||||
|
github.com/json-iterator/go v1.1.12 // indirect
|
||||||
|
github.com/kevinburke/ssh_config v0.0.0-20201106050909-4977a11b4351 // indirect
|
||||||
|
github.com/leodido/go-urn v1.2.1 // indirect
|
||||||
|
github.com/magiconair/properties v1.8.6 // indirect
|
||||||
|
github.com/mattn/go-colorable v0.1.12 // indirect
|
||||||
|
github.com/mattn/go-isatty v0.0.14 // indirect
|
||||||
|
github.com/mitchellh/go-homedir v1.1.0 // indirect
|
||||||
|
github.com/mitchellh/hashstructure v1.1.0 // indirect
|
||||||
|
github.com/mitchellh/mapstructure v1.5.0 // indirect
|
||||||
|
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
|
||||||
|
github.com/modern-go/reflect2 v1.0.2 // indirect
|
||||||
|
github.com/nxadm/tail v1.4.8 // indirect
|
||||||
|
github.com/oxtoacart/bpool v0.0.0-20190530202638-03653db5a59c // indirect
|
||||||
|
github.com/patrickmn/go-cache v2.1.0+incompatible // indirect
|
||||||
|
github.com/pelletier/go-toml v1.9.5 // indirect
|
||||||
|
github.com/pelletier/go-toml/v2 v2.0.1 // indirect
|
||||||
|
github.com/pkg/errors v0.9.1 // indirect
|
||||||
|
github.com/russross/blackfriday/v2 v2.0.1 // indirect
|
||||||
|
github.com/sagikazarmark/crypt v0.6.0 // indirect
|
||||||
|
github.com/sergi/go-diff v1.1.0 // indirect
|
||||||
|
github.com/shurcooL/sanitized_anchor_name v1.0.0 // indirect
|
||||||
|
github.com/spf13/afero v1.8.2 // indirect
|
||||||
|
github.com/spf13/cast v1.5.0 // indirect
|
||||||
|
github.com/spf13/jwalterweatherman v1.1.0 // indirect
|
||||||
|
github.com/spf13/pflag v1.0.5 // indirect
|
||||||
|
github.com/subosito/gotenv v1.3.0 // indirect
|
||||||
|
github.com/ugorji/go/codec v1.2.7 // indirect
|
||||||
|
github.com/urfave/cli/v2 v2.3.0 // indirect
|
||||||
|
github.com/xanzy/ssh-agent v0.3.0 // indirect
|
||||||
|
go.etcd.io/etcd/api/v3 v3.5.4 // indirect
|
||||||
|
go.etcd.io/etcd/client/pkg/v3 v3.5.4 // indirect
|
||||||
|
go.etcd.io/etcd/client/v2 v2.305.4 // indirect
|
||||||
|
go.etcd.io/etcd/client/v3 v3.5.4 // indirect
|
||||||
|
go.opencensus.io v0.23.0 // indirect
|
||||||
|
go.uber.org/atomic v1.7.0 // indirect
|
||||||
|
go.uber.org/multierr v1.6.0 // indirect
|
||||||
|
go.uber.org/zap v1.17.0 // indirect
|
||||||
|
golang.org/x/crypto v0.0.0-20220411220226-7b82a4e95df4 // indirect
|
||||||
|
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4 // indirect
|
||||||
|
golang.org/x/oauth2 v0.0.0-20220411215720-9780585627b5 // indirect
|
||||||
|
golang.org/x/text v0.3.7 // indirect
|
||||||
|
golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df // indirect
|
||||||
|
google.golang.org/api v0.81.0 // indirect
|
||||||
|
google.golang.org/appengine v1.6.7 // indirect
|
||||||
|
google.golang.org/genproto v0.0.0-20220519153652-3a47de7e79bd // indirect
|
||||||
|
google.golang.org/grpc v1.46.2 // indirect
|
||||||
|
gopkg.in/ini.v1 v1.66.4 // indirect
|
||||||
|
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 // indirect
|
||||||
|
gopkg.in/warnings.v0 v0.1.2 // indirect
|
||||||
|
gopkg.in/yaml.v2 v2.4.0 // indirect
|
||||||
|
)
|
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,48 @@
|
|||||||
|
package handler
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"fmt"
|
||||||
|
"gouser/common"
|
||||||
|
"gouser/domain/model"
|
||||||
|
"gouser/domain/service"
|
||||||
|
"gouser/proto"
|
||||||
|
"log"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
type User struct {
|
||||||
|
UserDataService service.IUserDataService
|
||||||
|
}
|
||||||
|
|
||||||
|
// 登录 (clientId int32, phone string, systemId int32, verifi
|
||||||
|
func (u *User) Login(ctx context.Context, loginRequest *proto.LoginRequest, loginResp *proto.LoginResp) error {
|
||||||
|
userInfo, err := u.UserDataService.Login(loginRequest.ClientId, loginRequest.GetPhone(), loginRequest.SystemId, loginRequest.VerificationCode)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
fmt.Println(">>>>>>>>>>>>> login success :", userInfo)
|
||||||
|
UserForResp(userInfo, loginResp)
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func UserForResp(userModel *model.User, resp *proto.LoginResp) *proto.LoginResp {
|
||||||
|
timeStr := fmt.Sprintf("%d", time.Now().Unix())
|
||||||
|
resp.Token = common.Md5Encode(timeStr) //"123456"
|
||||||
|
resp.User = &proto.User{}
|
||||||
|
log.Println(userModel)
|
||||||
|
resp.User.Id = userModel.ID
|
||||||
|
resp.User.Avatar = userModel.Avatar
|
||||||
|
resp.User.ClientId = userModel.ClientId
|
||||||
|
resp.User.EmployeeId = 1 //userModel.EmployeeId
|
||||||
|
resp.User.Nickname = userModel.Nickname
|
||||||
|
resp.User.SessionId = resp.Token
|
||||||
|
resp.User.Phone = userModel.Phone
|
||||||
|
//token 过期时间
|
||||||
|
tp, _ := time.ParseDuration("1h")
|
||||||
|
tokenExpireTime := time.Now().Add(tp)
|
||||||
|
expiretimeStr := tokenExpireTime.Format("2006-01-02 15:04:05")
|
||||||
|
resp.User.TokenExpireTime = expiretimeStr
|
||||||
|
resp.User.UnionId = userModel.UnionId
|
||||||
|
return resp
|
||||||
|
}
|
@ -0,0 +1,52 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"gouser/common"
|
||||||
|
"gouser/domain/repository"
|
||||||
|
"gouser/domain/service"
|
||||||
|
"gouser/handler"
|
||||||
|
"gouser/proto"
|
||||||
|
"log"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
consul "github.com/asim/go-micro/plugins/registry/consul/v4"
|
||||||
|
"go-micro.dev/v4"
|
||||||
|
"go-micro.dev/v4/registry"
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
consulStr = "http://192.168.137.131:8500"
|
||||||
|
fileKey = "mysql-user"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
//0 配置中心
|
||||||
|
consulConfig, err := common.GetConsulConfig(consulStr, fileKey)
|
||||||
|
if err != nil {
|
||||||
|
log.Println("consulConfig err :", err)
|
||||||
|
}
|
||||||
|
// 1.consul注册中心
|
||||||
|
consulReist := consul.NewRegistry(func(options *registry.Options) {
|
||||||
|
options.Addrs = []string{consulStr}
|
||||||
|
})
|
||||||
|
repcService := micro.NewService(
|
||||||
|
micro.RegisterTTL(time.Second*30),
|
||||||
|
micro.RegisterInterval(time.Second*30),
|
||||||
|
micro.Name("shop-user"),
|
||||||
|
micro.Address(":8081"),
|
||||||
|
micro.Version("v1"),
|
||||||
|
micro.Registry(consulReist),
|
||||||
|
)
|
||||||
|
//2.初始化db
|
||||||
|
db, _ := common.GetMysqlFromConsul(consulConfig)
|
||||||
|
//3.创建服务实例
|
||||||
|
userDataService := service.NewUserDataService(repository.NewUserRepository(db))
|
||||||
|
//4.注册handler
|
||||||
|
proto.RegisterLoginHandler(repcService.Server(), &handler.User{userDataService})
|
||||||
|
|
||||||
|
//5.启动服务
|
||||||
|
if err := repcService.Run(); err != nil {
|
||||||
|
log.Println("start user service err :", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,418 @@
|
|||||||
|
//*
|
||||||
|
// @Auth:ShenZ
|
||||||
|
// @Description:
|
||||||
|
|
||||||
|
// Code generated by protoc-gen-go. DO NOT EDIT.
|
||||||
|
// versions:
|
||||||
|
// protoc-gen-go v1.26.0
|
||||||
|
// protoc v3.18.1
|
||||||
|
// source: user.proto
|
||||||
|
|
||||||
|
package proto
|
||||||
|
|
||||||
|
import (
|
||||||
|
protoreflect "google.golang.org/protobuf/reflect/protoreflect"
|
||||||
|
protoimpl "google.golang.org/protobuf/runtime/protoimpl"
|
||||||
|
reflect "reflect"
|
||||||
|
sync "sync"
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
// Verify that this generated code is sufficiently up-to-date.
|
||||||
|
_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
|
||||||
|
// Verify that runtime/protoimpl is sufficiently up-to-date.
|
||||||
|
_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
|
||||||
|
)
|
||||||
|
|
||||||
|
//*
|
||||||
|
//"avatar": "",
|
||||||
|
//"clientId": 0,
|
||||||
|
//"employeeId": 0,
|
||||||
|
//"id": 0,
|
||||||
|
//"nickname": "",
|
||||||
|
//"phone": "",
|
||||||
|
//"sessionId": "",
|
||||||
|
//"systemId": 0,
|
||||||
|
//"token": "",
|
||||||
|
//"tokenExpireTime": "",
|
||||||
|
//"unionId": ""
|
||||||
|
type User struct {
|
||||||
|
state protoimpl.MessageState
|
||||||
|
sizeCache protoimpl.SizeCache
|
||||||
|
unknownFields protoimpl.UnknownFields
|
||||||
|
|
||||||
|
Avatar string `protobuf:"bytes,1,opt,name=avatar,proto3" json:"avatar,omitempty"`
|
||||||
|
ClientId int32 `protobuf:"varint,2,opt,name=clientId,proto3" json:"clientId,omitempty"`
|
||||||
|
EmployeeId int32 `protobuf:"varint,3,opt,name=employeeId,proto3" json:"employeeId,omitempty"`
|
||||||
|
Nickname string `protobuf:"bytes,4,opt,name=nickname,proto3" json:"nickname,omitempty"`
|
||||||
|
Phone string `protobuf:"bytes,5,opt,name=phone,proto3" json:"phone,omitempty"`
|
||||||
|
SessionId string `protobuf:"bytes,6,opt,name=sessionId,proto3" json:"sessionId,omitempty"`
|
||||||
|
Token string `protobuf:"bytes,7,opt,name=token,proto3" json:"token,omitempty"`
|
||||||
|
TokenExpireTime string `protobuf:"bytes,8,opt,name=tokenExpireTime,proto3" json:"tokenExpireTime,omitempty"`
|
||||||
|
UnionId string `protobuf:"bytes,9,opt,name=unionId,proto3" json:"unionId,omitempty"`
|
||||||
|
Id int32 `protobuf:"varint,10,opt,name=id,proto3" json:"id,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *User) Reset() {
|
||||||
|
*x = User{}
|
||||||
|
if protoimpl.UnsafeEnabled {
|
||||||
|
mi := &file_user_proto_msgTypes[0]
|
||||||
|
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||||
|
ms.StoreMessageInfo(mi)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *User) String() string {
|
||||||
|
return protoimpl.X.MessageStringOf(x)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (*User) ProtoMessage() {}
|
||||||
|
|
||||||
|
func (x *User) ProtoReflect() protoreflect.Message {
|
||||||
|
mi := &file_user_proto_msgTypes[0]
|
||||||
|
if protoimpl.UnsafeEnabled && x != nil {
|
||||||
|
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||||
|
if ms.LoadMessageInfo() == nil {
|
||||||
|
ms.StoreMessageInfo(mi)
|
||||||
|
}
|
||||||
|
return ms
|
||||||
|
}
|
||||||
|
return mi.MessageOf(x)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Deprecated: Use User.ProtoReflect.Descriptor instead.
|
||||||
|
func (*User) Descriptor() ([]byte, []int) {
|
||||||
|
return file_user_proto_rawDescGZIP(), []int{0}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *User) GetAvatar() string {
|
||||||
|
if x != nil {
|
||||||
|
return x.Avatar
|
||||||
|
}
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *User) GetClientId() int32 {
|
||||||
|
if x != nil {
|
||||||
|
return x.ClientId
|
||||||
|
}
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *User) GetEmployeeId() int32 {
|
||||||
|
if x != nil {
|
||||||
|
return x.EmployeeId
|
||||||
|
}
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *User) GetNickname() string {
|
||||||
|
if x != nil {
|
||||||
|
return x.Nickname
|
||||||
|
}
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *User) GetPhone() string {
|
||||||
|
if x != nil {
|
||||||
|
return x.Phone
|
||||||
|
}
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *User) GetSessionId() string {
|
||||||
|
if x != nil {
|
||||||
|
return x.SessionId
|
||||||
|
}
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *User) GetToken() string {
|
||||||
|
if x != nil {
|
||||||
|
return x.Token
|
||||||
|
}
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *User) GetTokenExpireTime() string {
|
||||||
|
if x != nil {
|
||||||
|
return x.TokenExpireTime
|
||||||
|
}
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *User) GetUnionId() string {
|
||||||
|
if x != nil {
|
||||||
|
return x.UnionId
|
||||||
|
}
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *User) GetId() int32 {
|
||||||
|
if x != nil {
|
||||||
|
return x.Id
|
||||||
|
}
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
//请求 request struct
|
||||||
|
type LoginRequest struct {
|
||||||
|
state protoimpl.MessageState
|
||||||
|
sizeCache protoimpl.SizeCache
|
||||||
|
unknownFields protoimpl.UnknownFields
|
||||||
|
|
||||||
|
ClientId int32 `protobuf:"varint,1,opt,name=clientId,proto3" json:"clientId,omitempty"`
|
||||||
|
Phone string `protobuf:"bytes,2,opt,name=phone,proto3" json:"phone,omitempty"`
|
||||||
|
SystemId int32 `protobuf:"varint,3,opt,name=systemId,proto3" json:"systemId,omitempty"`
|
||||||
|
VerificationCode string `protobuf:"bytes,4,opt,name=verificationCode,proto3" json:"verificationCode,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *LoginRequest) Reset() {
|
||||||
|
*x = LoginRequest{}
|
||||||
|
if protoimpl.UnsafeEnabled {
|
||||||
|
mi := &file_user_proto_msgTypes[1]
|
||||||
|
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||||
|
ms.StoreMessageInfo(mi)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *LoginRequest) String() string {
|
||||||
|
return protoimpl.X.MessageStringOf(x)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (*LoginRequest) ProtoMessage() {}
|
||||||
|
|
||||||
|
func (x *LoginRequest) ProtoReflect() protoreflect.Message {
|
||||||
|
mi := &file_user_proto_msgTypes[1]
|
||||||
|
if protoimpl.UnsafeEnabled && x != nil {
|
||||||
|
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||||
|
if ms.LoadMessageInfo() == nil {
|
||||||
|
ms.StoreMessageInfo(mi)
|
||||||
|
}
|
||||||
|
return ms
|
||||||
|
}
|
||||||
|
return mi.MessageOf(x)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Deprecated: Use LoginRequest.ProtoReflect.Descriptor instead.
|
||||||
|
func (*LoginRequest) Descriptor() ([]byte, []int) {
|
||||||
|
return file_user_proto_rawDescGZIP(), []int{1}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *LoginRequest) GetClientId() int32 {
|
||||||
|
if x != nil {
|
||||||
|
return x.ClientId
|
||||||
|
}
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *LoginRequest) GetPhone() string {
|
||||||
|
if x != nil {
|
||||||
|
return x.Phone
|
||||||
|
}
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *LoginRequest) GetSystemId() int32 {
|
||||||
|
if x != nil {
|
||||||
|
return x.SystemId
|
||||||
|
}
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *LoginRequest) GetVerificationCode() string {
|
||||||
|
if x != nil {
|
||||||
|
return x.VerificationCode
|
||||||
|
}
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
|
//响应 resp struct
|
||||||
|
type LoginResp struct {
|
||||||
|
state protoimpl.MessageState
|
||||||
|
sizeCache protoimpl.SizeCache
|
||||||
|
unknownFields protoimpl.UnknownFields
|
||||||
|
|
||||||
|
Token string `protobuf:"bytes,1,opt,name=token,proto3" json:"token,omitempty"`
|
||||||
|
User *User `protobuf:"bytes,2,opt,name=user,proto3" json:"user,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *LoginResp) Reset() {
|
||||||
|
*x = LoginResp{}
|
||||||
|
if protoimpl.UnsafeEnabled {
|
||||||
|
mi := &file_user_proto_msgTypes[2]
|
||||||
|
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||||
|
ms.StoreMessageInfo(mi)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *LoginResp) String() string {
|
||||||
|
return protoimpl.X.MessageStringOf(x)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (*LoginResp) ProtoMessage() {}
|
||||||
|
|
||||||
|
func (x *LoginResp) ProtoReflect() protoreflect.Message {
|
||||||
|
mi := &file_user_proto_msgTypes[2]
|
||||||
|
if protoimpl.UnsafeEnabled && x != nil {
|
||||||
|
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||||
|
if ms.LoadMessageInfo() == nil {
|
||||||
|
ms.StoreMessageInfo(mi)
|
||||||
|
}
|
||||||
|
return ms
|
||||||
|
}
|
||||||
|
return mi.MessageOf(x)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Deprecated: Use LoginResp.ProtoReflect.Descriptor instead.
|
||||||
|
func (*LoginResp) Descriptor() ([]byte, []int) {
|
||||||
|
return file_user_proto_rawDescGZIP(), []int{2}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *LoginResp) GetToken() string {
|
||||||
|
if x != nil {
|
||||||
|
return x.Token
|
||||||
|
}
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *LoginResp) GetUser() *User {
|
||||||
|
if x != nil {
|
||||||
|
return x.User
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
var File_user_proto protoreflect.FileDescriptor
|
||||||
|
|
||||||
|
var file_user_proto_rawDesc = []byte{
|
||||||
|
0x0a, 0x0a, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x05, 0x70, 0x72,
|
||||||
|
0x6f, 0x74, 0x6f, 0x22, 0x94, 0x02, 0x0a, 0x04, 0x55, 0x73, 0x65, 0x72, 0x12, 0x16, 0x0a, 0x06,
|
||||||
|
0x61, 0x76, 0x61, 0x74, 0x61, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x61, 0x76,
|
||||||
|
0x61, 0x74, 0x61, 0x72, 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x64,
|
||||||
|
0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x64,
|
||||||
|
0x12, 0x1e, 0x0a, 0x0a, 0x65, 0x6d, 0x70, 0x6c, 0x6f, 0x79, 0x65, 0x65, 0x49, 0x64, 0x18, 0x03,
|
||||||
|
0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x65, 0x6d, 0x70, 0x6c, 0x6f, 0x79, 0x65, 0x65, 0x49, 0x64,
|
||||||
|
0x12, 0x1a, 0x0a, 0x08, 0x6e, 0x69, 0x63, 0x6b, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01,
|
||||||
|
0x28, 0x09, 0x52, 0x08, 0x6e, 0x69, 0x63, 0x6b, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05,
|
||||||
|
0x70, 0x68, 0x6f, 0x6e, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x68, 0x6f,
|
||||||
|
0x6e, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18,
|
||||||
|
0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x64,
|
||||||
|
0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52,
|
||||||
|
0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x28, 0x0a, 0x0f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x45,
|
||||||
|
0x78, 0x70, 0x69, 0x72, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52,
|
||||||
|
0x0f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x45, 0x78, 0x70, 0x69, 0x72, 0x65, 0x54, 0x69, 0x6d, 0x65,
|
||||||
|
0x12, 0x18, 0x0a, 0x07, 0x75, 0x6e, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x09, 0x20, 0x01, 0x28,
|
||||||
|
0x09, 0x52, 0x07, 0x75, 0x6e, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64,
|
||||||
|
0x18, 0x0a, 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, 0x69, 0x64, 0x22, 0x88, 0x01, 0x0a, 0x0c, 0x4c,
|
||||||
|
0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x63,
|
||||||
|
0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x63,
|
||||||
|
0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x68, 0x6f, 0x6e, 0x65,
|
||||||
|
0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x68, 0x6f, 0x6e, 0x65, 0x12, 0x1a, 0x0a,
|
||||||
|
0x08, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52,
|
||||||
|
0x08, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x49, 0x64, 0x12, 0x2a, 0x0a, 0x10, 0x76, 0x65, 0x72,
|
||||||
|
0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x64, 0x65, 0x18, 0x04, 0x20,
|
||||||
|
0x01, 0x28, 0x09, 0x52, 0x10, 0x76, 0x65, 0x72, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f,
|
||||||
|
0x6e, 0x43, 0x6f, 0x64, 0x65, 0x22, 0x42, 0x0a, 0x09, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65,
|
||||||
|
0x73, 0x70, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28,
|
||||||
|
0x09, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x1f, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72,
|
||||||
|
0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x55,
|
||||||
|
0x73, 0x65, 0x72, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x32, 0x39, 0x0a, 0x05, 0x4c, 0x6f, 0x67,
|
||||||
|
0x69, 0x6e, 0x12, 0x30, 0x0a, 0x05, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x12, 0x13, 0x2e, 0x70, 0x72,
|
||||||
|
0x6f, 0x74, 0x6f, 0x2e, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
|
||||||
|
0x1a, 0x10, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65,
|
||||||
|
0x73, 0x70, 0x22, 0x00, 0x42, 0x0a, 0x5a, 0x08, 0x2e, 0x2f, 0x3b, 0x70, 0x72, 0x6f, 0x74, 0x6f,
|
||||||
|
0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
|
||||||
|
}
|
||||||
|
|
||||||
|
var (
|
||||||
|
file_user_proto_rawDescOnce sync.Once
|
||||||
|
file_user_proto_rawDescData = file_user_proto_rawDesc
|
||||||
|
)
|
||||||
|
|
||||||
|
func file_user_proto_rawDescGZIP() []byte {
|
||||||
|
file_user_proto_rawDescOnce.Do(func() {
|
||||||
|
file_user_proto_rawDescData = protoimpl.X.CompressGZIP(file_user_proto_rawDescData)
|
||||||
|
})
|
||||||
|
return file_user_proto_rawDescData
|
||||||
|
}
|
||||||
|
|
||||||
|
var file_user_proto_msgTypes = make([]protoimpl.MessageInfo, 3)
|
||||||
|
var file_user_proto_goTypes = []interface{}{
|
||||||
|
(*User)(nil), // 0: proto.User
|
||||||
|
(*LoginRequest)(nil), // 1: proto.LoginRequest
|
||||||
|
(*LoginResp)(nil), // 2: proto.LoginResp
|
||||||
|
}
|
||||||
|
var file_user_proto_depIdxs = []int32{
|
||||||
|
0, // 0: proto.LoginResp.user:type_name -> proto.User
|
||||||
|
1, // 1: proto.Login.Login:input_type -> proto.LoginRequest
|
||||||
|
2, // 2: proto.Login.Login:output_type -> proto.LoginResp
|
||||||
|
2, // [2:3] is the sub-list for method output_type
|
||||||
|
1, // [1:2] is the sub-list for method input_type
|
||||||
|
1, // [1:1] is the sub-list for extension type_name
|
||||||
|
1, // [1:1] is the sub-list for extension extendee
|
||||||
|
0, // [0:1] is the sub-list for field type_name
|
||||||
|
}
|
||||||
|
|
||||||
|
func init() { file_user_proto_init() }
|
||||||
|
func file_user_proto_init() {
|
||||||
|
if File_user_proto != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if !protoimpl.UnsafeEnabled {
|
||||||
|
file_user_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
|
||||||
|
switch v := v.(*User); i {
|
||||||
|
case 0:
|
||||||
|
return &v.state
|
||||||
|
case 1:
|
||||||
|
return &v.sizeCache
|
||||||
|
case 2:
|
||||||
|
return &v.unknownFields
|
||||||
|
default:
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
file_user_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
|
||||||
|
switch v := v.(*LoginRequest); i {
|
||||||
|
case 0:
|
||||||
|
return &v.state
|
||||||
|
case 1:
|
||||||
|
return &v.sizeCache
|
||||||
|
case 2:
|
||||||
|
return &v.unknownFields
|
||||||
|
default:
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
file_user_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
|
||||||
|
switch v := v.(*LoginResp); i {
|
||||||
|
case 0:
|
||||||
|
return &v.state
|
||||||
|
case 1:
|
||||||
|
return &v.sizeCache
|
||||||
|
case 2:
|
||||||
|
return &v.unknownFields
|
||||||
|
default:
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
type x struct{}
|
||||||
|
out := protoimpl.TypeBuilder{
|
||||||
|
File: protoimpl.DescBuilder{
|
||||||
|
GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
|
||||||
|
RawDescriptor: file_user_proto_rawDesc,
|
||||||
|
NumEnums: 0,
|
||||||
|
NumMessages: 3,
|
||||||
|
NumExtensions: 0,
|
||||||
|
NumServices: 1,
|
||||||
|
},
|
||||||
|
GoTypes: file_user_proto_goTypes,
|
||||||
|
DependencyIndexes: file_user_proto_depIdxs,
|
||||||
|
MessageInfos: file_user_proto_msgTypes,
|
||||||
|
}.Build()
|
||||||
|
File_user_proto = out.File
|
||||||
|
file_user_proto_rawDesc = nil
|
||||||
|
file_user_proto_goTypes = nil
|
||||||
|
file_user_proto_depIdxs = nil
|
||||||
|
}
|
@ -0,0 +1,89 @@
|
|||||||
|
// Code generated by protoc-gen-micro. DO NOT EDIT.
|
||||||
|
// source: user.proto
|
||||||
|
|
||||||
|
package proto
|
||||||
|
|
||||||
|
import (
|
||||||
|
fmt "fmt"
|
||||||
|
proto "google.golang.org/protobuf/proto"
|
||||||
|
math "math"
|
||||||
|
)
|
||||||
|
|
||||||
|
import (
|
||||||
|
context "context"
|
||||||
|
api "go-micro.dev/v4/api"
|
||||||
|
client "go-micro.dev/v4/client"
|
||||||
|
server "go-micro.dev/v4/server"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Reference imports to suppress errors if they are not otherwise used.
|
||||||
|
var _ = proto.Marshal
|
||||||
|
var _ = fmt.Errorf
|
||||||
|
var _ = math.Inf
|
||||||
|
|
||||||
|
// Reference imports to suppress errors if they are not otherwise used.
|
||||||
|
var _ api.Endpoint
|
||||||
|
var _ context.Context
|
||||||
|
var _ client.Option
|
||||||
|
var _ server.Option
|
||||||
|
|
||||||
|
// Api Endpoints for Login service
|
||||||
|
|
||||||
|
func NewLoginEndpoints() []*api.Endpoint {
|
||||||
|
return []*api.Endpoint{}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Client API for Login service
|
||||||
|
|
||||||
|
type LoginService interface {
|
||||||
|
//rpc 服务
|
||||||
|
Login(ctx context.Context, in *LoginRequest, opts ...client.CallOption) (*LoginResp, error)
|
||||||
|
}
|
||||||
|
|
||||||
|
type loginService struct {
|
||||||
|
c client.Client
|
||||||
|
name string
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewLoginService(name string, c client.Client) LoginService {
|
||||||
|
return &loginService{
|
||||||
|
c: c,
|
||||||
|
name: name,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *loginService) Login(ctx context.Context, in *LoginRequest, opts ...client.CallOption) (*LoginResp, error) {
|
||||||
|
req := c.c.NewRequest(c.name, "Login.Login", in)
|
||||||
|
out := new(LoginResp)
|
||||||
|
err := c.c.Call(ctx, req, out, opts...)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return out, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Server API for Login service
|
||||||
|
|
||||||
|
type LoginHandler interface {
|
||||||
|
//rpc 服务
|
||||||
|
Login(context.Context, *LoginRequest, *LoginResp) error
|
||||||
|
}
|
||||||
|
|
||||||
|
func RegisterLoginHandler(s server.Server, hdlr LoginHandler, opts ...server.HandlerOption) error {
|
||||||
|
type login interface {
|
||||||
|
Login(ctx context.Context, in *LoginRequest, out *LoginResp) error
|
||||||
|
}
|
||||||
|
type Login struct {
|
||||||
|
login
|
||||||
|
}
|
||||||
|
h := &loginHandler{hdlr}
|
||||||
|
return s.Handle(s.NewHandler(&Login{h}, opts...))
|
||||||
|
}
|
||||||
|
|
||||||
|
type loginHandler struct {
|
||||||
|
LoginHandler
|
||||||
|
}
|
||||||
|
|
||||||
|
func (h *loginHandler) Login(ctx context.Context, in *LoginRequest, out *LoginResp) error {
|
||||||
|
return h.LoginHandler.Login(ctx, in, out)
|
||||||
|
}
|
Loading…
Reference in new issue