-- ================================= -- 自由云商城 数据库结构 + 初始数据 -- 安装程序会自动把 __PREFIX__ 替换为用户填写的表前缀 -- 编码:utf8mb4 / InnoDB -- ================================= -- 用户表(普通用户与后台管理员共用,is_admin=1 为管理员;status=0 表示被封禁) CREATE TABLE `__PREFIX__users` ( `id` INT UNSIGNED NOT NULL AUTO_INCREMENT, `username` VARCHAR(50) NOT NULL, `password` VARCHAR(255) NOT NULL, `email` VARCHAR(120) NOT NULL DEFAULT '', `is_admin` TINYINT(1) NOT NULL DEFAULT 0, `role` VARCHAR(10) NOT NULL DEFAULT 'user' COMMENT 'admin管理员 cs客服 user普通用户(后台登录用 role IN admin/cs)', `avatar` VARCHAR(255) DEFAULT '' COMMENT '头像文件路径', `status` TINYINT(1) NOT NULL DEFAULT 1 COMMENT '1正常 0已封禁', `nickname` VARCHAR(60) NOT NULL DEFAULT '' COMMENT '昵称', `verified` TINYINT(1) NOT NULL DEFAULT 0 COMMENT '邮箱是否验证 0未验证 1已验证', `email_token` VARCHAR(64) NOT NULL DEFAULT '' COMMENT '邮箱验证令牌', `reg_ip` VARCHAR(45) NOT NULL DEFAULT '' COMMENT '注册 IP(限频用)', `points` INT UNSIGNED NOT NULL DEFAULT 0 COMMENT '积分余额', `invite_code` VARCHAR(12) NOT NULL DEFAULT '' COMMENT '我的邀请码(唯一,用于邀请奖励)', `invited_by` INT UNSIGNED DEFAULT NULL COMMENT '邀请人 user_id(通过邀请注册时记录)', `created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`id`), UNIQUE KEY `uk_username` (`username`), UNIQUE KEY `uk_invite_code` (`invite_code`), KEY `idx_invited_by` (`invited_by`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; -- 商品表 CREATE TABLE `__PREFIX__products` ( `id` INT UNSIGNED NOT NULL AUTO_INCREMENT, `name` VARCHAR(120) NOT NULL, `price` DECIMAL(10,2) NOT NULL DEFAULT 0.00, `stock` INT UNSIGNED NOT NULL DEFAULT 0, `category` VARCHAR(40) NOT NULL DEFAULT '其他', `icon` VARCHAR(40) NOT NULL DEFAULT 'fa-box', `image` VARCHAR(255) DEFAULT '', `description` TEXT, `period_days` INT NOT NULL DEFAULT 0 COMMENT '周期天数:0=一次性/实物,>0=按天计的周期商品(如 30/90/365)', `points_price` INT UNSIGNED NOT NULL DEFAULT 0 COMMENT '积分价:0=不可用积分购买,>0=可用该积分数购买', `status` TINYINT(1) NOT NULL DEFAULT 1 COMMENT '1上架 0下架', `created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`id`), KEY `idx_category` (`category`), KEY `idx_status` (`status`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; -- 商品分组(后台可增删,用于首页分类筛选与商品归类) CREATE TABLE `__PREFIX__product_groups` ( `id` INT UNSIGNED NOT NULL AUTO_INCREMENT, `name` VARCHAR(40) NOT NULL, `icon` VARCHAR(40) NOT NULL DEFAULT 'fa-tags', `sort_order` INT NOT NULL DEFAULT 0, `created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`id`), UNIQUE KEY `uk_name` (`name`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; -- 订单表(status: pending待付款 paid已付款 shipped已发货 completed已完成 cancelled已取消) CREATE TABLE `__PREFIX__orders` ( `id` INT UNSIGNED NOT NULL AUTO_INCREMENT, `order_no` VARCHAR(32) NOT NULL, `user_id` INT UNSIGNED NOT NULL, `total` DECIMAL(10,2) NOT NULL DEFAULT 0.00, `status` VARCHAR(20) NOT NULL DEFAULT 'pending', `contact` VARCHAR(60) DEFAULT '', `contact_email` VARCHAR(120) DEFAULT '' COMMENT '联系邮箱(下单人填写)', `address` VARCHAR(255) DEFAULT '', `note` VARCHAR(255) DEFAULT '', `period_days` INT NOT NULL DEFAULT 0 COMMENT '本单周期天数(取商品最大值)', `expires_at` DATETIME DEFAULT NULL COMMENT '到期时间(周期商品有值)', `expire_notify_sent` TINYINT(1) NOT NULL DEFAULT 0 COMMENT '到期前提醒邮件是否已发送 0未发 1已发', `pay_type` VARCHAR(10) NOT NULL DEFAULT 'cash' COMMENT 'cash现金 points积分支付', `points_used` INT UNSIGNED NOT NULL DEFAULT 0 COMMENT '积分支付时扣减的积分数', `created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`id`), UNIQUE KEY `uk_order_no` (`order_no`), KEY `idx_user` (`user_id`), KEY `idx_expires` (`expires_at`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; -- 订单明细表 CREATE TABLE `__PREFIX__order_items` ( `id` INT UNSIGNED NOT NULL AUTO_INCREMENT, `order_id` INT UNSIGNED NOT NULL, `product_id` INT UNSIGNED NOT NULL, `name` VARCHAR(120) NOT NULL, `price` DECIMAL(10,2) NOT NULL, `qty` INT UNSIGNED NOT NULL, `subtotal` DECIMAL(10,2) NOT NULL, `period_days` INT NOT NULL DEFAULT 0 COMMENT '下单时商品的周期天数', PRIMARY KEY (`id`), KEY `idx_order` (`order_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; -- 发货信息表(管理员发货时填写:连接信息/登录凭据) CREATE TABLE `__PREFIX__order_deliveries` ( `id` INT UNSIGNED NOT NULL AUTO_INCREMENT, `order_id` INT UNSIGNED NOT NULL, `server_ip` VARCHAR(60) DEFAULT '' COMMENT '服务器 IP', `conn_addr` VARCHAR(255) DEFAULT '' COMMENT '连接地址/域名', `login_user` VARCHAR(120) DEFAULT '' COMMENT '登录账户', `login_pass` VARCHAR(255) DEFAULT '' COMMENT '登录密码', `remark` TEXT, `activated` TINYINT(1) NOT NULL DEFAULT 0 COMMENT '激活状态:0未激活 1已激活(管理员填写,用户端展示)', `product_info` TEXT COMMENT '商品信息(管理员填写后展示给用户)', `created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`id`), KEY `idx_order` (`order_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; -- 系统设置表(SMTP 等键值对) CREATE TABLE `__PREFIX__settings` ( `k` VARCHAR(64) NOT NULL, `v` TEXT, PRIMARY KEY (`k`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; -- 工单部门表 CREATE TABLE `__PREFIX__ticket_departments` ( `id` INT UNSIGNED NOT NULL AUTO_INCREMENT, `name` VARCHAR(60) NOT NULL, `description` VARCHAR(255) DEFAULT '', `sort` INT NOT NULL DEFAULT 0, `created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; -- 工单表 CREATE TABLE `__PREFIX__tickets` ( `id` INT UNSIGNED NOT NULL AUTO_INCREMENT, `user_id` INT UNSIGNED NOT NULL, `dept_id` INT UNSIGNED NOT NULL DEFAULT 0, `order_id` INT UNSIGNED DEFAULT NULL COMMENT '关联订单(续期工单用)', `type` VARCHAR(20) NOT NULL DEFAULT 'general' COMMENT 'general普通 renewal续期申请', `subject` VARCHAR(160) NOT NULL, `message` TEXT NOT NULL, `status` VARCHAR(20) NOT NULL DEFAULT 'open' COMMENT 'open待处理 pending处理中 resolved已解决 closed已关闭', `priority` TINYINT(1) NOT NULL DEFAULT 2 COMMENT '1低 2普通 3高', `admin_reply` TEXT, `admin_id` INT UNSIGNED DEFAULT NULL, `assignee_id` INT UNSIGNED DEFAULT NULL COMMENT '负责人(客服/管理员)用户ID,NULL=未分配(仅管理员可见)', `created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, `updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, `closed_at` DATETIME DEFAULT NULL, PRIMARY KEY (`id`), KEY `idx_status` (`status`), KEY `idx_user` (`user_id`), KEY `idx_dept` (`dept_id`), KEY `idx_order` (`order_id`), KEY `idx_assignee` (`assignee_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; -- 工单回复表(多轮对话,is_admin=1 表示客服/管理员回复) CREATE TABLE `__PREFIX__ticket_replies` ( `id` INT UNSIGNED NOT NULL AUTO_INCREMENT, `ticket_id` INT UNSIGNED NOT NULL, `user_id` INT UNSIGNED NOT NULL DEFAULT 0 COMMENT '回复人 user_id(管理员/客服回复时填其 id,用户回复时填下单用户 id)', `is_admin` TINYINT(1) NOT NULL DEFAULT 0 COMMENT '1=管理员/客服回复 0=用户回复', `message` TEXT NOT NULL, `created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`id`), KEY `idx_ticket` (`ticket_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; -- 公告中心 CREATE TABLE `__PREFIX__announcements` ( `id` INT UNSIGNED NOT NULL AUTO_INCREMENT, `title` VARCHAR(160) NOT NULL, `content` TEXT NOT NULL, `pinned` TINYINT(1) NOT NULL DEFAULT 0 COMMENT '1置顶', `status` TINYINT(1) NOT NULL DEFAULT 1 COMMENT '1显示 0隐藏', `created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`id`), KEY `idx_status` (`status`), KEY `idx_pinned` (`pinned`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; -- 积分流水表(签到 / 邀请 / 消费 / 后台调整 等记录) CREATE TABLE `__PREFIX__points_log` ( `id` INT UNSIGNED NOT NULL AUTO_INCREMENT, `user_id` INT UNSIGNED NOT NULL, `type` VARCHAR(20) NOT NULL DEFAULT 'sign' COMMENT 'sign签到 invite邀请 purchase消费 admin后台调整 refund退还', `amount` INT NOT NULL DEFAULT 0 COMMENT '变动量:正=增加 负=扣减', `balance` INT UNSIGNED NOT NULL DEFAULT 0 COMMENT '变动后余额', `remark` VARCHAR(255) DEFAULT '', `created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`id`), KEY `idx_user` (`user_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; -- 每日签到记录(每人每天一条,防止重复签到) CREATE TABLE `__PREFIX__sign_logs` ( `id` INT UNSIGNED NOT NULL AUTO_INCREMENT, `user_id` INT UNSIGNED NOT NULL, `sign_date` DATE NOT NULL, `points` INT UNSIGNED NOT NULL DEFAULT 0, `created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`id`), UNIQUE KEY `uk_user_date` (`user_id`, `sign_date`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; -- ============================================================ -- 初始示例商品(分类:周边 / 数码 / 虚拟 / 图书) -- ============================================================ INSERT INTO `__PREFIX__products` (`name`, `price`, `stock`, `category`, `icon`, `image`, `description`) VALUES ('自由云定制帆布包', 39.00, 100, '周边', 'fa-shopping-bag', '', '印有自由云科技团队 Logo 的环保帆布包,简约实用,容量充足。'), ('自由云贴纸套装', 9.90, 500, '周边', 'fa-sticky-note', '', '多种尺寸防水贴纸,装点你的电脑、水杯与笔记本。'), ('机械键盘 87 键', 199.00, 50, '数码', 'fa-keyboard', '', '热插拔轴体,RGB 背光,打字手感顺滑,附赠拔轴器。'), ('10000mAh 移动电源', 79.00, 80, '数码', 'fa-battery-full', '', '轻薄便携,支持双向快充,可为手机平板多次续电。'), ('MC 服务器 VIP 月卡', 12.00, 9999, '虚拟', 'fa-cube', '', '自由 MC 服务器专属 VIP 月卡,享优先进入与专属昵称色。'), ('图床扩容包 10GB', 5.00, 9999, '虚拟', 'fa-images', '', '为你的公益图床账号扩容 10GB 存储空间。'), ('《从零学 PHP》实体书', 49.00, 30, '图书', 'fa-book', '', '面向中学生的 PHP 入门教程,案例丰富、通俗易懂。'), ('《网络安全小百科》', 35.00, 40, '图书', 'fa-shield-alt', '', '图文并茂的网络安全科普读物,适合青少年阅读。'); -- ======================= -- 初始商品分组(与上面商品 category 对应:周边 / 数码 / 虚拟 / 图书) -- ======================= INSERT INTO `__PREFIX__product_groups` (`name`, `icon`, `sort_order`) VALUES ('周边', 'fa-shopping-bag', 1), ('数码', 'fa-microchip', 2), ('虚拟', 'fa-cube', 3), ('图书', 'fa-book', 4); -- ===================== -- 初始工单部门 -- ===================== INSERT INTO `__PREFIX__ticket_departments` (`name`, `description`, `sort`) VALUES ('技术支持', '产品使用、功能咨询', 1), ('售后服务', '退换货、订单与物流问题', 2), ('财务与支付', '发票、支付异常', 3), ('其他', '其他无法归类的问题', 9); -- ======================= -- 初始系统设置(SMTP 留空,安装后在后台「设置」中填写) -- ======================= INSERT INTO `__PREFIX__settings` (`k`, `v`) VALUES ('smtp_host', ''), ('smtp_port', ''), ('smtp_enc', ''), ('smtp_user', ''), ('smtp_pass', ''), ('smtp_from', ''), ('smtp_fromname', '自由云商城'), ('notify_emails', ''), ('mall_about', '自由云商城是自由云科技团队旗下的公益电商,坚持「公益 · 实惠 · 用心挑选」的理念,为社区提供周边、数码、虚拟服务与图书等好物。所有收益用于支持团队的公益技术服务。'), ('points_enabled', '1'), ('points_sign', '5'), ('points_invite', '20'); -- 支付日志表(记录支付宝/微信支付流水) CREATE TABLE `__PREFIX__pay_logs` ( `id` INT UNSIGNED NOT NULL AUTO_INCREMENT, `order_id` VARCHAR(64) NOT NULL COMMENT '商户订单号', `pay_method` VARCHAR(20) NOT NULL DEFAULT 'alipay' COMMENT 'alipay / wechat', `amount` DECIMAL(10,2) NOT NULL DEFAULT 0.00 COMMENT '支付金额', `trade_no` VARCHAR(64) DEFAULT '' COMMENT '第三方交易号', `status` ENUM('pending','paid','failed','refunded') NOT NULL DEFAULT 'pending', `raw_response TEXT DEFAULT NULL COMMENT '原始回调数据(调试用)', `created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, `updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`id`), UNIQUE KEY `uk_order_method` (`order_id`, `pay_method`), KEY `idx_status` (`status`), KEY `idx_trade_no` (`trade_no`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; -- 支付配置初始值 INSERT INTO `__PREFIX__settings` (`k`, `v`) VALUES ('pay_alipay_enabled', '0'), ('pay_alipay_appid', ''), ('pay_alipay_private_key',''), ('pay_alipay_public_key', ''), ('pay_alipay_sandbox', '0'), ('pay_wechat_enabled', '0'), ('pay_wechat_mch_id', ''), ('pay_wechat_api_key', ''), ('pay_wechat_appid', '');