-- ----------------------------
-- App端数据库表结构
-- ----------------------------

-- 1、App端用户信息表
CREATE TABLE app_user
(
    user_id       BIGINT(20)  NOT NULL COMMENT 'App用户ID',
    user_name     VARCHAR(30) NOT NULL COMMENT '用户账号',
    nick_name     VARCHAR(30) NOT NULL COMMENT '用户昵称',
    phone         VARCHAR(11)  DEFAULT '' COMMENT '手机号码',
    email         VARCHAR(50)  DEFAULT '' COMMENT '用户邮箱',
    sex           CHAR(1)      DEFAULT '0' COMMENT '用户性别（0男 1女 2未知）',
    avatar        BIGINT(20) COMMENT '头像地址',
    password      VARCHAR(100) DEFAULT '' COMMENT '密码',
    status        CHAR(1)      DEFAULT '0' COMMENT '帐号状态（0正常 1停用）',
    del_flag      CHAR(1)      DEFAULT '0' COMMENT '删除标志（0代表存在 1代表删除）',
    login_ip      VARCHAR(128) DEFAULT '' COMMENT '最后登录IP',
    login_date    DATETIME COMMENT '最后登录时间',
    register_time DATETIME COMMENT '注册时间',
    create_by     BIGINT(20)   DEFAULT NULL COMMENT '创建者',
    create_time   DATETIME COMMENT '创建时间',
    update_by     BIGINT(20)   DEFAULT NULL COMMENT '更新者',
    update_time   DATETIME COMMENT '更新时间',
    remark        VARCHAR(500) DEFAULT NULL COMMENT '备注',
    PRIMARY KEY (user_id)
) ENGINE = InnoDB COMMENT = 'App端用户信息表';

INSERT INTO app_user
VALUES (1, 'appuser', 'App测试用户 密码admin123', '15888888888', 'appuser@qq.com', '1', NULL,
        '$2a$10$7JB720yubVSOfvVMe6LeNOKgEoXAw7tCxJRET6pVuiDDz/LQ4Gqk.',
        '0', '0', '127.0.0.1', SYSDATE(), SYSDATE(), 1, SYSDATE(), NULL, NULL, 'App端测试用户');

-- 2、App端角色信息表
CREATE TABLE app_role
(
    role_id     BIGINT(20)   NOT NULL COMMENT 'App角色ID',
    role_name   VARCHAR(30)  NOT NULL COMMENT '角色名称',
    role_key    VARCHAR(100) NOT NULL COMMENT '角色权限字符串',
    role_sort   INT(4)       NOT NULL COMMENT '显示顺序',
    status      CHAR(1)      NOT NULL COMMENT '角色状态（0正常 1停用）',
    del_flag    CHAR(1)      DEFAULT '0' COMMENT '删除标志（0代表存在 1代表删除）',
    create_by   BIGINT(20)   DEFAULT NULL COMMENT '创建者',
    create_time DATETIME COMMENT '创建时间',
    update_by   BIGINT(20)   DEFAULT NULL COMMENT '更新者',
    update_time DATETIME COMMENT '更新时间',
    remark      VARCHAR(500) DEFAULT NULL COMMENT '备注',
    PRIMARY KEY (role_id)
) ENGINE = InnoDB COMMENT = 'App端角色信息表';

INSERT INTO app_role
VALUES (1, 'App普通用户', 'app_user', 1, '0', '0', 1, SYSDATE(), NULL, NULL, 'App端普通用户'),
       (2, 'App VIP用户', 'app_vip', 2, '0', '0', 1, SYSDATE(), NULL, NULL, 'App端VIP用户');

-- 3、App端用户和角色关联表
CREATE TABLE app_user_role
(
    user_id BIGINT(20) NOT NULL COMMENT 'App用户ID',
    role_id BIGINT(20) NOT NULL COMMENT 'App角色ID',
    PRIMARY KEY (user_id, role_id)
) ENGINE = InnoDB COMMENT = 'App端用户和角色关联表';

INSERT INTO app_user_role
VALUES ('1', '1');

-- 4、App端第三方登录授权表
CREATE TABLE app_social_auth
(
    id            BIGINT(20)    NOT NULL COMMENT '主键',
    user_id       BIGINT(20)    NOT NULL COMMENT 'App用户ID',
    platform      VARCHAR(255)  NOT NULL COMMENT '用户来源平台（wechat_mp:微信小程序 wechat_open:微信开放平台 qq:QQ weibo:微博）',
    platform_uid  VARCHAR(255)  NOT NULL COMMENT '表示平台唯一用户标识',
    open_id       VARCHAR(255) DEFAULT NULL COMMENT '微信openid',
    union_id      VARCHAR(255) DEFAULT NULL COMMENT '微信unionid',
    access_token  VARCHAR(2000) NOT NULL COMMENT '用户的授权令牌',
    expire_in     INT          DEFAULT NULL COMMENT '用户的授权令牌的有效期',
    refresh_token VARCHAR(255) DEFAULT NULL COMMENT '刷新令牌',
    scope         VARCHAR(255) DEFAULT NULL COMMENT '授予的权限',
    create_by     BIGINT(20)   DEFAULT NULL COMMENT '创建者',
    create_time   DATETIME COMMENT '创建时间',
    update_by     BIGINT(20)   DEFAULT NULL COMMENT '更新者',
    update_time   DATETIME COMMENT '更新时间',
    del_flag      CHAR(1)      DEFAULT '0' COMMENT '删除标志（0代表存在 1代表删除）',
    PRIMARY KEY (id)
) ENGINE = InnoDB COMMENT = 'App端第三方登录授权表';

