xsh_1997 преди 2 седмици
родител
ревизия
650177a4de

+ 62 - 37
doc/农资商城web/组织管理/店铺管理/店铺管理前端技术方案.md

@@ -1,6 +1,6 @@
1 1
 # 店铺管理 — 前端技术方案
2 2
 
3
-> **依据:** 《店铺管理功能需求.md》v1.3.4、《店铺管理技术方案.md》v1.2.4  
3
+> **依据:** 《店铺管理功能需求.md》v1.3.5、《店铺管理技术方案.md》v1.2.5  
4 4
 > **前端规范:** `doc/前端设计/前端设计.md`  
5 5
 > **范围:** 仅 **ruoyi-ui 平台管理端** 列表、开店、编辑、账号管理;商家端 `/agri/seller/shop` **不在 ruoyi-ui 本期实现**。  
6 6
 > **实现状态:** 页面与 API 封装已落地,待后端 `/agri/shop` 联调。
@@ -14,7 +14,7 @@
14 14
 | 框架 | Vue 2 + Element UI |
15 15
 | 请求 | `@/utils/request` |
16 16
 | 参考页面 | `ruoyi-ui/src/views/agri/content/banner/index.vue` |
17
-| 选商户 | 复用 `selectMerchantList`(`@/api/agri/merchant`) |
17
+| 选商户 | 复用 `selectMerchantList`、`openShopCheck`(`@/api/agri/merchant`) |
18 18
 | 店铺状态 | `0` 开业 / `1` 停业 |
19 19
 
20 20
 ---
@@ -24,7 +24,8 @@
24 24
 | 类型 | 路径 | 说明 |
25 25
 |------|------|------|
26 26
 | 页面 | `ruoyi-ui/src/views/agri/org/shop/index.vue` | 列表、开店/编辑弹窗、账号管理弹窗 |
27
-| API | `ruoyi-ui/src/api/agri/shop.js` | 店铺 CRUD、账号查询/修改 |
27
+| API | `ruoyi-ui/src/api/agri/shop.js` | 店铺 CRUD、删店预检、账号查询/修改 |
28
+| API | `ruoyi-ui/src/api/agri/merchant.js` | `selectMerchantList`、`openShopCheck` |
28 29
 
29 30
 **组件 name:** `AgriShop`
30 31
 
@@ -62,16 +63,30 @@
62 63
 │   └── 操作:编辑、账号管理、删除
63 64
 ├── 添加/编辑弹窗(640px)
64 65
 │   ├── 公共:名称、头像、电话、描述
65
-│   ├── 添加:选商户、登录名、管理员姓名、初始密码
66
-│   └── 编辑:所属商户只读、店铺状态(开业/停业)
67
-└── 账号管理弹窗(520px)
66
+│   ├── 添加:选商户、经营账号只读展示、店铺状态(选填,默认开业)
67
+│   └── 编辑:所属商户/经营账号只读、店铺状态(开业/停业)
68
+└── 账号管理弹窗(560px)
68 69
     ├── 提示:修改同步至该商户下全部店铺
70
+    ├── 下属店铺标签列表
69 71
     └── 登录名、管理员姓名、重置密码
