detail.vue 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409
  1. <template>
  2. <div class="detail">
  3. <div class="detail-body">
  4. <div class="img-text">
  5. <img :src="activityDetail.annexArray[0]" alt="" />
  6. </div>
  7. <div class="collect-part">
  8. <div class="normal-tip by y-bg" v-if="activityDetail.registrationStatus === '1'">
  9. 报名中
  10. </div>
  11. <div class="normal-tip by h-bg" v-else>报名已结束</div>
  12. <div class="right">
  13. <span class="num">{{ !activityDetail.partakeNumber ? 0 : activityDetail.partakeNumber }}人参与</span>
  14. <div class="icon-collect" @click="changeCollectorsStatus()">
  15. <i :class="[
  16. 'iconfont icon-wujiaoxingxingxingshoucangdianji',
  17. active && 'blue',
  18. ]"></i>
  19. </div>
  20. </div>
  21. </div>
  22. <div class="tel-part">
  23. <div class="tel-name">联系电话</div>
  24. <TelNum :num="activityDetail.contactPhone" />
  25. </div>
  26. <div class="info-part">
  27. <div class="info-item">
  28. <div class="custom-item-tit">
  29. <span class="tit">活动举办</span>
  30. </div>
  31. <div class="text">{{ activityDetail.activityHold }}</div>
  32. </div>
  33. <div class="info-item">
  34. <div class="custom-item-tit"><span class="tit">活动详情</span></div>
  35. <div class="text" v-html="activityDetail.activityContent"></div>
  36. </div>
  37. <div class="info-item">
  38. <div class="custom-item-tit"><span class="tit">活动时间</span></div>
  39. <div class="text">
  40. {{ activityDetail.activityStartTime }} —
  41. {{ activityDetail.activityEndTime }}
  42. </div>
  43. </div>
  44. <div class="info-item">
  45. <div class="custom-item-tit"><span class="tit">活动地址</span></div>
  46. <div class="text">
  47. <span class="add">{{ activityDetail.activityAddress }}</span>
  48. <!-- <span class="dh" @click="goAddress(activityDetail.activityAddress)">导航</span>-->
  49. </div>
  50. </div>
  51. <!-- <div class="info-item">-->
  52. <!-- <div class="custom-item-tit"><span class="tit">报名条件</span></div>-->
  53. <!-- <div class="text">{{ activityDetail.registrationConditions }}</div>-->
  54. <!-- </div>-->
  55. <div class="info-item">
  56. <div class="custom-item-tit"><span class="tit">报名时间</span></div>
  57. <div class="text">
  58. {{ activityDetail.registrationStartTime }} —
  59. {{ activityDetail.registrationEndTime }}
  60. </div>
  61. </div>
  62. <div class="info-item">
  63. <div class="custom-item-tit"><span class="tit">活动参与</span></div>
  64. <div class="text">还有 {{ number }} 个名额</div>
  65. </div>
  66. <div class="info-item uploadBox">
  67. <div class="custom-item-tit"><span class="tit">附件查看</span></div>
  68. <div class="text" style="16rpx 0px">
  69. <div v-for="item in activityDetail.activityFile" :key="item.uid" @click="openFile(item.url)">
  70. {{ item.name }}
  71. </div>
  72. </div>
  73. </div>
  74. </div>
  75. </div>
  76. <div class="but-bottom" @click="getApply()" :signInfo="signInfo" v-if="signInfo.signInStatus == 1">
  77. 到场签到
  78. </div>
  79. </div>
  80. </template>
  81. <script>
  82. import TelNum from "../../subPackages/components/tel-number";
  83. import {
  84. getActivityById1,
  85. clickCollect,
  86. getUserLocalStorageInfo,
  87. } from "@/js_sdk/http";
  88. export default {
  89. components: {
  90. TelNum,
  91. },
  92. data() {
  93. return {
  94. signInfo: {},
  95. signInCode: "",
  96. active: false,
  97. id: "",
  98. activityDetail: {
  99. referenceId: "",
  100. },
  101. number: 0,
  102. };
  103. },
  104. onLoad(option) {
  105. // this.getScanCode();
  106. console.log("option", option.id);
  107. console.log(getUserLocalStorageInfo().user.id)
  108. this.id = option.id;
  109. this.getActivityById1();
  110. },
  111. methods: {
  112. openFile(url) {
  113. uni.downloadFile({
  114. url: url, // 网络文档地址
  115. success: (data) => {
  116. if (data.statusCode === 200) {
  117. uni.saveFile({
  118. tempFilePath: data.tempFilePath, //临时路径
  119. success: function (res) {
  120. // 保存路径
  121. console.log(res);
  122. setTimeout(() => {
  123. //打开文档查看
  124. uni.openDocument({
  125. filePath: res.savedFilePath,
  126. success: function (res) {
  127. console.log("res", res);
  128. },
  129. fail: function (error) {
  130. console.log(error);
  131. wx.previewImage({
  132. current: "", // 当前显示图片的http链接
  133. urls: [url], // 需要预览的图片http链接列表
  134. });
  135. },
  136. });
  137. }, 3000);
  138. },
  139. });
  140. }
  141. },
  142. fail: (err) => {
  143. uni.showToast({
  144. title: "失败请重新下载",
  145. });
  146. },
  147. });
  148. },
  149. getActivityById1() {
  150. const _this = this;
  151. getActivityById1(this.id, "SCNjNSP7LJ9aarv1cNw", getUserLocalStorageInfo().user.id).then((res) => {
  152. if (res.data) {
  153. if (res.data.activityFile) {
  154. const files = JSON.parse(res.data.activityFile);
  155. if (files && files.length) {
  156. _this.fileList2 = _this.fileList2 ? _this.fileList2 : [];
  157. files.forEach((item) => {
  158. console.log("_this.fileList2", _this.fileList2);
  159. console.log(item);
  160. _this.fileList2.push({
  161. url: item.url,
  162. id: item.id,
  163. });
  164. });
  165. }
  166. }
  167. _this.activityDetail = res.data;
  168. _this.activityDetail.activityFile = JSON.parse(res.data.activityFile);
  169. console.log(
  170. "_this.activityDetail.activityFile",
  171. _this.activityDetail.activityFile
  172. );
  173. _this.activityDetail.activityContent =
  174. res.data.activityContent.replaceAll(
  175. "<img",
  176. `<img style="max-width:100%;"`
  177. );
  178. console.log("registrationStatus", res.data.registrationStatus);
  179. if (
  180. _this.activityDetail.annexArray &&
  181. _this.activityDetail.annexArray.length
  182. ) {
  183. console.log(
  184. "_this.activityDetail.annexArray[0]",
  185. _this.activityDetail.annexArray[0]
  186. );
  187. _this.firstImg = _this.activityDetail.annexArray[0];
  188. }
  189. _this.activityDetail.registrationStartTime =
  190. this.$common.transBaseDateTime(
  191. _this.activityDetail.registrationStartTime
  192. );
  193. _this.activityDetail.registrationEndTime =
  194. this.$common.transBaseToDateTime(
  195. _this.activityDetail.registrationEndTime
  196. );
  197. _this.activityDetail.activityStartTime =
  198. this.$common.transBaseDateTime(
  199. _this.activityDetail.activityStartTime
  200. );
  201. _this.activityDetail.activityEndTime =
  202. this.$common.transBaseToDateTime(
  203. _this.activityDetail.activityEndTime
  204. );
  205. if (_this.activityDetail.collectorsStatus === "2") {
  206. _this.active = true;
  207. } else {
  208. _this.active = false;
  209. }
  210. _this.number =
  211. _this.activityDetail.limitPersonNumber -
  212. _this.activityDetail.partakeNumber;
  213. }
  214. });
  215. },
  216. getApply() {
  217. this.$refs.apply.init(this.signInfo);
  218. },
  219. goAddress(address) {
  220. if (address === null || undefined === address || address === "") {
  221. this.$showToast("地址不能为空");
  222. return false;
  223. } else {
  224. this.navigation(address);
  225. }
  226. },
  227. changeCollectorsStatus() {
  228. if (this.active) {
  229. const _this = this;
  230. clickCollect({
  231. id: this.id,
  232. userId: getUserLocalStorageInfo().user.id,
  233. collectorsStatus: "1",
  234. }).then((res) => {
  235. _this.getActivityById1();
  236. });
  237. } else {
  238. const _this = this;
  239. clickCollect({
  240. id: this.id,
  241. userId: getUserLocalStorageInfo().user.id,
  242. collectorsStatus: "2",
  243. }).then((res) => {
  244. _this.getActivityById1();
  245. });
  246. }
  247. },
  248. },
  249. };
  250. </script>
  251. <style lang="scss" type="text/scss">
  252. .h-bg {
  253. background: #f87a7a;
  254. color: #fff;
  255. }
  256. // 底部按钮
  257. .but-bottom {
  258. position: fixed;
  259. bottom: 0;
  260. left: 0;
  261. // width: 100%;
  262. line-height: 120rpx;
  263. background: $main;
  264. color: #fff;
  265. font-size: 36rpx;
  266. text-align: center;
  267. }
  268. .text {
  269. font-size: 24rpx;
  270. color: $text5;
  271. margin-top: 32rpx;
  272. }
  273. .detail {
  274. box-sizing: border-box;
  275. background-color: #f2f2f2;
  276. padding: 0 0 140rpx;
  277. overflow-y: auto;
  278. .detail-body {
  279. .img-text {
  280. img {
  281. height: 420rpx;
  282. width: 100%;
  283. }
  284. }
  285. .collect-part {
  286. background-color: #fff;
  287. height: 120rpx;
  288. padding: 0 30rpx;
  289. margin-bottom: 10rpx;
  290. @include flex;
  291. .normal-tip {}
  292. .right {
  293. @include flex;
  294. .num {
  295. margin-right: 20rpx;
  296. font-size: 24rpx;
  297. color: #333333;
  298. }
  299. }
  300. }
  301. .tel-part {
  302. display: flex;
  303. width: 100%;
  304. background-color: #fff;
  305. margin-bottom: 10rpx;
  306. padding: 0 30rpx;
  307. align-items: center;
  308. box-sizing: border-box;
  309. justify-content: space-between;
  310. .tel-name {
  311. color: #333;
  312. font-size: 32rpx;
  313. font-weight: 700;
  314. }
  315. .custom-tel-component {
  316. width: 400rpx;
  317. .left {
  318. font-size: 26rpx;
  319. }
  320. }
  321. }
  322. }
  323. .info-part {
  324. background-color: #fff;
  325. overflow-y: auto;
  326. height: calc(100vh - 700rpx);
  327. box-sizing: border-box;
  328. padding: 40rpx 30rpx;
  329. .tit {
  330. padding-left: 2.667vw;
  331. position: relative;
  332. font-size: 4.267vw;
  333. &::after {
  334. content: "";
  335. width: 0.8vw;
  336. height: 90%;
  337. background-color: #976dec;
  338. border-radius: 0.4vw;
  339. position: absolute;
  340. left: 0;
  341. top: 50%;
  342. -webkit-transform: translateY(-50%);
  343. transform: translateY(-50%);
  344. }
  345. }
  346. .info-item {
  347. padding: 10rpx 0rpx;
  348. margin-bottom: 20rpx;
  349. .custom-item-tit {
  350. font-size: 32rpx;
  351. font-weight: 700;
  352. }
  353. .text {
  354. font-size: 24rpx;
  355. color: $text5;
  356. margin-top: 32rpx;
  357. .add {
  358. margin-right: 40rpx;
  359. }
  360. .dh {
  361. width: 100rpx;
  362. text-align: center;
  363. display: inline-block;
  364. color: $main;
  365. border-left: 1rpx solid #666666;
  366. }
  367. }
  368. &:last-child {
  369. margin-bottom: 0rpx;
  370. }
  371. }
  372. }
  373. }
  374. </style>
  375. <style lang="scss"></style>