-- 5、App端登录日志表
CREATE TABLE app_login_log
(
    info_id        BIGINT(20) NOT NULL COMMENT '访问ID',
    user_name      VARCHAR(50)  DEFAULT '' COMMENT '用户账号',
    status         CHAR(1)      DEFAULT '0' COMMENT '登录状态（0成功 1失败）',
    ipaddr         VARCHAR(128) DEFAULT '' COMMENT '登录IP地址',
    login_location VARCHAR(255) DEFAULT '' COMMENT '登录地点',
    browser        VARCHAR(50)  DEFAULT '' COMMENT '浏览器类型',
    os             VARCHAR(50)  DEFAULT '' COMMENT '操作系统',
    msg            VARCHAR(255) DEFAULT '' COMMENT '提示消息',
    login_time     DATETIME COMMENT '访问时间',
    PRIMARY KEY (info_id),
    KEY idx_app_login_log_s (status),
    KEY idx_app_login_log_lt (login_time)
) ENGINE = InnoDB COMMENT = 'App端登录日志表';

-- 6、App端操作日志记录
CREATE TABLE app_oper_log
(
    oper_id        BIGINT(20) NOT NULL COMMENT '日志主键',
    title          VARCHAR(50)   DEFAULT '' COMMENT '模块标题',
    business_type  INT(2)        DEFAULT 0 COMMENT '业务类型（0其它 1新增 2修改 3删除）',
    method         VARCHAR(100)  DEFAULT '' COMMENT '方法名称',
    request_method VARCHAR(10)   DEFAULT '' COMMENT '请求方式',
    oper_name      VARCHAR(50)   DEFAULT '' COMMENT '操作人员',
    oper_url       VARCHAR(255)  DEFAULT '' COMMENT '请求URL',
    oper_ip        VARCHAR(128)  DEFAULT '' COMMENT '主机地址',
    oper_location  VARCHAR(255)  DEFAULT '' COMMENT '操作地点',
    oper_param     VARCHAR(2000) DEFAULT '' COMMENT '请求参数',
    json_result    VARCHAR(2000) DEFAULT '' COMMENT '返回参数',
    status         INT(1)        DEFAULT 0 COMMENT '操作状态（0正常 1异常）',
    error_msg      VARCHAR(2000) DEFAULT '' COMMENT '错误消息',
    oper_time      DATETIME COMMENT '操作时间',
    cost_time      BIGINT(20)    DEFAULT 0 COMMENT '消耗时间',
    PRIMARY KEY (oper_id),
    KEY idx_app_oper_log_bt (business_type),
    KEY idx_app_oper_log_s (status),
    KEY idx_app_oper_log_ot (oper_time)
) ENGINE = InnoDB COMMENT = 'App端操作日志记录';

-- 7、App端设备信息表
CREATE TABLE app_device
(
    device_id        BIGINT(20)  NOT NULL COMMENT '设备ID',
    user_id          BIGINT(20)  NOT NULL COMMENT 'App用户ID',
    device_type      VARCHAR(20) NOT NULL COMMENT '设备类型（ios android h5）',
    device_name      VARCHAR(100) DEFAULT '' COMMENT '设备名称',
    device_model     VARCHAR(100) DEFAULT '' COMMENT '设备型号',
    device_brand     VARCHAR(50)  DEFAULT '' COMMENT '设备品牌',
    os_version       VARCHAR(50)  DEFAULT '' COMMENT '操作系统版本',
    app_version      VARCHAR(50)  DEFAULT '' COMMENT 'App版本',
    push_token       VARCHAR(255) DEFAULT '' COMMENT '推送令牌',
    is_active        CHAR(1)      DEFAULT '1' COMMENT '是否活跃（0否 1是）',
    last_active_time DATETIME COMMENT '最后活跃时间',
    create_time      DATETIME COMMENT '创建时间',
    update_time      DATETIME COMMENT '更新时间',
    PRIMARY KEY (device_id),
    KEY idx_app_device_user_id (user_id),
    KEY idx_app_device_type (device_type)
) ENGINE = InnoDB COMMENT = 'App端设备信息表';

