第四期 · 将部分数据存储至Mysql,使用axios通过golang搭建的http服务器获取数据。

新建数据库

  1. DROP DATABASE VUE;
  2. create database if not exists vue;
  3. use vue;

JSON TO MYSQL

JSON to MySQL (transform.tools)

  1. DROP DATABASE VUE;
  2. create database if not exists vue;
  3. use vue;
  4. CREATE TABLE gameblog (
  5. id INT PRIMARY KEY AUTO_INCREMENT,
  6. title VARCHAR(255),
  7. text VARCHAR(255),
  8. img VARCHAR(255)
  9. );
  10. insert into gameblog(title,text,img) values
  11. ("Games of the Month: surrealist solitaire puzzles","What’s that? You need more games? I hear you, anonymous hapi fan.We’ve reached the part of the year when games start coming out fast","https://xiaonenglife.oss-cn-hangzhou.aliyuncs.com/static/pic/2022/11/20221102184434_1.jpg"),
  12. ("Games of the Month: Puzzles!","Sometimes you need a good puzzle game, just something to throw all of your attention at and ignore anything else going on. Well if that sometime for you is right now, then you’re in luck because in this Games of the Month","https://xiaonenglife.oss-cn-hangzhou.aliyuncs.com/static/pic/2022/11/20221102184434_2.jpg"),
  13. ("The next hapi Creator Day is July 29th!","I don’t think I’m allowed to make the entire body of this post “Thenext itch.io Creator Day is taking place on Friday July 29th.” I mean it’s true, we are hosting the next itch.io Creator Day on Friday July 29th but I should probably write more here.","https://xiaonenglife.oss-cn-hangzhou.aliyuncs.com/static/pic/2022/11/20221102184434_3.jpg");
  14. select * from gameblog;
  15. CREATE TABLE game (
  16. id INT PRIMARY KEY AUTO_INCREMENT,
  17. title VARCHAR(255),
  18. text VARCHAR(255),
  19. img VARCHAR(255),
  20. price decimal(6,2) default 0,
  21. web boolean default 0
  22. # TODO 发布时间
  23. # TODO 浏览量
  24. # TODO 评论量
  25. # TODO 热度综合指标
  26. );
  27. CREATE TABLE tag (
  28. id INT PRIMARY KEY AUTO_INCREMENT,
  29. title VARCHAR(255)
  30. );
  31. CREATE TABLE gametag (
  32. gameid INT,
  33. tagid INT
  34. );
  35. # TODO 外键
  36. insert into game(id,title,text,img,price,web) values
  37. (1,"Late Night Mop","A haunted house cleaning simulator.","https://xiaonenglife.oss-cn-hangzhou.aliyuncs.com/static/pic/2022/11/20221102193135_1.png",0,0),
  38. (2,"an average day at the cat cafe","A haunted house cleaning simulator.","https://xiaonenglife.oss-cn-hangzhou.aliyuncs.com/static/pic/2022/11/20221102193135_2.png",0,1),
  39. (3,"Corebreaker","A fast-paced action-platform shooter game with roguelike elements.","https://xiaonenglife.oss-cn-hangzhou.aliyuncs.com/static/pic/2022/11/20221102193135_3.png",19.99,0),
  40. (4,"Atuel","Traverse a surrealist landscape inspired by the Atuel River in Argentina.","https://xiaonenglife.oss-cn-hangzhou.aliyuncs.com/static/pic/2022/11/20221102193135_5.png",0,0);
  41. insert into tag values
  42. (1,"Difficult"),
  43. (2,"Fast-Paced");
  44. insert into gametag values
  45. (3,1),
  46. (3,2),
  47. (4,1);
  48. DELIMITER $$
  49. CREATE PROCEDURE gamelist()
  50. BEGIN
  51. # TODO
  52. END $$
  53. DELIMITER ;
  54. select a.title,a.text,img,price,web,if(group_concat(c.title separator "#") is null ,"", group_concat(c.title separator "#")) as tag from game a left join gametag b on a.id = b.gameid left join tag c on b.tagid = c.id group by a.id;

本地图片上传OSS图床得到静态资源的持久地址,我使用的是PicGo图床工具。

SQL TO GOLANG STRUCT

在线sql转golang struct - 球儿工具 (qetool.com)

config.go

为了方便mysql服务器的配置,写一个配置文件。

  1. package mysql_vue
  2. import "database/sql"
  3. func GetMySQLDB() (db *sql.DB, err error) {
  4. dbDriver := "mysql"
  5. dbUser := "root"
  6. dbPass := "sql2008"
  7. dbName := "vue"
  8. db, err = sql.Open(dbDriver, dbUser+":"+dbPass+"@/"+dbName)
  9. return
  10. }

