Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

修复Verify实现的错误 #2

Open
wants to merge 92 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
92 commits
Select commit Hold shift + click to select a range
13e0454
air 自动重载
summerblue Jan 8, 2022
2de157c
集成 gin
summerblue Jan 8, 2022
4e5ca37
修复 gin should be direct 的提示
summerblue Jan 8, 2022
4d852c9
初始化路由
summerblue Jan 8, 2022
2437920
配置方案的实现
summerblue Jan 8, 2022
8cad7c5
初始化数据库
summerblue Jan 8, 2022
47296e4
用户模型
summerblue Jan 8, 2022
cf7fd05
手机是否注册接口
summerblue Jan 8, 2022
6b292e6
验证请求
summerblue Jan 8, 2022
177b049
Email 是否已注册接口
summerblue Jan 8, 2022
cfed2bf
JSON 解析和验证器封装
summerblue Jan 8, 2022
1b19cb5
初始化日志库
summerblue Jan 8, 2022
09705f3
日志辅助方法
summerblue Jan 8, 2022
58b968f
HTTP 访问日志
summerblue Jan 8, 2022
ec0b8bc
Panic Recovery
summerblue Jan 8, 2022
3ff2400
数据库请求日志
summerblue Jan 8, 2022
a13fcc9
使用 Redis
summerblue Jan 8, 2022
f8b7923
图片验证码库(captcha)
summerblue Jan 8, 2022
7ef68c0
图片验证码接口
summerblue Jan 8, 2022
3aa63e2
response 包
summerblue Jan 8, 2022
8e69257
发送短信(sms 包)
summerblue Jan 8, 2022
f10100e
验证码库
summerblue Jan 8, 2022
ee86174
发送短信验证码
summerblue Jan 8, 2022
1e3c19d
发送邮件(mail 包)
summerblue Jan 8, 2022
3268e18
发送邮件验证码
summerblue Jan 8, 2022
142e478
手机号+短信验证码注册
summerblue Jan 8, 2022
e5fd7b5
Email + 邮件验证码注册
summerblue Jan 8, 2022
7b50418
密码加密存储
summerblue Jan 8, 2022
99667f0
JWT 授权
summerblue Jan 8, 2022
dd72eac
手机 + 短信验证码登录
summerblue Jan 8, 2022
67bc63a
使用密码登录
summerblue Jan 8, 2022
4bb9111
Refresh Token
summerblue Jan 8, 2022
67d6042
Auth 中间件
summerblue Jan 8, 2022
d045afc
Guest 中间件
summerblue Jan 8, 2022
cc9d30c
通过手机找回密码
summerblue Jan 8, 2022
8e9d40c
通过邮箱找回密码
summerblue Jan 8, 2022
d8a1b48
限流中间件
summerblue Jan 8, 2022
6178831
console 包
summerblue Jan 8, 2022
5b049de
命令行模式
summerblue Jan 8, 2022
27212dd
key 命令
summerblue Jan 8, 2022
7a5443b
play 命令
summerblue Jan 8, 2022
5ee286a
参数格式化(str 包)
summerblue Jan 11, 2022
e2e3dfa
make cmd 命令
summerblue Jan 11, 2022
fe55df9
make model 命令
summerblue Jan 11, 2022
339b258
make apicontroller 命令
summerblue Jan 11, 2022
711ed97
make request 命令
summerblue Jan 11, 2022
a1d73ec
migrate 包
summerblue Jan 11, 2022
53f510e
migrate up 命令
summerblue Jan 11, 2022
30ec7af
make migration 命令
summerblue Jan 11, 2022
18d0d75
migrate rollback 命令
summerblue Jan 11, 2022
2c55132
migrate reset 和 fresh 命令
summerblue Jan 11, 2022
31ddf3b
migrate fresh 命令
summerblue Jan 11, 2022
5f3293f
当前用户接口
summerblue Jan 11, 2022
3a02ee0
factory 和 Faker
summerblue Jan 12, 2022
55430d9
seed 命令
summerblue Jan 12, 2022
ef78c50
make factory 命令
summerblue Jan 12, 2022
a6bb597
make seed 命令
summerblue Jan 12, 2022
9631f3c
用户列表
summerblue Jan 12, 2022
68dc7d5
paginator 分页
summerblue Jan 12, 2022
5f98b2c
用户列表分页
summerblue Jan 12, 2022
5814d0d
验证分页请求
summerblue Jan 12, 2022
e9ea8f2
模型模板里添加分页
summerblue Jan 12, 2022
d4246b6
分类模型
summerblue Jan 12, 2022
ddd547a
创建分类
summerblue Jan 12, 2022
f78b798
更新分类
summerblue Jan 12, 2022
0ad07f6
分类列表
summerblue Jan 12, 2022
135e3ec
删除分类
summerblue Jan 12, 2022
c3edd2c
话题模型和迁移
summerblue Jan 12, 2022
4543e71
创建话题
summerblue Jan 12, 2022
fea9023
话题更新
summerblue Jan 12, 2022
55075e3
授权策略
summerblue Jan 12, 2022
7f9a031
make policy 命令
summerblue Jan 12, 2022
c0bd700
删除话题
summerblue Jan 12, 2022
8ab3e84
话题列表
summerblue Jan 12, 2022
5ca5a06
显示话题
summerblue Jan 12, 2022
9e792c4
友情链接模型和迁移
summerblue Jan 12, 2022
2d937c8
友情链接列表
summerblue Jan 12, 2022
f33fe80
cache 包
summerblue Jan 12, 2022
deca251
缓存友情链接列表
summerblue Jan 12, 2022
a09d753
cache clear 命令
summerblue Jan 12, 2022
a75be98
cache forget 命令
summerblue Jan 12, 2022
8af338c
编辑个人资料
summerblue Jan 12, 2022
5b8336b
修改邮箱
summerblue Jan 12, 2022
7f56c39
修改手机号
summerblue Jan 12, 2022
a0d4738
修改密码
summerblue Jan 12, 2022
be2824a
上传用户头像
summerblue Jan 12, 2022
c87d587
图片裁切
summerblue Jan 12, 2022
af82b3a
强制 User Agent 中间件
summerblue Jan 12, 2022
226c3df
API 域名和前缀
summerblue Jan 12, 2022
d0bf498
.env.example 文件
summerblue Jan 12, 2022
571184a
add readme
summerblue Jan 12, 2022
9c6dd8e
修复Verify实现的错误
wangshantao Feb 7, 2022
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
54 changes: 54 additions & 0 deletions .air.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
# https://github.com/cosmtrek/air/blob/master/air_example.toml TOML 格式的配置文件

