首页 > 其他分享 >2024 go-zero社交项目实战

2024 go-zero社交项目实战

时间:2024-09-21 21:52:35浏览次数:12  
标签:comment -- 2024 zero user go message 推文

背景

一位商业大亨,他非常看好国内的社交产品赛道,想要造一款属于的社交产品,于是他找到了负责软件研发的小明。 小明跟张三一拍即合,小明决定跟张三大干一番。

社交产品MVP版本需求

MVP指:Minimum Viable Product,即最小可行产品

张三希望以最快的时间看到一款属于自己的社交产品,于是有了接下来的需求。

1.用户服务--已完成

注册、登录、查看个人信息、更新个人信息、注销功能

2.推文服务

发布推文、查看推文、更新推文、删除推文、我的推文列表

用户服务详细需求

张三跟小明很快就赶出了MVP版的用户服务的详细需求

1.注册功能。
支持账号密码注册功能:
  • 账号6-16位,支持数字大小写不敏感的字母和特殊字符_且必须是英文字符开头
  • 密码必须8-32位,支持数字大小写敏感的字母
2.登录功能。
  • 支持账号密码登录功能
3.更新个人信息功能。
  • 支持更新的信息:头像、昵称、个性签名、性别、地区
4.查看个人信息功能。
  • 查看个人的信息:头像、昵称、个性签名、性别、地区
5.注销功能。
  • 注销功能:申请注销后,7天内没有登录,则把账号注销
  • 查看已注销的用户信息时,昵称显示已注销,头像设置展示为默认的官方头像

推文服务详细需求

张三跟小明很快就赶出了MVP版的推文系统的详细需求:

功能1:推文
  • 发表推文。推文最大长度限制10000字符,标题可选,推文必填
  • 查看推文。展示的信息字段:标题、内容、时间(优先展示编辑时间,其次发表时间)
  • 更新推文。支持更新的字段:标题、推文。标题可选,推文必填
  • 删除推文。真实删除,从数据库中移除数据
  • 我的推文列表。查看已经发表过的推文,按发表时间排序排列
功能2:互动
  • 浏览推文。浏览推文按计算方式:每篇推文,点击进入详情累计加1,同一用户24小时内浏览多次,只累计加1
  • 点赞推文。点赞数计算方式:用户点赞+1,取消点赞-1
  • 评论推文
    • 无限层级评论
    • 评论数计算方式:所有能展示的评论数量。比如有1条评论,这条评论有3条子评论,评论的总数量是4.如果删除这条评论,那么评论的总数量是0
  • 分享推文。分享数计算方式:每篇推文,分享累计加1,同一用户24小时内分享多次,只累计加1
  • 收藏推文。点赞数计算方式:用户点赞+1,取消点赞-1

开发环境的搭建

0.安装go语言,推荐使用1.22以上的版本

1.安装goctl,用于提升效率,生成各种代码

go install github.com/zeromicro/go-zero/tools/goctl@latest

2.安装protoc,微服务grpc需要用到的组件

goctl env check --install --verbose --force

3.mysql

docker run -p 3306:3306 --name test-mysql -v mysql:/var/lib/mysql/ -e MYSQL_ROOT_PASSWORD=123456 -d mysql:latest

4.redis

docker run -d --name redis -p 6379:6379 redis

5.etcd


# etcd服务
docker network create demo-network --driver bridge
docker run -d --name etcd-server --network demo-network --publish  2379:2379 --publish  2380:2380 --env ALLOW_NONE_AUTHENTICATION=yes --env ETCD_ADVERTISE_CLIENT_URLS=http://etcd-server:2379 bitnami/etcd:latest
# 检查etcd容器ip
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' etcd-server
# (可选)etcd keeper http://127.0.0.1:8080/
docker run -d -p 8080:8080 -e ETCD_SERVERS=http://172.18.0.2:2379 --network=demo-network --name etcd-keeper evildecay/etcdkeeper

实现用户服务

1.注册功能
支持账号密码注册:
  • 账号6-16位,支持数字大小写不敏感的字母和特殊字符_且必须是英文字符开头
  • 密码必须8-32位,支持数字大小写敏感的字母
  • 支持账号密码登录功能
2.登录功能
  • 如果该用户申请注销账号了,登录后自动取消注销
3.个人信息。包含查看、更新
  • 查看/更新的个人信息:头像、昵称、个性签名(255字符以内)、性别、地区

