16. 获取社区详情

news2024/9/27 15:17:44

文章目录

  • 一、建表、插入测试数据、并生成对应的model
  • 二、添加路由,以及controller、logic、dao三层分别实现对应代码
  • 三、编译运行

登录之后,我们可以发表帖子,但是发表帖子之前,需要先选择一个频道,可以理解是社区分类或者标签分类。这个数据来源是从服务端获取的,本节我们就实现这个功能。
在这里插入图片描述

这是一个最基本的CRUD功能,直接上代码吧,其中dev.yamlmain.go文件有改动是因为我想换为开发环境运行,这样可以直接调试以及观察控制台日志。
在这里插入图片描述

一、建表、插入测试数据、并生成对应的model

首先我们需要创建对应的表和model,这里需要说明的是,我们将和DB交互的model以及和前端交互的model使用了同一个,实际工作中一般是不会这样的。

  • DB交互的model,字段应该和表中的映射
  • 和前端交互的model,一般是和前端对齐约定好的requestresponse结构

bluebell_community.sql

DROP TABLE IF EXISTS `community`;

create table community
(
    id             int auto_increment primary key,
    community_id   int unsigned                        not null,
    community_name varchar(128)                        not null,
    introduction   varchar(256)                        not null,
    create_time    timestamp default CURRENT_TIMESTAMP not null,
    update_time    timestamp default CURRENT_TIMESTAMP not null on update CURRENT_TIMESTAMP,
    constraint idx_community_id  unique (community_id),
    constraint idx_community_name unique (community_name)
) collate = utf8mb4_general_ci;

INSERT INTO community (id, community_id, community_name, introduction, create_time, update_time) VALUES (1, 1, 'Go', 'Golang', '2016-11-01 08:10:10', '2016-11-01 08:10:10');
INSERT INTO community (id, community_id, community_name, introduction, create_time, update_time) VALUES (2, 2, 'leetcode', '刷题刷题刷题', '2024-01-01 08:00:00', '2024-01-01 08:00:00');
INSERT INTO community (id, community_id, community_name, introduction, create_time, update_time) VALUES (3, 3, 'CS:GO', 'Rush B。。。', '2018-08-07 08:30:00', '2018-08-07 08:30:00');
INSERT INTO community (id, community_id, community_name, introduction, create_time, update_time) VALUES (4, 4, 'LOL', '欢迎来到英雄联盟!', '2016-01-01 08:00:00', '2016-01-01 08:00:00');

select * from community;

在这里插入图片描述

使用如下地址https://www.qetool.com/sql_json_go/sql.html,直接将建表语句转为对应的结构体。

models/community.go

注意:因为前端读取社区id是表中community_id字段,name是表中community_name字段,所以下面这些字段的JSON tag我做了修改。

  • id:unique_id
  • community_id:id
  • community_name:name
package models

import "time"

type Community struct {
	ID            int64     `gorm:"column:id" db:"id" json:"unique_id" form:"id"`
	CommunityId   int64     `gorm:"column:community_id" db:"community_id" json:"id" form:"community_id"`
	CommunityName string    `gorm:"column:community_name" db:"community_name" json:"name" form:"community_name"`
	Introduction  string    `gorm:"column:introduction" db:"introduction" json:"introduction" form:"introduction"`
	CreateTime    time.Time `gorm:"column:create_time" db:"create_time" json:"create_time" form:"create_time"`
	UpdateTime    time.Time `gorm:"column:update_time" db:"update_time" json:"update_time" form:"update_time"`
}

func (Community) TableName() string {
	return "community"
}

二、添加路由,以及controller、logic、dao三层分别实现对应代码

添加路由,获取社区列表、获取指定社区详情

router/route.go

v1.GET("/community", controller.CommunityHandler)
v1.GET("/community/:id", controller.CommunityDetailHandler)

添加两个handler

controller/community.go

package controller

import (
	"bluebell/logic"
	"strconv"

	"github.com/gin-gonic/gin"
	"go.uber.org/zap"
)

// ---- 跟社区相关的 ----

func CommunityHandler(c *gin.Context) {
	// 查询到所有的社区(community_id, community_name) 以列表的形式返回
	data, err := logic.GetCommunityList()
	if err != nil {
		zap.L().Error("logic.GetCommunityList() failed", zap.Error(err))
		ResponseError(c, CodeServerBusy) // 不轻易把服务端报错暴露给外面
		return
	}
	ResponseSuccess(c, data)
}

