当前位置: 首页 > news >正文

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

 

 

 

 

 

 

相关文章:

  • 会员登陆的检测代码
  • win7下面consul安装
  • uniapp中使用oss
  • 回到学校--继续奋斗
  • uniapp多input提交
  • 游戏
  • flutter的provider4.0使用
  • 关于给CSDNBLOG添加计数器
  • 制作自定义CSDNBLOG皮肤
  • 仿知乎ui实现bottomNavigationBar
  • 高效CSDNBLOG技巧终结篇
  • 给BLOG加一个控制菜单展开和收缩的按扭
  • 在自己Blog的导航菜单加动态摄影作品展
  • 给自己的BLOG加一个不用注册申请的计数计。
  • flutter轮播图swiper
  • SegmentFault for Android 3.0 发布
  • “大数据应用场景”之隔壁老王(连载四)
  • 77. Combinations
  • ComponentOne 2017 V2版本正式发布
  • Electron入门介绍
  • HomeBrew常规使用教程
  • 简单易用的leetcode开发测试工具(npm)
  • 解决jsp引用其他项目时出现的 cannot be resolved to a type错误
  • 前端每日实战:70# 视频演示如何用纯 CSS 创作一只徘徊的果冻怪兽
  • 小程序、APP Store 需要的 SSL 证书是个什么东西?
  • 一文看透浏览器架构
  • Salesforce和SAP Netweaver里数据库表的元数据设计
  • 关于Android全面屏虚拟导航栏的适配总结
  • ​LeetCode解法汇总2182. 构造限制重复的字符串
  • (14)Hive调优——合并小文件
  • (3)llvm ir转换过程
  • (C++)八皇后问题
  • (三)centos7案例实战—vmware虚拟机硬盘挂载与卸载
  • (学习日记)2024.01.09
  • (正则)提取页面里的img标签
  • (转)C语言家族扩展收藏 (转)C语言家族扩展
  • (转)Sublime Text3配置Lua运行环境
  • (转)从零实现3D图像引擎:(8)参数化直线与3D平面函数库
  • (转载)Linux 多线程条件变量同步
  • .NET 4 并行(多核)“.NET研究”编程系列之二 从Task开始
  • .NET 设计模式—简单工厂(Simple Factory Pattern)
  • .NET/C# 中你可以在代码中写多个 Main 函数,然后按需要随时切换
  • .NET框架类在ASP.NET中的使用(2) ——QA
  • @ConditionalOnProperty注解使用说明
  • @ConfigurationProperties注解对数据的自动封装
  • @selector(..)警告提示
  • [].slice.call()将类数组转化为真正的数组
  • [8-27]正则表达式、扩展表达式以及相关实战
  • [AIGC] Redis基础命令集详细介绍
  • [BZOJ 3531][Sdoi2014]旅行(树链剖分+线段树)
  • [BZOJ1008][HNOI2008]越狱
  • [CCIE历程]CCIE # 20604
  • [LeetCode] NO. 387 First Unique Character in a String
  • [Linux_IMX6ULL驱动开发]-基础驱动
  • [Loadrunner参数化]一个文件输两列参数的取值