70 72
 ```
71 73
 
72 74
 ---
73 75
 
74
-## 5. 复用组件
76
+## 5. v1.2.5 对齐要点(相对 v1.0)
77
+
78
+| 变更项 | 前端处理 |
79
+|--------|----------|
80
+| 添加店铺 **不再** 采集 loginName/adminName/password | 添加弹窗已移除账号输入项 |
81
+| 经营账号由 **商户入驻** 绑定 | 选商户后 `getShopAccount` 只读展示;无账号则阻断并提示 |
82
+| `shop_phone` 添加时 **选填** | 添加 placeholder「选填」;编辑时 **必填** |
83
+| `shop_status` 添加时 **选填** | 添加页可选开业/停业,未选默认后端 0 |
84
+| 开店校验 | 选商户时 `openShopCheck` + 账号存在性校验 |
85
+| 删店预检 | 删除前 `deleteShopCheck`,不可删则展示 reasons |
86
+
87
+---
88
+
89
+## 6. 复用组件
75 90
 
76 91
 | 组件 | 用途 |
77 92
 |------|------|
@@ -81,19 +96,19 @@
81 96
 
82 97
 ---
83 98
 
84
-## 6. API 对接
99
+## 7. API 对接
85 100
 
86 101
 **基路径:** `/agri/shop`
87 102
 
88 103
 | 前端方法 | HTTP | 路径 | 调用场景 |
89 104
 |----------|------|------|----------|
90 105
 | `listShop` | GET | `/list` | 列表 |
91
-| `getShop` | GET | `/{shopId}` | 编辑回显 |
92
-| `addShop` | POST | `/` | 添加店铺 |
106
+| `getShop` | GET | `/{shopId}` | 编辑回显(含经营账号摘要) |
107
+| `addShop` | POST | `/` | 添加店铺(**不含**账号字段) |
93 108
 | `updateShop` | PUT | `/` | 编辑店铺 |
94
-| `deleteShopCheck` | GET | `/{shopId}/deleteCheck` | 可选预检 |
109
+| `deleteShopCheck` | GET | `/{shopId}/deleteCheck` | 删除预检 |
95 110
 | `delShop` | DELETE | `/{shopIds}` | 删除 |
96
-| `getShopAccount` | GET | `/merchant/{merchantId}/account` | 添加时带出账号、账号管理回显 |
111
+| `getShopAccount` | GET | `/merchant/{merchantId}/account` | 添加时展示账号、账号管理回显 |
97 112
 | `updateShopAccount` | PUT | `/merchant/{merchantId}/account` | 保存账号 |
98 113
 
99 114
 **协作接口(merchant.js):**
@@ -101,8 +116,9 @@
101 116
 | 方法 | 路径 | 用途 |
102 117
 |------|------|------|
103 118
 | `selectMerchantList` | GET `/agri/merchant/selectList` | 添加店铺选商户 |
119
+| `openShopCheck` | GET `/agri/merchant/{id}/openShopCheck` | 选商户后可开店校验 |
104 120
 
105
-### 6.1 列表请求参数
121
+### 7.1 列表请求参数
106 122
 
107 123
 | 字段 | 说明 |
108 124
 |------|------|
@@ -110,7 +126,7 @@
110 126
 | shopStatus | `0` / `1` |
111 127
 | merchantName | 模糊;路由 `?merchantName=` 自动填入 |
112 128
 
113
-### 6.2 添加店铺请求体
129
+### 7.2 添加店铺请求体(v1.2.5)
114 130
 
115 131
 ```json
116 132
 {
@@ -119,39 +135,45 @@
119 135
   "shopPhone": "010-88886666",
120 136
   "shopDesc": "",
121 137
   "merchantId": 1,
122
-  "loginName": "13800138000",
123
-  "adminName": "张三",
124
-  "password": "初始密码"
138
+  "shopStatus": "0"
125 139
 }
126 140
 ```
127 141
 
128
-同商户已有账号:`GET .../account` 带出 loginName/adminName,字段 `disabled`;`password` 可空。
142
+- `shopPhone`、`shopDesc`、`shopStatus` 均可省略;`shopStatus` 省略时后端默认 **开业(0)**。
143
+- **不传** `loginName` / `adminName` / `password`;商户须已在入驻时绑定 `biz_merchant_account`。
129 144
 
130
-### 6.3 编辑店铺 · 停业二次确认(S12)
145
+### 7.3 编辑店铺 · 停业二次确认(S12)
131 146
 
132
-1. 首次 `PUT` 带 `shopStatus: "1"`,不传 `confirm` 或 `confirm: false`
147
+1. 首次 `PUT` 带 `shopStatus: "1"`(开业→停业),不传 `confirm` 或 `confirm: false`
133 148
 2. 若 `response.data.needConfirm === true`,弹窗 `confirmMessage`
134 149
 3. 用户确认后再次 `PUT`,带 `confirm: true`
135 150
 
136
-### 6.4 账号管理 · 改登录名 confirm
151
+### 7.4 账号管理 · 改登录名 confirm
152
+
153
+与停业流程相同:`needConfirm` + `confirm: true` 两步协议;文案含「同步至该商户下全部店铺」。
154
+
155
+### 7.5 删除预检
137 156
 
138
-与停业流程相同:`needConfirm` + `confirm: true` 两步协议。
157
+`GET /{shopId}/deleteCheck` 返回 `canDelete`、`reasons[]`;`canDelete=false` 时前端直接 `msgWarning`,不弹二次确认
139 158
 
140 159
 ---
141 160
 
142
-## 7. 交互与校验
161
+## 8. 交互与校验
143 162
 
144 163
 | 场景 | 前端行为 |
145 164
 |------|----------|
146
-| 选商户变更 | 自动 `getShopAccount`;有账号则锁定 loginName/adminName |
147
-| 随机密码 | 添加页「随机密码」按钮,10 位字母数字 |
165
+| 选商户变更 | `openShopCheck` → 不通过则清空并提示 reason |
166
+| 选商户变更 | `getShopAccount` → 无账号则提示「尚未配置经营账号…」并清空 |
167
+| 选商户成功 | 只读展示「管理员 / 脱敏登录名」 |
168
+| 添加提交 | `buildAddPayload()` 仅含店名字段;校验 `merchantAccountOk` |
148 169
 | 编辑 | `merchantId`、经营账号 **不可改**(走账号管理) |
149
-| 删除 | 二次确认;后端整批失败 msg 弹出 |
150
-| 经营账号展示 | `accountAdminName / accountLoginName`(后端脱敏) |
170
+| 商家电话 | 添加选填;编辑必填 |
171
+| 删除 | 先 `deleteShopCheck`,通过后二次确认再 `DELETE` |
172
+| 经营账号展示 | 列表 `accountAdminName / accountLoginName`(后端脱敏) |
151 173
 
152 174
 ---
153 175
 
154
-## 8. 权限指令
176
+## 9. 权限指令
155 177
 
156 178
 ```html
