baseCRUD() ->filterTogglable(false) ->headerToolbar([ $this->createButton('dialog'), ...$this->baseHeaderToolBar(), ]) ->columns([ amis()->TableColumn('id', 'ID')->sortable(), amis()->TableColumn('mobile', '手机号'), amis()->TableColumn('password', '密码'), amis()->TableColumn('nickname', '昵称'), amis()->TableColumn('avatar', '头像'), amis()->TableColumn('gender', '性别'), amis()->TableColumn('register_area', '注册地(行政区划代码)'), amis()->TableColumn('state', '状态')->tpl('${'.admin_dict()->getValue('state.open', '未知').'}'), 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('mobile', '手机号'), amis()->TextControl('password', '密码'), amis()->TextControl('nickname', '昵称'), amis()->TextControl('avatar', '头像'), amis()->TextControl('gender', '性别'), amis()->TextControl('register_area', '注册地(行政区划代码)'), amis()->TextControl('state', '状态'), ]); } public function detail() { return $this->baseDetail()->body([ amis()->TextControl('id', 'ID')->static(), amis()->TextControl('mobile', '手机号')->static(), amis()->TextControl('password', '密码')->static(), amis()->TextControl('nickname', '昵称')->static(), amis()->TextControl('avatar', '头像')->static(), amis()->TextControl('gender', '性别')->static(), amis()->TextControl('register_area', '注册地(行政区划代码)')->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 获取用户列表,支持条件查询和分页 * * @queryParam nickname string 昵称 Example: 张三 * @queryParam mobile string 手机号 Example: 13800138000 * @queryParam state int 用户状态(1:正常,2:禁用) Example: 1 * @queryParam viewName string 视图名称 Example: manage_user_list * @queryParam page int 页码 Example: 1 * @queryParam perPage int 每页数量 Example: 20 * @queryParam orderBy string 排序字段 Example: mobile * @queryParam orderDir string 排序方向 Example: desc * * @response { * "code": 200, * "message": "success", * "data": { * "current_page": 1, * "data": [{ * "id": 1, * "mobile": "13800138000", * "nickname": "张三", * "avatar": "avatar.jpg", * "gender": 1, * "area_code": "110000", * "state": 1, * "created_at": "2024-01-01 00:00:00", * "updated_at": "2024-01-01 00:00:00" * }], * "total": 100 * } * } */ public function manageUserList() { $viewName = request()->input('viewName'); $whereParams = request()->except(['_action', 'page', 'perPage', 'viewName', 'orderBy', 'orderDir']); $pageParams = request()->only(['page', 'perPage']); $sortParams = request()->only(['orderBy', 'orderDir']); return $this->service->manageUserList($viewName, $whereParams, $pageParams, $sortParams); } /** * [用户管理]拉黑用户 * * @description 将用户加入黑名单 * * @header x-xsrf-token required CSRF令牌 Example: your_csrf_token * * @bodyParam user_id integer required 用户ID Example: 1 * @bodyParam reason string required 拉黑原因 Example: 恶意投诉 * * @response { * "code": 200, * "message": "拉黑成功", * "data": null * } */ public function blockUser(Request $request) { $validated = $request->validate([ 'user_id' => 'required|integer|exists:member_users,id', 'reason' => 'required|string|max:255', ]); return $this->service->blockUser($validated); } /** * [用户管理]冻结用户余额 * * @description 冻结用户钱包余额 * * @header x-xsrf-token required CSRF令牌 Example: your_csrf_token * * @bodyParam user_id integer required 用户ID Example: 1 * @bodyParam amount numeric required 冻结金额 Example: 100.00 * @bodyParam reason string required 冻结原因 Example: 涉嫌违规操作 * * @response { * "code": 200, * "message": "冻结成功", * "data": null * } */ public function freezeBalance(Request $request) { $validated = $request->validate([ 'user_id' => 'required|integer|exists:member_users,id', 'amount' => 'required|numeric|min:0.01', 'reason' => 'required|string|max:255', ]); return $this->service->freezeUserBalance($validated); } /** * [用户管理]记录不良行为 * * @description 记录用户不良行为 * * @header x-xsrf-token required CSRF令牌 Example: your_csrf_token * * @bodyParam user_id integer required 用户ID Example: 1 * @bodyParam type integer required 不良行为类型(1:恶意取消订单,2:恶意投诉,3:违规操作,4:骚扰技师,5:欺诈行为,99:其他违规) Example: 1 * @bodyParam title string required 标题 Example: 多次恶意取消订单 * @bodyParam description string required 详细描述 Example: 用户在2024年3月连续恶意取消3次订单 * @bodyParam evidence array optional 证据(图片/视频URL数组) Example: ["http://example.com/evidence1.jpg"] * @bodyParam related_order_id integer optional 关联订单ID Example: 1001 * @bodyParam occurred_at datetime optional 发生时间 Example: 2024-03-20 10:00:00 * * @response { * "code": 200, * "message": "记录成功", * "data": null * } */ public function recordBadBehavior(Request $request) { $validated = $request->validate([ 'user_id' => 'required|integer|exists:member_users,id', 'type' => 'required|integer|in:'.implode(',', BadBehaviorType::values()), 'title' => 'required|string|max:100', 'description' => 'required|string', 'evidence' => 'nullable|array', 'evidence.*' => 'url', 'related_order_id' => 'nullable|integer|exists:orders,id', 'occurred_at' => 'nullable|date', ]); return $this->service->recordBadBehavior($validated); } }