旧版服务端
No files matched your search
@@ -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…` | 梁老师中考数学二轮满分冲刺(视频+讲义) |
|
||||
|
||||
@@ -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
|
||||
@@ -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();
|
||||
?>
|
||||
@@ -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();
|
||||
?>
|
||||
@@ -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" => " 暂无数据!"]);
|
||||
}
|
||||
?>
|
||||
@@ -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();
|
||||
?>
|
||||
@@ -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();
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
// 可以继续处理其他表单数据,比如保存用户名到数据库等
|
||||
?>
|
||||
|
||||
|
||||
|
||||
@@ -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!";
|
||||
}
|
||||
|
||||
// 可以继续处理其他表单数据,比如保存用户名到数据库等
|
||||
?>
|
||||
|
||||
|
||||
|
||||
@@ -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');
|
||||
?>
|
||||
@@ -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();
|
||||
?>
|
||||
@@ -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();
|
||||
?>
|
||||
@@ -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();
|
||||
?>
|
||||
@@ -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();
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
// 可以继续处理其他表单数据,比如保存用户名到数据库等
|
||||
?>
|
||||
|
||||
|
||||
|
||||
@@ -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();
|
||||
?>
|
||||
@@ -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();
|
||||
?>
|
||||
@@ -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();
|
||||
?>
|
||||
@@ -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();
|
||||
?>
|
||||
@@ -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();
|
||||
?>
|
||||
@@ -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" => " 暂无数据!"]);
|
||||
}
|
||||
?>
|
||||
@@ -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();
|
||||
?>
|
||||
@@ -0,0 +1,7 @@
|
||||
<?php
|
||||
// 生成一个随机的字符串或者使用你自己的字符串
|
||||
$inputString = uniqid();
|
||||
|
||||
// 输出生成的哈希值作为uuid
|
||||
echo $inputString;
|
||||
?>
|
||||
@@ -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();
|
||||
?>
|
||||
@@ -0,0 +1,10 @@
|
||||
<?php
|
||||
// 生成一个随机的字符串或者使用你自己的字符串
|
||||
$inputString = uniqid();
|
||||
|
||||
// 使用SHA-256算法计算哈希值
|
||||
$hashedString = hash('sha256', $inputString);
|
||||
|
||||
// 输出生成的哈希值作为uuid
|
||||
echo $hashedString;
|
||||
?>
|
||||
@@ -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();
|
||||
?>
|
||||
@@ -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;
|
||||
?>
|
||||
@@ -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;
|
||||
?>
|
||||
@@ -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();
|
||||
?>
|
||||
@@ -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();
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
// 可以继续处理其他表单数据,比如保存用户名到数据库等
|
||||
?>
|
||||
|
||||
|
||||
|
||||
@@ -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();
|
||||
?>
|
||||
@@ -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();
|
||||
?>
|
||||
@@ -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}";
|
||||
}
|
||||
@@ -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中,均为静态文件,网络可访问
|
||||
|
After Width: | Height: | Size: 363 KiB |
|
After Width: | Height: | Size: 37 KiB |
|
After Width: | Height: | Size: 135 KiB |
|
After Width: | Height: | Size: 273 KiB |
|
After Width: | Height: | Size: 259 KiB |
|
After Width: | Height: | Size: 220 KiB |
|
After Width: | Height: | Size: 64 KiB |
|
After Width: | Height: | Size: 59 KiB |
|
After Width: | Height: | Size: 92 KiB |
|
After Width: | Height: | Size: 36 KiB |
|
After Width: | Height: | Size: 91 KiB |
|
After Width: | Height: | Size: 36 KiB |
|
After Width: | Height: | Size: 4.5 KiB |
|
After Width: | Height: | Size: 7.2 KiB |
|
After Width: | Height: | Size: 8.9 KiB |
|
After Width: | Height: | Size: 10 KiB |
|
After Width: | Height: | Size: 7.1 KiB |
|
After Width: | Height: | Size: 11 KiB |
|
After Width: | Height: | Size: 8.8 KiB |
|
After Width: | Height: | Size: 10 KiB |
|
After Width: | Height: | Size: 7.7 KiB |
|
After Width: | Height: | Size: 7.6 KiB |
|
After Width: | Height: | Size: 15 KiB |
|
After Width: | Height: | Size: 5.5 KiB |
|
After Width: | Height: | Size: 9.9 KiB |
|
After Width: | Height: | Size: 11 KiB |
|
After Width: | Height: | Size: 15 KiB |
|
After Width: | Height: | Size: 7.1 KiB |
|
After Width: | Height: | Size: 12 KiB |
|
After Width: | Height: | Size: 8.0 KiB |
|
After Width: | Height: | Size: 7.2 KiB |
|
After Width: | Height: | Size: 6.6 KiB |
|
After Width: | Height: | Size: 6.4 KiB |
|
After Width: | Height: | Size: 11 KiB |
|
After Width: | Height: | Size: 9.4 KiB |
|
After Width: | Height: | Size: 9.9 KiB |
|
After Width: | Height: | Size: 9.2 KiB |
|
After Width: | Height: | Size: 8.2 KiB |
|
After Width: | Height: | Size: 11 KiB |
|
After Width: | Height: | Size: 8.9 KiB |
|
After Width: | Height: | Size: 5.5 KiB |
|
After Width: | Height: | Size: 8.0 KiB |
|
After Width: | Height: | Size: 7.2 KiB |
|
After Width: | Height: | Size: 10 KiB |
|
After Width: | Height: | Size: 6.8 KiB |
|
After Width: | Height: | Size: 9.0 KiB |
|
After Width: | Height: | Size: 14 KiB |
|
After Width: | Height: | Size: 7.3 KiB |
|
After Width: | Height: | Size: 7.9 KiB |
|
After Width: | Height: | Size: 11 KiB |
|
After Width: | Height: | Size: 14 KiB |
|
After Width: | Height: | Size: 13 KiB |
|
After Width: | Height: | Size: 19 KiB |
|
After Width: | Height: | Size: 13 KiB |
|
After Width: | Height: | Size: 10 KiB |
|
After Width: | Height: | Size: 13 KiB |
|
After Width: | Height: | Size: 15 KiB |
|
After Width: | Height: | Size: 12 KiB |
|
After Width: | Height: | Size: 13 KiB |
|
After Width: | Height: | Size: 10 KiB |
|
After Width: | Height: | Size: 12 KiB |
|
After Width: | Height: | Size: 12 KiB |
|
After Width: | Height: | Size: 14 KiB |
|
After Width: | Height: | Size: 13 KiB |
|
After Width: | Height: | Size: 3.4 KiB |