activityDetail.vue 28 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034
  1. <template>
  2. <view class="common_page adffc" :style="{'min-height':h+'px', 'padding-top':mt+'px'}">
  3. <cus-header title="公益活动详情" bgColor="transparent"></cus-header>
  4. <image src="https://transcend.ringzle.com/xiaozhi-app/profile/2025/09/19/54b75bc8-d926-449b-95a5-1126f700b481.png" class="top_bg_img" mode="widthFix"></image>
  5. <div class="lunbo">
  6. <up-swiper
  7. :list="imgList"
  8. @change="e => current = e.current"
  9. :autoplay="false"
  10. height="440rpx"
  11. >
  12. <template #indicator>
  13. <view class="indicator adf">
  14. <view class="indicator__dot" v-for="(item, index) in imgList" :key="index"
  15. :class="[index === current && 'indicator__dot--active']">
  16. </view>
  17. </view>
  18. </template>
  19. </up-swiper>
  20. </div>
  21. <div class="box box1">
  22. <div class="box1-top">
  23. <text class="box1-top-status">{{'进行中'}}</text>
  24. <text class="box1-top-title">{{'《环保知识知多少》让孩子成为大自然的守护者!'}}</text>
  25. </div>
  26. <div class="box1-line" style="margin-top: 36rpx;"></div>
  27. <div class="box1-place adfacjb">
  28. <div class="box1-place-left adffcjb">
  29. <text>活动地点</text>
  30. <div class="addr">{{'深圳市南山区南山街道丰潭路'}}</div>
  31. </div>
  32. <div class="box1-place-right">
  33. <image src="https://transcend.ringzle.com/xiaozhi-app/profile/2025/10/10/239a8c29-499b-407b-a9b5-90447248d9ab.png"></image>
  34. </div>
  35. </div>
  36. <div class="box1-line" style="margin-top: 24rpx;"></div>
  37. <div class="box1-member adfacjb">
  38. <div class="box1-member-left adffc">
  39. <text>招募人数</text>
  40. <div class="num"><text>{{35}}</text> /{{50}}</div>
  41. </div>
  42. <div class="box1-member-right adffc" @tap="handleReviewMembers">
  43. <div class="review adfac">
  44. <text>查看报名人员</text>
  45. <image src="https://transcend.ringzle.com/xiaozhi-app/profile/2025/10/10/b7b7531b-33fa-4ec3-841b-796be9035191.png"></image>
  46. </div>
  47. <div class="avatars">
  48. <up-avatar-group :urls="avatars" size="30" gap="0.4" :maxCount="3"></up-avatar-group>
  49. </div>
  50. </div>
  51. </div>
  52. <div class="box1-line" style="margin-top: 33rpx;"></div>
  53. <div class="box1-time adffc">
  54. <text>活动时间</text>
  55. <div class="text">{{'2025年06月01日 12:00'}} - {{'2025年06月15日12:00'}}</div>
  56. </div>
  57. <div class="box1-line" style="margin-top: 30rpx;"></div>
  58. <div class="box1-need adffc">
  59. <text>报名要求</text>
  60. <div class="text"><text>{{200}}</text>爱心值</div>
  61. <div class="tip">每{{200}}爱心值守护一条河流,让河流恢复往日的清澈模样</div>
  62. </div>
  63. <div class="box1-line" style="margin-top: 30rpx;"></div>
  64. <div class="box1-info adfacjb">
  65. <div class="box1-info-pre">
  66. <text>年龄限制</text>
  67. <div class="text">{{10}}岁以上</div>
  68. </div>
  69. <div class="box1-info-pre line">
  70. <text>可获得义工时长</text>
  71. <div class="hour"><text>{{2}}</text> 小时</div>
  72. </div>
  73. </div>
  74. <div class="box1-line" style="margin-top: 30rpx;"></div>
  75. <div class="box1-info adfacjb">
  76. <div class="box1-info-pre">
  77. <text>联系人</text>
  78. <div class="text">{{'周小瑾'}}/{{'13111987668'}}</div>
  79. </div>
  80. <div class="box1-info-pre line">
  81. <text>公益合作</text>
  82. <div class="text">{{'深圳善行少年基金会'}}</div>
  83. </div>
  84. </div>
  85. </div>
  86. <div class="box box2">
  87. <div class="box-title">活动详情</div>
  88. <div class="box2-detail">
  89. <up-read-more :toggle="true" showHeight="374rpx" color="#989998" fontSize="24rpx" openText="收起更多信息" closeText="展开更多信息">
  90. <rich-text :nodes="detail"></rich-text>
  91. </up-read-more>
  92. </div>
  93. </div>
  94. <div class="bottom">
  95. <div class="time">
  96. 报名时间:{{'2025年06月01日 12:00'}} - {{'2025年06月15日12:00'}}
  97. </div>
  98. <div class="btns adfacjb">
  99. <div class="left adffcacjc" @tap="share=true">
  100. <up-icon name="share-square" color="#252525" size="48rpx"></up-icon>
  101. <text>分享</text>
  102. </div>
  103. <div class="right" @click="handleApply">立即报名</div>
  104. </div>
  105. </div>
  106. <div class="fail" v-if="fail">
  107. <div class="fbox adffcac">
  108. <image class="clock" src="https://transcend.ringzle.com/xiaozhi-app/profile/2025/10/10/5fe8627b-adc4-4e24-8e86-45771d3ba5a2.png"></image>
  109. <image class="close" src="https://transcend.ringzle.com/xiaozhi-app/profile/2025/10/10/3d94527a-da92-4d8b-9e99-44683c4f5c84.png" @click="fail=false"></image>
  110. <image class="alert" src="https://transcend.ringzle.com/xiaozhi-app/profile/2025/10/10/fdf05bfa-5593-4448-940e-437152bbbaf9.png" mode="widthFix"></image>
  111. <div class="texts adffcacjc">
  112. <div class="text">您当前爱心值不足,无法报名活动</div>
  113. <div class="tip">欢迎联系专属客服,了解更多公益活动,积攒爱心值</div>
  114. </div>
  115. <image class="down" src="https://transcend.ringzle.com/xiaozhi-app/profile/2025/10/10/c7d4983d-ca93-4833-8922-e010dd1d450a.png"></image>
  116. <div class="user adfac">
  117. <div class="user-left">
  118. <image src="https://transcend.ringzle.com/xiaozhi-app/profile/2025/10/10/20ff1438-01a9-454c-b62c-501ed47c39a6.png"></image>
  119. </div>
  120. <div class="user-right">
  121. <div class="name">陈婧航</div>
  122. <div class="memo">@深圳善行少年基金会</div>
  123. </div>
  124. </div>
  125. <div class="finfo adffcac">
  126. <div class="finfo-code adffcacjc">
  127. <image src="https://transcend.ringzle.com/xiaozhi-app/profile/2025/10/10/fbb4ac12-163e-48bd-9066-27b068078107.png"></image>
  128. </div>
  129. <div class="finfo-title">长按识别二维码</div>
  130. <div class="finfo-tip">添加您的专属公益向导</div>
  131. <div class="finfo-btn">了解善行少年</div>
  132. <div class="finfo-zblj" @click="fail=false">暂不了解</div>
  133. </div>
  134. </div>
  135. </div>
  136. <div class="share" v-if="share">
  137. <div class="sbox">
  138. <div class="sbox-title">分享给好友</div>
  139. <image class="close" src="https://transcend.ringzle.com/xiaozhi-app/profile/2025/10/10/7d1c7cf4-199a-4008-8114-ee0e1a8f0cc3.png" @click="share=false"></image>
  140. <div class="sbox-items adfac">
  141. <div class="sbox-items-pre adffcac" @click="shareToFriend">
  142. <image src="https://transcend.ringzle.com/xiaozhi-app/profile/2025/10/10/a993c721-a4c7-4f5e-95cc-6451a50bfdce.png"></image>
  143. <text>分享页面</text>
  144. </div>
  145. <div class="sbox-items-pre adffcac" @click="generatePoster">
  146. <image src="https://transcend.ringzle.com/xiaozhi-app/profile/2025/10/10/0c87d8a1-d7c5-466c-84aa-87ec5f163955.png"></image>
  147. <text>生成海报</text>
  148. </div>
  149. <div class="sbox-items-pre adffcac" @click="shareToTimeline">
  150. <image src="https://transcend.ringzle.com/xiaozhi-app/profile/2025/10/10/732ac5fd-af58-44d8-9625-aaf96c24fed0.png"></image>
  151. <text>分享到朋友圈</text>
  152. </div>
  153. </div>
  154. </div>
  155. </div>
  156. <!-- 添加海报生成的canvas -->
  157. <canvas
  158. canvas-id="posterCanvas"
  159. :style="{width: canvasWidth + 'px', height: canvasHeight + 'px'}"
  160. style="position: fixed; top: -9999px; left: -9999px;"
  161. ></canvas>
  162. <!-- 海报预览弹窗 -->
  163. <div class="poster-preview" v-if="showPoster">
  164. <div class="poster-box">
  165. <div class="poster-header">
  166. <text>生成海报</text>
  167. <image class="close" src="https://transcend.ringzle.com/xiaozhi-app/profile/2025/10/10/7d1c7cf4-199a-4008-8114-ee0e1a8f0cc3.png" @click="showPoster=false"></image>
  168. </div>
  169. <div class="poster-content">
  170. <image :src="posterUrl" mode="widthFix" class="poster-img"></image>
  171. </div>
  172. <div class="poster-actions">
  173. <button class="save-btn" @click="savePoster">保存到相册</button>
  174. <button class="share-btn" @click="sharePoster">分享给好友</button>
  175. </div>
  176. </div>
  177. </div>
  178. </view>
  179. </template>
  180. <script setup name="">
  181. import CusHeader from '@/components/CusHeader/index.vue'
  182. import { onShareAppMessage, onShareTimeline, onLoad } from '@dcloudio/uni-app';
  183. import { ref, reactive } from 'vue'
  184. const id = ref('')
  185. const imgList = ref(['https://transcend.ringzle.com/xiaozhi-app/profile/2025/10/10/5378bfeb-32f5-4325-aaef-5270e4a55a3a.png'])
  186. const detail = ref(`山不在高,有仙则名。水不在深,有龙则灵。斯是陋室,惟吾德馨。苔痕上阶绿,草色入帘青。谈笑有鸿儒,往来无白丁。可以调素琴,阅金经。无丝竹之乱耳,无案牍之劳形。南阳诸葛庐,西蜀子云亭。孔子云:何陋之有?<br>山不在高,有仙则名。水不在深,有龙则灵。斯是陋室,惟吾德馨。苔痕上阶绿,草色入帘青。谈笑有鸿儒,往来无白丁。可以调素琴,阅金经。无丝竹之乱耳,无案牍之劳形。南阳诸葛庐,西蜀子云亭。孔子云:何陋之有?`)
  187. const avatars = ref([
  188. 'https://transcend.ringzle.com/xiaozhi-app/profile/2025/10/10/565ca09a-88e2-4c2c-a89e-98bd51fbea7f.png',
  189. 'https://transcend.ringzle.com/xiaozhi-app/profile/2025/10/10/565ca09a-88e2-4c2c-a89e-98bd51fbea7f.png',
  190. 'https://transcend.ringzle.com/xiaozhi-app/profile/2025/10/10/565ca09a-88e2-4c2c-a89e-98bd51fbea7f.png',
  191. 'https://transcend.ringzle.com/xiaozhi-app/profile/2025/10/10/565ca09a-88e2-4c2c-a89e-98bd51fbea7f.png',
  192. 'https://transcend.ringzle.com/xiaozhi-app/profile/2025/10/10/565ca09a-88e2-4c2c-a89e-98bd51fbea7f.png'
  193. ])
  194. const fail = ref(false)
  195. const share = ref(false)
  196. const showPoster = ref(false)
  197. const posterUrl = ref('')
  198. const canvasWidth = ref(375)
  199. const canvasHeight = ref(667)
  200. const activityData = reactive({
  201. title: '《环保知识知多少》让孩子成为大自然的守护者!',
  202. time: '06.01-12:00 ~ 06.02-12:00',
  203. address: '深圳市南山区南山街道丰潭路',
  204. organizer: '锦鲤俱乐部'
  205. })
  206. const handleReviewMembers = () => {
  207. uni.navigateTo({
  208. url:'/pagesHome/recruitsNumber'
  209. })
  210. }
  211. const handleApply = () => {
  212. uni.navigateTo({
  213. url:'/pagesHome/activityApply'
  214. // url:'/pagesHome/signSuccess'
  215. // url:'/pagesHome/fillNonprofitArchives'
  216. })
  217. }
  218. // 分享给好友
  219. const shareToFriend = () => {
  220. share.value = false
  221. uni.showShareMenu({
  222. withShareTicket: true,
  223. menus: ['shareAppMessage']
  224. })
  225. }
  226. // 分享到朋友圈
  227. const shareToTimeline = () => {
  228. share.value = false
  229. // 朋友圈分享会触发 onShareTimeline
  230. uni.showShareMenu({
  231. withShareTicket: true,
  232. menus: ['shareTimeline']
  233. })
  234. }
  235. // 生成海报
  236. const generatePoster = async () => {
  237. share.value = false
  238. uni.showLoading({
  239. title: '正在生成海报...'
  240. })
  241. try {
  242. await createPoster()
  243. uni.hideLoading()
  244. showPoster.value = true
  245. } catch (error) {
  246. uni.hideLoading()
  247. uni.showToast({
  248. title: '海报生成失败',
  249. icon: 'none'
  250. })
  251. }
  252. }
  253. // 创建海报
  254. const createPoster = () => {
  255. return new Promise((resolve, reject) => {
  256. const ctx = uni.createCanvasContext('posterCanvas')
  257. // 设置画布尺寸
  258. const width = canvasWidth.value
  259. const height = canvasHeight.value
  260. // 绘制背景
  261. const gradient = ctx.createLinearGradient(0, 0, 0, height)
  262. gradient.addColorStop(0, '#87CEEB')
  263. gradient.addColorStop(1, '#98FB98')
  264. ctx.fillStyle = gradient
  265. ctx.fillRect(0, 0, width, height)
  266. // 加载并绘制背景图片(山峰)
  267. const bgImg = 'https://transcend.ringzle.com/xiaozhi-app/profile/2025/10/10/5378bfeb-32f5-4325-aaef-5270e4a55a3a.png'
  268. uni.getImageInfo({
  269. src: bgImg,
  270. success: (res) => {
  271. // 绘制背景图
  272. ctx.drawImage(res.path, 0, 0, width, height * 0.6)
  273. // 绘制绿色标签
  274. ctx.fillStyle = '#B7F358'
  275. ctx.fillRect(20, 30, 120, 30)
  276. // 绘制标签文字
  277. ctx.fillStyle = '#000000'
  278. ctx.font = 'bold 14px PingFang-SC'
  279. ctx.fillText('节能低碳小妙招', 30, 50)
  280. // 绘制主标题
  281. ctx.fillStyle = '#FFFFFF'
  282. ctx.font = 'bold 24px PingFang-SC'
  283. ctx.fillText('环保知识', 50, 120)
  284. ctx.fillText('知多少', 50, 150)
  285. // 绘制白色信息区域背景
  286. ctx.fillStyle = '#FFFFFF'
  287. ctx.fillRect(20, height * 0.6 + 20, width - 40, height * 0.35)
  288. // 绘制活动信息
  289. ctx.fillStyle = '#000000'
  290. ctx.font = '16px PingFang-SC'
  291. const startY = height * 0.6 + 50
  292. // 活动标题
  293. ctx.font = 'bold 16px PingFang-SC'
  294. ctx.fillText(activityData.title.substring(0, 20), 30, startY)
  295. if (activityData.title.length > 20) {
  296. ctx.fillText(activityData.title.substring(20), 30, startY + 25)
  297. }
  298. // 时间图标和文字
  299. ctx.font = '14px PingFang-SC'
  300. ctx.fillStyle = '#666666'
  301. ctx.fillText('🕐', 30, startY + 60)
  302. ctx.fillText(activityData.time, 50, startY + 60)
  303. // 地址图标和文字
  304. ctx.fillText('📍', 30, startY + 85)
  305. ctx.fillText(activityData.address, 50, startY + 85)
  306. // 组织方
  307. ctx.fillText('👥', 30, startY + 110)
  308. ctx.fillText(activityData.organizer, 50, startY + 110)
  309. // 绘制小程序码区域
  310. ctx.fillStyle = '#F5F5F5'
  311. ctx.fillRect(width - 120, height - 140, 100, 100)
  312. ctx.fillStyle = '#000000'
  313. ctx.font = '12px PingFang-SC'
  314. ctx.fillText('微信扫一扫', width - 110, height - 25)
  315. // 执行绘制
  316. ctx.draw(false, () => {
  317. // 导出图片
  318. uni.canvasToTempFilePath({
  319. canvasId: 'posterCanvas',
  320. width: width,
  321. height: height,
  322. destWidth: width * 2,
  323. destHeight: height * 2,
  324. success: (res) => {
  325. posterUrl.value = res.tempFilePath
  326. resolve(res.tempFilePath)
  327. },
  328. fail: reject
  329. })
  330. })
  331. },
  332. fail: () => {
  333. // 如果图片加载失败,绘制纯色背景
  334. drawSimplePoster(ctx, width, height, resolve, reject)
  335. }
  336. })
  337. })
  338. }
  339. // 绘制简单海报(备用方案)
  340. const drawSimplePoster = (ctx, width, height, resolve, reject) => {
  341. // 绘制渐变背景
  342. const gradient = ctx.createLinearGradient(0, 0, 0, height)
  343. gradient.addColorStop(0, '#87CEEB')
  344. gradient.addColorStop(1, '#98FB98')
  345. ctx.fillStyle = gradient
  346. ctx.fillRect(0, 0, width, height)
  347. // 绘制白色内容区域
  348. ctx.fillStyle = '#FFFFFF'
  349. ctx.fillRect(20, 100, width - 40, height - 200)
  350. // 绘制标题
  351. ctx.fillStyle = '#000000'
  352. ctx.font = 'bold 20px PingFang-SC'
  353. ctx.fillText('公益活动邀请', width / 2 - 70, 150)
  354. // 绘制活动信息
  355. ctx.font = '16px PingFang-SC'
  356. ctx.fillText(activityData.title.substring(0, 15), 30, 200)
  357. if (activityData.title.length > 15) {
  358. ctx.fillText(activityData.title.substring(15), 30, 225)
  359. }
  360. ctx.font = '14px PingFang-SC'
  361. ctx.fillStyle = '#666666'
  362. ctx.fillText('活动时间:' + activityData.time, 30, 270)
  363. ctx.fillText('活动地点:' + activityData.address.substring(0, 12), 30, 295)
  364. ctx.draw(false, () => {
  365. uni.canvasToTempFilePath({
  366. canvasId: 'posterCanvas',
  367. width: width,
  368. height: height,
  369. destWidth: width * 2,
  370. destHeight: height * 2,
  371. success: (res) => {
  372. posterUrl.value = res.tempFilePath
  373. resolve(res.tempFilePath)
  374. },
  375. fail: reject
  376. })
  377. })
  378. }
  379. // 保存海报到相册
  380. const savePoster = () => {
  381. uni.saveImageToPhotosAlbum({
  382. filePath: posterUrl.value,
  383. success: () => {
  384. uni.showToast({
  385. title: '保存成功',
  386. icon: 'success'
  387. })
  388. showPoster.value = false
  389. },
  390. fail: (err) => {
  391. if (err.errMsg.includes('auth deny')) {
  392. uni.showModal({
  393. title: '提示',
  394. content: '需要您授权保存图片到相册',
  395. confirmText: '去设置',
  396. success: (res) => {
  397. if (res.confirm) {
  398. uni.openSetting()
  399. }
  400. }
  401. })
  402. } else {
  403. uni.showToast({
  404. title: '保存失败',
  405. icon: 'none'
  406. })
  407. }
  408. }
  409. })
  410. }
  411. // 分享海报给好友
  412. const sharePoster = () => {
  413. // 这里可以实现分享海报的逻辑
  414. uni.showToast({
  415. title: '请保存后手动分享',
  416. icon: 'none'
  417. })
  418. }
  419. onLoad(options=>{
  420. id.value = options?.id;
  421. })
  422. // 分享给好友
  423. onShareAppMessage(() => {
  424. return {
  425. title: activityData.title,
  426. path: '/pagesHome/activityDetail?id=' + id.value,
  427. imageUrl: imgList.value[0] // 使用活动图片作为分享图
  428. };
  429. });
  430. // 分享到朋友圈
  431. onShareTimeline(() => {
  432. return {
  433. title: activityData.title,
  434. query: 'id=' + id.value,
  435. imageUrl: posterUrl.value || imgList.value[0] // 优先使用海报,否则使用活动图片
  436. };
  437. });
  438. </script>
  439. <style scoped lang="scss">
  440. .common_page{
  441. padding-bottom: 276rpx;
  442. .lunbo{
  443. width: 100%;
  444. height: 440rpx;
  445. margin-top: 20rpx;
  446. position: relative;
  447. }
  448. .box{
  449. background: linear-gradient(45deg,#FFFFFF 70%,#F2FFE8 100%);
  450. border-radius: 24rpx;
  451. padding: 36rpx 24rpx 30rpx;
  452. margin-top: 20rpx;
  453. position: relative;
  454. &-title{
  455. width: 170rpx;
  456. height: 44rpx;
  457. padding-left: 2rpx;
  458. font-family: PingFang-SC, PingFang-SC;
  459. font-weight: 800;
  460. font-size: 36rpx;
  461. color: #151B29;
  462. line-height: 36rpx;
  463. background-image: url('https://transcend.ringzle.com/xiaozhi-app/profile/2025/09/11/6ec1f999-fcbb-4a0b-a1a5-d0b5e1374bb1.png');
  464. background-size: 170rpx 31rpx;
  465. background-position: 0 20rpx;
  466. background-repeat: no-repeat;
  467. }
  468. }
  469. .box1{
  470. &-top{
  471. &-status{
  472. padding: 10rpx 20rpx;
  473. background: url('https://transcend.ringzle.com/xiaozhi-app/profile/2025/10/10/46184afd-e7cd-4ffa-b32f-7390f7a1decc.png') no-repeat;
  474. background-size: 100% 100%;
  475. font-family: PingFang-SC, PingFang-SC;
  476. font-weight: bold;
  477. font-size: 24rpx;
  478. color: #151B29;
  479. line-height: 33rpx;
  480. }
  481. &-title{
  482. font-family: PingFang-SC, PingFang-SC;
  483. font-weight: bold;
  484. font-size: 36rpx;
  485. color: #151B29;
  486. line-height: 54rpx;
  487. margin-left: 10rpx;
  488. }
  489. }
  490. &-line{
  491. width: 100%;
  492. height: 1rpx;
  493. background: #E7E7E7;
  494. }
  495. &-place{
  496. &-left{
  497. width: calc(100% - 228rpx);
  498. text{
  499. font-family: PingFangSC, PingFang SC;
  500. font-weight: 400;
  501. font-size: 24rpx;
  502. color: #989998;
  503. line-height: 26rpx;
  504. }
  505. .addr{
  506. width: 100%;
  507. font-family: PingFang-SC, PingFang-SC;
  508. font-weight: bold;
  509. font-size: 26rpx;
  510. color: #151B29;
  511. line-height: 26rpx;
  512. margin-top: 24rpx;
  513. }
  514. }
  515. &-right{
  516. width: 188rpx;
  517. height: 115rpx;
  518. image{
  519. width: 100%;
  520. height: 100%;
  521. }
  522. }
  523. }
  524. &-member{
  525. margin-top: 37rpx;
  526. &-left{
  527. &>text{
  528. font-family: PingFangSC, PingFang SC;
  529. font-weight: 400;
  530. font-size: 24rpx;
  531. color: #989998;
  532. line-height: 26rpx;
  533. }
  534. .num{
  535. font-family: PingFang-SC, PingFang-SC;
  536. font-weight: bold;
  537. font-size: 26rpx;
  538. color: #676775;
  539. line-height: 48rpx;
  540. margin-top: 25rpx;
  541. text{
  542. font-size: 36rpx;
  543. color: #151B29;
  544. }
  545. }
  546. }
  547. &-right{
  548. .review{
  549. text{
  550. font-family: PingFangSC, PingFang SC;
  551. font-weight: 400;
  552. font-size: 24rpx;
  553. color: #989998;
  554. line-height: 26rpx;
  555. }
  556. image{
  557. width: 28rpx;
  558. height: 28rpx;
  559. margin-left: 8rpx;
  560. }
  561. }
  562. .avatars{
  563. margin-top: 27rpx;
  564. display: flex;
  565. justify-content: flex-end;
  566. }
  567. }
  568. }
  569. &-time{
  570. margin-top: 30rpx;
  571. text{
  572. font-family: PingFangSC, PingFang SC;
  573. font-weight: 400;
  574. font-size: 24rpx;
  575. color: #989998;
  576. line-height: 26rpx;
  577. }
  578. .text{
  579. font-family: PingFang-SC, PingFang-SC;
  580. font-weight: bold;
  581. font-size: 26rpx;
  582. color: #151B29;
  583. line-height: 26rpx;
  584. margin-top: 24rpx;
  585. }
  586. }
  587. &-need{
  588. margin-top: 30rpx;
  589. &>text{
  590. font-family: PingFangSC, PingFang SC;
  591. font-weight: 400;
  592. font-size: 24rpx;
  593. color: #989998;
  594. line-height: 26rpx;
  595. }
  596. .text{
  597. margin-top: 30rpx;
  598. font-family: PingFangSC, PingFang SC;
  599. font-weight: 400;
  600. font-size: 24rpx;
  601. color: #676775;
  602. line-height: 26rpx;
  603. text{
  604. font-weight: bold;
  605. font-size: 36rpx;
  606. color: #151B29;
  607. }
  608. }
  609. .tip{
  610. font-family: PingFangSC, PingFang SC;
  611. font-weight: 400;
  612. font-size: 24rpx;
  613. color: #C9A771;
  614. line-height: 26rpx;
  615. margin-top: 20rpx;
  616. }
  617. }
  618. &-info{
  619. margin-top: 30rpx;
  620. &-pre{
  621. width: 50%;
  622. &.line{
  623. border-left: 1rpx solid #E7E7E7;
  624. padding-left: 24rpx;
  625. box-sizing: border-box;
  626. }
  627. &>text{
  628. font-family: PingFangSC, PingFang SC;
  629. font-weight: 400;
  630. font-size: 24rpx;
  631. color: #989998;
  632. line-height: 26rpx;
  633. }
  634. .text{
  635. font-family: PingFang-SC, PingFang-SC;
  636. font-weight: bold;
  637. font-size: 26rpx;
  638. color: #151B29;
  639. line-height: 26rpx;
  640. margin-top: 24rpx;
  641. }
  642. .hour{
  643. margin-top: 24rpx;
  644. font-family: PingFangSC, PingFang SC;
  645. font-weight: 400;
  646. font-size: 24rpx;
  647. color: #676775;
  648. line-height: 26rpx;
  649. text{
  650. font-weight: bold;
  651. font-size: 36rpx;
  652. color: #151B29;
  653. }
  654. }
  655. }
  656. }
  657. }
  658. .box2{
  659. &-detail{
  660. margin-top: 40rpx;
  661. }
  662. }
  663. .bottom{
  664. width: 100%;
  665. height: 256rpx;
  666. background: #FFFFFF;
  667. box-shadow: 0rpx -2rpx 8rpx 0rpx rgba(178,178,178,0.1);
  668. position: fixed;
  669. left: 0;
  670. right: 0;
  671. bottom: 0;
  672. padding: 30rpx 24rpx 0;
  673. box-sizing: border-box;
  674. .time{
  675. padding: 19rpx 24rpx 12rpx;
  676. background: #F8F8F9;
  677. border-radius: 32rpx;
  678. font-family: PingFangSC, PingFang SC;
  679. font-weight: 400;
  680. font-size: 24rpx;
  681. color: #4B545C;
  682. line-height: 33rpx;
  683. }
  684. .btns{
  685. margin-top: 24rpx;
  686. .left{
  687. margin-left: 30rpx;
  688. text{
  689. font-family: PingFangSC, PingFang SC;
  690. font-weight: 400;
  691. font-size: 26rpx;
  692. color: #151B29;
  693. line-height: 26rpx;
  694. margin-top: 17rpx;
  695. }
  696. }
  697. .right{
  698. width: 540rpx;
  699. height: 90rpx;
  700. background: #B7F358;
  701. border-radius: 45rpx;
  702. font-family: PingFang-SC, PingFang-SC;
  703. font-weight: bold;
  704. font-size: 32rpx;
  705. color: #151B29;
  706. line-height: 90rpx;
  707. text-align: center;
  708. letter-spacing: 2rpx;
  709. }
  710. }
  711. }
  712. .fail{
  713. position: fixed;
  714. left: 0;
  715. right: 0;
  716. top: 0;
  717. bottom: 0;
  718. background: rgba(0,0,0,0.4);
  719. display: flex;
  720. flex-direction: column;
  721. justify-content: flex-end;
  722. .fbox{
  723. background: #FFFFFF;
  724. background-image: url('https://transcend.ringzle.com/xiaozhi-app/profile/2025/10/10/e5ca0b95-ae33-4a93-8955-fe1d5e05ed2d.png');
  725. background-repeat: no-repeat;
  726. background-position: top left;
  727. background-size: 100% 399rpx;
  728. border-radius: 24rpx 24rpx 0 0;
  729. position: relative;
  730. padding: 40rpx 30rpx 123rpx;
  731. .clock{
  732. width: 219rpx;
  733. height: 143rpx;
  734. position: absolute;
  735. left: 51rpx;
  736. top: -37rpx;
  737. }
  738. .close{
  739. width: 40rpx;
  740. height: 40rpx;
  741. position: absolute;
  742. top: 40rpx;
  743. right: 36rpx;
  744. }
  745. .alert{
  746. width: 212rpx;
  747. }
  748. .texts{
  749. width: 100%;
  750. margin-top: 69rpx;
  751. background: #FFFFFF;
  752. border-radius: 24rpx;
  753. border: 1rpx dotted #979797;
  754. padding: 36rpx 0;
  755. .text{
  756. font-family: PingFang-SC, PingFang-SC;
  757. font-weight: bold;
  758. font-size: 36rpx;
  759. color: #252525;
  760. line-height: 36rpx;
  761. }
  762. .tip{
  763. font-family: PingFangSC, PingFang SC;
  764. font-weight: 400;
  765. font-size: 24rpx;
  766. color: #676775;
  767. line-height: 26rpx;
  768. margin-top: 24rpx;
  769. }
  770. }
  771. .down{
  772. width: 514rpx;
  773. height: 34rpx;
  774. margin-top: 20rpx;
  775. }
  776. .user{
  777. margin-top: 30rpx;
  778. width: 100%;
  779. padding-left: 50rpx;
  780. box-sizing: border-box;
  781. &-left{
  782. image{
  783. width: 98rpx;
  784. height: 98rpx;
  785. }
  786. }
  787. &-right{
  788. margin-left: 20rpx;
  789. .name{
  790. font-family: PingFang-SC, PingFang-SC;
  791. font-weight: bold;
  792. font-size: 32rpx;
  793. color: #252525;
  794. line-height: 32rpx;
  795. }
  796. .memo{
  797. font-family: PingFang-SC, PingFang-SC;
  798. font-weight: bold;
  799. font-size: 24rpx;
  800. color: #05A9FE;
  801. line-height: 24rpx;
  802. margin-top: 24rpx;
  803. }
  804. }
  805. }
  806. .finfo{
  807. width: 100%;
  808. margin-top: 36rpx;
  809. &-code{
  810. width: 310rpx;
  811. height: 310rpx;
  812. background: #FFFFFF;
  813. border: 3rpx solid #C5E3FE;
  814. image{
  815. width: 244rpx;
  816. height: 244rpx;
  817. }
  818. }
  819. &-title{
  820. margin-top: 24rpx;
  821. font-size: 28rpx;
  822. color: #252525;
  823. line-height: 40rpx;
  824. }
  825. &-tip{
  826. margin-top: 10rpx;
  827. font-size: 24rpx;
  828. color: #656775;
  829. line-height: 40rpx;
  830. }
  831. &-btn{
  832. width: calc(100% - 20rpx);
  833. height: 90rpx;
  834. background: #B7F358;
  835. border-radius: 45rpx;
  836. font-family: PingFang-SC, PingFang-SC;
  837. font-weight: bold;
  838. font-size: 32rpx;
  839. color: #151B29;
  840. line-height: 90rpx;
  841. text-align: center;
  842. margin-top: 48rpx;
  843. }
  844. &-zblj{
  845. font-family: PingFangSC, PingFang SC;
  846. font-weight: 400;
  847. font-size: 28rpx;
  848. color: #989998;
  849. line-height: 40rpx;
  850. margin-top: 48rpx;
  851. padding-bottom: 5rpx;
  852. border-bottom: 1rpx solid #989998;
  853. }
  854. }
  855. }
  856. }
  857. .share{
  858. position: fixed;
  859. left: 0;
  860. right: 0;
  861. top: 0;
  862. bottom: 0;
  863. background: rgba(0,0,0,0.4);
  864. display: flex;
  865. flex-direction: column;
  866. justify-content: flex-end;
  867. .sbox{
  868. position: relative;
  869. background: #FFFFFF;
  870. border-radius: 24rpx 24rpx 0rpx 0rpx;
  871. padding: 50rpx 30rpx 148rpx;
  872. &-title{
  873. font-family: PingFang-SC, PingFang-SC;
  874. font-weight: bold;
  875. font-size: 36rpx;
  876. color: #151B29;
  877. line-height: 36rpx;
  878. text-align: center;
  879. }
  880. .close{
  881. width: 27rpx;
  882. height: 27rpx;
  883. position: absolute;
  884. top: 50rpx;
  885. right: 40rpx;
  886. }
  887. &-items{
  888. margin-top: 88rpx;
  889. &-pre{
  890. width: calc(100% / 3);
  891. image{
  892. width: 94rpx;
  893. height: 94rpx;
  894. }
  895. text{
  896. font-family: PingFangSC, PingFang SC;
  897. font-weight: 400;
  898. font-size: 26rpx;
  899. color: #252525;
  900. line-height: 26rpx;
  901. text-align: center;
  902. margin-top: 24rpx;
  903. }
  904. }
  905. }
  906. }
  907. }
  908. .poster-preview {
  909. position: fixed;
  910. left: 0;
  911. right: 0;
  912. top: 0;
  913. bottom: 0;
  914. background: rgba(0,0,0,0.8);
  915. display: flex;
  916. flex-direction: column;
  917. justify-content: center;
  918. align-items: center;
  919. z-index: 9999;
  920. .poster-box {
  921. width: 80%;
  922. max-width: 600rpx;
  923. background: #FFFFFF;
  924. border-radius: 24rpx;
  925. overflow: hidden;
  926. .poster-header {
  927. display: flex;
  928. justify-content: space-between;
  929. align-items: center;
  930. padding: 30rpx;
  931. border-bottom: 1rpx solid #E7E7E7;
  932. text {
  933. font-family: PingFang-SC, PingFang-SC;
  934. font-weight: bold;
  935. font-size: 32rpx;
  936. color: #151B29;
  937. }
  938. .close {
  939. width: 40rpx;
  940. height: 40rpx;
  941. }
  942. }
  943. .poster-content {
  944. padding: 30rpx;
  945. display: flex;
  946. justify-content: center;
  947. .poster-img {
  948. width: 100%;
  949. border-radius: 12rpx;
  950. }
  951. }
  952. .poster-actions {
  953. display: flex;
  954. padding: 0 30rpx 30rpx;
  955. gap: 20rpx;
  956. button {
  957. flex: 1;
  958. height: 80rpx;
  959. border-radius: 40rpx;
  960. border: none;
  961. font-size: 28rpx;
  962. font-weight: bold;
  963. }
  964. .save-btn {
  965. background: #F5F5F5;
  966. color: #151B29;
  967. }
  968. .share-btn {
  969. background: #B7F358;
  970. color: #151B29;
  971. }
  972. }
  973. }
  974. }
  975. }
  976. </style>