v1.0.0
This commit is contained in:
@@ -0,0 +1,68 @@
|
||||
package models
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
|
||||
"gorm.io/gorm"
|
||||
)
|
||||
|
||||
// 系统设置
|
||||
type SystemSetting struct {
|
||||
ID uint `gorm:"primaryKey"`
|
||||
ConfigName string `gorm:"type:varchar(50)"`
|
||||
ConfigValue string `gorm:"type:text"`
|
||||
}
|
||||
|
||||
func (m *SystemSetting) Get(configName string) (result string, err error) {
|
||||
var res SystemSetting
|
||||
if err := Db.Model(m).Select("ConfigValue").First(&res, "config_name=?", configName).Error; err != nil {
|
||||
return result, err
|
||||
}
|
||||
result = res.ConfigValue
|
||||
return result, nil
|
||||
}
|
||||
|
||||
func (m *SystemSetting) GetValueByInterface(configName string, structValue interface{}) error {
|
||||
result, err := m.Get(configName)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
err = json.Unmarshal([]byte(result), structValue)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// 暂时仅支持结构体和字符串
|
||||
func (m *SystemSetting) Set(configName string, configValue interface{}) error {
|
||||
findRes := SystemSetting{}
|
||||
db := Db.Model(m).First(&findRes, "config_name=?", configName)
|
||||
if err := db.Error; err != nil && err != gorm.ErrRecordNotFound {
|
||||
return err
|
||||
}
|
||||
value := ""
|
||||
if s, ok := configValue.(string); !ok {
|
||||
if jsonStr, err := json.Marshal(configValue); err != nil {
|
||||
value = ""
|
||||
} else {
|
||||
value = string(jsonStr)
|
||||
}
|
||||
} else {
|
||||
value = s
|
||||
}
|
||||
|
||||
if db.RowsAffected == 0 {
|
||||
// 添加
|
||||
if err := Db.Model(m).Create(&SystemSetting{ConfigName: configName, ConfigValue: value}).Error; err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
} else {
|
||||
// 修改
|
||||
if err := Db.Model(m).Where("id=?", findRes.ID).Update("config_value", value).Error; err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
@@ -0,0 +1,159 @@
|
||||
package models
|
||||
|
||||
import (
|
||||
"errors"
|
||||
)
|
||||
|
||||
// 用户表
|
||||
type User struct {
|
||||
BaseModel
|
||||
Username string `gorm:"index:;index:idx_username_password,priority:1;type:varchar(50)" json:"username" validate:"required,email"` // 账号
|
||||
Password string `gorm:"index:idx_username_password;type:varchar(32)" json:"password" validate:"required"` // 密码
|
||||
Name string `gorm:"type:varchar(20)" json:"name"` // 名称
|
||||
HeadImage string `gorm:"type:varchar(200)" json:"headImage"` // 头像地址
|
||||
Status int `gorm:"type:tinyint(1)" json:"status"` // 状态 1.启用 2.停用 3.未激活
|
||||
Role int `gorm:"type:int(11)" json:"role"` // 角色 1.管理员 2.普通用户
|
||||
Mail string `gorm:"type:varchar(50)" json:"mail"` // 邮箱
|
||||
ReferralCode string `gorm:"type:varchar(10)" json:"referralCode"` // 推荐码
|
||||
Token string `gorm:"type:varchar(32)" json:"token"`
|
||||
|
||||
UserId uint `gorm:"-" json:"userId"`
|
||||
}
|
||||
|
||||
// 获取用户信息
|
||||
func (m *User) GetUserInfoByUid(uid uint) (User, error) {
|
||||
mUser := User{}
|
||||
err := Db.Where("id=?", uid).First(&mUser).Error
|
||||
return mUser, err
|
||||
}
|
||||
|
||||
// 根据用户名和密码查询用户
|
||||
func (m *User) GetUserInfoByUsernameAndPassword(username, password string) (User, error) {
|
||||
userInfo := User{}
|
||||
err := Db.Where("username=?", username).Where("password=?", password).First(&userInfo).Error
|
||||
return userInfo, err
|
||||
}
|
||||
|
||||
// 根据用户名查询用户
|
||||
func (m *User) GetUserInfoByUsername(username string) (User, error) {
|
||||
mUser := User{}
|
||||
err := Db.Where("username=?", username).First(&mUser).Error
|
||||
return mUser, err
|
||||
}
|
||||
|
||||
// 根据邮箱查询用户
|
||||
func (m *User) GetUserInfoByMail() *User {
|
||||
mUser := User{}
|
||||
if Db.Where("mail=?", m.Mail).First(&mUser).Error != nil {
|
||||
return nil
|
||||
}
|
||||
return &mUser
|
||||
}
|
||||
|
||||
// 根据token查询用户
|
||||
func (m *User) GetUserInfoByToken(userToken string) (User, error) {
|
||||
mUser := User{}
|
||||
err := Db.Where("token=?", userToken).First(&mUser).Error
|
||||
return mUser, err
|
||||
}
|
||||
|
||||
// 更新用户基于id
|
||||
// 支持:name,autograph,header_image,status,role,mail,token,password,username,gender
|
||||
func (m *User) UpdateUserInfoByUserId(user_id uint, updateInfo map[string]interface{}) error {
|
||||
mUser := User{}
|
||||
|
||||
data := map[string]interface{}{}
|
||||
if v, ok := updateInfo["name"]; ok {
|
||||
data["name"] = v
|
||||
}
|
||||
if v, ok := updateInfo["head_image"]; ok {
|
||||
data["head_image"] = v
|
||||
}
|
||||
if v, ok := updateInfo["status"]; ok {
|
||||
data["status"] = v
|
||||
}
|
||||
if v, ok := updateInfo["role"]; ok {
|
||||
data["role"] = v
|
||||
}
|
||||
if v, ok := updateInfo["gender"]; ok {
|
||||
data["gender"] = v
|
||||
}
|
||||
|
||||
if v, ok := updateInfo["mail"]; ok {
|
||||
hasUser := User{}
|
||||
count := Db.Where("mail=?", updateInfo["mail"]).First(&hasUser).RowsAffected
|
||||
if count != 0 && hasUser.ID != user_id {
|
||||
return errors.New("the mail already exists")
|
||||
}
|
||||
data["mail"] = v
|
||||
}
|
||||
if v, ok := updateInfo["username"]; ok {
|
||||
hasUser := User{}
|
||||
count := Db.Where("username=?", updateInfo["username"]).First(&hasUser).RowsAffected
|
||||
if count != 0 && hasUser.ID != user_id {
|
||||
return errors.New("the username already exists")
|
||||
}
|
||||
data["username"] = v
|
||||
}
|
||||
if v, ok := updateInfo["token"]; ok {
|
||||
data["token"] = v
|
||||
}
|
||||
if v, ok := updateInfo["password"]; ok {
|
||||
data["password"] = v
|
||||
}
|
||||
|
||||
err := Db.Model(&mUser).Where("id=?", user_id).Updates(data).Error
|
||||
|
||||
return err
|
||||
}
|
||||
|
||||
// 添加一个
|
||||
func (m *User) CreateOne() (User, error) {
|
||||
err := Db.Create(m).Error
|
||||
return *m, err
|
||||
}
|
||||
|
||||
// 验证是否有重复的用户名或者邮箱
|
||||
func (m *User) CheckMailAndUsername(mail, username string) error {
|
||||
hasUser := User{}
|
||||
count := Db.Where("mail=?", mail).First(&hasUser).RowsAffected
|
||||
if count != 0 {
|
||||
return errors.New("该邮箱已被注册")
|
||||
}
|
||||
|
||||
count = Db.Where("username=?", username).First(&hasUser).RowsAffected
|
||||
if count != 0 {
|
||||
return errors.New("该用户名已被注册")
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// 验证是否有重复的用户名或者邮箱
|
||||
func (m *User) CheckMailExist(mail string) (User, error) {
|
||||
hasUser := User{}
|
||||
count := Db.Where("mail=?", mail).First(&hasUser).RowsAffected
|
||||
if count != 0 {
|
||||
return hasUser, errors.New("该邮箱已被注册")
|
||||
}
|
||||
return hasUser, nil
|
||||
}
|
||||
|
||||
// 验证是否有重复的用户名或者邮箱
|
||||
func (m *User) CheckUsernameExist(username string) (User, error) {
|
||||
hasUser := User{}
|
||||
count := Db.Where("username=?", username).First(&hasUser).RowsAffected
|
||||
if count != 0 {
|
||||
return hasUser, errors.New("该用户名已被注册")
|
||||
}
|
||||
return hasUser, nil
|
||||
}
|
||||
|
||||
// // 根据用户名和密码查询用户
|
||||
// func (m *User) CreateUser(uid uint) *User {
|
||||
// mUser := User{}
|
||||
// if Db.Where("id=?", uid).First(&mUser).Error != nil {
|
||||
// return nil
|
||||
// } else {
|
||||
// return &mUser
|
||||
// }
|
||||
// }
|
||||
@@ -0,0 +1,98 @@
|
||||
package models
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"time"
|
||||
|
||||
_ "gorm.io/driver/mysql"
|
||||
"gorm.io/driver/sqlite"
|
||||
_ "gorm.io/driver/sqlite"
|
||||
"gorm.io/gorm"
|
||||
"gorm.io/gorm/schema"
|
||||
)
|
||||
|
||||
// int类型代表是否的常量
|
||||
const (
|
||||
INT_FALSE = iota
|
||||
INT_TURE
|
||||
)
|
||||
|
||||
type BaseModel struct {
|
||||
gorm.Model
|
||||
// Db *gorm.DB `gorm:"_"`
|
||||
ID uint `gorm:"primarykey" json:"id"`
|
||||
CreatedAt time.Time `json:"createTime"`
|
||||
UpdatedAt time.Time `json:"updateTime"`
|
||||
// DeletedAt DeletedAt `gorm:"index"`
|
||||
}
|
||||
|
||||
type BaseModelNoId struct {
|
||||
CreatedAt time.Time `json:"createTime"`
|
||||
UpdatedAt time.Time `json:"updateTime"`
|
||||
DeletedAt gorm.DeletedAt `gorm:"index"`
|
||||
}
|
||||
|
||||
// 分页的结构体
|
||||
type PageLimitStruct struct {
|
||||
PageSize int `gorm:"-"` //
|
||||
LimitSize int `gorm:"-"` //
|
||||
}
|
||||
|
||||
// 计算分页
|
||||
func calcPage(page_size, limit_size int) (offset, limit int) {
|
||||
offset = limit_size * (page_size - 1)
|
||||
limit = limit_size
|
||||
return
|
||||
}
|
||||
|
||||
var Db *gorm.DB
|
||||
|
||||
func GetDb() (*gorm.DB, error) {
|
||||
var db *gorm.DB
|
||||
var err error
|
||||
|
||||
dbModels := []interface{}{
|
||||
&User{},
|
||||
}
|
||||
dbDrive := "mysql"
|
||||
|
||||
if dbDrive == "mysql" {
|
||||
|
||||
db.Set("gorm:table_options", "ENGINE=InnoDB").AutoMigrate(dbModels...)
|
||||
sqlDb, _ := db.DB()
|
||||
sqlDb.SetMaxIdleConns(10) // SetMaxIdleConns 设置空闲连接池中连接的最大数量
|
||||
sqlDb.SetMaxOpenConns(100) // SetMaxOpenConns 设置打开数据库连接的最大数量。
|
||||
sqlDb.SetConnMaxLifetime(time.Minute) // SetConnMaxLifetime 设置了连接可复用的最大时间。
|
||||
|
||||
} else {
|
||||
fmt.Println("数据库驱动:", "SQLite")
|
||||
db, err = gorm.Open(sqlite.Open("database.db"), &gorm.Config{
|
||||
NamingStrategy: schema.NamingStrategy{
|
||||
// TablePrefix: "blog_",
|
||||
SingularTable: true,
|
||||
},
|
||||
// Logger: GetLogger(),
|
||||
// DisableForeignKeyConstraintWhenMigrating: true,
|
||||
})
|
||||
|
||||
db.AutoMigrate(dbModels...)
|
||||
|
||||
}
|
||||
|
||||
Db = db
|
||||
return Db, err
|
||||
}
|
||||
|
||||
// // 日志
|
||||
// func GetLogger() logger.Interface {
|
||||
// return logger.New(
|
||||
// log.New(os.Stdout, "\r\n", log.LstdFlags), // io writer(日志输出的目标,前缀和日志包含的内容——译者注)
|
||||
// logger.Config{
|
||||
// SlowThreshold: time.Second, // 慢 SQL 阈值
|
||||
// LogLevel: logger.Warn, // 日志级别
|
||||
// IgnoreRecordNotFoundError: true, // 忽略ErrRecordNotFound(记录未找到)错误
|
||||
// Colorful: true, // 彩色打印
|
||||
// },
|
||||
// )
|
||||
|
||||
// }
|
||||
@@ -0,0 +1,53 @@
|
||||
package datatype
|
||||
|
||||
import (
|
||||
"database/sql/driver"
|
||||
"encoding/json"
|
||||
"errors"
|
||||
"fmt"
|
||||
)
|
||||
|
||||
// 项目配置 可用
|
||||
type MapJson map[string]interface{}
|
||||
|
||||
// 查询的时候解析
|
||||
func (j *MapJson) Scan(value interface{}) error {
|
||||
bytes, ok := value.([]byte)
|
||||
if !ok {
|
||||
return errors.New(fmt.Sprint("Failed to unmarshal JSONB value:", value))
|
||||
}
|
||||
err := json.Unmarshal(bytes, j)
|
||||
return err
|
||||
}
|
||||
|
||||
// 保存时的编译
|
||||
func (j MapJson) Value() (driver.Value, error) {
|
||||
str, err := json.Marshal(j)
|
||||
if err != nil {
|
||||
return string(str), err
|
||||
}
|
||||
return string(str), nil
|
||||
}
|
||||
|
||||
type JSON json.RawMessage
|
||||
|
||||
// 实现 sql.Scanner 接口,Scan 将 value 扫描至 Jsonb
|
||||
func (j *JSON) Scan(value interface{}) error {
|
||||
bytes, ok := value.([]byte)
|
||||
if !ok {
|
||||
return errors.New(fmt.Sprint("Failed to unmarshal JSONB value:", value))
|
||||
}
|
||||
|
||||
result := json.RawMessage{}
|
||||
err := json.Unmarshal(bytes, &result)
|
||||
*j = JSON(result)
|
||||
return err
|
||||
}
|
||||
|
||||
// 实现 driver.Valuer 接口,Value 返回 json value
|
||||
func (j JSON) Value() (driver.Value, error) {
|
||||
if len(j) == 0 {
|
||||
return nil, nil
|
||||
}
|
||||
return json.RawMessage(j).MarshalJSON()
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
package datatype
|
||||
|
||||
type ItemIconIconInfo struct {
|
||||
ItemType int `json:"itemType"`
|
||||
Src string `json:"src"`
|
||||
Text string `json:"text"`
|
||||
BgColor string `json:"bgColor"`
|
||||
}
|
||||
@@ -0,0 +1,23 @@
|
||||
package models
|
||||
|
||||
type File struct {
|
||||
BaseModel
|
||||
Src string `json:"src"`
|
||||
UserId uint `json:"userId"`
|
||||
FileName string `json:"fileName" gorm:"varchar(255)"` // 文件名
|
||||
Method int `gorm:"int(5)" json:"method"` // 上传方式
|
||||
Ext string `gorm:"varchar(255)" json:"ext"` // 扩展名
|
||||
}
|
||||
|
||||
// 添加一个文件记录
|
||||
func (m *File) AddFile(userId uint, fileName, ext, src string) (File, error) {
|
||||
file := File{
|
||||
UserId: userId,
|
||||
FileName: fileName,
|
||||
Src: src,
|
||||
Ext: ext,
|
||||
}
|
||||
err := Db.Create(&file).Error
|
||||
|
||||
return file, err
|
||||
}
|
||||
@@ -0,0 +1,18 @@
|
||||
package models
|
||||
|
||||
import "sun-panel/models/datatype"
|
||||
|
||||
type ItemIcon struct {
|
||||
BaseModel
|
||||
IconJson string `gorm:"type:varchar(1000)" json:"-"`
|
||||
Icon datatype.ItemIconIconInfo `gorm:"-" json:"icon"`
|
||||
Title string `gorm:"type:varchar(50)" json:"title"`
|
||||
Url string `gorm:"type:varchar(1000)" json:"url"`
|
||||
LanUrl string `gorm:"type:varchar(1000)" json:"lanUrl"`
|
||||
Description string `gorm:"type:varchar(1000)" json:"description"`
|
||||
OpenMethod int `gorm:"type:tinyint(1)" json:"openMethod"`
|
||||
Sort int `gorm:"type:int(11)" json:"sort"`
|
||||
GroupId int `json:"groupId"` // 为以后分组做准备
|
||||
UserId uint `json:"userId"`
|
||||
User User `json:"user"`
|
||||
}
|
||||
@@ -0,0 +1,18 @@
|
||||
package models
|
||||
|
||||
const (
|
||||
NOTICE_DISPLAY_TYPE_LOGIN = iota + 1 // 通知展示类型 登录页
|
||||
NOTICE_DISPLAY_TYPE_HOME // 通知展示类型 首页
|
||||
)
|
||||
|
||||
type Notice struct {
|
||||
BaseModel
|
||||
Title string `gorm:"type:varchar(255)" json:"title"`
|
||||
Content string `gorm:"type:varchar(2000)" json:"content"`
|
||||
DisplayType int `gorm:"type:tinyint(1)" json:"displayType"` // 展示类型 参考常量:NOTICE_DISPLAY_TYPE_XXXXX
|
||||
OneRead int `gorm:"type:tinyint(1)" json:"oneRead"` // 1.前端记录读取状态 0.每次都展示
|
||||
Url string `gorm:"type:varchar(255)" json:"url"` // 跳转地址
|
||||
IsLogin uint `gorm:"type:tinyint(1)" json:"isLogin"` // 登录可见
|
||||
UserId uint `json:"userId"`
|
||||
User User `json:"user"`
|
||||
}
|
||||
@@ -0,0 +1,13 @@
|
||||
package models
|
||||
|
||||
type UserConfig struct {
|
||||
UserId uint `gorm:"index" json:"userId"`
|
||||
|
||||
// 纯前端数据,面板样式数据
|
||||
PanelJson string `json:"-"`
|
||||
Panel map[string]interface{} `gorm:"-" json:"panel"`
|
||||
|
||||
// 搜索引擎
|
||||
SearchEngineJson string `json:"-"`
|
||||
SearchEngine map[string]interface{} `gorm:"-" json:"searchEngine"`
|
||||
}
|
||||
Reference in New Issue
Block a user