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服务的更多相关文章

  1. Istio入门实战与架构原理——使用Docker Compose搭建Service Mesh

    本文将介绍如何使用Docker Compose搭建Istio.Istio号称支持多种平台(不仅仅Kubernetes).然而,官网上非基于Kubernetes的教程仿佛不是亲儿子,写得非常随便,不仅缺 ...

  2. 利用 Docker Compose 搭建 SpringBoot 运行环境(超详细步骤和分析)

    0.前言 相信点进来看这篇文章的同学们已经对 Docker Dompose 有一定的了解了,下面,我们拿最简单的例子来介绍如何使用 Docker Compose 来管理项目. 本文例子: 一个应用服务 ...

  3. 使用Docker Compose搭建Service Mesh

    使用Docker Compose搭建Service Mesh 本文将介绍如何使用Docker Compose搭建Istio.Istio号称支持多种平台(不仅仅Kubernetes).然而,官网上非基于 ...

  4. Docker Compose 搭建 Redis Cluster 集群环境

    在前文<Docker 搭建 Redis Cluster 集群环境>中我已经教过大家如何搭建了,本文使用 Docker Compose 再带大家搭建一遍,其目的主要是为了让大家感受 Dock ...

  5. go-zero docker-compose 搭建课件服务(三):编写courseware api服务

    0.转载 go-zero docker-compose 搭建课件服务(三):编写courseware api服务 0.1源码地址 https://github.com/liuyuede123/go-z ...

  6. Docker Compose搭建Redis一主二从三哨兵高可用集群

    一.Docker Compose介绍 https://docs.docker.com/compose/ Docker官方的网站是这样介绍Docker Compose的: Compose是用于定义和运行 ...

  7. docker compose搭建redis7.0.4高可用一主二从三哨兵集群并整合SpringBoot【图文完整版】

    一.前言 redis在我们企业级开发中是很常见的,但是单个redis不能保证我们的稳定使用,所以我们要建立一个集群. redis有两种高可用的方案: High availability with Re ...

  8. Docker Compose搭建ELK

    Elasticsearch默认使用mmapfs目录来存储索引.操作系统默认的mmap计数太低可能导致内存不足,我们可以使用下面这条命令来增加内存: sysctl -w vm.max_map_count ...

  9. 基于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  ###我用的是 ...

随机推荐

  1. BZOJ3262/Luogu3810 陌上花开 (三维偏序,CDQ)

    一个下午的光阴之死,凶手是细节与手残. 致命的一枪:BIT存权值时: for(; x <= maxx; x += x&-x) t[x] += w; //for(; x <= n; ...

  2. Cannot resolve method 'println(java.lang.String)'

    jsp文件中println爆红 <% int sum = 0; for (int i = 1; i <=100 ; i++) { sum+=i; } out.println("& ...

  3. 【Java】学习路径60-利用TCP协议接收多个客户端的数据

    import java.io.IOException; import java.net.*; public class TCP_Server { public static void main(Str ...

  4. 第八十九篇:Vue 重学插槽slot

    好家伙, 1.什么是插槽? 插槽是vue为组件的封装者提供的能力.允许开发者在封装组件时, 把不确定的,希望由用户指定的部分定义为插槽   我们依然可以把它理解为一个占位符 1.1.插槽的基本用法 试 ...

  5. UE 实现镜头平移,旋转和缩放

    0x00 引 在数字孪生三维场景中,通过键盘和鼠标来控制镜头的移动,缩放是很常见的行为,也是很必要的行为,用户正是通过这些操作,达到对整个三维场景的观看和控制. 0x01 键盘控制镜头前后左右移动 通 ...

  6. IIS 实现http重定向https(亲测有效:解决URL重写模块配置https重定向不生效的问题)

    前言 以前部署网站的时候,都是通过代码来实现http重定向https,最近在部署个人网站的时候,突发奇想可不可通过IIS来实现无代码的重定向呢? 在一番操作猛如虎的搜索引擎操作后,发现只有google ...

  7. 用bash反弹shell

    用bash反弹shell 受害主机:linux系统 攻击机:需要安装netcat(nc) 受害主机执行:ifconfig  ## 查看受害主机ip 攻击机执行:nc -lvp 19999 ## 在攻击 ...

  8. PHP函数小工具

    PHP检测IP是否内网地址.保留地址 /** * @param string $ip 被检测的IP * @return bool 是否内网或者保留IP */ public function isInt ...

  9. Mybatis 一级缓存和二级缓存原理区别 (图文详解)

    Java面试经常问到Mybatis一级缓存和二级缓存,今天就给大家重点详解Mybatis一级缓存和二级缓存原理与区别@mikechen Mybatis缓存 缓存就是内存中的数据,常常来自对数据库查询结 ...

  10. day03-3私聊功能

    多用户即时通讯系统03 4.编码实现02 4.4功能实现-私聊功能实现 4.4.1思路分析 客户端 - 发送者: 用户在控制台输入信息,客户端接收内容 将消息构建成Messgae对象,通过对应的soc ...