v1.0.51: 批次1架构筑基 - 1)版本迁移(common/migrate.php+schema_versions+natsort迁移文件);2)登录安全(bcrypt平滑迁移login/user_add/user_update旧sha1命中自动重写+system_login_attempts限流+session加固httponly/samesite/secure);3)CSRF Token(服务端checkCsrf+auth/csrf.php登录页取token+前端common.js/login.js统一携带X-CSRF-Token);4)统一基座common/Api.php并存量强制迁移全部70个endpoint(Api::boot按public/super/module/permissions分流,写接口强制checkAjax+checkCsrf,全局异常处理);5)前端收敛(common.js新增esc转义别名);6)REV-4硬数据来源渠道可编辑(hard_update+补全弹窗下拉);7)prepared卫生(soft_update.php修复+analysis.php表名白名单REV-9)

Co-Authored-By: Claude Code <noreply@anthropic.com>
This commit is contained in:
qianqiuwanzi
2026-09-17 14:48:17 +08:00
parent 69fd4246c2
commit c86f08c325
91 changed files with 1072 additions and 463 deletions
+2 -10
View File
@@ -4,17 +4,9 @@
* 必填:full_name;union_id 为空时自动生成。
* 可选:contacts(JSON 数组,如 [{"platform":"email","account_id":"a@b.com","is_primary":1}])
*/
require_once __DIR__ . '/../common/db.php';
require_once __DIR__ . '/../common/response.php';
require_once __DIR__ . '/../common/auth.php';
require_once __DIR__ . '/../common/logger.php';
require_once __DIR__ . '/../common/helpers.php';
require_once __DIR__ . '/../common/completeness.php';
require_once __DIR__ . '/../common/duplicate_check.php';
require_once __DIR__ . '/../common/validate.php';
require_once __DIR__ . '/../common/Api.php';
$pdo = Api::boot(['module' => 'person']);
checkAjax();
checkPermission('person');
$data = extractFields(PERSON_FIELDS);
if (empty($data['full_name'])) {
+2 -4
View File
@@ -4,11 +4,9 @@
* 入参:person_id(必填)/ page / limit
* 返回:该人员任职的公司列表(公司名称/部门/岗位/职级/入职日期/是否在岗)
*/
require_once __DIR__ . '/../common/db.php';
require_once __DIR__ . '/../common/response.php';
require_once __DIR__ . '/../common/auth.php';
require_once __DIR__ . '/../common/Api.php';
$pdo = Api::boot(['module' => 'person']);
checkPermission('person');
$personId = (int)($_REQUEST['person_id'] ?? 0);
if ($personId <= 0) {
+2 -4
View File
@@ -4,11 +4,9 @@
* 返回启用中的企业(id + 显示名称),供人员「工作履历」行内公司下拉使用
* 入参:keyword(可选,模糊匹配企业名称)/ limit(默认 500)
*/
require_once __DIR__ . '/../common/db.php';
require_once __DIR__ . '/../common/response.php';
require_once __DIR__ . '/../common/auth.php';
require_once __DIR__ . '/../common/Api.php';
$pdo = Api::boot(['module' => 'person']);
checkPermission('person');
$keyword = trim($_REQUEST['keyword'] ?? '');
$limit = min(1000, max(1, (int)($_REQUEST['limit'] ?? 500)));
+2 -4
View File
@@ -12,11 +12,9 @@
* 入参:person_id(必填)/ limit(默认 50)
* 返回:{ list: [{id, full_name, phone, tags:[老乡,校友,同事], intimacy}] }
*/
require_once __DIR__ . '/../common/db.php';
require_once __DIR__ . '/../common/response.php';
require_once __DIR__ . '/../common/auth.php';
require_once __DIR__ . '/../common/Api.php';
$pdo = Api::boot(['module' => 'person']);
checkPermission('person');
$personId = (int)($_REQUEST['person_id'] ?? 0);
if ($personId <= 0) {
+2 -6
View File
@@ -3,13 +3,9 @@
* 人员删除接口(软删除) POST /api/person/delete.php
* 入参:id(或 ids 逗号分隔批量)
*/
require_once __DIR__ . '/../common/db.php';
require_once __DIR__ . '/../common/response.php';
require_once __DIR__ . '/../common/auth.php';
require_once __DIR__ . '/../common/logger.php';
require_once __DIR__ . '/../common/Api.php';
$pdo = Api::boot(['module' => 'person']);
checkAjax();
checkPermission('person');
$id = (int)($_POST['id'] ?? 0);
$ids = trim($_POST['ids'] ?? '');
+2 -4
View File
@@ -3,11 +3,9 @@
* 人员详情接口 GET /api/person/detail.php?id=1
* v1.0.16:联系方式改为“手机”“邮箱”两字段(仅常用);另有全部账号列表 accounts 供编辑回显
*/
require_once __DIR__ . '/../common/db.php';
require_once __DIR__ . '/../common/response.php';
require_once __DIR__ . '/../common/auth.php';
require_once __DIR__ . '/../common/Api.php';
$pdo = Api::boot(['module' => 'person']);
checkPermission('person');
$id = (int)($_REQUEST['id'] ?? 0);
if ($id <= 0) {
+2 -5
View File
@@ -3,12 +3,9 @@
* 人员导出接口(CSV) GET/POST /api/person/export.php
* 参数同 list.php
*/
require_once __DIR__ . '/../common/db.php';
require_once __DIR__ . '/../common/response.php';
require_once __DIR__ . '/../common/auth.php';
require_once __DIR__ . '/../common/logger.php';
require_once __DIR__ . '/../common/Api.php';
$pdo = Api::boot(['module' => 'person']);
checkPermission('person');
// 仅导出勾选的人员
$idsRaw = trim($_REQUEST['ids'] ?? '');
+2 -7
View File
@@ -5,14 +5,9 @@
* graduated_from,hometown,work_location,phone,email,source_channel,source_detail
* 仅 full_name 必填;union_id 留空自动生成;phone/email 写入 social_accounts(默认常用)。
*/
require_once __DIR__ . '/../common/db.php';
require_once __DIR__ . '/../common/response.php';
require_once __DIR__ . '/../common/auth.php';
require_once __DIR__ . '/../common/logger.php';
require_once __DIR__ . '/../common/completeness.php';
require_once __DIR__ . '/../common/Api.php';
$pdo = Api::boot(['module' => 'person']);
checkAjax();
checkPermission('person');
if (empty($_FILES['file']) || $_FILES['file']['error'] !== UPLOAD_ERR_OK) {
Response::error('请选择要上传的CSV文件', 400);
+2 -4
View File
@@ -5,11 +5,9 @@
* 返回:{ list, total, page, limit }
* v1.0.16:联系方式列改为“手机”“邮箱”两个字段(仅返回常用:is_defult=1 优先,其次 is_primary=1)
*/
require_once __DIR__ . '/../common/db.php';
require_once __DIR__ . '/../common/response.php';
require_once __DIR__ . '/../common/auth.php';
require_once __DIR__ . '/../common/Api.php';
$pdo = Api::boot(['module' => 'person']);
checkPermission('person');
[$page, $limit] = pageParams();
$keyword = trim($_REQUEST['keyword'] ?? '');
+2 -4
View File
@@ -4,11 +4,9 @@
* 入参:person_id(必填)/ page / limit
* 数据源:该人员任职公司的产品品类(去重)
*/
require_once __DIR__ . '/../common/db.php';
require_once __DIR__ . '/../common/response.php';
require_once __DIR__ . '/../common/auth.php';
require_once __DIR__ . '/../common/Api.php';
$pdo = Api::boot(['module' => 'person']);
checkPermission('person');
$personId = (int)($_REQUEST['person_id'] ?? 0);
if ($personId <= 0) {
+2 -10
View File
@@ -3,17 +3,9 @@
* 人员编辑接口 POST /api/person/update.php
* 入参:id + 白名单字段;可选 contacts(JSON 数组,整体替换联系方式)
*/
require_once __DIR__ . '/../common/db.php';
require_once __DIR__ . '/../common/response.php';
require_once __DIR__ . '/../common/auth.php';
require_once __DIR__ . '/../common/logger.php';
require_once __DIR__ . '/../common/helpers.php';
require_once __DIR__ . '/../common/completeness.php';
require_once __DIR__ . '/../common/duplicate_check.php';
require_once __DIR__ . '/../common/validate.php';
require_once __DIR__ . '/../common/Api.php';
$pdo = Api::boot(['module' => 'person']);
checkAjax();
checkPermission('person');
$id = (int)($_POST['id'] ?? 0);
if ($id <= 0) {