feat: 多班级版班级管理系统 v2.0
技术栈:Go (Gin + GORM) + PHP + MySQL 5.7 + Redis 主要功能: - 多班级完全隔离(class_id 贯穿全系统) - 后端从 Python FastAPI 重写为 Go Gin(端口 56789) - 超级管理员独立登录(env 配置路径,默认账密 admin/Admin123) - 科任老师/课代表新角色 - 课代表作业管理页面 - 排行榜分项排行(操行分/考勤/作业) - 角色加减分上下限由班主任配置 - 家长改密功能(可开关) - 班级角色按需开关 - 宿舍号格式:南0-000 - 周度/月度重置功能 - MySQL 5.7 兼容 - Nginx 反向代理部署 开发者: Canglan 版权归属: Sea Network Technology Studio 许可证: Apache License 2.0
This commit is contained in:
97
frontend/config.php
Normal file
97
frontend/config.php
Normal file
@@ -0,0 +1,97 @@
|
||||
<?php
|
||||
/**
|
||||
* 多班级版班级管理系统 - 前端配置
|
||||
*
|
||||
* 开发者: Canglan
|
||||
* 联系方式: admin@sea-studio.top
|
||||
* 版权归属: Sea Network Technology Studio
|
||||
* 许可证: Apache License 2.0
|
||||
*
|
||||
* 版权所有 © Sea Network Technology Studio
|
||||
*/
|
||||
|
||||
// 读取.env文件
|
||||
$envFile = __DIR__ . '/.env';
|
||||
$config = [];
|
||||
|
||||
if (!file_exists($envFile)) {
|
||||
die('错误: 配置文件 .env 不存在,请复制 .env.example 并修改配置');
|
||||
}
|
||||
|
||||
$lines = file($envFile, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
|
||||
if ($lines === false) {
|
||||
die('错误: 无法读取配置文件 .env');
|
||||
}
|
||||
|
||||
foreach ($lines as $line) {
|
||||
$line = trim($line);
|
||||
if (strpos($line, '#') === 0 || empty($line)) {
|
||||
continue;
|
||||
}
|
||||
if (strpos($line, '=') !== false) {
|
||||
$parts = explode('=', $line, 2);
|
||||
$key = trim($parts[0]);
|
||||
$value = trim($parts[1]);
|
||||
$value = trim($value, '"\'');
|
||||
$config[$key] = $value;
|
||||
}
|
||||
}
|
||||
|
||||
// 检查必要配置是否存在
|
||||
$requiredKeys = ['API_BASE_URL', 'API_TIMEOUT', 'JWT_STORAGE_KEY', 'USER_STORAGE_KEY', 'SITE_NAME', 'SESSION_TIMEOUT', 'ICP_ENABLED', 'ICP_NUMBER'];
|
||||
$missingKeys = [];
|
||||
|
||||
foreach ($requiredKeys as $key) {
|
||||
if (!isset($config[$key]) || $config[$key] === '') {
|
||||
$missingKeys[] = $key;
|
||||
}
|
||||
}
|
||||
|
||||
if (!empty($missingKeys)) {
|
||||
die('错误: 配置文件 .env 缺少必要配置项: ' . implode(', ', $missingKeys));
|
||||
}
|
||||
|
||||
// 定义常量
|
||||
define('API_BASE_URL', $config['API_BASE_URL']);
|
||||
define('API_TIMEOUT', (int)$config['API_TIMEOUT']);
|
||||
define('JWT_STORAGE_KEY', $config['JWT_STORAGE_KEY']);
|
||||
define('USER_STORAGE_KEY', $config['USER_STORAGE_KEY']);
|
||||
define('SITE_NAME', $config['SITE_NAME']);
|
||||
define('SESSION_TIMEOUT', (int)$config['SESSION_TIMEOUT']);
|
||||
define('ICP_ENABLED', $config['ICP_ENABLED'] !== 'false');
|
||||
define('ICP_NUMBER', $config['ICP_NUMBER'] ?? '');
|
||||
// 注意:此处不含 /api 前缀,前端 JS 会自动拼接 /api + path + /login
|
||||
define('SUPER_ADMIN_LOGIN_PATH', ($config['SUPER_ADMIN_LOGIN_PATH'] ?? '/super-admin'));
|
||||
// 会话配置
|
||||
ini_set('session.cookie_httponly', 1);
|
||||
ini_set('session.use_only_cookies', 1);
|
||||
// 开发环境允许 HTTP,生产环境强制 HTTPS
|
||||
$appEnv = $config['APP_ENV'] ?? 'production';
|
||||
ini_set('session.cookie_secure', $appEnv === 'production' ? 1 : 0);
|
||||
ini_set('session.cookie_samesite', 'Lax');
|
||||
ini_set('session.gc_maxlifetime', SESSION_TIMEOUT);
|
||||
session_name('CLASS_SESSION');
|
||||
|
||||
session_start();
|
||||
|
||||
// 应用层会话超时检查
|
||||
if (isset($_SESSION['login_time']) && (time() - $_SESSION['login_time'] > SESSION_TIMEOUT)) {
|
||||
session_unset();
|
||||
session_destroy();
|
||||
if (strpos($_SERVER['REQUEST_URI'] ?? '', '/api/') === false) {
|
||||
header('Location: /index.php');
|
||||
exit();
|
||||
}
|
||||
http_response_code(401);
|
||||
header('Content-Type: application/json; charset=utf-8');
|
||||
echo json_encode(['success' => false, 'message' => '会话已过期,请重新登录']);
|
||||
exit();
|
||||
}
|
||||
|
||||
// 时区设置
|
||||
date_default_timezone_set('Asia/Shanghai');
|
||||
|
||||
// 生产环境关闭错误显示(保留错误日志记录,仅隐藏页面输出)
|
||||
error_reporting(E_ALL & ~E_NOTICE & ~E_DEPRECATED);
|
||||
ini_set('display_errors', 0);
|
||||
ini_set('log_errors', 1);
|
||||
Reference in New Issue
Block a user