mirror of
https://github.com/bufanyun/hotgo.git
synced 2025-08-27 21:03:41 +08:00
@@ -15,6 +15,8 @@ import (
|
||||
"github.com/gogf/gf/v2/util/gconv"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"sort"
|
||||
"strconv"
|
||||
"strings"
|
||||
)
|
||||
|
||||
@@ -139,7 +141,11 @@ func MergePartFile(srcPath, dstPath string) (err error) {
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
sort.Slice(dir, func(i, j int) bool {
|
||||
fiIndex, _ := strconv.Atoi(dir[i].Name())
|
||||
fjIndex, _ := strconv.Atoi(dir[j].Name())
|
||||
return fiIndex < fjIndex
|
||||
})
|
||||
for _, file := range dir {
|
||||
filePath := filepath.Join(srcPath, file.Name())
|
||||
if err = gfile.PutBytesAppend(dstPath, gfile.GetBytes(filePath)); err != nil {
|
||||
|
61
server/internal/library/storager/upload_local_test.go
Normal file
61
server/internal/library/storager/upload_local_test.go
Normal file
@@ -0,0 +1,61 @@
|
||||
package storager
|
||||
|
||||
import (
|
||||
"crypto/md5"
|
||||
"errors"
|
||||
"fmt"
|
||||
"io"
|
||||
"os"
|
||||
"testing"
|
||||
)
|
||||
|
||||
func TestMergePartFile(t *testing.T) {
|
||||
srcFile, _ := os.Open("1.zip")
|
||||
defer srcFile.Close()
|
||||
fileInfo, err := srcFile.Stat()
|
||||
if err != nil {
|
||||
t.Error(err)
|
||||
}
|
||||
hash := md5.New()
|
||||
_, err = io.Copy(hash, srcFile)
|
||||
sum := hash.Sum(nil)
|
||||
fileHash := fmt.Sprintf("%x", sum)
|
||||
|
||||
var singleSize = int64(1024 * 1024 * 100)
|
||||
chunks := int(fileInfo.Size() / singleSize)
|
||||
if fileInfo.Size()%singleSize != 0 {
|
||||
chunks += 1
|
||||
}
|
||||
srcFile.Seek(0, io.SeekStart)
|
||||
for j := 0; j < chunks; j++ {
|
||||
partSize := singleSize
|
||||
if j == chunks-1 {
|
||||
partSize = fileInfo.Size() - int64(j)*singleSize
|
||||
}
|
||||
partData := make([]byte, partSize)
|
||||
_, err = io.ReadFull(srcFile, partData)
|
||||
pf, _ := os.Create(fmt.Sprintf("tmp/%d", j+1))
|
||||
_, err = pf.Write(partData)
|
||||
if err != nil {
|
||||
t.Error(err)
|
||||
return
|
||||
}
|
||||
pf.Close()
|
||||
}
|
||||
|
||||
err = MergePartFile("tmp/", "2.zip")
|
||||
if err != nil {
|
||||
t.Error(err)
|
||||
return
|
||||
}
|
||||
|
||||
f2, _ := os.Open("2.zip")
|
||||
hash2 := md5.New()
|
||||
_, err = io.Copy(hash2, f2)
|
||||
sum2 := hash.Sum(nil)
|
||||
fileHash2 := fmt.Sprintf("%x", sum2)
|
||||
if fileHash != fileHash2 {
|
||||
t.Error(errors.New("hash mismatch"))
|
||||
}
|
||||
|
||||
}
|
@@ -1719,7 +1719,7 @@ CREATE TABLE IF NOT EXISTS `hg_sys_attachment` (
|
||||
`name` varchar(1000) DEFAULT NULL COMMENT '文件原始名',
|
||||
`kind` varchar(16) DEFAULT NULL COMMENT '上传类型',
|
||||
`mime_type` varchar(128) NOT NULL DEFAULT '' COMMENT '扩展类型',
|
||||
`naive_type` varchar(32) NOT NULL COMMENT 'NaiveUI类型',
|
||||
`naive_type` varchar(32) NOT NULL DEFAULT '' COMMENT 'NaiveUI类型',
|
||||
`path` varchar(1000) DEFAULT NULL COMMENT '本地路径',
|
||||
`file_url` varchar(1000) DEFAULT NULL COMMENT 'url',
|
||||
`size` bigint(20) DEFAULT '0' COMMENT '文件大小',
|
||||
|
5134
server/storage/data/sqlite/data.sql
Normal file
5134
server/storage/data/sqlite/data.sql
Normal file
File diff suppressed because one or more lines are too long
656
server/storage/data/sqlite/tables.sql
Normal file
656
server/storage/data/sqlite/tables.sql
Normal file
@@ -0,0 +1,656 @@
|
||||
CREATE TABLE `hg_addon_hgexample_table` ( -- 插件_案例_表格
|
||||
`id` INTEGER NOT NULL , -- ID
|
||||
`category_id` INTEGER NOT NULL , -- 分类ID
|
||||
`flag` TEXT DEFAULT NULL , -- 标签
|
||||
`title` TEXT NOT NULL , -- 标题
|
||||
`description` TEXT NOT NULL , -- 描述
|
||||
`content` TEXT DEFAULT NULL , -- 内容
|
||||
`image` TEXT DEFAULT NULL , -- 单图
|
||||
`images` TEXT DEFAULT NULL , -- 多图
|
||||
`attachfile` TEXT DEFAULT NULL , -- 附件
|
||||
`attachfiles` TEXT DEFAULT NULL , -- 多附件
|
||||
`map` TEXT DEFAULT NULL , -- 动态键值对
|
||||
`star` decimal(5,1) DEFAULT 0.0 , -- 推荐星
|
||||
`price` decimal(10,2) NOT NULL DEFAULT 0.00 , -- 价格
|
||||
`views` INTEGER DEFAULT NULL , -- 浏览次数
|
||||
`activity_at` date DEFAULT NULL , -- 活动时间
|
||||
`start_at` datetime DEFAULT NULL , -- 开启时间
|
||||
`end_at` datetime DEFAULT NULL , -- 结束时间
|
||||
`switch` INTEGER DEFAULT NULL , -- 开关
|
||||
`sort` INTEGER DEFAULT NULL , -- 排序
|
||||
`avatar` TEXT DEFAULT '' , -- 头像
|
||||
`sex` INTEGER DEFAULT NULL , -- 性别
|
||||
`qq` TEXT DEFAULT '' , -- QQ
|
||||
`email` TEXT DEFAULT '' , -- 邮箱
|
||||
`mobile` TEXT DEFAULT '' , -- 手机号码
|
||||
`hobby` TEXT DEFAULT NULL , -- 爱好
|
||||
`channel` INTEGER DEFAULT 1 , -- 渠道
|
||||
`city_id` INTEGER DEFAULT 0 , -- 所在城市
|
||||
`pid` INTEGER NOT NULL , -- 上级ID
|
||||
`level` INTEGER DEFAULT 1 , -- 树等级
|
||||
`tree` TEXT DEFAULT NULL , -- 关系树
|
||||
`remark` TEXT DEFAULT NULL , -- 备注
|
||||
`status` INTEGER DEFAULT 1 , -- 状态
|
||||
`created_by` INTEGER DEFAULT 0 , -- 创建者
|
||||
`updated_by` INTEGER DEFAULT 0 , -- 更新者
|
||||
`created_at` datetime DEFAULT NULL , -- 创建时间
|
||||
`updated_at` datetime DEFAULT NULL , -- 修改时间
|
||||
`deleted_at` datetime DEFAULT NULL , -- 删除时间
|
||||
PRIMARY KEY (`id`)
|
||||
);
|
||||
CREATE TABLE `hg_addon_hgexample_tenant_order` ( -- 多租户_充值订单
|
||||
`id` INTEGER NOT NULL , -- ID
|
||||
`tenant_id` INTEGER DEFAULT NULL, -- 租户ID
|
||||
`merchant_id` INTEGER NOT NULL, -- 商户ID
|
||||
`user_id` INTEGER NOT NULL, -- 用户ID
|
||||
`product_name` TEXT DEFAULT NULL, -- 购买产品
|
||||
`order_sn` TEXT DEFAULT NULL, -- 订单号
|
||||
`money` decimal(10,2) NOT NULL, -- 充值金额
|
||||
`remark` TEXT DEFAULT NULL, -- 备注
|
||||
`status` INTEGER DEFAULT 1, -- 订单状态
|
||||
`created_at` datetime DEFAULT NULL, -- 创建时间
|
||||
`updated_at` datetime DEFAULT NULL, -- 修改时间
|
||||
PRIMARY KEY (`id`)
|
||||
);
|
||||
CREATE TABLE `hg_admin_cash` ( -- 管理员_提现记录表
|
||||
`id` INTEGER NOT NULL , -- ID
|
||||
`member_id` INTEGER NOT NULL , -- 管理员ID
|
||||
`money` decimal(10,2) NOT NULL , -- 提现金额
|
||||
`fee` decimal(10,2) NOT NULL , -- 手续费
|
||||
`last_money` decimal(10,2) NOT NULL , -- 最终到账金额
|
||||
`ip` TEXT NOT NULL , -- 申请人IP
|
||||
`status` INTEGER NOT NULL , -- 状态
|
||||
`msg` TEXT NOT NULL , -- 处理结果
|
||||
`handle_at` datetime DEFAULT NULL , -- 处理时间
|
||||
`created_at` datetime NOT NULL , -- 申请时间
|
||||
PRIMARY KEY (`id`)
|
||||
);
|
||||
CREATE TABLE `hg_admin_credits_log` ( -- 管理员_资产变动表
|
||||
`id` INTEGER NOT NULL PRIMARY KEY, -- 变动ID
|
||||
`member_id` INTEGER DEFAULT 0, -- 管理员ID
|
||||
`app_id` TEXT DEFAULT NULL, -- 应用id
|
||||
`addons_name` TEXT NOT NULL DEFAULT '', -- 插件名称
|
||||
`credit_type` TEXT NOT NULL DEFAULT '', -- 变动类型
|
||||
`credit_group` TEXT DEFAULT NULL, -- 变动组别
|
||||
`before_num` decimal(10,2) DEFAULT 0.00, -- 变动前
|
||||
`num` decimal(10,2) DEFAULT 0.00, -- 变动数据
|
||||
`after_num` decimal(10,2) DEFAULT 0.00, -- 变动后
|
||||
`remark` TEXT DEFAULT NULL, -- 备注
|
||||
`ip` TEXT DEFAULT NULL, -- 操作人IP
|
||||
`map_id` INTEGER DEFAULT 0, -- 关联ID
|
||||
`status` INTEGER DEFAULT 1, -- 状态
|
||||
`created_at` datetime DEFAULT NULL, -- 创建时间
|
||||
`updated_at` datetime DEFAULT NULL -- 修改时间
|
||||
);
|
||||
CREATE TABLE `hg_admin_dept` ( -- 管理员_部门
|
||||
`id` INTEGER NOT NULL PRIMARY KEY, -- 部门ID
|
||||
`pid` INTEGER DEFAULT 0, -- 父部门ID
|
||||
`name` TEXT DEFAULT NULL, -- 部门名称
|
||||
`code` TEXT DEFAULT NULL, -- 部门编码
|
||||
`type` TEXT DEFAULT NULL, -- 部门类型
|
||||
`leader` TEXT DEFAULT NULL, -- 负责人
|
||||
`phone` TEXT DEFAULT NULL, -- 联系电话
|
||||
`email` TEXT DEFAULT NULL, -- 邮箱
|
||||
`level` INTEGER NOT NULL, -- 关系树等级
|
||||
`tree` TEXT DEFAULT NULL, -- 关系树
|
||||
`sort` INTEGER DEFAULT 0, -- 排序
|
||||
`status` INTEGER DEFAULT 1, -- 部门状态
|
||||
`created_at` datetime DEFAULT NULL, -- 创建时间
|
||||
`updated_at` datetime DEFAULT NULL -- 更新时间
|
||||
);
|
||||
CREATE TABLE `hg_admin_member` ( -- 管理员_用户表
|
||||
`id` INTEGER NOT NULL PRIMARY KEY, -- 管理员ID
|
||||
`dept_id` INTEGER DEFAULT 0, -- 部门ID
|
||||
`role_id` INTEGER DEFAULT 10, -- 角色ID
|
||||
`real_name` TEXT DEFAULT '', -- 真实姓名
|
||||
`username` TEXT NOT NULL DEFAULT '', -- 帐号
|
||||
`password_hash` char(32) NOT NULL DEFAULT '', -- 密码
|
||||
`salt` char(16) NOT NULL, -- 密码盐
|
||||
`password_reset_token` TEXT DEFAULT '', -- 密码重置令牌
|
||||
`integral` decimal(10,2) DEFAULT 0.00, -- 积分
|
||||
`balance` decimal(10,2) DEFAULT 0.00, -- 余额
|
||||
`avatar` char(150) DEFAULT '', -- 头像
|
||||
`sex` INTEGER DEFAULT 1, -- 性别
|
||||
`qq` TEXT DEFAULT '', -- qq
|
||||
`email` TEXT DEFAULT '', -- 邮箱
|
||||
`mobile` TEXT DEFAULT '', -- 手机号码
|
||||
`birthday` date DEFAULT NULL, -- 生日
|
||||
`city_id` INTEGER DEFAULT 0, -- 城市编码
|
||||
`address` TEXT DEFAULT '', -- 联系地址
|
||||
`pid` INTEGER NOT NULL, -- 上级管理员ID
|
||||
`level` INTEGER DEFAULT 1, -- 关系树等级
|
||||
`tree` TEXT NOT NULL, -- 关系树
|
||||
`invite_code` TEXT DEFAULT NULL, -- 邀请码
|
||||
`cash` TEXT DEFAULT NULL, -- 提现配置
|
||||
`last_active_at` datetime DEFAULT NULL, -- 最后活跃时间
|
||||
`remark` TEXT DEFAULT NULL, -- 备注
|
||||
`status` INTEGER DEFAULT 1, -- 状态
|
||||
`created_at` datetime DEFAULT NULL, -- 创建时间
|
||||
`updated_at` datetime DEFAULT NULL -- 修改时间
|
||||
);
|
||||
CREATE TABLE `hg_admin_member_post` ( -- 管理员_用户岗位关联
|
||||
`member_id` INTEGER NOT NULL, -- 管理员ID
|
||||
`post_id` INTEGER NOT NULL, -- 岗位ID
|
||||
PRIMARY KEY (`member_id`, `post_id`)
|
||||
);
|
||||
CREATE TABLE `hg_admin_member_role` ( -- 管理员_用户角色关联
|
||||
`member_id` INTEGER NOT NULL, -- 管理员ID
|
||||
`role_id` INTEGER NOT NULL, -- 角色ID
|
||||
PRIMARY KEY (`member_id`, `role_id`)
|
||||
);
|
||||
CREATE TABLE `hg_admin_menu` ( -- 管理员_菜单权限
|
||||
`id` INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, -- 菜单ID
|
||||
`pid` INTEGER DEFAULT 0, -- 父菜单ID
|
||||
`level` INTEGER NOT NULL DEFAULT 1, -- 关系树等级
|
||||
`tree` TEXT NOT NULL, -- 关系树
|
||||
`title` TEXT NOT NULL, -- 菜单名称
|
||||
`name` TEXT NOT NULL, -- 名称编码
|
||||
`path` TEXT DEFAULT NULL, -- 路由地址
|
||||
`icon` TEXT DEFAULT NULL, -- 菜单图标
|
||||
`type` INTEGER NOT NULL DEFAULT 1, -- 菜单类型(1目录 2菜单 3按钮)
|
||||
`redirect` TEXT DEFAULT NULL, -- 重定向地址
|
||||
`permissions` TEXT DEFAULT NULL, -- 菜单包含权限集合
|
||||
`permission_name` TEXT DEFAULT NULL, -- 权限名称
|
||||
`component` TEXT NOT NULL, -- 组件路径
|
||||
`always_show` INTEGER DEFAULT 0, -- 取消自动计算根路由模式
|
||||
`active_menu` TEXT DEFAULT NULL, -- 高亮菜单编码
|
||||
`is_root` INTEGER DEFAULT 0, -- 是否跟路由
|
||||
`is_frame` INTEGER DEFAULT 1, -- 是否内嵌
|
||||
`frame_src` TEXT DEFAULT NULL, -- 内联外部地址
|
||||
`keep_alive` INTEGER DEFAULT 0, -- 缓存该路由
|
||||
`hidden` INTEGER DEFAULT 0, -- 是否隐藏
|
||||
`affix` INTEGER DEFAULT 0, -- 是否固定
|
||||
`sort` INTEGER DEFAULT 0, -- 排序
|
||||
`remark` TEXT DEFAULT NULL, -- 备注
|
||||
`status` INTEGER DEFAULT 1, -- 菜单状态
|
||||
`updated_at` datetime DEFAULT NULL, -- 更新时间
|
||||
`created_at` datetime DEFAULT NULL -- 创建时间
|
||||
);
|
||||
CREATE TABLE `hg_admin_notice` ( -- 管理员_通知公告
|
||||
`id` INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, -- 公告ID
|
||||
`title` TEXT NOT NULL, -- 公告标题
|
||||
`type` INTEGER NOT NULL, -- 公告类型
|
||||
`tag` INTEGER DEFAULT NULL, -- 标签
|
||||
`content` TEXT NOT NULL, -- 公告内容
|
||||
`receiver` TEXT DEFAULT NULL, -- 接收者
|
||||
`remark` TEXT DEFAULT NULL, -- 备注
|
||||
`sort` INTEGER NOT NULL DEFAULT 0, -- 排序
|
||||
`status` INTEGER DEFAULT 1, -- 公告状态
|
||||
`created_by` INTEGER DEFAULT NULL, -- 发送人
|
||||
`updated_by` INTEGER DEFAULT 0, -- 修改人
|
||||
`created_at` datetime DEFAULT NULL, -- 创建时间
|
||||
`updated_at` datetime DEFAULT NULL, -- 更新时间
|
||||
`deleted_at` datetime DEFAULT NULL -- 删除时间
|
||||
);
|
||||
CREATE TABLE `hg_admin_notice_read` ( -- 管理员_公告已读记录
|
||||
`id` INTEGER NOT NULL , -- 记录ID
|
||||
`notice_id` INTEGER NOT NULL, -- 公告ID
|
||||
`member_id` INTEGER NOT NULL, -- 会员ID
|
||||
`clicks` INTEGER DEFAULT 1, -- 已读次数
|
||||
`updated_at` datetime DEFAULT NULL, -- 更新时间
|
||||
`created_at` datetime DEFAULT NULL, -- 阅读时间
|
||||
PRIMARY KEY (`id`)
|
||||
);
|
||||
CREATE TABLE `hg_admin_oauth` ( -- 管理员_第三方登录
|
||||
`id` INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, -- 主键
|
||||
`member_id` INTEGER DEFAULT 0, -- 用户ID
|
||||
`unionid` TEXT DEFAULT '', -- 唯一ID
|
||||
`oauth_client` TEXT DEFAULT NULL, -- 授权组别
|
||||
`oauth_openid` TEXT DEFAULT NULL, -- 授权开放ID
|
||||
`sex` INTEGER DEFAULT 1, -- 性别
|
||||
`nickname` TEXT DEFAULT NULL, -- 昵称
|
||||
`head_portrait` TEXT DEFAULT NULL, -- 头像
|
||||
`birthday` date DEFAULT NULL, -- 生日
|
||||
`country` TEXT DEFAULT '', -- 国家
|
||||
`province` TEXT DEFAULT '', -- 省
|
||||
`city` TEXT DEFAULT '', -- 市
|
||||
`status` INTEGER DEFAULT 1, -- 状态
|
||||
`created_at` datetime DEFAULT NULL, -- 创建时间
|
||||
`updated_at` datetime DEFAULT NULL -- 修改时间
|
||||
);
|
||||
CREATE TABLE `hg_admin_order` ( -- 管理员_充值订单
|
||||
`id` INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, -- 主键
|
||||
`member_id` INTEGER DEFAULT 0, -- 管理员id
|
||||
`order_type` TEXT NOT NULL, -- 订单类型
|
||||
`product_id` INTEGER DEFAULT NULL, -- 产品id
|
||||
`order_sn` TEXT DEFAULT '', -- 关联订单号
|
||||
`money` decimal(10,2) NOT NULL, -- 充值金额
|
||||
`remark` TEXT DEFAULT NULL, -- 备注
|
||||
`refund_reason` TEXT DEFAULT NULL, -- 退款原因
|
||||
`reject_refund_reason` TEXT DEFAULT NULL, -- 拒绝退款原因
|
||||
`status` INTEGER DEFAULT 1, -- 状态
|
||||
`created_at` datetime DEFAULT NULL, -- 创建时间
|
||||
`updated_at` datetime DEFAULT NULL -- 修改时间
|
||||
);
|
||||
CREATE TABLE `hg_admin_post` ( -- 管理员_岗位
|
||||
`id` INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, -- 岗位ID
|
||||
`code` TEXT NOT NULL, -- 岗位编码
|
||||
`name` TEXT NOT NULL, -- 岗位名称
|
||||
`remark` TEXT DEFAULT NULL, -- 备注
|
||||
`sort` INTEGER NOT NULL, -- 排序
|
||||
`status` INTEGER NOT NULL, -- 状态
|
||||
`created_at` datetime DEFAULT NULL, -- 创建时间
|
||||
`updated_at` datetime DEFAULT NULL -- 更新时间
|
||||
);
|
||||
CREATE TABLE `hg_admin_role` ( -- 管理员_角色信息
|
||||
`id` INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, -- 角色ID
|
||||
`name` TEXT NOT NULL, -- 角色名称
|
||||
`key` TEXT NOT NULL, -- 角色权限字符串
|
||||
`data_scope` INTEGER DEFAULT 1, -- 数据范围
|
||||
`custom_dept` TEXT DEFAULT NULL, -- 自定义部门权限
|
||||
`pid` INTEGER DEFAULT 0, -- 上级角色ID
|
||||
`level` INTEGER NOT NULL DEFAULT 1, -- 关系树等级
|
||||
`tree` TEXT DEFAULT NULL, -- 关系树
|
||||
`remark` TEXT DEFAULT NULL, -- 备注
|
||||
`sort` INTEGER NOT NULL DEFAULT 0, -- 排序
|
||||
`status` INTEGER NOT NULL DEFAULT 1, -- 角色状态
|
||||
`created_at` datetime DEFAULT NULL, -- 创建时间
|
||||
`updated_at` datetime DEFAULT NULL -- 更新时间
|
||||
);
|
||||
CREATE TABLE `hg_admin_role_casbin` (
|
||||
`id` INTEGER NOT NULL ,
|
||||
`p_type` TEXT DEFAULT NULL,
|
||||
`v0` TEXT DEFAULT NULL,
|
||||
`v1` TEXT DEFAULT NULL,
|
||||
`v2` TEXT DEFAULT NULL,
|
||||
`v3` TEXT DEFAULT NULL,
|
||||
`v4` TEXT DEFAULT NULL,
|
||||
`v5` TEXT DEFAULT NULL,
|
||||
PRIMARY KEY (`id`)
|
||||
);
|
||||
CREATE TABLE `hg_admin_role_menu` ( -- 管理员_角色菜单关联
|
||||
`role_id` INTEGER NOT NULL, -- 角色ID
|
||||
`menu_id` INTEGER NOT NULL, -- 菜单ID
|
||||
PRIMARY KEY (`role_id`, `menu_id`)
|
||||
);
|
||||
CREATE TABLE `hg_pay_log` ( -- 支付_支付日志
|
||||
`id` INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, -- 主键
|
||||
`member_id` INTEGER DEFAULT 0, -- 会员ID
|
||||
`app_id` TEXT DEFAULT NULL, -- 应用ID
|
||||
`addons_name` TEXT DEFAULT '', -- 插件名称
|
||||
`order_sn` TEXT DEFAULT '', -- 关联订单号
|
||||
`order_group` TEXT DEFAULT '', -- 组别[默认统一支付类型]
|
||||
`openid` TEXT DEFAULT '', -- openid
|
||||
`mch_id` TEXT DEFAULT '', -- 商户支付账户
|
||||
`subject` TEXT DEFAULT NULL, -- 订单标题
|
||||
`detail` TEXT DEFAULT NULL, -- 支付商品详情
|
||||
`auth_code` TEXT DEFAULT '', -- 刷卡码
|
||||
`out_trade_no` TEXT DEFAULT '', -- 商户订单号
|
||||
`transaction_id` TEXT DEFAULT NULL, -- 交易号
|
||||
`pay_type` TEXT NOT NULL, -- 支付类型
|
||||
`pay_amount` decimal(10,2) NOT NULL DEFAULT 0.00, -- 支付金额
|
||||
`actual_amount` decimal(10,2) DEFAULT NULL, -- 实付金额
|
||||
`pay_status` INTEGER DEFAULT 0, -- 支付状态
|
||||
`pay_at` datetime DEFAULT NULL, -- 支付时间
|
||||
`trade_type` TEXT DEFAULT '', -- 交易类型
|
||||
`refund_sn` TEXT DEFAULT NULL, -- 退款单号
|
||||
`is_refund` INTEGER DEFAULT 0, -- 是否退款
|
||||
`custom` text DEFAULT NULL, -- 自定义参数
|
||||
`create_ip` TEXT DEFAULT NULL, -- 创建者IP
|
||||
`pay_ip` TEXT DEFAULT NULL, -- 支付者IP
|
||||
`notify_url` TEXT DEFAULT NULL, -- 支付通知回调地址
|
||||
`return_url` TEXT DEFAULT NULL, -- 买家付款成功跳转地址
|
||||
`trace_ids` TEXT DEFAULT NULL, -- 链路ID集合
|
||||
`status` INTEGER DEFAULT 1, -- 状态
|
||||
`created_at` datetime DEFAULT NULL, -- 创建时间
|
||||
`updated_at` datetime DEFAULT NULL -- 修改时间
|
||||
);
|
||||
CREATE TABLE `hg_pay_refund` ( -- 支付_退款记录
|
||||
`id` INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, -- 主键ID
|
||||
`member_id` INTEGER DEFAULT 0, -- 会员ID
|
||||
`app_id` TEXT DEFAULT NULL, -- 应用ID
|
||||
`order_sn` TEXT DEFAULT NULL, -- 业务订单号
|
||||
`refund_trade_no` TEXT DEFAULT NULL, -- 退款交易号
|
||||
`refund_money` decimal(10,2) DEFAULT NULL, -- 退款金额
|
||||
`refund_way` INTEGER DEFAULT 1, -- 退款方式
|
||||
`ip` TEXT DEFAULT NULL, -- 申请者IP
|
||||
`reason` TEXT DEFAULT NULL, -- 申请退款原因
|
||||
`remark` TEXT DEFAULT NULL, -- 退款备注
|
||||
`status` INTEGER DEFAULT 1, -- 退款状态
|
||||
`created_at` datetime DEFAULT NULL, -- 申请时间
|
||||
`updated_at` datetime DEFAULT NULL -- 更新时间
|
||||
);
|
||||
CREATE TABLE `hg_sys_addons_config` ( -- 系统_插件配置
|
||||
`id` INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, -- 配置ID
|
||||
`addon_name` TEXT NOT NULL, -- 插件名称
|
||||
`group` TEXT NOT NULL, -- 分组
|
||||
`name` TEXT DEFAULT '', -- 参数名称
|
||||
`type` TEXT NOT NULL, -- 键值类型:string,int,uint,bool,datetime,date
|
||||
`key` TEXT DEFAULT '', -- 参数键名
|
||||
`value` TEXT DEFAULT '', -- 参数键值
|
||||
`default_value` TEXT NOT NULL, -- 默认值
|
||||
`sort` INTEGER NOT NULL DEFAULT 0, -- 排序
|
||||
`tip` TEXT DEFAULT NULL, -- 变量描述
|
||||
`is_default` INTEGER DEFAULT 0, -- 是否为系统默认
|
||||
`status` INTEGER DEFAULT 1, -- 状态
|
||||
`created_at` datetime DEFAULT NULL, -- 创建时间
|
||||
`updated_at` datetime DEFAULT NULL -- 更新时间
|
||||
);
|
||||
CREATE TABLE `hg_sys_addons_install` ( -- 系统_插件安装记录
|
||||
`id` INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, -- 主键
|
||||
`name` TEXT NOT NULL, -- 插件名称
|
||||
`version` TEXT NOT NULL DEFAULT '', -- 版本号
|
||||
`status` INTEGER DEFAULT 1, -- 状态
|
||||
`created_at` datetime DEFAULT NULL, -- 创建时间
|
||||
`updated_at` datetime DEFAULT NULL -- 更新时间
|
||||
);
|
||||
CREATE TABLE `hg_sys_attachment` ( -- 系统_附件管理
|
||||
`id` INTEGER NOT NULL PRIMARY KEY , -- 文件ID
|
||||
`app_id` TEXT NOT NULL, -- 应用ID
|
||||
`member_id` INTEGER DEFAULT 0, -- 管理员ID
|
||||
`cate_id` INTEGER DEFAULT 0, -- 上传分类
|
||||
`drive` TEXT DEFAULT NULL, -- 上传驱动
|
||||
`name` TEXT DEFAULT NULL, -- 文件原始名
|
||||
`kind` TEXT DEFAULT NULL, -- 上传类型
|
||||
`mime_type` TEXT NOT NULL DEFAULT '', -- 扩展类型
|
||||
`naive_type` TEXT NOT NULL, -- NaiveUI类型
|
||||
`path` TEXT DEFAULT NULL, -- 本地路径
|
||||
`file_url` TEXT DEFAULT NULL, -- url
|
||||
`size` INTEGER DEFAULT 0, -- 文件大小
|
||||
`ext` TEXT DEFAULT NULL, -- 扩展名
|
||||
`md5` TEXT DEFAULT NULL, -- md5校验码
|
||||
`status` INTEGER NOT NULL DEFAULT 1, -- 状态
|
||||
`created_at` datetime DEFAULT NULL, -- 创建时间
|
||||
`updated_at` datetime DEFAULT NULL -- 修改时间
|
||||
);
|
||||
CREATE TABLE `hg_sys_blacklist` ( -- 系统_访问黑名单
|
||||
`id` INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, -- 黑名单ID
|
||||
`ip` TEXT DEFAULT '', -- IP地址
|
||||
`remark` TEXT DEFAULT NULL, -- 备注
|
||||
`status` INTEGER DEFAULT 1, -- 状态
|
||||
`created_at` datetime DEFAULT NULL, -- 创建时间
|
||||
`updated_at` datetime DEFAULT NULL -- 更新时间
|
||||
);
|
||||
CREATE TABLE `hg_sys_config` ( -- 系统_配置
|
||||
`id` INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, -- 配置ID
|
||||
`group` TEXT NOT NULL, -- 配置分组
|
||||
`name` TEXT DEFAULT '', -- 参数名称
|
||||
`type` TEXT NOT NULL, -- 键值类型:string,int,uint,bool,datetime,date
|
||||
`key` TEXT DEFAULT '', -- 参数键名
|
||||
`value` TEXT DEFAULT NULL, -- 参数键值
|
||||
`default_value` TEXT NOT NULL, -- 默认值
|
||||
`sort` INTEGER NOT NULL DEFAULT 0, -- 排序
|
||||
`tip` TEXT DEFAULT NULL, -- 变量描述
|
||||
`is_default` INTEGER DEFAULT 0, -- 是否为系统默认
|
||||
`status` INTEGER DEFAULT 1, -- 状态
|
||||
`created_at` datetime DEFAULT NULL, -- 创建时间
|
||||
`updated_at` datetime DEFAULT NULL -- 更新时间
|
||||
);
|
||||
CREATE TABLE `hg_sys_cron` ( -- 系统_定时任务
|
||||
`id` INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, -- 任务ID
|
||||
`group_id` INTEGER NOT NULL, -- 分组ID
|
||||
`title` TEXT NOT NULL, -- 任务标题
|
||||
`name` TEXT DEFAULT NULL, -- 任务方法
|
||||
`params` TEXT DEFAULT NULL, -- 函数参数
|
||||
`pattern` TEXT NOT NULL, -- 表达式
|
||||
`policy` INTEGER NOT NULL DEFAULT 1, -- 策略
|
||||
`count` INTEGER NOT NULL DEFAULT 0, -- 执行次数
|
||||
`sort` INTEGER DEFAULT 0, -- 排序
|
||||
`remark` TEXT DEFAULT NULL, -- 备注
|
||||
`status` INTEGER DEFAULT 1, -- 任务状态
|
||||
`created_at` datetime DEFAULT NULL, -- 创建时间
|
||||
`updated_at` datetime DEFAULT NULL -- 更新时间
|
||||
);
|
||||
CREATE TABLE `hg_sys_cron_group` ( -- 系统_定时任务分组
|
||||
`id` INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, -- 任务分组ID
|
||||
`pid` INTEGER NOT NULL, -- 父类任务分组ID
|
||||
`name` TEXT DEFAULT '', -- 分组名称
|
||||
`is_default` INTEGER DEFAULT 0, -- 是否默认
|
||||
`sort` INTEGER DEFAULT 0, -- 排序
|
||||
`remark` TEXT DEFAULT NULL, -- 备注
|
||||
`status` INTEGER DEFAULT 1, -- 分组状态
|
||||
`created_at` datetime DEFAULT NULL, -- 创建时间
|
||||
`updated_at` datetime DEFAULT NULL -- 更新时间
|
||||
);
|
||||
CREATE TABLE `hg_sys_dict_data` ( -- 系统_字典数据
|
||||
`id` INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, -- 字典数据ID
|
||||
`label` TEXT DEFAULT NULL, -- 字典标签
|
||||
`value` TEXT DEFAULT NULL, -- 字典键值
|
||||
`value_type` TEXT NOT NULL DEFAULT 'string', -- 键值数据类型:string,int,uint,bool,datetime,date
|
||||
`type` TEXT DEFAULT NULL, -- 字典类型
|
||||
`list_class` TEXT DEFAULT NULL, -- 表格回显样式
|
||||
`is_default` INTEGER DEFAULT 2, -- 是否为系统默认
|
||||
`sort` INTEGER DEFAULT 0, -- 字典排序
|
||||
`remark` TEXT DEFAULT NULL, -- 备注
|
||||
`status` INTEGER DEFAULT 1, -- 状态
|
||||
`created_at` datetime DEFAULT NULL, -- 创建时间
|
||||
`updated_at` datetime DEFAULT NULL -- 更新时间
|
||||
);
|
||||
CREATE TABLE `hg_sys_dict_type` ( -- 系统_字典类型
|
||||
`id` INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, -- 字典类型ID
|
||||
`pid` INTEGER NOT NULL, -- 父类字典类型ID
|
||||
`name` TEXT DEFAULT '', -- 字典类型名称
|
||||
`type` TEXT DEFAULT '', -- 字典类型
|
||||
`sort` INTEGER DEFAULT 0, -- 排序
|
||||
`remark` TEXT DEFAULT NULL, -- 备注
|
||||
`status` INTEGER DEFAULT 1, -- 字典类型状态
|
||||
`created_at` datetime DEFAULT NULL, -- 创建时间
|
||||
`updated_at` datetime DEFAULT NULL -- 更新时间
|
||||
);
|
||||
CREATE TABLE `hg_sys_ems_log` ( -- 系统_邮件发送记录
|
||||
`id` INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, -- 主键
|
||||
`event` TEXT NOT NULL, -- 事件
|
||||
`email` TEXT NOT NULL, -- 邮箱地址,多个用;隔开
|
||||
`code` TEXT DEFAULT '', -- 验证码
|
||||
`times` INTEGER NOT NULL, -- 验证次数
|
||||
`content` TEXT DEFAULT NULL, -- 邮件内容
|
||||
`ip` TEXT DEFAULT NULL, -- ip地址
|
||||
`status` INTEGER DEFAULT 1, -- 状态(1未验证,2已验证)
|
||||
`created_at` datetime DEFAULT NULL, -- 创建时间
|
||||
`updated_at` datetime DEFAULT NULL -- 更新时间
|
||||
);
|
||||
CREATE TABLE `hg_sys_gen_codes` ( -- 系统_代码生成记录
|
||||
`id` INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, -- 生成ID
|
||||
`gen_type` INTEGER UNSIGNED NOT NULL, -- 生成类型
|
||||
`gen_template` INTEGER DEFAULT 0, -- 生成模板
|
||||
`var_name` TEXT NOT NULL, -- 实体命名
|
||||
`options` TEXT DEFAULT NULL, -- 配置选项
|
||||
`db_name` TEXT DEFAULT NULL, -- 数据库名称
|
||||
`table_name` TEXT NOT NULL, -- 主表名称
|
||||
`table_comment` TEXT DEFAULT NULL, -- 主表注释
|
||||
`dao_name` TEXT DEFAULT NULL, -- 主表dao模型
|
||||
`master_columns` TEXT DEFAULT NULL, -- 主表字段
|
||||
`addon_name` TEXT DEFAULT NULL, -- 插件名称
|
||||
`status` INTEGER DEFAULT 1, -- 生成状态
|
||||
`created_at` datetime DEFAULT NULL, -- 创建时间
|
||||
`updated_at` datetime DEFAULT NULL -- 更新时间
|
||||
);
|
||||
CREATE TABLE `hg_sys_gen_curd_demo` ( -- 系统_生成curd演示
|
||||
`id` INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, -- ID
|
||||
`category_id` INTEGER DEFAULT 0, -- 分类ID
|
||||
`title` TEXT NOT NULL, -- 标题
|
||||
`description` TEXT DEFAULT '', -- 描述
|
||||
`content` text DEFAULT NULL, -- 内容
|
||||
`image` TEXT DEFAULT NULL, -- 单图
|
||||
`attachfile` TEXT DEFAULT NULL, -- 附件
|
||||
`city_id` INTEGER DEFAULT 0, -- 所在城市
|
||||
`switch` INTEGER DEFAULT 1, -- 显示开关
|
||||
`sort` INTEGER DEFAULT NULL, -- 排序
|
||||
`status` INTEGER DEFAULT 1, -- 状态
|
||||
`created_by` INTEGER DEFAULT 0, -- 创建者
|
||||
`updated_by` INTEGER DEFAULT 0, -- 更新者
|
||||
`created_at` datetime DEFAULT NULL, -- 创建时间
|
||||
`updated_at` datetime DEFAULT NULL, -- 修改时间
|
||||
`deleted_at` datetime DEFAULT NULL -- 删除时间
|
||||
);
|
||||
CREATE TABLE `hg_sys_gen_tree_demo` ( -- 系统_生成树演示
|
||||
`id` INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, -- ID
|
||||
`pid` INTEGER DEFAULT NULL, -- 上级ID
|
||||
`level` INTEGER DEFAULT 1, -- 关系树级别
|
||||
`tree` TEXT DEFAULT NULL, -- 关系树
|
||||
`category_id` INTEGER DEFAULT 0, -- 分类ID
|
||||
`title` TEXT NOT NULL, -- 标题
|
||||
`description` TEXT DEFAULT NULL, -- 描述
|
||||
`sort` INTEGER DEFAULT NULL, -- 排序
|
||||
`status` INTEGER DEFAULT 1, -- 状态
|
||||
`created_by` INTEGER DEFAULT 0, -- 创建者
|
||||
`updated_by` INTEGER DEFAULT 0, -- 更新者
|
||||
`created_at` datetime DEFAULT NULL, -- 创建时间
|
||||
`updated_at` datetime DEFAULT NULL, -- 修改时间
|
||||
`deleted_at` datetime DEFAULT NULL -- 删除时间
|
||||
);
|
||||
CREATE TABLE `hg_sys_log` ( -- 系统_全局日志
|
||||
`id` INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, -- 日志ID
|
||||
`req_id` TEXT DEFAULT NULL, -- 对外ID
|
||||
`app_id` TEXT DEFAULT '', -- 应用ID
|
||||
`merchant_id` INTEGER DEFAULT 0, -- 商户ID
|
||||
`member_id` INTEGER DEFAULT 0, -- 用户ID
|
||||
`method` TEXT DEFAULT NULL, -- 提交类型
|
||||
`module` TEXT DEFAULT NULL, -- 访问模块
|
||||
`url` TEXT DEFAULT NULL, -- 提交url
|
||||
`get_data` TEXT, -- get数据
|
||||
`post_data` TEXT, -- post数据
|
||||
`header_data` TEXT, -- header数据
|
||||
`ip` TEXT DEFAULT NULL, -- IP地址
|
||||
`province_id` INTEGER NOT NULL DEFAULT 0, -- 省编码
|
||||
`city_id` INTEGER NOT NULL DEFAULT 0, -- 市编码
|
||||
`error_code` INTEGER DEFAULT 0, -- 报错code
|
||||
`error_msg` TEXT DEFAULT NULL, -- 对外错误提示
|
||||
`error_data` TEXT, -- 报错日志
|
||||
`user_agent` TEXT DEFAULT NULL, -- UA信息
|
||||
`take_up_time` INTEGER DEFAULT 0, -- 请求耗时
|
||||
`timestamp` INTEGER DEFAULT 0, -- 响应时间
|
||||
`status` INTEGER NOT NULL DEFAULT 1, -- 状态
|
||||
`created_at` datetime DEFAULT NULL, -- 创建时间
|
||||
`updated_at` datetime DEFAULT NULL -- 修改时间
|
||||
);
|
||||
CREATE TABLE IF NOT EXISTS "hg_sys_login_log" ( -- 系统_登录日志
|
||||
`id` INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, -- 日志ID
|
||||
`req_id` TEXT DEFAULT NULL, -- 请求ID
|
||||
`member_id` INTEGER DEFAULT 0, -- 用户ID
|
||||
`username` TEXT DEFAULT NULL, -- 用户名
|
||||
`response` TEXT, -- 响应数据
|
||||
`login_at` datetime DEFAULT NULL, -- 登录时间
|
||||
`login_ip` TEXT DEFAULT NULL, -- 登录IP
|
||||
`province_id` INTEGER DEFAULT NULL, -- 省编码
|
||||
`city_id` INTEGER DEFAULT NULL, -- 市编码
|
||||
`user_agent` TEXT DEFAULT NULL, -- UA信息
|
||||
`err_msg` TEXT DEFAULT NULL, -- 错误提示
|
||||
`status` INTEGER NOT NULL DEFAULT 1, -- 状态
|
||||
`created_at` datetime DEFAULT NULL, -- 创建时间
|
||||
`updated_at` datetime DEFAULT NULL -- 修改时间
|
||||
);
|
||||
CREATE TABLE `hg_sys_serve_license` ( -- 系统_服务许可证
|
||||
`id` INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, -- 许可ID
|
||||
`group` TEXT NOT NULL, -- 分组
|
||||
`name` TEXT NOT NULL, -- 许可名称
|
||||
`appid` TEXT NOT NULL, -- 应用ID
|
||||
`secret_key` TEXT DEFAULT NULL, -- 应用秘钥
|
||||
`remote_addr` TEXT DEFAULT NULL, -- 最后连接地址
|
||||
`online_limit` INTEGER DEFAULT 1, -- 在线限制
|
||||
`login_times` INTEGER DEFAULT NULL, -- 登录次数
|
||||
`last_login_at` datetime DEFAULT NULL, -- 最后登录时间
|
||||
`last_active_at` datetime DEFAULT NULL, -- 最后心跳
|
||||
`routes` TEXT, -- 路由表,空使用默认分组路由
|
||||
`allowed_ips` TEXT DEFAULT NULL, -- IP白名单
|
||||
`end_at` datetime NOT NULL, -- 授权有效期
|
||||
`remark` TEXT DEFAULT NULL, -- 备注
|
||||
`status` INTEGER DEFAULT 1, -- 状态
|
||||
`created_at` datetime DEFAULT NULL, -- 创建时间
|
||||
`updated_at` datetime DEFAULT NULL -- 修改时间
|
||||
);
|
||||
CREATE TABLE `hg_sys_serve_log` ( -- 系统_服务日志
|
||||
`id` INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, -- 日志ID
|
||||
`trace_id` TEXT DEFAULT NULL, -- 链路ID
|
||||
`level_format` TEXT DEFAULT NULL, -- 日志级别
|
||||
`content` text DEFAULT NULL, -- 日志内容
|
||||
`stack` TEXT, -- 打印堆栈
|
||||
`line` TEXT NOT NULL, -- 调用行
|
||||
`trigger_ns` INTEGER DEFAULT NULL, -- 触发时间(ns)
|
||||
`status` INTEGER NOT NULL DEFAULT 1, -- 状态
|
||||
`created_at` datetime DEFAULT NULL, -- 创建时间
|
||||
`updated_at` datetime DEFAULT NULL -- 修改时间
|
||||
);
|
||||
CREATE TABLE `hg_sys_sms_log` ( -- 系统_短信发送记录
|
||||
`id` INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, -- 主键
|
||||
`event` TEXT NOT NULL, -- 事件
|
||||
`mobile` TEXT NOT NULL DEFAULT '', -- 手机号
|
||||
`code` TEXT DEFAULT '', -- 验证码或短信内容
|
||||
`times` INTEGER NOT NULL, -- 验证次数
|
||||
`ip` TEXT DEFAULT NULL, -- ip地址
|
||||
`status` INTEGER DEFAULT 1, -- 状态(1未验证,2已验证)
|
||||
`created_at` datetime DEFAULT NULL, -- 创建时间
|
||||
`updated_at` datetime DEFAULT NULL -- 更新时间
|
||||
);
|
||||
CREATE TABLE `hg_test_category` ( -- 测试分类
|
||||
`id` INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, -- 分类ID
|
||||
`name` TEXT NOT NULL, -- 分类名称
|
||||
`short_name` TEXT DEFAULT NULL, -- 简称
|
||||
`description` TEXT DEFAULT NULL, -- 描述
|
||||
`sort` INTEGER NOT NULL, -- 排序
|
||||
`remark` TEXT DEFAULT NULL, -- 备注
|
||||
`status` INTEGER DEFAULT 1, -- 状态
|
||||
`created_at` datetime DEFAULT NULL, -- 创建时间
|
||||
`updated_at` datetime DEFAULT NULL, -- 修改时间
|
||||
`deleted_at` datetime DEFAULT NULL -- 删除时间
|
||||
);
|
||||
CREATE TABLE `hg_sys_provinces` ( -- 系统_省市区编码
|
||||
`id` INTEGER NOT NULL PRIMARY KEY, -- 省市区ID
|
||||
`title` TEXT NOT NULL DEFAULT '', -- 栏目名称
|
||||
`pinyin` TEXT DEFAULT '', -- 拼音
|
||||
`lng` TEXT DEFAULT '', -- 经度
|
||||
`lat` TEXT DEFAULT '', -- 纬度
|
||||
`pid` INTEGER NOT NULL DEFAULT 0, -- 父栏目
|
||||
`level` INTEGER NOT NULL DEFAULT 1, -- 关系树等级
|
||||
`tree` TEXT NOT NULL, -- 关系
|
||||
`sort` INTEGER DEFAULT 0, -- 排序
|
||||
`status` INTEGER NOT NULL DEFAULT 1, -- 状态
|
||||
`created_at` datetime DEFAULT NULL, -- 创建时间
|
||||
`updated_at` datetime DEFAULT NULL -- 更新时间
|
||||
);
|
||||
CREATE TABLE `hg_gen_curd_test` ( -- 测试_代码生成
|
||||
`id` INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, -- ID
|
||||
"name" VARCHAR(50), -- 姓名
|
||||
"email" VARCHAR(255), -- 邮箱
|
||||
"address" TEXT, -- 地址
|
||||
"salt" VARCHAR(50), -- 密码盐
|
||||
"password" VARCHAR(50), -- 密码
|
||||
"mark" VARCHAR(255), -- 备注
|
||||
"permission" TEXT, -- 权限
|
||||
"created_user_id" INTEGER, -- 创建人
|
||||
"created_at" DATETIME, -- 创建时间
|
||||
"updated_at" DATETIME, -- 更新时间
|
||||
"deleted_at" DATETIME -- 删除时间
|
||||
);
|
||||
|
||||
CREATE INDEX `hg_addon_hgexample_tenant_order_order_sn` ON `hg_addon_hgexample_tenant_order` (`order_sn`);
|
||||
CREATE INDEX `hg_addon_hgexample_tenant_order_member_id` ON `hg_addon_hgexample_tenant_order` (`user_id`);
|
||||
CREATE INDEX `hg_addon_hgexample_tenant_order_merchant_id` ON `hg_addon_hgexample_tenant_order` (`merchant_id`);
|
||||
CREATE INDEX `hg_addon_hgexample_tenant_order_agent_id` ON `hg_addon_hgexample_tenant_order` (`tenant_id`);
|
||||
CREATE INDEX `hg_admin_cash_admin_id` ON `hg_admin_cash` (`member_id`);
|
||||
CREATE INDEX `hg_admin_credits_log_member_id` ON `hg_admin_credits_log` (`member_id`);
|
||||
CREATE INDEX `hg_admin_dept_pid` ON `hg_admin_dept` (`pid`);
|
||||
CREATE UNIQUE INDEX `hg_admin_member_invite_code` ON `hg_admin_member` (`invite_code`);
|
||||
CREATE INDEX `hg_admin_member_dept_id` ON `hg_admin_member` (`dept_id`);
|
||||
CREATE INDEX `hg_admin_member_pid` ON `hg_admin_member` (`pid`);
|
||||
CREATE UNIQUE INDEX `hg_admin_menu_name` ON `hg_admin_menu` (`name`);
|
||||
CREATE INDEX `hg_admin_menu_pid` ON `hg_admin_menu` (`pid`);
|
||||
CREATE INDEX `hg_admin_menu_status` ON `hg_admin_menu` (`status`);
|
||||
CREATE INDEX `hg_admin_menu_type` ON `hg_admin_menu` (`type`);
|
||||
CREATE INDEX `hg_admin_oauth_oauth_client` ON `hg_admin_oauth` (`oauth_client`);
|
||||
CREATE INDEX `hg_admin_oauth_member_id` ON `hg_admin_oauth` (`member_id`);
|
||||
CREATE INDEX `hg_admin_order_order_sn` ON `hg_admin_order` (`order_sn`);
|
||||
CREATE INDEX `hg_admin_order_member_id` ON `hg_admin_order` (`member_id`);
|
||||
CREATE UNIQUE INDEX `hg_pay_log_order_sn` ON `hg_pay_log` (`order_sn`);
|
||||
CREATE INDEX `hg_pay_log_member_id` ON `hg_pay_log` (`member_id`);
|
||||
CREATE INDEX `hg_pay_refund_order_sn` ON `hg_pay_refund` (`order_sn`);
|
||||
CREATE UNIQUE INDEX `hg_sys_addons_config_addon_name_2` ON `hg_sys_addons_config` (`addon_name`);
|
||||
CREATE INDEX `hg_addons_config_addon_name` ON `hg_sys_addons_config` (`addon_name`);
|
||||
CREATE UNIQUE INDEX `hg_sys_addons_install_name` ON `hg_sys_addons_install` (`name`);
|
||||
CREATE INDEX `hg_sys_attachment_md5` ON `hg_sys_attachment` (`md5`);
|
||||
CREATE UNIQUE INDEX `hg_sys_blacklist_name` ON `hg_sys_blacklist` (`ip`);
|
||||
CREATE INDEX `hg_sys_config_group` ON `hg_sys_config` (`group`);
|
||||
CREATE INDEX `hg_sys_config_key` ON `hg_sys_config` (`key`);
|
||||
CREATE INDEX `hg_sys_dict_data_dict_data_idx` ON `hg_sys_dict_data` (`type`);
|
||||
CREATE UNIQUE INDEX `hg_sys_dict_type_dict_type` ON `hg_sys_dict_type` (`type`);
|
||||
CREATE INDEX `hg_sys_ems_log_email` ON `hg_sys_ems_log` (`email`);
|
||||
CREATE INDEX `hg_sys_log_error_code` ON `hg_sys_log` (`error_code`);
|
||||
CREATE INDEX `hg_sys_log_req_id` ON `hg_sys_log` (`req_id`);
|
||||
CREATE INDEX `hg_sys_log_member_id` ON `hg_sys_log` (`member_id`);
|
||||
CREATE INDEX `hg_sys_login_log_member_id` ON `hg_sys_login_log` (`member_id`);
|
||||
CREATE INDEX `hg_sys_login_log_req_id` ON `hg_sys_login_log` (`req_id`);
|
||||
CREATE INDEX `hg_sys_provinces_pid` ON `hg_sys_provinces` (`pid`);
|
||||
CREATE UNIQUE INDEX `hg_sys_serve_license_appid` ON `hg_sys_serve_license` (`appid`);
|
||||
CREATE INDEX `hg_sys_serve_log_member_id` ON `hg_sys_serve_log` (`level_format`);
|
||||
CREATE INDEX `hg_sys_serve_log_traceid` ON `hg_sys_serve_log` (`trace_id`);
|
||||
CREATE INDEX `hg_sys_sms_log_mobile` ON `hg_sys_sms_log` (`mobile`);
|
11
server/utility/db/README.md
Normal file
11
server/utility/db/README.md
Normal file
@@ -0,0 +1,11 @@
|
||||
# 数据库补丁支持
|
||||
|
||||
> 将用于抹平不同数据库的差异性,以支撑基于数据库的部分特性。
|
||||
|
||||
## 特性
|
||||
|
||||
- 增加对数据库表字段注释的支持,特别是 sqlite 的注释支持。
|
||||
- 增加对数据库表名注释的支持,特别是 sqlite 的注释支持。
|
||||
|
||||
> 注意以上支持中,由于 sqlite 的特殊性,对 sqlite 表创建的 sql 语句有所要求,具体示例请参考 [sqlite_example.sql](./sqlite_example.sql)
|
||||
|
54
server/utility/db/db.go
Normal file
54
server/utility/db/db.go
Normal file
@@ -0,0 +1,54 @@
|
||||
package db
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
|
||||
"github.com/gogf/gf/v2/database/gdb"
|
||||
"github.com/gogf/gf/v2/frame/g"
|
||||
)
|
||||
|
||||
// 获取数据库表字段及注释
|
||||
// usage:
|
||||
//
|
||||
// fields, err := db.GetFieldsWithComment(ctx, in.Table, in.Name)
|
||||
// if err != nil {
|
||||
// return
|
||||
// }
|
||||
// for _, v := range fields {}
|
||||
func GetFieldsWithComment(ctx context.Context, tableName, dbTag string) (fields map[string]*gdb.TableField, err error) {
|
||||
db := g.DB(dbTag)
|
||||
fields, err = db.TableFields(ctx, tableName) // 使用 goframe 框架本身已完美支持 mysql 获取表字段及注释
|
||||
dbConf := db.GetConfig()
|
||||
switch dbConf.Type {
|
||||
case "sqlite":
|
||||
fields, err = fixSqliteFieldsComment(ctx, tableName, db, fields)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
type TableComment struct {
|
||||
Name string `json:"name"`
|
||||
Comment string `json:"comment"`
|
||||
}
|
||||
|
||||
// 获取数据库表字段及注释
|
||||
func GetTablesWithComment(ctx context.Context, dbTag string) (tables []*TableComment, err error) {
|
||||
db := g.DB(dbTag)
|
||||
dbConf := db.GetConfig()
|
||||
switch dbConf.Type {
|
||||
case "mysql":
|
||||
sql := "SELECT TABLE_NAME as name, TABLE_COMMENT as comment FROM information_schema.`TABLES` WHERE TABLE_SCHEMA = '%s'"
|
||||
if err = db.Ctx(ctx).Raw(fmt.Sprintf(sql, dbConf.Name)).Scan(&tables); err != nil {
|
||||
return
|
||||
}
|
||||
case "sqlite":
|
||||
var tableNames []string
|
||||
tableNames, err = db.Tables(ctx)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
tables, err = transSqliteTablesComment(ctx, tableNames, db)
|
||||
}
|
||||
return
|
||||
}
|
45
server/utility/db/sqlite_example.sql
Normal file
45
server/utility/db/sqlite_example.sql
Normal file
@@ -0,0 +1,45 @@
|
||||
CREATE TABLE IF NOT EXISTS `user1` ( -- 用户管理
|
||||
`id` INTEGER, -- 编号
|
||||
`name` VARCHAR(50), -- 名称
|
||||
`email` VARCHAR(255), -- 邮箱
|
||||
`address` TEXT, -- 地址
|
||||
`salt` VARCHAR(50), -- 盐
|
||||
`password` VARCHAR(50), -- 密码
|
||||
`mark` VARCHAR(255), -- 备注
|
||||
`permission` TEXT, -- 权限
|
||||
`created_user_id` INTEGER, -- 创建者编号
|
||||
`created_at` DATETIME, -- 创建时间
|
||||
`updated_at` DATETIME, -- 更新时间
|
||||
`deleted_at` DATETIME, -- 删除时间
|
||||
PRIMARY KEY(`id`)
|
||||
);
|
||||
CREATE TABLE "user2" ( -- 用户管理
|
||||
"id" INTEGER, -- 编号
|
||||
"name" VARCHAR(50), -- 名称
|
||||
"email" VARCHAR(255), -- 邮箱
|
||||
"address" TEXT, -- 地址
|
||||
"salt" VARCHAR(50), -- 盐
|
||||
"password" VARCHAR(50), -- 密码
|
||||
"mark" VARCHAR(255), -- 备注
|
||||
"permission" TEXT, -- 权限
|
||||
"created_user_id" INTEGER, -- 创建者编号
|
||||
"created_at" DATETIME, -- 创建时间
|
||||
"updated_at" DATETIME, -- 更新时间
|
||||
"deleted_at" DATETIME, -- 删除时间
|
||||
PRIMARY KEY("id")
|
||||
);
|
||||
CREATE TABLE IF NOT EXISTS user3 ( -- 用户管理
|
||||
id INTEGER, -- 编号
|
||||
name VARCHAR(50), -- 名称
|
||||
email VARCHAR(255), -- 邮箱
|
||||
address TEXT, -- 地址
|
||||
salt VARCHAR(50), -- 盐
|
||||
password VARCHAR(50), -- 密码
|
||||
mark VARCHAR(255), -- 备注
|
||||
permission TEXT, -- 权限
|
||||
created_user_id INTEGER, -- 创建者编号
|
||||
created_at DATETIME, -- 创建时间
|
||||
updated_at DATETIME, -- 更新时间
|
||||
deleted_at DATETIME, -- 删除时间
|
||||
PRIMARY KEY(id)
|
||||
);
|
105
server/utility/db/sqlite_fields.go
Normal file
105
server/utility/db/sqlite_fields.go
Normal file
@@ -0,0 +1,105 @@
|
||||
package db
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"strings"
|
||||
|
||||
"github.com/gogf/gf/v2/container/gmap"
|
||||
"github.com/gogf/gf/v2/database/gdb"
|
||||
)
|
||||
|
||||
// func getSQLiteSchemaByCli(tableName string, db gdb.DB) (string, error) {
|
||||
// dbConf := db.GetConfig()
|
||||
// cmd := exec.Command("sqlite3", dbConf.Name, fmt.Sprintf(".schema %s", tableName))
|
||||
// glog.Info(context.TODO(), "sqlite3", dbConf.Name, fmt.Sprintf("'.schema %s'", tableName))
|
||||
// output, err := cmd.CombinedOutput()
|
||||
// if err != nil {
|
||||
// return "", err
|
||||
// }
|
||||
// return strings.TrimSpace(string(output)), nil
|
||||
// }
|
||||
|
||||
func getSQLiteSchemaBySql(ctx context.Context, tableName string, db gdb.DB) (string, error) {
|
||||
schemaRes, err := db.GetValue(ctx, fmt.Sprintf(`SELECT sql FROM sqlite_master WHERE type='table' AND name='%s';`, tableName))
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
return schemaRes.String(), nil
|
||||
}
|
||||
|
||||
func getSQliteTableComments(createTableSql string) (tableComment, tableName string) {
|
||||
// 按照换行符分割文本
|
||||
lines := strings.Split(createTableSql, "\n")
|
||||
|
||||
// 循环输出每一行
|
||||
for _, line := range lines {
|
||||
// 检查 createTableSql 是否包含 comment
|
||||
if strings.Contains(line, "--") {
|
||||
if strings.Contains(line, "CREATE TABLE") {
|
||||
tableName = getLastWord(strings.Split(line, "(")[0])
|
||||
tableComment = strings.Split(line, "--")[1]
|
||||
}
|
||||
}
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
func getSQliteFieldsComments(createTableSql string) (fieldCommentMap gmap.Map, tableComment, tableName string) {
|
||||
// 按照换行符分割文本
|
||||
lines := strings.Split(createTableSql, "\n")
|
||||
|
||||
// 循环输出每一行
|
||||
for _, line := range lines {
|
||||
// 检查 createTableSql 是否包含 comment
|
||||
if strings.Contains(line, "--") {
|
||||
if strings.Contains(line, "CREATE TABLE") {
|
||||
tableName = getLastWord(strings.Split(line, "(")[0])
|
||||
tableComment = strings.Split(line, "--")[1]
|
||||
} else {
|
||||
firstWord := getFirstWord(line)
|
||||
lastWord := getLastWord(line)
|
||||
fieldCommentMap.Set(firstWord, lastWord)
|
||||
}
|
||||
}
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
func transSqliteTablesComment(ctx context.Context, tableNames []string, db gdb.DB) (tables []*TableComment, err error) {
|
||||
schemaStr := ""
|
||||
eleIgnore := "sqlite_sequence"
|
||||
for _, v := range tableNames {
|
||||
if v != eleIgnore {
|
||||
schemaStr, err = getSQLiteSchemaBySql(ctx, v, db)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
comment, _ := getSQliteTableComments(schemaStr)
|
||||
tables = append(tables, &TableComment{
|
||||
Name: v,
|
||||
Comment: comment,
|
||||
})
|
||||
}
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
func fixSqliteFieldsComment(ctx context.Context, tableName string, db gdb.DB, fields map[string]*gdb.TableField) (map[string]*gdb.TableField, error) {
|
||||
// 记录: db.DoSelect 无法执行 .开头的命令
|
||||
// schemaRes, err := db.DoSelect(ctx, dbConf.Link, fmt.Sprintf(`.schema %s`, d.QuoteWord(table)))
|
||||
// 记录: 查询 sqlite_master 不响应任何结果
|
||||
// s, err := db.Query(ctx, `select * from sqlite_master WHERE name="%s";`, tableName)
|
||||
// schemaStr, err := getSQLiteSchemaBySql(tableName, db)
|
||||
schemaStr, err := getSQLiteSchemaBySql(ctx, tableName, db)
|
||||
if err != nil {
|
||||
return fields, err
|
||||
}
|
||||
comments, _, _ := getSQliteFieldsComments(schemaStr)
|
||||
for i := range fields {
|
||||
if comments.Contains(i) {
|
||||
fields[i].Comment = comments.Get(i).(string)
|
||||
}
|
||||
}
|
||||
return fields, nil
|
||||
}
|
29
server/utility/db/utils.go
Normal file
29
server/utility/db/utils.go
Normal file
@@ -0,0 +1,29 @@
|
||||
package db
|
||||
|
||||
import (
|
||||
"strings"
|
||||
"unicode"
|
||||
)
|
||||
|
||||
// 判断字符是否为字母、数字或下划线
|
||||
func isWordChar(r rune) bool {
|
||||
return unicode.IsLetter(r) || unicode.IsDigit(r) || r == '_'
|
||||
}
|
||||
|
||||
// 获取一行文本中的第一个完整单词
|
||||
func getFirstWord(text string) string {
|
||||
fields := strings.FieldsFunc(text, func(r rune) bool { return !isWordChar(r) })
|
||||
if len(fields) > 0 {
|
||||
return fields[0]
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
// 获取一行文本中的最后一个完整单词
|
||||
func getLastWord(text string) string {
|
||||
fields := strings.FieldsFunc(text, func(r rune) bool { return !isWordChar(r) })
|
||||
if len(fields) > 0 {
|
||||
return fields[len(fields)-1]
|
||||
}
|
||||
return ""
|
||||
}
|
@@ -16,6 +16,7 @@ export function UploadImage(params) {
|
||||
const headers = {
|
||||
Authorization: useUserStore.token,
|
||||
uploadType: 'default',
|
||||
'Content-Type': 'multipart/form-data',
|
||||
};
|
||||
return http.request({
|
||||
url: '/upload/file',
|
||||
|
@@ -36,12 +36,16 @@ export const routerGenerator = (routerMap, parent?): any[] => {
|
||||
|
||||
// 为了防止出现后端返回结果不规范,处理有可能出现拼接出两个 反斜杠
|
||||
currentRouter.path = currentRouter.path.replace('//', '/');
|
||||
// 重定向
|
||||
item.redirect && (currentRouter.redirect = item.redirect);
|
||||
// 重定向 ,菜单类型为目录默认默认跳转
|
||||
if(item.meta.type === 1){
|
||||
item.redirect && (currentRouter.redirect = item.redirect);
|
||||
}
|
||||
// 是否有子菜单,并递归处理
|
||||
if (item.children && item.children.length > 0) {
|
||||
//如果未定义 redirect 默认第一个子路由为 redirect
|
||||
!item.redirect && (currentRouter.redirect = `${item.path}/${item.children[0].path}`);
|
||||
if(item.meta.type === 1) {
|
||||
!item.redirect && (currentRouter.redirect = `${item.path}/${item.children[0].path}`);
|
||||
}
|
||||
// Recursion
|
||||
currentRouter.children = routerGenerator(item.children, currentRouter);
|
||||
}
|
||||
|
@@ -24,6 +24,7 @@
|
||||
<n-tree-select
|
||||
multiple
|
||||
key-field="id"
|
||||
label-field="name"
|
||||
:options="deptList"
|
||||
v-model:value="formValue.customDept"
|
||||
:default-expand-all="true"
|
||||
|
Reference in New Issue
Block a user