
# FTC 票务系统

[![支持 PR](https://img.shields.io/badge/PRs-welcome-brightgreen.svg)](https://makeapullrequest.com) [![使用 Lua](https://img.shields.io/badge/Made%20with-Lua-blue)]() [![CC:Tweaked](https://img.shields.io/badge/CC%3ATweaked-ComputerCraft-blue)](https://tweaked.cc/) [![Node.js 16+](https://img.shields.io/badge/Node.js-16%2B-green)](https://nodejs.org/) [![Open Source](https://img.shields.io/badge/Open%20Source-%E2%9D%A4-red)]() [![注释：英文](https://img.shields.io/badge/%E6%B3%A8%E9%87%8A-%E8%8B%B1%E6%96%87-blue)]()
[![MIT 许可证](https://img.shields.io/badge/License-MIT-blue.svg)](LICENSE)

基于 CC:Tweaked 的票务解决方案：售票机与闸机，以及用于站点/线路/票价管理与票务事件日志的 Web 控制台。

## 功能
- 售票机：界面与语音引导、打印、软盘 TICKET 写入、售票统计上传
- 闸机：软盘票检、红石控制、状态上传（进站/出站）
- 控制台：管理站点/线路/票价、查看票务日志/事件、支持在区间中插入站点
- 每次售票生成唯一票号；打印前检查纸量与出纸槽

## 组件
- `Lua/TicketMachine/startup.lua`：售票机主程序
- `Lua/TicketMachine/gate.lua`：闸机主程序（进站/出站）
- `Lua/TicketMachine/web/server.js`：后端 API
- `Lua/TicketMachine/web/main.js`：前端主逻辑
- `Lua/TicketMachine/web/app.js`：前端 API 封装
- `Lua/TicketMachine/web/console.js`：控制台脚本

## 环境要求
- 安装 CC:Tweaked 模组的 Minecraft
- 售票机需要监视器（可选）、音响、打印机与软盘驱动器
- Web 控制台需要 Node.js 16+ 

## 部署
### 售票机
- 编辑 `startup.lua` 中的 `CURRENT_STATION_CODE`
- 摆放相关外设；如使用中心服务器，配置 `API_ENDPOINT.txt`

### 闸机
- 编辑 `gate.lua` 中 `CURRENT_STATION_CODE` 与 `GATE_TYPE`（0=进站，1=出站）
- 摆放相关外设并接好门控红石

### 控制台
- 安装依赖并启动服务；可在 `web/data/*.json` 或界面中管理数据

## 使用
- 售票：选择站点、类型与次数，支付后进入打印检查，随后打印并写盘
- 验票：插入软盘后自动校验并开门；多程票在扣次并更新后自动弹盘
- 控制台：管理基本数据；在区间 Shift-点击可插入站点

## 开发建议
- 注释保持英文、简洁；Lua 外设调用建议加 `pcall`
- Web API 路由在 `/api`，持久化文件位于 `web/data/*`

## 贡献
- 欢迎提 Issue 与 PR；改动尽量聚焦且最小化，遵循现有风格

## 许可证
- 使用 MIT 许可；详见 `LICENSE`

## 安装与运行

**前置条件**
- 安装 `Node.js 16+`（推荐 18+）

**安装依赖**
- 在项目根目录执行：`npm install`

**启动 Web 控制台**
- 方式一（根目录）：`node web/server.js`
- 方式二（进入子目录）：`cd web && node server.js`
- 默认访问地址：`http://localhost:23333/`（可通过环境变量 `HOST`、`PORT` 覆盖）

**首次配置**
- 进入“系统设置”，设置 `API 地址`（默认同源 `/api`）。
- 也可编辑 `web/data/config.json` 中的 `api_base`。

**数据导入/导出**
- 在控制台界面使用“导入数据 / 导出数据”按钮；导出文件名为 `ftc-ticket-admin-backup.json`。

**设备部署（CC:Tweaked）**
- 售票机：将 `Lua/TicketMachine/startup.lua` 置于电脑根目录作为开机自启，配置 `CURRENT_STATION_CODE`；按需摆放监视器、音响、打印机、软盘驱动器。
- 闸机：将 `Lua/TicketMachine/gate.lua` 部署到闸机电脑，设置 `CURRENT_STATION_CODE` 与 `GATE_TYPE`（0=进站，1=出站），接好门控红石。
- 若使用中心服务器：在设备侧写入 API 基址（如通过 `API_ENDPOINT.txt` 或程序内配置）。

**常见问题**
- 端口被占用：以 `PORT=8080 node web/server.js` 方式指定端口。
- 跨域访问：后端已启用 CORS；如需跨源部署，请正确设置 `api_base`。