myStar.vue 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275
  1. <template>
  2. <view class="star-container">
  3. <!-- 性别选择弹窗 -->
  4. <view class="gender-popup" v-if="!selectedGender">
  5. <view class="popup-content">
  6. <view class="popup-title">请选择性别</view>
  7. <view class="gender-cards">
  8. <view class="gender-card"
  9. :class="{'selected': tempGender === 'male'}"
  10. @tap="selectGender('male')">
  11. <image src="/static/gender/male.png" mode="aspectFit"></image>
  12. <text>男生</text>
  13. <image v-if="tempGender === 'male'"
  14. class="check-icon"
  15. src="/static/gender/check.png"
  16. mode="aspectFit">
  17. </image>
  18. </view>
  19. <view class="gender-card"
  20. :class="{'selected': tempGender === 'female'}"
  21. @tap="selectGender('female')">
  22. <image src="/static/gender/female.png" mode="aspectFit"></image>
  23. <text>女生</text>
  24. <image v-if="tempGender === 'female'"
  25. class="check-icon"
  26. src="/static/gender/check.png"
  27. mode="aspectFit">
  28. </image>
  29. </view>
  30. </view>
  31. <view class="confirm-btn" @tap="confirmGender">
  32. 创建星灵
  33. </view>
  34. </view>
  35. </view>
  36. <!-- 加载动画区域 -->
  37. <view class="loading-area" v-if="isLoading">
  38. <view class="loading-wrapper">
  39. <!-- 中心蓝色旋转圆 -->
  40. <view class="center-circle"></view>
  41. <!-- 外围16个小球 -->
  42. <view class="orbit-balls">
  43. <view class="ball" v-for="(item,index) in 16" :key="index"
  44. :style="{
  45. transform: `rotate(${index * 22.5}deg)`,
  46. '--delay': `${index * 0.2}s`,
  47. '--color': ballColors[index % 8]
  48. }">
  49. <view class="ball-item"></view>
  50. </view>
  51. </view>
  52. </view>
  53. <text class="loading-text">正在加载...</text>
  54. </view>
  55. <!-- 角色信息展示页面 -->
  56. <view class="character-info" v-else-if="showInfo">
  57. <view class="info-container">
  58. <!-- 角色立绘区域 -->
  59. <view class="character-portrait">
  60. <image
  61. :src="selectedGender === 'male' ? '/static/character/male-full.png' : '/static/character/female-full.png'"
  62. mode="aspectFit"
  63. class="portrait-image"
  64. ></image>
  65. <text class="character-name">{{formData.nickname}}</text>
  66. </view>
  67. <!-- 角色信息板块 -->
  68. <view class="info-section">
  69. <view class="section-title">关于Ta</view>
  70. <!-- 人物简介 -->
  71. <view class="description-box">
  72. <text class="description-text">{{formData.description}}</text>
  73. </view>
  74. <!-- 标签展示 -->
  75. <view class="tags-box">
  76. <view class="tag-item" v-for="tag in formData.tags" :key="tag">
  77. {{tag}}
  78. </view>
  79. </view>
  80. </view>
  81. </view>
  82. <!-- 底部按钮 -->
  83. <view class="join-button" @tap="handleJoin">
  84. 入驻星球
  85. </view>
  86. </view>
  87. <!-- 表单页面 -->
  88. <view class="form-page" v-else-if="showForm">
  89. <form @submit="submitForm">
  90. <view class="form-group">
  91. <view class="label">
  92. <text class="required">*</text>
  93. <text>昵称</text>
  94. </view>
  95. <input
  96. class="input"
  97. v-model="formData.nickname"
  98. placeholder="给星灵取个名字"
  99. :class="{'error': showError && !formData.nickname}"
  100. />
  101. </view>
  102. <view class="form-group">
  103. <view class="label">性别</view>
  104. <view class="gender-options">
  105. <view
  106. class="gender-option"
  107. :class="{'selected': formData.gender === gender}"
  108. v-for="gender in ['男', '女', '其他']"
  109. :key="gender"
  110. @tap="formData.gender = gender"
  111. >
  112. {{gender}}
  113. </view>
  114. </view>
  115. </view>
  116. <view class="form-group">
  117. <view class="label">
  118. <text class="required">*</text>
  119. <text>人物简介</text>
  120. </view>
  121. <view class="textarea-container">
  122. <textarea
  123. class="textarea"
  124. v-model="formData.description"
  125. placeholder="填写这个角色的人物介绍,例如性格、身份、背景与历程..."
  126. :maxlength="255"
  127. :class="{'error': showError && !formData.description}"
  128. />
  129. <text class="word-count">{{formData.description.length}}/255</text>
  130. </view>
  131. </view>
  132. <view class="form-group">
  133. <view class="label">人物标签</view>
  134. <scroll-view
  135. class="tags-scroll"
  136. scroll-x="true"
  137. show-scrollbar="false"
  138. >
  139. <view class="tags-container">
  140. <view
  141. class="tag"
  142. :class="{'selected': formData.tags.includes(tag)}"
  143. v-for="tag in predefinedTags"
  144. :key="tag"
  145. @tap="toggleTag(tag)"
  146. >
  147. {{tag}}
  148. </view>
  149. </view>
  150. </scroll-view>
  151. </view>
  152. </form>
  153. <view class="submit-button" @tap="handleSubmit">
  154. 确定并提交
  155. </view>
  156. </view>
  157. <!-- 角色展示页面 -->
  158. <view class="character-page" v-else-if="selectedGender">
  159. <view class="character-container">
  160. <image
  161. :src="selectedGender === 'male' ? '/static/character/male-full.png' : '/static/character/female-full.png'"
  162. mode="aspectFit"
  163. class="character-image"
  164. ></image>
  165. </view>
  166. <view class="bottom-button" @tap="goToSetProfile">
  167. 设置星灵简介
  168. </view>
  169. </view>
  170. <!-- 收藏内容区域 -->
  171. <view class="star-content" v-else>
  172. <view class="star-list">
  173. <!-- 这里放收藏列表内容 -->
  174. </view>
  175. </view>
  176. </view>
  177. </template>
  178. <script>
  179. import tabbarView from "@/components/tabbar/tabbar.vue"
  180. export default {
  181. components: {
  182. tabbarView
  183. },
  184. data() {
  185. return {
  186. isLoading: false,
  187. selectedGender: null,
  188. tempGender: null,
  189. tabbars: [],
  190. ballColors: [
  191. '#FF6B6B', // 红色
  192. '#4ECDC4', // 青色
  193. '#45B7D1', // 蓝色
  194. '#96CEB4', // 绿色
  195. '#FFEEAD', // 黄色
  196. '#D4A5A5', // 粉色
  197. '#9A8194', // 紫色
  198. '#FF9F1C' // 橙色
  199. ],
  200. showForm: false,
  201. showError: false,
  202. formData: {
  203. nickname: '',
  204. gender: '其他',
  205. description: '',
  206. tags: []
  207. },
  208. predefinedTags: ['高冷', 'INTJ', '爱吃瘦果', '傲娇', '理性', '感性', '文艺', '二次元'],
  209. showInfo: false,
  210. }
  211. },
  212. methods: {
  213. selectGender(gender) {
  214. this.tempGender = gender;
  215. },
  216. confirmGender() {
  217. if (!this.tempGender) return;
  218. this.selectedGender = this.tempGender;
  219. this.isLoading = true;
  220. // 模拟加载过程
  221. setTimeout(() => {
  222. this.isLoading = false;
  223. }, 4000);
  224. },
  225. goToSetProfile() {
  226. this.showForm = true;
  227. },
  228. toggleTag(tag) {
  229. const index = this.formData.tags.indexOf(tag);
  230. if (index > -1) {
  231. this.formData.tags.splice(index, 1);
  232. } else {
  233. this.formData.tags.push(tag);
  234. }
  235. },
  236. handleSubmit() {
  237. // if (!this.formData.nickname || !this.formData.description) {
  238. // this.showError = true;
  239. // return;
  240. // }
  241. this.showForm = false;
  242. this.showInfo = true;
  243. },
  244. handleJoin() {
  245. console.log('入驻星球');
  246. // 处理入驻逻辑
  247. }
  248. }
  249. }
  250. </script>
  251. <style lang="scss">
  252. @import './myStar.scss';
  253. </style>