逐步替换代码

This commit is contained in:
2026-04-01 00:06:36 +08:00
parent ae786d5157
commit 1314e18142
15 changed files with 1964 additions and 40 deletions
+20
View File
@@ -0,0 +1,20 @@
package models
import "time"
// AdminRole 平台角色表 yz_admin_role
type AdminRole struct {
ID uint64 `orm:"column(id);pk;auto" json:"id"`
Cid uint8 `orm:"column(cid);default(1)" json:"cid"` // 1平台角色 2租户角色
Name string `orm:"column(name);size(32)" json:"name"`
Status uint8 `orm:"column(status);default(1)" json:"status"`
Rights *string `orm:"column(rights);type(text);null" json:"rights"`
CreateTime time.Time `orm:"column(create_time);type(datetime);auto_now_add" json:"create_time"`
UpdateTime *time.Time `orm:"column(update_time);type(datetime);auto_now;null" json:"update_time"`
DeleteTime *time.Time `orm:"column(delete_time);type(datetime);null" json:"delete_time"`
}
func (m *AdminRole) TableName() string {
return "yz_admin_role"
}
+96
View File
@@ -0,0 +1,96 @@
package models
import (
"crypto/md5"
"encoding/hex"
"strings"
"time"
)
// AdminUser 平台管理员信息表 yz_admin_user
type AdminUser struct {
ID uint64 `orm:"column(id);pk;auto" json:"id"`
Account string `orm:"column(account);size(64)" json:"account"`
Password string `orm:"column(password);size(32)" json:"-"`
Name *string `orm:"column(name);size(32);null" json:"name"`
Phone *string `orm:"column(phone);size(18);null" json:"phone"`
Email *string `orm:"column(email);size(255);null" json:"email"`
Qq *string `orm:"column(qq);size(16);null" json:"qq"`
Sex uint8 `orm:"column(sex);default(0)" json:"sex"`
Avatar *string `orm:"column(avatar);size(255);null" json:"avatar"`
RoleID uint64 `orm:"column(role_id)" json:"group_id"`
LoginCount uint64 `orm:"column(login_count);default(0)" json:"login_count"`
LastLoginIP *string `orm:"column(last_login_ip);size(255);null" json:"last_login_ip"`
Status uint8 `orm:"column(status);default(1)" json:"status"`
CreateTime time.Time `orm:"column(create_time);type(datetime);auto_now_add" json:"create_time"`
UpdateTime *time.Time `orm:"column(update_time);type(datetime);auto_now;null" json:"update_time"`
DeleteTime *time.Time `orm:"column(delete_time);type(datetime);null" json:"delete_time"`
}
func (m *AdminUser) TableName() string {
return "yz_admin_user"
}
func md5Hex(s string) string {
sum := md5.Sum([]byte(s))
return hex.EncodeToString(sum[:])
}
func NormalizeAccount(s string) string {
return strings.TrimSpace(s)
}
// CreateAdminUser 创建平台管理员用户(password 会被 md5
func CreateAdminUser(account, password string, name, phone, email, qq, avatar *string, sex uint8, roleID uint64, status uint8) (uint64, error) {
u := &AdminUser{
Account: NormalizeAccount(account),
Password: md5Hex(strings.TrimSpace(password)),
Name: name,
Phone: phone,
Email: email,
Qq: qq,
Avatar: avatar,
Sex: sex,
RoleID: roleID,
Status: status,
}
id, err := Orm.Insert(u)
return uint64(id), err
}
func GetAdminUserByID(id uint64) (*AdminUser, error) {
u := &AdminUser{ID: id}
if err := Orm.Read(u); err != nil {
return nil, err
}
return u, nil
}
// UpdateAdminUser 更新用户基础信息(不含 password)
func UpdateAdminUser(id uint64, fields map[string]interface{}) error {
_, err := Orm.QueryTable(new(AdminUser)).Filter("id", id).Update(fields)
return err
}
func DeleteAdminUser(id uint64) error {
_, err := Orm.QueryTable(new(AdminUser)).Filter("id", id).Delete()
return err
}
func ChangeAdminUserPassword(id uint64, newPassword string) error {
_, err := Orm.QueryTable(new(AdminUser)).Filter("id", id).Update(map[string]interface{}{
"password": md5Hex(strings.TrimSpace(newPassword)),
})
return err
}
func ListAdminUsers() ([]AdminUser, int64, error) {
var rows []AdminUser
total, err := Orm.QueryTable(new(AdminUser)).Count()
if err != nil {
return nil, 0, err
}
_, err = Orm.QueryTable(new(AdminUser)).OrderBy("-id").All(&rows)
return rows, total, err
}
+41 -3
View File
@@ -1,8 +1,46 @@
package models
// Init 初始化模型层资源(如:数据库连接、模型注册)。
// 目前仅做占位以支持当前结构编译通过;后续按实际数据库/模型重写。
import (
"fmt"
beego "github.com/beego/beego/v2/server/web"
"github.com/beego/beego/v2/client/orm"
_ "github.com/go-sql-driver/mysql"
)
// Orm 全局 ORM 对象,供业务层和控制器使用
var Orm orm.Ormer
// Init 初始化模型层资源(数据库连接、模型注册等)。
func Init(_ string) {
// TODO: 初始化数据库连接
// 从配置读取数据库连接信息
user, _ := beego.AppConfig.String("mysqluser")
pass, _ := beego.AppConfig.String("mysqlpass")
urls, _ := beego.AppConfig.String("mysqlurls")
dbname, _ := beego.AppConfig.String("mysqldb")
if user == "" || urls == "" || dbname == "" {
panic("数据库配置(mysqluser/mysqlurls/mysqldb) 未正确设置")
}
// 组装 DSNuser:pass@tcp(host:port)/dbname?charset=utf8mb4&parseTime=True&loc=Local
dsn := fmt.Sprintf("%s:%s@tcp(%s)/%s?charset=utf8mb4&parseTime=True&loc=Local", user, pass, urls, dbname)
// 注册默认数据库
if err := orm.RegisterDataBase("default", "mysql", dsn); err != nil {
panic("注册数据库失败: " + err.Error())
}
// 注册模型
orm.RegisterModel(
new(Tenant),
new(TenantUser),
new(SystemMenu),
new(AdminUser),
new(AdminRole),
)
// 创建全局 Ormer
Orm = orm.NewOrm()
}
+30
View File
@@ -0,0 +1,30 @@
package models
import "time"
// SystemMenu 系统菜单表 yz_system_menu
type SystemMenu struct {
ID uint64 `orm:"column(id);pk;auto" json:"id"` // 菜单ID
Pid int64 `orm:"column(pid);default(0)" json:"pid"` // 上级菜单ID
Title string `orm:"column(title);size(50)" json:"title"` // 菜单名称
Path *string `orm:"column(path);size(200);null" json:"path"` // 路由路径
ComponentPath *string `orm:"column(component_path);size(255);null" json:"componentPath"` // 组件路径
Icon *string `orm:"column(icon);size(100);null" json:"icon"` // 菜单图标
Sort int64 `orm:"column(sort);default(0)" json:"sort"` // 排序号
Status int8 `orm:"column(status);default(0)" json:"status"` // 状态:1-启用,0-禁用
IsVisible *int8 `orm:"column(is_visible);null" json:"isVisible"` // 是否显示:1-显示 0-不显示
IsPlatform *int8 `orm:"column(is_platform);null" json:"isPlatform"` // 是否平台:1-是 0-否
Type int8 `orm:"column(type)" json:"type"` // 菜单类型:1-目录,2-页面,3-接口
Permission *string `orm:"column(permission);size(100);null" json:"permission"` // 权限标识(按钮类型时填写)
Creater *string `orm:"column(creater);size(50);null" json:"creater"` // 创建者
Remark *string `orm:"column(remark);size(500);null" json:"remark"` // 备注
CreateTime time.Time `orm:"column(create_time);auto_now_add;type(datetime)" json:"createTime"` // 创建时间
UpdateTime *time.Time `orm:"column(update_time);auto_now;type(datetime);null" json:"updateTime"` // 更新时间
DeleteTime *time.Time `orm:"column(delete_time);type(datetime);null" json:"deleteTime"` // 删除时间
}
// TableName 自定义表名
func (m *SystemMenu) TableName() string {
return "yz_system_menu"
}
+106
View File
@@ -0,0 +1,106 @@
package models
import "time"
// TenantUser 租户用户绑定关系表 yz_tenant_user
type TenantUser struct {
ID uint64 `orm:"column(id);pk;auto" json:"id"`
Tid uint64 `orm:"column(tid)" json:"tid"` // 租户ID
Uid uint64 `orm:"column(uid)" json:"uid"` // 用户ID
Account *string `orm:"column(account);size(64);null" json:"account"` // 用户账号(冗余)
Name *string `orm:"column(name);size(64);null" json:"name"` // 用户名称(冗余)
Phone *string `orm:"column(phone);size(20);null" json:"phone"` // 手机号(冗余)
Email *string `orm:"column(email);size(128);null" json:"email"` // 邮箱(冗余)
Password *string `orm:"column(password);size(255);null" json:"password"` // 密码(冗余/可选)
IsDefault int8 `orm:"column(is_default);default(0)" json:"is_default"` // 是否默认租户
Status int8 `orm:"column(status);default(1)" json:"status"` // 状态:1启用,0禁用
Remark *string `orm:"column(remark);size(255);null" json:"remark"`
CreateTime time.Time `orm:"column(create_time);auto_now_add;type(datetime)" json:"create_time"`
UpdateTime *time.Time `orm:"column(update_time);auto_now;type(datetime);null" json:"update_time"`
DeleteTime *time.Time `orm:"column(delete_time);type(datetime);null" json:"delete_time"`
}
// TableName 自定义表名
func (m *TenantUser) TableName() string {
return "yz_tenant_user"
}
// BindTenantUser 绑定用户到租户(若已存在则更新状态/默认值)
func BindTenantUser(tid, uid uint64, account, name, phone, email, password *string, isDefault, status int8, remark *string) (uint64, error) {
var existed TenantUser
err := Orm.QueryTable(new(TenantUser)).
Filter("tid", tid).
Filter("uid", uid).
One(&existed)
if err == nil {
update := map[string]interface{}{
"account": account,
"name": name,
"phone": phone,
"email": email,
"password": password,
"status": status,
"is_default": isDefault,
"remark": remark,
}
_, uErr := Orm.QueryTable(new(TenantUser)).Filter("id", existed.ID).Update(update)
return existed.ID, uErr
}
m := &TenantUser{
Tid: tid,
Uid: uid,
Account: account,
Name: name,
Phone: phone,
Email: email,
Password: password,
IsDefault: isDefault,
Status: status,
Remark: remark,
}
id, iErr := Orm.Insert(m)
return uint64(id), iErr
}
// UnbindTenantUser 删除绑定关系
func UnbindTenantUser(id uint64) error {
_, err := Orm.QueryTable(new(TenantUser)).Filter("id", id).Delete()
return err
}
// ListTenantUsersByTid 根据租户ID查询绑定关系
func ListTenantUsersByTid(tid uint64) ([]TenantUser, error) {
var rows []TenantUser
_, err := Orm.QueryTable(new(TenantUser)).
Filter("tid", tid).
OrderBy("-is_default", "-id").
All(&rows)
return rows, err
}
// ListTenantBindingsByUid 根据用户ID查询绑定关系
func ListTenantBindingsByUid(uid uint64) ([]TenantUser, error) {
var rows []TenantUser
_, err := Orm.QueryTable(new(TenantUser)).
Filter("uid", uid).
OrderBy("-is_default", "-id").
All(&rows)
return rows, err
}
// SetDefaultTenant 设置用户默认租户(同一用户仅一个默认)
func SetDefaultTenant(uid, tid uint64) error {
_, err := Orm.QueryTable(new(TenantUser)).Filter("uid", uid).Update(map[string]interface{}{
"is_default": 0,
})
if err != nil {
return err
}
_, err = Orm.QueryTable(new(TenantUser)).
Filter("uid", uid).
Filter("tid", tid).
Update(map[string]interface{}{"is_default": 1})
return err
}