job.vue 16 KB

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