Merge pull request #63 from bufanyun/v2.0

up
This commit is contained in:
maxbad
2024-06-21 14:29:54 +08:00
committed by GitHub
13 changed files with 6112 additions and 5 deletions

View File

@@ -15,6 +15,8 @@ import (
"github.com/gogf/gf/v2/util/gconv" "github.com/gogf/gf/v2/util/gconv"
"os" "os"
"path/filepath" "path/filepath"
"sort"
"strconv"
"strings" "strings"
) )
@@ -139,7 +141,11 @@ func MergePartFile(srcPath, dstPath string) (err error) {
if err != nil { if err != nil {
return err 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 { for _, file := range dir {
filePath := filepath.Join(srcPath, file.Name()) filePath := filepath.Join(srcPath, file.Name())
if err = gfile.PutBytesAppend(dstPath, gfile.GetBytes(filePath)); err != nil { if err = gfile.PutBytesAppend(dstPath, gfile.GetBytes(filePath)); err != nil {

View 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"))
}
}

View File

@@ -1719,7 +1719,7 @@ CREATE TABLE IF NOT EXISTS `hg_sys_attachment` (
`name` varchar(1000) DEFAULT NULL COMMENT '文件原始名', `name` varchar(1000) DEFAULT NULL COMMENT '文件原始名',
`kind` varchar(16) DEFAULT NULL COMMENT '上传类型', `kind` varchar(16) DEFAULT NULL COMMENT '上传类型',
`mime_type` varchar(128) NOT NULL DEFAULT '' 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 '本地路径', `path` varchar(1000) DEFAULT NULL COMMENT '本地路径',
`file_url` varchar(1000) DEFAULT NULL COMMENT 'url', `file_url` varchar(1000) DEFAULT NULL COMMENT 'url',
`size` bigint(20) DEFAULT '0' COMMENT '文件大小', `size` bigint(20) DEFAULT '0' COMMENT '文件大小',

File diff suppressed because one or more lines are too long

View 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`);

View File

@@ -0,0 +1,11 @@
# 数据库补丁支持
> 将用于抹平不同数据库的差异性以支撑基于数据库的部分特性
## 特性
- 增加对数据库表字段注释的支持特别是 sqlite 的注释支持
- 增加对数据库表名注释的支持特别是 sqlite 的注释支持
> 注意以上支持中由于 sqlite 的特殊性 sqlite 表创建的 sql 语句有所要求具体示例请参考 [sqlite_example.sql](./sqlite_example.sql)

54
server/utility/db/db.go Normal file
View 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
}

View 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)
);

View 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
}

View 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 ""
}

View File

@@ -16,6 +16,7 @@ export function UploadImage(params) {
const headers = { const headers = {
Authorization: useUserStore.token, Authorization: useUserStore.token,
uploadType: 'default', uploadType: 'default',
'Content-Type': 'multipart/form-data',
}; };
return http.request({ return http.request({
url: '/upload/file', url: '/upload/file',

View File

@@ -36,12 +36,16 @@ export const routerGenerator = (routerMap, parent?): any[] => {
// 为了防止出现后端返回结果不规范,处理有可能出现拼接出两个 反斜杠 // 为了防止出现后端返回结果不规范,处理有可能出现拼接出两个 反斜杠
currentRouter.path = currentRouter.path.replace('//', '/'); 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) { if (item.children && item.children.length > 0) {
//如果未定义 redirect 默认第一个子路由为 redirect //如果未定义 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 // Recursion
currentRouter.children = routerGenerator(item.children, currentRouter); currentRouter.children = routerGenerator(item.children, currentRouter);
} }

View File

@@ -24,6 +24,7 @@
<n-tree-select <n-tree-select
multiple multiple
key-field="id" key-field="id"
label-field="name"
:options="deptList" :options="deptList"
v-model:value="formValue.customDept" v-model:value="formValue.customDept"
:default-expand-all="true" :default-expand-all="true"