后台审核

master
lion 2 days ago
parent d4d827d959
commit 95988f1739

@ -26,7 +26,10 @@ class CourseRegistrationExport implements FromArray, WithEvents
$baseFields += ['company_name_snapshot' => '报名公司', 'replacement_text' => '报名更换记录', 'giveup_reason' => '放弃原因', 'replaced_at' => '更换时间'];
break;
}
foreach (['id' => '报名ID'] + $baseFields as $key => $name) $this->columns[] = ['base' => $key, 'name' => $name];
$identityColumns = ['id' => '报名ID', 'user.username' => '注册姓名', 'user.mobile' => '注册手机号'];
foreach ($identityColumns + $baseFields as $key => $name) {
$this->columns[] = ['base' => $key, 'name' => $name];
}
$fields = [];
foreach (array_merge($current, ...array_map(fn ($row) => is_array($row['data'] ?? null) ? $row['data'] : [], $rows)) as $field) {
if (!is_array($field) || !isset($field['field'])) continue;
@ -47,7 +50,14 @@ class CourseRegistrationExport implements FromArray, WithEvents
$answers = CourseFormSchema::display(is_array($row['data'] ?? null) ? $row['data'] : []);
$cells = [];
foreach ($this->columns as $column) {
if (isset($column['base'])) { $value = data_get($row, $column['base']); $cells[] = is_scalar($value) ? (string) $value : ''; continue; }
if (isset($column['base'])) {
$value = data_get($row, $column['base']);
if ($column['base'] === 'user.username' && trim((string) $value) === '') {
$value = data_get($row, 'user.name');
}
$cells[] = is_scalar($value) ? (string) $value : '';
continue;
}
$matches = array_values(array_filter($answers, fn ($answer) => ($answer['field'] ?? null) === $column['field'] && ($answer['name'] ?? $answer['field']) === $column['title']));
$answer = $matches[0] ?? [];
$value = !empty($answer['hidden']) ? '' : ($answer[!empty($column['notes']) ? 'supplement_text' : 'display_value'] ?? '');

@ -301,6 +301,7 @@ class CourseController extends CommonController
try {
$fields = \App\Services\Course\CourseFormSchema::definitions($course->id);
$all['data'] = \App\Services\Course\CourseFormSchema::normalize($fields, $all['data']);
\App\Services\Course\CourseFormSchema::assertIdentityAnswers($fields, $all['data'], $this->getUser());
$all['change_data'] = \App\Services\Course\CourseFormSchema::changes($all['data'], $this->getUser());
$all['is_change'] = $all['change_data'] ? 1 : 0;
} catch (\InvalidArgumentException $error) {
@ -595,6 +596,7 @@ class CourseController extends CommonController
try {
$fields = \App\Services\Course\CourseFormSchema::definitions($signModel->course_id, $signModel);
$updates['data'] = \App\Services\Course\CourseFormSchema::normalize($fields, $all['data'], $signModel->data ?: []);
\App\Services\Course\CourseFormSchema::assertIdentityAnswers($fields, $updates['data'], $this->getUser());
$updates['form_snapshot'] = $signModel->form_snapshot ?: ['version' => 2, 'fields' => $fields];
$updates['change_data'] = \App\Services\Course\CourseFormSchema::changes($updates['data'], $this->getUser());
$updates['is_change'] = $updates['change_data'] ? 1 : 0;

@ -168,6 +168,24 @@ class UserController extends CommonController
{
$all = \request()->except(['id', 'mobile', 'openid', 'survey_id']);
$model = User::find($this->getUserId());
$registeredName = trim((string) ($model->username ?: $model->name));
foreach (['username', 'name'] as $field) {
if ($registeredName !== '' && array_key_exists($field, $all)
&& preg_replace('/\s+/u', '', (string) $all[$field]) !== preg_replace('/\s+/u', '', $registeredName)) {
return $this->fail([ResponseCode::ERROR_PARAMETER, '姓名一经注册填写不可更改']);
}
}
if ($registeredName !== '') {
unset($all['username'], $all['name']);
}
if (request()->boolean('registration') || !empty($all['idcard'])) {
$all['idcard'] = strtoupper(trim((string) ($all['idcard'] ?? '')));
if (!preg_match('/^(\d{15}|\d{17}[\dX])$/D', $all['idcard'])) {
return $this->fail([ResponseCode::ERROR_PARAMETER, '请输入有效的身份证号']);
}
}
unset($all['registration']);
if (array_key_exists('headimgurl', $all) && $all['headimgurl'] !== $model->headimgurl) {
try { app(\App\Services\ContentSecurity\AvatarCheck::class)->assertApproved($model->id, (string) $all['headimgurl']); }
catch (\InvalidArgumentException $e) { return $this->fail([ResponseCode::ERROR_BUSINESS, $e->getMessage()]); }

@ -150,6 +150,29 @@ class CourseFormSchema
return $answers;
}
public static function assertIdentityAnswers(array $fields, array $data, $user): void
{
$activeFields = array_column($fields, 'field');
foreach ($data as $answer) {
if (!in_array($answer['field'] ?? '', $activeFields, true) || !empty($answer['readonly'])) {
continue;
}
$field = $answer['belong_user_table'] ?? $answer['field'] ?? '';
if (!empty($answer['hidden']) || !in_array($field, ['username', 'name', 'idcard'], true)) {
continue;
}
$expected = $field === 'idcard' ? $user->idcard : ($user->username ?: $user->name);
$expected = trim((string) $expected);
$actual = trim((string) ($answer['value'] ?? ''));
if ($expected === '') {
throw new InvalidArgumentException('请先在个人资料中完善' . $answer['name']);
}
if (strcasecmp($expected, $actual) !== 0) {
throw new InvalidArgumentException($answer['name'] . '须与当前账号档案一致');
}
}
}
public static function changes(array $data, $user): array
{
$changes = [];

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long
Loading…
Cancel
Save