activityDetail.vue 29 KB

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