feat: 小程序与管理端迭代(神仙AI、了解自己CRM、AI测试入口、报表与分润等)

Made-with: Cursor
This commit is contained in:
卡若
2026-04-17 19:46:48 +08:00
parent cf835ea585
commit 7108f28280
239 changed files with 21061 additions and 2175 deletions

View File

@@ -0,0 +1,80 @@
-- AI 聊天 + Soul 文章推荐 + 欠费预警字段
-- 对应需求ai功能202600417 -6.md
-- 建议部署时用 source 一次性执行;前缀 mbti_ 按环境 .env DATABASE_PREFIX 调整
-- 1) ai_providers 新增排序权重(故障切换时可手动调优先级)
ALTER TABLE `mbti_ai_providers`
ADD COLUMN `sortWeight` INT NOT NULL DEFAULT 100 COMMENT '优先级,升序;欠费自动降到999' AFTER `visible`;
-- 2) AI 对话表
CREATE TABLE IF NOT EXISTS `mbti_ai_conversations` (
`id` INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
`userId` INT UNSIGNED NOT NULL,
`title` VARCHAR(128) NOT NULL DEFAULT '',
`mbtiType` VARCHAR(16) NOT NULL DEFAULT '',
`providerId` VARCHAR(32) NOT NULL DEFAULT '',
`lastMessageAt` INT UNSIGNED NOT NULL DEFAULT 0,
`messageCount` INT UNSIGNED NOT NULL DEFAULT 0,
`createdAt` INT UNSIGNED NOT NULL DEFAULT 0,
`updatedAt` INT UNSIGNED NOT NULL DEFAULT 0,
`deletedAt` INT UNSIGNED NULL,
INDEX `idx_user` (`userId`, `updatedAt`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='神仙 AI 对话';
-- 3) AI 消息表
CREATE TABLE IF NOT EXISTS `mbti_ai_messages` (
`id` BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
`conversationId` INT UNSIGNED NOT NULL,
`role` ENUM('system','user','assistant') NOT NULL,
`content` MEDIUMTEXT NOT NULL,
`tokensIn` INT UNSIGNED NOT NULL DEFAULT 0,
`tokensOut` INT UNSIGNED NOT NULL DEFAULT 0,
`providerId` VARCHAR(32) NOT NULL DEFAULT '',
`isDegraded` TINYINT(1) NOT NULL DEFAULT 0 COMMENT '是否为降级兜底回答',
`createdAt` INT UNSIGNED NOT NULL DEFAULT 0,
INDEX `idx_conv` (`conversationId`, `id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='神仙 AI 消息流';
-- 4) Soul 采集文章表(一场 soul 创业实验 引流内容池)
CREATE TABLE IF NOT EXISTS `mbti_soul_articles` (
`id` INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
`sourceId` VARCHAR(64) NOT NULL COMMENT 'soul 侧文章 id',
`title` VARCHAR(255) NOT NULL,
`cover` VARCHAR(512) NOT NULL DEFAULT '',
`url` VARCHAR(512) NOT NULL,
`summary` VARCHAR(512) NOT NULL DEFAULT '',
`author` VARCHAR(64) NOT NULL DEFAULT '',
`tag` VARCHAR(32) NOT NULL DEFAULT 'MBTI',
`publishedAt` INT UNSIGNED NOT NULL DEFAULT 0,
`isRecommended` TINYINT(1) NOT NULL DEFAULT 0,
`recommendedOrder` INT NOT NULL DEFAULT 0,
`viewCount` INT UNSIGNED NOT NULL DEFAULT 0,
`createdAt` INT UNSIGNED NOT NULL DEFAULT 0,
`updatedAt` INT UNSIGNED NOT NULL DEFAULT 0,
`deletedAt` INT UNSIGNED NULL,
UNIQUE KEY `uk_source` (`sourceId`),
INDEX `idx_reco` (`isRecommended`, `recommendedOrder`, `publishedAt`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='Soul 采集文章MBTI 主题)';
-- 5) AI 使用限额(每日)—— 用户层面的限流记录
CREATE TABLE IF NOT EXISTS `mbti_ai_usage_daily` (
`id` INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
`userId` INT UNSIGNED NOT NULL,
`dateStr` CHAR(10) NOT NULL COMMENT '格式 YYYY-MM-DD',
`messageCount` INT UNSIGNED NOT NULL DEFAULT 0,
`createdAt` INT UNSIGNED NOT NULL DEFAULT 0,
`updatedAt` INT UNSIGNED NOT NULL DEFAULT 0,
UNIQUE KEY `uk_user_date` (`userId`, `dateStr`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='神仙 AI 每日限流计数';
-- 6) AI 余额预警日志(去重同一阈值每天只发 1 次)
CREATE TABLE IF NOT EXISTS `mbti_ai_balance_alerts` (
`id` INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
`providerId` VARCHAR(32) NOT NULL,
`balance` DECIMAL(10,2) NOT NULL DEFAULT 0,
`threshold` DECIMAL(10,2) NOT NULL DEFAULT 0,
`currency` VARCHAR(8) NOT NULL DEFAULT 'CNY',
`alertedAt` INT UNSIGNED NOT NULL DEFAULT 0,
`dateStr` CHAR(10) NOT NULL,
UNIQUE KEY `uk_provider_date` (`providerId`, `dateStr`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='AI 欠费预警去重日志';

View File

@@ -0,0 +1,12 @@
-- 冷脸分析字段:扩展 user_profile用于列表/详情展示
-- 说明:
-- coldFaceScore 0-100<35=暖(warm), 35-65=中(neutral), >65=冷(cold)
-- coldFaceLevel 字符串枚举 cold/neutral/warm
-- coldFaceUpdatedAt 最近一次测评更新时间戳(秒)
-- 执行: 在 phpMyAdmin 或 CLI 运行
ALTER TABLE `mbti_user_profile`
ADD COLUMN `coldFaceScore` tinyint(3) UNSIGNED NULL DEFAULT NULL COMMENT '冷脸分(0-100)' AFTER `lastFaceResultId`,
ADD COLUMN `coldFaceLevel` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '冷脸等级: cold/neutral/warm' AFTER `coldFaceScore`,
ADD COLUMN `coldFaceUpdatedAt` int(11) NULL DEFAULT NULL COMMENT '冷脸更新时间(时间戳)' AFTER `coldFaceLevel`,
ADD INDEX `idx_coldFaceLevel` (`coldFaceLevel`) USING BTREE;

View File

@@ -0,0 +1,4 @@
-- 埋点表补充userId + createdAt 复合索引(用于用户旅程、分享统计)
-- 幂等写法:若索引已存在会报错,可忽略(或手工 SHOW INDEX 检查后再执行)
ALTER TABLE `mbti_analytics_events`
ADD INDEX `idx_user_created` (`userId`, `createdAt`);

View File

@@ -0,0 +1,95 @@
-- =====================================================
-- 神仙 AI v2 · TabBar 后台可配 + AI 深度报告 + 分账规则
-- Date: 2026-04-17
-- 生产库表前缀若为 mbti_则下方表名以 mbti_ 为准
-- =====================================================
-- ---------- 1) 小程序 TabBar 配置 ----------
CREATE TABLE IF NOT EXISTS `mbti_mp_tabbar_items` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`sortOrder` INT NOT NULL DEFAULT 100 COMMENT '排序,小的在前',
`pagePath` VARCHAR(128) NOT NULL COMMENT '目标页面 pages/xxx/xxx',
`text` VARCHAR(32) NOT NULL COMMENT '底部文案',
`iconKey` VARCHAR(32) NOT NULL DEFAULT 'home' COMMENT '图标key: home/camera/ai/profile',
`visible` TINYINT(1) NOT NULL DEFAULT 1 COMMENT '1=显示 0=隐藏(审核模式)',
`highlight` TINYINT(1) NOT NULL DEFAULT 0 COMMENT '1=中间突出按钮(圆形)',
`badgeKey` VARCHAR(32) NULL COMMENT '红点角标来源key(预留)',
`createdAt` INT UNSIGNED NOT NULL DEFAULT 0,
`updatedAt` INT UNSIGNED NOT NULL DEFAULT 0,
PRIMARY KEY (`id`),
KEY `idx_sort` (`sortOrder`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='小程序 TabBar 后台可配';
-- 初始 4 项默认顺序首页·拍摄·神仙AI·我
INSERT INTO `mbti_mp_tabbar_items` (sortOrder, pagePath, text, iconKey, highlight, visible, createdAt, updatedAt) VALUES
(10, 'pages/index/index', '首页', 'home', 0, 1, UNIX_TIMESTAMP(), UNIX_TIMESTAMP()),
(20, 'pages/index/camera', '拍摄', 'camera', 1, 1, UNIX_TIMESTAMP(), UNIX_TIMESTAMP()),
(30, 'pages/ai-chat/index', '神仙AI', 'ai', 0, 1, UNIX_TIMESTAMP(), UNIX_TIMESTAMP()),
(40, 'pages/profile/index', '', 'profile', 0, 1, UNIX_TIMESTAMP(), UNIX_TIMESTAMP());
-- ---------- 2) 分账规则(知己 profit-sharing 思路) ----------
CREATE TABLE IF NOT EXISTS `mbti_profit_sharing_rules` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`productType` VARCHAR(64) NOT NULL COMMENT 'ai_deep_report / mbti_report / face_analysis / default',
`name` VARCHAR(128) NOT NULL,
`receivers` JSON NOT NULL COMMENT '[{type,name,ratio,account?}]',
`status` VARCHAR(16) NOT NULL DEFAULT 'active' COMMENT 'active/disabled',
`createdAt` INT UNSIGNED NOT NULL DEFAULT 0,
`updatedAt` INT UNSIGNED NOT NULL DEFAULT 0,
PRIMARY KEY (`id`),
UNIQUE KEY `uk_product` (`productType`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='订单分账规则';
INSERT INTO `mbti_profit_sharing_rules` (productType, name, receivers, status, createdAt, updatedAt) VALUES
('ai_deep_report', 'AI 深度画像报告',
'[{"type":"platform","name":"平台","ratio":0.70},{"type":"distributor_l1","name":"一级分销","ratio":0.20},{"type":"distributor_l2","name":"二级分销","ratio":0.10}]',
'active', UNIX_TIMESTAMP(), UNIX_TIMESTAMP()),
('default', '默认规则 · 平台 100%',
'[{"type":"platform","name":"平台","ratio":1.00}]',
'active', UNIX_TIMESTAMP(), UNIX_TIMESTAMP());
-- ---------- 3) 分账记录 ----------
CREATE TABLE IF NOT EXISTS `mbti_profit_sharing_records` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`orderSn` VARCHAR(64) NOT NULL COMMENT '订单号',
`orderId` INT UNSIGNED NULL COMMENT '订单表id',
`productType` VARCHAR(64) NOT NULL,
`totalAmount` INT NOT NULL DEFAULT 0 COMMENT '订单总金额(分)',
`details` JSON NOT NULL COMMENT '分账明细 [{receiverType,receiverName,amount,ratio,account,status}]',
`status` VARCHAR(16) NOT NULL DEFAULT 'pending' COMMENT 'pending/processing/completed/failed',
`processedAt` INT UNSIGNED NULL,
`createdAt` INT UNSIGNED NOT NULL DEFAULT 0,
`updatedAt` INT UNSIGNED NOT NULL DEFAULT 0,
PRIMARY KEY (`id`),
UNIQUE KEY `uk_order_sn` (`orderSn`),
KEY `idx_status` (`status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='订单分账记录';
-- ---------- 4) AI 深度报告(付费解锁阅读) ----------
CREATE TABLE IF NOT EXISTS `mbti_ai_reports` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`userId` INT UNSIGNED NOT NULL,
`conversationId` INT UNSIGNED NULL COMMENT '来源对话',
`mbtiType` VARCHAR(8) NULL,
`orderSn` VARCHAR(64) NULL COMMENT '对应订单号',
`orderId` INT UNSIGNED NULL,
`priceFen` INT NOT NULL DEFAULT 990 COMMENT '单价(分)',
`status` VARCHAR(16) NOT NULL DEFAULT 'pending' COMMENT 'pending=未支付 paid=已支付未生成 generating=生成中 done=已完成 failed=失败',
`title` VARCHAR(255) NULL,
`summary` TEXT NULL COMMENT '免费预览的摘要片段',
`content` MEDIUMTEXT NULL COMMENT '完整报告正文',
`posterUrl` VARCHAR(512) NULL COMMENT '分享海报',
`retryCount` INT NOT NULL DEFAULT 0,
`lastError` VARCHAR(512) NULL,
`paidAt` INT UNSIGNED NULL,
`generatedAt` INT UNSIGNED NULL,
`createdAt` INT UNSIGNED NOT NULL DEFAULT 0,
`updatedAt` INT UNSIGNED NOT NULL DEFAULT 0,
PRIMARY KEY (`id`),
KEY `idx_user` (`userId`),
KEY `idx_order_sn` (`orderSn`),
KEY `idx_status` (`status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='AI 深度画像报告';

View File

@@ -0,0 +1,24 @@
-- =====================================================
-- plan7 补丁:给 tabBar 配置加 iconUrl可传图片 URL 覆盖 SVG
-- 给 soul_articles 自动推送时间戳
-- Date: 2026-04-17
-- =====================================================
ALTER TABLE `mbti_mp_tabbar_items`
ADD COLUMN `iconUrl` VARCHAR(512) NULL AFTER `iconKey`
COMMENT '图片图标 URL若有则优先覆盖 iconKey 的 SVG';
-- 给"神仙AI"tab 默认用团队 logo 图
UPDATE `mbti_mp_tabbar_items`
SET `iconUrl` = '/images/mbti-team-image.png'
WHERE `iconKey` = 'ai' AND (`iconUrl` IS NULL OR `iconUrl` = '');
-- Soul 自动采集last sync 时间戳记录到 system_config
INSERT INTO `mbti_system_config` (`key`, `value`, `description`, `createdAt`, `updatedAt`)
SELECT 'soul_article_auto_sync',
JSON_OBJECT('enabled', TRUE, 'intervalSec', 3600, 'limit', 10),
'Soul 文章自动采集配置',
UNIX_TIMESTAMP(), UNIX_TIMESTAMP()
WHERE NOT EXISTS (
SELECT 1 FROM `mbti_system_config` WHERE `key` = 'soul_article_auto_sync'
);