gameblog.go

id暂时不需要,后期路由跳转需要用到,可以先注释。

  1. package mysql_vue
  2. import (
  3. "encoding/json"
  4. _ "github.com/go-sql-driver/mysql"
  5. )
  6. type Gameblog struct {
  7. // ID int64 `db:"id" json:"id"`
  8. Title string `db:"title" json:"title"`
  9. Text string `db:"text" json:"text"`
  10. Img string `db:"img" json:"img"`
  11. }
  12. func (Gameblog) TableName() string {
  13. return "gameblog"
  14. }
  15. func (Gameblog) QueryGameblog() (json_ []byte, err error) {
  16. // db, err := sql.Open("mysql", "root:sql2008@tcp(127.0.0.1:3306)/vue")
  17. db, err := GetMySQLDB()
  18. checkError(err)
  19. defer db.Close()
  20. // ^ 必须按照顺序选取,下面的Scan需要一一对应,如果多了或少了字段会导致Scan错误.
  21. results, err := db.Query("SELECT title,text,img FROM gameblog order by id desc")
  22. checkError(err)
  23. var gameBlogs []Gameblog
  24. for results.Next() {
  25. var gameBlog Gameblog
  26. err = results.Scan(&gameBlog.Title, &gameBlog.Text, &gameBlog.Img)
  27. checkError(err)
  28. gameBlogs = append(gameBlogs, gameBlog)
  29. }
  30. json_, err = json.Marshal(gameBlogs)
  31. checkError(err)
  32. return json_, nil
  33. }

http

Simplify server.go

前面我们把评论相关的请求处理代码写在了 server.go,移出到 comment.go,并在init初始化中绑定各个请求路径处理函数。

comment.go

  1. package server
  2. import (
  3. "fmt"
  4. "net/http"
  5. "strconv"
  6. )
  7. type Comment interface {
  8. QueryComment(pid int64) (json_ []byte, err error)
  9. InsertComment(uid, pid int64, text string) (json_ []byte, err error)
  10. DeleteComment(id int64) error
  11. }
  12. func init() {
  13. http.HandleFunc("/insertComment", insertComment)
  14. http.HandleFunc("/deleteComment", deleteComment)
  15. http.HandleFunc("/queryComment", queryComment)
  16. }
  17. func insertComment(w http.ResponseWriter, r *http.Request) {
  18. ....
  19. }
  20. func deleteComment(w http.ResponseWriter, r *http.Request) {
  21. ....
  22. }
  23. func queryComment(w http.ResponseWriter, r *http.Request) {
  24. ....
  25. }

gameblog.go

接口用于确保某个数据库对象实现了处理函数,否则编译不通过。

  1. package server
  2. import (
  3. "fmt"
  4. "net/http"
  5. )
  6. type Gameblog interface {
  7. QueryGameblog() (json_ []byte, err error)
  8. }
  9. func init() {
  10. http.HandleFunc("/queryGameblog", QueryGameblog)
  11. }
  12. func QueryGameblog(w http.ResponseWriter, r *http.Request) {
  13. if r.Method != "GET" {
  14. fmt.Fprintf(w, "Only GET Method")
  15. return
  16. }
  17. json, err := gameblog.QueryGameblog()
  18. if err != nil {
  19. fmt.Fprintf(w, "Error Delete")
  20. return
  21. }
  22. fmt.Fprint(w, string(json))
  23. }

server.go

  1. package server
  2. import (
  3. "log"
  4. "net/http"
  5. mysql_vue "wolflong.com/vue_http/lib/mysql"
  6. sq3_vue "wolflong.com/vue_http/lib/sqlite"
  7. )
  8. var comment Comment = sq3_vue.Comment{}
  9. var gameblog Gameblog = mysql_vue.Gameblog{}
  10. func StartServer() {
  11. err := http.ListenAndServe(":1314", nil)
  12. if err != nil {
  13. log.Fatal("ListenAndServe: ", err)
  14. }
  15. }

postman test api

使用 postman 测试当前接口。

Axios

修改 HomeView.vue 的选项卡api,在 created 钩子函数添加axios请求访问。

  1. created() {
  2. this.axios
  3. .get("queryGameblog")
  4. .then((response) => {
  5. if (!response.data) {
  6. this.gameBlog = [];
  7. return;
  8. }
  9. this.gameBlog = response.data;
  10. })
  11. .catch((err) => {
  12. console.log(err);
  13. });
  14. },