4.注销账号功能

  • 注销功能:申请注销后,7天内没有登录,则把账号注销
  • 查看已注销的用户信息时,昵称显示已注销,头像设置展示为默认的官方头像


初始化user服务

# 初始化user rpc服务
goctl rpc new user
# 安装依赖
go mod tidy
create table user
(
    id         bigint auto_increment comment '主键id'
        primary key,
    avatar     varchar(255) default '' not null comment '头像链接地址',
    nickname   char(32)     default '' not null comment '昵称',
    account    char(32)     default '' not null comment '账号',
    password   char(32)     default '' not null comment '密码',
    bio        varchar(255) default '' not null comment '个人简介 Biography',
    gender     tinyint      default 2  not null comment '性别 0 女 1 男 2 未知',
    region     varchar(20)  default '' not null comment '地区',
    status     tinyint      default 0  not null comment '用户状态0 正常 1 注销中 2 已注销',
    created_at int          default 0  not null comment '创建时间',
    updated_at int          default 0  not null comment '更新时间',
    deleted_at int          default 0  not null comment '删除时间',
    constraint user_pk
        unique (account)
)
    comment '用户表' collate = utf8mb4_bin;
# 项目根目录下执行
# 加上 -c 参数可生成集成缓存的model代码
# --ignore-columns -i 忽略字段控制
goctl model mysql datasource -url="root:123456@tcp(127.0.0.1:3306)/go_zero_demo" -table="user"  -dir="./user/model" --ignore-columns -i

user服务功能实现

定义proto
syntax = "proto3";

package user;
option go_package="./user";


message UserInfo {
  int64 UserId  = 1;        // 主键id
  string Avatar = 2;     // 头像链接地址
  string Nickname  = 3;  // 昵称
  string Account    = 4; // 账号
  string Password  = 5; // 密码
  string Bio       = 6; // 个人简介 Biography
  int64 Gender     = 7; // 性别 0 女 1 男 2 未知
  string Region     = 8; // 地区
  int64 Status     = 9; // 地区
  int64 CreatedAt = 10; // 创建时间
  int64 UpdatedAt = 11; //更新时间
}

message RegisterReq {
  string Account = 1; // 自定义账号
  string Password = 2; // 密码
}
message RegisterResp {
  int64 UserId = 1; // 用户ID
}

message LoginReq {
  string Account = 1; // 自定义账号
  string Password = 2; // 密码
}
message LoginResp {
  string SessionId = 1; // 用户登录标识
}

message CancellationReq {
  int64 UserId = 1; // 用户ID
}
message CancellationResp {}

message GetUsersReq {
  int64 UserId = 1; // 用户ID
}
message GetUsersResp {
  UserInfo UserInfo = 1;
}

message UpdateUserReq {
  UserInfo UserInfo = 1;
}
message UpdateUserResp {}

service User {
  // 注册
  rpc Register(RegisterReq) returns(RegisterResp);
  // 登录
  rpc Login(LoginReq) returns(LoginResp);
  // 注销
  rpc Cancellation(CancellationReq) returns(CancellationResp);
  // 查用户信息
  rpc GetUsers(GetUsersReq) returns(GetUsersResp);
  // 更新用户信息
  rpc UpdateUser(UpdateUserReq) returns(UpdateUserResp);
}
# 项目根目录下执行
goctl rpc protoc user/user.proto --go_out=./user --go-grpc_out=./user --zrpc_out=./user
1.注册功能
功能逻辑代码::./user/internal/logic/registerlogic.go
测试代码::./user/internal/logic/registerlogic_test.go
2.登录功能
功能逻辑代码::./user/internal/logic/loginlogic.go
测试代码::./user/internal/logic/loginlogic.go
3.注销功能
功能逻辑代码::./user/internal/logic/cancellationlogic.go
测试代码::./user/internal/logic/cancellationlogic_test.go
4.个人信息
查看个人信息
功能逻辑代码::./user/internal/logic/getuserslogic.go
测试代码::./user/internal/logic/getuserslogic_test.go
更新个人信息
功能逻辑代码::./user/internal/logic/updateuserlogic.go
测试代码::./user/internal/logic/updateuserlogic_test.go

实现推文服务

初始化推文post服务

