go微服务项目mvc加注册服务
1.结构目录为下图:
服务配置文件micro-proto
syntax ="proto3";
option go_package = "/proto/cap/;cap";
service Cap {
rpc SayHello(SayRequest) returns(SayResponse) {}
}
message SayRequest {
string message =1;
}
message SayResponse {
string answer =1;
}
注意:生成如下图
2.domain层
user.go
package model
type User struct {
//主键
ID int64 `gorm:"primary_key;not_null;auto_increment"`
//用户名称
UserName string `gorm:"unique_index;not_null"`
//添加需要的字段
FirstName string
//密码
HashPassword string
}
user_repository.go
package reposityory
import (
"github.com/jinzhu/gorm"
"showproto/domain/model"
)
type IUserRepository interface {
//初始化数据表
InitTable () error
//根据用户名称查找用户信息
FindUserByName(s string) (*model.User,error)
//根据用户id查询用户信息
FindUserByID(i int64)(*model.User,error)
//创建用户
CreateUser(user *model.User)(int64,error)
//根据用户ID删除用户
DeleteUserByID(int2 int64) error
//更新用户信息
UpdateUser(user *model.User) error
//查找所有的用户
FindAll() ( []model.User,error)
}
//定义一个类型 数据库的结构体
type UserRepository struct {
mysqlDb *gorm.DB
}
//初始化表
func (u *UserRepository) InitTable() error {
return u.mysqlDb.CreateTable(&model.User{}).Error
}
//创建UserRepository
func NewUserRepository(db *gorm.DB) IUserRepository{
return &UserRepository{mysqlDb:db}
}
//根据名称查找用户
func (u *UserRepository) FindUserByName(name string) (*model.User, error) {
user:=&model.User{}
return user,u.mysqlDb.Where("user_name = ?",name).Find(user).Error
}
//根据用户id查询用户信息
func (u *UserRepository) FindUserByID(id int64) (*model.User, error) {
user:=&model.User{}
return user,u.mysqlDb.Where("id = ?",id).Find(user).Error
}
//创建用户
func (u *UserRepository) CreateUser(user *model.User) (int64, error) {
return user.ID,u.mysqlDb.Create(user).Error
}
//根据用户ID删除用户
func (u *UserRepository) DeleteUserByID(userID int64) error {
user:=&model.User{}
return u.mysqlDb.Where("id =?",userID).Delete(&user).Error
}
//更新用户信息
func (u *UserRepository) UpdateUser(user *model.User) error {
return u.mysqlDb.Model(user).Update(&user).Error
}
//查找所有的用户
func (u *UserRepository) FindAll() (userAll []model.User, er error) {
return userAll,u.mysqlDb.Find(&userAll).Error
}
user_data_service.go
package service
import (
"errors"
"golang.org/x/crypto/bcrypt"
"showproto/domain/model"
"showproto/domain/reposityory"
)
type IUserDataService interface {
//添加用户
AddUser(user *model.User)(userId int64, err error)
//删除
DeleteUser(int64) error
//更新
UpdateUser(user *model.User,isChangePwd bool) (err error)
//查询
FindUserByName(string2 string) (*model.User,error)
//核对账号密码是否正确
CheckPwd(userName string,pwd string)(isOk bool,err error)
}
//新建实例
func NewUserDataService(userRepository reposityory.IUserRepository) IUserDataService {
return &UserDataService{UserRepository:userRepository}
}
//新建结构体 是由UserRepository
type UserDataService struct {
UserRepository reposityory.IUserRepository
}
//加密用户 密码
func GeneratePassword(userPassword string) ([]byte,error) {
return bcrypt.GenerateFromPassword([]byte(userPassword),bcrypt.DefaultCost)
}
//验证用户密码
func ValidatePassword(userPassword string,hashed string) (isOk bool,err error) {
if err:=bcrypt.CompareHashAndPassword([]byte(hashed),[]byte(userPassword));err!=nil{
return false,errors.New("密码比对错误")
}
return true,nil
}
//添加用户
func (u UserDataService) AddUser(user*model.User) (userId int64, err error) {
//加密
pwdByte,err:= GeneratePassword(user.HashPassword)
if err!=nil{
return user.ID,err
}
user.HashPassword=string(pwdByte)
return u.UserRepository.CreateUser(user)
}
//删除
func (u UserDataService) DeleteUser(userID int64) error {
return u.UserRepository.DeleteUserByID(userID)
}
//更新
func (u UserDataService) UpdateUser(user *model.User, isChangePwd bool) (err error) {
//判断是否更新密码
if isChangePwd {
pwdByte,err:=GeneratePassword(user.HashPassword)
if err!=nil{
return err
}
user.HashPassword=string(pwdByte)
}
return u.UserRepository.UpdateUser(user)
}
//查询
func (u UserDataService) FindUserByName(userName string) (user *model.User, err error) {
return u.UserRepository.FindUserByName(userName)
}
//核对账号密码是否正确
func (u UserDataService) CheckPwd(userName string, pwd string) (isOk bool, err error) {
user,err:= u.UserRepository.FindUserByName(userName)
if err!=nil{
return false,err
}
//如果没有错验证一下
return ValidatePassword(pwd,user.HashPassword)
}
handler暴露接口
package handler
import (
"context"
"showproto/domain/model"
"showproto/domain/service"
"showproto/proto/user"
)
//接口开发
type User struct {
UserDataService service.IUserDataService
}
//注册
func (u *User) Register(ctx context.Context,userRegisterRequest *user.UserRegisterRequest,userRegisterResponse *user.UserRegisterResponse) error {
UserRegister:=&model.User{
UserName: userRegisterRequest.UserName,
FirstName: userRegisterRequest.FirstName,
HashPassword: userRegisterRequest.Pwd,
}
_,err:= u.UserDataService.AddUser(UserRegister)
if err!=nil{
return err
}
userRegisterResponse.Message="注册成功"
return nil
}
//登录
func (u *User) Login(ctx context.Context,userLoginRequest *user.UserLoginRequest,userLoginResponse *user.UserLoginResponse) error {
//核对密码
isOk,err:= u.UserDataService.CheckPwd(userLoginRequest.UserName,userLoginRequest.Pwd)
if err!=nil{
return err
}
userLoginResponse.IsSuccess=isOk
return nil
}
//查询用户信息 根据用户名查找
func (u *User) GetUserInfo(ctx context.Context,userInfoRequest *user.UserInfoRequest,userInfoResponse *user.UserInfoResponse) error {
userInfo,err:= u.UserDataService.FindUserByName(userInfoRequest.UserName)
if err!=nil{
return err
}
userInfoResponse= UserForResponse(userInfo)
return nil
}
//类型转化
func UserForResponse(userModel *model.User) *user.UserInfoResponse {
response:= &user.UserInfoResponse{}
response.UserName=userModel.UserName
response.FirstName=userModel.FirstName
response.UserId=userModel.ID
return response
}
入口hanshu
package main
import (
"fmt"
"github.com/jinzhu/gorm"
"github.com/micro/go-micro/v2"
"showproto/domain/reposityory"
service2 "showproto/domain/service"
"showproto/handler"
"showproto/proto/user"
_ "github.com/jinzhu/gorm/dialects/mysql"
)
func main() {
//创建新的服务
service:=micro.NewService(
micro.Name("cap.imooc.user"),
micro.Version("latest"),
)
//初始化方法
service.Init()
//创建数据库连接
db, err := gorm.Open("mysql", "root:123456@/imooc?charset=utf8&parseTime=True&loc=Local")
if err!=nil{
fmt.Println("数据库连接失败")
}
fmt.Println("数据库连接成功")
defer db.Close()
db.SingularTable(true) //设置复数
//只执行一次初始化数据表
//把数据库传给NewUserRepository 进行初始化
//rp:=reposityory.NewUserRepository(db)
//rp.InitTable()
userDataService:= service2.NewUserDataService(reposityory.NewUserRepository(db))
//注册服务
err= user.RegisterUserHandler(service.Server(),&handler.User{UserDataService:userDataService})
if err!=nil{
fmt.Println(err)
}
//注册服务
//imooc.RegisterCapHandler(service.Server(),new(CapServer))
//运行服务
if err:=service.Run();err!=nil{
fmt.Println(err)
}
}
配置dockerfile
Dockerfile
FROM alpimne
ADD showproto /showproto
ENTRYPOINT ["/showproto"]
打包命令编译到linux
set GOARCH=amd64
set GOOS=linux
go build
在Docker里面制作镜像
sudo docker build -t showproto:latest .
在Docker里面运行该镜像
docker run -d showproto