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
}
15 声望
0 粉丝
0 条评论
推荐阅读
golang中的错误处理
0.1、索引[链接]1、panic当我们执行panic的时候会结束下面的流程: {代码...} {代码...} 但是panic也是可以捕获的,我们可以使用defer和recover实现: {代码...} {代码...} 那什么时候适合panic呢?在 Go 中,pan...

liuyuede阅读 717

封面图
从零搭建 Node.js 企业级 Web 服务器(十五):总结与展望
总结截止到本章 “从零搭建 Node.js 企业级 Web 服务器” 主题共计 16 章内容就更新完毕了,回顾第零章曾写道:搭建一个 Node.js 企业级 Web 服务器并非难事,只是必须做好几个关键事项这几件必须做好的关键事项就...

乌柏木75阅读 7.1k评论 16

从零搭建 Node.js 企业级 Web 服务器(一):接口与分层
分层规范从本章起,正式进入企业级 Web 服务器核心内容。通常,一块完整的业务逻辑是由视图层、控制层、服务层、模型层共同定义与实现的,如下图:从上至下,抽象层次逐渐加深。从下至上,业务细节逐渐清晰。视图...

乌柏木45阅读 8.6k评论 6

从零搭建 Node.js 企业级 Web 服务器(二):校验
校验就是对输入条件的约束,避免无效的输入引起异常。Web 系统的用户输入主要为编辑与提交各类表单,一方面校验要做在编辑表单字段与提交的时候,另一方面接收表单的接口也要做足校验行为,通过前后端共同控制输...

乌柏木35阅读 6.7k评论 10

一文搞懂秒杀系统,欢迎参与开源,提交PR,提高竞争力。早日上岸,升职加薪。
前言秒杀和高并发是面试的高频考点,也是我们做电商项目必知必会的场景。欢迎大家参与我们的开源项目,提交PR,提高竞争力。早日上岸,升职加薪。知识点详解秒杀系统架构图秒杀流程图秒杀系统设计这篇文章一万多...

王中阳Go33阅读 2.5k评论 1

封面图
从零搭建 Node.js 企业级 Web 服务器(五):数据库访问
回顾 从零搭建 Node.js 企业级 Web 服务器(一):接口与分层,一块完整的业务逻辑是由视图层、控制层、服务层、模型层共同定义与实现的,控制层与服务层实现了业务处理过程,模型层定义了业务实体并以 对象-关系...

乌柏木34阅读 5.1k评论 9

从零搭建 Node.js 企业级 Web 服务器(十三):断点调试与性能分析
Node.js 官方提供了断点调试机制,出于安全性考虑默认为关闭状态,可以通过 node 参数 --inspect 或 --inspect-brk 开启,配合 IDE 能够非常方便地调试代码,本章就上一章已完成的项目 licg9999/nodejs-server-ex...

乌柏木31阅读 4.2k评论 9

15 声望
0 粉丝
宣传栏