Browse Source

Merge branch 'master' of http://150.158.33.144:3000/lalalashen/MoeNovaClient

lalalashen 2 months ago
parent
commit
a7483dc6b1

+ 1 - 1
common/checkVersion.js

@@ -63,7 +63,7 @@ export default function checkVersion() {
 					uni.request({
 						url: 'https://e.zhichao.art/Gapi/Index/updateWgt?skey=' +
 							getApp().globalData.skey + "&version=" + wgtinfo
-							.versionCode + "&channel=" + channel,
+								.versionCode + "&channel=" + channel,
 						success: (res => {
 							res = res.data;
 							console.log("res22", res)

+ 3 - 0
components/CustomerServicePopup/CustomerServicePopup.vue

@@ -16,6 +16,9 @@ export default {
   methods: {
     closeCustomPopup() {
       this.$refs.customPopup.close()
+    },
+    open() {
+      this.$refs.customPopup.open()
     }
   }
 }

+ 84 - 41
components/dialogs/BackpackDialog.vue

@@ -63,43 +63,8 @@ export default {
     return {
       dialogVisible: false,
       selectedIndex: -1,
-      items: [
-        { 
-          icon: '/static/island/items/item_wood1.png', 
-          count: 999,
-          name: '木材',
-          description: '这是一个木材,可以用来制作各种物品',
-          price: 100
-        },
-        { 
-          icon: '/static/island/items/item_wood2.png', 
-          count: 999,
-          name: '高级木材',
-          description: '这是一个高级木材,可以用来制作高级物品',
-          price: 200
-        },
-        { 
-          icon: '/static/island/items/item_mine1.png', 
-          count: 999,
-          name: '矿石',
-          description: '这是一个矿石,可以用来制作金属物品',
-          price: 150
-        },
-        { 
-          icon: '/static/island/items/item_mine2.png', 
-          count: 999,
-          name: '高级矿石',
-          description: '这是一个高级矿石,可以用来制作高级金属物品',
-          price: 300
-        },
-        { 
-          icon: '/static/island/items/item_axe1.png', 
-          count: 999,
-          name: '斧头',
-          description: '这是一个斧头,可以用来砍伐树木',
-          price: 500
-        }
-      ]
+      items: [],
+      loading: false
     }
   },
   computed: {
@@ -113,8 +78,7 @@ export default {
     visible(val) {
       this.dialogVisible = val
       if(val) {
-        // 默认选中第一个有道具的格子
-        this.selectedIndex = this.items.length > 0 ? 0 : -1
+        this.fetchBagList()
       }
     },
     dialogVisible(val) {
@@ -122,6 +86,51 @@ export default {
     }
   },
   methods: {
+    fetchBagList() {
+      this.loading = true
+      uni.request({
+        url: this.$apiHost + '/Game/get_bag_list',
+        method: 'GET',
+        data: {
+          uuid: getApp().globalData.uuid,
+        },
+          header: {
+            'Content-Type': 'application/x-www-form-urlencoded',
+            'sign': getApp().globalData.headerSign,
+          },
+        success: (res) => {
+          if (res.data.code === 0) {
+            this.items = res.data.data.bagList.map(item => ({
+              id: item.id,
+              tid: item.tid,
+              type: item.type,
+              count: item.num,
+              name: item.name,
+              icon: item.image,
+              description: `这是一个${item.name},数量:${item.num}`,
+              price: item.price // 这里可以根据实际需求设置价格
+            }))
+            // 默认选中第一个有道具的格子
+            this.selectedIndex = this.items.length > 0 ? 0 : -1
+          } else {
+            uni.showToast({
+              title: res.data.msg || '获取背包数据失败',
+              icon: 'none'
+            })
+          }
+        },
+        fail: (err) => {
+          console.error('获取背包数据失败:', err)
+          uni.showToast({
+            title: '获取背包数据失败',
+            icon: 'none'
+          })
+        },
+        complete: () => {
+          this.loading = false
+        }
+      })
+    },
     onClose() {
       this.dialogVisible = false
     },
@@ -144,8 +153,42 @@ export default {
         cancelText: '取消',
         success: (res) => {
           if(res.confirm) {
-            // TODO: 处理出售逻辑
-            this.$emit('sell', item)
+            uni.request({
+              url: this.$apiHost + '/Game/sell_bag_item',
+              method: 'POST',
+              data: {
+                uuid: getApp().globalData.uuid,
+                bag_id: item.id
+              },
+              header: {
+                'Content-Type': 'application/x-www-form-urlencoded',
+                'sign': getApp().globalData.headerSign,
+              },
+              success: (res) => {
+                if (res.data.code === 0) {
+                  uni.showToast({
+                    title: '出售成功',
+                    icon: 'success'
+                  })
+                  // 刷新背包列表
+                  this.fetchBagList()
+                  // 通知父组件更新铃钱
+                  this.$emit('money-change', res.data.data.money)
+                } else {
+                  uni.showToast({
+                    title: res.data.msg || '出售失败',
+                    icon: 'none'
+                  })
+                }
+              },
+              fail: (err) => {
+                console.error('出售失败:', err)
+                uni.showToast({
+                  title: '出售失败',
+                  icon: 'none'
+                })
+              }
+            })
           }
         }
       })

+ 81 - 31
components/dialogs/CraftingDialog.vue

@@ -41,12 +41,20 @@
           
           <!-- 选中工具的详情 -->
           <view class="tool-details" v-if="selectedTool">
-            <text class="tool-description">{{ selectedTool.description }}</text>
+            <text class="tool-description">{{ getToolDescription(selectedTool) }}</text>
             <view class="materials-row">
               <view class="materials">
-                <view v-for="(cost, index) in selectedTool.costs" :key="index" class="material-item">
-                  <image :src="index === 0 ? '/static/island/items/item_wood1.png' : index === 1 ? '/static/island/items/item_mine1.png' : '/static/island/UI/wd_icon_xingyuan.png'" mode="aspectFit" class="material-icon"></image>
-                  <text class="material-count">{{ cost }}</text>
+                <view class="material-item">
+                  <image src="/static/island/items/item_wood1.png" mode="aspectFit" class="material-icon"></image>
+                  <text class="material-count">{{ selectedTool.price }}</text>
+                </view>
+                <view class="material-item">
+                  <image src="/static/island/items/item_mine1.png" mode="aspectFit" class="material-icon"></image>
+                  <text class="material-count">{{ selectedTool.limit_time }}</text>
+                </view>
+                <view class="material-item">
+                  <image src="/static/island/UI/wd_icon_xingyuan.png" mode="aspectFit" class="material-icon"></image>
+                  <text class="material-count">{{ selectedTool.num_out }}</text>
                 </view>
               </view>
               <view class="craft-btn" @click="onCraft">打造</view>
@@ -74,32 +82,8 @@ export default {
       startX: 0,
       lastX: 0,
       isDragging: false,
-      tools: [
-        {
-          name: '捕虫网',
-          image: '/static/island/items/item_bugnet1.png',
-          description: '可以让你用来捕捉大虫',
-          costs: [2000, 800, 920]
-        },
-        {
-          name: '石镐',
-          image: '/static/island/items/item_stonepickaxe1.png',
-          description: '用来挖掘矿石',
-          costs: [2000, 8000, 1300]
-        },
-        {
-          name: '铲子',
-          image: '/static/island/items/item_shovel1.png',
-          description: '用来挖掘地面',
-          costs: [3000, 7200, 2600]
-        },
-        {
-          name: '斧子',
-          image: '/static/island/items/item_axe1.png',
-          description: '用来砍伐树木',
-          costs: [5500, 10000, 5800]
-        }
-      ]
+      tools: [],
+      loading: false
     }
   },
   computed: {
@@ -107,6 +91,13 @@ export default {
       return this.tools[this.selectedToolIndex]
     }
   },
+  watch: {
+    visible(val) {
+      if (val) {
+        this.fetchCraftingData()
+      }
+    }
+  },
   methods: {
     onClose() {
       this.$emit('close')
@@ -117,7 +108,7 @@ export default {
     onCraft() {
       // TODO: 实现制造逻辑
       uni.showToast({
-        title: `正在制造${this.selectedTool.name}`,
+        title: `你的材料不足`,
         icon: 'none'
       })
     },
@@ -160,6 +151,65 @@ export default {
       });
       this.isDragging = false;
       e.preventDefault && e.preventDefault();
+    },
+    // 获取制造工具数据
+    async fetchCraftingData() {
+      if (this.loading) return
+      this.loading = true
+      try {
+        uni.request({
+          url: this.$apiHost + '/Game/get_crafting_list',
+          method: 'GET',
+          data: {
+            uuid: getApp().globalData.uuid
+          },
+          header: {
+            'Content-Type': 'application/x-www-form-urlencoded',
+            'sign': getApp().globalData.headerSign,
+          },
+          success: (res) => {
+            console.log("制造工具数据:", res.data)
+            if (res.data && res.data.code === 0) {
+              this.tools = res.data.list || []
+            } else {
+              uni.showToast({
+                title: res.data?.msg || '获取制造工具数据失败',
+                icon: 'none'
+              })
+            }
+          },
+          fail: (err) => {
+            console.error('获取制造工具数据异常', err)
+            uni.showToast({
+              title: '网络异常,请重试',
+              icon: 'none'
+            })
+          },
+          complete: () => {
+            this.loading = false
+          }
+        })
+      } catch (error) {
+        console.error('获取制造工具数据异常', error)
+        uni.showToast({
+          title: '网络异常,请重试',
+          icon: 'none'
+        })
+        this.loading = false
+      }
+    },
+    // 获取工具描述
+    getToolDescription(tool) {
+      if (!tool) return ''
+      
+      const descriptions = {
+        1: '可以让你用来捕捉大虫',
+        2: '用来挖掘矿石',
+        3: '用来挖掘地面',
+        4: '用来砍伐树木'
+      }
+      
+      return descriptions[tool.id] || '工具描述'
     }
   }
 }

+ 67 - 3
components/tabbar/tabbar.vue

@@ -3,7 +3,8 @@
 		<view class="tabbar-bottom" :style="{ backgroundColor: backgroundColor, height: tabbarHeight + 'px' }">
 			<view class="tabbar-bottom-item" ref="tabbarItem" v-for="(item, index) in tabbars" :key="index"
 				@click="switchTab(item, index)">
-				<image :src="currentIndex == index ? item.selectedIconPath : item.iconPath"
+				<image v-if="item.type != 'midButton'"
+					:src="currentIndex == index ? item.selectedIconPath : item.iconPath"
 					:class="['tabbar-bottom-item-icon']"></image>
 				<text class="tabbar-bottom-item-text"
 					:style="{ color: currentIndex == index ? textActiveColor : textColor }">{{ item.text }}</text>
@@ -11,7 +12,7 @@
 				}}</text>
 			</view>
 		</view>
-		<view class="midButton">
+		<view class="midButton" @click="midButtonGo()">
 			<image class="image" src="../../static/tabbar-icon/center.png" mode=""></image>
 		</view>
 		<view class="safe-bottom-area" style="background-color: #fff;">
@@ -64,7 +65,7 @@ export default {
 
 	methods: {
 		switchTab(item, index) {
-			if (!item.pagePath) return; 
+			if (!item.pagePath) return;
 			if (item.pagePath == '/pages/message/mailMessage') {
 				uni.$emit('check_login', () => {
 					uni.switchTab({
@@ -78,6 +79,69 @@ export default {
 			});
 			// this.payAnimation()
 		},
+		midButtonGo() {
+			console.log('点击了中间按钮');
+			// 判断登录
+			uni.$emit('check_login', () => {
+				// 先读取本地缓存
+				const isJoiningThePlanet = uni.getStorageSync('isJoiningThePlanet');
+				
+				if (isJoiningThePlanet === true) {
+					// 如果缓存为true,直接跳转到星球页面
+					uni.navigateTo({
+						url: '/pages/isLand/homeLand'
+					});
+					return;
+				}
+				
+				// 如果缓存不为true,则请求接口
+				uni.request({
+					url: this.$apiHost + "/AIpipei/getinfo",
+					data: {
+						uuid: getApp().globalData.uuid,
+					},
+					header: {
+						"content-type": "application/json",
+						sign: getApp().globalData.headerSign,
+					},
+					timeout: 60000,
+					success: (res) => {
+						if (res && res.data && res.data.info) {
+							if (res.data.info.image && res.data.info.status == 1) {
+								// 设置本地缓存
+								uni.setStorageSync('isJoiningThePlanet', true);
+								// 跳转到星球页面
+								uni.navigateTo({
+									url: '/pages/isLand/homeLand'
+								});
+							} else {
+								// 设置本地缓存
+								uni.setStorageSync('isJoiningThePlanet', false);
+								// 跳转到我的星球页面
+								uni.navigateTo({
+									url: '/pages/my/myStar'
+								});
+							}
+						} else {
+							// 设置本地缓存
+							uni.setStorageSync('isJoiningThePlanet', false);
+							// 跳转到我的星球页面
+							uni.navigateTo({
+								url: '/pages/my/myStar'
+							});
+						}
+					},
+					fail: (err) => {
+						// 请求失败时也跳转到我的星球页面
+						uni.navigateTo({
+							url: '/pages/my/myStar'
+						});
+					},
+					complete: () => {
+					}
+				});
+			})
+		},
 		async payAnimation() {
 			const active = [{
 				dom: this.$refs.tabbarItem[this.currentIndex],

+ 5 - 2
manifest.json

@@ -2,8 +2,8 @@
     "name" : "萌创星球",
     "appid" : "__UNI__00BD11F",
     "description" : "",
-    "versionName" : "3.0.0",
-    "versionCode" : 300,
+    "versionName" : "3.0.1",
+    "versionCode" : 301,
     "transformPx" : false,
     /* 5+App特有相关 hfhz-mrro-iqmv-igdl storygarden2024@outlook.com*/
     "app-plus" : {
@@ -83,6 +83,9 @@
                         "__platform__" : [ "android" ],
                         "appid" : "wxfed977c88f539599",
                         "UniversalLinks" : ""
+                    },
+                    "alipay" : {
+                        "__platform__" : [ "ios", "android" ]
                     }
                 },
                 "speech" : {},

+ 2 - 0
mixins/tabbar.js

@@ -15,7 +15,9 @@ export default {
 				},
 				{
 					type: 'midButton',
+					pagePath: '/pages/isLand/homeLand',
 					iconPath: '/static/tabbar-icon/center.png',
+					selectedIconPath: '/static/tabbar-icon/center.png'
 				},
 				{
 					text: '消息',

+ 227 - 353
pages/index/index.vue

@@ -11,15 +11,16 @@
 		<view style="display: flex; justify-content: flex-end">
 			<view class="view6 step7"></view>
 		</view> -->
-    <z-paging
-      :use-custom-refresher="false"
-      ref="paging"
-      v-model="dataList"
-      :auto="false"
-      :style="{ height: windowHeight - 80 + 'px' }"
-      :show-scrollbar="false"
-      :refresher-enabled="false"
-    >
+    <z-paging :use-custom-refresher="false" ref="paging" v-model="dataList" :auto="false"
+      :style="{ height: windowHeight - 80 + 'px' }" :show-scrollbar="false" :refresher-enabled="true"
+      @refresherrefresh="onRefresh" @refresherrestore="onRefresherRestore" @query="queryList"
+      :fixed="true" :safe-area-inset-bottom="true" :loading-more-enabled="true"
+      :loading-more-no-more-text="'没有更多了'" :loading-more-loading-text="'加载中...'"
+      :loading-more-fail-text="'加载失败,点击重试'" :loading-more-default-text="'上拉加载更多'"
+      :loading-more-loading-style="{ color: '#999' }"
+      :loading-more-no-more-style="{ color: '#999' }"
+      :loading-more-fail-style="{ color: '#999' }"
+      :loading-more-default-style="{ color: '#999' }">
       <template #top>
         <page-navbar>
           <template #navCenter>
@@ -27,14 +28,12 @@
               <!-- 手动选择城市功能隐藏 -->
               <!-- <view class="topBox" @click="lhSelectCityFun"> -->
               <view class="topBox" @click="lhSelectCityFun">
-                <text
-                  style="
+                <text style="
                     margin-left: 10rpx;
                     margin-right: 20rpx;
                     font-size: 44rpx;
                     font-weight: 600;
-                  "
-                >
+                  ">
                   {{ currentCity }}
                 </text>
                 <!-- <image src="@/static/home/home-bom.png"
@@ -50,24 +49,13 @@
               </view>
             </view>
             <view class="search" @click="goPage('/pages/index/Search')">
-              <uv-input
-                placeholder="🔥“潮玩大作战” 派对季重磅开启!"
-                border="none"
-                :custom-style="{ background: '#fff', paddingLeft: '25rpx' }"
-                shape="circle"
-              >
-                <image
-                  class="testImg"
-                  src="@/static/home/icon-hot.png"
-                  style="width: 22rpx; height: 30rpx"
-                ></image>
+              <uv-input placeholder="🔥 潮玩大作战 派对季重磅开启!" border="none"
+                :custom-style="{ background: '#fff', paddingLeft: '25rpx' }" shape="circle">
+                <image class="testImg" src="@/static/home/icon-hot.png" style="width: 22rpx; height: 30rpx"></image>
 
                 <template #suffix>
                   <view class="input-box">
-                    <image
-                      src="@/static/icon/search.png"
-                      style="width: 32rpx; height: 32rpx"
-                    >
+                    <image src="@/static/icon/search.png" style="width: 32rpx; height: 32rpx">
                     </image>
                   </view>
                 </template>
@@ -79,34 +67,15 @@
       <z-paging-cell class="benner-box">
         <sortble :default-sorts="['uvSwiper', 'classModel', 'uvSwiperCard']">
           <template #uvSwiper>
-            <uv-swiper
-              :list="bannerList"
-              :autoplay="true"
-              circular
-              :interval="5000"
-              indicator
-              indicator-mode="dot"
-              height="200"
-              radius="0"
-            ></uv-swiper>
+            <uv-swiper :list="bannerList" :autoplay="true" circular :interval="5000" indicator indicator-mode="dot"
+              height="200" radius="0"></uv-swiper>
           </template>
 
           <template #classModel>
             <view class="classModel">
-              <image
-                src="@/static/home/benner-iconBom.png"
-                class="benner-iconBom"
-                mode=""
-              ></image>
-              <image
-                src="@/static/home/benner-icontop.png"
-                class="benner-icontop"
-                mode=""
-              ></image>
-              <view
-                class="benner-box benner-left-box"
-                @click="goPage('/pages/my/job')"
-              >
+              <image src="@/static/home/benner-iconBom.png" class="benner-iconBom" mode=""></image>
+              <image src="@/static/home/benner-icontop.png" class="benner-icontop" mode=""></image>
+              <view class="benner-box benner-left-box" @click="goPage('/pages/my/job')">
                 <view class="text1"> 获取奖励 </view>
                 <view class="btn"> 立即前往 </view>
               </view>
@@ -118,31 +87,14 @@
                   <view class="text"> 社交 </view>
                 </view>
               </view>
-              <!-- 	<view class="classModel-bg classModel-bg1" ref="classModel1"
-								@click="goPage('/pages/my/job')">
-								<image class="classModel-img" src="@/static/zhHans-text-icon/text-2.png" mode="">
-								</image>
-							</view>
-							<view class="classModel-bg classModel-bg2" ref="classModel2">
-								<image class="classModel-img" src="@/static/zhHans-text-icon/text-3.png" mode="">
-								</image>
-							</view>
-							<view class="classModel-bg" ref="classModel3">
-								<image class="classModel-img" src="@/static/zhHans-text-icon/text-4.png" mode="">
-								</image>
-							</view> -->
             </view>
           </template>
         </sortble>
       </z-paging-cell>
       <z-paging-cell style="background: #fff">
         <view class="tab-nav">
-          <view
-            v-for="(tab, index) in tabs"
-            :key="index"
-            :class="['tab-item', currentTab === index ? 'active' : '']"
-            @click="switchTab(index)"
-          >
+          <view v-for="(tab, index) in tabs" :key="index" :class="['tab-item', currentTab === index ? 'active' : '']"
+            @click="switchTab(index)">
             {{ tab }}
             <view class="indicator-triangle"> </view>
           </view>
@@ -154,12 +106,8 @@
           <block v-if="followList.length > 0">
             <w-waterfall :data="followList">
               <template v-slot:content="{ item, width }">
-                <card
-                  :item="formatItem(item)"
-                  :width="width"
-                  :custom-style="{ background: '#fff' }"
-                  textColor="#000"
-                ></card>
+                <card :item="formatItem(item)" :width="width" :custom-style="{ background: '#fff' }" textColor="#000">
+                </card>
               </template>
             </w-waterfall>
           </block>
@@ -170,27 +118,17 @@
 
         <!-- 推荐列表 - 瀑布流样式 -->
         <template>
-          <w-waterfall
-            v-show="currentTab === 1 && recommendList.length > 0"
-            :data="recommendList"
-          >
+          <w-waterfall v-show="currentTab === 1 && recommendList.length > 0" :data="recommendList">
             <template v-slot:content="{ item, width }">
-              <card
-                :item="formatItem(item)"
-                :width="width"
-                :custom-style="{ background: '#fff' }"
-                textColor="#000"
-              ></card>
+              <card :item="formatItem(item)" :width="width" :custom-style="{ background: '#fff' }" textColor="#000">
+              </card>
             </template>
           </w-waterfall>
-          <view
-            class="no-data"
-            v-if="
-              currentTab === 1 &&
-              recommendList.length === 0 &&
-              !isLoadingRecommend
-            "
-          >
+          <view class="no-data" v-if="
+            currentTab === 1 &&
+            recommendList.length === 0 &&
+            !isLoadingRecommend
+          ">
             <text>暂无推荐数据</text>
           </view>
         </template>
@@ -199,48 +137,20 @@
         <template>
           <view v-if="currentTab === 2" class="hot-topics">
             <view class="hot-topics-header">
-              <!-- <text class="hot-topics-title">热搜资讯!</text> -->
-              <image
-                class="hot-topics-title"
-                src="@/static/home/hot-topics-title.png"
-                mode=""
-              ></image>
+              <image class="hot-topics-title" src="@/static/home/hot-topics-title.png" mode=""></image>
             </view>
-            <swiper
-              class="hot-topics-swiper"
-              :current="currentTopicPage"
-              @change="handleTopicPageChange"
-            >
-              <swiper-item
-                v-for="(page, pageIndex) in topicPages"
-                :key="pageIndex"
-              >
+            <swiper class="hot-topics-swiper" :current="currentTopicPage" @change="handleTopicPageChange">
+              <swiper-item v-for="(page, pageIndex) in topicPages" :key="pageIndex">
                 <view class="hot-topics-list">
-                  <view
-                    v-for="(topic, index) in page"
-                    :key="index"
-                    class="topic-item"
-                    @click="goToArticleDetail(topic.id)"
-                  >
+                  <view v-for="(topic, index) in page" :key="index" class="topic-item"
+                    @click="goToArticleDetail(topic.id)">
                     <view class="hot-topics-left">
-                      <image
-                        v-if="pageIndex * 4 + index == 0"
-                        src="@/static/icon/icon-first.png"
-                        class="topic-index topic-index-img"
-                        mode=""
-                      ></image>
-                      <image
-                        v-else-if="pageIndex * 4 + index == 1"
-                        src="@/static/icon/icon-second.png"
-                        class="topic-index topic-index-img"
-                        mode=""
-                      ></image>
-                      <image
-                        v-else-if="pageIndex * 4 + index == 2"
-                        src="@/static/icon/icon-third.png"
-                        class="topic-index topic-index-img"
-                        mode=""
-                      ></image>
+                      <image v-if="pageIndex * 4 + index == 0" src="@/static/icon/icon-first.png"
+                        class="topic-index topic-index-img" mode=""></image>
+                      <image v-else-if="pageIndex * 4 + index == 1" src="@/static/icon/icon-second.png"
+                        class="topic-index topic-index-img" mode=""></image>
+                      <image v-else-if="pageIndex * 4 + index == 2" src="@/static/icon/icon-third.png"
+                        class="topic-index topic-index-img" mode=""></image>
                       <text v-else class="topic-index">{{
                         pageIndex * 4 + index + 1
                       }}</text>
@@ -248,57 +158,32 @@
                       <view class="topic-content toe">
                         {{ topic.title }}
                       </view>
-                      <image
-                        v-if="topic.isHot"
-                        src="@/static/icon/icon-hot.png"
-                        class="hot-tag"
-                        mode=""
-                      ></image>
+                      <image v-if="topic.isHot" src="@/static/icon/icon-hot.png" class="hot-tag" mode=""></image>
                     </view>
-                    <text class="topic-participants"
-                      >{{ topic.num_like }}人正在热议</text
-                    >
+                    <text class="topic-participants">{{ topic.num_like }}人正在热议</text>
                   </view>
                 </view>
               </swiper-item>
             </swiper>
             <view class="indicator-dots">
-              <view
-                v-for="i in 2"
-                :key="i"
-                :class="['dot', currentTopicPage === i - 1 ? 'active' : '']"
-              >
+              <view v-for="i in 2" :key="i" :class="['dot', currentTopicPage === i - 1 ? 'active' : '']">
               </view>
             </view>
           </view>
-          <view
-            v-show="currentTab === 2 && newsList.length > 0"
-            class="news-list"
-          >
-            <w-waterfall
-              v-show="currentTab === 2 && newsList.length > 0"
-              :data="newsList"
-            >
+          <view v-show="currentTab === 2 && newsList.length > 0" class="news-list">
+            <w-waterfall v-show="currentTab === 2 && newsList.length > 0" :data="newsList">
               <template v-slot:content="{ item, width }">
-                <card
-                  :item="formatItem(item)"
-                  :width="width"
-                  goLink="/pages/index/articleDetail?id="
-                  :custom-style="{ background: '#fff' }"
-                  textColor="#000"
-                ></card>
+                <card :item="formatItem(item)" :width="width" goLink="/pages/index/articleDetail?id="
+                  :custom-style="{ background: '#fff' }" textColor="#000"></card>
               </template>
             </w-waterfall>
           </view>
 
-          <view
-            class="no-data"
-            v-if="currentTab === 2 && newsList.length === 0 && !isLoadingNews"
-          >
+          <view class="no-data" v-if="currentTab === 2 && newsList.length === 0 && !isLoadingNews">
             <text>暂无新闻数据</text>
           </view>
         </template>
-		
+
       </z-paging-cell>
       <view class="blankHeight"></view>
     </z-paging>
@@ -310,16 +195,8 @@
     </view>
 
     <!-- <novice-guidance :step="step"></novice-guidance> -->
-    <lhSelectCity
-      style="height: 100vh"
-      class="lhSelectCity"
-      :currentCity="currentCity"
-      :windowHeight="windowHeight"
-      :hotCitys="hotCitys"
-      @onSelect="City"
-      v-if="lhSelectCityFalg"
-      @closeLhSelectCityFun="closeLhSelectCityFun()"
-    />
+    <lhSelectCity style="height: 100vh" class="lhSelectCity" :currentCity="currentCity" :windowHeight="windowHeight"
+      :hotCitys="hotCitys" @onSelect="City" v-if="lhSelectCityFalg" @closeLhSelectCityFun="closeLhSelectCityFun()" />
   </view>
 </template>
 
@@ -516,9 +393,27 @@ export default {
       this.currentTab = 1;
     }
   },
-  // 上拉加载更多
+  // 修改触底加载方法
   onReachBottom() {
-    this.loadMoreData();
+    console.log('触底加载更多');
+    // 根据当前标签页加载更多数据
+    switch (this.currentTab) {
+      case 0:
+        if (this.hasMoreFollow && !this.isLoadingFollow) {
+          this.loadFollowList();
+        }
+        break;
+      case 1:
+        if (this.hasMoreRecommend && !this.isLoadingRecommend) {
+          this.loadRecommendList();
+        }
+        break;
+      case 2:
+        if (this.hasMoreNews && !this.isLoadingNews) {
+          this.loadNewsList();
+        }
+        break;
+    }
   },
 
   // 下拉刷新数据
@@ -542,8 +437,8 @@ export default {
             this.weather = res.data;
           }
         },
-        complete: () => {},
-        fail: (e) => {},
+        complete: () => { },
+        fail: (e) => { },
       });
     },
     lhSelectCityFun() {
@@ -590,49 +485,60 @@ export default {
     },
 
     switchTab(index) {
+      if (this.currentTab === index) return;
       this.currentTab = index;
 
-      // Check if the target tab's list is already populated
-      if (this.currentList.length > 0) {
-        // If the list is already populated, do not fetch data again
-        return;
+      // 重置当前标签页的数据
+      switch (index) {
+        case 0:
+          this.followList = [];
+          this.followOffset = 0;
+          this.hasMoreFollow = true;
+          break;
+        case 1:
+          this.recommendList = [];
+          this.recommendOffset = 0;
+          this.hasMoreRecommend = true;
+          break;
+        case 2:
+          this.newsList = [];
+          this.hotTopics = [];
+          this.newsOffset = 0;
+          this.hasMoreNews = true;
+          break;
       }
 
-      // If the list is not populated, load the corresponding data
+      // 加载新标签页的数据
       this.loadTabData(index);
     },
     loadTabData(index) {
       switch (index) {
         case 0:
-          if (!this.followList.length) {
-            this.loadFollowList();
-          }
+          this.loadFollowList();
           break;
         case 1:
-          if (!this.recommendList.length) {
-            this.loadRecommendList();
-          }
+          this.loadRecommendList();
           break;
         case 2:
-          if (!this.hotNewsList.length) {
-            this.loadHotNews();
-          }
-          if (!this.newsList.length) {
-            this.loadNewsList();
-          }
+          this.loadHotNews();
+          this.loadNewsList();
           break;
       }
     },
+    // 修改关注列表加载方法
     loadFollowList() {
       if (this.isLoadingFollow) return;
       this.isLoadingFollow = true;
 
+      // 保存当前列表数据
+      const currentList = [...this.followList];
+
       uni.request({
         url: this.$apiHost + "/Work/getlist",
         data: {
           uuid: getApp().globalData.uuid,
           skey: getApp().globalData.skey,
-          type: "attention", // 关注列表
+          type: "attention",
           offset: this.followOffset,
         },
         header: {
@@ -641,28 +547,26 @@ export default {
         },
         success: (res) => {
           console.log("关注列表数据:", res.data);
-          // 确保在任何情况下都完成加载
-          if (
-            res.data.success == "yes" &&
-            res.data.list &&
-            res.data.list.length > 0
-          ) {
-            // 只有当列表有数据时才追加
-            this.followList = [...this.followList, ...res.data.list];
-            this.followOffset += res.data.list.length;
-
-            if (res.data.list.length < 20) {
-              this.hasMoreFollow = false;
+          if (res.data.success == "yes" && res.data.list && res.data.list.length > 0) {
+            // 使用 Vue.set 确保响应式更新
+            if (this.followOffset === 0) {
+              this.followList = res.data.list;
+            } else {
+              // 使用 Vue.set 更新数组,避免数据闪烁
+              this.followList = currentList.concat(res.data.list);
             }
+            this.followOffset += res.data.list.length;
+            this.hasMoreFollow = res.data.list.length >= 20;
           } else {
-            // 如果列表为空,确保标记没有更多数据
             this.hasMoreFollow = false;
           }
 
-          // 无论是否有数据,都需要通知z-paging组件完成刷新
-          if (this.$refs.paging) {
-            this.$refs.paging.complete(this.followList);
-          }
+          // 使用 nextTick 确保数据更新后再通知组件
+          this.$nextTick(() => {
+            if (this.$refs.paging) {
+              this.$refs.paging.complete(this.followList);
+            }
+          });
         },
         complete: () => {
           this.isLoadingFollow = false;
@@ -670,23 +574,26 @@ export default {
         fail: (e) => {
           console.log("请求关注列表失败:", e);
           this.isLoadingFollow = false;
-          // 加载失败时也要通知组件完成
           if (this.$refs.paging) {
             this.$refs.paging.complete(false);
           }
         },
       });
     },
+    // 修改推荐列表加载方法
     loadRecommendList() {
       if (this.isLoadingRecommend) return;
       this.isLoadingRecommend = true;
 
+      // 保存当前列表数据
+      const currentList = [...this.recommendList];
+
       uni.request({
         url: this.$apiHost + "/Work/getlist",
         data: {
           uuid: getApp().globalData.uuid,
           skey: getApp().globalData.skey,
-          type: "recommend", // 推荐列表
+          type: "recommend",
           offset: this.recommendOffset,
         },
         header: {
@@ -695,25 +602,23 @@ export default {
         },
         success: (res) => {
           console.log("推荐列表数据:", res.data);
-          if (
-            res.data.success == "yes" &&
-            res.data.list &&
-            res.data.list.length > 0
-          ) {
-            this.recommendList = [...this.recommendList, ...res.data.list];
-            this.recommendOffset += res.data.list.length;
-
-            if (res.data.list.length < 20) {
-              this.hasMoreRecommend = false;
+          if (res.data.success == "yes" && res.data.list && res.data.list.length > 0) {
+            if (this.recommendOffset === 0) {
+              this.recommendList = res.data.list;
+            } else {
+              this.recommendList = currentList.concat(res.data.list);
             }
+            this.recommendOffset += res.data.list.length;
+            this.hasMoreRecommend = res.data.list.length >= 20;
           } else {
             this.hasMoreRecommend = false;
           }
 
-          // 无论是否有数据,都需要通知z-paging组件完成刷新
-          if (this.$refs.paging) {
-            this.$refs.paging.complete(this.recommendList);
-          }
+          this.$nextTick(() => {
+            if (this.$refs.paging) {
+              this.$refs.paging.complete(this.recommendList);
+            }
+          });
         },
         complete: () => {
           this.isLoadingRecommend = false;
@@ -721,7 +626,6 @@ export default {
         fail: (e) => {
           console.log("请求推荐列表失败:", e);
           this.isLoadingRecommend = false;
-          // 加载失败时也要通知组件完成
           if (this.$refs.paging) {
             this.$refs.paging.complete(false);
           }
@@ -737,7 +641,7 @@ export default {
         data: {
           uuid: getApp().globalData.uuid,
           skey: getApp().globalData.skey,
-          type: "hot", // 热点新闻
+          type: "hot",
         },
         header: {
           "content-type": "application/json",
@@ -745,25 +649,14 @@ export default {
         },
         success: (res) => {
           console.log("热点新闻数据:", res.data);
-          if (
-            res.data.success == "yes" &&
-            res.data.list &&
-            res.data.list.length > 0
-          ) {
+          if (res.data.success == "yes" && res.data.list && res.data.list.length > 0) {
             this.hotNewsList = res.data.list;
-
-            // 如果有热点新闻数据,更新热搜资讯
-            if (this.hotNewsList.length > 0) {
-              // 将API返回的热点新闻转换为热搜资讯格式
-              this.hotTopics = this.hotNewsList.map((item, index) => {
-                return {
-                  id: item.id,
-                  title: item.title || "热门话题",
-                  num_like: item.num_like || 0,
-                  isHot: index % 2 === 0, // 偶数索引的设为热点
-                };
-              });
-            }
+            this.hotTopics = this.hotNewsList.map((item, index) => ({
+              id: item.id,
+              title: item.title || "热门话题",
+              num_like: item.num_like || 0,
+              isHot: index % 2 === 0,
+            }));
           }
         },
         complete: () => {
@@ -775,117 +668,57 @@ export default {
         },
       });
     },
+    // 修改新闻列表加载方法
     loadNewsList() {
       if (this.isLoadingNews) return;
       this.isLoadingNews = true;
-      // uni.request({
-      // 	url: this.$apiHost + "/Article/getlist",
-      // 	data: {
-      // 		uuid: getApp().globalData.uuid,
-      // 		skey: getApp().globalData.skey,
-      // 		type: "list", // 新闻列表
-      // 		offset: this.newsOffset,
-      // 	},
-      // 	header: {
-      // 		"content-type": "application/json",
-      // 		sign: getApp().globalData.headerSign,
-      // 	},
-      // 	success: (res) => {
-      // 		console.log("新闻列表数据:", res.data);
-      // 		if (
-      // 			res.data.success == "yes" &&
-      // 			res.data.list &&
-      // 			res.data.list.length > 0
-      // 		) {
-      // 			this.newsList = [...this.newsList, ...res.data.list];
-      // 			this.newsOffset += res.data.list.length;
 
-      // 			if (res.data.list.length < 20) {
-      // 				this.hasMoreNews = false;
-      // 			}
-      // 		} else {
-      // 			this.hasMoreNews = false;
-      // 		}
+      // 保存当前列表数据
+      const currentList = [...this.newsList];
 
-      // 		// 无论是否有数据,都需要通知z-paging组件完成刷新
-      // 		if (this.$refs.paging) {
-      // 			this.$refs.paging.complete(this.newsList);
-      // 		}
-      // 	},
-      // 	complete: () => {
-      // 		this.isLoadingNews = false;
-      // 	},
-      // 	fail: (e) => {
-      // 		console.log("请求新闻列表失败:", e);
-      // 		this.isLoadingNews = false;
-      // 		// 加载失败时也要通知组件完成
-      // 		if (this.$refs.paging) {
-      // 			this.$refs.paging.complete(false);
-      // 		}
-      // 	},
-      // });
-      this.$http
-        .get("/Article/getlist", {
+      uni.request({
+        url: this.$apiHost + "/Article/getlist",
+        data: {
           uuid: getApp().globalData.uuid,
           skey: getApp().globalData.skey,
-          type: "list", // 新闻列表
+          type: "list",
           offset: this.newsOffset,
-        })
-        .then(async (res) => {
-          await res;
-          console.log("新闻列表数据:", res);
-          if (
-            res.data.success == "yes" &&
-            res.data.list &&
-            res.data.list.length > 0
-          ) {
-            this.newsList = [...this.newsList, ...res.data.list];
-            this.newsOffset += res.data.list.length;
-
-            if (res.data.list.length < 20) {
-              this.hasMoreNews = false;
+        },
+        header: {
+          "content-type": "application/json",
+          sign: getApp().globalData.headerSign,
+        },
+        success: (res) => {
+          console.log("新闻列表数据:", res.data);
+          if (res.data.success == "yes" && res.data.list && res.data.list.length > 0) {
+            if (this.newsOffset === 0) {
+              this.newsList = res.data.list;
+            } else {
+              this.newsList = currentList.concat(res.data.list);
             }
+            this.newsOffset += res.data.list.length;
+            this.hasMoreNews = res.data.list.length >= 20;
           } else {
             this.hasMoreNews = false;
           }
 
-          // 无论是否有数据,都需要通知z-paging组件完成刷新
-          if (this.$refs.paging) {
-            this.$refs.paging.complete(this.newsList);
-          }
-        })
-        .catch(async (e) => {
-          await e;
+          this.$nextTick(() => {
+            if (this.$refs.paging) {
+              this.$refs.paging.complete(this.newsList);
+            }
+          });
+        },
+        complete: () => {
+          this.isLoadingNews = false;
+        },
+        fail: (e) => {
           console.log("请求新闻列表失败:", e);
           this.isLoadingNews = false;
-          // 加载失败时也要通知组件完成
           if (this.$refs.paging) {
             this.$refs.paging.complete(false);
           }
-        })
-        .finally(() => {
-          this.isLoadingNews = false;
-        });
-    },
-    loadMoreData() {
-      // 根据当前标签加载更多数据
-      switch (this.currentTab) {
-        case 0:
-          if (this.hasMoreFollow && !this.isLoadingFollow) {
-            this.loadFollowList();
-          }
-          break;
-        case 1:
-          if (this.hasMoreRecommend && !this.isLoadingRecommend) {
-            this.loadRecommendList();
-          }
-          break;
-        case 2:
-          if (this.hasMoreNews && !this.isLoadingNews) {
-            this.loadNewsList();
-          }
-          break;
-      }
+        },
+      });
     },
     handleTopicPageChange(e) {
       this.currentTopicPage = e.detail.current;
@@ -894,13 +727,7 @@ export default {
     formatItem(item) {
       console.log("item:", item);
 
-      this.downloadAndProcessImage(item.images)
-        .then((color) => {
-          console.log(`平均颜色: R=${color.r}, G=${color.g}, B=${color.b}`);
-        })
-        .catch((error) => {
-          console.error("获取图像失败:", error);
-        });
+
       let img = "";
       if (item.images) {
         img = item.images.split("|")[0];
@@ -1013,12 +840,59 @@ export default {
         });
       });
     },
+    // 修改下拉刷新方法
+    onRefresh() {
+      console.log('下拉刷新开始');
+      // 重置所有数据
+      this.followList = [];
+      this.recommendList = [];
+      this.newsList = [];
+      this.hotTopics = [];
+
+      // 重置偏移量
+      this.followOffset = 0;
+      this.recommendOffset = 0;
+      this.newsOffset = 0;
+
+      // 重置加载状态
+      this.hasMoreFollow = true;
+      this.hasMoreRecommend = true;
+      this.hasMoreNews = true;
+
+      // 根据当前标签页加载数据
+      this.loadTabData(this.currentTab);
+    },
+
+    // 下拉刷新恢复
+    onRefresherRestore() {
+      console.log('下拉刷新恢复');
+    },
   },
 };
 </script>
 
 <style lang="scss">
 @import "index.scss";
+
+// 添加过渡效果样式
+.fade-enter-active,
+.fade-leave-active {
+  transition: opacity 0.3s;
+}
+
+.fade-enter,
+.fade-leave-to {
+  opacity: 0;
+}
+
+// 确保列表项有最小高度,避免闪烁
+.list-item {
+  min-height: 200rpx;
+  background: #fff;
+  margin-bottom: 20rpx;
+  border-radius: 12rpx;
+  overflow: hidden;
+}
 </style>
 <style>
 @import "@/style/qweather-icons.css";

+ 5 - 1
pages/isLand/TaskDialog.vue

@@ -55,6 +55,10 @@ export default {
     visible: {
       type: Boolean,
       default: false
+    },
+    type: {
+      type: String,
+      default: 'main'
     }
   },
   data() {
@@ -85,7 +89,7 @@ export default {
           method: 'GET',
           data: {
             uuid: getApp().globalData.uuid,
-            type: 'main'
+            type: this.type
           },
           header: {
             'Content-Type': 'application/x-www-form-urlencoded',

+ 1 - 1
pages/isLand/homeLand.vue

@@ -60,7 +60,7 @@
     <backpack-dialog :visible.sync="inventoryVisible" @close="onInventoryClose"></backpack-dialog>
     <character-dialog :visible.sync="characterVisible" @close="onCharacterClose"></character-dialog>
     <shop-dialog :visible.sync="shopVisible" @close="onShopClose" @buy="onShopBuy"></shop-dialog>
-    <task-dialog class="task-dialog" :visible.sync="taskVisible" @close="onTaskClose"></task-dialog>
+    <task-dialog class="task-dialog" :visible.sync="taskVisible" @close="onTaskClose" type="main"></task-dialog>
     
     <!-- 引导对话组件 -->
     <talk-guide 

+ 1 - 1
pages/isLand/mainLand.vue

@@ -99,7 +99,7 @@
     <character-dialog :visible.sync="characterVisible" @close="onCharacterClose"></character-dialog>
     <shop-dialog :visible.sync="shopVisible" :shopName="currentShopName" @close="onShopClose" @buy="onShopBuy"></shop-dialog>
     <hua-tian :visible.sync="huaTianVisible" @close="onHuaTianClose" ref="huaTian"></hua-tian>
-    <task-dialog :visible.sync="taskDialogVisible" @close="onTaskDialogClose"></task-dialog>
+    <task-dialog :visible.sync="taskDialogVisible" @close="onTaskDialogClose" type="huatian"></task-dialog>
 
     <!-- 引导管理器 -->
     <guide-manager ref="guideManager"></guide-manager>

+ 2 - 2
pages/login/login - copy.vue

@@ -88,8 +88,8 @@ export default {
 			is_agree: 0,
 			type: 'pass',
 			myinfo: {
-				nickname: '王思思',
-				join_name: '注册日期:2024年5月',
+				nickname: '',
+				join_name: '',
 				num_1: 0,
 				num_2: 0,
 				num_3: 0,

+ 5 - 5
pages/login/login.vue

@@ -44,7 +44,7 @@
 						<view class="btn" v-if="captchaTime === 0" @click="getCode">获取验证码</view>
 						<view class="btn" v-if="captchaTime > 0">{{ captchaTime }}秒后重试</view>
 					</view>
-					<view class="other_list">
+					<view class="other_list" v-if="false">
 						<text class="left"></text>
 						<text class="right" @click="type = 'pass'" style="color: blue;">密码登录</text>
 					</view>
@@ -90,8 +90,8 @@ export default {
 			is_agree: 0,
 			type: 'mobile',
 			myinfo: {
-				nickname: '王思思',
-				join_name: '注册日期:2024年5月',
+				nickname: '',
+				join_name: '',
 				num_1: 0,
 				num_2: 0,
 				num_3: 0,
@@ -100,8 +100,8 @@ export default {
 				num_history: 0,
 				num_collection: 0
 			},
-			mobile: '18899990000',
-			password: '111111',
+			mobile: '',
+			password: '',
 			code: '123601',
 			captchaTime: 0,
 			push_token: '',

+ 1 - 2
pages/make/index.vue

@@ -15,8 +15,7 @@
 				</view>
 			</view>
 		</view>
-
-
+ 
 		<!-- 功能卡片区域 -->
 		<view class="card-grid">
 			<!-- AI创角卡片 -->

+ 1 - 1
pages/makedetail/makeImgDetail.vue

@@ -149,7 +149,7 @@ export default {
 			environment: '',
 			image: '',
 			selectedStyle: -1,
-			actionTags: ['跳舞', '开枪', '喝咖啡', '看书', '运动'],
+			actionTags: ['跳舞', '唱歌', '喝咖啡', '看书', '运动'],
 			environmentTags: ['都市大道', '大树底下', '办公室', '厨房'],
 			imageTags: ['戴着墨镜', '戴着耳机', '戴着帽子', '手持冲浪板'],
 			styleList: [{

+ 6 - 0
pages/message/mailMessage.scss

@@ -282,6 +282,12 @@ page {
   margin-bottom: 20rpx;
 }
 .noData {
+	    display: flex;
+	    flex-direction: column;
+	    align-items: center;
+		.tips-title{
+			padding: 50rpx 0;
+		}
   > view {
     display: flex;
     flex-direction: column;

+ 506 - 382
pages/my/editInfo.vue

@@ -5,6 +5,7 @@
 				基本资料
 			</template>
 		</PageHeader>
+		<view class="reserveASeat"></view>
 		<!-- <view  style="height: 90rpx;"></view> -->
 		<view class="list_info">
 			<view class="bcenter">
@@ -81,7 +82,7 @@
 
 		<view class="popSel" v-if="showPop" @tap.stop="onPreview">
 			<PageHeader title="添加标签" @back="showPop = false" :isBack="false" style="background: #f2f6f2;" />
-			<view style="height: 90rpx;"></view>
+			<view class="reserveASeat"></view>
 			<view class="headLabel">
 				<view class="avator-box">
 					<CircleAvatar class="avator" :src="avator"></CircleAvatar>
@@ -97,10 +98,30 @@
 			<view class="list_info">
 				<view class="name">你的兴趣爱好是?</view>
 				<view class="desc">提示:最多选择5个兴趣爱好标签</view>
-				<view class="item_tag">
-					<view @tap.stop="chkTag(item)" class="tag" :class="selTags(item) ? 'active' : ''"
-						v-for="(item, index) in list_tag" :key="index">
-						{{ item }}
+				<view style="height: 700rpx; overflow-y: scroll; margin-top: 20rpx; padding-bottom: 100rpx;">
+					<view class="add-tag-box" style="color: #000;" v-if="showAddTag">
+						<input 
+							class="add-tag-input" 
+							v-model="newTag" 
+							placeholder="请输入标签名称" 
+							maxlength="10"
+							@confirm="addCustomTag"
+						/>
+						<view class="add-tag-btns">
+							<text class="cancel-btn" @tap="cancelAddTag">取消</text>
+							<text class="confirm-btn" @tap="addCustomTag">确定</text>
+						</view>
+					</view>
+					
+					<view class="item_tag">
+						<view class="tag add-tag" @tap="showAddTagInput">
+							<text>+ 自定义</text>
+						</view>
+						
+						<view @tap.stop="chkTag(item)" class="tag" :class="selTags(item) ? 'active' : ''"
+							v-for="(item, index) in list_tag" :key="index">
+							{{ item }}
+						</view>
 					</view>
 				</view>
 			</view>
@@ -141,440 +162,543 @@
 </template>
 
 <script>
-import {
-	requestAndroidPermission,
-	gotoAppPermissionSetting
-} from '../index/permission.js'
-import PageHeader from '@/components/PageHeader/PageHeader.vue';
-import CircleAvatar from '@/components/CircleAvatar/CircleAvatar.vue';
-import NicknamePopup from '@/components/NicknamePopup/NicknamePopup.vue';
-export default {
-	components: { PageHeader, CircleAvatar, NicknamePopup },
-	data() {
-		return {
-			showRights: false,
-			title: '',
-			sel: 1,
-			info: {},
-			showPop: false,
-			nickname: '',
-			content: '',
-			sex: 1,
-			age: 18,
-			height: 160,
-			weight: 50,
-			avator: '../../static/me/avator.png',
-			ziye: '',
-			qianmin: '',
-
-			xinzuo_sel: '',
-			xinzuo: ['水瓶座', '双鱼座', '白羊座', '金牛座', '双子座', '巨蟹座', '狮子座', '处女座', '天秤座', '天蝎座', '射手座', '摩羯座'],
-
-			list_tag: [],
-			sel_tags: [],
-			sexText: '',
-			birthday: '',
-			sexOptions: ['男', '女', '其他'],
-			endDate: new Date().toISOString().split('T')[0]
-		}
-	},
-	onLoad() {
-		let tagStr =
-			"老二次元了、coser、沉迷音乐、网游小达人、AJ控、白日梦想家、撸铁狂魔、古风汉服、爱画画、数码极客、盲盒玩家、三坑玩家、动漫达人、独立设计师、爱卡通、兜风去、爱夜跑、街头滑板、球类运动、lo娘、rapper、时尚达人、机甲狂潮、养宠物、风轻云淡、养多肉、热爱自然、赛博朋克、骨子里高冷、爱唠嗑、资深中二、天然呆、思想家、极度抽象、学院派、平平无奇、热情奔放、博古通今、labubu粉、玛特收藏家";
-		this.list_tag = tagStr.split("、");
-		this.getInfoData();
-	},
-	onShow() { },
-	methods: {
-		openNicknamePopUpWindow() {
-			this.$refs.openNicknamePopUpWindow.open();
+	import {
+		requestAndroidPermission,
+		gotoAppPermissionSetting
+	} from '../index/permission.js'
+	import PageHeader from '@/components/PageHeader/PageHeader.vue';
+	import CircleAvatar from '@/components/CircleAvatar/CircleAvatar.vue';
+	import NicknamePopup from '@/components/NicknamePopup/NicknamePopup.vue';
+	export default {
+		components: {
+			PageHeader,
+			CircleAvatar,
+			NicknamePopup
 		},
-		openContentPopUpWindow() {
-			this.$refs.openContentPopUpWindow.open();
-		},
-		closePropUp() {
-			this.$refs.openNicknamePopUpWindow.close();
-			this.$refs.openContentPopUpWindow.close();
-		},
-		onBack() { },
-		onPreview() { },
-		chkSel() {
-			if (this.sel == 1) {
-				this.sel = 0;
-			} else {
-				this.sel = 1;
+		data() {
+			return {
+				showRights: false,
+				title: '',
+				sel: 1,
+				info: {},
+				showPop: false,
+				nickname: '',
+				content: '',
+				sex: 1,
+				age: 18,
+				height: 160,
+				weight: 50,
+				avator: '../../static/me/avator.png',
+				ziye: '',
+				qianmin: '',
+
+				xinzuo_sel: '',
+				xinzuo: ['水瓶座', '双鱼座', '白羊座', '金牛座', '双子座', '巨蟹座', '狮子座', '处女座', '天秤座', '天蝎座', '射手座', '摩羯座'],
+
+				list_tag: [],
+				sel_tags: [],
+				sexText: '',
+				birthday: '',
+				sexOptions: ['男', '女', '其他'],
+				endDate: new Date().toISOString().split('T')[0],
+				showAddTag: false,
+				newTag: '',
 			}
 		},
-		chkSex(sex) {
-			this.sex = sex;
+		onLoad() {
+			let tagStr =
+				"老二次元了、coser、沉迷音乐、网游小达人、AJ控、白日梦想家、撸铁狂魔、古风汉服、爱画画、数码极客、盲盒玩家、三坑玩家、动漫达人、独立设计师、爱卡通、兜风去、爱夜跑、街头滑板、球类运动、lo娘、rapper、时尚达人、机甲狂潮、养宠物、风轻云淡、养多肉、热爱自然、赛博朋克、骨子里高冷、爱唠嗑、资深中二、天然呆、思想家、极度抽象、学院派、平平无奇、热情奔放、博古通今、labubu粉、玛特收藏家";
+			this.list_tag = tagStr.split("、");
+			this.getInfoData();
 		},
-		delTag(tg) {
-			let list_tag2 = [];
-			for (let i = 0; i < this.sel_tags.length; i++) {
-				if (this.sel_tags[i] != tg) {
-					list_tag2.push(this.sel_tags[i]);
+		onShow() {},
+		methods: {
+			openNicknamePopUpWindow() {
+				this.$refs.openNicknamePopUpWindow.open();
+			},
+			openContentPopUpWindow() {
+				this.$refs.openContentPopUpWindow.open();
+			},
+			closePropUp() {
+				this.$refs.openNicknamePopUpWindow.close();
+				this.$refs.openContentPopUpWindow.close();
+			},
+			onBack() {},
+			onPreview() {},
+			chkSel() {
+				if (this.sel == 1) {
+					this.sel = 0;
+				} else {
+					this.sel = 1;
 				}
-			}
-			this.sel_tags = list_tag2;
-		},
-		selTags(itm) {
-			let that = this;
-			let isIn = false;
-			for (let entry of this.sel_tags) {
-				if (entry == itm) {
-					isIn = true;
-					break;
+			},
+			chkSex(sex) {
+				this.sex = sex;
+			},
+			delTag(tg) {
+				let list_tag2 = [];
+				for (let i = 0; i < this.sel_tags.length; i++) {
+					if (this.sel_tags[i] != tg) {
+						list_tag2.push(this.sel_tags[i]);
+					}
 				}
-			}
-			return isIn;
-		},
-		chkTag(itm) {
-			if (this.selTags(itm)) {
-				let tmpTags = [];
+				this.sel_tags = list_tag2;
+			},
+			selTags(itm) {
+				let isIn = false;
 				for (let entry of this.sel_tags) {
-					if (entry != itm) {
-						tmpTags.push(entry);
+					if (entry == itm) {
+						isIn = true;
+						break;
 					}
 				}
-				this.sel_tags = tmpTags;
-			} else { 
-				if (this.sel_tags.length <= 4) {
-					this.sel_tags.push(itm);
-				} else { 
-					uni.showToast({
-						title: "最多选择5个标签",
-						icon: "none"
-					});
-				}
-			}
-		},
-		sliderChange1(e) {
-			this.age = e.detail.value;
-		},
-		sliderChange2(e) {
-			this.height = e.detail.value;
-		},
-		sliderChange3(e) {
-			this.weight = e.detail.value;
-		},
-		SetSex() {
-			let that = this;
-			uni.showActionSheet({
-				itemColor: '#000000',
-				itemList: this.sexOptions,
-				success: function (res) {
-					that.sexText = that.sexOptions[res.tapIndex];
-					that.sex = res.tapIndex + 1;
-				},
-				fail: function (res) {
-					console.log(res.errMsg);
-				}
-			});
-		},
-		getInfoData() {
-			uni.request({
-				url: this.$apiHost + '/Member/getinfoData',
-				data: {
-					uuid: getApp().globalData.uuid
-				},
-				header: {
-					'content-type': 'application/json'
-				},
-				success: (res) => {
-					console.log(res.data);
-					this.nickname = res.data.nickname;
-					this.wechat = res.data.wechat;
-					this.sex = res.data.sex;
-					this.sexText = this.sexOptions[res.data.sex - 1] || '';
-					this.birthday = res.data.birthday;
-					this.xinzuo_sel = this.getConstellation(this.birthday);
-					if (res.data.avator != "") {
-						this.avator = res.data.avator;
+				return isIn;
+			},
+			chkTag(itm) {
+				if (this.selTags(itm)) {
+					let tmpTags = [];
+					for (let entry of this.sel_tags) {
+						if (entry != itm) {
+							tmpTags.push(entry);
+						}
 					}
-					if (res.data.aihao) {
-						this.sel_tags = res.data.aihao.split(",");
+					this.sel_tags = tmpTags;
+				} else {
+					if (this.sel_tags.length <= 4) {
+						this.sel_tags.push(itm);
+					} else {
+						uni.showToast({
+							title: "最多选择5个标签",
+							icon: "none"
+						});
 					}
 				}
-			});
-		},
-		submitData(isBack) {
-			let aihao = this.sel_tags.join(',')
-			let obj2 = {
-				uuid: getApp().globalData.uuid,
-				avator: this.avator,
-				nickname: this.nickname,
-				content: this.content,
-				sex: this.sex,
-				birthday: this.birthday,
-				xinzuo: this.xinzuo_sel,
-				ziye: this.ziye,
-				qianmin: this.qianmin,
-				aihao: aihao
-			}
-			uni.request({
-				url: this.$apiHost + '/Member/setinfoData',
-				data: obj2,
-				method: 'POST',
-				header: {
-					'Content-Type': 'application/x-www-form-urlencoded',
-					'sign': getApp().globalData.headerSign
-				},
-				dataType: 'json',
-				success: (res) => {
-					console.log("res", res.data)
-					this.$refs['ToastW3'].showToast({
-						title: res.data.str,
-						animation: 0
-					});
-					if (this.success == 'yes' && isBack == true) {
-						if (this.nickname) {
-							getApp().globalData.nickname = this.nickname
-							uni.removeStorageSync("nickname" );
-							uni.setStorageSync("nickname", this.nickname);
+			},
+			sliderChange1(e) {
+				this.age = e.detail.value;
+			},
+			sliderChange2(e) {
+				this.height = e.detail.value;
+			},
+			sliderChange3(e) {
+				this.weight = e.detail.value;
+			},
+			SetSex() {
+				let that = this;
+				uni.showActionSheet({
+					itemColor: '#000000',
+					itemList: this.sexOptions,
+					success: function(res) {
+						that.sexText = that.sexOptions[res.tapIndex];
+						that.sex = res.tapIndex + 1;
+					},
+					fail: function(res) {
+						console.log(res.errMsg);
+					}
+				});
+			},
+			getInfoData() {
+				uni.request({
+					url: this.$apiHost + '/Member/getinfoData',
+					data: {
+						uuid: getApp().globalData.uuid
+					},
+					header: {
+						'content-type': 'application/json'
+					},
+					success: (res) => {
+						console.log(res.data);
+						this.nickname = res.data.nickname;
+						this.wechat = res.data.wechat;
+						this.sex = res.data.sex;
+						this.sexText = this.sexOptions[res.data.sex - 1] || '';
+						this.birthday = res.data.birthday;
+						this.xinzuo_sel = this.getConstellation(this.birthday);
+						if (res.data.avator != "") {
+							this.avator = res.data.avator;
 						}
-						 
-						if (this.avator) {
-							getApp().globalData.avator = this.avator
-							uni.removeStorageSync("avator" );
-							uni.setStorageSync("avator", this.avator);
+						if (res.data.aihao) {
+							this.sel_tags = res.data.aihao.split(",");
 						}
-						setTimeout(function () {
-							console.log('返回');
-
-							uni.navigateBack()
-						}, 800)
-					} else {
-						this.closePropUp()
 					}
-					this.getInfoData()
+				});
+			},
+			submitData(isBack) {
+				let aihao = this.sel_tags.join(',')
+				let obj2 = {
+					uuid: getApp().globalData.uuid,
+					avator: this.avator,
+					nickname: this.nickname,
+					content: this.content,
+					sex: this.sex,
+					birthday: this.birthday,
+					xinzuo: this.xinzuo_sel,
+					ziye: this.ziye,
+					qianmin: this.qianmin,
+					aihao: aihao
 				}
-			});
-		},
-		upload() {
-			this.checkRights();
-			console.log("----upload");
-			var _self = this;
-			uni.chooseImage({
-				count: 1,
-				sizeType: ['compressed'],
-				sourceType: ['album', 'camera'],
-				success: function (res) {
-					console.log('res:', res)
-					if (res.tempFilePaths.length > 0) {
-						_self.imglocal = res.tempFilePaths[0]
-						const tempFilePaths = res.tempFilePaths[0];
-						console.log('tempFilePaths:', tempFilePaths);
-						const uploadTask = uni.uploadFile({
-							url: _self.$apiHost + '/Xweb/upload_img?skey=' + _self.skey,
-							filePath: res.tempFilePaths[0],
-							name: 'file',
-							success: function (uploadFileRes) {
-								let resdata = JSON.parse(uploadFileRes.data)
-								console.log('Success11:', uploadFileRes);
-								console.log('Success21:', resdata);
-								if (resdata.success == 'yes') {
-									_self.showRights = false;
-									_self.avator = resdata.url;
-								}
-							},
-							fail: function (uploadFileFail) {
-								console.log('Error:', uploadFileFail.data);
-							},
-							complete: () => {
-								console.log('Complete:');
-							}
+				uni.request({
+					url: this.$apiHost + '/Member/setinfoData',
+					data: obj2,
+					method: 'POST',
+					header: {
+						'Content-Type': 'application/x-www-form-urlencoded',
+						'sign': getApp().globalData.headerSign
+					},
+					dataType: 'json',
+					success: (res) => {
+						console.log("res", res.data)
+						this.$refs['ToastW3'].showToast({
+							title: res.data.str,
+							animation: 0
 						});
+						if (this.success == 'yes' && isBack == true) {
+							if (this.nickname) {
+								getApp().globalData.nickname = this.nickname
+								uni.removeStorageSync("nickname");
+								uni.setStorageSync("nickname", this.nickname);
+							}
+
+							if (this.avator) {
+								getApp().globalData.avator = this.avator
+								uni.removeStorageSync("avator");
+								uni.setStorageSync("avator", this.avator);
+							}
+							setTimeout(function() {
+								console.log('返回');
+
+								uni.navigateBack()
+							}, 800)
+						} else {
+							this.closePropUp()
+						}
+						this.getInfoData()
 					}
-				},
-				error: function (e) {
-					console.log(e);
-				}
-			});
-		},
-		checkRights() {
-			let that = this;
-			that.showRights = true;
-			requestAndroidPermission('android.permission.CAMERA')
-				.then(result => {
-					that.showRights = false;
-					if (result === 1) { } else if (result === 0) {
-						console.log('权限被拒绝');
-					} else if (result === -1) {
-						console.log('权限被永久拒绝');
+				});
+			},
+			upload() {
+				this.checkRights();
+				console.log("----upload");
+				var _self = this;
+				uni.chooseImage({
+					count: 1,
+					sizeType: ['compressed'],
+					sourceType: ['album', 'camera'],
+					success: function(res) {
+						console.log('res:', res)
+						if (res.tempFilePaths.length > 0) {
+							_self.imglocal = res.tempFilePaths[0]
+							const tempFilePaths = res.tempFilePaths[0];
+							console.log('tempFilePaths:', tempFilePaths);
+							const uploadTask = uni.uploadFile({
+								url: _self.$apiHost + '/Xweb/upload_img?skey=' + _self.skey,
+								filePath: res.tempFilePaths[0],
+								name: 'file',
+								success: function(uploadFileRes) {
+									let resdata = JSON.parse(uploadFileRes.data)
+									console.log('Success11:', uploadFileRes);
+									console.log('Success21:', resdata);
+									if (resdata.success == 'yes') {
+										_self.showRights = false;
+										_self.avator = resdata.url;
+									}
+								},
+								fail: function(uploadFileFail) {
+									console.log('Error:', uploadFileFail.data);
+								},
+								complete: () => {
+									console.log('Complete:');
+								}
+							});
+						}
+					},
+					error: function(e) {
+						console.log(e);
 					}
-				})
-				.catch(error => {
-					that.showRights = true;
-					console.log('权限申请失败:', error);
 				});
-		},
-		onBirthdayChange(e) {
-			this.birthday = e.detail.value;
-			this.xinzuo_sel = this.getConstellation(this.birthday);
-		},
-		getConstellation(birthday) {
-			if (!birthday) return '';
-
-			const month = parseInt(birthday.split('-')[1]);
-			const day = parseInt(birthday.split('-')[2]);
-
-			// 星座日期数组
-			const constellationDates = [
-				[1, 20, "水瓶座"],
-				[2, 19, "双鱼座"],
-				[3, 21, "白羊座"],
-				[4, 20, "金牛座"],
-				[5, 21, "双子座"],
-				[6, 22, "巨蟹座"],
-				[7, 23, "狮子座"],
-				[8, 23, "处女座"],
-				[9, 23, "天秤座"],
-				[10, 24, "天蝎座"],
-				[11, 23, "射手座"],
-				[12, 22, "摩羯座"]
-			];
-
-			let constellation = "";
-			if (day < constellationDates[month - 1][1]) {
-				constellation = constellationDates[month - 1][2];
-			} else {
-				constellation = constellationDates[month % 12][2];
-			}
+			},
+			checkRights() {
+				let that = this;
+				that.showRights = true;
+				requestAndroidPermission('android.permission.CAMERA')
+					.then(result => {
+						that.showRights = false;
+						if (result === 1) {} else if (result === 0) {
+							console.log('权限被拒绝');
+						} else if (result === -1) {
+							console.log('权限被永久拒绝');
+						}
+					})
+					.catch(error => {
+						that.showRights = true;
+						console.log('权限申请失败:', error);
+					});
+			},
+			onBirthdayChange(e) {
+				this.birthday = e.detail.value;
+				this.xinzuo_sel = this.getConstellation(this.birthday);
+			},
+			getConstellation(birthday) {
+				if (!birthday) return '';
+
+				const month = parseInt(birthday.split('-')[1]);
+				const day = parseInt(birthday.split('-')[2]);
+
+				// 星座日期数组
+				const constellationDates = [
+					[1, 20, "水瓶座"],
+					[2, 19, "双鱼座"],
+					[3, 21, "白羊座"],
+					[4, 20, "金牛座"],
+					[5, 21, "双子座"],
+					[6, 22, "巨蟹座"],
+					[7, 23, "狮子座"],
+					[8, 23, "处女座"],
+					[9, 23, "天秤座"],
+					[10, 24, "天蝎座"],
+					[11, 23, "射手座"],
+					[12, 22, "摩羯座"]
+				];
+
+				let constellation = "";
+				if (day < constellationDates[month - 1][1]) {
+					constellation = constellationDates[month - 1][2];
+				} else {
+					constellation = constellationDates[month % 12][2];
+				}
 
-			return constellation;
+				return constellation;
+			},
+			showAddTagInput() {
+				this.showAddTag = true;
+				this.newTag = '';
+			},
+			cancelAddTag() {
+				this.showAddTag = false;
+				this.newTag = '';
+			},
+			addCustomTag() {
+				if (!this.newTag.trim()) {
+					uni.showToast({
+						title: '请输入标签名称',
+						icon: 'none'
+					});
+					return;
+				}
+				
+				if (this.list_tag.includes(this.newTag)) {
+					uni.showToast({
+						title: '该标签已存在',
+						icon: 'none'
+					});
+					return;
+				}
+				
+				this.list_tag.unshift(this.newTag);
+				this.showAddTag = false;
+				this.newTag = '';
+			},
 		}
 	}
-}
 </script>
 
 <style scoped lang="scss">
-@import 'normal.scss';
-
-page {
-	font-family: PingFang SC-Medium;
-}
-
-.popSel {
-	position: fixed;
-	z-index: 101;
-	top: 0;
-	left: 0;
-	background-color: #f2f6f2;
-	width: 100vh;
-	min-height: 100vh; 
-	.headLabel {
-		width: 686rpx;
-		margin: 28rpx 32rpx;
-		min-height: 222rpx;
-		background: #fff;
-		box-sizing: border-box;
-		padding: 30rpx 40rpx 46rpx 20rpx;
-		border-radius: 20rpx;
+	@import 'normal.scss';
 
-		.avator-box {
-			display: flex;
-			align-items: center;
+	page {
+		font-family: PingFang SC-Medium;
+	}
+
+	.popSel {
+		position: fixed;
+		z-index: 101;
+		top: 0;
+		left: 0;
+		background-color: #f2f6f2;
+		width: 100vh;
+		min-height: 100vh;
+
+		.headLabel {
+			width: 686rpx;
+			margin: 28rpx 32rpx;
+			min-height: 222rpx;
+			background: #fff;
+			box-sizing: border-box;
+			padding: 30rpx 40rpx 46rpx 20rpx;
+			border-radius: 20rpx;
+
+			.avator-box {
+				display: flex;
+				align-items: center;
 
-			.avator {
-				width: 80rpx;
-				height: 80rpx;
-				margin-right: 20rpx;
+				.avator {
+					width: 80rpx;
+					height: 80rpx;
+					margin-right: 20rpx;
+				}
+			}
+
+			.tag-box {
+				display: flex;
+				flex-direction: row;
+				justify-content: flex-start;
+				align-items: center;
+				flex-wrap: wrap;
+				font-size: 24rpx;
+
+				.tag {
+					margin-right: 16rpx;
+					margin-top: 20rpx;
+					padding: 6rpx 10rpx;
+					border: 2rpx solid #DCE1DC;
+					color: #9E9E9E;
+					display: flex;
+					justify-content: center;
+					align-items: center;
+					border-radius: 42rpx;
+					line-height: 1;
+
+					.close {
+						width: 20rpx;
+						margin-left: 12rpx;
+						position: relative;
+					}
+				}
 			}
 		}
+	}
+
+	.openNicknamePopUpWindow {
+		.length-indicator {
+			font-size: 24rpx;
+			color: #999;
+			text-align: right;
+			margin-top: 10rpx;
+			margin-right: 20rpx;
+			position: absolute;
+			right: 24rpx;
+			top: 24rpx;
+
+		}
+	}
 
-		.tag-box {
+	.popSel {
+		.item_tag {
 			display: flex;
 			flex-direction: row;
 			justify-content: flex-start;
 			align-items: center;
 			flex-wrap: wrap;
-			font-size: 24rpx;
+			width: 690rpx;
+			padding: 20rpx;
 
 			.tag {
-				margin-right: 16rpx;
-				margin-top: 20rpx;
-				padding: 6rpx 10rpx;
-				border: 2rpx solid #DCE1DC;
-				color: #9E9E9E;
+				border-radius: 94rpx;
+				margin-right: 10rpx;
+				margin-top: 10rpx;
+				padding: 8rpx 16rpx;
+				font-size: 28rpx;
+				color: #333;
 				display: flex;
+				flex-direction: row;
 				justify-content: center;
 				align-items: center;
-				border-radius: 42rpx;
-				line-height: 1;
+				background: #fff;
+				border-width: 0;
 
 				.close {
-					width: 20rpx;
-					margin-left: 12rpx;
+					width: 28rpx;
+					margin-left: 2rpx;
 					position: relative;
 				}
 			}
+
+			.active {
+				border-width: 0;
+				background: #ACF934;
+			}
+
+			.addNew {
+				margin-right: 10rpx;
+				margin-top: 10rpx;
+				padding: 0rpx 20rpx;
+				height: 60rpx;
+				border-radius: 12rpx;
+				background: #1f1f1f;
+				color: #fff;
+				display: flex;
+				flex-direction: row;
+				justify-content: center;
+				align-items: center;
+			}
 		}
+
 	}
-}
-
-.openNicknamePopUpWindow {
-	.length-indicator {
-		font-size: 24rpx;
-		color: #999;
-		text-align: right;
-		margin-top: 10rpx;
-		margin-right: 20rpx;
-		position: absolute;
-		right: 24rpx;
-		top: 24rpx;
 
+	.reserveASeat {
+		width: 100%;
+		height: calc(var(--status-bar-height) + 50rpx);
 	}
-}
 
-.popSel {
-	.item_tag {
-		display: flex;
-		flex-direction: row;
-		justify-content: flex-start;
-		align-items: center;
-		flex-wrap: wrap;
-		width: 690rpx;
-		padding: 20rpx;
+	.page {
+		background: url("../../static/me/wd_bg_bianjiziliao.png") top center/ 100% auto no-repeat,
+			#f2f6f2;
+	}
 
-		.tag {
-			border-radius: 94rpx;
-			margin-right: 10rpx;
-			margin-top: 10rpx;
-			padding: 8rpx 16rpx;
+	.PageHeader {
+		background: url("../../static/me/wd_bg_bianjiziliao.png") center top / 100% auto no-repeat,
+			#f2f6f2;
+		background-position-y: var(--status-bar-height);
+	}
+
+	.add-tag-box {
+		background: #fff;
+		padding: 20rpx;
+		margin: 20rpx;
+		border-radius: 12rpx;
+		
+		.add-tag-input {
+			width: 100%;
+			height: 80rpx;
+			background: #f5f5f5;
+			border-radius: 8rpx;
+			padding: 0 20rpx;
 			font-size: 28rpx;
-			color: #333;
+			margin-bottom: 20rpx;
+		}
+		
+		.add-tag-btns {
 			display: flex;
-			flex-direction: row;
-			justify-content: center;
-			align-items: center;
-			background: #fff;
-			border-width: 0;
-
-			.close {
-				width: 28rpx;
-				margin-left: 2rpx;
-				position: relative;
+			justify-content: flex-end;
+			gap: 20rpx;
+			
+			.cancel-btn, .confirm-btn {
+				padding: 10rpx 30rpx;
+				border-radius: 8rpx;
+				font-size: 28rpx;
+			}
+			
+			.cancel-btn {
+				background: #f5f5f5;
+				color: #666;
+			}
+			
+			.confirm-btn {
+				background: #1f1f1f;
+				color: #fff;
 			}
 		}
+	}
 
-		.active {
-			border-width: 0;
-			background: #ACF934;
-		}
-
-		.addNew {
-			margin-right: 10rpx;
-			margin-top: 10rpx;
-			padding: 0rpx 20rpx;
-			height: 60rpx;
-			border-radius: 12rpx;
-			background: #1f1f1f;
-			color: #fff;
-			display: flex;
-			flex-direction: row;
-			justify-content: center;
-			align-items: center;
+	.item_tag {
+		.add-tag {
+			background: #f5f5f5;
+			color: #666;
+			border: 2rpx dashed #ddd;
+			
+			&:active {
+				background: #e5e5e5;
+			}
 		}
 	}
-}
 </style>

+ 4 - 1
pages/my/follow.vue

@@ -10,7 +10,7 @@
 				</view>
 			</template>
 		</PageHeader>
-		<view style="height: 90rpx;"></view>
+		<view class="reserveASeat"></view>
 
 		<view class="follow-list">
 			<view class="follow-item" v-for="(item, index) in currentList" :key="index"
@@ -178,4 +178,7 @@ export default {
 
 <style scoped lang="scss">
 @import 'follow.scss';
+.reserveASeat{
+	height: calc(90rpx + var(--status-bar-height) + 30rpx );
+}
 </style>

+ 9 - 8
pages/my/my.scss

@@ -1,18 +1,16 @@
 page {
   background-color: #fff;
-
-  padding-bottom: 144rpx;
 }
 .page {
   background-color: #fff;
   width: 100%;
   min-height: 100vh;
 }
-.reserveASeat{
+.reserveASeat {
   width: 100%;
-  height: calc(var(--status-bar-height)  ); 
+  height: calc(var(--status-bar-height));
 }
-.topBody { 
+.topBody {
   width: 750rpx;
 }
 .header1 {
@@ -395,7 +393,6 @@ page {
               width: 40rpx;
               height: 40rpx;
             }
-     
           }
         }
       }
@@ -574,7 +571,7 @@ page {
         width: 346rpx;
         height: 520rpx;
       }
-      .incomplete-bg2{
+      .incomplete-bg2 {
         position: absolute;
         left: 0;
         top: 50%;
@@ -653,6 +650,10 @@ page {
     position: absolute;
     left: 50%;
     top: 50%;
-    transform: translate(-50%, -50%);  
+    transform: translate(-50%, -50%);
   }
 }
+.reserveASeatBom {
+  width: 100%;
+  height: calc(var(--window-bottom) + 200rpx); 
+}

+ 63 - 5
pages/my/my.vue

@@ -167,6 +167,16 @@
               :item="item"
               @click="goWork(item)"
             />
+            <!-- 暂无内容提示 -->
+            <view v-if="worksList.length === 0" class="empty-state">
+              <image 
+                src="@/static/icon/xx_img_zanwuxiaoxi.png" 
+                mode="aspectFit" 
+                class="empty-image"
+              ></image>
+              <text class="empty-text">暂无作品</text>
+              <text class="empty-subtext">快来创作你的第一个作品吧~</text>
+            </view>
           </view>
           <view
             class="numlist2"
@@ -251,6 +261,16 @@
                 </view>
               </view>
             </view>
+            <!-- 暂无内容提示 -->
+            <view v-if="worksList.length === 0" class="empty-state">
+              <image 
+                src="@/static/icon/xx_img_zanwuxiaoxi.png" 
+                mode="aspectFit" 
+                class="empty-image"
+              ></image>
+              <text class="empty-text">暂无生成中的作品</text>
+              <text class="empty-subtext">快去创作新作品吧~</text>
+            </view>
           </view>
         </template>
         <template v-else>
@@ -316,6 +336,16 @@
                 >
               </view>
             </view>
+            <!-- 暂无内容提示 -->
+            <view v-if="worksList.length === 0" class="empty-state">
+              <image 
+                src="@/static/icon/xx_img_zanwuxiaoxi.png" 
+                mode="aspectFit" 
+                class="empty-image"
+              ></image>
+              <text class="empty-text">暂无帖子</text>
+              <text class="empty-subtext">快来发布你的第一个帖子吧~</text>
+            </view>
           </view>
         </template>
         <!-- 加载更多提示 -->
@@ -327,10 +357,9 @@
         >杭州智潮创意科技有限公司</view
       >
 
-      <view class="blankHeight"></view>
-      <view class="blankHeight"></view>
+      <view class="blankHeight"></view> 
     </view>
-   
+    <view class="reserveASeatBom"></view>
     <!-- 确认框 -->
     <CustomConfirm ref="customConfirm"></CustomConfirm>
     <!-- 提示框 -->
@@ -376,8 +405,8 @@ export default {
       firstLevelNavActive: 0,
       myinfo: {
         avator: "../../static/logo.png",
-        nickname: "王思思",
-        join_name: "注册日期:2024年5月",
+        nickname: "",
+        join_name: "",
         num_1: 0,
         num_2: 0,
         num_3: 0,
@@ -717,4 +746,33 @@ export default {
 
 <style scoped lang="scss">
 @import "my.scss";
+
+.empty-state {
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+  justify-content: center;
+  padding: 60rpx 0;
+  margin-top: 40rpx;
+  background: #FFFFFF;
+  border-radius: 20rpx;
+  width: 710rpx;
+  .empty-image {
+    width: 240rpx;
+    height: 240rpx;
+    margin-bottom: 30rpx;
+  }
+  
+  .empty-text {
+    font-size: 32rpx;
+    color: #333333;
+    margin-bottom: 16rpx;
+    font-weight: 500;
+  }
+  
+  .empty-subtext {
+    font-size: 28rpx;
+    color: #999999;
+  }
+}
 </style>

+ 147 - 39
pages/my/myStar.vue

@@ -133,7 +133,8 @@
 				<!-- 角色信息板块 -->
 				<view class="info-section">
 					<view class="character-name">
-						{{ starInfo.nickname }}
+						<uv-input v-if="state == 5" v-model="starInfo.nickname" placeholder="请输入昵称" border="none" />
+						<text v-else>{{ starInfo.nickname }}</text>
 						<image class="male" v-if="starInfo.sex == 0" src="../../static/me/wd_icon_nan.png"
 							mode="aspectFit">
 						</image>
@@ -141,18 +142,19 @@
 							mode="aspectFit">
 						</image>
 						<image class="other" v-else src="../../static/me/wd_icon_qita.png" mode="aspectFit"></image>
-
 					</view>
-					<!-- <view class="section-title">关于Ta</view> -->
 
 					<!-- 人物简介 -->
 					<view class="description-box">
 						<view class="description-title">
 							<view>Ta的设定</view>
-							<view v-if="false" class="edit-button">编辑<text class="fa fa-angle-right"
-									style="color: #000;"></text></view>
+							<view v-if="state == 5" class="edit-button" @click="showEditPopup">
+								编辑<text class="fa fa-angle-right" style="color: #000;"></text>
+							</view>
+						</view>
+						<view class="description-text">
+							<text>{{ starInfo.content }}</text>
 						</view>
-						<view class="description-text"> <text>{{ starInfo.content }}</text> </view>
 					</view>
 
 					<!-- 标签展示 -->
@@ -174,6 +176,21 @@
 			<view class="join-button" @tap="handleJoin(0)" v-if="state == 6"> 已驻星球 </view>
 		</view>
 
+		<!-- 编辑弹窗 -->
+		<uni-popup ref="editPopup" type="center">
+			<view class="edit-popup">
+				<view class="popup-title">修改设定</view>
+				<view class="popup-content">
+					<uv-textarea v-model="editContent" :maxlength="500" count autoHeight placeholder="输入Ta的设定"
+						class="edit-textarea" />
+				</view>
+				<view class="popup-buttons">
+					<view class="cancel-btn" @click="closeEditPopup">再考虑一下</view>
+					<view class="confirm-btn" @click="saveEdit">确认添加</view>
+				</view>
+			</view>
+		</uni-popup>
+
 		<SharePopup :visible="showShare" :share-url="shareUrl" :share-title="shareTitle" :share-desc="shareDesc"
 			:share-img="shareImg" @close="showShare = false" />
 	</view>
@@ -239,6 +256,7 @@ export default {
 			maxRetries: 10, // 最大重试次数
 			retryCount: 0,  // 当前重试次数
 			pollingInterval: 30000, // 轮询间隔时间(毫秒)
+			editContent: '',
 		};
 	},
 	onLoad() {
@@ -273,33 +291,31 @@ export default {
 				this.formData.tags.push(tag);
 			}
 		},
-		handleJoin() {
-			console.log("入驻星球");
-			// 处理入驻逻辑
-			uni.request({
-				url: this.$apiHost + "/AIpipei/gogogo",
-				data: {
-					uuid: getApp().globalData.uuid,
-				},
-				header: {
-					"content-type": "application/x-www-form-urlencoded",
-					sign: getApp().globalData.headerSign,
-				},
-				method: "POST",
-				// 设置60秒超时
-				timeout: 60000,
-				success: (res) => {
-					this.aIpipeiGetinfo({ polling: false })
-
-				},
-				fail: (err) => {
-
-				},
-				complete: () => {
-
-				},
-			});
-
+		handleJoin(type) {
+			if (type === 1) {
+				// 保存修改后的信息到服务器
+				uni.request({
+					url: this.$apiHost + "/AIpipei/gogogo",
+					data: {
+						uuid: getApp().globalData.uuid,
+						nickname: this.starInfo.nickname,
+						content: this.starInfo.content,
+					},
+					header: {
+						"content-type": "application/x-www-form-urlencoded",
+						sign: getApp().globalData.headerSign,
+					},
+					method: "POST",
+					success: (res) => {
+						this.aIpipeiGetinfo({ polling: false });
+					}
+				});
+			} else {
+				// 已入驻状态,直接跳转
+				uni.navigateTo({
+					url: '/pages/isLand/homeLand'
+				});
+			}
 		},
 
 		// 提交用户 开始创建的命令
@@ -398,11 +414,11 @@ export default {
 					console.log("查询到生成信息", res.data);
 					// 重置重试计数
 					this.retryCount = 0;
-					
+
 					if (res && res.data && res.data.info) {
 						if (res.data.info && res.data.info.tags != "") {
 							res.data.info.tags = res.data.info.tags.split(",");
-							this.predefinedTags = res.data.info.tags.map(tag => { return { text: tag, value: tag } }) 
+							this.predefinedTags = res.data.info.tags.map(tag => { return { text: tag, value: tag } })
 							console.log(666, res);
 
 						} else {
@@ -440,7 +456,7 @@ export default {
 					console.error("请求失败:", err);
 					// 增加重试计数
 					this.retryCount++;
-					
+
 					// 显示错误提示
 					uni.showToast({
 						title: `网络请求失败,第${this.retryCount}次重试`,
@@ -463,7 +479,7 @@ export default {
 							this.aIpipeiGetinfo({ polling: true });
 						}, this.pollingInterval);
 					}
-				} 
+				}
 			});
 		},
 		// 保存表单信息
@@ -563,7 +579,23 @@ export default {
 				case 'other':
 					return 2
 			}
-		}
+		},
+		// 显示编辑弹窗
+		showEditPopup() {
+			this.editContent = this.starInfo.content;
+			this.$refs.editPopup.open();
+		},
+
+		// 关闭编辑弹窗
+		closeEditPopup() {
+			this.$refs.editPopup.close();
+		},
+
+		// 保存编辑内容
+		saveEdit() {
+			this.starInfo.content = this.editContent;
+			this.closeEditPopup();
+		},
 	},
 };
 </script>
@@ -637,7 +669,7 @@ export default {
 		align-items: center;
 		justify-content: space-between;
 		width: 100%;
-		height: calc( 90rpx + var(--status-bar-height));
+		height: calc(90rpx + var(--status-bar-height));
 		padding: 0 20rpx;
 		padding-top: var(--status-bar-height);
 		background-color: transparent;
@@ -686,4 +718,80 @@ export default {
 	}
 
 }
+
+.edit-popup {
+	width: 600rpx;
+	background: #fff;
+	border-radius: 24rpx;
+	padding: 40rpx 32rpx;
+
+	.popup-title {
+		font-size: 32rpx;
+		font-weight: bold;
+		text-align: center;
+		margin-bottom: 32rpx;
+		color: #000;
+	}
+
+	.popup-content {
+		margin-bottom: 32rpx;
+
+		.edit-textarea {
+			background: #F7F7F7;
+			border-radius: 16rpx;
+			padding: 24rpx;
+			min-height: 160rpx;
+
+			::v-deep .uv-textarea__field {
+				font-size: 28rpx;
+				color: #333;
+			}
+		}
+	}
+
+	.popup-buttons {
+		display: flex;
+		justify-content: space-between;
+		gap: 24rpx;
+
+		.cancel-btn,
+		.confirm-btn {
+			flex: 1;
+			height: 88rpx;
+			line-height: 88rpx;
+			text-align: center;
+			border-radius: 44rpx;
+			font-size: 32rpx;
+			font-weight: 500;
+		}
+
+		.cancel-btn {
+			background: #fff;
+			color: #333;
+			border: 2rpx solid #E5E5E5;
+		}
+
+		.confirm-btn {
+			background: #000;
+			color: #fff;
+		}
+	}
+}
+
+.description-title {
+	display: flex;
+	justify-content: space-between;
+	align-items: center;
+
+	.edit-button {
+		color: #7ebc00;
+		font-size: 28rpx;
+		display: flex;
+		align-items: center;
+
+		.fa-angle-right {
+			margin-left: 10rpx;
+		}
+	}
+}
 </style>

+ 2 - 0
pages/my/setting.scss

@@ -3,9 +3,11 @@ page {
   padding: 0 20rpx;
   box-sizing: border-box;
   padding-bottom: 50rpx;
+  min-height: 100vh;
 }
 .page {
   background-color: #f2f6f2;
+  min-height: 100vh;
 }
 
 .topBody {

+ 1 - 1
pages/my/setting.vue

@@ -164,7 +164,7 @@ export default {
   },
   methods: {
     openCustomPopup() {
-      this.$refs.customerServicePopup.$refs.customPopup.open();
+      this.$refs.customerServicePopup.open();
     },
     getAppVersion() {
       uni.getSystemInfo({

+ 2 - 6
pages/my/step.vue

@@ -546,8 +546,6 @@
           aihao: tagStr
         };
 
-        console.log("提交数据:", data);
-
         uni.showLoading({
           title: "保存中...",
           mask: true
@@ -563,7 +561,6 @@
           },
           dataType: "json",
           success: (res) => {
-            console.log("提交响应:", res.data);
             if (res.data.success === "yes") {
               // 保存用户信息到全局变量和本地存储
               if (this.userInfo.nickname) {
@@ -581,7 +578,7 @@
                 icon: "success",
               });
               
-              // 延迟跳转到指定页面
+              // 延迟跳转
               setTimeout(() => {
                 uni.switchTab({
                   url: "/pages/index/index",
@@ -594,8 +591,7 @@
               });
             }
           },
-          fail: (err) => {
-            console.error("提交失败:", err);
+          fail: () => {
             uni.showToast({
               title: "网络错误",
               icon: "none",

+ 1 - 1
pages/my/userHomepage.vue

@@ -106,7 +106,7 @@ export default {
       firstLevelNavActive: 0,
       myinfo: {
         avator: "../../static/logo.png",
-        nickname: "王思思",
+        nickname: "",
         content: "",
         sex_id: 1,
         my_level: 1,

+ 22 - 2
pages/vip/M_purchase.vue

@@ -15,7 +15,7 @@
         <view>我的M币</view>
         <view class="myGoldCoin-box-content">
           <image src="../../static/icon/coin_m.png" mode="widthFix" />
-          <text>1000</text>
+          <text>{{ myGoldCoin }}</text>
         </view>
       </view>
       <view class="myinfo">
@@ -141,6 +141,7 @@ export default {
       tid: 0,
       linkid: "",
       is_agree: 0,
+      myGoldCoin: 0,
       dropdownOptions: [
         { label: '购买记录', type: 'vipRecord' }
       ]
@@ -317,7 +318,26 @@ export default {
         });
     },
     loadData() {
-      var offset = (this.page - 1) * 20;
+      // 获取M币数量
+      uni.request({
+        url: this.$apiHost + '/My/getnum',
+        method: 'GET',
+        header: {
+          'content-type': 'application/json',
+          'sign': getApp().globalData.headerSign
+        },
+        data: {
+          uuid: getApp().globalData.uuid
+        },
+        success: (res) => {
+          console.log("获取用户M币数量:", res.data);
+          if (res.data && res.data.num_gmm) {
+            this.myGoldCoin = res.data.num_gmm;
+          }
+        }
+      });
+
+      // 获取充值列表
       uni.request({
         url: this.$apiHost + "/User/getCzList",
         data: {

+ 7 - 3
pages/vip/index.vue

@@ -117,6 +117,7 @@
 
 			</view>
 		</uni-popup>
+		<CustomerServicePopup ref="customerServicePopup"></CustomerServicePopup>
 	</view>
 </template>
 
@@ -483,12 +484,15 @@ export default {
 					});
 					break;
 				case 'contact':
-					uni.navigateTo({
-						url: '/pages/contact/index'
-					});
+					 
+				this.openCustomPopup();
+
 					break;
 			}
 		},
+		openCustomPopup() {
+      this.$refs.customerServicePopup.open();
+    },
 		goPage(page) {
 			uni.navigateTo({
 				url: page,

+ 49 - 1
pages/vip/record.vue

@@ -24,11 +24,17 @@
         </view>
       </template>
     </PageHeader>
-    <view style="height: 90rpx"></view>
+    <view class="reserveASeat"></view>
 
     <view class="record-list">
       <template v-if="currentTab === 'vip'">
+        <view v-if="recordList.length === 0" class="empty-state">
+          <image src="@/static/icon/xx_img_zanwuxiaoxi.png" mode="aspectFit" class="empty-image"></image>
+          <view class="empty-text">暂无会员记录</view>
+          <view class="empty-subtext">快去开通会员吧~</view>
+        </view>
         <view
+          v-else
           class="record-item"
           v-for="(item, index) in recordList"
           :key="index"
@@ -47,7 +53,13 @@
         </view>
       </template>
       <template v-else>
+        <view v-if="recordList.length === 0" class="empty-state">
+          <image src="@/static/icon/xx_img_zanwuxiaoxi.png" mode="aspectFit" class="empty-image"></image>
+          <view class="empty-text">{{ currentTab === 'coin' ? '暂无M币记录' : '暂无星源记录' }}</view>
+          <view class="empty-subtext">{{ currentTab === 'coin' ? '快去充值M币吧~' : '快去获取星源吧~' }}</view>
+        </view>
         <view
+          v-else
           class="record-item"
           v-for="(item, index) in recordList"
           :key="index"
@@ -274,4 +286,40 @@ export default {
   font-size: 24rpx;
   background-color: #fff;
 }
+
+.empty-state {
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+  justify-content: center;
+  margin: 40rpx auto;
+  width: 90%;
+  max-width: 600rpx;
+  padding: 40rpx;
+  background: #FFFFFF;
+  border-radius: 24rpx;   
+  
+  .empty-image {
+    width: 200rpx;
+    height: 200rpx;
+    margin-bottom: 20rpx;
+  }
+  
+  .empty-text {
+    font-size: 32rpx;
+    color: #333333;
+    margin-bottom: 16rpx;
+    text-align: center;
+  }
+  
+  .empty-subtext {
+    font-size: 28rpx;
+    color: #999999;
+    text-align: center;
+  }
+}
+.reserveASeat {
+  width: 100%;
+  height: calc(var(--status-bar-height) + 100rpx);
+}
 </style>

BIN
static/tabbar-icon/center.png