// CommunityDetailHandler 社区分类详情
func CommunityDetailHandler(c *gin.Context) {
	// 1. 获取社区id
	idStr := c.Param("id") // 获取URL参数
	id, err := strconv.ParseInt(idStr, 10, 64)
	if err != nil {
		ResponseError(c, CodeInvalidParam)
		return
	}

	// 2. 根据id获取社区详情
	data, err := logic.GetCommunityDetail(id)
	if err != nil {
		zap.L().Error("logic.GetCommunityList() failed", zap.Error(err))
		ResponseError(c, CodeServerBusy) // 不轻易把服务端报错暴露给外面
		return
	}
	ResponseSuccess(c, data)
}

添加对应的logic,尽管没有其他业务逻辑,就是简单的调用一下dao层而已,但是为了规范,我们还是加了logic这层,而不是让controller层直接调用dao层。

logic/community.go

package logic

import (
	"bluebell/dao/mysql"
	"bluebell/models"
)

func GetCommunityList() ([]*models.Community, error) {
	// 查数据库 查找到所有的community 并返回
	return mysql.GetCommunityList()
}

func GetCommunityDetail(id int64) (*models.Community, error) {
	return mysql.GetCommunityDetailByID(id)
}

DB获取数据

dao/mysql/community.go

package mysql

import (
	"bluebell/models"

	"go.uber.org/zap"
	"gorm.io/gorm"
)

func GetCommunityList() (communityList []*models.Community, err error) {
	res := make([]*models.Community, 0)
	err = db.Model(models.Community{}).Find(&res).Error
	if err != nil {
		zap.L().Error("server inner error")
		return nil, ErrorInnerServer
	}
	if len(res) == 0 {
		zap.L().Warn("there is no community in db")
		return res, nil
	}

	communityList = res

	return
}

// GetCommunityDetailByID 根据ID查询社区详情
func GetCommunityDetailByID(id int64) (community *models.Community, err error) {
	// 这里需要注意:尽管返回值中已经定义了community变量,但是并没有初始化,所以这里初始化它
	//不初始化就使用会报错的
	community = new(models.Community)

	err = db.Where("community_id = ?", id).Find(community).Error
	if err != nil {
		if err == gorm.ErrRecordNotFound {
			err = ErrorInvalidID
		}
	}
	return community, err
}

三、编译运行

可以看到,有四个社区标签可以选择了
在这里插入图片描述

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

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

相关文章

USB协议学习(三)大容量存储设备SCSI协议分析

笔者来简单介绍一下SCSI得协议命令 1、SCSI协议认识 SCSI:Small Computer System Interface,用于计算机外部设备得接口标准,定义了与外部设备得一套协议。SCSI标准协议族支持很多钟SCSI设备,像盘,打印机,扫…

算法-双指针、BFS与图论-1224. 交换瓶子

题目 思路 可以交换任意两个瓶子,最多n-1次;如果是只能交换相邻的瓶子,那么相当于逆序对的个数(这篇博客是介绍如何计算逆序对的算法:算法篇:逆序对_逆序对算法-CSDN博客)本题转换为图论去看:边…

【C++】类和对象(六个默认成员函数)

文章目录 类的六个默认成员函数**构造函数****构造函数的目的****构造函数的特性** 析构函数析构函数概念析构函数处理的顺序析构函数清理细节 拷贝构造函数拷贝构造函数典型调用场景 赋值运算符重载运算符重载赋值运算重载前置和后置 重载 const成员函数再提权限的问题: 取地址…

HAproxy反向代理与负载均衡

目录 一、HAproxy介绍 1. 概述 2. 关于4/7层负载均衡 2.1 无负载均衡 2.1.1 图示 2.1.2 说明 2.2 四层负载均衡 2.2.1 图示 2.2.2 说明 2.3 七层负载 2.3.1 图示 2.3.2 说明 3. 特性 4. HAProxy负载均衡常见策略 5. 处理模式 二、HAproxy安装 1. yum安装 2. 第…

文献阅读笔记:全卷积神经网络

文献阅读笔记:全卷积神经网络 摘要Abstract1. 全卷积神经网络1.1 文献摘要1.2 全卷积神经网络1.2.1 网络结构1.2.0 从分类器到密集 FCN1.2.2 上采样 Upsampling1.2.3 跳级结构1.2.4 FCN训练 1.3 实验1.4 总结 2. 代码实现 摘要 本周学习了全卷积神经网络&#xff0…

模板不存在:./Application/Home/View/OnContact/Index.html 错误位置

模板不存在:./Application/Home/View/OnContact/Index.html 错误位置FILE: /home/huimingdedhpucixmaihndged5e/wwwroot/ThinkPHP123/Library/Think/View.class.php  LINE: 110 TRACE#0 /home/huimingdedhpucixmaihndged5e/wwwroot/ThinkPHP123/Library/Think/View.class.php(…

关于迁移数据库的一些问题

开发人员,并且需要将数据库迁移到另一个分库,尽量采取以下步骤: 备份源数据库: 在进行任何操作之前,首先要确保对源数据库进行备份,以防止意外数据丢失或损坏。 创建目标分库: 在目标数据库服务…

