租房小程序前端代码
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

836 lines
27 KiB

6 months ago
5 days ago
6 months ago
6 months ago
5 days ago
6 months ago
5 days ago
6 months ago
5 days ago
6 months ago
5 days ago
6 months ago
6 months ago
5 days ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
5 days ago
6 months ago
6 months ago
6 months ago
5 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
5 days ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
5 days ago
5 days ago
5 days ago
5 days ago
5 days ago
5 days ago
5 days ago
5 days ago
5 days ago
5 days ago
6 months ago
6 months ago
5 days ago
5 days ago
6 months ago
  1. <template>
  2. <view class="Locations">
  3. <map style="width: 100%;height: 60vh;pointer-events: auto;"
  4. :layer-style='5'
  5. :show-location='true'
  6. :latitude="position.latitude"
  7. :longitude="position.longitude"
  8. :markers="spotGuideMarkers"
  9. :scale="scale"
  10. @markertap="markertap"
  11. id="mapId"
  12. @callouttap="callouttap"
  13. :enable-zoom="true"
  14. :enable-scroll="true"
  15. :enable-rotate="true">
  16. </map>
  17. <!-- 测试按钮 -->
  18. <view class="test-button" @click="testLoadHouseList">
  19. <text>测试加载房源</text>
  20. </view>
  21. <!-- 搜索功能 -->
  22. <view class="search-container">
  23. <view class="se-bgc-white se-pb-20 se-pt-30 se-px-40">
  24. <uv-search @search="onSearch" placeholder="搜索租房信息" :showAction="false" v-model="keyword" :disabled="false"></uv-search>
  25. </view>
  26. <view class="se-pb-10 se-px-40 se-bgc-white">
  27. <uv-drop-down ref="dropDown" sign="dropDown_1" text-active-color="#1EC77A"
  28. :extra-icon="{name:'arrow-down-fill',color:'#666',size:'26rpx'}"
  29. :extra-active-icon="{name:'arrow-up-fill',color:'#1EC77A',size:'26rpx'}" :defaultValue="defaultValue"
  30. :custom-style="{padding: '0rpx 0rpx',borderBottom:'1rpx solid transparent'}" @click="selectMenu">
  31. <uv-drop-down-item name="region" type="2" :label="dropItem('region').label" :value="dropItem('region').value">
  32. </uv-drop-down-item>
  33. <uv-drop-down-item name="rent" type="2" :label="dropItem('rent').label" :value="dropItem('rent').value">
  34. </uv-drop-down-item>
  35. <uv-drop-down-item name="type" type="2" :label="dropItem('type').label" :value="dropItem('type').value">
  36. </uv-drop-down-item>
  37. <uv-drop-down-item name="duration" type="2" :label="dropItem('duration').label" :value="dropItem('duration').value">
  38. </uv-drop-down-item>
  39. </uv-drop-down>
  40. <uv-drop-down-popup sign="dropDown_1" :click-overlay-on-close="true" :currentDropItem="currentDropItem"
  41. @clickItem="clickItem" @popupChange="change"></uv-drop-down-popup>
  42. </view>
  43. </view>
  44. <view class="Locations-list">
  45. <!-- 房源列表 -->
  46. <homeList :list="list"></homeList>
  47. </view>
  48. </view>
  49. </template>
  50. <script>
  51. import { housePageList, houseType, houseArea, houseIconClass, housePrice, houseYear } from "@/common/api.js"
  52. import { getInfo } from "@/common/api.js"
  53. import homeList from "@/components/home/homeList.vue"
  54. export default {
  55. components: {
  56. homeList
  57. },
  58. data() {
  59. return {
  60. scale: 12, //缩放级别
  61. show: true,
  62. tabs: [],
  63. spotGuideIndex: 0, // 当前选中的菜单索引
  64. position: {
  65. latitude: 23.106574,
  66. longitude: 113.324587
  67. },
  68. areaId: null, // 当前选中的区域ID
  69. // 房源列表相关数据
  70. list: [],
  71. classId: null,
  72. pageNo: 1,
  73. pageSize: 10,
  74. houseTypeList: [], // 房源类型列表
  75. currentHouseType: 0, // 当前选中的房源类型索引
  76. userInfo: null, // 用户信息
  77. // 搜索功能相关数据
  78. keyword: "",
  79. // 表示value等于这些值,就属于默认值
  80. defaultValue: ['all', 'all', 'all','all'],
  81. // 筛选结果
  82. result: [],
  83. region:{
  84. label: '区域',
  85. value: 'all',
  86. activeIndex: 0,
  87. color: '#333',
  88. activeColor: '#1EC77A',
  89. child: []
  90. },
  91. rent:{
  92. label: '租金',
  93. value: 'all',
  94. activeIndex: 0,
  95. color: '#333',
  96. activeColor: '#1EC77A',
  97. child: []
  98. },
  99. type: {
  100. label: '类型',
  101. value: 'all',
  102. activeIndex: 0,
  103. color: '#333',
  104. activeColor: '#1EC77A',
  105. child: []
  106. },
  107. duration:{
  108. label: '年限',
  109. value: 'all',
  110. activeIndex: 0,
  111. color: '#333',
  112. activeColor: '#1EC77A',
  113. child: []
  114. },
  115. activeName: 'region',
  116. // 筛选条件
  117. priceId: null,
  118. classId: null,
  119. yearId: null
  120. }
  121. },
  122. computed: {
  123. spotGuideMarkers() {
  124. let markers = [];
  125. console.log('计算地图标记点,房源列表长度:', this.list.length)
  126. this.list.forEach((item, index) => {
  127. if (item.latitude && item.longitude) {
  128. console.log(`添加标记点 ${index}:`, item.title, item.latitude, item.longitude)
  129. markers.push({
  130. id: index,
  131. latitude: parseFloat(item.latitude),
  132. longitude: parseFloat(item.longitude),
  133. iconPath: '/static/image/tourGuide/2.png',
  134. width: 30,
  135. height: 30,
  136. callout: {
  137. content: item.title || '房源',
  138. color: '#000000',
  139. fontSize: 14,
  140. borderRadius: 5,
  141. bgColor: '#ffffff',
  142. padding: 5,
  143. display: 'ALWAYS'
  144. }
  145. });
  146. }
  147. });
  148. console.log('生成的标记点数量:', markers.length)
  149. return markers;
  150. },
  151. // 搜索功能计算属性
  152. dropItem() {
  153. return (name) => {
  154. const result = {};
  155. const find = this.result.find(item => item.name === name);
  156. if (find) {
  157. result.label = find.label;
  158. result.value = find.value;
  159. } else {
  160. result.label = this[name].label;
  161. result.value = this[name].value;
  162. }
  163. return result;
  164. }
  165. },
  166. // 获取当前下拉筛选项
  167. currentDropItem() {
  168. return this[this.activeName];
  169. }
  170. },
  171. onLoad() {
  172. console.log('页面加载完成')
  173. // 确保在页面加载完成后初始化数据
  174. this.$nextTick(() => {
  175. if (this.list.length === 0) {
  176. this.onHousePageList()
  177. }
  178. })
  179. },
  180. onPageScroll() {
  181. // 滚动后及时更新下拉菜单位置
  182. if (this.$refs.dropDown) {
  183. this.$refs.dropDown.init();
  184. }
  185. },
  186. mounted() {
  187. this.getCurrentLocation()
  188. this.onHouseType() // 获取房源类型
  189. //this.getUserInfo() // 获取用户信息
  190. // 初始化搜索筛选数据
  191. this.initSearchData()
  192. // 延迟加载房源列表,确保用户信息已获取
  193. this.$nextTick(() => {
  194. this.onHousePageList() // 加载房源列表
  195. })
  196. },
  197. onPullDownRefresh() {
  198. let that = this
  199. that.pageNo = 1
  200. that.list = []
  201. that.onHousePageList()
  202. },
  203. onReachBottom() {
  204. let that = this
  205. that.pageNo = that.pageNo + 1
  206. that.onHousePageList()
  207. },
  208. methods: {
  209. getUserInfo(state){
  210. this.$store.commit('getUserInfo', (userInfo) => {
  211. this.userInfo = userInfo
  212. if(userInfo && userInfo.isPay != 1){
  213. uni.showModal({
  214. title: '开通会员可查看租房地图',
  215. content: '开通会员后可查看详细地址和联系方式',
  216. confirmText: '立即开通',
  217. cancelText: '取消',
  218. success : res => {
  219. if(res.confirm){
  220. // 跳转到会员页面
  221. uni.navigateTo({
  222. url: '/pages_subpack/member/index'
  223. })
  224. }
  225. }
  226. })
  227. }
  228. })
  229. },
  230. // 获取当前位置
  231. getCurrentLocation() {
  232. const that = this;
  233. uni.getLocation({
  234. type: 'wgs84',
  235. success: function (res) {
  236. console.log('当前位置的经度:' + res.longitude);
  237. console.log('当前位置的纬度:' + res.latitude);
  238. that.position.latitude = res.latitude;
  239. that.position.longitude = res.longitude;
  240. // 更新地图位置
  241. that.onHousePageList();
  242. },
  243. fail: function (err) {
  244. console.error('获取位置失败:', err);
  245. uni.showToast({
  246. title: '获取位置失败',
  247. icon: 'none'
  248. });
  249. }
  250. });
  251. },
  252. //点击tab栏
  253. clickTabs({ index, name }) {
  254. this.currentArea = index
  255. if (this.areaList[index]) {
  256. this.areaId = this.areaList[index].id
  257. }
  258. this.onHousePageList()
  259. this.$nextTick(() => {
  260. this.selectArea()
  261. })
  262. },
  263. setSpotGuideIndex(index) {
  264. this.spotGuideIndex = index
  265. this.onHousePageList()
  266. },
  267. textToSpeech() {
  268. console.log('textToSpeech');
  269. let self = this
  270. // self.context.src = this.$config.baseUrl + '/info/textToAudio?text=' + "你好"
  271. // self.context.play()
  272. // return
  273. plugin.textToSpeech({
  274. lang: "zh_CN",
  275. tts: true,
  276. content: "景德镇市陶阳里御窑景区位于景德镇的城市中心地带,北起瓷都大桥、昌江大道,南至昌江大桥、西至沿江西路,东至莲社路、胜利路。 自宋以来,景德镇先民“沿河建窑,因窑成市”,渐呈“码头—民窑—老街—里弄—御窑”聚落的历史空间和瓷业肌理,形成了世界建筑史上绝无仅有的老城格局,成就了中国“东方瓷国”的盛誉,陶瓷成为了中国走向世界,世界认识中国的文化符号。这里是景德镇历史上制瓷业的中心、原点和高峰,是“一带一路”海上陶瓷之路的零公里起点,是研究皇家御窑制瓷历史文化和景德镇陶瓷技艺,讲好景德镇故事,传播中国声音的“窗口”和“名片”。",
  277. success: function (res) {
  278. self.context.src = res.filename;
  279. self.context.play()
  280. },
  281. fail: function (res) {
  282. console.log("fail tts", res)
  283. }
  284. })
  285. },
  286. //地图点击事件
  287. markertap(e) {
  288. console.log("markertap===你点击了标记点===", e)
  289. let event = this.list[e.markerId]
  290. if (event) {
  291. this.onDetail(event)
  292. } else {
  293. console.error('未找到对应的房源数据')
  294. uni.showToast({
  295. title: '房源信息获取失败',
  296. icon: 'none'
  297. })
  298. }
  299. },
  300. openLocation(n) {
  301. uni.openLocation({
  302. latitude: n.spotLatitude,
  303. longitude: n.spotLongitude,
  304. })
  305. },
  306. //地图点击事件
  307. callouttap(e) {
  308. console.log('callouttap地图点击事件', e)
  309. let event = this.list[e.markerId]
  310. if (event && event.latitude && event.longitude) {
  311. uni.openLocation({
  312. latitude: event.latitude,
  313. longitude: event.longitude,
  314. })
  315. } else {
  316. console.error('未找到对应的房源位置信息')
  317. uni.showToast({
  318. title: '房源位置信息获取失败',
  319. icon: 'none'
  320. })
  321. }
  322. },
  323. toUrl(item) {
  324. console.log(item);
  325. if (item.categoryId == 0) {
  326. this.$utils.navigateTo(`/pages_order/service/articleDetail?id=${item.id}&type=Inheritance`)
  327. }
  328. },
  329. // 点击按钮将地图中心移动到指定定位点
  330. moveTolocation(latitude, longitude) {
  331. let mapObjs = uni.createMapContext('mapId', this)
  332. mapObjs.moveToLocation(
  333. {
  334. latitude,
  335. longitude
  336. },
  337. {
  338. complete: res => {
  339. console.log('移动完成:', res)
  340. }
  341. })
  342. // this.onRegionChange('',true)
  343. },
  344. // 点击景区,选择最近的一个景点
  345. selectArea() {
  346. let item = this.spotGuide[0]
  347. if (item && item.spotLatitude && item.spotLongitude) {
  348. this.moveTolocation(item.spotLatitude, item.spotLongitude)
  349. }
  350. },
  351. clickAreaDetail(id) {
  352. uni.navigateTo({
  353. url: '/pages_order/service/areaDetail?id=' + id
  354. })
  355. },
  356. // 获取房源类型列表
  357. onHouseType() {
  358. houseType({}).then(response => {
  359. console.info('houseType', response)
  360. this.houseTypeList = response.result
  361. }).catch(error => {
  362. })
  363. },
  364. // 点击房源类型
  365. onClickHouseType(event) {
  366. console.info(event)
  367. let that = this
  368. that.pageNo = 1
  369. that.classId = event.id
  370. that.currentHouseType = event.index
  371. that.list = []
  372. that.onHousePageList()
  373. },
  374. // 获取房源列表
  375. onHousePageList() {
  376. let that = this
  377. let params = {
  378. classId: that.classId,
  379. pageNo: that.pageNo,
  380. pageSize: that.pageSize,
  381. // 搜索和筛选参数
  382. title: that.keyword, // 关键词搜索
  383. areaId: that.areaId, // 区域筛选
  384. priceId: that.priceId, // 租金筛选
  385. classId: that.classId, // 类型筛选
  386. yearId: that.yearId // 年限筛选
  387. }
  388. // 如果有位置信息,添加到参数中
  389. if (that.position.latitude && that.position.longitude) {
  390. params.latitude = that.position.latitude
  391. params.longitude = that.position.longitude
  392. }
  393. console.log('请求房源列表参数:', params)
  394. housePageList(params).then((response) => {
  395. console.info("房源列表数据", response.result.records)
  396. if (response.result && response.result.records) {
  397. response.result.records.forEach((items, indexs) => {
  398. if (items.image) {
  399. items.images = items.image.split(',')
  400. } else {
  401. items.images = []
  402. }
  403. if (items.homeImage) {
  404. items.homeImages = items.homeImage.split(',')
  405. } else {
  406. items.homeImages = []
  407. }
  408. if (items.iconTitle) {
  409. items.iconTitles = items.iconTitle.split(',')
  410. } else {
  411. items.iconTitles = []
  412. }
  413. })
  414. that.list = that.list.concat(response.result.records)
  415. // 调试信息:检查有多少房源有位置信息
  416. let markersCount = that.list.filter(item => item.latitude && item.longitude).length
  417. console.log(`房源总数: ${that.list.length}, 有位置信息的房源: ${markersCount}`)
  418. // 如果有房源数据,更新地图中心点
  419. if (that.list.length > 0) {
  420. let firstHouse = that.list.find(item => item.latitude && item.longitude)
  421. if (firstHouse) {
  422. that.position.latitude = firstHouse.latitude
  423. that.position.longitude = firstHouse.longitude
  424. }
  425. // 强制更新地图组件
  426. that.$nextTick(() => {
  427. let mapContext = uni.createMapContext('mapId', that)
  428. if (mapContext) {
  429. mapContext.updateGroundOverlay({
  430. id: 'markers',
  431. 'include-points': that.spotGuideMarkers
  432. })
  433. }
  434. })
  435. }
  436. }
  437. }).catch((error) => {
  438. console.error('获取房源列表失败:', error)
  439. uni.showToast({
  440. title: '获取房源列表失败',
  441. icon: 'none'
  442. })
  443. })
  444. },
  445. // 点击房源详情
  446. onDetail(event) {
  447. uni.navigateTo({
  448. url: "/pages_subpack/detail/index?id=" + event.id
  449. })
  450. },
  451. // 搜索功能相关方法
  452. // 初始化搜索筛选数据
  453. initSearchData() {
  454. this.onhouseArea()
  455. this.onhouseIconClass()
  456. this.onhousePrice()
  457. this.onhouseYear()
  458. },
  459. // 处理搜索
  460. onSearch(value) {
  461. // 如果传入了搜索值,使用传入的值,否则使用当前keyword
  462. if (value !== undefined) {
  463. this.keyword = value;
  464. }
  465. console.info('搜索关键词:', this.keyword)
  466. this.pageNo = 1
  467. this.list = []
  468. this.onHousePageList()
  469. },
  470. // 选择筛选菜单
  471. selectMenu(e) {
  472. const { name, active, type } = e;
  473. this.activeName = name;
  474. // type 等于1 的需要特殊处理:type不等于1可以忽略
  475. if (type == 1) {
  476. this.clickItem({
  477. name: 'vip_type',
  478. label: 'VIP文档',
  479. value: e.active ? 1 : 0
  480. });
  481. } else {
  482. const find = this.result.find(item => item.name == this.activeName);
  483. if (find) {
  484. const findIndex = this[this.activeName].child.findIndex(item => item.label == find.label && item.value == find.value);
  485. this[this.activeName].activeIndex = findIndex;
  486. } else {
  487. this[this.activeName].activeIndex = 0;
  488. }
  489. }
  490. },
  491. // 点击筛选项
  492. clickItem(e) {
  493. let { label, value } = e;
  494. // 处理筛选结果数组
  495. const findIndex = this.result.findIndex(item => item.name == this.activeName);
  496. if (this.defaultValue.indexOf(value) > -1 && this[this.activeName].label) {
  497. label = this[this.activeName].label;
  498. }
  499. // 已经存在筛选项
  500. if (findIndex > -1) {
  501. this.$set(this.result, findIndex, {
  502. name: this.activeName,
  503. label,
  504. value
  505. });
  506. } else {
  507. this.result.push({
  508. name: this.activeName,
  509. label,
  510. value
  511. });
  512. }
  513. // 过滤掉默认值
  514. this.result = this.result.filter(item => this.defaultValue.indexOf(item.value) == -1);
  515. console.log('筛选结果:', this.result);
  516. // 处理筛选逻辑
  517. this.handleFilter({ label, value });
  518. },
  519. // 处理筛选
  520. handleFilter(item) {
  521. console.info('筛选条件变化:', item)
  522. this.pageNo = 1
  523. // 根据筛选类型设置对应的参数
  524. if (this.activeName === 'region') {
  525. this.areaId = item.value === 'all' ? null : item.value
  526. } else if (this.activeName === 'rent') {
  527. this.priceId = item.value === 'all' ? null : item.value
  528. } else if (this.activeName === 'type') {
  529. this.classId = item.value === 'all' ? null : item.value
  530. } else if (this.activeName === 'duration') {
  531. this.yearId = item.value === 'all' ? null : item.value
  532. }
  533. this.list = []
  534. this.onHousePageList()
  535. },
  536. // 弹窗状态变化
  537. change(e) {
  538. console.log('弹窗打开状态:', e);
  539. },
  540. // 获取区域数据
  541. onhouseArea() {
  542. let that = this
  543. houseArea({}).then(response => {
  544. let arr = [
  545. {
  546. label: '全部',
  547. value: 'all'
  548. }
  549. ]
  550. response.result.forEach(items => {
  551. let obj = {}
  552. obj.label = items.title;
  553. obj.value = items.id
  554. arr.push(obj)
  555. })
  556. that.region.child = arr
  557. console.info('区域数据', response.result)
  558. }).catch(error => {
  559. })
  560. },
  561. // 获取类型数据
  562. onhouseIconClass() {
  563. let that = this
  564. houseIconClass({}).then(response => {
  565. console.info('类型数据', response.result)
  566. let arr = [
  567. {
  568. label: '全部',
  569. value: 'all'
  570. }
  571. ]
  572. response.result.forEach(items => {
  573. let obj = {}
  574. obj.label = items.title;
  575. obj.value = items.id
  576. arr.push(obj)
  577. })
  578. that.type.child = arr
  579. }).catch(error => {
  580. })
  581. },
  582. // 获取价格数据
  583. onhousePrice() {
  584. let that = this
  585. housePrice({}).then(response => {
  586. let arr = [
  587. {
  588. label: '全部',
  589. value: 'all'
  590. }
  591. ]
  592. response.result.forEach(items => {
  593. let obj = {}
  594. obj.label = items.title;
  595. obj.value = items.price
  596. arr.push(obj)
  597. })
  598. that.rent.child = arr
  599. }).catch(error => {
  600. })
  601. },
  602. // 获取年限数据
  603. onhouseYear() {
  604. let that = this
  605. houseYear({}).then(response => {
  606. console.info('年限数据', response.result)
  607. let arr = [
  608. {
  609. label: '全部',
  610. value: 'all'
  611. }
  612. ]
  613. response.result.forEach(items => {
  614. let obj = {}
  615. obj.label = items.title;
  616. obj.value = items.timeGo
  617. arr.push(obj)
  618. })
  619. that.duration.child = arr
  620. }).catch(error => {
  621. })
  622. },
  623. // 测试加载房源列表
  624. testLoadHouseList() {
  625. console.log('手动触发房源列表加载');
  626. this.pageNo = 1;
  627. this.list = [];
  628. this.onHousePageList();
  629. }
  630. }
  631. }
  632. </script>
  633. <style scoped lang="scss">
  634. .test-button {
  635. position: fixed;
  636. top: 20rpx;
  637. right: 20rpx;
  638. background-color: #1EC77A;
  639. color: white;
  640. padding: 20rpx;
  641. border-radius: 10rpx;
  642. z-index: 999;
  643. font-size: 24rpx;
  644. }
  645. .Locations {
  646. .search-container {
  647. position: relative;
  648. background-color: #fff;
  649. z-index: 100;
  650. // 确保搜索框可以正常点击
  651. .se-bgc-white {
  652. position: relative;
  653. z-index: 101;
  654. }
  655. // 确保下拉菜单可以正常显示和点击
  656. /deep/ .uv-drop-down {
  657. position: relative;
  658. z-index: 102;
  659. }
  660. /deep/ .uv-drop-down-popup {
  661. z-index: 103 !important;
  662. }
  663. border-bottom: 1rpx solid #f0f0f0;
  664. }
  665. .tabs {
  666. display: flex;
  667. &>view {
  668. flex: 1;
  669. margin: 20rpx 10rpx;
  670. padding: 20rpx 10rpx;
  671. background-color: #e8f7f0;
  672. color: #1EC77A;
  673. border-radius: 40rpx;
  674. font-size: 24rpx;
  675. text-align: center;
  676. }
  677. .act {
  678. background-color: #1EC77A;
  679. color: #fff;
  680. }
  681. }
  682. .Locations-list {
  683. .main {
  684. display: flex;
  685. margin: 20rpx;
  686. .main-image {
  687. width: 150rpx;
  688. height: 150rpx;
  689. border-radius: 20rpx;
  690. }
  691. .info {
  692. margin-left: 20rpx;
  693. .title {
  694. font-size: 30rpx;
  695. font-weight: 900;
  696. }
  697. .tips {
  698. font-size: 24rpx;
  699. color: #999999;
  700. margin-top: 10rpx;
  701. }
  702. }
  703. .controls {
  704. margin-left: auto;
  705. display: flex;
  706. flex-direction: column;
  707. justify-content: center;
  708. align-items: center;
  709. .f {
  710. image {
  711. width: 50rpx;
  712. height: 50rpx;
  713. }
  714. }
  715. }
  716. .btn {
  717. padding: 10rpx;
  718. font-size: 22rpx;
  719. color: #1EC77A;
  720. border: 1rpx solid #1EC77A;
  721. background-color: #e8f7f0;
  722. display: flex;
  723. justify-content: center;
  724. align-items: center;
  725. margin-top: 10rpx;
  726. border-radius: 15rpx;
  727. image {
  728. width: 25rpx;
  729. height: 25rpx;
  730. }
  731. text {
  732. margin: 0 10rpx;
  733. }
  734. }
  735. }
  736. .list {
  737. padding-left: 40rpx;
  738. .main {
  739. align-items: center;
  740. .main-image {
  741. width: 140rpx;
  742. height: 140rpx;
  743. }
  744. .controls {
  745. flex-direction: row;
  746. .f {
  747. margin: 30rpx;
  748. image {
  749. width: 40rpx;
  750. height: 40rpx;
  751. }
  752. }
  753. }
  754. }
  755. }
  756. }
  757. }
  758. </style>