2024 go-zero社交项目实战

news2024/9/20 1:57:08

背景

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

社交产品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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2147569.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java自定义集合-基于文件的泛型列表 LocalFileArrayList

Java实现基于文件的泛型列表 LocalFileArrayList 简介核心概念泛型文件操作实现细节构造函数读取和写入文件类型转换List 接口方法实现总结调用示例完整代码简介 LocalFileArrayList我自己随便起的,没怎么思考,不一定是最适合的名字。搞这东西主要是有些需求用到的数据量太大…

95分App引领年轻人省钱赚钱新风尚,闲置也能变宝藏

随着时代的发展,年轻一代的消费观念正经历着深刻的变革。他们不再盲目追求新品、奢侈品,而是喜欢上购买闲置物品来满足日常所需。在消费的同时,加入了卖家的行列。对自己拥有的闲置物品开启“断舍离”,纷纷在闲置平台进行售卖。这…

鸿蒙媒体开发系列05——音频并发播放管理与音量管理

如果你也对鸿蒙开发感兴趣,加入“Harmony自习室”吧!扫描下方名片,关注公众号,公众号更新更快,同时也有更多学习资料和技术讨论群。 1、多音频播放的并发管理 多音频并发,即多个音频流同时播放。此场景下&…

GAMES104:15 游戏引擎的玩法系统基础-学习笔记

文章目录 0,游戏性课程框架一,事件机制1.1 事件的定义1.2 callback的注册1.3 事件的分发系统 二,游戏逻辑与脚本系统2.1 特点和常见脚本语言2.2 脚本语言的GO管理2.3 脚本语言的架构2.4 可视化脚本 三,Gameplay 开发中的3C &#…

关雅荻发文批评某脱口秀节目审核问题:为博流量乱搞事情?

最近,针对某脱口秀节目中引发的网络舆情,电影制片人关雅荻发文严厉批评该视频平台的审核问题,指出“这家视频网站对应的节目审核环节严重失职,或者有意渎职,这个脱口秀节目制作方在自己内容策划和制作也有明显失职、严…

一招有效清理宠物浮毛,养宠搭子——质量好的宠物空气净化器推荐

害,好不容易毕业找到了工作进入社会,我以为可以自己决定事情了,结果上周又被我妈臭骂一通。因为我瞒着他们养猫了,他们来看我的时候才知道,说我刚出来养活自己都够呛,哪里还能照顾猫。在我好说歹说下&#…

数字电路与逻辑设计-触发器功能测试及其应用

一、实验目的 1.验证基本RS、JK、D、T和T’触发器的逻辑功能及使用方法; 2.能进行触发器之间的相互转换; 3.学习触发器的一些应用。 二、实验原理 触发器具有两个能够自行保持的稳定状态,用以表示逻辑状…

使用llama.cpp 在推理MiniCPM-1.2B模型

llama.cpp 是一个开源项目,它允许用户在C中实现与LLaMA(Large Language Model Meta AI)模型的交互。LLaMA模型是由Meta Platforms开发的一种大型语言模型,虽然llama.cpp本身并不包含LLaMA模型的训练代码或模型权重,但它…

vmware中的ubuntu系统扩容分区

1.虚拟机关机 右击虚拟机/设置,进入虚拟机设置 3.启动虚拟机,进入命令行 4.fdisk -l查看要扩展的分区名 5.resize要扩容的分区 su root parted /dev/sda resizepart 3 100% fdisk -l resize2fs /dev/sda3 df -T完成 6.其他 进入磁盘管理 fdisk /d…

MYSQL解说

MySQL是一个流行的开源关系型数据库管理系统(RDBMS),广泛用于网站和应用程序的后端数据存储。 MySQL的基础知识: 1. 数据库和表 数据库(Database):存储数据的逻辑容器。表(Table&…

JAVA——打印流

目录 一、printStream 二、printWriter 三、打印流的应用——输出重定向 输出语句重定向的意义 一、printStream 1. 作用: 打印流可以实现更方便、更高效的打印数据出去 跟着黑马实现一下:printStream 的底层实现效率更高,println输什么…

关于实时数仓的几点技术分享

一、实时数仓建设背景 业务需求的变化:随着互联网和移动互联网的快速发展,企业的业务需求变得越来越复杂和多样化,对数据处理的速度和质量要求也越来越高。传统的T1数据处理模式已经无法满足企业的需求,实时数据处理成为了一种必…

floodfill+DFS(2)

文章目录 太平洋大西洋流水问题扫雷游戏迷路的机器人 太平洋大西洋流水问题 class Solution { public:vector<vector<int>> res;int m 0, n 0;vector<vector<int>> pacificAtlantic(vector<vector<int>>& heights) {m heights.size…

35.贪心算法2

1.按身高排序&#xff08;easy&#xff09; 2418. 按身高排序 - 力扣&#xff08;LeetCode&#xff09; 题目解析 算法原理 代码 class Solution {public String[] sortPeople(String[] names, int[] heights) {// 1. 创建⼀个下标数组int n names.length;Integer[] index …

tair性能挑战赛攻略心得-Zzzzz

关联比赛: 第二届数据库大赛—Tair性能挑战 赛题分析 赛题要求实现一个基于persistent memory&#xff08;AEP&#xff09;的持久化键值存储系统&#xff0c;并要求从数据正确性和系统读写性能两个方面来考虑系统设计。 正确性 数据正确性包括数据写入的持久性和原子性两个…

计算机三级网络技术总结(五)

HTTP端口号为80 三平台一出口&#xff1a;网络平台、业务平台、管理平台和城市宽带出口IEEE802.16最高传输速率为134Mbps链路状态数据库中保存的是全网的拓扑结构图&#xff0c;而非全网完整的路由表在无线局域网中&#xff0c;客户端设备用来访问接入点&#xff08;AP&#xf…

MySQL 中的索引覆盖扫描:加速查询的秘密武器

在 MySQL 数据库的使用中&#xff0c;索引是提高查询性能的重要工具。而索引覆盖扫描&#xff08;Index Covering Scan&#xff09;更是一种能显著提升查询效率的技术。本篇文章我们就来深入了解一下 MySQL 中的索引覆盖扫描是什么。 一、什么是索引覆盖扫描 在 MySQL 中&…

将有序数组——>二叉搜索树

给你一个整数数组 nums &#xff0c;其中元素已经按 升序 排列&#xff0c;请你将其转换为一棵平衡二叉搜索树。 示例 1&#xff1a; 输入&#xff1a;nums [-10,-3,0,5,9] 输出&#xff1a;[0,-3,9,-10,null,5] 解释&#xff1a;[0,-10,5,null,-3,null,9] 也将被视为正确答案…

Python编码系列—Python桥接模式:连接抽象与实现的桥梁

&#x1f31f;&#x1f31f; 欢迎来到我的技术小筑&#xff0c;一个专为技术探索者打造的交流空间。在这里&#xff0c;我们不仅分享代码的智慧&#xff0c;还探讨技术的深度与广度。无论您是资深开发者还是技术新手&#xff0c;这里都有一片属于您的天空。让我们在知识的海洋中…

【C语言二级考试】循环结构设计

C语言二级考试——循环结构程序设计 五.循环结构程序设计 1.for循环结构 2.while和do-while循环结构 3.continue语句和break语句 4.循环的嵌套 知识点参考【C语言】循环-CSDN博客 文章目录 1.for循环2.while和do-while循环结构3.continue语句和break语句4.循环的嵌套 1.for循环…