myStar.vue 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897
  1. <template>
  2. <view class="star-container">
  3. <PageHeader title="" class="PageHeader" v-if="state == 1">
  4. <template v-slot:center> </template>
  5. </PageHeader>
  6. <!-- 星灵基因重组仓弹窗 -->
  7. <view class="gender-popup" v-if="state == 0">
  8. <NicknamePopup :closeOnClickOverlay="false" title="星灵基因重组仓" subtitle="" class="openContentPopUpWindow"
  9. ref="openContentPopUpWindow" @close="goBack()">
  10. <template v-slot:content>
  11. <uv-textarea v-model="noteContent" maxlength="200" count autoHeight
  12. placeholder="可描述你想要重新赋予Ta的形象、性别、性格、身份、兴趣爱好等(不会展示给其他人,仅你自己知道),示例:有一头波浪状的橙色头发,喜欢运动的阳光男孩..."></uv-textarea>
  13. <view class="btn-box blick-btn-animation" @tap="confirmGender">创建星灵</view>
  14. </template>
  15. </NicknamePopup>
  16. </view>
  17. <!-- 加载动画区域 -->
  18. <view class="loading-area" v-if="state == 2 || isLoading">
  19. <image src="../../static/me/loadAnimation.gif" mode="widthFix"></image>
  20. </view>
  21. <!-- 角色展示页面 -->
  22. <view class="character-page" v-else-if="state == 1">
  23. <view class="character-container">
  24. <image :src="starInfo.image || ''" mode="widthFix" class="character-image">
  25. </image>
  26. </view>
  27. <view class="bottom-button" @tap="goToSetProfile"> 设置星灵简介 </view>
  28. </view>
  29. <!-- 表单页面 -->
  30. <view class="form-page" v-else-if="state == 4">
  31. <PageHeader title="设置星灵简介" class="PageHeader">
  32. <template v-slot:center> </template>
  33. </PageHeader>
  34. <view class="reserveASeat"></view>
  35. <form @submit="submitForm">
  36. <view class="form-group">
  37. <view class="label">
  38. <text class="required">*</text>
  39. <text>昵称</text>
  40. </view>
  41. <input class="input" v-model="formData.nickname" placeholder="给星灵取个名字"
  42. :class="{ error: showError && !formData.nickname }" />
  43. </view>
  44. <view class="form-group">
  45. <view class="label">性别</view>
  46. <view class="gender-options">
  47. <view class="gender-option" :class="sex == 'male' ? 'selected' : ''"
  48. @tap="selectGender('male')">
  49. <view class="gender-icon male">
  50. <image src="../../static/me/wd_icon_nan.png" mode="aspectFit"></image>
  51. 男性
  52. </view>
  53. </view>
  54. <view class="gender-option" :class="sex == 'female' ? 'selected' : ''"
  55. @tap="selectGender('female')">
  56. <view class="gender-icon female">
  57. <image src="../../static/me/wd_icon_nv.png" mode="aspectFit"></image>
  58. 女性
  59. </view>
  60. </view>
  61. <view class="gender-option" :class="sex == 'other' ? 'selected' : ''"
  62. @tap="selectGender('other')">
  63. <view class="gender-icon other">
  64. <image src="../../static/me/wd_icon_qita.png" mode="aspectFit"></image>
  65. 其它
  66. </view>
  67. </view>
  68. </view>
  69. </view>
  70. <view class="form-group">
  71. <view class="label">
  72. <text class="required">*</text>
  73. <text>人物简介</text>
  74. </view>
  75. <view class="textarea-container">
  76. <textarea class="textarea" v-model="formData.description"
  77. placeholder="填写这个角色的人物介绍,例如性格、身份、背景与历程..." :maxlength="500"
  78. :class="{ error: showError && !formData.description }" autoHeight />
  79. <text class="word-count">{{ formData.description.length }}/500</text>
  80. </view>
  81. </view>
  82. <view class="form-group">
  83. <view class="label">人物标签</view>
  84. <!-- <scroll-view class="tags-scroll" scroll-x="true" show-scrollbar="false">
  85. <view class="tags-container">
  86. <view class="tag" v-for="tag in predefinedTags" :key="tag">
  87. {{ tag }}
  88. </view>
  89. </view>
  90. </scroll-view> -->
  91. <view class="tags-container">
  92. <!-- <view class="tag" :class="{ active: tagSet.has(tag) }" v-for="tag in predefinedTags" :key="tag"
  93. @tap="switchTag(tag)">
  94. {{ tag }}
  95. </view> -->
  96. <uni-data-checkbox mode="tag" multiple v-model="selectTags"
  97. :localdata="predefinedTags"></uni-data-checkbox>
  98. </view>
  99. </view>
  100. </form>
  101. <view class="submit-button" @tap="submitStar"> 确定并提交 </view>
  102. </view>
  103. <!-- 角色信息展示页面 -->
  104. <view class="character-info" v-else-if="state == 5 || state == 6">
  105. <view class="custom-navbar">
  106. <view class="navbar-left" @click="goBack">
  107. <text class="fa fa-angle-left" style="color: #000;"></text>
  108. </view>
  109. <view class="navbar-right" @click="showShare = true">
  110. <image src="@/static/icon/more2.png" style="width: 64rpx;height: 64rpx; margin-top: 15rpx;" mode="widthFix"></image>
  111. </view>
  112. </view>
  113. <view class="info-container">
  114. <!-- 角色立绘区域 -->
  115. <view class="character-portrait">
  116. <image :src="starInfo.image" mode="widthFix" class="portrait-image"></image>
  117. </view>
  118. <!-- 角色信息板块 -->
  119. <view class="info-section">
  120. <view class="character-name">
  121. <uv-input v-if="state == 5" v-model="starInfo.nickname" placeholder="请输入昵称" border="none" />
  122. <text v-else>{{ starInfo.nickname }}</text>
  123. <image class="male" v-if="starInfo.sex_id == 1" src="../../static/me/wd_icon_nan.png"
  124. mode="aspectFit">
  125. </image>
  126. <image class="female" v-else-if="starInfo.sex_id == 2" src="../../static/me/wd_icon_nv.png"
  127. mode="aspectFit">
  128. </image>
  129. <image class="other" v-else-if="starInfo.sex_id == 3" src="../../static/me/wd_icon_qita.png"
  130. mode="aspectFit"></image>
  131. </view>
  132. <!-- 人物简介 -->
  133. <view class="description-box">
  134. <view class="description-title">
  135. <view>Ta的设定</view>
  136. <view v-if="state == 5" class="edit-button" @click="showEditPopup">
  137. 编辑<text class="fa fa-angle-right" style="color: #000;"></text>
  138. </view>
  139. </view>
  140. <view class="description-text">
  141. <text>{{ starInfo.content }}</text>
  142. </view>
  143. </view>
  144. <!-- 标签展示 -->
  145. <view class="description-box">
  146. <view class="description-title">
  147. <view>人物标签</view>
  148. </view>
  149. <view class="tags-box">
  150. <view class="tag-item" v-for="tag in starInfo.tags" :key="tag">
  151. {{ tag }}
  152. </view>
  153. </view>
  154. </view>
  155. </view>
  156. </view>
  157. <!-- 底部按钮 -->
  158. <view class="join-button blick-btn-animation" @tap="handleJoin(1)" v-if="state == 5"> 入驻星球 </view>
  159. <view class="join-button blick-btn-animation" @tap="handleJoin(0)" v-if="state == 6"> 已入驻星球(点击进入星球) </view>
  160. </view>
  161. <!-- 编辑弹窗 -->
  162. <uni-popup ref="editPopup" type="center">
  163. <view class="edit-popup">
  164. <view class="popup-title">修改设定</view>
  165. <view class="popup-content">
  166. <uv-textarea v-model="editContent" :maxlength="500" count autoHeight placeholder="输入Ta的设定"
  167. class="edit-textarea" />
  168. </view>
  169. <view class="popup-buttons">
  170. <view class="cancel-btn" @click="closeEditPopup">再考虑一下</view>
  171. <view class="confirm-btn" @click="saveEdit">确认添加</view>
  172. </view>
  173. </view>
  174. </uni-popup>
  175. <SharePopup :visible="showShare" :userId="userId" :share-title="shareTitle" :share-desc="shareDesc"
  176. :share-img="shareImg" view="makeDetail" @close="showShare = false" />
  177. </view>
  178. </template>
  179. <script>
  180. import tabbarView from "@/components/tabbar/tabbar.vue";
  181. import value from '../../uni_modules/uv-text/components/uv-text/value';
  182. import {
  183. mapMutations
  184. } from 'vuex'
  185. export default {
  186. components: {
  187. tabbarView,
  188. },
  189. data() {
  190. return {
  191. isLoading: false,
  192. selectedGender: null,
  193. tempGender: null,
  194. tabbars: [],
  195. ballColors: [
  196. "#FF6B6B", // 红色
  197. "#4ECDC4", // 青色
  198. "#45B7D1", // 蓝色
  199. "#96CEB4", // 绿色
  200. "#FFEEAD", // 黄色
  201. "#D4A5A5", // 粉色
  202. "#9A8194", // 紫色
  203. "#FF9F1C", // 橙色
  204. ],
  205. showError: false,
  206. formData: {
  207. nickname: "",
  208. sex: "其他",
  209. description: "",
  210. tags: [],
  211. },
  212. predefinedTags: [],
  213. showInfo: false,
  214. starImg: "",
  215. noteContent: "",
  216. starInfo: {},
  217. state: 2, //0 是用户输入星灵基因重组仓的状态 1 是用户已经完成了匹星灵展示页面 2是用户匹配中加载的状态 3是匹配到了待点击进入设置界面 (根据其它字段判断是否失败) 4是用户设置星灵信息的页面 5是用户查看星灵信息的页面 待入驻 6是用户已经已经入驻星球了
  218. sex: "",
  219. selectTags: [],
  220. info: {
  221. "id": 0,
  222. "sso_id": 0,
  223. "image_id": 0,
  224. "image": "",
  225. "nickname": "",
  226. "user_content": "",
  227. "content": "",
  228. "sex_id": 0,
  229. "tags": "",
  230. "status": 0
  231. },
  232. timeoutId: 0,
  233. showShare: false,
  234. shareTitle: "分享标题",
  235. shareDesc: "",
  236. shareImg: "",
  237. userId: 0,
  238. maxRetries: 10, // 最大重试次数
  239. retryCount: 0, // 当前重试次数
  240. pollingInterval: 30000, // 轮询间隔时间(毫秒)
  241. editContent: '',
  242. };
  243. },
  244. onLoad() {
  245. this.aIpipeiGetinfo("get");
  246. this.loadInfo()
  247. },
  248. methods: {
  249. ...mapMutations('switchingModule', ['setInformation', 'deleteInformation']),
  250. // 返回上一页
  251. goBack() {
  252. console.log(66);
  253. uni.navigateBack({
  254. delta: 1
  255. });
  256. },
  257. confirmGender() {
  258. // if (!this.noteContent) {
  259. // uni.showToast({
  260. // title: "请输入匹配条件",
  261. // icon: "none",
  262. // });
  263. // return;
  264. // }
  265. // this.selectedGender = this.noteContent;
  266. this.isLoading = true;
  267. this.closeContentPopUpWindow();
  268. this.state = 2
  269. this.apiPeiStar();
  270. },
  271. goToSetProfile() {
  272. this.state = 4;
  273. this.formData.nickname = ''
  274. this.formData.sex = ''
  275. this.formData.tags = ''
  276. },
  277. toggleTag(tag) {
  278. const index = this.formData.tags.indexOf(tag);
  279. if (index > -1) {
  280. this.formData.tags.splice(index, 1);
  281. } else {
  282. this.formData.tags.push(tag);
  283. }
  284. },
  285. handleJoin(type) {
  286. if (type === 1) {
  287. // 保存修改后的信息到服务器
  288. uni.request({
  289. url: this.$apiHost + "/AIpipei/gogogo",
  290. data: {
  291. uuid: getApp().globalData.uuid,
  292. nickname: this.starInfo.nickname,
  293. content: this.starInfo.content,
  294. },
  295. header: {
  296. "content-type": "application/x-www-form-urlencoded",
  297. sign: getApp().globalData.headerSign,
  298. },
  299. method: "POST",
  300. success: (res) => {
  301. console.log("res.data", res.data);
  302. uni.showToast({
  303. title: res.data.str,
  304. icon: "none",
  305. duration: 2000,
  306. });
  307. if (res.data.success === "yes") {
  308. this.aIpipeiGetinfo({
  309. polling: false
  310. });
  311. }
  312. }
  313. });
  314. } else {
  315. // 已入驻状态,直接跳转
  316. uni.navigateTo({
  317. url: '/pages/isLand/homeLand'
  318. });
  319. }
  320. },
  321. // 提交用户 开始创建的命令
  322. apiPeiStar() {
  323. uni.request({
  324. url: this.$apiHost + "/AIpipei/start",
  325. data: {
  326. uuid: getApp().globalData.uuid,
  327. content: this.noteContent,
  328. },
  329. header: {
  330. "content-type": "application/x-www-form-urlencoded",
  331. sign: getApp().globalData.headerSign,
  332. },
  333. // 设置60秒超时
  334. timeout: 60000,
  335. method: 'POST',
  336. success: (res) => {
  337. setTimeout(() => {
  338. if (res.data.str != "开始匹配") {
  339. uni.showToast({
  340. title: res.data.str,
  341. icon: "none",
  342. duration: 2000,
  343. });
  344. }
  345. if (res.data.success == "no") {
  346. setTimeout(() => {
  347. this.state = 0
  348. this.isLoading = false;
  349. this.aIpipeiGetinfo("get");
  350. this.loadInfo()
  351. }, 2000);
  352. // this.apiPeiStar();
  353. }
  354. if (res.data.str == "开始匹配") {
  355. this.aIpipeiGetinfo({
  356. polling: true
  357. })
  358. }
  359. }, 3000);
  360. },
  361. fail: (err) => {
  362. console.error("请求失败:", err);
  363. // 显示错误提示
  364. uni.showToast({
  365. title: "网络请求失败,请重试",
  366. icon: "none",
  367. duration: 2000,
  368. });
  369. // 重置加载状态
  370. },
  371. complete: () => {
  372. },
  373. });
  374. },
  375. loadInfo() {
  376. console.log({
  377. uuid: getApp().globalData.uuid,
  378. skey: getApp().globalData.skey,
  379. });
  380. uni.request({
  381. url: this.$apiHost + "/User/getinfo",
  382. data: {
  383. uuid: getApp().globalData.uuid,
  384. skey: getApp().globalData.skey,
  385. },
  386. header: {
  387. "content-type": "application/json",
  388. sign: getApp().globalData.headerSign,
  389. },
  390. success: (res) => {
  391. console.log("----:", JSON.parse(JSON.stringify(res.data)));
  392. if (res.data) {
  393. this.userId = res.data.user_id
  394. }
  395. },
  396. complete: (com) => {
  397. // uni.hideLoading();
  398. },
  399. fail: (e) => {
  400. console.log("----e:", e);
  401. },
  402. });
  403. },
  404. // 查询Ai匹配信息
  405. aIpipeiGetinfo({
  406. polling
  407. }) {
  408. // 清除之前的定时器
  409. if (this.timeoutId) {
  410. clearTimeout(this.timeoutId);
  411. this.timeoutId = 0;
  412. }
  413. // 检查是否超过最大重试次数
  414. if (polling && this.retryCount >= this.maxRetries) {
  415. uni.showToast({
  416. title: '匹配超时,请重新尝试',
  417. icon: 'none',
  418. duration: 2000
  419. });
  420. this.retryCount = 0;
  421. this.state = 0;
  422. return;
  423. }
  424. // 发起请求
  425. uni.request({
  426. url: this.$apiHost + "/AIpipei/getinfo",
  427. data: {
  428. uuid: getApp().globalData.uuid,
  429. },
  430. header: {
  431. "content-type": "application/json",
  432. sign: getApp().globalData.headerSign,
  433. },
  434. timeout: 60000,
  435. success: (res) => {
  436. console.log("查询到生成信息", res.data);
  437. // 重置重试计数
  438. this.retryCount = 0;
  439. if (res && res.data && res.data.info) {
  440. if (res.data.info.content) {
  441. res.data.info.content = res.data.info.content.replace(/^\n+/, '')
  442. console.log(res.data.info.content);
  443. }
  444. if (res.data.info && res.data.info.tags != "") {
  445. res.data.info.tags = res.data.info.tags.split(",");
  446. this.predefinedTags = res.data.info.tags.map(tag => {
  447. return {
  448. text: tag,
  449. value: tag
  450. }
  451. })
  452. console.log(666, res);
  453. this.setInformation(res.data.info)
  454. this.shareTitle = res.data.info.nickname
  455. this.shareDesc = res.data.info.content
  456. this.shareImg = res.data.info.image
  457. // this.userId = res.data.user_id
  458. } else {
  459. res.data.info.tags = []
  460. this.deleteInformation()
  461. }
  462. // 实现状态的判断
  463. // 更改状态为 用户还未匹配过 待输入匹配内容
  464. if (res.data.success == "no") {
  465. if (res.data.str == "没有匹配过" ) {
  466. this.state = 0
  467. setTimeout(() => {
  468. this.openContentPopUpWindow();
  469. }, 300);
  470. return ;
  471. }
  472. uni.showToast({
  473. title: res.data.str,
  474. icon: "none",
  475. duration: 2000,
  476. });
  477. setTimeout(() => {
  478. this.state = 0
  479. setTimeout(() => {
  480. this.openContentPopUpWindow();
  481. }, 300);
  482. }, 2000);
  483. }
  484. // 更改状态为 用户还匹配成功时 待点击设置心灵简介
  485. if (res.data.info.image && res.data.info.status == 2) {
  486. this.state = 1
  487. this.isLoading = false
  488. // this.openContentPopUpWindow();
  489. }
  490. if (res.data.info.image && res.data.info.status == 1) {
  491. this.state = 6
  492. this.isLoading = false
  493. }
  494. if (res.data.info.image && res.data.info.status == 3) {
  495. this.state = 5
  496. this.isLoading = false
  497. }
  498. this.starInfo = res.data.info;
  499. if (res.data.info.content) {
  500. this.formData.description = res.data.info.content;
  501. }
  502. }
  503. },
  504. fail: (err) => {
  505. console.error("请求失败:", err);
  506. // 增加重试计数
  507. this.retryCount++;
  508. // 显示错误提示
  509. uni.showToast({
  510. title: `网络请求失败,第${this.retryCount}次重试`,
  511. icon: "none",
  512. duration: 2000,
  513. });
  514. // 如果是网络超时,自动重试
  515. if (err.errMsg.includes("timeout")) {
  516. setTimeout(() => {
  517. console.log("请求超时,正在重试...");
  518. this.aIpipeiGetinfo({
  519. polling: true
  520. });
  521. }, 6000);
  522. }
  523. },
  524. complete: () => {
  525. // 如果需要继续轮询,设置下一次请求
  526. if (polling) {
  527. this.timeoutId = setTimeout(() => {
  528. this.aIpipeiGetinfo({
  529. polling: true
  530. });
  531. }, this.pollingInterval);
  532. }
  533. }
  534. });
  535. },
  536. // 保存表单信息
  537. submitStar() {
  538. this.formData.tags = this.selectTags.join(",");
  539. let that = this;
  540. uni.showLoading({
  541. mask: true,
  542. });
  543. if (this.formData.sex) {
  544. this.formData.sex = this.genderScreeningId(this.formData.sex);
  545. }
  546. console.log({
  547. uuid: getApp().globalData.uuid,
  548. sex: this.formData.sex,
  549. name: this.formData.nickname,
  550. content: this.formData.description,
  551. tags: this.formData.tags,
  552. }, 2000);
  553. uni.request({
  554. url: this.$apiHost + "/AIpipei/save",
  555. data: {
  556. uuid: getApp().globalData.uuid,
  557. sex: this.formData.sex,
  558. nickname: this.formData.nickname,
  559. content: this.formData.description,
  560. tags: this.formData.tags,
  561. },
  562. header: {
  563. "content-type": "application/x-www-form-urlencoded",
  564. sign: getApp().globalData.headerSign,
  565. },
  566. method: 'POST',
  567. // 设置60秒超时
  568. timeout: 10000,
  569. success: (res) => {
  570. console.log("res.data", res.data);
  571. uni.showToast({
  572. title: res.data.str,
  573. icon: "none",
  574. duration: 2000,
  575. });
  576. if (res.data.success === "yes") {
  577. setTimeout(() => {
  578. that.aIpipeiGetinfo({
  579. polling: false
  580. });
  581. }, 300);
  582. }
  583. },
  584. fail: (err) => {
  585. console.error("请求失败:", err);
  586. // 显示错误提示
  587. uni.showToast({
  588. title: "网络请求失败,请重试",
  589. icon: "none",
  590. duration: 2000,
  591. });
  592. },
  593. complete: () => {
  594. uni.hideLoading();
  595. },
  596. });
  597. },
  598. selectGender(option) {
  599. this.formData.sex = option;
  600. this.sex = option;
  601. },
  602. openContentPopUpWindow() {
  603. if (this.$refs.openContentPopUpWindow) {
  604. console.log(9999, "打开");
  605. this.$refs.openContentPopUpWindow.open();
  606. }
  607. },
  608. closeContentPopUpWindow() {
  609. if (this.$refs.openContentPopUpWindow) {
  610. this.$refs.openContentPopUpWindow.close();
  611. }
  612. },
  613. genderScreening(str) {
  614. switch (str) {
  615. case '0':
  616. return '男'
  617. case '1':
  618. return '女'
  619. case '2':
  620. return '其它'
  621. }
  622. },
  623. genderScreeningId(str) {
  624. switch (str) {
  625. case 'male':
  626. return 0
  627. case 'female':
  628. return 1
  629. case 'other':
  630. return 2
  631. }
  632. },
  633. // 显示编辑弹窗
  634. showEditPopup() {
  635. this.editContent = this.starInfo.content;
  636. this.$refs.editPopup.open();
  637. },
  638. // 关闭编辑弹窗
  639. closeEditPopup() {
  640. this.$refs.editPopup.close();
  641. },
  642. // 保存编辑内容
  643. saveEdit() {
  644. this.starInfo.content = this.editContent;
  645. this.closeEditPopup();
  646. },
  647. },
  648. };
  649. </script>
  650. <style lang="scss">
  651. @import "./myStar.scss";
  652. .openContentPopUpWindow {
  653. ::v-deep.uv-textarea {
  654. width: 694rpx !important;
  655. border-radius: 20rpx !important;
  656. border: 1rpx solid #000000 !important;
  657. margin: 0 auto;
  658. margin-bottom: 44rpx;
  659. min-height: 300rpx;
  660. padding-bottom: 40rpx;
  661. .uv-textarea__field {
  662. min-height: 200rpx !important;
  663. font-weight: 400;
  664. font-size: 28rpx;
  665. color: #1f1f1f;
  666. }
  667. }
  668. }
  669. .textarea-container {
  670. .textarea {
  671. background: #f2f6f2 !important;
  672. min-height: 100rpx;
  673. }
  674. }
  675. .tags-container {
  676. ::v-deep.checklist-box {
  677. border-radius: 16rpx !important;
  678. border: 2rpx solid #1f1f1f !important;
  679. background-color: #fff !important;
  680. display: flex;
  681. align-items: center;
  682. justify-content: center;
  683. .checklist-text {
  684. font-size: 28rpx;
  685. color: #1f1f1f;
  686. font-family: "PingFang SC-Bold" !important;
  687. }
  688. &.is-checked {
  689. background: #f7ffea !important;
  690. border-color: #7ebc00 !important;
  691. .checklist-text {
  692. color: #1f1f1f !important;
  693. }
  694. }
  695. }
  696. }
  697. .star-container {
  698. /* 自定义导航栏样式 */
  699. .custom-navbar {
  700. display: flex;
  701. flex-direction: row;
  702. align-items: center;
  703. justify-content: space-between;
  704. width: 100%;
  705. height: calc(90rpx + var(--status-bar-height));
  706. padding: 0 20rpx;
  707. padding-top: var(--status-bar-height);
  708. background-color: transparent;
  709. position: fixed;
  710. top: 0;
  711. left: 0;
  712. z-index: 100;
  713. background: transparent;
  714. &::before {
  715. content: '';
  716. position: absolute;
  717. top: 0;
  718. left: 0;
  719. width: 100%;
  720. height: var(--status-bar-height);
  721. background-color: #fff;
  722. z-index: -1;
  723. }
  724. .navbar-left {
  725. width: 80rpx;
  726. height: 80rpx;
  727. display: flex;
  728. align-items: center;
  729. justify-content: center;
  730. .fa-angle-left {
  731. font-size: 48rpx;
  732. color: #333;
  733. }
  734. }
  735. .navbar-right {
  736. width: 80rpx;
  737. height: 80rpx;
  738. display: flex;
  739. justify-content: center;
  740. align-items: center;
  741. .fa-ellipsis-h {
  742. font-size: 36rpx;
  743. color: #333;
  744. }
  745. }
  746. }
  747. }
  748. .edit-popup {
  749. width: 600rpx;
  750. background: #fff;
  751. border-radius: 24rpx;
  752. padding: 40rpx 32rpx;
  753. .popup-title {
  754. font-size: 32rpx;
  755. font-weight: bold;
  756. text-align: center;
  757. margin-bottom: 32rpx;
  758. color: #000;
  759. }
  760. .popup-content {
  761. margin-bottom: 32rpx;
  762. .edit-textarea {
  763. background: #F7F7F7;
  764. border-radius: 16rpx;
  765. padding: 24rpx;
  766. min-height: 160rpx;
  767. ::v-deep .uv-textarea__field {
  768. font-size: 28rpx;
  769. color: #333;
  770. }
  771. }
  772. }
  773. .popup-buttons {
  774. display: flex;
  775. justify-content: space-between;
  776. gap: 24rpx;
  777. .cancel-btn,
  778. .confirm-btn {
  779. flex: 1;
  780. height: 88rpx;
  781. line-height: 88rpx;
  782. text-align: center;
  783. border-radius: 44rpx;
  784. font-size: 32rpx;
  785. font-weight: 500;
  786. }
  787. .cancel-btn {
  788. background: #fff;
  789. color: #333;
  790. border: 2rpx solid #E5E5E5;
  791. }
  792. .confirm-btn {
  793. background: #000;
  794. color: #fff;
  795. }
  796. }
  797. }
  798. .description-title {
  799. display: flex;
  800. justify-content: space-between;
  801. align-items: center;
  802. .edit-button {
  803. color: #7ebc00;
  804. font-size: 28rpx;
  805. display: flex;
  806. align-items: center;
  807. .fa-angle-right {
  808. margin-left: 10rpx;
  809. }
  810. }
  811. }
  812. </style>