# 工作目录
# 使用 . 或绝对路径,请注意 `tmp_dir` 目录必须在 `root` 目录下
root = "."
tmp_dir = "tmp"

[build]
# 由`cmd`命令得到的二进制文件名
bin = "./tmp/main"
# 只需要写你平常编译使用的shell命令。你也可以使用 `make`
cmd = "go build -o ./tmp/main ."
# 如果文件更改过于频繁,则没有必要在每次更改时都触发构建。可以设置触发构建的延迟时间
delay = 1000
# 忽略这些文件扩展名或目录
exclude_dir = ["assets", "tmp", "vendor","public/uploads"]
# 忽略以下文件
exclude_file = []
# 使用正则表达式进行忽略文件设置
exclude_regex = []
# 忽略未变更的慰问金
exclude_unchanged = false
# 监控系统链接的目录
follow_symlink = false
# 自定义参数,可以添加额外的编译标识,例如添加 GIN_MODE=release
full_bin = ""
# 监听以下指定目录的文件
include_dir = []
# 监听以下文件扩展名的文件.
include_ext = ["go", "tpl", "tmpl", "html", "gohtml", "env"]
# kill 命令延迟
kill_delay = "0s"
# air的日志文件名,该日志文件放置在你的`tmp_dir`中
log = "build-errors.log"
# 在 kill 之前发送系统中断信号,windows 不支持此功能
send_interrupt = false
# error 发生是结束运行
stop_on_error = true

[color]
# 自定义每个部分显示的颜色。如果找不到颜色,使用原始的应用程序日志。
app = ""
build = "yellow"
main = "magenta"
runner = "green"
watcher = "cyan"

[log]
# 显示日志时间
time = false

[misc]
# 退出时删除tmp目录
clean_on_exit = false
41 changes: 41 additions & 0 deletions .env.example
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
APP_NAME=Gohub
APP_ENV=local
APP_KEY=zBqYyQrPNaIUsnRhsGtHLivjqiMjBVLS
APP_DEBUG=true
APP_URL=http://localhost:3000
APP_PORT=3000

DB_CONNECTION=sqlite
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=gohub
DB_USERNAME=root
DB_PASSWORD=secret
DB_DEBUG=2

