myStar.vue 20 KB

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