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') })],
})