REDIS_HOST=127.0.0.1
REDIS_PORT=6379
REDIS_PASSWORD=
REDIS_CACHE_DB=0
REDIS_MAIN_DB=1

JWT_EXPIRE_TIME=120
JWT_EXPIRE_TIME=86400

MAIL_HOST=localhost
MAIL_PORT=1025
MAIL_USERNAME=
MAIL_PASSWORD=
[email protected]
MAIL_FROM_NAME=Gohub

SMS_ALIYUN_ACCESS_ID=XXX
SMS_ALIYUN_ACCESS_SECRET=XXXXX
SMS_ALIYUN_SIGN_NAME=
SMS_ALIYUN_TEMPLATE_CODE=

VERIFY_CODE_LENGTH=6
VERIFY_CODE_EXPIRE=15

LOG_TYPE=single
LOG_LEVEL=debug
48 changes: 48 additions & 0 deletions app/cmd/cache.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
package cmd

import (
"fmt"
"gohub/pkg/cache"
"gohub/pkg/console"

"github.com/spf13/cobra"
)

var CmdCache = &cobra.Command{
Use: "cache",
Short: "Cache management",
}

var CmdCacheClear = &cobra.Command{
Use: "clear",
Short: "Clear cache",
Run: runCacheClear,
}

var CmdCacheForget = &cobra.Command{
Use: "forget",
Short: "Delete redis key, example: cache forget cache-key",
Run: runCacheForget,
}

// forget 命令的选项
var cacheKey string

func init() {
// 注册 cache 命令的子命令
CmdCache.AddCommand(CmdCacheClear, CmdCacheForget)

// 设置 cache forget 命令的选项
CmdCacheForget.Flags().StringVarP(&cacheKey, "key", "k", "", "KEY of the cache")
CmdCacheForget.MarkFlagRequired("key")
}

func runCacheClear(cmd *cobra.Command, args []string) {
cache.Flush()
console.Success("Cache cleared.")
}

func runCacheForget(cmd *cobra.Command, args []string) {
cache.Forget(cacheKey)
console.Success(fmt.Sprintf("Cache key [%s] deleted.", cacheKey))
}
27 changes: 27 additions & 0 deletions app/cmd/cmd.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
// Package cmd 存放程序的所有子命令
package cmd

import (
"gohub/pkg/helpers"
"os"

"github.com/spf13/cobra"
)

// Env 存储全局选项 --env 的值
var Env string

// RegisterGlobalFlags 注册全局选项(flag)
func RegisterGlobalFlags(rootCmd *cobra.Command) {
rootCmd.PersistentFlags().StringVarP(&Env, "env", "e", "", "load .env file, example: --env=testing will use .env.testing file")
}

// RegisterDefaultCmd 注册默认命令
func RegisterDefaultCmd(rootCmd *cobra.Command, subCmd *cobra.Command) {
cmd, _, err := rootCmd.Find(os.Args[1:])
firtArg := helpers.FirstElement(os.Args[1:])
if err == nil && cmd.Use == rootCmd.Use && firtArg != "-h" && firtArg != "--help" {
args := append([]string{subCmd.Use}, os.Args[1:]...)
rootCmd.SetArgs(args)
}
}
23 changes: 23 additions & 0 deletions app/cmd/key.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package cmd

import (
"gohub/pkg/console"
"gohub/pkg/helpers"

"github.com/spf13/cobra"
)

var CmdKey = &cobra.Command{
Use: "key",
Short: "Generate App Key, will print the generated Key",
Run: runKeyGenerate,
Args: cobra.NoArgs, // 不允许传参
}

func runKeyGenerate(cmd *cobra.Command, args []string) {
console.Success("---")
console.Success("App Key:")
console.Success(helpers.RandomString(32))
console.Success("---")
console.Warning("please go to .env file to change the APP_KEY option")
}
135 changes: 135 additions & 0 deletions app/cmd/make/make.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,135 @@
// Package make 命令行的 make 命令
package make

import (
"embed"
"fmt"
"gohub/pkg/console"
"gohub/pkg/file"
"gohub/pkg/str"
"strings"

"github.com/iancoleman/strcase"
"github.com/spf13/cobra"
)