157 179
 v-hasPermi="['agri:shop:add']"
@@ -162,39 +184,42 @@ v-hasPermi="['agri:shop:account']"
162 184
 
163 185
 ---
164 186
 
165
-## 9. 与关联模块边界
187
+## 10. 与关联模块边界
166 188
 
167 189
 | 模块 | 关系 |
168 190
 |------|------|
169
-| 商户管理 | 选商户须经营信息完整;详情跳转 `?merchantName=` |
191
+| 商户管理 | 经营账号在 **新增入驻/审核通过** 时绑定;选商户须经营完整且已有账号 |
170 192
 | 店铺设置 | 全局免审开关 **不在** 本页配置 |
171
-| 商品管理 | 删店前置无出售中/待审核商品(后端校验) |
193
+| 商品管理 | 删店前置无出售中/待审核商品(后端 deleteCheck) |
172 194
 
173 195
 ---
174 196
 
175
-## 10. 联调检查清单
197
+## 11. 联调检查清单
176 198
 
177 199
 - [ ] 路由 query `merchantName` 筛选生效  
178
-- [ ] 同商户第二家店账号一致校验  
200
+- [ ] 添加店铺 **无** 账号输入项,POST body 无 loginName/adminName/password  
201
+- [ ] 商户无经营账号时添加被阻断  
202
+- [ ] 同商户第二家店添加成功,列表账号展示一致  
179 203
 - [ ] 开业→停业 needConfirm 两步  
180 204
 - [ ] 改登录名 needConfirm 两步  
181
-- [ ] 删店商品/订单阻断 msg  
205
+- [ ] deleteCheck 阻断并展示 reasons  
182 206
 - [ ] 列表 accountLoginName 脱敏展示  
183 207
 
184 208
 ---
185 209
 
186
-## 11. 非本期(前端)
210
+## 12. 非本期(前端)
187 211
 
188 212
 商家端店铺资料页(`/agri/seller/shop`)、子管理员 CRUD、导出。
189 213
 
190 214
 ---
191 215
 
192
-## 12. 修订记录
216
+## 13. 修订记录
193 217
 
194 218
 | 版本 | 日期 | 说明 |
195 219
 |------|------|------|
196 220
 | v1.0 | 2026-05 | 首版:列表 CRUD、账号管理、停业/改登录名 confirm |
221
+| v1.1 | 2026-05 | 对齐技术方案 v1.2.5:移除添加账号字段、openShopCheck、deleteCheck、电话/状态选填 |
197 222
 
198 223
 ---
199 224
 
200
-*文档版本:v1.0 · ruoyi-ui · 关联《店铺管理功能需求.md》v1.3.4*
225
+*文档版本:v1.1 · ruoyi-ui · 关联《店铺管理功能需求.md》v1.3.5、《店铺管理技术方案.md》v1.2.5*

+ 8 - 0
ruoyi-ui/src/api/agri/merchant.js

@@ -68,6 +68,14 @@ export function selectMerchantList() {
68 68
   })
69 69
 }