gamelist.go

查询语句使用两次左连接,并用 group_concat 聚合函数,聚合 tag,分解tag的过程可以从服务端迁移到客户端进行降低性能消耗。

  1. package mysql_vue
  2. import (
  3. "encoding/json"
  4. "strings"
  5. )
  6. type Gamelist struct {
  7. // ID int64 `db:"id" json:"id"`
  8. Title string `db:"title" json:"title"`
  9. Text string `db:"text" json:"text"`
  10. Img string `db:"img" json:"img"`
  11. Price float64 `db:"price" json:"price"`
  12. Tag []string `db:"tag" json:"tag"` // 新添加
  13. Web bool `db:"Web" json:"web"`
  14. }
  15. // type Tag struct {
  16. // ID int64 `db:"id" json:"id"`
  17. // Title string `db:"title" json:"title"`
  18. // }
  19. func (Gamelist) QueryGamelist() (json_ []byte, err error) {
  20. db, err := GetMySQLDB()
  21. checkError(err)
  22. defer db.Close()
  23. results, err := db.Query(`select a.title,a.text,img,price,web,if(group_concat(c.title separator "#") is null ,"", group_concat(c.title separator "#")) as tag from game a left join gametag b on a.id = b.gameid left join tag c on b.tagid = c.id group by a.id;`)
  24. checkError(err)
  25. var GameList []Gamelist
  26. for results.Next() {
  27. var g Gamelist
  28. var tag string
  29. err = results.Scan(&g.Title, &g.Text, &g.Img, &g.Price, &g.Web, &tag)
  30. g.Tag = strings.Split(tag, "#") // 这里暂且由服务端完成分解
  31. checkError(err)
  32. GameList = append(GameList, g)
  33. }
  34. json_, err = json.Marshal(GameList)
  35. checkError(err)
  36. return json_, nil
  37. }

HTTP

gamelist.go

  1. package server
  2. import (
  3. "fmt"
  4. "net/http"
  5. )
  6. type Gamelist interface {
  7. QueryGamelist() (json_ []byte, err error)
  8. }
  9. func init() {
  10. http.HandleFunc("/queryGamelist", QueryGamelist)
  11. }
  12. func QueryGamelist(w http.ResponseWriter, r *http.Request) {
  13. if r.Method != "GET" {
  14. fmt.Fprintf(w, "Only GET Method")
  15. return
  16. }
  17. json, err := gamelist.QueryGamelist()
  18. if err != nil {
  19. fmt.Fprintf(w, "Error Delete")
  20. return
  21. }
  22. fmt.Fprint(w, string(json))
  23. }

server.go

添加语句 var gamelist Gamelist = mysql_vue.Gamelist{}

Axios

  1. this.axios
  2. .get("queryGamelist")
  3. .then((response) => {
  4. if (!response.data) {
  5. this.latestGames.games = [];
  6. this.mostFeatureGames.games = [];
  7. return;
  8. }
  9. this.latestGames.games = response.data;
  10. this.mostFeatureGames.games = response.data;
  11. })
  12. .catch((err) => {
  13. console.log(err);
  14. });