// Model 参数解释
// 单个词,用户命令传参,以 User 模型为例:
// - user
// - User
// - users
// - Users
// 整理好的数据:
// {
// "TableName": "users",
// "StructName": "User",
// "StructNamePlural": "Users"
// "VariableName": "user",
// "VariableNamePlural": "users",
// "PackageName": "user"
// }
// -
// 两个词或者以上,用户命令传参,以 TopicComment 模型为例:
// - topic_comment
// - topic_comments
// - TopicComment
// - TopicComments
// 整理好的数据:
// {
// "TableName": "topic_comments",
// "StructName": "TopicComment",
// "StructNamePlural": "TopicComments"
// "VariableName": "topicComment",
// "VariableNamePlural": "topicComments",
// "PackageName": "topic_comment"
// }
type Model struct {
TableName string
StructName string
StructNamePlural string
VariableName string
VariableNamePlural string
PackageName string
}

// stubsFS 方便我们后面打包这些 .stub 为后缀名的文件

//go:embed stubs
var stubsFS embed.FS

// CmdMake 说明 cobra 命令
var CmdMake = &cobra.Command{
Use: "make",
Short: "Generate file and code",
}

func init() {
// 注册 make 的子命令
CmdMake.AddCommand(
CmdMakeCMD,
CmdMakeModel,
CmdMakeAPIController,
CmdMakeRequest,
CmdMakeMigration,
CmdMakeFactory,
CmdMakeSeeder,
CmdMakePolicy,
)
}

// makeModelFromString 格式化用户输入的内容
func makeModelFromString(name string) Model {
model := Model{}
model.StructName = str.Singular(strcase.ToCamel(name))
model.StructNamePlural = str.Plural(model.StructName)
model.TableName = str.Snake(model.StructNamePlural)
model.VariableName = str.LowerCamel(model.StructName)
model.PackageName = str.Snake(model.StructName)
model.VariableNamePlural = str.LowerCamel(model.StructNamePlural)
return model
}

// createFileFromStub 读取 stub 文件并进行变量替换
// 最后一个选项可选,如若传参,应传 map[string]string 类型,作为附加的变量搜索替换
func createFileFromStub(filePath string, stubName string, model Model, variables ...interface{}) {

// 实现最后一个参数可选
replaces := make(map[string]string)
if len(variables) > 0 {
replaces = variables[0].(map[string]string)
}

// 目标文件已存在
if file.Exists(filePath) {
console.Exit(filePath + " already exists!")
}

// 读取 stub 模板文件
modelData, err := stubsFS.ReadFile("stubs/" + stubName + ".stub")
if err != nil {
console.Exit(err.Error())
}
modelStub := string(modelData)

// 添加默认的替换变量
replaces["{{VariableName}}"] = model.VariableName
replaces["{{VariableNamePlural}}"] = model.VariableNamePlural
replaces["{{StructName}}"] = model.StructName
replaces["{{StructNamePlural}}"] = model.StructNamePlural
replaces["{{PackageName}}"] = model.PackageName
replaces["{{TableName}}"] = model.TableName

// 对模板内容做变量替换
for search, replace := range replaces {
modelStub = strings.ReplaceAll(modelStub, search, replace)
}

// 存储到目标文件中
err = file.Put([]byte(modelStub), filePath)
if err != nil {
console.Exit(err.Error())
}

// 提示成功
console.Success(fmt.Sprintf("[%s] created.", filePath))
}
36 changes: 36 additions & 0 deletions app/cmd/make/make_apicontroller.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
package make

import (
"fmt"
"gohub/pkg/console"
"strings"

"github.com/spf13/cobra"
)

var CmdMakeAPIController = &cobra.Command{
Use: "apicontroller",
Short: "Create api controller,exmaple: make apicontroller v1/user",
Run: runMakeAPIController,
Args: cobra.ExactArgs(1), // 只允许且必须传 1 个参数
}

func runMakeAPIController(cmd *cobra.Command, args []string) {

// 处理参数,要求附带 API 版本(v1 或者 v2)
array := strings.Split(args[0], "/")
if len(array) != 2 {
console.Exit("api controller name format: v1/user")
}

// apiVersion 用来拼接目标路径
// name 用来生成 cmd.Model 实例
apiVersion, name := array[0], array[1]
model := makeModelFromString(name)

// 组建目标目录
filePath := fmt.Sprintf("app/http/controllers/api/%s/%s_controller.go", apiVersion, model.TableName)

// 基于模板创建文件(做好变量替换)
createFileFromStub(filePath, "apicontroller", model)
}
Loading