u
This commit is contained in:
1 parent
c0ff3ce883
commit
69d03709ba
41 files changed
+5352
-67
No files matched your search
@@ -1,5 +1,27 @@
|
||||
package auth
|
||||
|
||||
func InitAuthRouter() {
|
||||
import (
|
||||
response "base-go-v2/internal/reponse"
|
||||
"base-go-v2/internal/router"
|
||||
)
|
||||
|
||||
func InitAuthRouter(r *router.Router) {
|
||||
group := r.Group("auth")
|
||||
group.POST("/login/default", loginDefault)
|
||||
}
|
||||
|
||||
// 默认登录
|
||||
func loginDefault(c *router.Context) error {
|
||||
return response.Success(c).Send()
|
||||
}
|
||||
|
||||
// 注册
|
||||
func registerDefault(c *router.Context) error {
|
||||
var req struct {
|
||||
Email string `json:"email"`
|
||||
Password string `json:"password"`
|
||||
}
|
||||
|
||||
if err := c.BindJSON(&req); err != nil {
|
||||
}
|
||||
}
|
||||
+5
-4
@@ -1,15 +1,15 @@
|
||||
package database
|
||||
package db
|
||||
|
||||
import (
|
||||
"base-go-v2/internal/config"
|
||||
"database/sql"
|
||||
"fmt"
|
||||
"time"
|
||||
|
||||
"github.com/jmoiron/sqlx"
|
||||
_ "github.com/lib/pq"
|
||||
)
|
||||
|
||||
var DB *sql.DB
|
||||
var DB *sqlx.DB
|
||||
|
||||
var defaultPoolConfig = struct {
|
||||
MaxOpenConns int
|
||||
@@ -28,7 +28,7 @@ func InitDb() error {
|
||||
dsn := fmt.Sprintf("host=%s port=%d user=%s password=%s dbname=%s sslmode=disable",
|
||||
d.Host, d.Port, d.User, d.Password, d.Dbname)
|
||||
|
||||
db, err := sql.Open("postgres", dsn)
|
||||
db, err := sqlx.Connect("postgres", dsn)
|
||||
if err != nil {
|
||||
return fmt.Errorf("打开数据库失败: %w", err)
|
||||
}
|
||||
@@ -60,5 +60,6 @@ func InitDb() error {
|
||||
fmt.Printf("✅ 数据库连接成功:%s:%d/%s\n", d.Host, d.Port, d.Dbname)
|
||||
|
||||
DB = db
|
||||
|
||||
return nil
|
||||
}
|
||||
@@ -0,0 +1,61 @@
|
||||
package db
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
)
|
||||
|
||||
// DeleteOne 根据主键删除单条记录
|
||||
func DeleteOne(table string, pkColumn string, pkValue interface{}) (int64, error) {
|
||||
tx, err := DB.Beginx()
|
||||
if err != nil {
|
||||
return 0, err
|
||||
}
|
||||
|
||||
query := fmt.Sprintf("DELETE FROM %s WHERE %s=$1", table, pkColumn)
|
||||
res, err := tx.Exec(query, pkValue)
|
||||
if err != nil {
|
||||
tx.Rollback()
|
||||
return 0, err
|
||||
}
|
||||
|
||||
if err := tx.Commit(); err != nil {
|
||||
return 0, err
|
||||
}
|
||||
|
||||
return res.RowsAffected()
|
||||
}
|
||||
|
||||
// DeleteBatch 根据主键批量删除记录
|
||||
func DeleteBatch(table string, pkColumn string, pkValues []interface{}) (int64, error) {
|
||||
if len(pkValues) == 0 {
|
||||
return 0, nil
|
||||
}
|
||||
|
||||
tx, err := DB.Beginx()
|
||||
if err != nil {
|
||||
return 0, err
|
||||
}
|
||||
|
||||
total := int64(0)
|
||||
for _, pk := range pkValues {
|
||||
query := fmt.Sprintf("DELETE FROM %s WHERE %s=$1", table, pkColumn)
|
||||
res, err := tx.Exec(query, pk)
|
||||
if err != nil {
|
||||
tx.Rollback()
|
||||
return 0, err
|
||||
}
|
||||
|
||||
rows, err := res.RowsAffected()
|
||||
if err != nil {
|
||||
tx.Rollback()
|
||||
return 0, err
|
||||
}
|
||||
total += rows
|
||||
}
|
||||
|
||||
if err := tx.Commit(); err != nil {
|
||||
return 0, err
|
||||
}
|
||||
|
||||
return total, nil
|
||||
}
|
||||
@@ -0,0 +1,146 @@
|
||||
package db
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"strings"
|
||||
)
|
||||
|
||||
// ---------------- 内部辅助函数 ----------------
|
||||
|
||||
// buildInsertSQL 构建插入 SQL 和参数
|
||||
func buildInsertSQL(table string, data map[string]interface{}, returning string) (string, []interface{}) {
|
||||
columns := make([]string, 0, len(data))
|
||||
placeholders := make([]string, 0, len(data))
|
||||
values := make([]interface{}, 0, len(data))
|
||||
|
||||
i := 1
|
||||
for k, v := range data {
|
||||
columns = append(columns, k)
|
||||
placeholders = append(placeholders, fmt.Sprintf("$%d", i))
|
||||
values = append(values, v)
|
||||
i++
|
||||
}
|
||||
|
||||
sql := fmt.Sprintf("INSERT INTO %s (%s) VALUES (%s)", table,
|
||||
strings.Join(columns, ","), strings.Join(placeholders, ","))
|
||||
|
||||
if returning != "" {
|
||||
sql += " RETURNING " + returning
|
||||
}
|
||||
|
||||
return sql, values
|
||||
}
|
||||
|
||||
// ---------------- 公共方法 ----------------
|
||||
|
||||
// InsertOne 插入单条记录,返回受影响行数
|
||||
func InsertOne(table string, data map[string]interface{}) (int64, error) {
|
||||
tx, err := DB.Beginx()
|
||||
if err != nil {
|
||||
return 0, err
|
||||
}
|
||||
|
||||
sql, values := buildInsertSQL(table, data, "")
|
||||
res, err := tx.Exec(sql, values...)
|
||||
if err != nil {
|
||||
tx.Rollback()
|
||||
return 0, err
|
||||
}
|
||||
|
||||
if err := tx.Commit(); err != nil {
|
||||
return 0, err
|
||||
}
|
||||
|
||||
return res.RowsAffected()
|
||||
}
|
||||
|
||||
// InsertBatch 批量插入,返回总受影响行数
|
||||
func InsertBatch(table string, dataList []map[string]interface{}) (int64, error) {
|
||||
if len(dataList) == 0 {
|
||||
return 0, nil
|
||||
}
|
||||
|
||||
tx, err := DB.Beginx()
|
||||
if err != nil {
|
||||
return 0, err
|
||||
}
|
||||
|
||||
total := int64(0)
|
||||
|
||||
for _, data := range dataList {
|
||||
sql, values := buildInsertSQL(table, data, "")
|
||||
res, err := tx.Exec(sql, values...)
|
||||
if err != nil {
|
||||
tx.Rollback()
|
||||
return 0, err
|
||||
}
|
||||
rows, err := res.RowsAffected()
|
||||
if err != nil {
|
||||
tx.Rollback()
|
||||
return 0, err
|
||||
}
|
||||
total += rows
|
||||
}
|
||||
|
||||
if err := tx.Commit(); err != nil {
|
||||
return 0, err
|
||||
}
|
||||
|
||||
return total, nil
|
||||
}
|
||||
|
||||
// InsertOneReturnPK 插入单条记录,返回主键值
|
||||
func InsertOneReturnPK(table string, pkColumn string, data map[string]interface{}) (int64, error) {
|
||||
tx, err := DB.Beginx()
|
||||
if err != nil {
|
||||
return 0, err
|
||||
}
|
||||
|
||||
sql, values := buildInsertSQL(table, data, pkColumn)
|
||||
|
||||
var pk int64
|
||||
err = tx.Get(&pk, sql, values...)
|
||||
if err != nil {
|
||||
tx.Rollback()
|
||||
return 0, err
|
||||
}
|
||||
|
||||
if err := tx.Commit(); err != nil {
|
||||
return 0, err
|
||||
}
|
||||
|
||||
return pk, nil
|
||||
}
|
||||
|
||||
// InsertBatchReturnPK 批量插入多条记录,返回主键数组
|
||||
func InsertBatchReturnPK(table string, pkColumn string, dataList []map[string]interface{}) ([]int64, error) {
|
||||
if len(dataList) == 0 {
|
||||
return nil, nil
|
||||
}
|
||||
|
||||
tx, err := DB.Beginx()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
var pkList []int64
|
||||
|
||||
for _, data := range dataList {
|
||||
sql, values := buildInsertSQL(table, data, pkColumn)
|
||||
|
||||
var pk int64
|
||||
err := tx.Get(&pk, sql, values...)
|
||||
if err != nil {
|
||||
tx.Rollback()
|
||||
return nil, err
|
||||
}
|
||||
|
||||
pkList = append(pkList, pk)
|
||||
}
|
||||
|
||||
if err := tx.Commit(); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return pkList, nil
|
||||
}
|
||||
@@ -0,0 +1,96 @@
|
||||
package db
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"strings"
|
||||
)
|
||||
|
||||
// ---------------- 通用查询方法 ----------------
|
||||
|
||||
// GetOne 根据主键查询单条记录,返回 map[string]interface{}
|
||||
func GetOne(table string, pkColumn string, pkValue interface{}) (map[string]interface{}, error) {
|
||||
query := fmt.Sprintf("SELECT * FROM %s WHERE %s=$1", table, pkColumn)
|
||||
|
||||
row := make(map[string]interface{})
|
||||
err := DB.Get(&row, query, pkValue)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return row, nil
|
||||
}
|
||||
|
||||
// GetBatch 根据主键批量查询,返回 []map[string]interface{}
|
||||
func GetBatch(table string, pkColumn string, pkValues []interface{}) ([]map[string]interface{}, error) {
|
||||
if len(pkValues) == 0 {
|
||||
return nil, nil
|
||||
}
|
||||
|
||||
var rows []map[string]interface{}
|
||||
|
||||
// 构建 IN 占位符
|
||||
placeholders := make([]string, len(pkValues))
|
||||
for i := range pkValues {
|
||||
placeholders[i] = fmt.Sprintf("$%d", i+1)
|
||||
}
|
||||
|
||||
query := fmt.Sprintf("SELECT * FROM %s WHERE %s IN (%s)", table, pkColumn, strings.Join(placeholders, ","))
|
||||
err := DB.Select(&rows, query, pkValues...)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return rows, nil
|
||||
}
|
||||
|
||||
// Find 根据条件查询多条记录,可选排序
|
||||
// conditions: map[column]value, 将以 AND 拼接
|
||||
// orderBy: 可选排序字段,如 "created_at ASC",为空默认 "b_id DESC"
|
||||
func Find(table string, conditions map[string]interface{}, orderBy ...string) ([]map[string]interface{}, error) {
|
||||
if len(conditions) == 0 {
|
||||
return nil, fmt.Errorf("查询条件不能为空")
|
||||
}
|
||||
|
||||
var whereParts []string
|
||||
var values []interface{}
|
||||
i := 1
|
||||
for k, v := range conditions {
|
||||
whereParts = append(whereParts, fmt.Sprintf("%s=$%d", k, i))
|
||||
values = append(values, v)
|
||||
i++
|
||||
}
|
||||
|
||||
query := fmt.Sprintf("SELECT * FROM %s WHERE %s", table, strings.Join(whereParts, " AND "))
|
||||
|
||||
order := "b_id DESC"
|
||||
if len(orderBy) > 0 && orderBy[0] != "" {
|
||||
order = orderBy[0]
|
||||
}
|
||||
query += " ORDER BY " + order
|
||||
|
||||
var rows []map[string]interface{}
|
||||
err := DB.Select(&rows, query, values...)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return rows, nil
|
||||
}
|
||||
|
||||
// FindAll 查询整个表,可选排序
|
||||
func FindAll(table string, orderBy ...string) ([]map[string]interface{}, error) {
|
||||
query := fmt.Sprintf("SELECT * FROM %s", table)
|
||||
|
||||
order := "b_id DESC"
|
||||
if len(orderBy) > 0 && orderBy[0] != "" {
|
||||
order = orderBy[0]
|
||||
}
|
||||
query += " ORDER BY " + order
|
||||
|
||||
var rows []map[string]interface{}
|
||||
err := DB.Select(&rows, query)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return rows, nil
|
||||
}
|
||||
@@ -0,0 +1,103 @@
|
||||
package db
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"strings"
|
||||
)
|
||||
|
||||
// ---------------- 内部辅助函数 ----------------
|
||||
|
||||
// buildUpdateSQL 构建 UPDATE SQL 和参数
|
||||
// idColumn: 主键列名
|
||||
func buildUpdateSQL(table string, data map[string]interface{}, idColumn string) (string, []interface{}) {
|
||||
var setParts []string
|
||||
var values []interface{}
|
||||
i := 1
|
||||
for k, v := range data {
|
||||
setParts = append(setParts, fmt.Sprintf("%s=$%d", k, i))
|
||||
values = append(values, v)
|
||||
i++
|
||||
}
|
||||
// WHERE id = $n
|
||||
sql := fmt.Sprintf("UPDATE %s SET %s WHERE %s=$%d",
|
||||
table,
|
||||
strings.Join(setParts, ", "),
|
||||
idColumn,
|
||||
i,
|
||||
)
|
||||
return sql, values
|
||||
}
|
||||
|
||||
// ---------------- 公共方法 ----------------
|
||||
|
||||
// UpdateOne 更新单条记录,按主键 idColumn
|
||||
func UpdateOne(table string, idColumn string, id interface{}, data map[string]interface{}) (int64, error) {
|
||||
tx, err := DB.Beginx()
|
||||
if err != nil {
|
||||
return 0, err
|
||||
}
|
||||
|
||||
sql, values := buildUpdateSQL(table, data, idColumn)
|
||||
values = append(values, id) // 最后一个参数是 id
|
||||
|
||||
res, err := tx.Exec(sql, values...)
|
||||
if err != nil {
|
||||
err := tx.Rollback()
|
||||
if err != nil {
|
||||
return 0, err
|
||||
}
|
||||
return 0, err
|
||||
}
|
||||
|
||||
if err := tx.Commit(); err != nil {
|
||||
return 0, err
|
||||
}
|
||||
|
||||
return res.RowsAffected()
|
||||
}
|
||||
|
||||
// UpdateBatch 批量更新,dataList 中每个 map 必须包含主键 idColumn
|
||||
func UpdateBatch(table string, idColumn string, dataList []map[string]interface{}) (int64, error) {
|
||||
if len(dataList) == 0 {
|
||||
return 0, nil
|
||||
}
|
||||
|
||||
tx, err := DB.Beginx()
|
||||
if err != nil {
|
||||
return 0, err
|
||||
}
|
||||
|
||||
total := int64(0)
|
||||
for _, data := range dataList {
|
||||
idValue, ok := data[idColumn]
|
||||
if !ok {
|
||||
tx.Rollback()
|
||||
return 0, fmt.Errorf("缺少主键列 %s", idColumn)
|
||||
}
|
||||
|
||||
// 移除主键列,否则会重复在 SET 中出现
|
||||
delete(data, idColumn)
|
||||
|
||||
sql, values := buildUpdateSQL(table, data, idColumn)
|
||||
values = append(values, idValue)
|
||||
|
||||
res, err := tx.Exec(sql, values...)
|
||||
if err != nil {
|
||||
tx.Rollback()
|
||||
|
||||
return 0, err
|
||||
}
|
||||
rows, err := res.RowsAffected()
|
||||
if err != nil {
|
||||
tx.Rollback()
|
||||
return 0, err
|
||||
}
|
||||
total += rows
|
||||
}
|
||||
|
||||
if err := tx.Commit(); err != nil {
|
||||
return 0, err
|
||||
}
|
||||
|
||||
return total, nil
|
||||
}
|
||||
Reference in new issue
Block a user