xingchengxiangqing.wxml 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420
  1. <view class="container">
  2. <!-- 顶部导航 - 更现代化的设计 -->
  3. <view class="header">
  4. <view class="back-btn" bindtap="navigateBack">
  5. <image src="/images/icons/back.png" class="back-icon"></image>
  6. <text>返回</text>
  7. </view>
  8. <text class="title">行程详情</text>
  9. <view class="header-right"></view> <!-- 保持对称 -->
  10. </view>
  11. <!-- 行程基本信息 - 卡片设计优化 -->
  12. <view class="plan-info-card">
  13. <view class="plan-header">
  14. <text class="plan-title">{{plan.title}}</text>
  15. <view class="plan-days-badge">{{plan.days}}天行程</view>
  16. </view>
  17. <view class="plan-meta">
  18. <view class="meta-item">
  19. <image src="/images/icons/calendar-red.png" class="meta-icon"></image>
  20. <text>{{plan.created_at}}</text>
  21. </view>
  22. </view>
  23. <view class="plan-desc-box">
  24. <image src="/images/icons/quote.png" class="quote-icon"></image>
  25. <text class="plan-desc">{{plan.description}}</text>
  26. </view>
  27. <!-- 城市标签 - 更活泼的设计 -->
  28. <view class="city-tags">
  29. <block wx:for="{{plan.cities}}" wx:key="id">
  30. <view class="city-tag">
  31. <image src="/images/icons/location-red.png" class="tag-icon"></image>
  32. <text>{{item.name}}</text>
  33. </view>
  34. </block>
  35. </view>
  36. </view>
  37. <!-- 每日行程 - 时间轴设计 -->
  38. <view class="timeline">
  39. <view wx:for="{{plan.day_plans}}" wx:key="day" class="timeline-item">
  40. <!-- 时间轴左侧标记 -->
  41. <view class="timeline-marker" style="background-color: {{['#e54d42','#f37b1d','#1cbbb4','#0081ff','#6739b6','#9c26b0','#e03997'][index%7]}}">
  42. <text>DAY {{item.day_number}}</text>
  43. </view>
  44. <!-- 时间轴内容 -->
  45. <view class="timeline-content">
  46. <view class="day-theme-box">
  47. <image src="/images/icons/theme.png" class="theme-icon"></image>
  48. <text class="day-theme">{{item.theme}}</text>
  49. </view>
  50. <!-- 景点列表 -->
  51. <view class="attractions">
  52. <view wx:for="{{item.spots}}" wx:key="id" class="attraction-card">
  53. <view class="attraction-header">
  54. <view class="attraction-index">{{index + 1}}</view>
  55. <text class="attraction-name">{{item.name}}</text>
  56. <view class="attraction-status {{item.has_checked ? 'checked' : ''}}">
  57. {{item.has_checked ? '✓ 已打卡' : '未打卡'}}
  58. </view>
  59. </view>
  60. <view class="attraction-actions">
  61. <button class="checkin-btn" bindtap="viewCheckins" data-spot-id="{{item.id}}" data-plan-id="{{plan.id}}">
  62. <image src="/images/icons/checkin-history.png" class="action-icon"></image>
  63. 查看打卡
  64. </button>
  65. </view>
  66. <view class="attraction-body">
  67. <view class="attraction-image-box">
  68. <image
  69. src="{{spotImages[item.id] || item.image || '/images/default-spot.jpg'}}"
  70. class="attraction-image"
  71. mode="aspectFill">
  72. </image>
  73. <view class="image-overlay"></view>
  74. </view>
  75. <view class="attraction-details">
  76. <view class="detail-row">
  77. <image src="/images/icons/time-small.png" class="detail-icon"></image>
  78. <text>{{item.visit_time}} · 约{{item.duration}}分钟</text>
  79. </view>
  80. <view class="detail-row">
  81. <image src="/images/icons/location.png" class="detail-icon"></image>
  82. <text>{{item.address}}</text>
  83. </view>
  84. <view class="section">
  85. <view class="section-title">
  86. <image src="/images/icons/info.png" class="section-icon"></image>
  87. <text>景点介绍</text>
  88. </view>
  89. <text class="section-content">{{item.description}}</text>
  90. </view>
  91. <view class="section">
  92. <view class="section-title">
  93. <image src="/images/icons/history.png" class="section-icon"></image>
  94. <text>历史意义</text>
  95. </view>
  96. <text class="section-content">{{item.history_significance}}</text>
  97. </view>
  98. </view>
  99. </view>
  100. </view>
  101. </view>
  102. <!-- 当日总结 -->
  103. <view class="day-summary">
  104. <view class="summary-header">
  105. <image src="/images/icons/summary-red.png" class="summary-icon"></image>
  106. <text>当日总结</text>
  107. </view>
  108. <text class="summary-content">{{item.summary}}</text>
  109. </view>
  110. </view>
  111. </view>
  112. </view>
  113. <!-- 底部操作按钮 - 悬浮设计 -->
  114. <view class="floating-actions">
  115. <button class="share-btn" bindtap="sharePlan">
  116. <image src="/images/icons/share-white.png" class="btn-icon"></image>
  117. 分享行程
  118. </button>
  119. <button class="map-btn" bindtap="viewOnMap">
  120. <image src="/images/icons/map-white.png" class="btn-icon"></image>
  121. 查看地图
  122. </button>
  123. </view>
  124. </view>
  125. <!-- 在页面底部添加打卡记录弹窗 -->
  126. <view class="checkin-modal {{showCheckinModal ? 'show' : ''}}">
  127. <view class="modal-mask" bindtap="closeCheckinModal"></view>
  128. <view class="modal-content">
  129. <view class="modal-header">
  130. <text class="modal-title">打卡记录</text>
  131. <view class="modal-close" bindtap="closeCheckinModal">
  132. <image src="/images/icons/close-circle.png" class="close-icon"></image>
  133. </view>
  134. </view>
  135. <swiper class="checkin-swiper" current="{{currentCheckinIndex}}" bindchange="swiperChange">
  136. <block wx:for="{{currentCheckins}}" wx:key="id">
  137. <swiper-item>
  138. <view class="checkin-item">
  139. <view class="checkin-image-box">
  140. <image src="{{item.image_url || '/images/default-checkin.jpg'}}" class="checkin-image" mode="aspectFit"></image>
  141. </view>
  142. <view class="checkin-info">
  143. <text class="checkin-time">{{item.check_in_time}}</text>
  144. <text class="checkin-note">{{item.note || '暂无文案'}}</text>
  145. </view>
  146. </view>
  147. </swiper-item>
  148. </block>
  149. </swiper>
  150. </view>
  151. </view>
  152. <view class="container">
  153. <!-- 顶部导航 - 更现代化的设计 -->
  154. <view class="header">
  155. <view class="back-btn" bindtap="navigateBack">
  156. <image src="/images/icons/back.png" class="back-icon"></image>
  157. <text>返回</text>
  158. </view>
  159. <text class="title">行程详情</text>
  160. <view class="header-right"></view> <!-- 保持对称 -->
  161. </view>
  162. <!-- 行程基本信息 - 卡片设计优化 -->
  163. <view class="plan-info-card">
  164. <view class="plan-header">
  165. <text class="plan-title">{{plan.title}}</text>
  166. <view class="plan-days-badge">{{plan.days}}天行程</view>
  167. </view>
  168. <view class="plan-meta">
  169. <view class="meta-item">
  170. <image src="/images/icons/calendar-red.png" class="meta-icon"></image>
  171. <text>{{plan.created_at}}</text>
  172. </view>
  173. </view>
  174. <view class="plan-desc-box">
  175. <image src="/images/icons/quote.png" class="quote-icon"></image>
  176. <text class="plan-desc">{{plan.description}}</text>
  177. </view>
  178. <!-- 城市标签 - 更活泼的设计 -->
  179. <view class="city-tags">
  180. <block wx:for="{{plan.cities}}" wx:key="id">
  181. <view class="city-tag">
  182. <image src="/images/icons/location-red.png" class="tag-icon"></image>
  183. <text>{{item.name}}</text>
  184. </view>
  185. </block>
  186. </view>
  187. </view>
  188. <!-- 每日行程 - 时间轴设计 -->
  189. <view class="timeline">
  190. <view wx:for="{{plan.day_plans}}" wx:key="day" class="timeline-item">
  191. <!-- 时间轴左侧标记 -->
  192. <view class="timeline-marker" style="background-color: {{['#e54d42','#f37b1d','#1cbbb4','#0081ff','#6739b6','#9c26b0','#e03997'][index%7]}}">
  193. <text>DAY {{item.day_number}}</text>
  194. </view>
  195. <!-- 时间轴内容 -->
  196. <view class="timeline-content">
  197. <view class="day-theme-box">
  198. <image src="/images/icons/theme.png" class="theme-icon"></image>
  199. <text class="day-theme">{{item.theme}}</text>
  200. </view>
  201. <!-- 景点列表 -->
  202. <view class="attractions">
  203. <view wx:for="{{item.spots}}" wx:key="id" class="attraction-card">
  204. <view class="attraction-header">
  205. <view class="attraction-index">{{index + 1}}</view>
  206. <text class="attraction-name">{{item.name}}</text>
  207. <view class="attraction-status {{item.has_checked ? 'checked' : ''}}">
  208. {{item.has_checked ? '✓ 已打卡' : '未打卡'}}
  209. </view>
  210. </view>
  211. <view class="attraction-actions">
  212. <button class="checkin-btn" bindtap="viewCheckins" data-spot-id="{{item.id}}" data-plan-id="{{plan.id}}">
  213. <image src="/images/icons/checkin-history.png" class="action-icon"></image>
  214. 查看打卡
  215. </button>
  216. </view>
  217. <view class="attraction-body">
  218. <view class="attraction-image-box">
  219. <image
  220. src="{{spotImages[item.id] || item.image || '/images/default-spot.jpg'}}"
  221. class="attraction-image"
  222. mode="aspectFill">
  223. </image>
  224. <view class="image-overlay"></view>
  225. </view>
  226. <view class="attraction-details">
  227. <view class="detail-row">
  228. <image src="/images/icons/time-small.png" class="detail-icon"></image>
  229. <text>{{item.visit_time}} · 约{{item.duration}}分钟</text>
  230. </view>
  231. <view class="detail-row">
  232. <image src="/images/icons/location.png" class="detail-icon"></image>
  233. <text>{{item.address}}</text>
  234. </view>
  235. <view class="section">
  236. <view class="section-title">
  237. <image src="/images/icons/info.png" class="section-icon"></image>
  238. <text>景点介绍</text>
  239. </view>
  240. <text class="section-content">{{item.description}}</text>
  241. </view>
  242. <view class="section">
  243. <view class="section-title">
  244. <image src="/images/icons/history.png" class="section-icon"></image>
  245. <text>历史意义</text>
  246. </view>
  247. <text class="section-content">{{item.history_significance}}</text>
  248. </view>
  249. </view>
  250. </view>
  251. </view>
  252. </view>
  253. <!-- 当日总结 -->
  254. <view class="day-summary">
  255. <view class="summary-header">
  256. <image src="/images/icons/summary-red.png" class="summary-icon"></image>
  257. <text>当日总结</text>
  258. </view>
  259. <text class="summary-content">{{item.summary}}</text>
  260. </view>
  261. </view>
  262. </view>
  263. </view>
  264. <!-- 底部操作按钮 - 悬浮设计 -->
  265. <view class="floating-actions">
  266. <button class="share-btn" bindtap="sharePlan">
  267. <image src="/images/icons/share-white.png" class="btn-icon"></image>
  268. 分享行程
  269. </button>
  270. <button class="map-btn" bindtap="viewOnMap">
  271. <image src="/images/icons/map-white.png" class="btn-icon"></image>
  272. 查看地图
  273. </button>
  274. </view>
  275. </view>
  276. <!-- 在页面底部添加打卡记录弹窗 -->
  277. <view class="checkin-modal {{showCheckinModal ? 'show' : ''}}">
  278. <view class="modal-mask" bindtap="closeCheckinModal"></view>
  279. <view class="modal-content">
  280. <view class="modal-header">
  281. <text class="modal-title">打卡记录</text>
  282. <view class="modal-close" bindtap="closeCheckinModal">
  283. <image src="/images/icons/close-circle.png" class="close-icon"></image>
  284. </view>
  285. </view>
  286. <swiper class="checkin-swiper" current="{{currentCheckinIndex}}" bindchange="swiperChange">
  287. <block wx:for="{{currentCheckins}}" wx:key="id">
  288. <swiper-item>
  289. <view class="checkin-item">
  290. <view class="checkin-image-box">
  291. <image src="{{item.image_url || '/images/default-checkin.jpg'}}" class="checkin-image" mode="aspectFit"></image>
  292. </view>
  293. <view class="checkin-info">
  294. <text class="checkin-time">{{item.check_in_time}}</text>
  295. <text class="checkin-note">{{item.note || '暂无文案'}}</text>
  296. </view>
  297. </view>
  298. </swiper-item>
  299. </block>
  300. </swiper>
  301. </view>
  302. </view>
  303. <!-- 地图弹窗 -->
  304. <view class="map-modal {{showMapModal ? 'show' : ''}}">
  305. <view class="modal-mask" bindtap="closeMapModal"></view>
  306. <view class="modal-content map-content">
  307. <view class="modal-header">
  308. <text class="modal-title">行程地图</text>
  309. <view class="modal-close" bindtap="closeMapModal">
  310. <image src="/images/icons/close-circle.png" class="close-icon"></image>
  311. </view>
  312. </view>
  313. <!-- 地图容器 -->
  314. <view class="map-container">
  315. <map
  316. id="planMap"
  317. longitude="{{mapData.longitude}}"
  318. latitude="{{mapData.latitude}}"
  319. scale="{{mapData.scale || 14}}"
  320. markers="{{mapData.markers}}"
  321. polyline="{{mapData.polylines}}"
  322. include-points="{{mapData.includePoints}}"
  323. style="width: 100%; height: 400px;"
  324. bindmarkertap="handleMarkerTap"
  325. >
  326. <!-- 自定义标记点 - 添加地点名称 -->
  327. <cover-view wx:for="{{mapData.markers}}" wx:key="id" class="custom-marker">
  328. <cover-view class="marker-label" style="top: {{item.labelOffset || -50}}rpx;">
  329. <cover-view class="label-bubble">
  330. <cover-text class="label-text">{{item.callout.content}}</cover-text>
  331. </cover-view>
  332. <cover-view class="label-arrow"></cover-view>
  333. </cover-view>
  334. </cover-view>
  335. <!-- 地图控制按钮 -->
  336. <cover-view class="map-controls">
  337. <cover-button class="control-btn" bindtap="handleZoomIn">
  338. <image src="/images/icons/zoom-in.png" class="control-icon"></image>
  339. </cover-button>
  340. <cover-button class="control-btn" bindtap="handleZoomOut">
  341. <image src="/images/icons/zoom-out.png" class="control-icon"></image>
  342. </cover-button>
  343. <cover-button class="control-btn" bindtap="resetToAllAttractions">
  344. <image src="/images/icons/location.png" class="control-icon"></image>
  345. </cover-button>
  346. </cover-view>
  347. <!-- 路线图例 -->
  348. <cover-view class="map-legend">
  349. <cover-view wx:for="{{plan.day_plans}}" wx:key="day" class="legend-item">
  350. <cover-view class="legend-color" style="background:{{['#e54d42','#f37b1d','#1cbbb4','#0081ff','#6739b6','#9c26b0','#e03997'][index]}}"></cover-view>
  351. <cover-text>第{{item.day_number}}天</cover-text>
  352. </cover-view>
  353. </cover-view>
  354. </map>
  355. </view>
  356. <!-- 地图图例 -->
  357. <view class="map-legend-bottom">
  358. <view class="legend-item">
  359. <image src="/images/marker-red-star.png" class="legend-icon"></image>
  360. <text>红色教育基地</text>
  361. </view>
  362. <view class="legend-item">
  363. <image src="/images/map-line-sample.png" class="legend-icon"></image>
  364. <text>行程路线</text>
  365. </view>
  366. </view>
  367. </view>
  368. </view>