# douyin-try
**Repository Path**: lyrLearning/douyin-try
## Basic Information
- **Project Name**: douyin-try
- **Description**: 自己独立写一下青训营douyin项目
- **Primary Language**: Go
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2022-07-30
- **Last Updated**: 2022-10-19
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# swagger
参考文档:https://wnanbei.github.io/post/gin-%E9%85%8D%E7%BD%AE-swagger-%E6%8E%A5%E5%8F%A3%E6%96%87%E6%A1%A3/
## 基本知识
每次更新swagger文档,我们需要:swag init
访问swagger文档地址:localhost:8080/swagger/index.html
访问"/swagger/doc.json",得到的是/docs/swagger.json文件信息
_ "com.lin/douyin-try/docs",main.go里面必须导入这个包
## main.go里面标注的
//@title 文档标题
//@version 1.0 版本号1.0
//@description 文档描述
```go
//改掉就相当于禁用了
url := ginSwagger.URL("/swagger/doc.json")
```



## 注释外部访问接口

## 杂记
1. 全局变量名不能与type struct 名称{}的这个名同名,但在函数里面是可以的,方法是特殊的函数。
2. 使用gorm开启事务之后,就不要使用它获取原生的sql.DB了,因为这样它们的事务是不同步的。
3. 更新操作,存在表达式怎么办呢?db.Model(&product).Update("price", gorm.Expr("price * ? + ?", 2, 100))
4. 我们开启事务之后,假如叫tx,这个变量是会发生改变的,所以使用之后要加tx = tx.(XXXX)
5. 开启一个事务之后,一开始Creat存在条件,后面我们就行使用到条件,会把前面的条件继续拼接上去
## gorm
使用gorm一圈下来啊,发现当我吐槽官方文档傻逼的时候,认为官方文档的例子傻逼的时候,我都会在模范官方的例子中解决问题。
关于事务的问题:手动开关事务的过程中,我们需要注意的是,当我们执行了一个sql之后,tx变量会发生改变的,
这个时候如果我们让 tx = tx.XXX 的话,那完了,回不去原来的tx了。
正确的做法是,执行完之后,我们直接.里面的 `Error` ,没报错就通过,或者使用一个临时变量保存起来
然后接下来的事务继续使用一开始开事务的那个就行了,如果不这样的话,就会出现前面的条件又拼接到现在的sql上面了。
我们需要加过滤条件的时候,先`where`然后再搞后面的。
```go
var users []respMsg.UserMsg
err := model.DB.Table(
"follow",
).Select(
"user.id, user.nickname, user.follow_count, user.follower_count",
).Joins(
"JOIN `user` ON user.`id` = follow.`follow_id`",
).Where("follow.`follower_id` = ?", userId).Find(&users).Error
return users, err
```
直接写表名的话,无法拼接逻辑删除字段进行的。
解决方法:1、使用`.Model()`来确定;2、再where后面加上 `and deleted_at IS NULL` 就行了
想要gorm每次执行都能看到日志,就在创建gorm的DB的时候,加上Logger,并且配上info的日志级别
```go
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{
//为了确保数据一致性,GORM 会在事务里执行写入操作(创建、更新、删除)
SkipDefaultTransaction: true,
//PreparedStmt 在执行任何SQL时都会创建一个prepared statement并将其缓存,以提高后续的效率
PrepareStmt: true, //缓存预编译语句
Logger: logger.Default.LogMode(logger.Info),
})
```
## 跑起我们的抖声项目
首先,我们使用模拟器安装这个`.apk`文件
然后,打开该app双击我的,填写本地主机的IPV4地址(在cmd中输入ipconfig可查看)
最后,就可以进行测试了。