baseCRUD() ->filterTogglable(false) ->headerToolbar([ $this->createButton('dialog'), ...$this->baseHeaderToolBar() ]) ->columns([ amis()->TableColumn('id', 'ID')->sortable(), amis()->TableColumn('coach_id', '技师编号'), amis()->TableColumn('nickname', '昵称'), amis()->TableColumn('avatar', '头像'), amis()->TableColumn('gender', '性别'), amis()->TableColumn('mobile', '服务电话'), amis()->TableColumn('birthday', '出生日期'), amis()->TableColumn('work_years', '从业年份')->sortable(), amis()->TableColumn('intention_city', '意向城市'), amis()->TableColumn('introduction', '个人简介'), amis()->TableColumn('auditor', '审核人'), amis()->TableColumn('audit_time', '审核时间'), amis()->TableColumn('audit_remark', '审核回执'), amis()->TableColumn('state', '状态'), amis()->TableColumn('created_at', admin_trans('admin.created_at'))->type('datetime')->sortable(), amis()->TableColumn('updated_at', admin_trans('admin.updated_at'))->type('datetime')->sortable(), $this->rowActions('dialog') ]); return $this->baseList($crud); } public function form($isEdit = false) { return $this->baseForm()->body([ amis()->TextControl('coach_id', '技师编号'), amis()->TextControl('nickname', '昵称'), amis()->TextControl('avatar', '头像'), amis()->TextControl('gender', '性别'), amis()->TextControl('mobile', '服务电话'), amis()->TextControl('birthday', '出生日期'), amis()->TextControl('work_years', '从业年份'), amis()->TextControl('intention_city', '意向城市'), amis()->TextControl('introduction', '个人简介'), amis()->TextControl('auditor', '审核人'), amis()->TextControl('audit_time', '审核时间'), amis()->TextControl('audit_remark', '审核回执'), amis()->TextControl('state', '状态'), ]); } public function detail() { return $this->baseDetail()->body([ amis()->TextControl('id', 'ID')->static(), amis()->TextControl('coach_id', '技师编号')->static(), amis()->TextControl('nickname', '昵称')->static(), amis()->TextControl('avatar', '头像')->static(), amis()->TextControl('gender', '性别')->static(), amis()->TextControl('mobile', '服务电话')->static(), amis()->TextControl('birthday', '出生日期')->static(), amis()->TextControl('work_years', '从业年份')->static(), amis()->TextControl('intention_city', '意向城市')->static(), amis()->TextControl('introduction', '个人简介')->static(), amis()->TextControl('auditor', '审核人')->static(), amis()->TextControl('audit_time', '审核时间')->static(), amis()->TextControl('audit_remark', '审核回执')->static(), amis()->TextControl('state', '状态')->static(), amis()->TextControl('created_at', admin_trans('admin.created_at'))->static(), amis()->TextControl('updated_at', admin_trans('admin.updated_at'))->static(), ]); } /** * [审核]审核技师申请 * * @description 审核技师的申请记录,可通过或驳回 * * @header x-xsrf-token required CSRF令牌 Example: your_csrf_token * * @bodyParam info_record_id integer required 申请记录ID Example: 1 * @bodyParam info_record_state integer required 审核状态(2:通过 3:驳回) Example: 2 * @bodyParam audit_remark string required 审核意见 Example: 资料符合要求,审核通过 * * @response scenario=success { * "code": 200, * "message": "操作成功" * } * * @response status=400 scenario="已审核" { * "message": "该申请已审核" * } * * @response status=404 scenario="不存在" { * "message": "申请记录不存在" * } * * @param Request $request * @return \Illuminate\Http\JsonResponse */ public function audit(Request $request) { $validated = $request->validate([ 'id' => 'required|integer|exists:coach_info_records,id', 'info_record_state' => 'required|integer|in:2,3', // 2:通过 3:驳回 'audit_remark' => 'nullable|string|max:255', // 改为可选 ]); $result = $this->service->audit( $validated['id'], $validated['info_record_state'], $validated['audit_remark'] ?? '', // 添加默认值 Admin::user()->id ); return $this->autoResponse($result); } /** * [技师基本信息]修改技师基本信息 * * @description 修改技师的基本信息,包括昵称、性别、手机号等基础字段 * * @header x-xsrf-token required CSRF令牌 Example: your_csrf_token * * @bodyParam id integer required 记录ID Example: 1 * @bodyParam nickname string nullable 昵称(2-20个字符) Example: 张三 * @bodyParam avatar string nullable 头像图片 Example: path/to/avatar.jpg * @bodyParam formal_photo string nullable 正装照片 Example: path/to/formal.jpg * @bodyParam gender integer nullable 性别(1:男 2:女) Example: 1 * @bodyParam mobile string nullable 手机号 Example: 13800138000 * @bodyParam birthday date nullable 出生日期 Example: 1990-01-01 * @bodyParam work_years integer nullable 工作年限(0-99) Example: 5 * @bodyParam intention_city string nullable 意向城市 Example: 北京 * @bodyParam introduction string nullable 个人简介(最多255字符) Example: 专业按摩师,从业5年 * @bodyParam life_photos array nullable 生活照片数组 * @bodyParam life_photos.* string required 生活照片路径 Example: path/to/photo.jpg * * @response scenario=success { * "code": 200, * "message": "修改成功" * } * * @response status=404 scenario="不存在" { * "message": "记录不存在" * } * * @response status=422 scenario="验证失败" { * "message": "验证错误", * "errors": { * "nickname": ["昵称不能少于2个字符"], * "gender": ["性别只能是1(男)或2(女)"], * "mobile": ["手机号格式不正确"] * } * } */ public function updateInfo(Request $request) { $validated = $request->validate([ 'id' => 'required|integer|exists:coach_info_records,id', 'nickname' => 'nullable|string|min:2|max:20', 'avatar' => 'nullable|string', 'formal_photo' => 'nullable|string', 'gender' => 'nullable|integer|in:1,2', 'mobile' => 'nullable|string|regex:/^1[3-9]\d{9}$/', 'birthday' => 'nullable|date', 'work_years' => 'nullable|integer|min:0|max:99', 'intention_city' => 'nullable|string|max:50', 'introduction' => 'nullable|string|max:255', 'life_photos' => 'nullable|string' ], [ 'nickname.min' => '昵称不能少于2个字符', 'nickname.max' => '昵称不能超过20个字符', 'gender.in' => '性别只能是1(男)或2(女)', 'mobile.regex' => '手机号格式不正确', 'work_years.min' => '工作年限不能小于0年', 'work_years.max' => '工作年限不能超过99年', ]); $result = $this->service->updateInfo($validated); return $this->autoResponse($result); } }