九宫性格能量测试系统源码 - 全栈开源项目 | 144题专业性格测评平台
项目概述
九宫性格能量测试系统是一个基于九型人格理论的在线性格测评平台,采用前后端分离架构,包含H5移动端用户系统和Web管理后台。系统通过144道二选一选择题,运用独特的九宫矩阵算法(3×3维度),计算用户的性格能量分布,生成详细的性格分析报告。
核心功能模块
一、用户认证系统(auth.js)
1. 手机号+密码登录
-
接口:
POST /api/auth/login -
参数:phone(手机号)、password(密码)
-
流程:
-
验证手机号格式(正则:/^1[3-9]\d{9}$/)
-
查询用户记录
-
bcrypt比对密码哈希值
-
生成JWT Token(有效期配置在.env中)
-
返回用户信息和Token
-
2. 手机号+验证码登录
-
接口:
POST /api/auth/sms-login -
参数:phone、code(6位验证码)
-
特点:
-
自动注册新用户(首次登录时创建用户记录)
-
短信验证码功能预留接口(需接入阿里云/腾讯云短信服务)
-
开发环境返回验证码便于调试
-
3. 用户注册
-
接口:
POST /api/auth/register -
参数:phone、password、nickname(可选)
-
流程:
-
验证手机号唯一性
-
bcrypt加密密码(salt rounds: 10)
-
自动生成昵称(“用户” + 手机后4位)
-
创建用户并返回Token
-
4. 微信登录
-
接口:
POST /api/auth/wechat-login -
参数:code(微信登录凭证)
-
流程:
-
调用微信API获取openid和session_key
-
根据openid查找或创建用户
-
生成JWT Token
-
支持微信小程序场景
-
5. 发送短信验证码
-
接口:
POST /api/auth/send-sms -
参数:phone
-
功能:
-
生成6位随机验证码
-
验证手机号格式
-
预留短信服务商接口(TODO标记)
-
开发环境直接返回验证码
-
二、测试答题系统(test.js)
1. 开始测试
-
接口:
POST /api/test/start -
需要认证:是(authUser中间件)
-
参数:testType(测试类型:activation_code/wechat_pay)
-
功能:
-
创建测试记录(test_records表)
-
初始状态为0(进行中)
-
返回测试记录ID
-
记录开始时间
-
2. 提交答案
-
接口:
POST /api/test/answer -
需要认证:是
-
参数:
-
testRecordId(测试记录ID)
-
questionId(题目ID)
-
questionNo(题号)
-
answer(答案:A或B)
-
-
特点:
-
兼容snake_case和camelCase参数命名
-
逐题保存答案到test_answers表
-
实时记录答题进度
-
不立即计算结果,等待全部完成
-
3. 完成测试并提交
-
接口:
POST /api/test/submit -
需要认证:是
-
参数:testRecordId
-
核心流程:
-
验证是否答完144道题(answers.length < 144则拒绝)
-
调用九宫性格计算器(nineGridCalculator.calculate)
-
更新测试记录状态为1(已完成)
-
计算答题时长(duration = end_time - start_time)
-
保存测试结果到test_results表(JSON格式)
-
返回完整的性格分析结果
-
4. 获取测试结果
-
接口:
GET /api/test/result/:testRecordId -
需要认证:是
-
权限控制:只能查看自己的测试结果(WHERE user_id = ?)
-
返回数据:
-
record:测试记录信息(时长、状态等)
-
result.matrix:3×3矩阵数据
-
result.personality:9种性格类型排序列表
-
result.chart:柱状图数据(按九型顺序)
-
-
特殊处理:
-
mysql2自动解析JSON字段为对象
-
智能判断数据类型(object则直接使用,string则JSON.parse)
-
5. 获取答题进度
-
接口:
GET /api/test/progress/:testRecordId -
需要认证:是
-
返回:
-
answered:已答题数量
-
total:总题数(144)
-
progress:进度百分比(0-100)
-
6. 生成分享链接
-
接口:
GET /api/test/share/:testRecordId -
需要认证:是
-
功能:生成可分享的测试结果URL
三、支付与激活码系统(payment.js)
1. 创建订单
-
接口:
POST /api/payment/create -
需要认证:是
-
功能:
-
生成订单号(格式:JG + 时间戳 + 随机字符串)
-
从配置读取测试价格(默认29.90元)
-
创建待支付订单(status=0)
-
返回订单ID和金额
-
2. 微信支付
-
接口:
POST /api/payment/wechat -
需要认证:是
-
参数:orderId
-
流程:
-
验证订单归属和状态
-
TODO:调用微信支付统一下单API
-
返回支付参数(appId、timeStamp、nonceStr、package、paySign)
-
当前为示例实现,需配置真实微信商户参数
-
3. 支付回调
-
接口:
POST /api/payment/notify -
无需认证(微信服务器调用)
-
功能:
-
TODO:验证微信支付签名
-
更新订单状态为1(已支付)
-
记录支付时间和交易号
-
返回SUCCESS/FAIL给微信服务器
-
4. 验证激活码
-
接口:
POST /api/payment/verify-code -
需要认证:是
-
参数:code(激活码)
-
流程:
-
查询激活码(status=0未使用)
-
检查是否过期(expire_time)
-
更新激活码状态为1(已使用)
-
记录使用者ID和使用时间
-
返回canTest=true
-
5. 获取订单列表
-
接口:
GET /api/payment/orders -
需要认证:是
-
参数:page、limit(分页)
-
返回:当前用户的订单列表(按创建时间倒序)
6. 获取订单详情
-
接口:
GET /api/payment/orders/:id -
需要认证:是
-
权限控制:只能查看自己的订单
四、管理员系统(admin.js)
1. 管理员登录
-
接口:
POST /api/admin/login -
参数:username、password
-
流程:
-
bcrypt验证密码
-
更新最后登录时间
-
生成管理员Token(adminId)
-
记录操作日志(operation_logs表)
-
返回角色信息(admin/operator)
-
2. 退出登录
-
接口:
POST /api/admin/logout -
需要认证:是(authAdmin中间件)
-
记录登出日志
3. 数据概览(Dashboard)
-
接口:
GET /api/admin/dashboard -
需要认证:是
-
返回数据:
-
今日统计:新增用户数、测试次数、订单数、收入
-
总计数据:累计用户、测试、订单、总收入
-
近7天趋势:每日新增用户折线图数据
-
-
SQL优化:使用子查询一次性获取所有统计数据
4. 用户管理
用户列表:
-
接口:
GET /api/admin/users -
参数:page、limit、keyword(搜索关键词)
-
功能:
-
支持昵称/手机号模糊搜索
-
分页查询
-
返回用户基本信息
-
用户详情:
-
接口:
GET /api/admin/users/:id -
返回:
-
用户基本信息
-
测试记录数量
-
订单数量
-
最近5条测试记录
-
更新用户状态:
-
接口:
PUT /api/admin/users/:id/status -
需要权限:admin角色(requireRole中间件)
-
参数:status(1启用/0禁用)
-
记录操作日志
5. 题目管理
题目列表:
-
接口:
GET /api/admin/questions -
参数:page、limit(默认20条/页)
-
排序:按题号升序(question_no ASC)
添加题目:
-
接口:
POST /api/admin/questions -
需要权限:admin角色
-
参数:
-
question_no(题号)
-
option_a、option_a_type(选项A内容及类型)
-
option_b、option_b_type(选项B内容及类型)
-
-
默认状态:1(启用)
更新题目:
-
接口:
PUT /api/admin/questions/:id -
需要权限:admin角色
-
可修改:选项内容、类型、状态
删除题目:
-
接口:
DELETE /api/admin/questions/:id -
需要权限:admin角色
-
物理删除(非软删除)
6. 订单管理
订单列表:
-
接口:
GET /api/admin/orders -
参数:page、limit、status(筛选状态)
-
关联查询:LEFT JOIN users表获取用户昵称和手机号
-
排序:按创建时间倒序
订单详情:
-
接口:
GET /api/admin/orders/:id -
返回:
-
订单完整信息
-
用户信息(昵称、头像、手机号)
-
关联的激活码信息(如果有)
-
7. 激活码管理
激活码列表:
-
接口:
GET /api/admin/codes -
参数:page、limit、status
-
关联查询:LEFT JOIN users表显示使用者昵称
-
排序:按创建时间倒序
生成激活码:
-
接口:
POST /api/admin/codes -
需要权限:admin角色
-
参数:
-
count(生成数量,默认1)
-
expire_time(过期时间,可选)
-
-
功能:
-
批量生成激活码(格式:JG + 时间戳 + 随机6位大写)
-
循环插入数据库
-
返回生成的激活码列表
-
记录操作日志
-
8. 系统设置
获取设置:
-
接口:
GET /api/admin/settings -
返回:键值对形式的配置项
-
包括:网站名称、测试价格、测试说明、微信配置等
更新设置:
-
接口:
PUT /api/admin/settings -
需要权限:admin角色
-
参数:settings对象(key-value)
-
功能:
-
批量更新配置
-
INSERT … ON DUPLICATE KEY UPDATE(存在则更新,不存在则插入)
-
记录操作日志
-
9. 操作日志
日志列表:
-
接口:
GET /api/admin/logs -
参数:page、limit(默认20条/页)
-
关联查询:LEFT JOIN admins表显示操作人用户名
-
排序:按创建时间倒序
-
记录内容:管理员ID、操作类型、模块、内容、IP地址
五、九宫性格核心算法(nineGridCalculator.js)
这是系统的核心业务逻辑,实现了独特的九宫性格能量计算模型。
1. 九宫类型映射体系
系统定义了36种细分类型,每个类型由三个维度组合而成:
维度一:动机(Motivation)
-
控制(Control)
-
理想(Ideal)
-
认同(Identity)
维度二:方式(Approach)
-
靠近(Approach)
-
抽离(Detached)
-
对抗(Oppose)
维度三:九型编号(Type 1-9)
例如:
-
type1_approach_control:第1型 + 靠近 + 控制 -
type8_oppose_control:第8型 + 对抗 + 控制 -
type9_detached_ideal:第9型 + 抽离 + 理想
2. 性格动物映射
系统将9种类型对应为动物形象,便于用户理解:
-
第1型:老虎(完美主义者)
-
第2型:海豚(助人者)
-
第3型:蜜蜂(成就者)
-
第4型:八爪(浪漫主义者)
-
第5型:企鹅(观察者)
-
第6型:考拉(忠诚者)
-
第7型:孔雀(享乐者)
-
第8型:狮子(挑战者)
-
第9型:鸽子(和平者)
3. 计算流程
输入: 用户答案数组(144个答案,每个包含question_id和answer)
步骤1:初始化分数
matrixScores = {
控制: { 靠近: 0, 抽离: 0, 对抗: 0 },
理想: { 靠近: 0, 抽离: 0, 对抗: 0 },
认同: { 靠近: 0, 抽离: 0, 对抗: 0 }
}
typeScores = { 1: 0, 2: 0, ..., 9: 0 }
步骤2:遍历答案统计
对于每道题:
-
根据question_id查询题目信息
-
根据用户选择(A或B)获取对应的type字段
-
从typeMap解析出type、approach、motivation
-
matrixScores[motivation][approach]++
-
typeScores[type]++
步骤3:计算矩阵数据
生成3×3矩阵,包含:
-
每个单元格的分数
-
每行合计(控制合计、理想合计、认同合计)
-
每列合计(靠近合计、抽离合计、对抗合计)
-
总计(应为144)
步骤4:计算性格能量
-
计算基准值:baseValue = totalScore / 9
-
计算每种类型的比率:ratio = score / baseValue
-
生成personality数组,包含:type、name(动物名)、score、ratio
-
按分数降序排序
-
添加排名(rank 1-9)
步骤5:生成图表数据
-
按九型顺序(1-9)生成chart数组
-
用于ECharts柱状图展示
输出:
{
matrix: { /* 3×3矩阵数据 */ },
personality: [ /* 9种类型排序列表 */ ],
chart: [ /* 柱状图数据 */ ]
}
数据库设计
核心表结构(10张表)
1. users(用户表)
-
主键:id
-
唯一索引:openid、phone
-
字段:昵称、头像、手机号、密码(bcrypt)、状态
-
支持多种登录方式(微信openid、手机号)
2. questions(题目表)
-
主键:id
-
唯一索引:question_no(1-144)
-
字段:题号、选项A内容及类型、选项B内容及类型、状态
-
每题两个选项分别对应不同的九宫类型
3. test_records(测试记录表)
-
主键:id
-
索引:user_id、status、created_at
-
字段:用户ID、测试类型、状态(0进行中/1已完成)、开始/结束时间、答题时长
-
一次测试一条记录
4. test_answers(测试答案表)
-
主键:id
-
索引:test_record_id、question_id、question_no
-
字段:测试记录ID、题目ID、题号、答案(A/B)
-
144条答案对应一条测试记录
5. test_results(测试结果表)
-
主键:id
-
唯一索引:test_record_id(一对一关系)
-
字段:matrix_data(JSON)、personality_data(JSON)、chart_data(JSON)
-
使用MySQL 5.7+的JSON类型,支持自动解析
6. activation_codes(激活码表)
-
主键:id
-
唯一索引:code
-
字段:激活码、状态(0未使用/1已使用)、使用者ID、使用时间、过期时间
-
支持批量生成和有效期控制
7. orders(订单表)
-
主键:id
-
唯一索引:order_no
-
索引:user_id、status
-
字段:订单号、用户ID、金额、状态(0待支付/1已支付/2已取消)、支付时间、微信交易号
8. admins(管理员表)
-
主键:id
-
唯一索引:username
-
字段:用户名、密码(bcrypt)、角色(admin/operator)、状态、最后登录时间
-
支持权限分级
9. operation_logs(操作日志表)
-
主键:id
-
索引:admin_id、created_at
-
字段:管理员ID、操作类型、模块、内容、IP地址
-
记录所有敏感操作
10. settings(系统设置表)
-
主键:id
-
唯一索引:key
-
字段:设置键、值、描述
-
动态配置系统参数
视图(Views)
v_user_test_stats
-
用户测试统计视图
-
字段:用户ID、昵称、手机号、测试次数、最后测试时间
-
GROUP BY聚合查询
v_daily_stats
-
每日数据统计视图
-
字段:日期、新增用户数、测试次数、收入
-
用于Dashboard趋势图
前端页面功能
H5移动端(7个页面)
1. Home.vue(首页/能量评估)
-
功能:
-
展示测试介绍和价格(¥29.90)
-
激活码输入框
-
"开始评估"按钮
-
底部Tabbar导航(能量评估、我的)
-
-
交互:
-
点击"开始评估"检查登录状态
-
未登录跳转登录页
-
已登录创建测试记录并跳转答题页
-
2. Login.vue(登录页)
-
功能:
-
手机号输入
-
密码输入
-
登录按钮
-
"去注册"链接
-
-
样式:纯色背景#1989fa,无渐变
3. Register.vue(注册页)
-
功能:
-
手机号、密码、确认密码输入
-
昵称输入(可选)
-
注册按钮
-
"去登录"链接
-
4. Test.vue(答题页)
-
功能:
-
显示当前题号(1/144)
-
进度条展示
-
题目内容
-
选项A和选项B按钮
-
上一题/下一题导航
-
-
交互:
-
选择答案后自动保存
-
实时更新进度
-
答完144题自动提交
-
5. Result.vue(结果页)
-
功能:
-
九宫性格能量柱状图(ECharts)
-
主要性格类型展示
-
9种类型分数排名列表
-
3×3矩阵数据表格
-
"重新测试"按钮
-
-
技术:
-
nextTick确保DOM更新后渲染图表
-
窗口resize自适应
-
支持路径参数和查询参数两种方式访问
-
6. Profile.vue(个人中心)
-
功能:
-
用户头像(van-icon图标)
-
昵称和手机号显示
-
"编辑资料"入口
-
"修改密码"入口
-
底部Tabbar导航
-
-
状态:
-
未登录显示"点击登录"提示
-
已登录显示用户信息
-
7. Records.vue(测试记录)
-
功能:
-
历史测试记录列表
-
每条记录显示:测试时间、时长、主要性格
-
点击查看结果按钮
-
Admin管理后台(8个页面)
1. Login.vue(管理员登录)
-
简洁的登录表单
-
用户名和密码输入
-
Element Plus组件
2. Layout.vue(布局框架)
-
侧边栏菜单导航
-
顶部Header
-
主要内容区域
-
退出登录按钮
3. Dashboard.vue(数据概览)
-
今日数据卡片:新增用户、测试次数、订单数、收入
-
总计数据卡片
-
近7天用户增长趋势图(ECharts折线图)
-
使用Element Plus图标(替换emoji)
4. Users.vue(用户管理)
-
用户列表表格
-
搜索框(昵称/手机号)
-
分页组件
-
操作按钮:查看详情、启用/禁用
-
用户详情抽屉
5. Questions.vue(题目管理)
-
题目列表表格
-
分页展示(20条/页)
-
添加题目对话框
-
编辑题目对话框
-
删除确认
-
显示题号、选项A、选项B、状态
6. Orders.vue(订单管理)
-
订单列表表格
-
状态筛选(待支付/已支付/已取消)
-
关联用户信息显示
-
订单详情查看
-
分页组件
7. Codes.vue(激活码管理)
-
激活码列表表格
-
状态筛选(未使用/已使用)
-
批量生成对话框(输入数量和过期时间)
-
显示使用者信息
-
复制激活码功能
8. Settings.vue(系统设置)
-
表单配置项
-
网站名称、测试价格
-
测试说明文案
-
微信配置(AppID、密钥等)
-
保存按钮
安全机制
1. 认证授权
-
JWT Token:用户和管理员分别使用userId和adminId签发
-
中间件验证:
-
authUser:验证用户Token
-
authAdmin:验证管理员Token
-
requireRole:检查管理员角色权限
-
-
Token过期:配置在.env中(默认7天)
2. 密码安全
-
bcrypt加密:salt rounds设置为10
-
不存储明文:数据库中只存哈希值
-
登录验证:使用bcrypt.compare比对
3. SQL注入防护
-
参数化查询:所有SQL使用占位符(?)
-
空字符串检查:防止parseInt(“”)返回NaN导致SQL错误
-
输入验证:手机号正则、必填字段检查
4. 权限控制
-
路由守卫:前端路由需要登录才能访问
-
后端鉴权:所有敏感接口需要Token
-
角色权限:部分操作仅限admin角色(如删除题目、生成激活码)
5. 操作审计
-
日志记录:所有管理员操作记录到operation_logs表
-
IP追踪:记录操作来源IP
-
时间戳:精确到秒的操作时间
业务流程
用户测试完整流程
1. 用户访问首页 → 点击"开始评估"
↓
2. 检查登录状态 → 未登录跳转登录页
↓
3. 登录/注册 → 获取JWT Token
↓
4. 选择支付方式:
├─ 输入激活码 → POST /api/payment/verify-code
└─ 付费购买 → POST /api/payment/create → 微信支付
↓
5. 开始测试 → POST /api/test/start → 获取testRecordId
↓
6. 答题过程(144题):
- 逐题选择A或B
- POST /api/test/answer 保存答案
- 实时更新进度条
↓
7. 完成答题 → POST /api/test/submit
- 验证144题全部完成
- 调用nineGridCalculator计算结果
- 保存matrix、personality、chart到数据库
↓
8. 查看结果 → GET /api/test/result/:id
- 显示柱状图
- 显示性格排名
- 显示矩阵数据
↓
9. 可选操作:
- 重新测试
- 分享结果
- 查看历史记录
管理员操作流程
1. 管理员登录 → POST /api/admin/login
↓
2. 进入Dashboard → 查看今日数据和趋势图
↓
3. 日常管理:
├─ 用户管理:查看用户列表、禁用违规用户
├─ 题目管理:添加/编辑/删除测试题目
├─ 订单管理:查看支付订单、处理异常
├─ 激活码管理:批量生成激活码、设置有效期
├─ 系统设置:修改测试价格、更新文案
└─ 操作日志:审计管理员行为
特色功能
1. 双轨支付系统
-
激活码模式:适合企业批量采购、线下销售
-
在线支付:集成微信支付,支持个人用户购买
2. 智能九宫算法
-
3×3矩阵模型:突破传统九型人格的单一维度
-
36种细分类型:更精准的性格刻画
-
能量比率计算:相对值而非绝对值,更具参考性
3. 完善的测试管理
-
断点续答:测试记录保存,可随时继续
-
进度追踪:实时显示答题进度
-
历史记录:用户可查看历次测试结果对比
4. 数据可视化
-
ECharts柱状图:直观展示9种类型能量分布
-
矩阵表格:3×3网格展示动机×方式交叉分析
-
Dashboard统计:多维度数据汇总和趋势分析
5. 灵活的配置系统
-
动态价格:可在后台修改测试价格
-
自定义文案:测试说明、评估方法可配置
-
微信配置:支持切换不同小程序/公众号
总结
九宫性格能量测试系统是一个功能完整、架构清晰的在线测评平台,具有以下特点:
✅ 技术先进:现代化技术栈
✅ 算法独特:3×3九宫矩阵模型,36种细分类型
✅ 功能全面:用户系统、测试答题、支付激活、管理后台
✅ 安全可靠:JWT认证、bcrypt加密、SQL防注入、操作审计
✅ 体验优良:移动端适配、数据可视化、流畅交互
✅ 易于扩展:模块化设计、RESTful API、配置化管理
系统适合用于:
-
企业员工性格测评
-
心理咨询机构工具
-
教育培训行业应用
-
个人自我认知探索


AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐


所有评论(0)