我的Vue之旅 09 数据数据库表的存储与获取实现 Mysql + Golang的更多相关文章

  1. 我的Vue之旅 10 Gin重写后端、实现页面详情页 Mysql + Golang + Gin

    第三期 · 使用 Vue 3.1 + Axios + Golang + Mysql + Gin 实现页面详情页 使用 Gin 框架重写后端 Gin Web Framework (gin-gonic.c ...

  2. 亿级用户下的新浪微博平台架构 前端机(提供 API 接口服务),队列机(处理上行业务逻辑,主要是数据写入),存储(mc、mysql、mcq、redis 、HBase等)

    https://mp.weixin.qq.com/s/f319mm6QsetwxntvSXpKxg 亿级用户下的新浪微博平台架构 炼数成金前沿推荐 2014-12-04 序言 新浪微博在2014年3月 ...

  3. MySQL更改数据库表的存储引擎

    MySQL更改数据库表的存储引擎 1.查看表的原存储引擎 show create table user; 'user', 'CREATE TABLE `user` (\n `id` int(11) N ...

  4. Java获取数据库表 字段 存储的部分数据

    在浏览器页面,选中图片(可多选) >单击删除按钮. 重点是, 本数据库表TabHeBeiTianQi中 存在 同一id,对应的picLocalPath字段  存储了多张图片,图片地址用   逗号 ...

  5. 数据库表中MAX ID获取,确保每次调用没有重复工具类(NumberUtil)

    下面这个类是获取数据库中一个字段的最大值.配置在数据库中. public class NoFactory { private final static Logger cLogger = Logger. ...

  6. Vue刷新页面VueX中数据清空了,怎么重新获取?

    Vue刷新页面VueX数据清空了,怎么重新获取? 点击打开视频讲解更详细 在vue中刷新页面后,vuex中的数据就没有了,这时我们要想使用就要重新获取数据了, 怎么在刷新后重新获取数据呢??? 这时我 ...

  7. mysql关于数据库表的水平拆分和垂直拆分

    最初知道水平垂直分表的时候是刚参加工作不久的时候,知道了这个概念,但是公司用户量和数据量始终没上来,所以也没用到过,知道有一天到了一家新公司后,这些才被应用到实际开发中,这里我就大概说说关于水平和垂直 ...

  8. 用MySQL创建数据库和数据库表

    1.使用SHOW语句找出在服务器上当前存在什么数据库: mysql> SHOW DATABASES; +----------+ | Database | +----------+ | mysql ...

  9. MySQL基于左右值编码的树形数据库表结构设计

    MySQL基于左右值编码的树形数据库表结构设计   在关系型数据库中设计树形的数据结构一直是一个十分考验开发者能力的,最常用的方案有主从表方案和继承关系(parent_id)方案.主从表方案的最大缺点 ...

随机推荐

  1. 在 Linux 系统中安装 Node.js 的流程

    下载资源包 在 NodeJS 官网下载压缩包: 将压缩包中的 node-v14.17.0-linux-x64.tar 拖出来,只需要里面的 tar 压缩包. 解压到 Linux 目录中 解压压缩包到当 ...

  2. identity4 系列————持久化配置篇[五]

    前言 上面已经介绍了3个例子了,并且介绍了如何去使用identity. 但是在前面的例子中,我们使用的都是在内存中操作,那么正式上线可能需要持久到数据库中. 这里值得说明的是,并不一定一定要持久化到数 ...

  3. 彻底搞懂C#异步编程 async和await的原理

    1.前提 熟练掌握Task并行编程. 2.用Task并行解释async和await异步 因为控制台有多线程操作的优化,因此这里选择winform来做示例. 测试代码如下所示: 有三个textbox,一 ...

  4. KingbaseES 绑定变量窥探机制

    概述: 对于数据严重倾斜的,极端如以下例子,不同的传入值,可能执行计划不同,制定执行计划时,就要求知道变量的值.对于绑定变量的情况,我们知道Oracle 有 _optim_peek_user_bind ...

  5. Windows客户端DNS工作原理

    通常大家对Windows客户端DNS的配置存在多个误区. 误区一,配置1个内网DNS,1个外网DNS.解析内网的时候用内网DNS,解析外网的时候用外网. 电脑怎么知道哪个是内网?哪个是外网?我们内部的 ...

  6. 微信公众号商城、小程序商城、H5商城 实例 前后端源码

    CRMEB客户管理+电商营销系统  https://gitee.com/ZhongBangKeJi/CRMEB 演示站后台: http://demo.crmeb.net/admin 账号:demo 密 ...

  7. 使用logstash同步mysql 多表数据到ElasticSearch实践

    参考样式即可,具体使用配置参数根据实际情况而定 input { jdbc { jdbc_connection_string => "jdbc:mysql://localhost/数据库 ...

  8. 市面上erp软件那么多,为什么很多卖家选择定制erp?

    为什么选择定制ERP?适合自己的才是最好的啊!就连头部ERP企业提供给用户的ERP系统,应该也没有不进行个性化定制的吧,匹配很重要!规模不同.行业不同.发展阶段不同.生产模式不同.管理理念不同,适用的 ...

  9. [题解] Atcoder ARC 142 E Pairing Wizards 最小割

    题目 建图很妙,不会. 考虑每一对要求合法的巫师(x,y),他们两个的\(a\)必须都大于\(min(b_x,b_y)\).所以在输入的时候,如果\(a_x\)或者\(a_y\)小于\(min(b_x ...

  10. 云原生下基于K8S声明式GitOps持续部署工具ArgoCD实战-上

    @ 目录 概述 定义 工作原理 主要组件 核心概念 环境准备 概述 安装Kubekey 创建K8S 安装K9S OpenLB 安装ArgoCD 安装 ArgoCD CLI 从Git库中创建一个应用程序 ...