index.vue 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683
  1. <template>
  2. <My-shade />
  3. <view class="content">
  4. <view class="title">
  5. 服务信息
  6. </view>
  7. <up-form :model="form" labelWidth="70" ref="uFormRef">
  8. <up-form-item label="服务类型" :required="rules.servicetype[0].required" prop="servicetype">
  9. <up-radio-group v-model="form.servicetype" @change="servicetypeChange">
  10. <up-radio :customStyle="{ marginLeft: '12px' }" v-for="(item) in servertypes" :key="item"
  11. :label="item" :name="item">
  12. </up-radio>
  13. </up-radio-group>
  14. </up-form-item>
  15. <up-form-item label="产品品类" :required="rules.class1[0].required" prop="class1">
  16. <up-radio-group v-model="form.class1" @change="class1Change">
  17. <up-radio :customStyle="{ marginLeft: '12px' }" v-for="(item) in class1" :key="item.value"
  18. :label="item.value" :name="item.value">
  19. </up-radio>
  20. </up-radio-group>
  21. </up-form-item>
  22. <up-form-item v-if="rules.class2[0].required" label="故障类型" :required="rules.class2[0].required"
  23. prop="class2">
  24. <picker class="picker" mode="selector" :range="class2" range-key="value" @change="changeClass2">
  25. {{ form.class2 || '请选择故障类型' }}
  26. </picker>
  27. </up-form-item>
  28. <view class="title">
  29. 产品信息
  30. <view class="serial-number-guide" @click="showSerialNumberGuide">
  31. <span>如何查看产品编号</span>
  32. <up-icon name="question-circle" color="#2979ff" size="24rpx" />
  33. </view>
  34. </view>
  35. <up-form-item label="产品编号" :required="rules.sku[0].required" prop="sku">
  36. <up-input v-model="form.sku" placeholder="产品编号" clearable @blur="skuConfirm">
  37. <template #suffix>
  38. <view style="display: flex;align-items: center;">
  39. <view v-if="form.servicetype && form.servicetype != '安装' && WuserRecord.myProducts >= 2"
  40. class="my-but" hover-class="navigator-hover" @click="toSelectMyProduct">
  41. 选择其他产品
  42. </view>
  43. <up-icon name="scan" color="#2979ff" size="28" @click="openScan" />
  44. </view>
  45. </template>
  46. </up-input>
  47. </up-form-item>
  48. <up-form-item label="产品名称" prop="itemname" :required="rules.itemname[0].required">
  49. <up-input v-model="form.itemname" disabled placeholder="请输入产品编号或选择产品">
  50. </up-input>
  51. </up-form-item>
  52. <up-form-item label="产品型号" prop="model">
  53. <up-input v-model="form.model" disabled placeholder="请输入产品编号或选择产品" />
  54. </up-form-item>
  55. <view class="title">
  56. 联系人信息
  57. </view>
  58. <up-form-item label="联系人" :required="rules.scenecontact[0].required" prop="scenecontact">
  59. <up-input v-model="form.scenecontact" placeholder="联系人" clearable />
  60. </up-form-item>
  61. <up-form-item label="手机号" :required="rules.scenecontactphonenumber[0].required"
  62. prop="scenecontactphonenumber">
  63. <up-input type="number" v-model="form.scenecontactphonenumber" placeholder="联系人电话" clearable />
  64. </up-form-item>
  65. <up-form-item label="省市县" :required="rules.province[0].required" prop="province">
  66. <My_region @select="changeRegion">
  67. <view class="region">
  68. {{ form.province ? [form.province, form.city, form.county].join("-")
  69. : '选择省市县' }}
  70. </view>
  71. </My_region>
  72. </up-form-item>
  73. <up-form-item label="详细地址" prop="address" :required="rules.address[0].required">
  74. <up-textarea maxlength="499" v-model="form.address" placeholder="详细地址" autoHeight height="20" />
  75. </up-form-item>
  76. <up-form-item label="情况说明" prop="remarks" :required="rules.remarks[0].required">
  77. <up-textarea v-model="form.remarks" placeholder="产品问题描述及服务需求" count></up-textarea>
  78. </up-form-item>
  79. </up-form>
  80. <view style="padding-bottom: 50px;width: 350rpx;margin: 40rpx auto 0;" @click="save">
  81. <My-button text="保存" :loading="loading" />
  82. </view>
  83. </view>
  84. <up-popup :show="products.length" @close="closePopup" :customStyle="{
  85. width: '80vw',
  86. }" mode="right">
  87. <scroll-view :safeAreaInsetBottom="false" scroll-y style="width: 100%;height: 100vh;">
  88. <view class="product" v-for="item in products" :key="item.itemid" hover-class="navigator-hover"
  89. @click="onselectSku(item)">
  90. <view class="itemname">
  91. {{ item.itemname }}
  92. </view>
  93. <view class="row">
  94. 产品编号: {{ item.sku || '--' }}
  95. </view>
  96. <view class="row">
  97. 产品型号: {{ item.model || '--' }}
  98. </view>
  99. <view class="row">
  100. 经销商: {{ item.enterprisename || '--' }}
  101. </view>
  102. <view class="row">
  103. 用户信息: {{ item.name || '--' }} {{ item.phonenumber || '--' }}
  104. </view>
  105. </view>
  106. <view style="height: 30px;" />
  107. </scroll-view>
  108. </up-popup>
  109. <up-popup :show="myProducts.length" @close="closePopup" :customStyle="{
  110. width: '80vw',
  111. }" mode="right">
  112. <scroll-view :safeAreaInsetBottom="false" scroll-y style="width: 100%;height: 100vh;">
  113. <view class="product" v-for="item in myProducts" :key="item.itemid" hover-class="navigator-hover"
  114. @click="onSelectedProduct(item)">
  115. <view class="itemname">
  116. {{ item.itemname }}
  117. </view>
  118. <view class="row">
  119. 产品编号: {{ item.sku || '--' }}
  120. </view>
  121. <view class="row">
  122. 产品型号: {{ item.model || '--' }}
  123. </view>
  124. <view class="row">
  125. 经销商: {{ item.enterprisename || '--' }}
  126. </view>
  127. <view class="row">
  128. 用户信息: {{ item.name || '--' }} {{ item.phonenumber || '--' }}
  129. </view>
  130. </view>
  131. <view style="height: 30px;" />
  132. </scroll-view>
  133. </up-popup>
  134. <!-- 查看产品编号选项弹窗 -->
  135. <up-popup :show="showGuidePopup" @close="showGuidePopup = false" zIndex="1" mode="center"
  136. :customStyle="{ width: '85%', borderRadius: '16rpx' }">
  137. <view class="popup-content">
  138. <view class="popup-title">如何查看产品编号</view>
  139. <view class="popup-subtitle">请选择查看方式</view>
  140. <view class="option-list">
  141. <view v-for="option in imageOptions" :key="option.value" class="option-item"
  142. @click="selectSerialNumberOption(option)">
  143. <span>{{ option.label }}</span>
  144. <view class="option-icon">
  145. <up-icon name="arrow-right" color="#2979ff" size="24rpx" />
  146. </view>
  147. </view>
  148. </view>
  149. <view class="popup-footer">
  150. <view class="close-button" @click="showGuidePopup = false">关闭</view>
  151. </view>
  152. </view>
  153. </up-popup>
  154. </template>
  155. <script setup>
  156. import { ref, reactive, getCurrentInstance } from 'vue';
  157. const { $Http } = getCurrentInstance().proxy;
  158. import { onShow } from '@dcloudio/uni-app';
  159. const WuserRecord = ref(uni.getStorageSync('WuserRecord') || {
  160. name: '',
  161. phonenumber: '',
  162. address: "",
  163. province: '',
  164. city: '',
  165. county: '',
  166. sys_enterpriseid: 0,
  167. sa_customersid: 0
  168. }),
  169. WuserMsg = wx.getStorageSync('WuserMsg');
  170. const uFormRef = ref(null);
  171. const showGuidePopup = ref(false);
  172. const imageOptions = [
  173. { value: 'product', label: '产品机身-产品台面右上角', image: '/static/image/产品台面右上角.jpg' },
  174. { value: 'manual', label: '说明书-最后一页', image: '/static/image/说明书最后一页.jpg' },
  175. { value: 'package', label: '外包装-侧面白色标贴', image: '/static/image/外包装侧面白色标贴.png' }
  176. ];
  177. const form = reactive({
  178. sa_serviceorderid: 0,
  179. sa_orderid: 0,
  180. servicetype: '', // 服务类型
  181. class1: '', // 产品品类
  182. class2: '', // 故障类型
  183. sku: '', // 产品编号
  184. itemid: '', // 产品ID
  185. itemname: '', // 产品名称
  186. itemno: '', // 产品编号
  187. model: '', // 产品型号
  188. cardno: '', // 保修卡号
  189. scenecontact: '', // 现场联系人
  190. scenecontactphonenumber: WuserRecord.value.phonenumber || WuserMsg.phonenumber || '', // 联系人电话
  191. customername: WuserRecord.value.name || "", // 客户名称
  192. customerphonenumber: WuserRecord.value.phonenumber || "", // 客户电话
  193. province: '', // 省
  194. city: '', // 市
  195. county: '', // 县
  196. address: '', // 详细地址
  197. remarks: '',
  198. sa_customersid: WuserRecord.value.sa_customersid || 0,
  199. sys_enterpriseid: 0,
  200. });
  201. const rules = reactive({
  202. servicetype: [{ required: true, message: '请选择服务类型', trigger: 'change' }],
  203. class1: [{ required: true, message: '请选择产品品类', trigger: 'change' }],
  204. class2: [{ required: false, message: "请选择故障类型", trigger: 'change' }],
  205. sku: [{ required: false, message: '请输入产品编号', trigger: 'blur' }],
  206. itemno: [{ required: false, message: '请输入产品编号', trigger: 'blur' }],
  207. itemname: [{ required: false, message: '请选择产品', trigger: 'blur' }],
  208. model: [{ required: false, message: '请输入产品型号', trigger: 'blur' }],
  209. cardno: [{ required: false, message: '请输入保修卡号', trigger: 'blur' }],
  210. province: [{ required: true, message: '请选择省市县', trigger: 'change' }],
  211. address: [{ required: true, message: '请输入详细地址', trigger: 'blur' }],
  212. scenecontact: [{ required: true, message: '请输入联系人', trigger: 'blur' }],
  213. scenecontactphonenumber: [{ required: true, message: '请输入联系人电话', trigger: 'blur', pattern: /^1(3[0-9]|4[01456879]|5[0-35-9]|6[2567]|7[0-8]|8[0-9]|9[0-35-9])\d{8}$/, message: '请输入正确的手机号码' }],
  214. remarks: [{ required: true, message: '产品问题描述及服务需求', trigger: 'blur' }],
  215. });
  216. // 切换故障类型
  217. function changeClass2(e) {
  218. let index = e.detail.value - 0;
  219. form.class2 = class2.value[index].value;
  220. }
  221. // 设置产品编号必填规则
  222. function setItemnoRequired() {
  223. // 产品品类选择集成灶的情况下,产品编号必填
  224. if (form.class1 == '集成灶') {
  225. rules.sku[0].required = true;
  226. } else {
  227. // 其他品类仅服务类型为安装时必填
  228. rules.sku[0].required = form.servicetype == '安装';
  229. }
  230. uFormRef.value.setRules(rules);
  231. }
  232. // 切换服务类型
  233. function servicetypeChange(type) {
  234. rules.class2[0].required = type == '维修';
  235. rules.sku[0].required = type == '安装';
  236. rules.remarks[0].required = type == '维修';
  237. // 更新产品编号必填规则
  238. setItemnoRequired();
  239. }
  240. // 切换产品品类
  241. function class1Change() {
  242. // 更新产品编号必填规则
  243. setItemnoRequired();
  244. }
  245. const class1 = ref(''),
  246. servertypes = ref(['安装', '维修', '清洗']),
  247. class2 = ref('');
  248. onShow(() => {
  249. $Http.getClass('servertype').then(res => {
  250. servertypes.value = res.data.map(v => v.value);
  251. if (res.code !== 1) return uni.showToast({ title: res.msg, icon: 'none' });
  252. });
  253. $Http.getClass('prodclass1').then(res => {
  254. class1.value = res.data;
  255. if (res.code !== 1) return uni.showToast({ title: res.msg, icon: 'none' });
  256. });
  257. $Http.getClass('faulttype').then(res => {
  258. class2.value = res.data;
  259. uFormRef.value.setRules(rules);
  260. if (res.code !== 1) return uni.showToast({ title: res.msg, icon: 'none' });
  261. });
  262. });
  263. // 保存
  264. let loading = ref(false);
  265. function save() {
  266. if (querySku.value === false) return uni.showToast({ title: '产品编号不正确', icon: 'none' });
  267. if (loading.value) return;
  268. uFormRef.value.validate().then(valid => {
  269. if (valid) wx.showModal({
  270. content: '请确认预约信息正确以便后续服务,是否确认提交?',
  271. title: '提示',
  272. success: ({ confirm }) => {
  273. if (confirm) {
  274. form.customername = form.scenecontact;
  275. form.customerphonenumber = form.scenecontactphonenumber;
  276. form.name = form.customername;
  277. form.phonenumber = form.scenecontactphonenumber;
  278. form.sa_customersid = form.sa_customersid || 0;
  279. form.sys_enterpriseid = form.sys_enterpriseid || WuserRecord.value.sys_enterpriseid || 0;
  280. let content = {
  281. ...form,
  282. };
  283. loading.value = true;
  284. $Http.basic({
  285. "id": "20230206091403",
  286. content
  287. }).then(res => {
  288. loading.value = false;
  289. console.log("提交申请单", res);
  290. if (res.code !== 1) {
  291. uni.showToast({ title: res.code !== 1 ? res.msg : "保存成功", icon: 'none', mask: res.code == 1 });
  292. } else {
  293. uni.showModal({
  294. showCancel: false,
  295. content: "预约申请已提交,请保持电话畅通,以便后续服务人员联系您!",
  296. success: (success) => {
  297. uni.navigateBack();
  298. },
  299. })
  300. $Http.basic({
  301. id: 20230206101403,
  302. content: {
  303. sa_serviceorderid: res.data.sa_serviceorderid,
  304. backreason: "",
  305. issumbit: 1
  306. }
  307. }).then(res1 => {
  308. console.log("提交工单", res1);
  309. })
  310. }
  311. }).catch(err => {
  312. loading.value = false;
  313. console.error("保存工单失败", err);
  314. uni.showToast({ title: '保存失败,请稍后重试', icon: 'none' });
  315. });
  316. }
  317. },
  318. })
  319. })
  320. }
  321. function changeRegion(value) {
  322. form.province = value[0];
  323. form.city = value[1];
  324. form.county = value[2];
  325. }
  326. let querySku = ref(true); // SKU是否正确
  327. function skuConfirm() {
  328. if (form.sku) {
  329. ['contact', 'serviceenterprisename', 'cardno', 'itemid', 'itemname', 'itemno', 'model', 'phonenumber', 'unitname', 'spec'].forEach(key => {
  330. form[key] = '';
  331. });
  332. if (form.sku == '') return;
  333. uni.showLoading({
  334. title: '查询中...',
  335. mask: true,
  336. });
  337. $Http.basic({
  338. "id": 2025080813465203,
  339. "content": {
  340. "pageNumber": 1,
  341. "pageSize": 1,
  342. "where": {
  343. sku: form.sku,
  344. }
  345. }
  346. }).then(res => {
  347. console.log("查询sku", res)
  348. uni.hideLoading();
  349. if (res.code !== 1) return uni.showToast({ title: res.msg, icon: 'none' });
  350. if (res.data.length === 0 || res.data[0].sku !== form.sku) {
  351. uni.showToast({ title: '未找到对应的产品信息', icon: 'none' });
  352. querySku.value = false;
  353. return;
  354. }
  355. querySku.value = true;
  356. onselectSku(res.data[0])
  357. })
  358. } else {
  359. form.sku = '';
  360. }
  361. }
  362. function onselectSku(item) {
  363. item.contact = item.name;
  364. item.serviceenterprisename = item.serviceenterprisename || item.enterprisename;
  365. ['customername', 'customerphonenumber', 'cardno', 'itemid', 'model', 'itemname', 'itemno', 'sa_customersid', 'sys_enterpriseid'].forEach(key => {
  366. form[key] = item[key] || '';
  367. });
  368. uni.showToast({ title: '成功带入产品信息', icon: 'none' });
  369. querySku.value = true;
  370. closePopup();
  371. if (item.sa_agentsid) {
  372. $Http.basic({
  373. "classname": "webmanage.sale.agents.agents",
  374. "method": "query_agentMain",
  375. "content": { "nocache": true, "sa_agentsid": item.sa_agentsid },
  376. }).then(res => {
  377. console.log("经销商档案id", res)
  378. if (res.code !== 1) return;
  379. if (res.data.type == '网销') {
  380. form.isonlinesales = 1;
  381. } else {
  382. form.isonlinesales = 0;
  383. }
  384. })
  385. } else {
  386. form.isonlinesales = 0;
  387. }
  388. }
  389. let products = ref([]); // 产品列表
  390. function closePopup() {
  391. products.value = [];
  392. myProducts.value = [];
  393. }
  394. function openScan() {
  395. uni.navigateTo({
  396. url: '/pages/bookingService/getCode'
  397. });
  398. $Http.getCode = (code) => {
  399. form.sku = code || '';
  400. skuConfirm();
  401. uni.navigateBack()
  402. delete $Http.getCode;
  403. }
  404. }
  405. function validatePhoneNumber(value) {
  406. // 空值/非字符串直接返回false
  407. if (!value || typeof value !== 'string') return false;
  408. const trimmedValue = value.trim();
  409. // 1. 精准手机号校验(使用你提供的规则)
  410. const mobileReg = /^1(3[0-9]|4[01456879]|5[0-35-9]|6[2567]|7[0-8]|8[0-9]|9[0-35-9])\d{8}$/;
  411. if (mobileReg.test(trimmedValue)) {
  412. return true;
  413. }
  414. // 2. 手机号不通过,校验座机号(0开头区号+3-4位区号+7-8位号码)
  415. const cleanedTel = trimmedValue.replace(/[- ]/g, ''); // 去除分隔符
  416. const telReg = /^0\d{2,3}\d{7,8}$/; // 座机号规则:0开头区号(3-4位)+ 7-8位号码
  417. return telReg.test(cleanedTel);
  418. }
  419. let myProducts = ref([]); // 我的产品列表
  420. if (WuserRecord.value.sa_customersid) $Http.basic({
  421. id: 2025082115363003,
  422. content: {
  423. sa_customersid: WuserRecord.value.sa_customersid,
  424. "pageNumber": 1,
  425. "pageSize": 20,
  426. "where": {
  427. "status": '',
  428. "condition": ""
  429. }
  430. }
  431. }).then(res => {
  432. console.log("我的产品", res)
  433. myProducts.value = res.data;
  434. if (res.code == 1) {
  435. if (res.data.length == 1) {
  436. onSelectedProduct(res.data[0]);
  437. } else {
  438. myProducts.value = res.data;
  439. WuserRecord.value.myProducts = res.data.length;
  440. }
  441. }
  442. })
  443. function toSelectMyProduct() {
  444. uni.navigateTo({
  445. url: '/pages/select/myProduct'
  446. });
  447. $Http.onSelected = (item) => {
  448. onSelectedProduct(item)
  449. uni.navigateBack()
  450. delete $Http.onSelected
  451. }
  452. }
  453. function onSelectedProduct(item) {
  454. console.log("选择我的产品", item);
  455. ['contact', 'phonenumber', 'sku', 'serviceenterprisename', 'cardno', 'itemid', 'itemname', 'itemno', 'model', 'unitname', 'spec', 'sys_enterpriseid'].forEach(key => {
  456. form[key] = item[key] || '';
  457. });
  458. closePopup();
  459. }
  460. // 显示如何查看产品编号的选项
  461. function showSerialNumberGuide() {
  462. showGuidePopup.value = true;
  463. }
  464. // 选择查看方式并显示对应图片
  465. function selectSerialNumberOption(option) {
  466. uni.previewImage({
  467. urls: [option.image],
  468. current: 0,
  469. success: function (res) {
  470. console.log('预览图片成功');
  471. },
  472. fail: function (res) {
  473. console.log('预览图片失败', res);
  474. },
  475. complete: function (e) {
  476. console.log(e)
  477. }
  478. });
  479. }
  480. </script>
  481. <style lang="scss" scoped>
  482. .content {
  483. width: 100vw;
  484. padding: 20px;
  485. box-sizing: border-box;
  486. min-height: 100vh;
  487. background: #fff;
  488. .picker {
  489. font-size: 28rpx;
  490. color: #606266;
  491. padding: 9px;
  492. border-radius: 8rpx;
  493. border: 1rpx solid #2979FF;
  494. color: #2979FF;
  495. }
  496. .title {
  497. font-size: 34rpx;
  498. color: #4773EE;
  499. margin: 20rpx 0;
  500. font-weight: bold;
  501. display: flex;
  502. align-items: center;
  503. justify-content: space-between;
  504. }
  505. .serial-number-guide {
  506. display: flex;
  507. align-items: center;
  508. font-size: 24rpx;
  509. color: #2979ff;
  510. cursor: pointer;
  511. gap: 5rpx;
  512. }
  513. .serial-number-guide span {
  514. text-decoration: underline;
  515. }
  516. .region {
  517. font-size: 28rpx;
  518. color: #606266;
  519. padding: 10px 9px;
  520. width: 280px;
  521. box-sizing: border-box;
  522. border-radius: 8rpx;
  523. border: 1rpx solid #dadbde !important;
  524. }
  525. }
  526. .product {
  527. padding: 20rpx;
  528. background: #fff;
  529. margin: 10rpx 0;
  530. border-radius: 8rpx;
  531. box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
  532. .itemname {
  533. font-size: 32rpx;
  534. color: #333;
  535. font-weight: bold;
  536. margin-bottom: 10rpx;
  537. }
  538. .row {
  539. font-size: 28rpx;
  540. color: #666;
  541. margin-top: 8rpx;
  542. }
  543. }
  544. .my-but {
  545. line-height: 44rpx;
  546. padding: 0 20rpx;
  547. background: #2979ff;
  548. color: #fff;
  549. border-radius: 8rpx;
  550. margin-right: 10rpx;
  551. font-size: 24rpx;
  552. }
  553. .popup-content {
  554. padding: 30rpx;
  555. background: #fff;
  556. border-radius: 16rpx;
  557. display: flex;
  558. flex-direction: column;
  559. gap: 20rpx;
  560. }
  561. .popup-title {
  562. font-size: 32rpx;
  563. font-weight: bold;
  564. text-align: center;
  565. color: #333;
  566. margin: 0;
  567. }
  568. .popup-subtitle {
  569. font-size: 24rpx;
  570. text-align: center;
  571. color: #666;
  572. margin: 0;
  573. }
  574. .option-list {
  575. display: flex;
  576. flex-direction: column;
  577. gap: 15rpx;
  578. }
  579. .option-item {
  580. padding: 25rpx;
  581. border: 1rpx solid #e5e5e5;
  582. border-radius: 12rpx;
  583. font-size: 28rpx;
  584. color: #333;
  585. cursor: pointer;
  586. transition: all 0.3s;
  587. display: flex;
  588. align-items: center;
  589. justify-content: space-between;
  590. }
  591. .option-item:hover {
  592. background: #f5f5f5;
  593. border-color: #2979ff;
  594. color: #2979ff;
  595. }
  596. .option-icon {
  597. display: flex;
  598. align-items: center;
  599. }
  600. .popup-footer {
  601. display: flex;
  602. justify-content: center;
  603. margin-top: 5rpx;
  604. }
  605. .close-button {
  606. padding: 12rpx 60rpx;
  607. background: #f5f5f5;
  608. border-radius: 8rpx;
  609. font-size: 26rpx;
  610. color: #333;
  611. cursor: pointer;
  612. transition: all 0.3s;
  613. }
  614. .close-button:hover {
  615. background: #e5e5e5;
  616. }
  617. </style>