70 70
 
71
+// 商户是否可开店(与 POST /agri/shop 同一套校验)
72
+export function openShopCheck(merchantId) {
73
+  return request({
74
+    url: '/agri/merchant/' + merchantId + '/openShopCheck',
75
+    method: 'get'
76
+  })
77
+}
78
+
71 79
 // 入驻可选平台管理员
72 80
 export function adminUserOptions(keyword) {
73 81
   return request({

+ 104 - 47
ruoyi-ui/src/views/agri/org/shop/index.vue

@@ -72,7 +72,7 @@
72 72
           <image-upload v-model="form.shopAvatar" :limit="1" :file-size="5" :file-type="['png', 'jpg', 'jpeg']" />
73 73
         </el-form-item>
74 74
         <el-form-item label="商家电话" prop="shopPhone">
75
-          <el-input v-model="form.shopPhone" placeholder="请输入商家电话" maxlength="20" />
75
+          <el-input v-model="form.shopPhone" :placeholder="form.shopId ? '请输入商家电话' : '选填'" maxlength="20" />
76 76
         </el-form-item>
77 77
         <el-form-item label="店铺描述" prop="shopDesc">
78 78
           <el-input v-model="form.shopDesc" type="textarea" :rows="3" maxlength="1000" show-word-limit placeholder="选填" />
@@ -82,19 +82,23 @@
82 82
             <el-option v-for="item in merchantOptions" :key="item.merchantId" :label="item.merchantName || item.unitName" :value="item.merchantId" />
83 83
           </el-select>
84 84
         </el-form-item>
85
-        <el-form-item v-else label="所属商户">
86
-          <span class="readonly-text">{{ form.merchantName || '—' }}</span>
85
+        <el-form-item v-if="!form.shopId && merchantAccountHint" label="经营账号">
86
+          <span class="readonly-text">{{ merchantAccountHint }}</span>
87
+          <div class="form-tip">经营账号由商户入驻时绑定,开店沿用该账号</div>
87 88
         </el-form-item>
88
-        <el-form-item v-if="!form.shopId" label="登录名" prop="loginName">
89
-          <el-input v-model="form.loginName" placeholder="经营账号登录名(手机号)" maxlength="20" :disabled="accountLocked" />
89
+        <el-form-item v-else-if="form.shopId" label="所属商户">
90
+          <span class="readonly-text">{{ form.merchantName || '—' }}</span>
90 91
         </el-form-item>
91
-        <el-form-item v-if="!form.shopId" label="管理员姓名" prop="adminName">
92
-          <el-input v-model="form.adminName" placeholder="管理员姓名" maxlength="64" :disabled="accountLocked" />
92
+        <el-form-item v-if="form.shopId" label="经营账号">
93
+          <span class="readonly-text">{{ form.accountAdminName || '—' }} / {{ form.accountLoginName || '—' }}</span>
94
+          <div class="form-tip">如需修改请使用「账号管理」</div>
93 95
         </el-form-item>
94
-        <el-form-item v-if="!form.shopId" label="初始密码" prop="password">
95
-          <el-input v-model="form.password" type="password" placeholder="首家店必填;已有账号可留空" maxlength="20" show-password>
96
-            <el-button slot="append" @click="generateRandomPwd">随机密码</el-button>
97
-          </el-input>
96
+        <el-form-item v-if="!form.shopId" label="店铺状态" prop="shopStatus">
97
+          <el-radio-group v-model="form.shopStatus">
98
+            <el-radio label="0">开业</el-radio>
99
+            <el-radio label="1">停业</el-radio>
100
+          </el-radio-group>
101
+          <div class="form-tip">未选择时默认开业</div>
98 102
         </el-form-item>
99 103
         <el-form-item v-if="form.shopId" label="店铺状态" prop="shopStatus">
100 104
           <el-radio-group v-model="form.shopStatus">
@@ -111,11 +115,16 @@
111 115
     </el-dialog>
112 116
 
113 117
     <!-- 店铺账号管理弹窗 -->
114
-    <el-dialog title="店铺账号管理" :visible.sync="accountOpen" width="520px" append-to-body>
118
+    <el-dialog title="店铺账号管理" :visible.sync="accountOpen" width="560px" append-to-body>
115 119
       <el-form ref="accountForm" :model="accountForm" :rules="accountRules" label-width="100px">
116 120
         <el-alert v-if="accountForm.shops && accountForm.shops.length" type="info" :closable="false" class="mb12">
117 121
           修改后将同步至该商户下全部店铺(共 {{ accountForm.shops.length }} 家)
118 122
         </el-alert>
123
+        <div v-if="accountForm.shops && accountForm.shops.length" class="shop-tags mb12">
124
+          <el-tag v-for="item in accountForm.shops" :key="item.shopId" size="small" class="shop-tag" :type="item.shopStatus === '0' ? 'success' : 'info'">
125
+            {{ item.shopName }}
126
+          </el-tag>
127
+        </div>
119 128
         <el-form-item label="登录名" prop="loginNameRaw">
120 129
           <el-input v-model="accountForm.loginNameRaw" placeholder="登录名" maxlength="20" />
121 130
         </el-form-item>
@@ -135,12 +144,19 @@
135 144
 </template>
136 145
 
137 146
 <script>
138
-import { listShop, getShop, addShop, updateShop, delShop, getShopAccount, updateShopAccount } from "@/api/agri/shop"
139
-import { selectMerchantList } from "@/api/agri/merchant"
147
+import { listShop, getShop, addShop, updateShop, delShop, deleteShopCheck, getShopAccount, updateShopAccount } from "@/api/agri/shop"
148
+import { selectMerchantList, openShopCheck } from "@/api/agri/merchant"
140 149
 
141 150
 export default {
142 151
   name: "AgriShop",
143 152
   data() {
153
+    const validateShopPhone = (rule, value, callback) => {
154
+      if (this.form.shopId && !value) {
155
+        callback(new Error("请输入商家电话"))
156
+      } else {
157
+        callback()
158
+      }
159
+    }
144 160
     return {
145 161
       loading: true,
146 162
       showSearch: true,
@@ -149,8 +165,9 @@ export default {
149 165
       title: "",
150 166
       open: false,
151 167
       accountOpen: false,
152
-      accountLocked: false,
153 168
       merchantOptions: [],
169
+      merchantAccountHint: null,
170
+      merchantAccountOk: false,
154 171
       currentMerchantId: null,
155 172
       originalShopStatus: "0",
156 173
       queryParams: {
@@ -165,10 +182,8 @@ export default {
165 182
       rules: {
166 183
         shopName: [{ required: true, message: "请输入店铺名称", trigger: "blur" }],
167 184
         shopAvatar: [{ required: true, message: "请上传店铺头像", trigger: "change" }],
168
-        shopPhone: [{ required: true, message: "请输入商家电话", trigger: "blur" }],
169
-        merchantId: [{ required: true, message: "请选择商户", trigger: "change" }],
170
-        loginName: [{ required: true, message: "请输入登录名", trigger: "blur" }],
171
-        adminName: [{ required: true, message: "请输入管理员姓名", trigger: "blur" }]
185
+        shopPhone: [{ validator: validateShopPhone, trigger: "blur" }],
186
+        merchantId: [{ required: true, message: "请选择商户", trigger: "change" }]
172 187
       },
173 188
       accountRules: {
174 189
         loginNameRaw: [{ required: true, message: "请输入登录名", trigger: "blur" }],
@@ -213,11 +228,11 @@ export default {
213 228
         shopStatus: "0",
214 229
         merchantId: undefined,
215 230
         merchantName: undefined,
216
-        loginName: undefined,
217
-        adminName: undefined,
218
-        password: undefined
231
+        accountAdminName: undefined,
232
+        accountLoginName: undefined
219 233
       }
220
-      this.accountLocked = false
234
+      this.merchantAccountHint = null
235
+      this.merchantAccountOk = false
221 236
       this.resetForm("form")
222 237
     },
223 238
     /** 取消弹窗 */
@@ -251,30 +266,53 @@ export default {
251 266
         this.title = "编辑店铺"
252 267
       })
253 268
     },
254
-    /** 选择商户后带出已有经营账号 */
269
+    /** 选择商户后校验可开店并展示已有经营账号 */
255 270
     handleMerchantChange(merchantId) {
271
+      this.merchantAccountHint = null
272
+      this.merchantAccountOk = false
256 273
       if (!merchantId) {
257 274
         return
258 275
       }
259
-      getShopAccount(merchantId).then(response => {
260
-        const data = response.data || {}
261
-        if (data.loginName || data.adminName) {
262
-          this.form.loginName = data.loginNameRaw || data.loginName
263
-          this.form.adminName = data.adminName
264
-          this.accountLocked = true
265
-        } else {
266
-          this.accountLocked = false
276
+      openShopCheck(merchantId).then(response => {
277
+        const check = response.data || {}
278
+        if (!check.allowed) {
279
+          this.$modal.msgWarning(check.reason || "请先完善该商户的经营与结算信息")
280
+          this.form.merchantId = undefined
281
+          return
267 282
         }
268
-      }).catch(() => {})
283
+        getShopAccount(merchantId).then(res => {
284
+          const data = res.data || {}
285
+          if (!data.loginName && !data.adminName) {
286
+            this.$modal.msgWarning("该商户尚未配置经营账号,请先在商户管理中完成入驻绑定")
287
+            this.form.merchantId = undefined
288
+            return
289
+          }
290
+          this.merchantAccountHint = (data.adminName || "—") + " / " + (data.loginName || "—")
291
+          this.merchantAccountOk = true
292
+        }).catch(() => {
293
+          this.form.merchantId = undefined
294
+        })
295
+      }).catch(() => {
296
+        this.form.merchantId = undefined
297
+      })
269 298
     },
270
-    /** 生成随机密码 */
271
-    generateRandomPwd() {
272
-      const chars = "abcdefghjkmnpqrstuvwxyzABCDEFGHJKMNPQRSTUVWXYZ23456789"
273
-      let pwd = ""
274
-      for (let i = 0; i < 10; i++) {
275
-        pwd += chars.charAt(Math.floor(Math.random() * chars.length))
299
+    /** 构建添加店铺请求体(不含经营账号字段) */
300
+    buildAddPayload() {
301
+      const payload = {
302
+        shopName: this.form.shopName,
303
+        shopAvatar: this.form.shopAvatar,
304
+        merchantId: this.form.merchantId
305
+      }
306
+      if (this.form.shopPhone) {
307
+        payload.shopPhone = this.form.shopPhone
276 308
       }
277
-      this.form.password = pwd
309
+      if (this.form.shopDesc) {
310
+        payload.shopDesc = this.form.shopDesc
311
+      }
312
+      if (this.form.shopStatus && this.form.shopStatus !== "0") {
313
+        payload.shopStatus = this.form.shopStatus
314
+      }
315
+      return payload
278 316
     },
279 317
     /** 提交店铺表单 */
280 318
     submitForm() {
@@ -285,7 +323,11 @@ export default {
285 323
         if (this.form.shopId) {
286 324
           this.doUpdateShop()
287 325
         } else {
288
-          addShop(this.form).then(() => {
326
+          if (!this.merchantAccountOk) {
327
+            this.$modal.msgWarning("请先选择已绑定经营账号的商户")
328
+            return
329
+          }
330
+          addShop(this.buildAddPayload()).then(() => {
289 331
             this.$modal.msgSuccess("添加成功")
290 332
             this.open = false
291 333
             this.getList()
@@ -352,13 +394,21 @@ export default {
352 394
         })
353 395
       })
354 396
     },
355
-    /** 删除店铺 */
397
+    /** 删除店铺(先预检再确认) */
356 398
     handleDelete(row) {
357
-      this.$modal.confirm("删除后不可恢复,是否继续?").then(() => {
358
-        return delShop(row.shopId)
359
-      }).then(() => {
360
-        this.$modal.msgSuccess("删除成功")
361
-        this.getList()
399
+      deleteShopCheck(row.shopId).then(response => {
400
+        const data = response.data || {}
401
+        if (data.canDelete === false) {
402
+          const reasons = (data.reasons || []).join(";")
403
+          this.$modal.msgWarning(reasons || "当前店铺不满足删除条件")
404
+          return
405
+        }
406
+        this.$modal.confirm("删除后不可恢复,是否继续?").then(() => {
407
+          return delShop(row.shopId)
408
+        }).then(() => {
409
+          this.$modal.msgSuccess("删除成功")
410
+          this.getList()
411
+        }).catch(() => {})
362 412
       }).catch(() => {})
363 413
     }
364 414
   }
@@ -380,4 +430,11 @@ export default {
380 430
 .mb12 {
381 431
   margin-bottom: 12px;
382 432
 }
433
+.shop-tags {
434
+  padding-left: 100px;
435
+}
436
+.shop-tag {
437
+  margin-right: 8px;
438
+  margin-bottom: 4px;
439
+}
383 440
 </style>