myStar.vue 19 KB

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