From 14b9920667389690065ba4f1fca4e99eefb58e1e Mon Sep 17 00:00:00 2001 From: zhenhui <1276357500@qq.com> Date: Wed, 15 Apr 2026 13:44:50 +0800 Subject: [PATCH] =?UTF-8?q?[=E6=B8=B8=E6=88=8F=E7=AE=A1=E7=90=86]=E6=B8=B8?= =?UTF-8?q?=E6=88=8F=E5=AF=B9=E5=B1=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/admin/controller/game/Period.php | 112 +++++++ app/common/model/GamePeriod.php | 43 +++ web/src/lang/backend/en/game/period.ts | 28 ++ web/src/lang/backend/zh-cn/game/period.ts | 28 ++ web/src/views/backend/game/period/index.vue | 290 ++++++++++++++++++ .../views/backend/game/period/popupForm.vue | 131 ++++++++ 6 files changed, 632 insertions(+) create mode 100644 app/admin/controller/game/Period.php create mode 100644 app/common/model/GamePeriod.php create mode 100644 web/src/lang/backend/en/game/period.ts create mode 100644 web/src/lang/backend/zh-cn/game/period.ts create mode 100644 web/src/views/backend/game/period/index.vue create mode 100644 web/src/views/backend/game/period/popupForm.vue diff --git a/app/admin/controller/game/Period.php b/app/admin/controller/game/Period.php new file mode 100644 index 0000000..1acef84 --- /dev/null +++ b/app/admin/controller/game/Period.php @@ -0,0 +1,112 @@ + 'desc']; + + protected string|array $orderGuarantee = ['id' => 'desc']; + + protected bool $modelValidate = false; + + protected function initController(WebmanRequest $request): ?Response + { + $this->model = new \app\common\model\GamePeriod(); + return null; + } + + /** + * 读取 / 保存:自动创建下一期、手动创建下一期 开关(存 game_config) + */ + public function periodSettings(WebmanRequest $request): Response + { + $response = $this->initializeBackend($request); + if ($response !== null) { + return $response; + } + $method = $request->method(); + if ($method === 'GET') { + return $this->success('', GamePeriodService::getPeriodSettings()); + } + if ($method === 'POST') { + $data = $request->post(); + if (!is_array($data)) { + return $this->error(__('Parameter %s can not be empty', [''])); + } + try { + GamePeriodService::savePeriodSettings($data); + } catch (Throwable $e) { + return $this->error($e->getMessage()); + } + return $this->success(__('Saved successfully')); + } + return $this->error(__('Parameter error')); + } + + /** + * 手动创建下一期(受开关与「存在进行中期号」约束) + */ + public function createNextManual(WebmanRequest $request): Response + { + $response = $this->initializeBackend($request); + if ($response !== null) { + return $response; + } + if ($request->method() !== 'POST') { + return $this->error(__('Parameter error')); + } + $result = GamePeriodService::createNextPeriodForManual(); + if ($result['ok']) { + return $this->success($result['msg'], ['period_no' => $result['period_no'] ?? '']); + } + return $this->error($result['msg']); + } + + protected function _add(): Response + { + if ($this->request && $this->request->method() === 'POST') { + $data = $this->request->post(); + if (!is_array($data)) { + return $this->error(__('Parameter %s can not be empty', [''])); + } + $data = $this->applyInputFilter($data); + $data = $this->excludeFields($data); + if (!isset($data['period_start_at']) || $data['period_start_at'] === '' || $data['period_start_at'] === null) { + $data['period_start_at'] = time(); + } + if ($this->dataLimit && $this->dataLimitFieldAutoFill) { + $data[$this->dataLimitField] = $this->auth->id; + } + $result = false; + $this->model->startTrans(); + try { + $result = $this->model->save($data); + $this->model->commit(); + } catch (Throwable $e) { + $this->model->rollback(); + return $this->error($e->getMessage()); + } + if ($result !== false) { + return $this->success(__('Added successfully')); + } + return $this->error(__('No rows were added')); + } + return $this->error(__('Parameter error')); + } +} diff --git a/app/common/model/GamePeriod.php b/app/common/model/GamePeriod.php new file mode 100644 index 0000000..eeb8488 --- /dev/null +++ b/app/common/model/GamePeriod.php @@ -0,0 +1,43 @@ + 'integer', + 'update_time' => 'integer', + 'period_start_at' => 'integer', + 'status' => 'integer', + 'draw_mode' => 'integer', + 'preset_number' => 'integer', + 'result_number' => 'integer', + ]; + + /** + * 后台表单 datetime 可能提交字符串,入库前转为 Unix 时间戳 + * ThinkPHP 修改器签名为 (mixed $value, array $data) + */ + public function setPeriodStartAtAttr($value, $data = []) + { + if ($value === null || $value === '') { + return 0; + } + if (is_int($value)) { + return $value; + } + if (is_string($value)) { + $t = strtotime($value); + if ($t !== false) { + return $t; + } + } + return 0; + } +} diff --git a/web/src/lang/backend/en/game/period.ts b/web/src/lang/backend/en/game/period.ts new file mode 100644 index 0000000..eff4eb8 --- /dev/null +++ b/web/src/lang/backend/en/game/period.ts @@ -0,0 +1,28 @@ +export default { + 'quick Search Fields': 'Period No. / ID', + id: 'ID', + period_no: 'Period No.', + period_start_at: 'Start time', + status: 'Status', + 'status 0': 'Betting open', + 'status 1': 'Closed', + 'status 2': 'Settling', + 'status 3': 'Paying', + 'status 4': 'Ended', + 'status 5': 'Void', + draw_mode: 'Draw mode', + 'draw_mode 0': 'Auto AI', + 'draw_mode 1': 'Manual preset', + preset_number: 'Preset number', + result_number: 'Result number', + void_reason: 'Void reason', + create_time: 'Created', + update_time: 'Updated', + section_auto: 'Auto draw & new period', + auto_create_label: 'Allow auto-create next period', + auto_create_tip: 'When enabled, a background ticker inserts a new period if none is in progress', + manual_create_label: 'Allow manual create next period', + manual_create_tip: 'When enabled, the button below can create the next period', + btn_create_next: 'Create next period (manual)', + saving: 'Saving…', +} diff --git a/web/src/lang/backend/zh-cn/game/period.ts b/web/src/lang/backend/zh-cn/game/period.ts new file mode 100644 index 0000000..59f0c86 --- /dev/null +++ b/web/src/lang/backend/zh-cn/game/period.ts @@ -0,0 +1,28 @@ +export default { + 'quick Search Fields': '期号/ID', + id: 'ID', + period_no: '期号', + period_start_at: '开始时间', + status: '状态', + 'status 0': '下注开放', + 'status 1': '已封盘', + 'status 2': '算票中', + 'status 3': '派彩中', + 'status 4': '已结束', + 'status 5': '已作废', + draw_mode: '开奖方式', + 'draw_mode 0': '自动AI', + 'draw_mode 1': '手动预设', + preset_number: '预设号码', + result_number: '开奖号码', + void_reason: '作废原因', + create_time: '创建时间', + update_time: '更新时间', + section_auto: '自动开奖与新建期', + auto_create_label: '允许自动创建下一期', + auto_create_tip: '开启后由后台定时任务在无进行中期号时自动插入新期', + manual_create_label: '允许手动创建下一期', + manual_create_tip: '开启后可在本页使用「手动创建下一期」按钮', + btn_create_next: '手动创建下一期', + saving: '保存中…', +} diff --git a/web/src/views/backend/game/period/index.vue b/web/src/views/backend/game/period/index.vue new file mode 100644 index 0000000..262d8a2 --- /dev/null +++ b/web/src/views/backend/game/period/index.vue @@ -0,0 +1,290 @@ + + + + + diff --git a/web/src/views/backend/game/period/popupForm.vue b/web/src/views/backend/game/period/popupForm.vue new file mode 100644 index 0000000..46559cc --- /dev/null +++ b/web/src/views/backend/game/period/popupForm.vue @@ -0,0 +1,131 @@ + + + + +