首页 > 其他分享 >gozero-商城之用户微服务构建

gozero-商城之用户微服务构建

时间:2023-09-08 17:12:30浏览次数:34  
标签:COMMENT gozero 服务 string DEFAULT rpc 构建 user 商城

一:商城微服务简介

该商城主要包括的微服务有:购物车、首页、订单服务、支付服务、用户服务、商品服务,主要采用的是go-zero来实现

商城的思维导图如下

 

 

从以上思维导图可以看出,我们根据业务职能做如下微服务的划分:

  商品服务(product) - 商品的添加、信息查询、库存管理等功能
  购物车服务(cart) - 购物车的增删改查、收藏等功能
  订单服务(order) - 生成订单,订单管理等功能
  支付服务(pay) - 通过调用第三方支付实现支付等功能
  账号服务(user) - 用户信息、实名认证、账号设置、地址管理等功能
  首页服务(home) - 首页商品推荐、排行榜、限时开抢、banner等功能
  每个服务都可以再分为 api 服务和 rpc 服务。

  api 服务对外,可提供给 app 调用。

  rpc 服务是对内的,可提供给内部 api 服务或者其他 rpc 服务调用。
整个项目的流程大致如下:

  

 

 

二:项目目录结构创建

 

二用户表设计及Model开发

 

 

