旧版服务端

This commit is contained in:
tianmo committed 2026-09-29 13:39:36 +08:00
1 parent 3429c8b402
commit 25bbb5f9c8
971 files changed
+87141 -40

No files matched your search

+31 -40
View File
@@ -40,7 +40,7 @@
| 编号 | 决策 | 理由 | 影响 |
|---|---|---|---|
| ADR-001 | 放弃口令码,权益由订单驱动 | 支付上线后口令码仅剩线下分发用途,维护成本高于价值 | 删除 `课程口令码`、`课程口令码读取信息`;老用户走 legacy 权益迁移 |
| ADR-001 | 放弃口令码,权益由订单驱动 | 支付上线后口令码仅剩线下分发用途,维护成本高于价值 | `课程口令码` 表整体作废;已兑换用户按其 `用户已购课程` 记录标记为已拥有;`课程口令码读取信息` 升级为 `courses` |
| ADR-002 | 数据端保留 MySQL 5.7,不升级 | 用户明确要求 | Prisma `provider = mysql`;见 4.1 约束清单 |
| ADR-003 | 服务端与管理后台使用独立域名 | 用户要求 | Nginx 分站点;后端仍为同一 Node 进程 |
| ADR-004 | 小程序前端不重写,只重写 JS 层 | 保证「外观不变」 | 复用全部 `.wxml` / `.wxss` / `static/` |
@@ -131,7 +131,7 @@
> 1. 为迁移专用账号授予 `CREATE` / `DROP` 权限(推荐,本机开发用)。
> 2. 在本地生成迁移 SQL(`prisma migrate diff`),生产端仅执行 `prisma migrate deploy`。
### 4.2 表清单与映射:20 张 → 16 张
### 4.2 表清单与映射:20 张 → 15 张
| 旧表 | 新表 | 处理 |
|---|---|---|
@@ -146,7 +146,7 @@
| `网页列表` (2) | `articles` | 迁移 |
| `课程页面Tips` (2) | `course_tips` | 迁移 |
| `cloudconfig` (13) | `settings` | 迁移,数字 ID 改字符串 key |
| `课程口令码` (5) | `legacy_redeem_codes` | **保留原样**,见 9.4 |
| `课程口令码` (5) | — | 废弃(口令码作废,见 9.4) |
| `网页数据` | — | 废弃 |
| `课程页面Tips2` | — | 废弃 |
| `首页课程列表2` | — | 废弃 |
@@ -229,7 +229,7 @@
| id | BIGINT UNSIGNED | PK | |
| user_id | BIGINT UNSIGNED | NOT NULL | → users.id |
| course_id | BIGINT UNSIGNED | NOT NULL | → courses.id |
| source | TINYINT | NOT NULL | 1 订单 / 2 老数据 / 3 后台发放 / 4 旧口令码 |
| source | TINYINT | NOT NULL | 1 订单 / 2 老数据(历史已购)/ 3 后台发放 |
| ref_id | BIGINT UNSIGNED | NULL | 订单 id 或操作人 id |
| granted_at | DATETIME | NOT NULL | |
| expire_at | DATETIME | NULL | NULL 表示永久 |
@@ -297,19 +297,6 @@
| status | TINYINT | |
| last_login_at | DATETIME | |
#### legacy_redeem_codes(旧口令码留存)
原样保留 5 条记录,用于凭证备查与人工核销,不参与任何自动流程。
| 字段 | 类型 | 说明 |
|---|---|---|
| id | BIGINT UNSIGNED PK | |
| code | VARCHAR(64) UNIQUE | 原口令码 |
| course_id | BIGINT UNSIGNED | → courses.id |
| remaining_uses | INT | 原剩余有效次数 |
| expires_at | DATETIME NULL | 原口令结束日期 |
| note | VARCHAR(255) | 备注 |
#### settings
数字 ID 迁移为字符串 key,附映射关系(见 9.3)。
@@ -441,7 +428,6 @@ apps/api/src/
| GET | `/admin/v1/orders` | 订单列表 |
| POST | `/admin/v1/orders/:id/refund` | 发起退款(Android) |
| GET/POST/DELETE | `/admin/v1/entitlements` | 权益发放 / 回收 |
| POST | `/admin/v1/legacy-codes/redeem` | 旧口令码人工核销 |
### 5.4 统一契约
@@ -607,9 +593,8 @@ signature = HMAC_SHA256(session_key, post_body)
4. **课时管理**:按课程列出课时,编辑标题/章节/排序。
5. **权益管理**:手动发放、回收、按用户查权益(**替代原发码功能**)。
6. **订单管理**:列表、详情、状态、发起退款(Android)。
7. **旧口令码核销**:输入口令码 + 选择用户 → 扣减次数 → 发放权益。
8. **内容管理**:Banner、首页新课长图、首页试听入口、文章、课程页文案。
9. **系统配置**:`settings` 表全部键值。
7. **内容管理**:Banner、首页新课长图、首页试听入口、文章、课程页文案。
8. **系统配置**:`settings` 表全部键值。
---
@@ -713,7 +698,7 @@ VideoDetailsPage.wxml
| `网页列表` | `articles` | `网页id → legacy_page_id`(图片路径依赖) |
| `课程页面Tips` | `course_tips` | |
| `cloudconfig` | `settings` | 数字 ID → 字符串 key,见 9.3 |
| `课程口令码` | `legacy_redeem_codes` | 原样保留,见 9.4 |
| `课程口令码` | — | 废弃(不迁移,见 9.4) |
### 9.3 settings 键映射
@@ -733,11 +718,27 @@ VideoDetailsPage.wxml
| 11 | 我是有底线的! | `home.footer_text` | 首页触底提示 |
| 12 | 长按识别二维码 | `profile.qrcode_caption` | 图片标题 |
### 9.4 旧口令码处理(待确认)
### 9.4 旧口令码处理:整体作废,已兑换用户直接标记为已拥有
**现状**:`课程口令码` 表中有 5 条记录,剩余有效次数合计 18 次。
**已确认的处理方式**:口令码机制整体废弃,`课程口令码` 表不迁入新库。
| 口令码 | 课程 | 剩余次数 |
**已兑换用户如何处理**:历史上任何用户使用课程码兑换成功,服务端都会写入一条 `用户已购课程` 记录。因此**「谁用过课程码」这件事已经完整落在 `用户已购课程` 表中**,共 48 条,无需从口令码反推。
迁移时逐条转为 `entitlements`:
| 源字段 | 目标字段 | 取值 |
|---|---|---|
| OpenID | user_id | 按 openid 匹配 `users` |
| 课程id | course_id | 按 code 匹配 `courses` |
| (固定) | source | `2`(老数据) |
| 购课日期 | granted_at | 原值(转 UTC) |
| 课程介绍 | note | 原值(可选) |
**用户侧表现**:这些用户升级后打开「知识」页,看到的已购课程与升级前完全一致,无需任何操作,也不经过支付。这就是「不走支付、直接标记为已拥有」。
**作废部分**:`课程口令码` 表中 5 条记录、合计 18 次**未使用**的剩余次数,随机制一并作废,不迁移、不补偿。此项为明确决策,非疏漏。
| 口令码 | 课程 | 未使用次数(作废) |
|---|---|---|
| 202601 | 7年级数学同步视频课(北师大) | 3 |
| 202602 | 8年级数学同步视频课(北师大) | 3 |
@@ -745,15 +746,7 @@ VideoDetailsPage.wxml
| 202604 | 梁老师中考数学一轮满分冲刺 | 5 |
| 202605 | 梁老师中考数学二轮满分冲刺 | 4 |
**技术事实**:口令码是「次数池」,**表结构中不含用户字段**,即无法从数据推导出这 18 次分别属于谁。因此**无法自动转换成「某用户已购买某课程」的记录**——缺少用户维度。
**本方案的处理(无损、可兜底)**:
1. 5 条记录原样迁入 `legacy_redeem_codes`,作为凭证留存。
2. 管理后台提供「旧口令码核销」功能:输入口令码 + 选择用户 → 扣减 `remaining_uses` → 写入 `entitlements(source = legacy_code)`。
3. 当持有旧码的用户来访时,运营在后台一键发放权益,业务闭环完整。
> ❓ **需要确认**:若本意是「这 18 次已经卖给具体学生、且手上有对应名单」,应**直接按名单批量生成** `entitlements(source = legacy)` 记录,而不是走核销流程。请提供名单或确认按上述核销方案执行。
> 若后续有人反馈持有未使用的旧码,用管理后台的「权益手动发放」补发即可,无需为它保留专门的核销功能与数据表。
### 9.5 迁移步骤
@@ -806,7 +799,7 @@ VideoDetailsPage.wxml
| R3 | `courses.code` 被改写 | 全部视频资源失效 | 迁移脚本禁止改写;加校验断言 | 1 |
| R4 | 封面 / 图片文件名被改写 | 图片 404 | 迁移脚本原值透传;加校验断言 | 1 |
| R5 | 时间字段未做 UTC 转换 | 订单时间偏移 8 小时 | 迁移时显式转换 + 抽样核对 | 1 |
| R6 | 18 次旧口令码归属不明 | 用户投诉 | 保留原表 + 后台核销入口;或按名单批量发放 | 1 / 5 |
| R6 | 18 次未使用的旧口令码随机制作废 | 持码人无法兑换 | 已确认为接受项;若有人反馈,用后台「权益手动发放」补发 | 1 |
| R7 | `VideoDetailsPage` 路径变更 | 已分发的入口失效 | 路径原样保留 | 8 |
| R8 | `sessionKey` 泄漏 | 用户态签名可被伪造 | 加密存储;日志脱敏 | 2 |
| R9 | 发货推送丢失 | 用户付款未开通 | 双通道:推送 + 定时查单 | 6 |
@@ -820,10 +813,9 @@ VideoDetailsPage.wxml
| 编号 | 事项 | 现状 | 需要 |
|---|---|---|---|
| Q1 | 旧口令码的 18 次剩余次数 | 无用户维度,无法自动转成「用户已购买」 | 确认按 9.4 核销方案执行,或提供持有者名单 |
| Q2 | `VideoDetailsPage` 的实际访问入口 | 代码中无跳转引用,但可能经小程序码 / 搜索直达 | 确认是否对外分发过;若通过小程序码分发,路径必须保留 |
| Q3 | 头像资源数量 | `cloudconfig` 记录为 50,`Images/Headicons/` 实际 51 个文件 | 确认有效范围 |
| Q4 | 三大内容块是否全保留 | 默认全部保留 | 确认无内容需要下线 |
| Q1 | `VideoDetailsPage` 的实际访问入口 | 代码中无跳转引用,但可能经小程序码 / 搜索直达 | 确认是否对外分发过;若通过小程序码分发,路径必须保留 |
| Q2 | 头像资源数量 | `cloudconfig` 记录为 50,`Images/Headicons/` 实际 51 个文件 | 确认有效范围 |
| Q3 | 三大内容块是否全保留 | 默认全部保留 | 确认无内容需要下线 |
---
@@ -869,4 +861,3 @@ yelaymaths/
| `6ec33e18e8ab…` | 9年级数学同步视频课(北师大) |
| `25caa811c67c…` | 梁老师中考数学一轮满分冲刺(视频+讲义) |
| `77d091c27378…` | 梁老师中考数学二轮满分冲刺(视频+讲义) |
+5
View File
@@ -0,0 +1,5 @@
# This directory is a Syncthing folder marker.
# Do not delete.
folderID: vau53-fffso
created: 2026-03-01T17:34:05+08:00
+46
View File
@@ -0,0 +1,46 @@
<?php
header('Content-Type: application/json');
// 获取传入的 OpenID 值
$openid = $_GET['openid'];
// 引用配置,建立数据库连接
require_once 'ApiConfig.php';
$conn = new mysqli(DB_SERVER, DB_USERNAME, DB_PASSWORD, DB_NAME);
// 检查连接是否成功
if ($conn->connect_error) {
die("连接失败: " . $conn->connect_error);
}
$courseID=$_GET['courseID'];
$courseName=$_GET['courseName'];
$coursePswdCode=$_GET['coursePswdCode'];
$courseEndDate=$_GET['courseEndDate'];
$courseInfo=$_GET['courseInfo'];
$courseCount=$_GET['courseCount'];
// 查询数据库中符合条件的记录
$sql = "SELECT * FROM 用户信息 WHERE OpenID='$openid' AND 是否管理员='1'";
$result = $conn->query($sql);
if ($result->num_rows > 0) {
$sql2 = "SELECT * FROM 课程口令码 WHERE 口令码='$coursePswdCode'";
$result2 = $conn->query($sql2);
if ($result2->num_rows === 0) {
// 口令码不存在才能插入
$insertdate_sql = "INSERT INTO 课程口令码 (课程id, 课程, 口令码, 口令结束日期, 课程介绍, 剩余有效次数) VALUES ('$courseID', '$courseName', '$coursePswdCode', '$courseEndDate', '$courseInfo', '$courseCount')";
$insertdate_result = $conn->query($insertdate_sql);
if ($insertdate_result === TRUE) {
$select_sql_1 = "SELECT * FROM 课程口令码 WHERE 口令码='$coursePswdCode'";
$select_result_1 = $conn->query($select_sql_1);
if ($select_result_1->num_rows > 0) {
$insertdate_row = $select_result_1->fetch_assoc();
echo json_encode(["result" => "口令码添加成功", "Data" => $insertdate_row]);
}
}
} else {echo json_encode(["result" => "口令码已存在", "Data" => null]);}
} else {echo json_encode(["result" => "无权访问", "Data" => null]);}
// 关闭数据库连接
$conn->close();
?>
+31
View File
@@ -0,0 +1,31 @@
<?php
header('Content-Type: application/json');
// 获取传入的 OpenID 值
$openid = $_GET['openid'];
// 引用配置,建立数据库连接
require_once 'ApiConfig.php';
$conn = new mysqli(DB_SERVER, DB_USERNAME, DB_PASSWORD, DB_NAME);
// 检查连接是否成功
if ($conn->connect_error) {
die("连接失败: " . $conn->connect_error);
}
// 查询数据库中符合条件的记录
$sql = "SELECT * FROM 用户信息 WHERE OpenID='$openid' AND 是否管理员='1'";
$result = $conn->query($sql);
if ($result->num_rows > 0) {
$sql2 = "SELECT * FROM 课程口令码读取信息";
$result2 = $conn->query($sql2);
if ($result2->num_rows > 0) {
// 获取查询结果
$data = array();
while ($row = $result2->fetch_assoc()) {$data[] = $row;}
echo json_encode(["result" => "获取成功", "Data" => $data]);
} else {echo json_encode(["result" => "口令码读取信息失败", "Data" => null]);}
} else {echo json_encode(["result" => "无权访问", "Data" => null]);}
// 关闭数据库连接
$conn->close();
?>
+76
View File
@@ -0,0 +1,76 @@
<?php
header('Content-Type: application/json');
// 引用配置,建立数据库连接
require_once 'ApiConfig.php';
// 接收前端传递的OpenID
$received_openid = isset($_GET['openid']) ? $_GET['openid'] : null;
$received_username = isset($_GET['username']) ? $_GET['username'] : null;
$received_headiconID = isset($_GET['headiconID']) ? $_GET['headiconID'] : 0;
if ($received_openid) {
// 创建数据库连接
$conn = new mysqli(DB_SERVER, DB_USERNAME, DB_PASSWORD, DB_NAME);
// 检查连接是否成功
if ($conn->connect_error) {
die(json_encode(["error" => "Database connection failed"]));
}
// 使用预处理语句查询
$stmt = $conn->prepare("SELECT * FROM 用户信息 WHERE OpenID = ?");
$stmt->bind_param("s", $received_openid);
$stmt->execute();
$result = $stmt->get_result();
// 检查查询是否成功
if ($result->num_rows > 0) {
if ($result->num_rows > 0) {
// 如果查询到记录,执行更新操作
$insert_stmt = $conn->prepare("UPDATE 用户信息 SET `用户名` = ?, `HeadiconID` = ? WHERE `OpenID` = ? AND `是否登录` = 1");
$insert_stmt->bind_param("sss", $received_username, $received_headiconID,$received_openid);
if ($insert_stmt->execute()) {
// 插入成功后再次查询
$stmt_after_insert = $conn->prepare("SELECT * FROM 用户信息 WHERE OpenID = ?");
$stmt_after_insert->bind_param("s", $received_openid);
$stmt_after_insert->execute();
$result_after_insert = $stmt_after_insert->get_result();
// 检查查询是否成功
if ($result_after_insert) {
if ($result_after_insert->num_rows > 0) {
// 如果查询到记录,返回整条记录
$row_after_insert = $result_after_insert->fetch_assoc();
echo json_encode(["result" => "success", "data" => $row_after_insert]);
} else {
echo json_encode(["error" => "未找到插入后的记录"]);
}
// 关闭查询的预处理语句
$stmt_after_insert->close();
} else {
// 查询失败时的错误处理
echo json_encode(["error" => $conn->error]);
}
// 关闭插入的预处理语句
$insert_stmt->close();
} else {
echo json_encode(["error" => "Error inserting record"]);
}
}
} else {
// 查询失败时的错误处理
echo json_encode(["error" => "OpenID无效!"]);
}
// 关闭原始查询的预处理语句
$stmt->close();
// 关闭数据库连接
$conn->close();
} else {
echo json_encode(["error" => " 暂无数据!"]);
}
?>
+36
View File
@@ -0,0 +1,36 @@
<?php
header('Content-Type: application/json');
// 获取传入的 OpenID 值
$openid = $_GET['openid'];
// 引用配置,建立数据库连接
require_once 'ApiConfig.php';
$conn = new mysqli(DB_SERVER, DB_USERNAME, DB_PASSWORD, DB_NAME);
// 检查连接是否成功
if ($conn->connect_error) {
die("连接失败: " . $conn->connect_error);
}
$coursePswdCode=$_GET['coursePswdCode'];
$courseEndDate=$_GET['courseEndDate'];
$courseInfo=$_GET['courseInfo'];
$courseCount=$_GET['courseCount'];
//还需要传入旧口令码
$oldCoursePswdCode=$_GET['oldCoursePswdCode'];
// 查询数据库中符合条件的记录
$sql = "SELECT * FROM 用户信息 WHERE OpenID='$openid' AND 是否管理员='1'";
$result = $conn->query($sql);
if ($result->num_rows > 0) {
// 执行更新操作
$sql2 = "UPDATE 课程口令码 SET 口令码 = '$coursePswdCode', 口令结束日期='$courseEndDate', 课程介绍='$courseInfo', 剩余有效次数='$courseCount' WHERE 口令码 = '$oldCoursePswdCode'";
if ($conn->query($sql2) === TRUE) {
echo json_encode(["result" => "ok"]);
}
} else {echo json_encode(["result" => null]);}
// 关闭数据库连接
$conn->close();
?>
+93
View File
@@ -0,0 +1,93 @@
<?php
// 获取上传的文件
$headIconFile = $_FILES['HeadIconKey'];
// 获取用户名昵称信息
$username1 = $_POST['username'];
// 获取传入的 OpenID 值
$openid = $_POST['openid'];
// 如果文件上传成功
if ($headIconFile['error'] === UPLOAD_ERR_OK) {
// 文件临时路径
$tempFilePath = $headIconFile['tmp_name'];
// 确定目标目录路径(相对于当前执行脚本的路径)
$targetDirectory = dirname(__FILE__) . '/../Images/UsersHeadIcon/';
// 确保目标目录存在且可写
if (!file_exists($targetDirectory)) {
mkdir($targetDirectory, 0777, true);
}
// 获取文件名并拼接目标文件路径
$targetFilePath = $targetDirectory . $openid . '.png';
// 移动文件到目标路径
if (move_uploaded_file($tempFilePath, $targetFilePath)) {echo "文件移动成功!";} else {echo "文件移动失败!";}
}
// 这里可以对上传的文件进行进一步处理,比如保存文件路径到数据库等
// 引用配置,建立数据库连接
require_once 'ApiConfig.php';
$conn = new mysqli(DB_SERVER, DB_USERNAME, DB_PASSWORD, DB_NAME);
// 检查连接是否成功
if ($conn->connect_error) {
die("连接失败: " . $conn->connect_error);
}
// 查询数据库中符合条件的记录
$sql = "SELECT * FROM 用户信息 WHERE OpenID='$openid'";
$result = $conn->query($sql);
// 如果查询结果不为空,则更新记录中的用户名字段
if ($result->num_rows > 0) {
// 更新用户名字段为 '我的名字'
$update_sql = "UPDATE `用户信息` SET `用户名`='$username1',`是否登录`='1' WHERE OpenID='$openid'";
if ($conn->query($update_sql) === TRUE) {
echo "记录更新成功";
$row = $result->fetch_assoc();
$userId = $row['YelayMaths_ID'];
if (empty($userId)) {
// 生成一个随机的字符串或者使用你自己的字符串
$inputString = uniqid();
// 使用SHA-256算法计算哈希值
$hashedString = hash('sha256', $inputString);
$update_sql = "UPDATE `用户信息` SET `YelayMaths_ID`='$hashedString' WHERE OpenID='$openid'";
if ($conn->query($update_sql) === TRUE) {echo "YelayMaths_ID更新成功";}
}
} else {
echo "更新记录时出错: " . $conn->error;
}
} else {
echo "未找到符合条件的记录";
}
// 关闭数据库连接
$conn->close();
// 可以继续处理其他表单数据,比如保存用户名到数据库等
?>
+111
View File
@@ -0,0 +1,111 @@
<?php
// 获取上传的文件
$headIconFile = $_FILES['HeadIconKey'];
// 获取用户名昵称信息
$username1 = $_POST['username'];
// 获取传入的 OpenID 值
$openid = $_POST['openid'];
// 获取传入的 phonenumber 值
$phonenumber = $_POST['phonenumber'];
// 如果文件上传成功
if ($headIconFile['error'] === UPLOAD_ERR_OK) {
// 文件临时路径
$tempFilePath = $headIconFile['tmp_name'];
// 确定目标目录路径(相对于当前执行脚本的路径)
$targetDirectory = dirname(__FILE__) . '/../Images/UsersHeadIcon/';
// 确保目标目录存在且可写
if (!file_exists($targetDirectory)) {
mkdir($targetDirectory, 0777, true);
}
// 获取文件名并拼接目标文件路径
$targetFilePath = $targetDirectory . $openid . '.png';
// 移动文件到目标路径
if (move_uploaded_file($tempFilePath, $targetFilePath)) {
// 文件移动成功
echo "文件上传成功!";
// 这里可以对上传的文件进行进一步处理,比如保存文件路径到数据库等
// 引用配置,建立数据库连接
require_once 'ApiConfig.php';
$conn = new mysqli(DB_SERVER, DB_USERNAME, DB_PASSWORD, DB_NAME);
// 检查连接是否成功
if ($conn->connect_error) {
die("连接失败: " . $conn->connect_error);
}
// 查询数据库中符合条件的记录
$sql = "SELECT * FROM 用户信息 WHERE OpenID='$openid'";
$result = $conn->query($sql);
// 如果查询结果不为空,则更新记录中的用户名字段
if ($result->num_rows > 0) {
// 更新用户名字段为 '我的名字'
$update_sql = "UPDATE `用户信息` SET `用户名`='$username1',`是否登录`='1', `手机号`='$phonenumber' WHERE OpenID='$openid'";
if ($conn->query($update_sql) === TRUE) {
echo "记录更新成功";
$row = $result->fetch_assoc();
$userId = $row['YelayMaths_ID'];
if (empty($userId)) {
// 生成一个随机的字符串或者使用你自己的字符串
$inputString = uniqid();
// 使用SHA-256算法计算哈希值
$hashedString = hash('sha256', $inputString);
$update_sql = "UPDATE `用户信息` SET `YelayMaths_ID`='$hashedString' WHERE OpenID='$openid'";
if ($conn->query($update_sql) === TRUE) {echo "YelayMaths_ID更新成功";}
}
} else {
echo "更新记录时出错: " . $conn->error;
}
} else {
echo "未找到符合条件的记录";
}
// 关闭数据库连接
$conn->close();
} else {
// 文件移动失败
echo "文件上传失败1!";
}
} else {
// 文件上传失败
echo "文件上传失败2!";
}
// 可以继续处理其他表单数据,比如保存用户名到数据库等
?>
+15
View File
@@ -0,0 +1,15 @@
<?php
// ApiConfig.php
// 发布环境
define('DB_SERVER', 'localhost');
define('DB_USERNAME', 'api_yeomai_site');
define('DB_PASSWORD', 'GAmidytesHHLjGkY');
define('DB_NAME', 'api_yeomai_site');
//开发环境
// define('DB_SERVER', 'localhost');
// define('DB_USERNAME', 'api_yeomai_site_develop');
// define('DB_PASSWORD', 'tXKC4aJXAp74JzhP');
// define('DB_NAME', 'api_yeomai_site_develop');
?>
+31
View File
@@ -0,0 +1,31 @@
<?php
header('Content-Type: application/json');
// 获取传入的 OpenID 值
$openid = $_GET['openid'];
// 引用配置,建立数据库连接
require_once 'ApiConfig.php';
$conn = new mysqli(DB_SERVER, DB_USERNAME, DB_PASSWORD, DB_NAME);
// 检查连接是否成功
if ($conn->connect_error) {
die("连接失败: " . $conn->connect_error);
}
$coursePswdCode=$_GET['coursePswdCode'];
// 查询数据库中符合条件的记录
$sql = "SELECT * FROM 用户信息 WHERE OpenID='$openid' AND 是否管理员='1'";
$result = $conn->query($sql);
if ($result->num_rows > 0) {
// 执行删除操作
$sql2 = "DELETE FROM 课程口令码 WHERE 口令码 = '$coursePswdCode'";
if ($conn->query($sql2) === TRUE) {
echo json_encode(["result" => "删除成功"]);
}
} else {echo json_encode(["result" => null]);}
// 关闭数据库连接
$conn->close();
?>
+31
View File
@@ -0,0 +1,31 @@
<?php
// 引用配置,建立数据库连接
require_once 'ApiConfig.php';
$conn = new mysqli(DB_SERVER, DB_USERNAME, DB_PASSWORD, DB_NAME);
// 检查连接是否成功
if ($conn->connect_error) {
die("连接失败: " . $conn->connect_error);
}
// 构建SQL查询语句
$sql = "SELECT * FROM 首页横幅图片 ORDER BY 序号 ASC";
// 执行查询
$result = $conn->query($sql);
if ($result->num_rows > 0) {
// 将结果转换为关联数组
$data = $result->fetch_all(MYSQLI_ASSOC);
// 输出JSON数据
header('Content-Type: application/json');
echo json_encode($data);
} else {
// 如果没有匹配的数据
header('Content-Type: application/json');
echo json_encode(array('message' => '没有找到匹配的数据'));
}
// 关闭数据库连接
$conn->close();
?>
+32
View File
@@ -0,0 +1,32 @@
<?php
// 连接数据库
// 引用配置,建立数据库连接
require_once 'ApiConfig.php';
$conn = new mysqli(DB_SERVER, DB_USERNAME, DB_PASSWORD, DB_NAME);
// 检查连接是否成功
if ($conn->connect_error) {
die("连接失败: " . $conn->connect_error);
}
// 构建SQL查询语句
$sql = "SELECT * FROM cloudconfig ORDER BY ID ASC";
// 执行查询
$result = $conn->query($sql);
if ($result->num_rows > 0) {
// 将结果转换为关联数组
$data = $result->fetch_all(MYSQLI_ASSOC);
// 输出JSON数据
header('Content-Type: application/json');
echo json_encode($data);
} else {
// 如果没有匹配的数据
header('Content-Type: application/json');
echo json_encode(array('message' => '没有找到匹配的数据'));
}
// 关闭数据库连接
$conn->close();
?>
+72
View File
@@ -0,0 +1,72 @@
<?php
// 获取头像id
$headIconIndex = '0';
$headIconIndex = $_POST['HeadIconIndex'];
// 获取用户名昵称信息
$username1 = $_POST['username'];
// 获取传入的 OpenID 值
$openid = $_POST['openid'];
// 引用配置,建立数据库连接
require_once 'ApiConfig.php';
$conn = new mysqli(DB_SERVER, DB_USERNAME, DB_PASSWORD, DB_NAME);
// 检查连接是否成功
if ($conn->connect_error) {
die("连接失败: " . $conn->connect_error);
}
// 查询数据库中符合条件的记录
$sql = "SELECT * FROM 用户信息 WHERE OpenID='$openid'";
$result = $conn->query($sql);
// 如果查询结果不为空,则更新记录中的用户名字段
if ($result->num_rows > 0) {
// 更新用户名字段为 '我的名字'
$update_sql = "UPDATE `用户信息` SET `用户名`='$username1',`是否登录`='1' WHERE OpenID='$openid'";
if ($conn->query($update_sql) === TRUE) {
echo "记录更新成功";
$row = $result->fetch_assoc();
$userId = $row['YelayMaths_ID'];
if (empty($userId)) {
// 生成一个随机的字符串或者使用你自己的字符串
$inputString = uniqid();
// 使用SHA-256算法计算哈希值
$hashedString = hash('sha256', $inputString);
$update_sql = "UPDATE `用户信息` SET `YelayMaths_ID`='$hashedString' WHERE OpenID='$openid'";
if ($conn->query($update_sql) === TRUE) {echo "YelayMaths_ID更新成功";}
}
} else {
echo "更新记录时出错: " . $conn->error;
}
} else {
echo "未找到符合条件的记录";
}
// 关闭数据库连接
$conn->close();
// 可以继续处理其他表单数据,比如保存用户名到数据库等
?>
+54
View File
@@ -0,0 +1,54 @@
<?php
//播放视频流程
//传入openid、课程id
//用openid换取购买认证
//认证成功 - 用课程id换取视频数据 - 最终返回数据 - 播放视频
//认证失败 返回null
// 声明JSON内容类型
header('Content-Type: application/json');
// 获取传入的 OpenID 值
$openid = $_GET['openid'];
// 获取传入的 课程ID 值
$courseid = $_GET['courseid'];
// 引用配置,建立数据库连接
require_once 'ApiConfig.php';
$conn = new mysqli(DB_SERVER, DB_USERNAME, DB_PASSWORD, DB_NAME);
// 检查连接是否成功
if ($conn->connect_error) {
die("连接失败: " . $conn->connect_error);
}
// 查询数据库中符合条件的记录
$sql = "SELECT * FROM 用户已购课程 WHERE OpenID='$openid' AND 课程id='$courseid'";
$result1 = $conn->query($sql);
// 如果查询结果不为空,则进行二次查询
if ($result1->num_rows > 0) {
// 查询数据库的 视频课程数据 表
$sql2 = "SELECT * FROM 视频课程数据 WHERE 课程id='$courseid'";
$result2 = $conn->query($sql2);
if ($result2->num_rows > 0) {
// 获取查询结果
$data = array();
while ($row = $result2->fetch_assoc()) {
$data[] = $row;
}
echo json_encode(["result" => "播放数据", "PlayData" => $data]);
} else {
echo json_encode(["result" => "未找到播放数据!", "PlayData" => null]);
}
} else {
echo json_encode(["result" => "未找到购买记录!", "PlayData" => null]);
}
// 关闭数据库连接
$conn->close();
?>
+50
View File
@@ -0,0 +1,50 @@
<?php
// 前端传入的课程口令码
$courseCode = $_GET['CourseCode']; // 使用GET方法传入口令码
// 声明输出为JSON
header('Content-Type: application/json');
// 引用配置,建立数据库连接
require_once 'ApiConfig.php';
$conn = new mysqli(DB_SERVER, DB_USERNAME, DB_PASSWORD, DB_NAME);
// 检查连接是否成功
if ($conn->connect_error) {
die("连接失败: " . $conn->connect_error);
}
// 查询课程口令码表中符合条件的数据
$sql = "SELECT * FROM 课程口令码 WHERE 口令码 = '$courseCode'";
$result = $conn->query($sql);
// 检查是否有符合条件的数据
if ($result->num_rows > 0) {
$row = $result->fetch_assoc();
// 获取口令起始日期和口令结束日期
$startDate = strtotime($row['口令起始日期']);
$endDate = strtotime($row['口令结束日期']);
$now_time = date('Y-m-d H:i:s');
$current_time = strtotime($now_time);
// 比较口令日期
if ($startDate <= $current_time && $current_time <= $endDate) {
// 口令有效,输出课程id和课程字段
$output = array(
'课程id' => $row['课程id'],
'课程' => $row['课程']
);
echo json_encode($output);
} else {
// 口令失效
echo json_encode("口令失效");
}
} else {
// 没有找到符合条件的数据
echo json_encode("口令码不存在");
}
// 关闭数据库连接
$conn->close();
?>
+37
View File
@@ -0,0 +1,37 @@
<?php
//播放视频流程
//传入课程序号id
//用课程id换取视频数据 - 最终返回数据 - 播放视频
// 声明JSON内容类型
header('Content-Type: application/json');
// 获取传入的 OpenID 值
$index = $_GET['index'];
// 引用配置,建立数据库连接
require_once 'ApiConfig.php';
$conn = new mysqli(DB_SERVER, DB_USERNAME, DB_PASSWORD, DB_NAME);
// 检查连接是否成功
if ($conn->connect_error) {
die("连接失败: " . $conn->connect_error);
}
// 查询数据库的 免费视频课程数据 表
$sql2 = "SELECT * FROM 免费视频课程数据 WHERE 序号='$index'";
$result2 = $conn->query($sql2);
if ($result2->num_rows > 0) {
// 获取查询结果
$data = array();
while ($row = $result2->fetch_assoc()) { $data[] = $row; }
echo json_encode(["result" => "播放数据", "PlayData" => $data]);
} else {
echo json_encode(["result" => "未找到播放数据!", "PlayData" => null]);
}
// 关闭数据库连接
$conn->close();
?>
+33
View File
@@ -0,0 +1,33 @@
<?php
// 声明JSON内容类型
header('Content-Type: application/json');
// 引用配置,建立数据库连接
require_once 'ApiConfig.php';
$conn = new mysqli(DB_SERVER, DB_USERNAME, DB_PASSWORD, DB_NAME);
// 检查连接是否成功
if ($conn->connect_error) {
die("连接失败: " . $conn->connect_error);
}
// 查询数据库中符合条件的记录
$sql = "SELECT * FROM 首页课程列表";
$result1 = $conn->query($sql);
// 如果查询结果不为空,则进行二次查询
if ($result1->num_rows > 0) {
// 获取查询结果
$data = array();
while ($row = $result1->fetch_assoc()) {$data[] = $row;}
echo json_encode(["result" => "首页课程列表", "ListData" => $data]);
} else {
echo json_encode(["result" => "未找到课程列表!", "ListData" => null]);
}
// 关闭数据库连接
$conn->close();
?>
+33
View File
@@ -0,0 +1,33 @@
<?php
// 声明JSON内容类型
header('Content-Type: application/json');
// 引用配置,建立数据库连接
require_once 'ApiConfig.php';
$conn = new mysqli(DB_SERVER, DB_USERNAME, DB_PASSWORD, DB_NAME);
// 检查连接是否成功
if ($conn->connect_error) {
die("连接失败: " . $conn->connect_error);
}
// 查询数据库中符合条件的记录
$sql = "SELECT * FROM 首页免费课程列表";
$result1 = $conn->query($sql);
// 如果查询结果不为空,则进行二次查询
if ($result1->num_rows > 0) {
// 获取查询结果
$data = array();
while ($row = $result1->fetch_assoc()) {$data[] = $row;}
echo json_encode(["result" => "首页课程列表", "ListData" => $data]);
} else {
echo json_encode(["result" => "未找到课程列表!", "ListData" => null]);
}
// 关闭数据库连接
$conn->close();
?>
+80
View File
@@ -0,0 +1,80 @@
<?php
header('Content-Type: application/json');
// 引用配置,建立数据库连接
require_once 'ApiConfig.php';
// 接收前端传递的OpenID
$received_openid = isset($_GET['openid']) ? $_GET['openid'] : null;
if ($received_openid) {
// 创建数据库连接
$conn = new mysqli(DB_SERVER, DB_USERNAME, DB_PASSWORD, DB_NAME);
// 检查连接是否成功
if ($conn->connect_error) {
die(json_encode(["error" => "Database connection failed"]));
}
// 使用预处理语句查询
$stmt = $conn->prepare("SELECT * FROM 用户信息 WHERE OpenID = ?");
$stmt->bind_param("s", $received_openid);
$stmt->execute();
$result = $stmt->get_result();
// 检查查询是否成功
if ($result) {
if ($result->num_rows > 0) {
// 如果查询到记录,返回整条记录
$row = $result->fetch_assoc();
echo json_encode(["result" => "信息已经查询到", "data" => $row]);
} else {
// 如果没有查询到记录,执行插入操作
$insert_stmt = $conn->prepare("INSERT INTO 用户信息 (OpenID, 最后登录日期, 注册日期, HeadiconID) VALUES (?, NOW(), NOW(), 0)");
$insert_stmt->bind_param("s", $received_openid);
if ($insert_stmt->execute()) {
// 插入成功后再次查询
$stmt_after_insert = $conn->prepare("SELECT * FROM 用户信息 WHERE OpenID = ?");
$stmt_after_insert->bind_param("s", $received_openid);
$stmt_after_insert->execute();
$result_after_insert = $stmt_after_insert->get_result();
// 检查查询是否成功
if ($result_after_insert) {
if ($result_after_insert->num_rows > 0) {
// 如果查询到记录,返回整条记录
$row_after_insert = $result_after_insert->fetch_assoc();
echo json_encode(["result" => "新游客已经添加!", "data" => $row_after_insert]);
} else {
echo json_encode(["error" => "未找到插入后的记录"]);
}
// 关闭查询的预处理语句
$stmt_after_insert->close();
} else {
// 查询失败时的错误处理
echo json_encode(["error" => $conn->error]);
}
// 关闭插入的预处理语句
$insert_stmt->close();
} else {
echo json_encode(["error" => "Error inserting record"]);
}
}
} else {
// 查询失败时的错误处理
echo json_encode(["error" => $conn->error]);
}
// 关闭原始查询的预处理语句
$stmt->close();
// 关闭数据库连接
$conn->close();
} else {
echo json_encode(["error" => " 暂无数据!"]);
}
?>
+31
View File
@@ -0,0 +1,31 @@
<?php
header('Content-Type: application/json');
// 获取传入的 OpenID 值
$openid = $_GET['openid'];
// 引用配置,建立数据库连接
require_once 'ApiConfig.php';
$conn = new mysqli(DB_SERVER, DB_USERNAME, DB_PASSWORD, DB_NAME);
// 检查连接是否成功
if ($conn->connect_error) {
die("连接失败: " . $conn->connect_error);
}
// 查询数据库中符合条件的记录
$sql = "SELECT * FROM 用户信息 WHERE OpenID='$openid' AND 是否管理员='1'";
$result = $conn->query($sql);
if ($result->num_rows > 0) {
$sql2 = "SELECT * FROM 课程口令码";
$result2 = $conn->query($sql2);
if ($result2->num_rows > 0) {
// 获取查询结果
$data = array();
while ($row = $result2->fetch_assoc()) {$data[] = $row;}
echo json_encode(["result" => "获取成功", "Data" => $data]);
} else {echo json_encode(["result" => "口令码拉取失败", "Data" => null]);}
} else {echo json_encode(["result" => "无权访问", "Data" => null]);}
// 关闭数据库连接
$conn->close();
?>
+7
View File
@@ -0,0 +1,7 @@
<?php
// 生成一个随机的字符串或者使用你自己的字符串
$inputString = uniqid();
// 输出生成的哈希值作为uuid
echo $inputString;
?>
+31
View File
@@ -0,0 +1,31 @@
<?php
// 引用配置,建立数据库连接
require_once 'ApiConfig.php';
$conn = new mysqli(DB_SERVER, DB_USERNAME, DB_PASSWORD, DB_NAME);
// 检查连接是否成功
if ($conn->connect_error) {
die("连接失败: " . $conn->connect_error);
}
// 构建SQL查询语句
$sql = "SELECT * FROM 课程页面Tips WHERE id='0'";
// 执行查询
$result = $conn->query($sql);
if ($result->num_rows > 0) {
// 将结果转换为关联数组
$data = $result->fetch_all(MYSQLI_ASSOC);
// 输出JSON数据
header('Content-Type: application/json');
echo json_encode($data);
} else {
// 如果没有匹配的数据
header('Content-Type: application/json');
echo json_encode(array('message' => '没有找到匹配的数据'));
}
// 关闭数据库连接
$conn->close();
?>
+10
View File
@@ -0,0 +1,10 @@
<?php
// 生成一个随机的字符串或者使用你自己的字符串
$inputString = uniqid();
// 使用SHA-256算法计算哈希值
$hashedString = hash('sha256', $inputString);
// 输出生成的哈希值作为uuid
echo $hashedString;
?>
+41
View File
@@ -0,0 +1,41 @@
<?php
header('Content-Type: application/json');
// 引用配置,建立数据库连接
require_once 'ApiConfig.php';
$conn = new mysqli(DB_SERVER, DB_USERNAME, DB_PASSWORD, DB_NAME);
// 检查连接是否成功
if ($conn->connect_error) {
die(json_encode(["error" => "数据库连接失败"]));
}
// 接收前端传递的 OpenID
$received_openid = isset($_GET['openid']) ? $_GET['openid'] : null;
if ($received_openid) {
// 构建 SQL 查询字符串
$sql = "SELECT * FROM 用户已购课程 WHERE OpenID = '" . $received_openid . "'" . " ORDER BY `购课日期` DESC";
// 执行查询
$result = $conn->query($sql);
// 检查查询结果
if ($result->num_rows > 0) {
// 获取查询结果
$data = array();
while ($row = $result->fetch_assoc()) {
$data[] = $row;
}
// 将结果转换为 JSON 格式并输出
echo json_encode(["result" => "拥有课程信息已查询到", "data" => $data]);
} else {
echo json_encode(["result" => "拥有课程信息未查询到", "data" => null]);
}
} else {
echo json_encode(["error" => "未提供 OpenID"]);
}
// 关闭数据库连接
$conn->close();
?>
+29
View File
@@ -0,0 +1,29 @@
<?php
$code = $_GET['code']; // 通过GET方式获取前端传递的code参数,code用户登录凭证(有效期五分钟)
$appid = 'wx51f97927435d11b9'; // 替换成你的小程序的AppID
$appsecret = '2e65080a1cc32d546f7c8bcb671a6a5d'; // 替换成你的小程序的AppSecret
$url = "https://api.weixin.qq.com/sns/jscode2session?appid=$appid&secret=$appsecret&js_code=$code&grant_type=authorization_code";
// 使用curl发送请求
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // 不验证SSL证书,部署时建议验证
$output = curl_exec($ch);
curl_close($ch);
$result = json_decode($output, true);
// 获取openid
$openid = $result['openid'];
// 输出openid(你可以根据实际需求进行其他处理)
echo $openid;
// 或者直接将从微信服务器获取到的JSON数据返回给小程序
//echo $output;
?>
+29
View File
@@ -0,0 +1,29 @@
<?php
$code = $_GET['code']; // 通过GET方式获取前端传递的code参数,code用户登录凭证(有效期五分钟)
$appid = 'wx3fbaf897825bf04f'; // 替换成你的小程序的AppID
$appsecret = '93b58209e014c9f151ac5f057b16ca33'; // 替换成你的小程序的AppSecret
$url = "https://api.weixin.qq.com/sns/jscode2session?appid=$appid&secret=$appsecret&js_code=$code&grant_type=authorization_code";
// 使用curl发送请求
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // 不验证SSL证书,部署时建议验证
$output = curl_exec($ch);
curl_close($ch);
$result = json_decode($output, true);
// 获取openid
$openid = $result['openid'];
// 输出openid(你可以根据实际需求进行其他处理)
echo $openid;
// 或者直接将从微信服务器获取到的JSON数据返回给小程序
//echo $output;
?>
+43
View File
@@ -0,0 +1,43 @@
<?php
// 声明JSON内容类型
header('Content-Type: application/json');
// 引用配置,建立数据库连接
require_once 'ApiConfig.php';
$conn = new mysqli(DB_SERVER, DB_USERNAME, DB_PASSWORD, DB_NAME);
// 检查连接是否成功
if ($conn->connect_error) {
die("连接失败: " . $conn->connect_error);
}
// 获取前端传入的页码,默认为1
$page = isset($_GET['page']) ? intval($_GET['page']) : 1;
// 计算查询起始位置
$offset = ($page - 1) * 10;
// 构建SQL查询语句
$sql = "SELECT * FROM 网页列表 ORDER BY 网页id DESC LIMIT $offset, 10";
// 执行查询
$result = $conn->query($sql);
// 处理查询结果
if ($result->num_rows > 0) {
// 将查询结果转换为关联数组
$rows = array();
while ($row = $result->fetch_assoc()) {
$rows[] = $row;
}
// 输出JSON
echo json_encode($rows);
} else {
// 没有结果时输出空数组
echo json_encode(null);
}
// 关闭数据库连接
$conn->close();
?>
+68
View File
@@ -0,0 +1,68 @@
<?php
// 获取用户名昵称信息
$username1 = $_GET['username'];
// 获取传入的 OpenID 值
$openid = $_GET['openid'];
// 引用配置,建立数据库连接
require_once 'ApiConfig.php';
$conn = new mysqli(DB_SERVER, DB_USERNAME, DB_PASSWORD, DB_NAME);
// 检查连接是否成功
if ($conn->connect_error) {
die("连接失败: " . $conn->connect_error);
}
// 查询数据库中符合条件的记录
$sql = "SELECT * FROM 用户信息 WHERE OpenID='$openid'";
$result = $conn->query($sql);
// 如果查询结果不为空,则更新记录中的用户名字段
if ($result->num_rows > 0) {
// 更新用户名字段为 '我的名字'
$update_sql = "UPDATE `用户信息` SET `用户名`='$username1',`是否登录`='1' ,`最后登录日期`=NOW() WHERE OpenID='$openid'";
if ($conn->query($update_sql) === TRUE) {
echo "记录更新成功";
$row = $result->fetch_assoc();
$userId = $row['YelayMaths_ID'];
if (empty($userId)) {
// 生成一个随机的字符串或者使用你自己的字符串
$inputString = uniqid();
// 使用SHA-256算法计算哈希值
$hashedString = hash('sha256', $inputString);
$update_sql = "UPDATE `用户信息` SET `YelayMaths_ID`='$hashedString' WHERE OpenID='$openid'";
if ($conn->query($update_sql) === TRUE) {echo "YelayMaths_ID更新成功";}
}
} else {
echo "更新记录时出错: " . $conn->error;
}
} else {
echo "未找到符合条件的记录";
}
// 关闭数据库连接
$conn->close();
// 可以继续处理其他表单数据,比如保存用户名到数据库等
?>
+34
View File
@@ -0,0 +1,34 @@
<?php
// 引用配置,建立数据库连接
require_once 'ApiConfig.php';
$conn = new mysqli(DB_SERVER, DB_USERNAME, DB_PASSWORD, DB_NAME);
// 检查连接是否成功
if ($conn->connect_error) {
die("连接失败: " . $conn->connect_error);
}
// 获取传入的 OpenID 值
$openid = $_GET['openid'];
// 查询数据库中符合条件的记录
$sql = "SELECT * FROM 用户信息 WHERE OpenID='$openid'";
$result = $conn->query($sql);
// 如果查询结果不为空,则更新记录中的用户名字段
if ($result->num_rows > 0) {
// 更新用户名字段为 '我的名字'
$update_sql = "UPDATE `用户信息` SET `是否登录`= null WHERE OpenID='$openid'";
if ($conn->query($update_sql) === TRUE) {
echo "退出成功";
} else {
echo "更新记录时出错: " . $conn->error;
}
} else {
echo "未找到符合条件的记录";
}
// 关闭数据库连接
$conn->close();
?>
+110
View File
@@ -0,0 +1,110 @@
<?php
//播放视频流程
//传入openid、口令码
//查询数据库中课程对应口令码
//用口令码注册课程 返回拥有的课程
//认证失败 返回null
// 声明JSON内容类型
header('Content-Type: application/json');
// 获取传入的 OpenID 值
$openid = $_GET['openid'];
// 获取传入的 课程ID 值
$passwordcode = $_GET['PasswordCode'];
// 引用配置,建立数据库连接
require_once 'ApiConfig.php';
$conn = new mysqli(DB_SERVER, DB_USERNAME, DB_PASSWORD, DB_NAME);
$result1_end_data=null;
$courseid=null;
$coursename=null;
$courseinfo=null;
$result1_end_data=null;
$coursedate=null;
$returndata=null;
$codecount=null;
// 检查连接是否成功
if ($conn->connect_error) {
die("连接失败: " . $conn->connect_error);
}
//查询用户是否存在
$sql00 = "SELECT * FROM 用户信息 WHERE OpenID='$openid'";
$result00 = $conn->query($sql00);
if ($result00->num_rows > 0){
// 用户存在 则查询数据库中符合条件的记录
$sql = "SELECT * FROM 课程口令码 WHERE 口令码='$passwordcode' AND 剩余有效次数 > 0";
$result1 = $conn->query($sql);
// 如果查询结果不为空,则进行二次查询
if ($result1->num_rows > 0) {
$row1 = $result1->fetch_assoc();
$result1_end_data=$row1['口令结束日期'];
$courseid= $row1['课程id'];
$coursename= $row1['课程'];
$courseinfo= $row1['课程介绍'];
$codecount= $row1['剩余有效次数'];
//$coursedate= $row1['购课日期'];
// 获取当前时间戳
$currentDateTime = strtotime(date('Y-m-d H:i:s'));
// 将口令结束日期转换为时间戳
$endTime = strtotime($result1_end_data);
// 查询数据库的 用户已购课程 表
$sql2 = "SELECT * FROM 用户已购课程 WHERE OpenID='$openid' AND 课程id='$courseid'";
$result2 = $conn->query($sql2);
//用户已经购买了课程
if ($result2->num_rows > 0) {
// 这里返回提示即可
echo json_encode(["result" => "成功", "Data" => "您已购买该课程!", "ReturnData" => $returndata]);
} else if (($result2->num_rows === 0)&&($currentDateTime < $endTime)) {
//用户未购买课程 验证日期有效性后添加信息即可
$sql3="INSERT INTO 用户已购课程 (OpenID, 课程id, 课程, 课程介绍, 购课日期) VALUES ('$openid','$courseid','$coursename','$courseinfo', NOW())";
if ($conn->query($sql3) === TRUE) {
//口令码有效次数减 1 操作
$codecount=$codecount-1;
$sql5 = "UPDATE `课程口令码` SET `剩余有效次数` = '$codecount' WHERE `口令码` = '$passwordcode'";
$result5 = $conn->query($sql5);
//查询插入后的信息
$sql4 = "SELECT * FROM 用户已购课程 WHERE OpenID='$openid'";
$result4 = $conn->query($sql4);
if ($result4->num_rows > 0) {
// 这里返回所有已经购买的课程
$data = array();
while ($row = $result4->fetch_assoc()) {
$data[] = $row;
};
$returndata = $data;
echo json_encode(["result" => "添加成功!", "Data" => "课程添加成功", "ReturnData" => $returndata]);
} else {
echo json_encode(["result" => "插入信息查询失败!", "Data" => "课程添加成功", "ReturnData" => $returndata]);
}
} else {
echo json_encode(["result" => "添加失败!", "Data" => "课程添加失败", "ReturnData" => $returndata]);
};
} else {
echo json_encode(["result" => "失败", "Data" => "口令码已失效", "ReturnData" => $returndata]);};
} else {
echo json_encode(["result" => "失败", "Data" => "口令码无效", "ReturnData" => $returndata]);
}
} else {
echo json_encode(["result" => "失败", "Data" => "该用户不存在", "ReturnData" => $returndata]);
};
// 关闭数据库连接
$conn->close();
?>
+38
View File
@@ -0,0 +1,38 @@
<?php
// 引入自动加载文件(如果使用手动下载的库,路径可能需要调整)
require '../vendor/autoload.php';
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\SMTP;
use PHPMailer\PHPMailer\Exception;
// 创建邮件实例
$mail = new PHPMailer(true); // true 参数用于启用异常
try {
// ============ 1. 服务器配置 ============
$mail->isSMTP(); // 使用 SMTP 协议
$mail->Host = 'smtp.163.com'; // SMTP 服务器地址 (以QQ邮箱为例)
$mail->SMTPAuth = true; // 开启 SMTP 认证
$mail->Username = 'yeomai@163.com'; // 发件人邮箱账号
$mail->Password = 'RGVYUVezAEKRBdE8'; // 发件人邮箱授权码 (注意:不是登录密码!)
$mail->SMTPSecure = PHPMailer::ENCRYPTION_SMTPS; // 开启加密,QQ邮箱用 'ssl',Gmail 常用 'tls'
$mail->Port = 465; // 端口 (SSL:465, TLS:587)
// ============ 2. 发件人和收件人 ============
$mail->setFrom('yeomai@163.com', 'Yeomai'); // 发件人
$mail->addAddress('1181558906@qq.com', 'PHP_Test'); // 收件人
// $mail->addReplyTo('replyto@example.com', '回复地址'); // 可选:回复地址
// ============ 3. 邮件内容 ============
$mail->isHTML(true); // 设置邮件格式为 HTML
$mail->Subject = '这是一封测试邮件'; // 邮件主题
$mail->Body = '<h1>你好,这是一封来自 PHPMailer 的测试邮件!</h1><p>支持 HTML 格式。</p>'; // HTML 内容
$mail->AltBody = '你好,这是一封来自 PHPMailer 的测试邮件!(纯文本内容)'; // 纯文本备用内容
// ============ 4. 发送邮件 ============
$mail->send();
echo ' 邮件发送成功';
} catch (Exception $e) {
echo " 邮件发送失败: {$mail->ErrorInfo}";
}
+41
View File
@@ -0,0 +1,41 @@
<?php
// 引用配置,建立数据库连接
require_once 'ApiConfig.php';
$conn = new mysqli(DB_SERVER, DB_USERNAME, DB_PASSWORD, DB_NAME);
// 检查连接是否成功
if ($conn->connect_error) {
die("连接失败: " . $conn->connect_error);
}
// 获取前端传入的页码
if (isset($_GET['page'])) {
$pageNumber = $_GET['page'];
// 构建SQL查询语句
$sql = "SELECT * FROM 网页数据 WHERE 网页id = '$pageNumber' ORDER BY 顺序id ASC";
// 执行查询
$result = $conn->query($sql);
if ($result->num_rows > 0) {
// 将结果转换为关联数组
$data = $result->fetch_all(MYSQLI_ASSOC);
// 输出JSON数据
header('Content-Type: application/json');
echo json_encode($data);
} else {
// 如果没有匹配的数据
header('Content-Type: application/json');
echo json_encode(array('message' => '没有找到匹配的数据'));
}
} else {
// 如果未提供页码参数
header('Content-Type: application/json');
echo json_encode(array('message' => '未提供页码参数'));
}
// 关闭数据库连接
$conn->close();
?>
@@ -0,0 +1 @@
由于文件夹过于庞大,具体文件放在https://api.yeomai.site/Course中,均为静态文件,网络可访问
@@ -0,0 +1 @@
由于文件夹过于庞大,具体文件放在https://api.yeomai.site/FreeVideos中,均为静态文件,网络可访问
Binary file not shown.

After

Width:  |  Height:  |  Size: 363 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 135 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 273 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 259 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 220 KiB

View File
Whitespace-only changes.
Binary file not shown.

After

Width:  |  Height:  |  Size: 64 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 59 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 92 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 91 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB

Loaded 100 of 971 files, more files were not shown because too many files have changed in this diff. Show more