goctl rpc new user
go mod tidy
create table post
(
  id         bigint auto_increment comment '主键id',
  user_id    bigint   				 			 not null comment '用户id',
  title      varchar(255) default '' not null comment '标题',
  content    text         					 not null comment '推文内容',
  status     tinyint      default 0  not null comment '状态 0 正常 1 已删除',
  views      int          default 0  not null comment '浏览数',
  likes      int          default 0  not null comment '点赞数',
  comments   int          default 0  not null comment '评论数',
  shares     int          default 0  not null comment '分享数',
  collects   int          default 0  not null comment '收藏数',
  created_at int          default 0  not null comment '发表时间',
  updated_at int          default 0  not null comment '更新时间',
  deleted_at int          default 0  not null comment '删除时间',
  constraint post_pk
  primary key (id)
)
    comment '推文表' collate = utf8mb4_bin;
# 项目根目录下执行
# 加上 -c 参数可生成集成缓存的model代码
# --ignore-columns -i 忽略字段控制
goctl model mysql datasource -url="root:123456@tcp(127.0.0.1:3306)/go_zero_demo" -table="post"  -dir="./post/model" --ignore-columns -i

post服务功能实现

定义proto
syntax = "proto3";

package post;
option go_package="./post";

// 定义实体结构
message PostData {
  int64 Id = 1; // id
  string Title = 2; // 标题
  string Content = 3; // 内容
  int64 Views = 4; // 查看数
  int64 Likes = 5; // 喜欢数
  int64 Comments = 6; // 评论数
  int64 Shares = 7; // 分享数
  int64 Collects = 8; // 收藏数

}

message CreatePostReq {
  PostData PostData = 1;
}

message CreatePostResp {}

message UpdatePostReq {
  PostData PostData = 1;
}

message UpdatePostResp {}

message DeletePostReq {
  int64 PostId = 1;
}

message DeletePostResp {}

message GetPostReq {
  int64 PostId = 1;
}

message GetPostResp {}

message BatchPostReq {
  repeated int64 PostId = 1;
}

message BatchPostResp {
  repeated PostData Infos = 1;
}

message GetUserPostListReq {
  int64 UserId = 1; // 用户ID
}

message GetUserPostListResp {
  repeated PostData Infos = 1;
}

service Post {
  // 发表推文
  rpc CreatePost(CreatePostReq) returns(CreatePostResp);
  // 更新推文
  rpc UpdatePost(UpdatePostReq) returns(UpdatePostResp);
  // 删除推文
  rpc DeletePost(DeletePostReq) returns(DeletePostReq);
  // 获取单条推文
  rpc GetPost(GetPostReq) returns(GetPostResp);
  // 批量获取推文
  rpc BatchPost(BatchPostReq) returns(BatchPostResp);
  // 用户用户推文列表
  rpc GetUserPostList(GetUserPostListReq) returns(GetUserPostListResp);
}
# 项目根目录下执行
goctl rpc protoc post/post.proto --go_out=./post --go-grpc_out=./post --zrpc_out=./post
1.发表推文功能
功能逻辑代码::./post/internal/logic/createpostlogic.go
测试代码::./post/internal/logic/createpostlogic_test.go
2.查看推文功能
功能逻辑代码::./post/internal/logic/getpostlogic.go
测试代码::./post/internal/logic/getpostlogic_test.go
3.更新推文功能
功能逻辑代码::./post/internal/logic/updatepostlogic.go
测试代码::./post/internal/logic/updatepostlogic_test.go
4.删除推文功能
功能逻辑代码::./post/internal/logic/deletepostlogic.go
测试代码::./post/internal/logic/deletepostlogic_test.go
5.查看用户推文列表功能
功能逻辑代码::./post/internal/logic/getuserpostlistlogic.go
测试代码::./post/internal/logic/getuserpostlistlogic_test.go

实现API服务

初始化bff服务

goctl api new bff

# 生成api代码
goctl api go -api ./bff/bff.api -dir ./bff/

其它

1.跨域配置

func StartHttpServer(configFile *string) {
    var c config.Config
    conf.MustLoad(*configFile, &c)

    server := rest.MustNewServer(c.RestConf, rest.WithCustomCors( //跨域处理
        func(header http.Header) {
            header.Set("Access-Control-Allow-Origin", "*")
            header.Set("Access-Control-Allow-Headers", "*")
            header.Set("Access-Control-Allow-Methods", "POST,OPTIONS")
            header.Set("Access-Control-Allow-Credentials", "true")
        }, nil, "*"))
    defer server.Stop()
    ……
    server.Start()
}

2.服务依赖配置

UserRpcConf:
  Etcd:
    Key: dev.user.rpc
# 默认是两秒
  Timeout: 4500 
# 当值为 true 时,不会阻塞 rpc 链接
  NonBlock: false

弱依赖可配置为 true,否则初始化rpc的时候会报以下错误

