job.vue 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622
  1. <template>
  2. <view class="page">
  3. <!-- 顶部黄色背景 -->
  4. <PageHeader class="PageHeader">
  5. <template slot="center"> 任务中心 </template>
  6. <template slot="right">
  7. <DropdownMenu
  8. :options="dropdownOptions"
  9. @select="handleDropdownSelect"
  10. />
  11. </template>
  12. </PageHeader>
  13. <view class="occupyHigh"></view>
  14. <!-- 内容区域 -->
  15. <view class="content-area">
  16. <!-- 星源余额展示区 -->
  17. <view class="person-info">
  18. <view class="person-info-left">
  19. <CircleAvatar
  20. class="avator"
  21. v-if="myinfo.avator"
  22. :src="myinfo.avator"
  23. ></CircleAvatar>
  24. <view class="title-area">
  25. <text class="my-bean-title">我的星源</text>
  26. <view class="bean-number">
  27. <image src="@/static/me/job/wd_icon_xingyuan.png"></image>
  28. {{ num_gmd | formatNumberToK }}
  29. </view>
  30. </view>
  31. </view>
  32. <view class="exchange-btn" @click="openNicknamePopUpWindow()"
  33. >兑换</view
  34. >
  35. </view>
  36. <!-- 星源余额展示区 -->
  37. <!-- <view class="bean-balance" >
  38. <view class="balance-header">
  39. <view class="title-area">
  40. <view class="yellow-dot"></view>
  41. <text class="my-bean-title">我的星源</text>
  42. </view>
  43. <view class="exchange-btn" @click="showExchangePopup">兑换</view>
  44. </view>
  45. <view class="bean-number">{{ num_gmd }}</view>
  46. </view> -->
  47. <view class="starWishCheckIn">
  48. <image src="@/static/me/job/rw_wenzi_01.png" class="title"></image>
  49. <view
  50. class="card purple-card"
  51. @click="newer_bfb == 'finish' ? '' : goPage('/pages/my/editInfo')"
  52. >
  53. <view class="bg-box" v-if="newer_bfb == 'finish'">
  54. <image
  55. src="@/static/me/job/sy_icon_yilingqu.png"
  56. class="bg"
  57. ></image>
  58. </view>
  59. <view class="card-title">初次见面礼</view>
  60. <view class="card-desc">完善个人资料领取星源奖励</view>
  61. <view class="card-btn card-reward" v-if="newer_bfb != 'finish'"
  62. >+100星源</view
  63. >
  64. <view class="card-btn card-reward" v-else>已领取</view>
  65. </view>
  66. <view class="card yellow-card">
  67. <view class="card-title">每日签到</view>
  68. <view class="card-desc">签到领奖励,快来签到吧!</view>
  69. <view class="card-btn sign-btn" @click="opencheckInPopUpWindow()">
  70. <template v-if="signInfo.isSigned">已签到</template>
  71. <template v-else>立即签到</template>
  72. </view>
  73. </view>
  74. </view>
  75. <!-- 星愿打卡区域 -->
  76. <!-- <view class="sign-cards" v-if="false">
  77. <view class="card purple-card">
  78. <view class="card-title">初次见面礼</view>
  79. <view class="card-desc">完善个人资料可得</view>
  80. <view class="card-reward">奖励+100星源</view>
  81. <view class="card-progress">{{ newer_bfb }}</view>
  82. </view>
  83. <view class="card yellow-card">
  84. <view class="card-title">每日签到</view>
  85. <view class="card-desc">连续签到奖励更多</view>
  86. <view class="sign-btn" @click="showSignPopup">立即签到</view>
  87. <view class="sign-btn" @click="opencheckInPopUpWindow()">立即签到</view>
  88. </view>
  89. </view> -->
  90. <!-- 每日任务列表 -->
  91. <view class="task-list-box">
  92. <view class="task-header">
  93. <image src="@/static/me/job/rw_wenzi_02.png"></image>
  94. <text class="task-subtitle">(获取免费星源)</text>
  95. </view>
  96. <!-- 任务项列表 -->
  97. <view class="task-item" v-for="(item, index) in taskList" :key="index">
  98. <view class="task-info">
  99. <image :src="item.image"></image>
  100. <view>
  101. <view class="task-name one-omit">{{ item.name }}</view>
  102. <view class="task-desc one-omit">{{ item.content }}</view>
  103. </view>
  104. </view>
  105. <view class="task-reward">
  106. <image src="@/static/me/job/wd_icon_xingyuan.png"></image>+{{
  107. item.num
  108. }}
  109. </view>
  110. <view
  111. class="task-btn"
  112. :class="{ 'task-completed': item.status == 9 }"
  113. @click="claimReward(index)"
  114. >
  115. {{ item.status == 9 ? "已领取" : "领取" }}
  116. </view>
  117. </view>
  118. </view>
  119. <!-- 每日任务列表
  120. <view class="task-list">
  121. <view class="task-header">
  122. <text class="task-title">每日任务</text>
  123. <text class="task-subtitle">获取免费星源</text>
  124. </view>
  125. <view class="task-item" v-for="(item, index) in taskList" :key="index">
  126. <view class="task-info">
  127. <view class="task-name">{{ item.name }}</view>
  128. <view class="task-desc">{{ item.content }}</view>
  129. </view>
  130. <view class="task-reward">+{{ item.num }}星源</view>
  131. <view class="task-btn" :class="{ 'task-completed': item.status == 9 }" @click="claimReward(index)">
  132. {{ item.status == 9 ? "已领取" : "领取" }}
  133. </view>
  134. </view>
  135. </view>-->
  136. </view>
  137. <!-- 星源兑换弹窗 -->
  138. <view class="exchange-popup" v-if="showExchange">
  139. <view class="popup-mask" @click="hideExchangePopup"></view>
  140. <view class="popup-content">
  141. <!-- 弹窗顶部信息栏 -->
  142. <view class="popup-header">
  143. <text class="available-balance">可用M币: 14500</text>
  144. <text class="exchange-title">兑换星源</text>
  145. </view>
  146. <!-- 兑换区域主体 -->
  147. <view class="exchange-area">
  148. <view class="exchange-title-area">
  149. <text class="exchange-main-title">M币兑换星源数</text>
  150. <text class="exchange-subtitle">兑换星源数必须是10的倍数</text>
  151. </view>
  152. <view class="input-area">
  153. <view class="bean-icon"></view>
  154. <input
  155. type="number"
  156. class="exchange-input"
  157. placeholder="请输入兑换星源数量"
  158. v-model="exchangeAmount"
  159. />
  160. </view>
  161. <!-- 操作按钮 -->
  162. <view class="action-area">
  163. <view class="exchange-btn-large" @click="confirmExchange"
  164. >立即兑换星源</view
  165. >
  166. <text class="tips-text"
  167. >星源可用于创作(生成图片、音乐等AI创作功能)</text
  168. >
  169. </view>
  170. </view>
  171. </view>
  172. </view>
  173. <checkInPopUpWindow
  174. :checkInDays="6"
  175. :signInfo="signInfo"
  176. :signNotify="signNotify"
  177. @toggleSignNotify="toggleSignNotify"
  178. ref="checkInPopUpWindow"
  179. @confirmSign="confirmSign()"
  180. >
  181. </checkInPopUpWindow>
  182. <!-- 提示框 -->
  183. <DialogBox ref="DialogBox"></DialogBox>
  184. <!-- 兑换m币弹窗-->
  185. <view class="NicknamePopUpWindowBox">
  186. <NicknamePopup
  187. title=""
  188. subtitle=""
  189. class="NicknamePopUpWindow"
  190. ref="NicknamePopUpWindow"
  191. >
  192. <template slot="heard">
  193. <view class="nickname-heard">
  194. <view class="available-mCoin"
  195. >可用M币:{{ myinfo.num_gmm | formatNumberToK }}</view
  196. >
  197. <view class="exchange-title">兑换星源</view>
  198. </view>
  199. </template>
  200. <template slot="content">
  201. <view class="content-box">
  202. <view class="prompt">
  203. M币兑换星源数<text>(兑换星源数必须是10的倍数)</text>
  204. </view>
  205. <view class="input-box">
  206. <image src="@/static/me/job/wd_icon_xingyuan.png"></image>
  207. <uv-input
  208. type="number"
  209. class="input"
  210. placeholder="请输入昵称"
  211. border="none"
  212. v-model="exchangeAmount"
  213. maxlength="20"
  214. ></uv-input>
  215. </view>
  216. <view class="btn-box" @click="showExchangeConfirm"
  217. >立即兑换星源</view
  218. >
  219. <text class="tips-text"
  220. >星源可用于创作(生成图片、音乐等AI创作功能)</text
  221. >
  222. </view>
  223. </template>
  224. </NicknamePopup>
  225. </view>
  226. </view>
  227. </template>
  228. <script>
  229. import checkInPopUpWindow from "@/components/checkIn-popUp-window/checkIn-popUp-window.vue";
  230. import DropdownMenu from "@/components/DropdownMenu.vue";
  231. export default {
  232. components: {
  233. checkInPopUpWindow,
  234. DropdownMenu,
  235. },
  236. data() {
  237. return {
  238. title: "任务中心",
  239. myinfo: {},
  240. realname: "",
  241. num_gmd: 0,
  242. newer_bfb: "",
  243. beanBalance: 2560,
  244. showExchange: false,
  245. exchangeAmount: "",
  246. mCoinBalance: 0,
  247. signNotify: true,
  248. signRewards: [
  249. {
  250. dayNum: "01",
  251. reward: "10星源",
  252. isVip: false,
  253. },
  254. {
  255. dayNum: "02",
  256. reward: "15星源",
  257. isVip: false,
  258. },
  259. {
  260. dayNum: "03",
  261. reward: "20星源",
  262. isVip: false,
  263. },
  264. {
  265. dayNum: "04",
  266. reward: "25星源",
  267. isVip: false,
  268. },
  269. {
  270. dayNum: "05",
  271. reward: "30星源",
  272. isVip: false,
  273. },
  274. {
  275. dayNum: "06",
  276. reward: "35星源",
  277. isVip: true,
  278. },
  279. {
  280. dayNum: "07",
  281. reward: "50星源",
  282. isVip: true,
  283. },
  284. ],
  285. signInfo: {
  286. signDay: 1,
  287. isSigned: false,
  288. reward: 0,
  289. },
  290. taskList: [],
  291. dropdownOptions: [{ label: "星源记录", type: "starSourceRecord" }],
  292. isRefreshing: false,
  293. };
  294. },
  295. onPullDownRefresh() {
  296. if (this.isRefreshing) return;
  297. this.isRefreshing = true;
  298. this.refreshData();
  299. },
  300. onLoad(e) {
  301. if (e && e.type == "recharge") {
  302. setTimeout(() => {
  303. this.openNicknamePopUpWindow();
  304. }, 0);
  305. }
  306. this.loadData();
  307. this.getSignInfo();
  308. },
  309. onShow() {},
  310. methods: {
  311. opencheckInPopUpWindow() {
  312. this.$refs.checkInPopUpWindow.open();
  313. },
  314. closecheckInPopUpWindow() {
  315. this.$refs.checkInPopUpWindow.close();
  316. },
  317. openNicknamePopUpWindow() {
  318. this.$refs.NicknamePopUpWindow.open();
  319. },
  320. closeNicknamePopUpWindow() {
  321. this.$refs.NicknamePopUpWindow.close();
  322. },
  323. onBack() {},
  324. loadData() {
  325. return new Promise((resolve, reject) => {
  326. uni.request({
  327. url: this.$apiHost + "/Job/getlist",
  328. data: {
  329. uuid: getApp().globalData.uuid,
  330. },
  331. header: {
  332. "content-type": "application/json",
  333. sign: getApp().globalData.headerSign,
  334. },
  335. success: (res) => {
  336. console.log("----:", res.data);
  337. this.num_gmd = res.data.num_gmd;
  338. this.newer_bfb = res.data.newer_bfb;
  339. this.taskList = res.data.list;
  340. resolve(res);
  341. },
  342. complete: (com) => {
  343. // uni.hideLoading();
  344. },
  345. fail: (e) => {
  346. console.log("----e:", e);
  347. reject(e);
  348. },
  349. });
  350. });
  351. },
  352. getSignInfo() {
  353. return new Promise((resolve, reject) => {
  354. uni.request({
  355. url: this.$apiHost + "/User/sign7Day",
  356. data: {
  357. uuid: getApp().globalData.uuid,
  358. action: "get",
  359. },
  360. header: {
  361. "content-type": "application/json",
  362. sign: getApp().globalData.headerSign,
  363. },
  364. success: (res) => {
  365. if (res.data.success === "yes") {
  366. this.signInfo = {
  367. signDay: res.data.data.sign_day,
  368. isSigned: res.data.data.is_signed,
  369. reward: res.data.data.reward || 0,
  370. };
  371. }
  372. resolve(res);
  373. },
  374. fail: (e) => {
  375. console.log("获取签到信息失败:", e);
  376. reject(e);
  377. },
  378. });
  379. uni.request({
  380. url: this.$apiHost + "/User/getinfo",
  381. data: {
  382. uuid: getApp().globalData.uuid,
  383. skey: getApp().globalData.skey,
  384. },
  385. header: {
  386. "content-type": "application/json",
  387. sign: getApp().globalData.headerSign,
  388. },
  389. success: (res) => {
  390. this.myinfo = res.data;
  391. resolve(res);
  392. },
  393. complete: (com) => {},
  394. fail: (e) => {
  395. console.log("----e:", e);
  396. reject(e);
  397. },
  398. });
  399. });
  400. },
  401. showExchangePopup() {
  402. this.showExchange = true;
  403. },
  404. hideExchangePopup() {
  405. this.showExchange = false;
  406. },
  407. toggleSignNotify(falg) {
  408. this.signNotify = falg;
  409. },
  410. confirmSign(type) {
  411. if (this.signInfo.isSigned) {
  412. uni.showToast({
  413. title: "今日已签到,明天再来吧",
  414. icon: "none",
  415. });
  416. return;
  417. }
  418. uni.request({
  419. url: this.$apiHost + "/User/sign7Day",
  420. data: {
  421. uuid: getApp().globalData.uuid,
  422. action: "sign",
  423. },
  424. header: {
  425. "content-type": "application/json",
  426. sign: getApp().globalData.headerSign,
  427. },
  428. success: (res) => {
  429. if (res.data.success === "yes") {
  430. uni.showToast({
  431. title: res.data.str,
  432. icon: "none",
  433. });
  434. this.getSignInfo();
  435. this.loadData();
  436. } else {
  437. uni.showToast({
  438. title: res.data.str,
  439. icon: "none",
  440. });
  441. }
  442. },
  443. fail: (e) => {
  444. console.log("签到失败:", e);
  445. uni.showToast({
  446. title: "签到失败,请稍后重试",
  447. icon: "none",
  448. });
  449. },
  450. });
  451. },
  452. confirmExchange() {
  453. if (!this.exchangeAmount) {
  454. uni.showToast({
  455. title: "请输入兑换数量",
  456. icon: "none",
  457. });
  458. return;
  459. }
  460. const amount = parseInt(this.exchangeAmount);
  461. if (isNaN(amount) || amount <= 0) {
  462. uni.showToast({
  463. title: "请输入有效数量",
  464. icon: "none",
  465. });
  466. return;
  467. }
  468. if (amount % 10 !== 0) {
  469. uni.showToast({
  470. title: "兑换数量必须是10的倍数",
  471. icon: "none",
  472. });
  473. return;
  474. }
  475. let that = this;
  476. uni.request({
  477. url: this.$apiHost + "/User/gmmToGMD",
  478. data: {
  479. uuid: getApp().globalData.uuid,
  480. num: amount,
  481. },
  482. header: {
  483. "content-type": "application/json",
  484. sign: getApp().globalData.headerSign,
  485. },
  486. success: (res) => {
  487. console.log("----:", res.data);
  488. uni.showToast({
  489. title: res.data.str,
  490. icon: "none",
  491. });
  492. if (res.data.success == "yes") {
  493. this.hideExchangePopup();
  494. this.exchangeAmount = "";
  495. setTimeout(function () {
  496. that.loadData();
  497. }, 900);
  498. }
  499. },
  500. complete: (com) => {
  501. this.closeNicknamePopUpWindow();
  502. },
  503. fail: (e) => {
  504. console.log("----e:", e);
  505. },
  506. });
  507. },
  508. claimReward(index) {
  509. if (this.taskList[index].status == 9) {
  510. uni.showToast({
  511. title: "已领取该奖励",
  512. icon: "none",
  513. });
  514. return;
  515. }
  516. let that = this;
  517. uni.request({
  518. url: this.$apiHost + "/Job/doAct",
  519. data: {
  520. uuid: getApp().globalData.uuid,
  521. id: this.taskList[index].id,
  522. },
  523. header: {
  524. "content-type": "application/json",
  525. sign: getApp().globalData.headerSign,
  526. },
  527. success: (res) => {
  528. console.log("----:", res.data);
  529. if (res.data.success == "yes") {
  530. uni.showToast({
  531. title: res.data.str,
  532. icon: "none",
  533. });
  534. setTimeout(function () {
  535. that.loadData();
  536. }, 900);
  537. }
  538. },
  539. complete: (com) => {
  540. // uni.hideLoading();
  541. },
  542. fail: (e) => {
  543. console.log("----e:", e);
  544. },
  545. });
  546. },
  547. handleDropdownSelect(item) {
  548. switch (item.type) {
  549. case "starSourceRecord":
  550. uni.navigateTo({
  551. url: "/pages/vip/record?type=star",
  552. });
  553. break;
  554. }
  555. },
  556. showExchangeConfirm() {
  557. this.$refs["DialogBox"]
  558. .confirm({
  559. title: "确认兑换",
  560. content: "确定要兑换" + this.exchangeAmount + "星源吗?",
  561. DialogType: "inquiry",
  562. btn1: "再考虑一下",
  563. btn2: "确认兑换",
  564. animation: 0,
  565. })
  566. .then((res) => {
  567. if (res.confirm) {
  568. this.confirmExchange();
  569. }
  570. });
  571. },
  572. refreshData() {
  573. Promise.all([this.loadData(), this.getSignInfo()])
  574. .then(() => {
  575. this.isRefreshing = false;
  576. uni.stopPullDownRefresh();
  577. })
  578. .catch(() => {
  579. this.isRefreshing = false;
  580. uni.stopPullDownRefresh();
  581. });
  582. },
  583. goPage(page) {
  584. uni.navigateTo({
  585. url: page,
  586. });
  587. },
  588. },
  589. };
  590. </script>
  591. <style scoped lang="scss">
  592. @import "job.scss";
  593. </style>