From c4ec7828bd9e0b07a694334ff2b363aaddc62d02 Mon Sep 17 00:00:00 2001 From: zhenhui <1276357500@qq.com> Date: Mon, 27 Jul 2026 12:18:03 +0800 Subject: [PATCH] =?UTF-8?q?=E7=A7=BB=E9=99=A4=E5=9C=B0=E5=8C=BA=E7=9A=84?= =?UTF-8?q?=E6=A0=A1=E9=AA=8C=EF=BC=8C=E4=B8=8D=E9=9C=80=E8=A6=81=E5=A1=AB?= =?UTF-8?q?=E5=9C=B0=E5=8C=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/admin/controller/mall/Address.php | 39 +---- app/api/controller/v1/Playx.php | 7 +- app/common/model/MallAddress.php | 135 ++---------------- docs/H5-积分商城接口文档.md | 2 +- docs/PlayX-接口文档.md | 3 +- docs/PlayX-调用积分商城接口说明.md | 3 +- web/src/lang/backend/en/mall/address.ts | 2 - web/src/lang/backend/zh-cn/mall/address.ts | 2 - web/src/views/backend/mall/address/index.vue | 44 +----- .../views/backend/mall/address/popupForm.vue | 11 +- 10 files changed, 25 insertions(+), 223 deletions(-) diff --git a/app/admin/controller/mall/Address.php b/app/admin/controller/mall/Address.php index f7182f1..3477391 100644 --- a/app/admin/controller/mall/Address.php +++ b/app/admin/controller/mall/Address.php @@ -18,7 +18,7 @@ class Address extends Backend */ protected ?object $model = null; - protected array|string $preExcludeFields = ['id', 'create_time', 'update_time', 'region_origin']; + protected array|string $preExcludeFields = ['id', 'create_time', 'update_time']; protected array $withJoinTable = ['playxUserAsset']; @@ -63,41 +63,4 @@ class Address extends Backend 'remark' => get_route_remark(), ]); } - - public function edit(\Webman\Http\Request $request): \support\Response - { - $response = $this->initializeBackend($request); - if ($response !== null) { - return $response; - } - - if ($request->method() === 'POST') { - $post = $request->post(); - $regionOrigin = trim(strval($post['region_origin'] ?? '')); - if (isset($post['region']) && $regionOrigin !== '' && MallAddress::isAreaIdList($regionOrigin)) { - $displayOrigin = MallAddress::resolveAreaNames($regionOrigin); - if (MallAddress::normalizeRegion($post['region']) === MallAddress::normalizeRegion($displayOrigin)) { - $request->setPost(array_merge($post, ['region' => $regionOrigin])); - } - } - return $this->_edit(); - } - - $pk = $this->model->getPk(); - $id = $request->get($pk); - $row = $this->model->find($id); - if (!$row) { - return $this->error(__('Record not found')); - } - - $dataLimitAdminIds = $this->getDataLimitAdminIds(); - if ($dataLimitAdminIds && !in_array($row[$this->dataLimitField], $dataLimitAdminIds)) { - return $this->error(__('You have no permission')); - } - - $rowData = $row->toArray(); - $rowData['region_origin'] = $row->getData('region'); - - return $this->success('', ['row' => $rowData]); - } } diff --git a/app/api/controller/v1/Playx.php b/app/api/controller/v1/Playx.php index d99fa34..2479171 100644 --- a/app/api/controller/v1/Playx.php +++ b/app/api/controller/v1/Playx.php @@ -1221,11 +1221,10 @@ SQL; $phone = trim(strval($request->post('phone', ''))); $receiverName = trim(strval($request->post('receiver_name', ''))); - $region = MallAddress::normalizeRegion($request->post('region', '')); $detailAddress = trim(strval($request->post('detail_address', ''))); $defaultSetting = strval($request->post('default_setting', '0')) === '1' ? 1 : 0; - if ($phone === '' || $receiverName === '' || $detailAddress === '' || $region === '' || $region === null) { + if ($phone === '' || $receiverName === '' || $detailAddress === '') { return $this->error(__('Missing required fields')); } @@ -1239,7 +1238,6 @@ SQL; 'playx_user_asset_id' => $assetId, 'receiver_name' => $receiverName, 'phone' => $phone, - 'region' => $region, 'detail_address' => $detailAddress, 'default_setting' => $defaultSetting, 'create_time' => time(), @@ -1290,9 +1288,6 @@ SQL; if ($request->post('receiver_name', null) !== null) { $updates['receiver_name'] = trim(strval($request->post('receiver_name', ''))); } - if ($request->post('region', null) !== null) { - $updates['region'] = MallAddress::normalizeRegion($request->post('region', '')); - } if ($request->post('detail_address', null) !== null) { $updates['detail_address'] = trim(strval($request->post('detail_address', ''))); } diff --git a/app/common/model/MallAddress.php b/app/common/model/MallAddress.php index ee66411..935589f 100644 --- a/app/common/model/MallAddress.php +++ b/app/common/model/MallAddress.php @@ -3,7 +3,6 @@ namespace app\common\model; use app\common\model\traits\TimestampInteger; -use support\think\Db; use support\think\Model; /** @@ -19,122 +18,27 @@ class MallAddress extends Model // 自动写入时间戳字段 protected $autoWriteTimestamp = true; - // 追加属性 - protected $append = [ - 'region_text', - ]; + /** 地区字段已废弃,接口与后台不再使用 */ + protected array $hidden = ['region']; + + protected static function onBeforeInsert($model): void + { + $model->set('region', ''); + } + + protected static function onBeforeUpdate($model): void + { + $model->set('region', ''); + } - /** - * 表单展示:文本地区返回规范化字符串;历史地区 ID 转为名称(英文逗号拼接) - */ public function getregionAttr($value): string { - if ($value === '' || $value === null) { - return ''; - } - if (is_array($value)) { - return self::normalizeRegion($value); - } - $region = trim(strval($value)); - if ($region === '') { - return ''; - } - if (self::isAreaIdList($region)) { - return self::resolveAreaNames($region); - } - return self::normalizeRegion($region); + return trim(strval($value ?? '')); } - /** - * 入库:统一为英文逗号分隔(与 API / 原 city 组件存储格式一致) - */ public function setregionAttr($value): string { - return self::normalizeRegion($value); - } - - public function getregionTextAttr($value, $row): string - { - $region = $row['region'] ?? ''; - if ($region === '' || $region === null) { - return ''; - } - if (is_array($region)) { - return self::normalizeRegion($region); - } - $region = trim(strval($region)); - if ($region === '') { - return ''; - } - if (self::isAreaIdList($region)) { - return self::resolveAreaNames($region); - } - return self::normalizeRegion($region); - } - - /** - * 将地区规范为英文逗号分隔字符串(数组或「省,市,区」文本) - */ - public static function normalizeRegion(mixed $value): string - { - if (is_array($value)) { - $parts = []; - foreach ($value as $item) { - $part = trim(strval($item)); - if ($part !== '') { - $parts[] = $part; - } - } - return implode(',', $parts); - } - - $region = trim(strval($value)); - if ($region === '') { - return ''; - } - - $region = str_replace(',', ',', $region); - $parts = explode(',', $region); - $normalized = []; - foreach ($parts as $part) { - $part = trim($part); - if ($part !== '') { - $normalized[] = $part; - } - } - - return implode(',', $normalized); - } - - public static function isAreaIdList(string $region): bool - { - $parts = array_values(array_filter(array_map('trim', explode(',', $region)), static function ($part) { - return $part !== ''; - })); - if ($parts === []) { - return false; - } - foreach ($parts as $part) { - if (!ctype_digit($part)) { - return false; - } - } - return true; - } - - public static function resolveAreaNames(string $region): string - { - $ids = array_values(array_filter(array_map('trim', explode(',', $region)), static function ($part) { - return $part !== ''; - })); - if ($ids === []) { - return ''; - } - $cityNames = Db::name('area')->whereIn('id', $ids)->column('name'); - if (!$cityNames) { - return self::normalizeRegion($region); - } - return implode(',', $cityNames); + return ''; } public function playxUserAsset(): \think\model\relation\BelongsTo @@ -149,19 +53,10 @@ class MallAddress extends Model */ public static function snapshotForPhysicalOrder(self $addr): array { - $regionText = $addr->region_text ?? ''; - $parts = array_filter([ - trim($regionText), - trim($addr->detail_address ?? ''), - ], static function ($s) { - return $s !== ''; - }); - $receiverAddress = implode(' ', $parts); - return [ 'receiver_name' => trim($addr->receiver_name ?? ''), 'receiver_phone' => trim($addr->phone ?? ''), - 'receiver_address' => $receiverAddress, + 'receiver_address' => trim($addr->detail_address ?? ''), ]; } } diff --git a/docs/H5-积分商城接口文档.md b/docs/H5-积分商城接口文档.md index 6a37d9b..31ebcb1 100644 --- a/docs/H5-积分商城接口文档.md +++ b/docs/H5-积分商城接口文档.md @@ -238,7 +238,7 @@ curl -G "https://{域名}/api/v1/mall/pointsLogs" \ ### 4.2 新增地址 **POST** ` /api/v1/mall/addressAdd ` -Body 含 `receiver_name`(收货人,建议填写;实物兑换下单快照需要非空的收货人、电话与拼接后的完整地址)。 +Body 含 `receiver_name`、`phone`、`detail_address`(完整收货地址,必填);实物兑换下单快照使用上述字段。 ### 4.3 编辑地址 **POST** ` /api/v1/mall/addressEdit ` diff --git a/docs/PlayX-接口文档.md b/docs/PlayX-接口文档.md index 135a251..ce5d5f8 100644 --- a/docs/PlayX-接口文档.md +++ b/docs/PlayX-接口文档.md @@ -326,8 +326,7 @@ Body: |------|------|------| | `receiver_name` | 是 | 收货人 | | `phone` | 是 | 电话 | -| `region` | 是 | 地区(数组或逗号分隔字符串) | -| `detail_address` | 是 | 详细地址 | +| `detail_address` | 是 | 完整收货地址 | | `default_setting` | 否 | `1` 设为默认地址 | #### 3.x.3 修改地址(含设为默认) diff --git a/docs/PlayX-调用积分商城接口说明.md b/docs/PlayX-调用积分商城接口说明.md index f2117fd..b5f90c5 100644 --- a/docs/PlayX-调用积分商城接口说明.md +++ b/docs/PlayX-调用积分商城接口说明.md @@ -577,8 +577,7 @@ GET /api/v1/mall/addressList?session_id=fc7f3e3f0d0f4cb29f66e4c8fbab4f66 "session_id": "fc7f3e3f0d0f4cb29f66e4c8fbab4f66", "receiver_name": "Tom", "phone": "0123456789", - "region": "Kuala Lumpur,KLCC", - "detail_address": "Tower A, 8F", + "detail_address": "Tower A, 8F, Kuala Lumpur", "default_setting": 1 } ``` diff --git a/web/src/lang/backend/en/mall/address.ts b/web/src/lang/backend/en/mall/address.ts index 7b493d1..0d238ca 100644 --- a/web/src/lang/backend/en/mall/address.ts +++ b/web/src/lang/backend/en/mall/address.ts @@ -4,8 +4,6 @@ export default { playxuserasset__username: 'username', receiver_name: 'receiver name', phone: 'phone', - region: 'region', - region_tip: 'Separate levels with commas, e.g. Kuala Lumpur,KLCC', detail_address: 'detail_address', default_setting: 'Default address', 'default_setting 0': '--', diff --git a/web/src/lang/backend/zh-cn/mall/address.ts b/web/src/lang/backend/zh-cn/mall/address.ts index 1eb4e7c..3aa3eee 100644 --- a/web/src/lang/backend/zh-cn/mall/address.ts +++ b/web/src/lang/backend/zh-cn/mall/address.ts @@ -4,8 +4,6 @@ export default { playxuserasset__username: '用户名', receiver_name: '收货人', phone: '电话', - region: '地区', - region_tip: '多个层级请用英文逗号分隔,如:广东省,广州市,天河区', detail_address: '详细地址', default_setting: '默认地址', 'default_setting 0': '--', diff --git a/web/src/views/backend/mall/address/index.vue b/web/src/views/backend/mall/address/index.vue index 5c40508..2df1589 100644 --- a/web/src/views/backend/mall/address/index.vue +++ b/web/src/views/backend/mall/address/index.vue @@ -39,28 +39,6 @@ const { t } = useI18n() const tableRef = useTemplateRef('tableRef') const optButtons: OptButton[] = defaultOptButtons(['edit', 'delete']) -const hasChinese = (s: string) => /[\u4e00-\u9fa5]/.test(s) - -const formatRegion = (raw: string) => { - const s = raw.toString().trim() - if (!s) return '' - if (hasChinese(s)) { - return s.replace(/[,,\s]+/g, ',') - } - return s.replace(/[,,\s]+/g, ',') -} - -const normalizeRegionInput = (raw: unknown) => { - const s = String(raw ?? '').trim() - if (!s) return '' - return s - .replace(/,/g, ',') - .split(',') - .map((part) => part.trim()) - .filter(Boolean) - .join(',') -} - /** * baTable 内包含了表格的所有数据且数据具备响应性,然后通过 provide 注入给了后代组件 */ @@ -98,24 +76,15 @@ const baTable = new baTableClass( sortable: false, operator: 'LIKE', }, - { - label: t('mall.address.region'), - prop: 'region_text', - align: 'center', - operator: false, - showOverflowTooltip: true, - formatter: (row: TableRow, _column: TableColumn, cellValue: string) => { - const raw = (cellValue || row.region || '').toString() - return formatRegion(raw) - }, - }, { label: t('mall.address.detail_address'), prop: 'detail_address', align: 'center', + minWidth: 200, operatorPlaceholder: t('Fuzzy query'), sortable: false, operator: 'LIKE', + showOverflowTooltip: true, }, { label: t('mall.address.default_setting'), @@ -156,15 +125,6 @@ const baTable = new baTableClass( }, { defaultItems: {}, - }, - { - onSubmit: () => { - const items = baTable.form.items - if (items && items.region !== undefined && items.region !== null) { - items.region = normalizeRegionInput(items.region) - } - return true - }, } ) diff --git a/web/src/views/backend/mall/address/popupForm.vue b/web/src/views/backend/mall/address/popupForm.vue index 01c8c7c..1aa44bb 100644 --- a/web/src/views/backend/mall/address/popupForm.vue +++ b/web/src/views/backend/mall/address/popupForm.vue @@ -51,16 +51,9 @@ prop="phone" :placeholder="t('Please input field', { field: t('mall.address.phone') })" /> - > = reactive({ phone: [buildValidatorData({ name: 'required', title: t('mall.address.phone') })], + receiver_name: [buildValidatorData({ name: 'required', title: t('mall.address.receiver_name') })], + detail_address: [buildValidatorData({ name: 'required', title: t('mall.address.detail_address') })], create_time: [buildValidatorData({ name: 'date', title: t('mall.address.create_time') })], update_time: [buildValidatorData({ name: 'date', title: t('mall.address.update_time') })], })