CCXC Backend Script API 参考
CCXC 后端脚本系统提供了一套强大且灵活的 API 接口,让开发者能够构建复杂的交互式题目和自定义判题逻辑。
概述
后端脚本通过全局变量 ctx 提供所有 API 功能。该上下文对象包含了题目执行所需的数据和方法,是连接前端用户交互与后端逻辑的核心桥梁。
脚本类型架构
CCXC Engine 支持两种不同的脚本执行环境:
题目后端脚本
由 Vue SFC 题目组件中的 backend 函数主动调用,适用于需要实时交互的复杂题目场景。
高级判题脚本
在题目配置的"高级判题"选项中通过脚本 key 自动触发,专门用于自定义答案验证逻辑。
重要提示
题目后端 与 高级判题:不同脚本类型的 ctx 对象提供的属性和方法存在差异。请根据文档中的标识选择合适的 API。
上下文属性
request
适用范围: 题目后端
request: string描述
前端发送的请求数据,以JSON字符串格式传输。包含用户的交互输入和状态信息。
使用方式
const requestData = JSON.parse(ctx.request);注意事项
- 必须使用
JSON.parse()进行反序列化 - 请求格式由前端题目逻辑决定
uid
适用范围: 题目后端 高级判题
uid: number描述
当前执行脚本的用户唯一标识符。
返回值
用户的数字ID,在系统内全局唯一。
username
适用范围: 题目后端 高级判题
username: string描述
当前用户的登录用户名。
返回值
用户在系统中注册的用户名字符串。
gid
适用范围: 题目后端 高级判题
gid: number描述
当前用户所属团队的组织标识符。
返回值
团队的数字ID,用于团队协作和进度共享。
pid
适用范围: 高级判题
pid: number描述
当前正在执行判题逻辑的题目标识符。
返回值
题目的唯一数字ID。
answer
适用范围: 高级判题
answer: string描述
经过标准化处理的用户答案。系统自动执行以下清理操作:
- 移除前后空白字符
- 移除中间的空格、下划线和减号
- 保留其他字符(包括大小写)
注意事项
如需原始答案,请使用 originalAnswer 属性。
originalAnswer
适用范围: 高级判题
originalAnswer: string描述
用户提交的原始答案,未经任何处理或格式化。
使用场景
适用于需要严格验证格式或包含特殊字符的答案。
状态管理方法
getStatus
适用范围: 题目后端
getStatus(key: string): string功能
读取当前用户的客户端状态存储。
参数
key(string): 状态键名
返回值
存储的状态值(字符串格式)
特性
- 数据加密存储在用户浏览器中
- 不同用户和不同浏览器实例拥有独立的状态空间
- 适用于用户个人进度和临时数据存储
setStatus
适用范围: 题目后端
setStatus(key: string, value: string): void功能
写入当前用户的客户端状态存储。
参数
key(string): 状态键名value(string): 要存储的值
使用场景
保存用户的题目进度、选择状态或临时计算结果。
getProgress
适用范围: 题目后端 高级判题
getProgress(pid: number, key: string): string功能
读取指定题目的团队进度数据。
参数
pid(number): 题目IDkey(string): 进度键名
返回值
存储的进度值(字符串格式)
特性
- 数据存储在服务器数据库中
- 团队成员共享访问
- 每个题目拥有独立的进度命名空间
setProgress
适用范围: 题目后端 高级判题
setProgress(pid: number, key: string, value: string): void功能
写入指定题目的团队进度数据。
参数
pid(number): 题目IDkey(string): 进度键名value(string): 要存储的值
使用场景
记录团队解题进度、中间结果或协作状态。
getStorage
适用范围: 题目后端 高级判题
getStorage(key: string): string功能
读取全局共享存储数据。
参数
key(string): 存储键名
返回值
存储的值(字符串格式)
特性
- 服务器端持久化存储
- 所有用户和团队共享访问
- 适用于全局统计、排行榜等场景
setStorage
适用范围: 题目后端 高级判题
setStorage(key: string, value: string): void功能
写入全局共享存储数据。
参数
key(string): 存储键名value(string): 要存储的值
注意事项
全局存储会影响所有用户,请谨慎使用并考虑并发访问问题。
数据获取方法
getPuzzleData
适用范围: 题目后端 高级判题
getPuzzleData(pid: number): string功能
获取指定题目的配置数据片段。
参数
pid(number): 题目ID
返回值
题目详情中 <data></data> 标签内的原始内容
使用场景
访问题目的静态配置信息、预设数据或元数据。
getGroupName
适用范围: 题目后端 高级判题
getGroupName(gid: number): string功能
查询指定团队的名称。
参数
gid(number): 团队ID
返回值
团队的显示名称
getRankAndWinner
适用范围: 题目后端
getRankAndWinner(gid: number): { rank: number; champion: string }功能
获取指定团队的比赛排名信息和冠军团队名称。
参数
gid(number): 团队ID
返回值
包含以下属性的对象:
rank(number): 团队的完赛排名champion(string): 冠军团队名称
使用场景
生成结局剧情、排行榜显示或比赛总结。
积分系统
costCredit
适用范围: 题目后端
costCredit(gid: number, cost: number): boolean功能
扣减指定团队的信用点数。
参数
gid(number): 团队IDcost(number): 要扣减的点数
返回值
true: 扣减成功false: 扣减失败(可能由于余额不足)
使用场景
实现付费提示、道具购买或惩罚机制。
响应输出方法
response
适用范围: 题目后端
response(body: string): void功能
向前端返回响应数据。
参数
body(string): 响应内容,必须是有效的JSON字符串
重要提示
- 必须调用: 每个题目后端脚本都必须至少调用一次此方法
- 格式要求: 传入参数必须是通过
JSON.stringify()序列化的字符串 - 最低调用: 即使无数据返回,也需调用
ctx.response("{}")
示例
const result = { success: true, message: "操作完成" };
ctx.response(JSON.stringify(result));判题控制方法
setResult
适用范围: 高级判题
setResult(result: boolean): void功能
设置判题的最终结果。
参数
result(boolean): 判题结果true: 答案正确false: 答案错误
重要提示
高级判题脚本必须至少调用一次此方法来确定判题结果。
setExtraMessage
适用范围: 高级判题
setExtraMessage(message: string): void功能
设置返回给用户的附加提示信息。
参数
message(string): 要显示的消息内容
使用场景
为用户提供解题提示、错误说明或进度反馈。
hitMilestone
适用范围: 高级判题
hitMilestone(hit: boolean): void功能
设置里程碑状态,用于标记解题进度。
参数
hit(boolean): 是否触发里程碑
重要约束
只有当判题结果为 false 时,里程碑状态才会生效。
使用场景
实现分阶段解题、进度奖励或中间成就系统。
setShowAnswer
适用范围: 高级判题
setShowAnswer(answer: string): void功能
自定义用户查看答案时显示的内容。
参数
answer(string): 要显示的答案内容
默认行为
若未调用此方法,系统将显示题目配置中的标准答案。
网络请求方法
httpPostForm
适用范围: 题目后端
httpPostForm(url: string, form: object, headers: object): string功能
由服务器端发起HTTP POST请求,调用外部API或服务。
参数
url(string): 目标URL地址form(object): 请求参数对象headers(object): 请求头配置
返回值
远程服务器的响应内容(字符串格式)
使用场景
集成第三方服务、验证外部数据或触发远程操作。
安全提示
请求将从服务器端发出,确保目标URL的安全性和可信度。
游戏进度方法
addAnswerLog
适用范围: 题目后端
addAnswerLog(uid: number, gid: number, pid: number, answer: string, status: number, message: string): void功能
手动添加答案提交记录到系统日志。
参数
uid(number): 用户IDgid(number): 团队IDpid(number): 题目IDanswer(string): 提交的答案status(number): 提交状态码1: 正确2: 答案错误3: 答题次数用尽4: 里程碑
message(string): 附加消息
使用场景
记录非标准答案框的提交行为,如交互式游戏中的操作记录。
makePuzzleFinished
适用范围: 题目后端
makePuzzleFinished(gid: number, pid: number, message: string): {
status: number;
message: string;
answer_status: number;
extend_flag: number;
location: string;
}警告
使用 makePuzzleFinished 时,不能同时使用其他的保存数据库的方法,如setProgress或costCredit。否则会造成写入存档冲突。
功能
直接将指定题目标记为完成状态。
参数
gid(number): 团队IDpid(number): 题目IDmessage(string): 完成时的附加信息
返回值
返回对象包含以下属性:
status(number): 操作状态码message(string): 状态消息answer_status(number): 答案状态extend_flag(number): 扩展标志location(string): 位置信息
使用场景
交互式游戏题目中,当玩家完成特定任务时自动标记题目完成。
API兼容性
返回格式与 /check-answer API 保持一致,确保前端处理的统一性。
最佳实践
错误处理
始终验证输入参数的有效性,特别是来自 ctx.request 的用户数据。
性能优化
合理使用存储方法,避免频繁的数据库操作。优先使用客户端状态存储处理临时数据。
安全考虑
- 验证用户权限,确保操作的合法性
- 对外部HTTP请求进行适当的安全检查
- 避免在全局存储中泄露敏感信息
调试技巧
利用 setExtraMessage 方法在开发阶段输出调试信息,便于问题定位和逻辑验证。