mockjs学习

1.前言 最近面试发现之前团队协同合作的项目没有mock数据难以向面试官直接展示,所以迟到得来速学一下mockjs。 参考视频:mockJs 妈妈再也不用担心我没有后端接口啦_哔哩哔哩_bilibili 一开始查阅了一些资料,先是看了下EasyMock&#xff0c…

windows安装ElasticSearch踩坑记

ElasticSearch是一个开源的分布式搜索和分析引擎。它提供实时分布式搜索功能,可以索引和搜索大量的结构化和非结构化数据。Elasticsearch以其速度、可伸缩性和处理复杂查询的能力而闻名。它常用于日志分析、全文搜索、文档搜索和数据分析等领域。使用ElasticSearch的…

AHU 算法分析 实验四 动态规划

实验四:动态规划 实验目的 • 理解动态规划的基本思想,理解动态规划算法的两个基本要素最 优子结构性质和子问题的重叠性质。 • 熟练掌握典型的动态规划问题。 • 掌握动态规划思想分析问题的一般方法,对较简单的问题能正确 分析&#x…

Day31:安全开发-JS应用WebPack打包器第三方库JQuery安装使用安全检测

目录 打包器-WebPack-使用&安全 第三方库-JQuery-使用&安全 思维导图 JS知识点: 功能:登录验证,文件操作,SQL操作,云应用接入,框架开发,打包器使用等 技术:原生开发&…

章六、集合(1)—— 概念、API、List 接口及实现类、集合迭代

零、 关闭IDEA调试时自动隐藏空元素 一、 集合的概念 存储一个班学员信息,假定一个班容纳20名学员 当我们需要保存一组一样(类型相同)的元素的时候,我们应该使用一个容器来存储,数组就是这样一个容器。 数组有什么缺…

简析内部审计数字化转型的方法和路径

简析内部审计数字化转型的方法和路径 内部审计是一种独立的、客观的确认和咨询活动,包括鉴证、识别和分析问题以及提供管理建议和解决方案。狭义的数字化转型是指将企业经营管理和业务操作的各种行为、状态和结果用数字的形式来记录和存储,据此再对数据…

基于纳什谈判理论的风–光–氢多主体能源系统合作运行方法(含matlab代码)

目录 主要内容 部分代码 结果一览 下载链接 主要内容 程序解决的是一个基于合作博弈的风光氢能源交易的问题,首先,考虑主体间的电能交易建立各主体的优化运行模型, 然后基于纳什谈判理论建立风–光–氢多主体合作运行模型&…

Springboot+vue的高校危化试剂仓储系统(有报告)。Javaee项目,springboot vue前后端分离项目。

演示视频: Springbootvue的高校危化试剂仓储系统(有报告)。Javaee项目,springboot vue前后端分离项目。 项目介绍: 采用M(model)V(view)C(controller&#x…

(003)SlickEdit Unity的补全

文章目录 步骤XML知识点 附录 步骤 1.下载 unity 源码。 2.将自定义文件 MonoBehaviour.cs 放到解压后的项目里面: using System;namespace UnityEngine {public partial class MonoBehaviour{public virtual void Awake(){throw new NotImplementedException();…

Axure原型设计项目效果 全国职业院校技能大赛物联网应用开发赛项项目原型设计题目

目录 前言 一、2022年任务书3效果图 二、2022年任务书5效果图 三、2022年国赛正式赛卷 四、2023年国赛第一套样题 五、2023年国赛第二套样题 六、2023年国赛第三套样题 七、2023年国赛第四套样题 八、2023年国赛第七套样题 九、2023年国赛正式赛题(第八套…

flink重温笔记(十四): flink 高级特性和新特性(3)——数据类型及 Avro 序列化

Flink学习笔记 前言:今天是学习 flink 的第 14 天啦!学习了 flink 高级特性和新特性之数据类型及 avro 序列化,主要是解决大数据领域数据规范化写入和规范化读取的问题,avro 数据结构可以节约存储空间,本文中结合企业真…

RabbitMQ - 06 - Topic交换机

目录 控制台创建队列与交换机 编写消费者方法 编写生产者测试方法 结果 Topic交换机与Direct交换机基本一致 可参考 这篇帖子 http://t.csdnimg.cn/AuvoK topic交换机与Direct交换机的区别是 Topic交换机接收的消息RoutingKey必须是多个单词,以 . 分割 Topic交…

练习01-登录注册(简单)

一、用户登录/注册实现 综合前面学的知识来实现简单的注册登录功能 1.准备工作 注册登录页面 数据库,数据表 mybatis 坐标引入,MySQL驱动 配置 映射文件 用户实体类 Servlet代码 2.页面 不想手写的可以看博主IT黄大大【带源码】 【炫酷登录界…