feat: v1.3.0 差异化重构——星图点亮体系
P0 修复: - 详情页正文渲染(content 分段),71 条知识不再空白 - 问答页去登录墙:游客每日 3 次(IP 限流),登录后每日 5 次 - 修正问答配额为真正的每日重置语义 点亮闭环: - KnowledgeLit 模型 + 服务端判题(POST /:id/quiz,答案不下发) - /api/knowledge/stats 星域统计 + 点亮进度 + streak + litIds - AI 批量生成 71 条读后检测题(scripts/generate-quiz.js) 设计系统 2.0: - 70 个统一线性图标替换全部 emoji 图标 - 主题 token mixin 化,修复 H5 暗色级联 bug,MP 跟随系统(darkmode) - 首页星域导航(进度环)、我的页学习者档案、星域列表页重写 - 硬编码色清理,误植 map 页移除 服务端加固: - trust proxy 真实 IP、错误信息脱敏、ask 独立限流、无效 ObjectId 404 - seo.js ESM→CJS(修复容器启动)、AI 导师"维度精灵"人格化
This commit is contained in:
@@ -66,9 +66,16 @@ AIChatQuotaSchema.methods.getTotalQuota = function() {
|
||||
return this.freeQuota + this.sharedQuota
|
||||
}
|
||||
|
||||
// 获取剩余可用次数
|
||||
// 判断最后使用日期是否是今天
|
||||
AIChatQuotaSchema.methods.isUsedToday = function() {
|
||||
if (!this.lastUsedDate) return false
|
||||
return new Date(this.lastUsedDate).toDateString() === new Date().toDateString()
|
||||
}
|
||||
|
||||
// 获取剩余可用次数(每日重置:总额度 - 今日已用)
|
||||
AIChatQuotaSchema.methods.getRemainingQuota = function() {
|
||||
return this.getTotalQuota() - this.usedQuota
|
||||
const todayUsed = this.isUsedToday() ? this.dailyUsed : 0
|
||||
return Math.max(0, this.getTotalQuota() - todayUsed)
|
||||
}
|
||||
|
||||
// 检查是否有可用次数
|
||||
|
||||
@@ -0,0 +1,38 @@
|
||||
const mongoose = require('mongoose')
|
||||
|
||||
/**
|
||||
* 知识点亮记录 —— 读完 + 答对检测题后"点亮一颗星球"
|
||||
*/
|
||||
const KnowledgeLitSchema = new mongoose.Schema({
|
||||
openid: {
|
||||
type: String,
|
||||
required: true,
|
||||
index: true
|
||||
},
|
||||
knowledgeId: {
|
||||
type: mongoose.Schema.Types.ObjectId,
|
||||
ref: 'Knowledge',
|
||||
required: true
|
||||
},
|
||||
dim: {
|
||||
type: Number,
|
||||
enum: [1, 2, 3, 4, 5],
|
||||
index: true
|
||||
},
|
||||
quizPassed: {
|
||||
type: Boolean,
|
||||
default: true
|
||||
},
|
||||
litAt: {
|
||||
type: Date,
|
||||
default: Date.now,
|
||||
index: true
|
||||
}
|
||||
}, {
|
||||
timestamps: true
|
||||
})
|
||||
|
||||
// 一个用户对一条知识只点亮一次
|
||||
KnowledgeLitSchema.index({ openid: 1, knowledgeId: 1 }, { unique: true })
|
||||
|
||||
module.exports = mongoose.model('KnowledgeLit', KnowledgeLitSchema)
|
||||
@@ -1,6 +1,7 @@
|
||||
const User = require('./User')
|
||||
const Order = require('./Order')
|
||||
const Knowledge = require('./Knowledge')
|
||||
const KnowledgeLit = require('./KnowledgeLit')
|
||||
const ShopItem = require('./ShopItem')
|
||||
const Admin = require('./Admin')
|
||||
const AdminLog = require('./AdminLog')
|
||||
@@ -15,6 +16,7 @@ module.exports = {
|
||||
User,
|
||||
Order,
|
||||
Knowledge,
|
||||
KnowledgeLit,
|
||||
ShopItem,
|
||||
Admin,
|
||||
AdminLog,
|
||||
|
||||
Reference in New Issue
Block a user