mapShow.vue 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694
  1. <template>
  2. <view class="page" :style="{ height: windowHeight + 'px', flexDirection: flexDirection }">
  3. <view id="map" :style="{ height: mapHeight + 'px', width: mapWidth + 'px' }" class='map' />
  4. <view v-show="popupShow" class="popup" :style="{ height: popupHeight + 'px', width: popupWidth + 'px' }">
  5. <!-- <uni-section title="活动路线列表" type="line"> -->
  6. <uni-data-picker class="actionsTree" :style="{ width: popupWidth + 'px' }" placeholder="请选择活动" popup-title="请选择活动路线" :localdata="actionsTree"
  7. v-model="sltActRoute" @change="onActionChange" @popupopened="onActionsTreePopupOpened" @popupclosed="onActionsTreePopupClosed"></uni-data-picker>
  8. <!-- </uni-section> -->
  9. <!-- <uni-section title="玩家列表" type="line"> -->
  10. <scroll-view :scroll-top="0" scroll-y="true" class="scroll-Y" :style="{ height: popupHeight - 35 + 'px'}">
  11. <uni-list v-for="(item, index) in players" :key="index" :border="true" class="list">
  12. <uni-list-item :clickable="true" @click="onPlayerListItemClick(item)" class="list-item" :class="{
  13. 'list-item-focus': focusPlayerId == item.id
  14. }">
  15. <template v-slot:header>
  16. <!-- <image class="slot-image" src="/static/logo.png" mode="widthFix"></image> -->
  17. <div class="slot-image" :style="'background-color:' + getPlayerColor(item.id)"></div>
  18. </template>
  19. <template v-slot:body>
  20. <view class="slot-box">
  21. <view class="slot-title">
  22. [{{index+1}}] <span class="slot-phone" @click="onPhoneClick(item.phone)">
  23. {{item.name}} </span>
  24. 打点 {{item.effectivenum}}/{{item.totalcontrolnum}} 距离
  25. {{item.distance}}米 配速 {{formatTime(item.pace, false)}}
  26. </view>
  27. <view class="slot-note">
  28. 心率 {{item.lasthr}} 平均 {{item.avghr}} 最大 {{item.maxhr}} | Cal
  29. {{Math.round(item.calorie/1000)}} Ck {{item.ck}} Ei
  30. {{Math.round(item.ei*100)/100}}
  31. </view>
  32. </view>
  33. </template>
  34. <!-- <template v-slot:footer>
  35. <image class="slot-image" src="/static/logo.png" mode="widthFix"></image>
  36. </template> -->
  37. </uni-list-item>
  38. </uni-list>
  39. </scroll-view>
  40. <!-- </uni-section> -->
  41. </view>
  42. </view>
  43. </template>
  44. <script>
  45. import {
  46. mapState,
  47. mapGetters
  48. } from 'vuex'
  49. import {
  50. DefaultRequest,
  51. IdRequest,
  52. } from "@/grpc/base_pb.js"
  53. import {
  54. ToActionIdAndCourseIdRequest
  55. } from "@/grpc/track_offical_pb.js"
  56. import {
  57. formatTime
  58. } from "@/utils/util.js"
  59. export default {
  60. components: {},
  61. data() {
  62. return {
  63. interval_loadActionsTree: null,
  64. interval_loadData: null,
  65. actionsTreePopup: false,
  66. systemInfo: null,
  67. flexDirection: 'column',
  68. windowHeight: 0,
  69. windowWidth: 0,
  70. mapHeight: 0,
  71. mapWidth: 0,
  72. popupHeight: 0,
  73. popupWidth: 0,
  74. popupHeightPortrait: 360, // 竖屏状态下的底部弹框高度
  75. popupWidthlandscape: 336, // 横屏状态下的右侧弹框宽度
  76. popupType: 'bottom',
  77. popupShow: false,
  78. extraIcon: {
  79. // color: '#4cd964',
  80. // size: '22',
  81. // type: 'gear-filled'
  82. },
  83. mapId: 0,
  84. mapDetail: {},
  85. mapUrl: null,
  86. mapInfo: {},
  87. actionId: 0,
  88. actionDetail: {},
  89. routeId: 0,
  90. routeDetail: {},
  91. // checkPoints: [],
  92. nextCP: [], // 用户即将到达控制点列表
  93. players: [],
  94. players_position: [],
  95. focusPlayerId: 0,
  96. trailTime: 0,
  97. sltActRoute: '',
  98. actionsTree: []
  99. }
  100. },
  101. computed: {
  102. ...mapState([
  103. 'username', // 映射 this.username 为 store.state.username
  104. ]),
  105. ...mapGetters([
  106. 'metadata'
  107. ]),
  108. },
  109. mounted() {
  110. this.$global.getWindowInfo()
  111. uni.$on('windowResize', this.reLoad)
  112. this.popupShow = this.$store.state.mapPopupShow
  113. this.layoutInit()
  114. },
  115. onLoad(option) {
  116. console.log('[onLoad] mapId:' + option.mapId)
  117. if (option.mapId > 0) {
  118. this.mapId = option.mapId
  119. this.loadMap(this.mapId)
  120. if (this.mapId == this.$store.state.mapSltMapId) { // 页面重载
  121. this.sltActRoute = this.$store.state.mapSltActRoute
  122. this.loadData(this.sltActRoute)
  123. }
  124. if (this.interval_loadActionsTree != null) {
  125. clearInterval(this.interval_loadActionsTree)
  126. }
  127. let that = this
  128. this.interval_loadActionsTree = setInterval(async function() {
  129. if (!that.actionsTreePopup) {
  130. await that.loadActionsTree()
  131. }
  132. }, 3000);
  133. }
  134. },
  135. beforeDestroy() {
  136. console.log("[beforeDestroy]")
  137. clearInterval(this.interval_loadActionsTree)
  138. clearInterval(this.interval_loadData)
  139. // leafletHelper.free()
  140. uni.$off('windowResize', this.reLoad)
  141. },
  142. methods: {
  143. formatTime,
  144. reLoad() {
  145. this.$store.commit('setMapSltMapId', this.mapId)
  146. this.savePlayersData()
  147. var fullPath = this.$route.fullPath
  148. console.log("[windowResize] reLaunch: " + fullPath)
  149. uni.redirectTo({
  150. url: fullPath
  151. });
  152. },
  153. // 布局初始化 设置地图高度
  154. layoutInit() {
  155. this.windowHeight = this.$global.windowHeight
  156. this.windowWidth = this.$global.windowWidth
  157. if (this.$global.deviceOrientation == 'portrait') { // 竖屏
  158. this.flexDirection = 'column'
  159. this.mapWidth = this.$global.windowWidth
  160. this.mapHeight = this.$global.windowHeight
  161. // if (this.popupShow) {
  162. // this.mapHeight = this.$global.windowHeight - this.popupHeightPortrait
  163. // } else {
  164. // this.mapHeight = this.$global.windowHeight
  165. // }
  166. // console.log("竖屏", this.mapHeight)
  167. this.popupHeight = this.popupHeightPortrait
  168. this.popupWidth = this.$global.windowWidth
  169. } else { // 横屏
  170. this.flexDirection = 'row'
  171. this.mapHeight = this.$global.windowHeight
  172. this.mapWidth = this.$global.windowWidth
  173. // if (this.popupShow) {
  174. // this.mapWidth = this.$global.windowWidth - this.popupWidthlandscape
  175. // } else {
  176. // this.mapWidth = this.$global.windowWidth
  177. // }
  178. // console.log("横屏", this.mapWidth)
  179. this.popupHeight = this.$global.windowHeight
  180. this.popupWidth = this.popupWidthlandscape
  181. // console.log("横屏 popupHeight", this.popupHeight)
  182. }
  183. },
  184. popupToggle() {
  185. this.popupShow = !this.popupShow
  186. this.$store.commit('setMapPopupShow', this.popupShow)
  187. // this.layoutInit()
  188. },
  189. fullScreenToggle() {
  190. this.$global.fullscreen()
  191. this.$global.getWindowInfo()
  192. this.layoutInit()
  193. },
  194. makeActionsTree(actselectrsList) {
  195. this.actionsTree.length = 0 // 先清空数组
  196. for (let i = 0; i < actselectrsList.length; i++) {
  197. var act = actselectrsList[i]
  198. var pushData = {
  199. text: act.actname,
  200. value: act.actid,
  201. children: []
  202. }
  203. var actUserNum = 0
  204. for (let j = 0; j < act.courseselectrsList.length; j++) {
  205. var course = act.courseselectrsList[j]
  206. actUserNum += course.courseusernum
  207. pushData.children.push({
  208. text: course.coursename + ' (' + course.courseusernum + '人)',
  209. value: act.actid + '-' + course.courseid
  210. })
  211. }
  212. if (actUserNum >= 0) {
  213. pushData.children.unshift({
  214. text: '全部 (' + actUserNum + '人)',
  215. value: act.actid + '-' + 0
  216. })
  217. }
  218. pushData.text += ' (' + actUserNum + '人)'
  219. this.actionsTree.push(pushData)
  220. }
  221. // console.log("[makeActionsTree]" + JSON.stringify(this.actionsTree))
  222. },
  223. async loadMap() {
  224. await this.loadActionsTree()
  225. uni.setNavigationBarTitle({
  226. title: this.mapDetail.mapinfo.mapname
  227. });
  228. // console.log(this.actionDetail)
  229. this.initMap()
  230. this.handleMapToggle()
  231. },
  232. async loadActionsTree() {
  233. this.mapDetail = await this.getToMapDetail(this.mapId)
  234. this.makeActionsTree(this.mapDetail.actselectrsList)
  235. },
  236. async loadData(sltActRoute) {
  237. console.log("[loadData] sltActRoute: ", sltActRoute)
  238. if (sltActRoute == null || sltActRoute.length == 0) {
  239. return
  240. }
  241. var actRouteArr = sltActRoute[1].value.split('-')
  242. this.actionId = actRouteArr[0]
  243. this.routeId = actRouteArr[1]
  244. this.actionDetail = await this.getToActionDetail(this.actionId, this.routeId)
  245. uni.setNavigationBarTitle({
  246. title: this.mapDetail.mapinfo.mapname + ' - ' + this.actionDetail.name
  247. });
  248. // console.log(this.actionDetail)
  249. if (this.interval_loadData != null) {
  250. clearInterval(this.interval_loadData)
  251. }
  252. this.players = await this.getToUsersInGameDetail(this.actionId, this.routeId)
  253. // console.log('players', that.players)
  254. // leafletHelper.global.setPlayers(this.players)
  255. this.players_position = await this.getToUsersInGameGpsQuery(this.actionId, this.routeId)
  256. // leafletHelper.global.setPlayersPosition(this.players_position)
  257. this.nextCP = await this.getToNextControlPointInGame(this.actionId, this.routeId)
  258. this.handleMapDrawRoute()
  259. this.handleMapDrawPlayer()
  260. this.handleMapDrawTrail()
  261. let that = this
  262. this.interval_loadData = setInterval(async function() {
  263. that.players = await that.getToUsersInGameDetail(that.actionId, that.routeId)
  264. that.players_position = await that.getToUsersInGameGpsQuery(that.actionId, that
  265. .routeId)
  266. that.nextCP = await that.getToNextControlPointInGame(that.actionId, that.routeId)
  267. //// leaflet.leafletHelper.global.setPlayers(that.players)
  268. // leafletHelper.global.setPlayersPosition(that.players_position)
  269. that.handleMapDrawPlayer()
  270. that.handleMapDrawTrail()
  271. }, 1000);
  272. },
  273. //场控端_地图详情
  274. async getToMapDetail(mapId) {
  275. try {
  276. return new Promise((resolve, reject) => {
  277. // 创建请求参数并赋值
  278. var request = new IdRequest()
  279. request.setId(mapId)
  280. // 调用客户端相应的grpc方法,发送grpc请求,并接受后台发送回来的返回值
  281. this.$client.toMapDetail(request, this.metadata, (err, response) => {
  282. if (err) {
  283. console.warn(`[toMapDetail] err: code = ${err.code}` +
  284. `, message = "${err.message}"`)
  285. reject(err)
  286. } else {
  287. let res = response.toObject()
  288. // console.log('[toMapDetail]', res)
  289. resolve(res)
  290. }
  291. })
  292. });
  293. } catch (e) {
  294. console.log('[getToMapDetail] err', e)
  295. reject(e)
  296. }
  297. },
  298. //场控端_活动详情
  299. async getToActionDetail(actId, routeId = 0) {
  300. try {
  301. return new Promise((resolve, reject) => {
  302. // 创建请求参数并赋值
  303. var request = new ToActionIdAndCourseIdRequest()
  304. request.setActid(actId)
  305. request.setCourseid(routeId)
  306. // 调用客户端相应的grpc方法,发送grpc请求,并接受后台发送回来的返回值
  307. this.$client.toActionDetail(request, this.metadata, (err, response) => {
  308. if (err) {
  309. console.warn(`[toActionDetail] err: code = ${err.code}` +
  310. `, message = "${err.message}"`)
  311. reject(err)
  312. } else {
  313. let res = response.toObject()
  314. console.log('[toActionDetail]', res)
  315. resolve(res)
  316. }
  317. })
  318. });
  319. } catch (e) {
  320. console.log('[getToActionDetail] err', e)
  321. reject(e)
  322. }
  323. },
  324. //场控端_正在进行中所有用户实时信息
  325. async getToUsersInGameDetail(actId, routeId = 0) {
  326. try {
  327. return new Promise((resolve, reject) => {
  328. // 创建请求参数并赋值
  329. var request = new ToActionIdAndCourseIdRequest()
  330. request.setActid(actId)
  331. request.setCourseid(routeId)
  332. // 调用客户端相应的grpc方法,发送grpc请求,并接受后台发送回来的返回值
  333. this.$client.toUsersInGameDetail(request, this.metadata, (err,
  334. response) => {
  335. if (err) {
  336. console.warn(`[toUsersInGameDetail] err: code = ${err.code}` +
  337. `, message = "${err.message}"`)
  338. reject(err)
  339. } else {
  340. let res = response.toObject()
  341. // console.log('[toUsersInGameDetail]', res)
  342. resolve(res.usersList)
  343. }
  344. })
  345. });
  346. } catch (e) {
  347. console.log('[getToUsersInGameDetail] err', e)
  348. reject(e)
  349. }
  350. },
  351. //场控端_正在进行中所有用户实时gps查询
  352. async getToUsersInGameGpsQuery(actId, routeId = 0) {
  353. try {
  354. return new Promise((resolve, reject) => {
  355. // 创建请求参数并赋值
  356. var request = new ToActionIdAndCourseIdRequest()
  357. request.setActid(actId)
  358. request.setCourseid(routeId)
  359. // 调用客户端相应的grpc方法,发送grpc请求,并接受后台发送回来的返回值
  360. this.$client.toUsersInGameGpsQuery(request, this.metadata, (err,
  361. response) => {
  362. if (err) {
  363. console.warn(`[toUsersInGameGpsQuery] err: code = ${err.code}` +
  364. `, message = "${err.message}"`)
  365. reject(err)
  366. } else {
  367. let res = response.toObject()
  368. // console.log('[toUsersInGameGpsQuery]', res)
  369. resolve(res.gpsinfoList)
  370. }
  371. })
  372. });
  373. } catch (e) {
  374. console.log('[getToUsersInGameGpsQuery] err', e)
  375. reject(e)
  376. }
  377. },
  378. //场控端_正在进行中所有用户即将到达控制点列表,结果去重
  379. async getToNextControlPointInGame(actId, routeId = 0) {
  380. try {
  381. return new Promise((resolve, reject) => {
  382. // 创建请求参数并赋值
  383. var request = new ToActionIdAndCourseIdRequest()
  384. request.setActid(actId)
  385. request.setCourseid(routeId)
  386. // 调用客户端相应的grpc方法,发送grpc请求,并接受后台发送回来的返回值
  387. this.$client.toNextControlPointInGame(request, this.metadata, (err,
  388. response) => {
  389. if (err) {
  390. console.warn(`[toNextControlPointInGame] err: code = ${err.code}` +
  391. `, message = "${err.message}"`)
  392. reject(err)
  393. } else {
  394. let res = response.toObject()
  395. // console.log('[toNextControlPointInGame]', res)
  396. resolve(res.nextcontrolpointrsList)
  397. }
  398. })
  399. });
  400. } catch (e) {
  401. console.log('[getToUsersInGameGpsQuery] err', e)
  402. reject(e)
  403. }
  404. },
  405. onActionChange(e) {
  406. const sltActRoute = e.detail.value
  407. console.log("onActionChange", sltActRoute)
  408. this.$store.commit('setMapSltActRoute', sltActRoute)
  409. if (sltActRoute == null || sltActRoute.length == 0) {
  410. this.reLoad()
  411. return
  412. }
  413. this.loadData(sltActRoute)
  414. },
  415. onActionsTreePopupOpened() {
  416. // console.log("onActionsTreePopupOpened")
  417. this.actionsTreePopup = true
  418. },
  419. onActionsTreePopupClosed() {
  420. // console.log("onActionsTreePopupClosed")
  421. this.actionsTreePopup = false
  422. },
  423. onPlayerListItemClick(item) {
  424. // console.log("onListItemClick", item)
  425. this.handlePlayerListItemClick(item)
  426. },
  427. onPhoneClick(phoneNumber) {
  428. if (phoneNumber.length == 11) {
  429. uni.makePhoneCall({
  430. phoneNumber: phoneNumber
  431. })
  432. } else {
  433. uni.showToast({
  434. title: '手机号码不正确',
  435. icon: 'none'
  436. })
  437. }
  438. },
  439. }
  440. }
  441. </script>
  442. <script module="leaflet" lang="renderjs">
  443. import 'leaflet/dist/leaflet.css'
  444. import '@/utils/map/leafletHelper.css'
  445. // import mapHelper from '@/utils/mapHelper'
  446. import leafletHelper from '@/utils/map/leafletHelper'
  447. export default {
  448. components: {},
  449. // data() {
  450. // return {},
  451. // },
  452. // mounted() {
  453. // uni.$on('myEvent', this.myEventHandler);
  454. // },
  455. // destroyed() {
  456. // uni.$off('myEvent', this.myEventHandler);
  457. // },
  458. beforeDestroy() {
  459. // console.log("beforeDestroy")
  460. // clearInterval(this.interval_loadData)
  461. leafletHelper.free()
  462. },
  463. methods: {
  464. // myEventHandler(data) {
  465. // console.log('视图层接收到数据:', data);
  466. // },
  467. initMap() {
  468. if (this.mapDetail != null && this.mapDetail.mapinfo != null) {
  469. // const mapid = this.mapDetail.mapinfo.lid
  470. const mapUrl = this.mapDetail.mapinfo.mapurl
  471. const centPoint = [this.mapDetail.mapinfo.centerlatitude, this.mapDetail.mapinfo.centerlongitude]
  472. const zoomNum = this.mapDetail.mapinfo.defscale
  473. const mapOptions = {
  474. center: centPoint,
  475. zoom: zoomNum,
  476. maxBounds: [
  477. [36.659365, 117.105246],
  478. [36.653753, 117.122841]
  479. ],
  480. }
  481. leafletHelper.init(this, 'map', mapUrl, mapOptions)
  482. }
  483. },
  484. handleWindowResize() {
  485. leafletHelper.onWindowResize()
  486. },
  487. handleMapDrawRoute() {
  488. // leafletHelper.global.setCheckPoints(this.checkPoints)
  489. // leafletHelper.global.setRoutes(this.mapDetail.routesList)
  490. leafletHelper.global.setRoutes(this.actionDetail.routesList)
  491. // leafletHelper.checkPoint.drawAllCheckPoints()
  492. // leafletHelper.checkPoint.drawPath()
  493. leafletHelper.route.drawAllRoutes()
  494. // leafletHelper.route.drawAllPath()
  495. },
  496. handleMapDrawPlayer() {
  497. leafletHelper.global.setPlayers(this.players)
  498. leafletHelper.global.setPlayersPosition(this.players_position)
  499. leafletHelper.player.drawAllPlayers()
  500. // leafletHelper.player.drawOnePlayer(2)
  501. // leafletHelper.player.drawOnePlayer(3)
  502. leafletHelper.global.dealStaleData()
  503. },
  504. handleMapDrawTrail() {
  505. this.trailTime = leafletHelper.config.trailTime
  506. // leafletHelper.player.drawOneTrail(2, 10000)
  507. // leafletHelper.player.drawOneTrail(3, 10000)
  508. // leafletHelper.player.drawOneTrail(2, 0, false)
  509. leafletHelper.player.drawAllTrails(this.trailTime)
  510. },
  511. handleMapToggle() {
  512. // leafletHelper.checkPoint.toggle(true)
  513. // leafletHelper.route.toggle(true)
  514. // leafletHelper.player.togglePlayer(true)
  515. // leafletHelper.player.toggleTooltip(true)
  516. // leafletHelper.player.toggleTrail(true)
  517. leafletHelper.route.toggle(this.$store.state.mapControlRoute)
  518. leafletHelper.player.togglePlayer(this.$store.state.mapControlPlayer)
  519. leafletHelper.player.toggleTooltip(this.$store.state.mapControlTooltip)
  520. leafletHelper.player.toggleTrail(this.$store.state.mapControlTrail)
  521. },
  522. handlePlayerListItemClick(item) {
  523. this.focusPlayerId = item.id
  524. leafletHelper.player.handleFocusPlayer(this.focusPlayerId)
  525. },
  526. getPlayerColor(playerId) {
  527. if (playerId != this.focusPlayerId)
  528. return leafletHelper.player.getPlayerColor(playerId)
  529. else
  530. return leafletHelper.config.gStyle.marker.focus.fillColor
  531. },
  532. // 页面reLoad前调用本方法,将用户数据先保存,页面重载后再进行数据恢复
  533. savePlayersData() {
  534. leafletHelper.global.savePlayersData()
  535. },
  536. },
  537. }
  538. </script>
  539. <style lang="scss" scoped>
  540. .page {
  541. display: flex;
  542. // margin: 0px;
  543. // padding: 0px;
  544. }
  545. // 勿删,解决map控件获得焦点后出现边框颜色的问题
  546. :focus-visible {
  547. outline: none;
  548. }
  549. .map {
  550. flex: 1 1 auto;
  551. background-color: white;
  552. z-index: 0;
  553. // display: flex;
  554. // justify-content: center;
  555. // align-items: center;
  556. }
  557. .popup {
  558. display: flex;
  559. flex-direction: column;
  560. align-items: center;
  561. background-color: #f5f5f5;
  562. border-left: #dedede solid 1px;
  563. // border-top: #dedede solid 1px;
  564. // overflow: scroll;
  565. }
  566. .actionsTree {
  567. // width: 100%;
  568. // background-color: #ffffff;
  569. /deep/ .input-value-border {
  570. border-top: 1px solid #e5e5e5;
  571. border-bottom: 1px solid #e5e5e5;
  572. border-radius: 0px;
  573. }
  574. /deep/ .uni-scroll-view {
  575. overflow: unset !important;
  576. }
  577. }
  578. .scroll-Y {
  579. // height: 100vh;
  580. }
  581. .list {
  582. margin-left: -6px;
  583. }
  584. .list-item {
  585. /* #ifndef APP-NVUE */
  586. display: flex;
  587. /* #endif */
  588. flex-direction: row;
  589. align-items: center;
  590. height: 46px;
  591. }
  592. .list-item-focus {
  593. background-color: #fffaef !important;
  594. }
  595. .slot-box {
  596. /* #ifndef APP-NVUE */
  597. display: flex;
  598. /* #endif */
  599. flex-direction: column;
  600. align-items: flex-start;
  601. width: 330px;
  602. max-width: 350px;
  603. }
  604. .slot-image {
  605. /* #ifndef APP-NVUE */
  606. display: block;
  607. /* #endif */
  608. margin-right: 6px;
  609. width: 6px;
  610. height: 33px;
  611. align-self: center;
  612. }
  613. .slot-title {
  614. flex: 1;
  615. font-size: 13px;
  616. color: #424242;
  617. line-height: 18px;
  618. // margin-right: 10px;
  619. // overflow:hidden; //超出的文本隐藏
  620. // text-overflow:ellipsis; //溢出用省略号显示
  621. white-space: nowrap; //溢出不换行
  622. }
  623. .slot-note {
  624. flex: 1;
  625. font-size: 12px;
  626. color: #7d8da7;
  627. line-height: 18px;
  628. // margin-right: 10px;
  629. // overflow:hidden; //超出的文本隐藏
  630. // text-overflow:ellipsis; //溢出用省略号显示
  631. white-space: nowrap; //溢出不换行
  632. }
  633. .slot-phone {
  634. padding: 0 5px;
  635. color: #000;
  636. font-weight: bold;
  637. }
  638. /deep/ .uni-data-tree-dialog {
  639. top: 39px;
  640. }
  641. </style>