go-zero docker-compose 搭建课件服务(二):编写courseware rpc服务
0、转载
go-zero docker-compose 搭建课件服务(二):编写courseware rpc服务
0.1源码地址
https://github.com/liuyuede123/go-zero-courseware
1、创建model
mysql中创建数据库
create database go_zero_courseware default character set utf8mb4 collate utf8mb4_unicode_ci;
创建sql文件
touch courseware/rpc/model/courseware.sql
CREATE TABLE `courseware`
(
`id` bigint unsigned NOT NULL AUTO_INCREMENT,
`code` varchar(255) NOT NULL DEFAULT '' COMMENT '编号',
`name` varchar(255) NOT NULL DEFAULT '' COMMENT '用户姓名',
`type` tinyint(3) unsigned NOT NULL DEFAULT '0' COMMENT '课件类型 1-h5 2-scorm 3-多媒体多章节',
`is_delete` tinyint(4) NOT NULL DEFAULT 0 COMMENT '是否删除 0-未删除 1-已删除',
`create_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
`update_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
UNIQUE KEY `idx_mobile_unique` (`mobile`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
生成model
# 到对应model目录下
cd courseware/rpc/model
# 生成model
goctl model mysql ddl -src="./*.sql" -dir="./" -c
2、生成rpc文件
需要提前安装了protoc & protoc-gen-go,自行搜索安装
# 回到courseware rpc目录 ./go-zero-courseware/courseware/rpc
cd ../
goctl rpc protoc courseware.proto --go_out=. --go-grpc_out=. --zrpc_out=.
3、初始化module
# 路径 courseware
go mod init
go mod tidy
4、添加数据库源
courseware.yaml中增加mysql配置
# 路径
# go-zero-courseware/courseware/rpc/etc/courseware.yaml
Name: courseware.rpc
ListenOn: 0.0.0.0:9400
Etcd:
Hosts:
- etcd:2379
Key: courseware.rpc
# mysql数据源
Mysql:
DataSource: root:liufutian@tcp(192.168.0.110:3306)/go_zero_courseware?charset=utf8mb4&parseTime=true&loc=Asia%2FShanghai
# redis缓存
CacheRedis:
- Host: 192.168.0.110:6379
Pass:
config.go文件中增加mysql配置项
// 路径 courseware/rpc/internal/config/config.go
package config
import (
"github.com/zeromicro/go-zero/core/stores/cache"
"github.com/zeromicro/go-zero/zrpc"
)
type Config struct {
zrpc.RpcServerConf
Mysql struct {
DataSource string
}
CacheRedis cache.CacheConf
}
servicecontext.go中增加CoursewareModel配置
// 路径 courseware/rpc/internal/svc/servicecontext.go
package svc
import (
"github.com/zeromicro/go-zero/core/stores/sqlx"
"go-zero-courseware/courseware/rpc/internal/config"
"go-zero-courseware/courseware/rpc/model"
)
type ServiceContext struct {
Config config.Config
CoursewareModel model.CoursewareModel
}
func NewServiceContext(c config.Config) *ServiceContext {
conn := sqlx.NewMysql(c.Mysql.DataSource)
return &ServiceContext{
Config: c,
CoursewareModel: model.NewCoursewareModel(conn, c.CacheRedis),
}
}
5、编写增删改查逻辑
courseware/rpc/internal/logic/addlogic.go修改如下
package logic
import (
"context"
"go-zero-courseware/courseware/rpc/courseware"
"go-zero-courseware/courseware/rpc/internal/svc"
"go-zero-courseware/courseware/rpc/model"
"google.golang.org/grpc/status"
"github.com/zeromicro/go-zero/core/logx"
)
type AddLogic struct {
ctx context.Context
svcCtx *svc.ServiceContext
logx.Logger
}
func NewAddLogic(ctx context.Context, svcCtx *svc.ServiceContext) *AddLogic {
return &AddLogic{
ctx: ctx,
svcCtx: svcCtx,
Logger: logx.WithContext(ctx),
}
}
func (l *AddLogic) Add(in *courseware.AddRequest) (*courseware.AddResponse, error) {
_, err := l.svcCtx.CoursewareModel.FindOneByCode(l.ctx, in.Code)
if err == nil {
return nil, status.Error(5000, "课件已存在")
}
if err == model.ErrNotFound {
newCourseware := model.Courseware{
Code: in.Code,
Name: in.Name,
Type: in.Type,
}
_, err = l.svcCtx.CoursewareModel.Insert(l.ctx, &newCourseware)
if err != nil {
return nil, status.Error(500, err.Error())
}
return &courseware.AddResponse{}, nil
}
return nil, status.Error(500, err.Error())
}
courseware/rpc/internal/logic/deletelogic.go修改如下
package logic
import (
"context"
"google.golang.org/grpc/status"
"go-zero-courseware/courseware/rpc/courseware"
"go-zero-courseware/courseware/rpc/internal/svc"
"github.com/zeromicro/go-zero/core/logx"
)
type DeleteLogic struct {
ctx context.Context
svcCtx *svc.ServiceContext
logx.Logger
}
func NewDeleteLogic(ctx context.Context, svcCtx *svc.ServiceContext) *DeleteLogic {
return &DeleteLogic{
ctx: ctx,
svcCtx: svcCtx,
Logger: logx.WithContext(ctx),
}
}
func (l *DeleteLogic) Delete(in *courseware.DeleteRequest) (*courseware.DeleteResponse, error) {
err := l.svcCtx.CoursewareModel.Delete(l.ctx, in.Id)
if err != nil {
return nil, status.Error(500, err.Error())
}
return &courseware.DeleteResponse{}, nil
}
courseware/rpc/internal/logic/getlogic.go修改如下
package logic
import (
"context"
"google.golang.org/grpc/status"
"go-zero-courseware/courseware/rpc/courseware"
"go-zero-courseware/courseware/rpc/internal/svc"
"github.com/zeromicro/go-zero/core/logx"
)
type GetLogic struct {
ctx context.Context
svcCtx *svc.ServiceContext
logx.Logger
}
func NewGetLogic(ctx context.Context, svcCtx *svc.ServiceContext) *GetLogic {
return &GetLogic{
ctx: ctx,
svcCtx: svcCtx,
Logger: logx.WithContext(ctx),
}
}
func (l *GetLogic) Get(in *courseware.GetRequest) (*courseware.GetResponse, error) {
cw, err := l.svcCtx.CoursewareModel.FindOne(l.ctx, in.Id)
if err != nil {
return nil, status.Error(5000, "课件不存在")
}
return &courseware.GetResponse{
Id: cw.Id,
Code: cw.Code,
Name: cw.Name,
Type: cw.Type,
}, nil
}
courseware/rpc/internal/logic/updatelogic.go修改如下:
package logic
import (
"context"
"google.golang.org/grpc/status"
"go-zero-courseware/courseware/rpc/courseware"
"go-zero-courseware/courseware/rpc/internal/svc"
"github.com/zeromicro/go-zero/core/logx"
)
type UpdateLogic struct {
ctx context.Context
svcCtx *svc.ServiceContext
logx.Logger
}
func NewUpdateLogic(ctx context.Context, svcCtx *svc.ServiceContext) *UpdateLogic {
return &UpdateLogic{
ctx: ctx,
svcCtx: svcCtx,
Logger: logx.WithContext(ctx),
}
}
func (l *UpdateLogic) Update(in *courseware.UpdateRequest) (*courseware.UpdateResponse, error) {
cw, err := l.svcCtx.CoursewareModel.FindOne(l.ctx, in.Id)
if err != nil {
return nil, status.Error(5000, "课件不存在")
}
_, err = l.svcCtx.CoursewareModel.FindOneByCode(l.ctx, in.Code)
if err == nil {
return nil, status.Error(5000, "课件编号已存在")
}
if in.Code != "" {
cw.Code = in.Code
}
if in.Name != "" {
cw.Name = in.Name
}
if in.Type > 0 {
cw.Type = in.Type
}
err = l.svcCtx.CoursewareModel.Update(l.ctx, cw)
if err != nil {
return nil, status.Error(500, err.Error())
}
return &courseware.UpdateResponse{}, nil
}
go-zero docker-compose 搭建课件服务(二):编写courseware rpc服务的更多相关文章
- Istio入门实战与架构原理——使用Docker Compose搭建Service Mesh
本文将介绍如何使用Docker Compose搭建Istio.Istio号称支持多种平台(不仅仅Kubernetes).然而,官网上非基于Kubernetes的教程仿佛不是亲儿子,写得非常随便,不仅缺 ...
- 利用 Docker Compose 搭建 SpringBoot 运行环境(超详细步骤和分析)
0.前言 相信点进来看这篇文章的同学们已经对 Docker Dompose 有一定的了解了,下面,我们拿最简单的例子来介绍如何使用 Docker Compose 来管理项目. 本文例子: 一个应用服务 ...
- 使用Docker Compose搭建Service Mesh
使用Docker Compose搭建Service Mesh 本文将介绍如何使用Docker Compose搭建Istio.Istio号称支持多种平台(不仅仅Kubernetes).然而,官网上非基于 ...
- Docker Compose 搭建 Redis Cluster 集群环境
在前文<Docker 搭建 Redis Cluster 集群环境>中我已经教过大家如何搭建了,本文使用 Docker Compose 再带大家搭建一遍,其目的主要是为了让大家感受 Dock ...
- go-zero docker-compose 搭建课件服务(三):编写courseware api服务
0.转载 go-zero docker-compose 搭建课件服务(三):编写courseware api服务 0.1源码地址 https://github.com/liuyuede123/go-z ...
- Docker Compose搭建Redis一主二从三哨兵高可用集群
一.Docker Compose介绍 https://docs.docker.com/compose/ Docker官方的网站是这样介绍Docker Compose的: Compose是用于定义和运行 ...
- docker compose搭建redis7.0.4高可用一主二从三哨兵集群并整合SpringBoot【图文完整版】
一.前言 redis在我们企业级开发中是很常见的,但是单个redis不能保证我们的稳定使用,所以我们要建立一个集群. redis有两种高可用的方案: High availability with Re ...
- Docker Compose搭建ELK
Elasticsearch默认使用mmapfs目录来存储索引.操作系统默认的mmap计数太低可能导致内存不足,我们可以使用下面这条命令来增加内存: sysctl -w vm.max_map_count ...
- 基于Docker Compose搭建mysql主从复制(1主2从)
系统环境 * 3 Ubuntu 16.04 mysql 8.0.12 docker 18.06.1-ce docker-compose 1.23.0-rc3 *3 ==> PS ###我用的是 ...
随机推荐
- 大数据管理系统架构Hadoop
Hadoop 起源于Google Lab开发的Google File System (GFS)存储系统和MapReduce数据处理框架.2008年,Hadoop成了Apache上的顶级项目,发展到今天 ...
- 活动报名|对话贡献者:DolphinScheduler x Pulsar 在线 Meetup
各位 DolphinScheduler 和 Pulsar 社区的小伙伴们,Apache DolphinScheduler x Pulsar 在线 Meetup 来啦! 导语 大数据任务调度.消息流的订 ...
- 深入理解Spring注解机制(一):注解的搜索与处理机制
前言 众所周知,spring 从 2.5 版本以后开始支持使用注解代替繁琐的 xml 配置,到了 springboot 更是全面拥抱了注解式配置.平时在使用的时候,点开一些常见的等注解,会发现往往在一 ...
- DS队列----银行单队列多窗口模拟
题目描述 假设银行有K个窗口提供服务,窗口前设一条黄线,所有顾客按到达时间在黄线后排成一条长龙.当有窗口空闲时,下一位顾客即去该窗口处理事务.当有多个窗口可选择时,假设顾客总是选择编号最小的窗口. 本 ...
- 零基础学Java(14)对象构造
对象构造 之前学习了编写简单的构造器,可以定义对象的初始状态.但是,由于对象构造非常重要,所以Java提供了多种编写构造器的机制. 重载 有些类有多个构造器.例如,可以如下构造一个空的StringBu ...
- C++ 文件hash值 BT种子的hash值
这个两个东东,是我在网上找到的.小小的修改了一下方便大家使用. 一个是 获取文件哈希值的,另外一个是获取torrent文件磁力链接的哈希值. 整理好的类下载地址: 文件hash值: http://pa ...
- Excelize 发布 2.6.0 版本,功能强大的 Excel 文档基础库
Excelize 是 Go 语言编写的用于操作 Office Excel 文档基础库,基于 ECMA-376,ISO/IEC 29500 国际标准.可以使用它来读取.写入由 Microsoft Exc ...
- JavaScript基础回顾知识点记录4-正则表达式篇(介绍基本使用)
js 中 正则表达式使用 创建正则对象和test方法使用 /* 创建正则表达式的对象 语法: var 变量 = new RegExp("正则表达式","匹配模式" ...
- 【java】学习路径17-用户注册登录实例(Scanner)
要学会使用接口.继承.多态.构造方法.包等知识编写出一个用户登录注册的事例.
- 【unity游戏入门】2 使用代码编写Hello Unity游戏
作者 罗芭Remoo 2021年9月24日 第一章.许可证的安装 下载好Unity之后,我们还需要一个前置操作才可以进入Unity引擎----许可证. 当然不用担心,Unity是一个开放的引擎,一切以 ...