-- 8、App端消息推送表
CREATE TABLE app_message
(
    message_id   BIGINT(20)   NOT NULL COMMENT '消息ID',
    title        VARCHAR(100) NOT NULL COMMENT '消息标题',
    content      TEXT COMMENT '消息内容',
    message_type VARCHAR(20)   DEFAULT 'system' COMMENT '消息类型（system:系统消息 notice:通知 activity:活动）',
    target_type  VARCHAR(20)   DEFAULT 'all' COMMENT '推送目标（all:全部用户 user:指定用户 role:指定角色）',
    target_ids   VARCHAR(1000) DEFAULT '' COMMENT '目标ID列表（用户ID或角色ID，逗号分隔）',
    send_time    DATETIME COMMENT '发送时间',
    status       CHAR(1)       DEFAULT '0' COMMENT '状态（0待发送 1已发送 2发送失败）',
    create_by    BIGINT(20)    DEFAULT NULL COMMENT '创建者',
    create_time  DATETIME COMMENT '创建时间',
    update_by    BIGINT(20)    DEFAULT NULL COMMENT '更新者',
    update_time  DATETIME COMMENT '更新时间',
    PRIMARY KEY (message_id),
    KEY idx_app_message_type (message_type),
    KEY idx_app_message_status (status)
) ENGINE = InnoDB COMMENT = 'App端消息推送表';

-- 9、App端用户消息读取记录表
CREATE TABLE app_user_message
(
    id          BIGINT(20) NOT NULL COMMENT '主键',
    user_id     BIGINT(20) NOT NULL COMMENT 'App用户ID',
    message_id  BIGINT(20) NOT NULL COMMENT '消息ID',
    is_read     CHAR(1) DEFAULT '0' COMMENT '是否已读（0未读 1已读）',
    read_time   DATETIME COMMENT '读取时间',
    create_time DATETIME COMMENT '创建时间',
    PRIMARY KEY (id),
    KEY idx_app_user_message_user (user_id),
    KEY idx_app_user_message_msg (message_id),
    KEY idx_app_user_message_read (is_read)
) ENGINE = InnoDB COMMENT = 'App端用户消息读取记录表';

-- 10、App版本信息表
CREATE TABLE app_version
(
    version_id     BIGINT(20)   NOT NULL COMMENT '版本ID',
    version_code   INT          NOT NULL COMMENT '版本号（数字）',
    version_name   VARCHAR(20)  NOT NULL COMMENT '版本名（如1.0.0）',
    update_content TEXT COMMENT '更新内容',
    download_url   VARCHAR(500) NOT NULL COMMENT '下载地址',
    is_force       CHAR(1)     DEFAULT '0' COMMENT '是否强制更新（0否 1是）',
    platform       VARCHAR(10) DEFAULT 'android' COMMENT '平台（android、ios）',
    create_time    DATETIME COMMENT '创建时间',
    PRIMARY KEY (version_id)
) ENGINE = InnoDB COMMENT ='App版本信息表';

-- 11、App文件表
DROP TABLE IF EXISTS `app_file`;
CREATE TABLE `app_file`
(
    `file_id`         bigint                                                        NOT NULL AUTO_INCREMENT COMMENT '文件ID',
    `user_id`         bigint                                                        NOT NULL COMMENT '用户ID',
    `file_name`       varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '文件名称',
    `original_name`   varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '原始文件名',
    `file_path`       varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '文件路径',
    `file_url`        varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '文件URL',
    `file_size`       bigint                                                        NOT NULL DEFAULT 0 COMMENT '文件大小（字节）',
    `file_type`       varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '文件类型',
    `file_suffix`     varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '文件后缀',
    `file_category`   int                                                           NOT NULL DEFAULT 6 COMMENT '文件分类（1头像 2图片 3视频 4音频 5文档 6其他）',
    `storage_service` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci  NOT NULL COMMENT '存储服务',
    `status`          char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci      NOT NULL DEFAULT '0' COMMENT '状态（0正常 1删除）',
    `download_count`  bigint                                                        NOT NULL DEFAULT 0 COMMENT '下载次数',
    `is_public`       char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci      NOT NULL DEFAULT '0' COMMENT '是否公开（0私有 1公开）',
    `file_md5`        varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '文件MD5值',
    `remark`          varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '备注',
    `create_by`       varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '创建者',
    `create_time`     datetime NULL DEFAULT NULL COMMENT '创建时间',
    `update_by`       varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '更新者',
    `update_time`     datetime NULL DEFAULT NULL COMMENT '更新时间',
    PRIMARY KEY (`file_id`) USING BTREE,
    INDEX             `idx_user_id`(`user_id` ASC) USING BTREE COMMENT '用户ID索引',
    INDEX             `idx_file_category`(`file_category` ASC) USING BTREE COMMENT '文件分类索引',
    INDEX             `idx_status`(`status` ASC) USING BTREE COMMENT '状态索引',
    INDEX             `idx_is_public`(`is_public` ASC) USING BTREE COMMENT '公开状态索引',
    INDEX             `idx_file_md5`(`file_md5` ASC) USING BTREE COMMENT 'MD5索引',
    INDEX             `idx_create_time`(`create_time` ASC) USING BTREE COMMENT '创建时间索引'
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = 'App端文件信息表' ROW_FORMAT = Dynamic;