CREATE TABLE `user` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '用户ID',
`userIdentity` varchar(255) DEFAULT '' COMMENT '用户唯一标识',
`userName` varchar(50) NOT NULL DEFAULT '' COMMENT '用户名',
`passWord` varchar(50) NOT NULL DEFAULT '' COMMENT '用户密码,MD5加密',
`userNick` varchar(100) DEFAULT '' COMMENT '用户昵称',
`userFace` varchar(255) DEFAULT '' COMMENT '用户头像地址',
`UserSex` tinyint(1) DEFAULT '0' COMMENT '用户性别:0男,1女,2保密',
`userEmail` varchar(255) DEFAULT '' COMMENT '用户邮箱',
`userPhone` varchar(20) NOT NULL DEFAULT '' COMMENT '手机号',
`loginAddress` varchar(255) DEFAULT '' COMMENT '用户登录IP地址',
`create_time` timestamp default CURRENT_TIMESTAMP not null comment '创建时间',
`update_time` timestamp default CURRENT_TIMESTAMP not null on update CURRENT_TIMESTAMP comment '更新时间',
PRIMARY KEY (`id`),
UNIQUE KEY `userName` (`userName`),
UNIQUE KEY `userPhone` (`userPhone`),
KEY `updateTime` (`updateTime`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户表';
用户MODEL生成
把目录切换到user/model目录下,然后在终端运行如下命令
goctl model mysql ddl -src user.sql -d -dir .

运行完后在model目录会看到如下内容


 三:用户RPC接口生成

1.编写proto文件
在rpc目录下建立account.proto文件
syntax = "proto3";

package account;

option go_package = "./account";

message RegisterReq{
string UserName = 1;
string PassWord = 2;
string UserNick = 3;
string UserFace = 4;
int64 UserSex = 5;
string UserEmail = 6;
}

message LoginReq{
string UserName = 1;
string PassWord = 2;
}

message CommonResply{
int64 Code = 1;
string Message = 2;
string Data = 3;
}

message UserInfoReq{
string UserIdentity = 1;
}

service user{
rpc Register(RegisterReq) returns(CommonResply);
rpc Login(LoginReq) returns(CommonResply);
rpc UserInfo(UserInfoReq) returns (CommonResply);
}
这时候在这个目录下运行这个命令
goctl rpc protoc account.proto --go_out=./types --go-grpc_out=./types --zrpc_out=. -style go-zero

 就会生成相应的RPC 文件,生成后的目录如下

 2.rpc配置

 (1)修改rpc/etc下的account.yml增加相应的配置

 (2)在internal目录下的config.go建立相应的配置

 (3)在internal目录下的loginc目录编写相应接口的逻辑

登录接口的代码如下:

  

package logic

import (
"context"
"encoding/json"
"github.com/golang-jwt/jwt/v4"
"microshop/user/model"
"microshop/user/rpc/user"
"time"

"microshop/user/api/internal/svc"
"microshop/user/api/internal/types"

"github.com/zeromicro/go-zero/core/logx"
)

type LoginLogic struct {
logx.Logger
ctx context.Context
svcCtx *svc.ServiceContext
}

func NewLoginLogic(ctx context.Context, svcCtx *svc.ServiceContext) *LoginLogic {
return &LoginLogic{
Logger: logx.WithContext(ctx),
ctx: ctx,
svcCtx: svcCtx,
}
}

func (l *LoginLogic) Login(req *types.LoginReq) (resp *types.CommonResply, err error) {
// todo: add your logic here and delete this line
cnt, cntErr := l.svcCtx.Rpc.Login(l.ctx, &user.LoginReq{
UserName: req.UserName,
PassWord: req.Password,
})
if cntErr != nil {
return nil, cntErr
}
var userData model.User
userErr := json.Unmarshal([]byte(cnt.Data), &userData)
if userErr != nil {
return nil, userErr
}

//jwt
payloads := make(map[string]any)
payloads["userIdentity"] = userData.UserIdentity

accessToken, tokenErr := l.GetToken(time.Now().Unix(), l.svcCtx.Config.Auth.AccessSecret, payloads, l.svcCtx.Config.Auth.AccessExpire)
if tokenErr != nil {
return nil, tokenErr
}

return &types.CommonResply{
Code: cnt.Code,
Message: cnt.Message,
Data: accessToken,
}, nil
}
func (l *LoginLogic) GetToken(iat int64, secretKey string, payloads map[string]any, seconds int64) (string, error) {
claims := make(jwt.MapClaims)
claims["expTime"] = iat + seconds
claims["iat"] = iat
for k, v := range payloads {
claims[k] = v
}
token := jwt.New(jwt.SigningMethodHS256)
token.Claims = claims
return token.SignedString([]byte(secretKey))
}

标签:COMMENT,gozero,服务,string,DEFAULT,rpc,构建,user,商城
From: https://www.cnblogs.com/lisus2000/p/17688080.html

相关文章

  • 智能视频与分析技术构建可视化消防风险预警视频监控平台EasyCVR
    TSINGSEE青犀视频提出了智慧消防解决方案,以多维感知、数据共享和业务联动为理念,旨在改善消防安全管理。通过整合消防与安防资源,利用视频监控和智能分析技术实时监测火灾风险,并提供火灾报警和现场视频资料供消防人员快速响应和处置。该方案还支持数据可视化,以直观方式展示火灾风险状......
  • 视频汇聚平台EasyCVR于安防监控住宅领域的构建中可以起到怎样的作用?
    随着时代发展,物质水平的逐渐丰富,人们越来越享受足不出户就可以享用各种便利。AI+住宅是将人工智能应用于住宅建造、销售和管理服务中的一种创新模式。这种模式包括建筑施工、物业管理和老旧建筑改造等方面。今天我们要探讨如何以云边架构为基础,利用数智体系应用能力为核心,围绕地产......
  • 安防视频监控平台EasyCVR平台+AI智能分析助力构建智慧城市
    EasyCVR平台的智能分析功能在构建智慧城市方面发挥了重要作用。安防行业已经参与智慧城市建设十多年,经历了摸索和探索的阶段。从数字城市到平安城市再到现在的智慧城市,绿色、智能、安全成为智慧城市建设的主题,并在中国迅速发展。EasyCVR通过TSINGSEE青犀视频打造的安防视频云服务,支......
  • 直播商城源码,d3.js svg中的text字体大小设置
    直播商城源码,d3.jssvg中的text字体大小设置svg的text有一个font-size属性 <textx="5"y="25"fill="red"font-size="30">A</text>  ​用d3.v4.js设置  svg.append("text")   .attr("y",25)   .attr(&quo......
  • 构建自定义美颜应用:全局美颜SDK的开发指南
    美颜技术已经成为许多应用程序和平台的标配之一,为用户提供了改善外观的机会。为了在你的应用中提供自定义的美颜功能,你可以考虑使用全局美颜SDK。本文将向你介绍如何构建自定义美颜应用,以及开发全局美颜SDK的关键步骤和技巧。一、明确需求和目标在开始之前,你需要明确你的美颜应用的......
  • 数字化标准工时与标准工时库的构建与应用
    在当今的制造业环境中,对于生产过程的精细化管理以及对生产效率的追求已经成为了企业持续发展的关键。在这个背景下,数字化标准工时和标准工时库的构建与应用成为了企业实现精益生产的重要工具。首先,让我们理解一下什么是数字化标准工时。数字化标准工时,是指通过计算机软件系统,将标准......
  • 【HTTP爬虫ip实操】智能路由构建高效稳定爬虫系统
    在当今信息时代,数据的价值越来越受到重视。对于许多企业和个人而言,网络爬取成为了获取大量有用数据的关键手段之一。然而,在面对反爬机制、封锁限制以及频繁变动的网站结构时,如何确保稳定地采集所需数据却是一个不容忽视且具挑战性的问题。幸运的是,我们可以利用现代技术中强大工具—......
  • 构建全栈安全防护体系,华为云828营销季助力企业打好上云实战
    近年来,云计算等技术蓬勃发展,成为企业数字化转型的重要技术基石。在数据高速增长的同时,数据价值与数据安全问题也在逐步显现。为助力中小企业把好安全关,以“选择华为云,省力更省心”为主题的华为云828营销季带来网站安全、数据灾备、网站高可用等解决方案,为企业筑好数据安全的第一道......
  • Rust项目使用Dockerfile构建镜像 访问crates.io下载速度慢解决
    在$CARGO_HOME/config文件添加国内的镜像源下面的镜像源来自:https://rsproxy.cn/FROMrust:1.72asbuilderWORKDIR/usr/srcCOPY..RUNecho"[source.crates-io]\n\replace-with='rsproxy-sparse'\n\[source.rsproxy]\n\registry=\"https://rs......
  • 高性能存储 SIG 月度动态:erofs 新增支持多个重要特性,持续构建容器场景竞争力
    高性能存储 SIG(SpecialInterestGroup)目标:存储领域的发展历程,本质上是存储介质与软件栈相互促进发展的过程。高性能存储SIG致力于存储栈性能挖掘,当前主要聚焦内核io_uring技术优化异步IO性能,使用持久化内存提升业务单成本性能,容器场景存储技术优化等课题。高性能存储SIG......