rpc dial: etcd://127.0.0.1:2379/dev.user.rpc, error: context deadline exceeded, make sure rpc service "dev.user.rpc" is already started

标签:comment,--,2024,zero,user,go,message,推文
From: https://blog.csdn.net/qq_33665793/article/details/142370325

相关文章

  • The 2024 ICPC Asia EC Regionals Online Contest (II)
    目录写在前面F签到A枚举J贪心I构造,二进制L数学,三分G数学,辗转相除E结论,最短路写在最后写在前面补题地址:https://codeforces.com/gym/105358。以下按个人向难度排序。妈的7题秒完剩下的题感觉没一个能做的。F签到#include<bits/stdc++.h>#definelllonglongcon......
  • 2024年最新全国计算机二级WPS学习资料共享(小黑课堂)
    2024年9月份最新的全国计算机二级WPS学习资料共享(小黑课堂)真题视频解析-10套:作业讲解:WPS选择题公共基础讲解:直播课和笔记:获取方式:资料获取链接如下:下载链接:https://mp.weixin.qq.com/s/NaYkzGTALGdcbgd2x81A7Q......
  • UNIQUE VISION Programming Contest 2024 Autumn (AtCoder Beginner Contest 372)
    总结(我的塘人局):单调栈是忘得差不多了 A-delete.题意:输出删除所有'.'的字符串思路:遍历输出不是'.'复杂度:O(n) Code:#include<bits/stdc++.h>usingnamespacestd;usingLL=longlong;usingi64=int64_t;voidsolve(){strings;cin......
  • kimi智能助手1.4.5,2024-09-21,什么是大语言模型(LLM)?
    大语言模型(LargeLanguageModels,简称LLM)是指通过深度学习技术训练出的、具有大量参数的语言处理模型。这些模型通常使用大量的文本数据进行训练,以学习语言的模式和结构,从而能够理解和生成自然语言。大语言模型的特点包括:参数众多:大语言模型通常拥有数十亿甚至数千亿个参数,这......
  • 2024年最新MS OFFICE计算机二级学习资料分享(小黑课堂)
    今天不学习,明天变垃圾。各位长方体移动工程师大家好!小白有一份珍贵的24年最新MSOFFICE计算机二级学习资料分享给大家,正所谓“少壮不努力,长大去工地”,只有学习才能出人头地。24年最新小黑课堂MSOFFICE计算机二级资料内容安装包内容:39套真题内容:考点精讲内容:为了让大家沉迷学习无法......
  • 讯飞星火大语言模型,2024-09-21,什么是提示词(prompt)?
    prompt是一种在人工智能领域中用于指导模型生成特定输出的输入文本或指令。以下是对它的详细介绍:基本概念:prompt是指向AI模型提供输入以引导其生成特定输出的文本或指令。它的目的是引导模型产生所需的回应,以便更好地控制生成的输出[1]。历史起源:prompt这个词源自拉丁语“promp......
  • 文心一言,文心大模型4.0 Turbo,2024-09-21,什么是提示工程(prompt engineering)?
    PromptEngineering,即提示工程,是自然语言处理(NLP)领域中的一个重要概念,它指的是通过设计精心构造的提示(prompt)或输入,来引导大型语言模型生成特定类型的输出。这个技术背后的原理是利用模型对输入的敏感性,通过提供特定格式或内容的提示,引导模型生成符合预期的输出。一、定义与原理......
  • 【2024华为杯A题】风电场有功功率优化分配A题思路+代码+论文
    订阅本专栏,认真钻研,保省级及以上奖项!若无获奖,本博主免费提供任意两份本博客初级版专栏代码!......
  • 20240921全国计算机二级Python考试(大头博士计算二级)
    一、背景需求:20240921我在上海应用技术大学44号楼考场参加2024年9月的全国计算机二级(Python语言程序设计)考试。时隔多年,再次来到大学校园,恍若隔世扫码找考场在哪里考场须知1、进考场,先刷身份证刷脸核对2、进入机房前,上厕所,手机关闭闹钟后关机,放到包里,身上有蓝......
  • CSP-J 2024 入门组初赛第一轮初赛试题及答案解析
    CSP-J2024入门组初赛第一轮初赛试题及答案解析一、单项选择题(共15题,每题2分,共计30分:每题有且仅有一个正确选项)132位int类型的存储范围是()A-2147483647~+2147483647B-2147483647~+2147483648C-2147483648~+2147483647D-2147483648~+2147483648答案C......