Просмотр исходного кода

Merge branch 'master' into zhongqi-chat

shizhongqi 11 месяцев назад
Родитель
Сommit
3632dc56fb

+ 1 - 0
hdApp/src/admin/home/apply.vue

@@ -64,6 +64,7 @@ export default {
             { name: "失信人员", img: `${this.$constant.hostUrl}/image/ghs/home/shop2.png`, url: "/admin/ll/list",pf:1},
             { name: "充值规则", img: `${this.$constant.hostUrl}/image/ghs/home/shop2.png`, url: "/admin/recharge/discount",pf:1},
             { name: "收款码", img: `${this.$constant.hostUrl}/image/ghs/home/shop2.png`, url: "/admin/cg/code",pf:1},
+            { name: "会员等级", img: `${this.$constant.hostUrl}/image/ghs/home/shop2.png`, url: "/admin/member/level",pf:1},
           ]
         },
         {

+ 9 - 2
hdApp/src/admin/home/workbench.vue

@@ -59,8 +59,12 @@
         </view>
       </view>
 
-      <view style="text-align: center;font-size:34upx;font-weight:bold;color:red;margin-bottom:20upx;" @click="setRecharge" v-if="shopInfo.rechargeWeal == 0">
-        请先设置充值活动的规则
+      <view style="text-align: center;font-size:42upx;font-weight:bold;color:red;margin-bottom:30upx;margin-top:10upx;" @click="setMemberLevel" v-if="shopInfo.memberLevelSet == 0">
+        请设置会员等级
+        <text style="color:#3385ff;text-decoration: underline;margin-left:10upx;">去设置</text>
+      </view>
+      <view style="text-align: center;font-size:42upx;font-weight:bold;color:red;margin-bottom:30upx;margin-top:10upx;" @click="setRecharge" v-if="shopInfo.rechargeWeal == 0">
+        请设置充值活动的规则
         <text style="color:#3385ff;text-decoration: underline;margin-left:10upx;">去设置</text>
       </view>
       <view v-if="!$util.isEmpty(data.warning)" style="color:red;font-size:36upx;font-weight:bold;text-align: center;margin-bottom:15upx;">{{ data.warning }}</view>
@@ -578,6 +582,9 @@ export default {
     },
     setRecharge(){
       this.$util.pageTo({url:'/admin/recharge/discount'})
+    },
+    setMemberLevel(){
+      this.$util.pageTo({url:'/admin/member/level'})
     },
 		closeToShow(){
 			this.$refs.toShowMore.close()

+ 1 - 1
hdApp/src/admin/member/detail.vue

@@ -3,7 +3,7 @@
     <div class="module-com user-info">
       <div class="user-wrap">
         <div class="user-avatar">
-          <app-avatar-module :src="data.avatarUrl" />
+          <app-avatar-module :src="data.smallAvatar" />
         </div>
         <div class="user-info-content">
           <div class="user-main-info">

+ 12 - 12
hdApp/src/admin/member/discount.vue → hdApp/src/admin/member/level.vue

@@ -4,10 +4,10 @@
 			<t-table :headerBackgroundColor="'#F0F2F6'">
 				<view>
 					<t-tr header>
-						<t-th><view style="color:black;">会员名称</view></t-th>
+						<t-th><view style="color:black;">会员等级</view></t-th>
 						<t-th>
 							<view style="color:black;">
-								<view>享折扣</view>
+								<view>消费金额</view>
 							</view>
 						</t-th>
 					</t-tr>
@@ -20,7 +20,7 @@
                             </t-td>
                             <t-td align="center" color="info">
                                 <view>
-                                <input v-model="item.discount" type="digit" style="border:1upx solid #cccccc;color:black;font-size:30upx;" @focus="() => clearDiscount(inIndex)" placeholder="9折写0.9,85折写0.85" />
+                                <input v-model="item.amount" type="digit" style="border:1upx solid #cccccc;color:black;font-size:30upx;" @focus="() => clearDiscount(inIndex)" placeholder="请填写" />
                                 </view>
                             </t-td>
                         </t-tr>
@@ -29,7 +29,7 @@
 			</t-table>
 			<view style="font-size:36upx;font-weight:bold;height:50upx;margin-top:50upx;display: flex;align-items: center;justify-content: center;">
 				超过
-				<input v-model="reduceDay" type="number" @focus="() => clearReduceDay()" placeholder="填0不自动降级" style="border:1upx solid #cccccc;color:black;font-size:28upx;width:220upx;display: inline-block;text-align:center;margin:0 10upx 0 10upx;" />
+				<input v-model="reduceDay" type="number" @focus="() => clearReduceDay()" placeholder="填0不降级" style="border:1upx solid #cccccc;color:black;font-size:28upx;width:200upx;display: inline-block;text-align:center;margin:0 10upx 0 10upx;" />
 				天未消费降一级
 			</view>
 
@@ -44,7 +44,7 @@
 import AppWrapperEmpty from "@/components/app-wrapper-empty";
 import list from '@/mixins/list'
 import ModalModule from "@/components/plugin/modal";
-import { getInitData,modifyMember } from '@/api/member'
+import { getLevelInitData,modifyLevel } from '@/api/member'
 export default {
 	name: "addPrice",
 	components: {
@@ -58,11 +58,8 @@ export default {
 		};
 	},
 	methods: {
-		setRechargeDiscount(){
-			this.$util.pageTo({url: "/admin/recharge/discount",type:2})
-		},
         init(){
-			getInitData().then(res=>{
+			getLevelInitData().then(res=>{
 				if(res.code == 1){
 					this.map = res.data.member?res.data.member:[]
 					this.reduceDay = res.data.reduceDay?res.data.reduceDay:30
@@ -70,7 +67,7 @@ export default {
 			})
         },
 		clearDiscount(index){
-			this.$set(this.map[index], 'discount', '')
+			this.$set(this.map[index], 'amount', '')
 		},
 		clearReduceDay(){
 			this.reduceDay = ''
@@ -79,10 +76,13 @@ export default {
 			uni.navigateBack()
 		},
 		saveData(){
-			this.$util.confirmModal({content:'只能修改一次,提交后将不能再次修改,确认提交?'},() => {
-				modifyMember({data:this.map,reduceDay:this.reduceDay}).then(res=>{
+			this.$util.confirmModal({content:'确认提交?提交后将不能再修改'},() => {
+				modifyLevel({data:this.map,reduceDay:this.reduceDay}).then(res=>{
 					if(res.code == 1){
 						this.$msg(res.msg)
+						setTimeout(() => {
+							uni.navigateBack({})
+						}, 900);
 					}
 				})
 			})

+ 2 - 2
hdApp/src/admin/recharge/discount.vue

@@ -28,7 +28,7 @@
 
 			<view style="margin-top:50upx;text-align: left;padding-left:10px;">
 				<view style="font-size:32upx;">充值金额请按由少到多填写</view>
-				<view style="font-size:32upx;margin-top:15upx;color:red;font-weight:bold;">客户如有欠款未结,充值时不会有赠送,切记</view>
+				<view style="font-size:32upx;margin-top:15upx;color:red;font-weight:bold;">客户如有欠款未结,充值时不会有赠送,切记</view>
 			</view>
 		</view>
         <view class="app-footer">
@@ -80,7 +80,7 @@ export default {
 			this.$set(this.map[index], 'give', '')
 		},
 		saveData(){
-			this.$util.confirmModal({content:'只能设置一次,提交后将不能再次修改,确认提交?'},() => {
+			this.$util.confirmModal({content:'确认提交?提交后将不能再修改'},() => {
 				modifyRecharge({data:this.map,rechargeWeal:this.rechargeWeal}).then(res=>{
 					if(res.code == 1){
 						this.$msg(res.msg)

+ 8 - 0
hdApp/src/api/member/index.js

@@ -16,10 +16,18 @@ export const modifyMember = data => {
 	return https.post('/member-weal/modify', data)
 }
 
+export const modifyLevel = data => {
+	return https.post('/member-level/modify', data)
+}
+
 export const getInitData = data => {
 	return https.get("/member-weal/get-init-data", data);
 };
 
+export const getLevelInitData = data => {
+	return https.get("/member-level/get-init-data", data);
+};
+
 export const getRechargeData = data => {
 	return https.get("/member-weal/get-recharge-data", data);
 };

+ 2 - 1
hdApp/src/config.js

@@ -2,4 +2,5 @@ export const ProjectName = 'hd'
 export const APIHOST = 'https://api.shop.huaml.com'
 export const FORMALHOST = 'https://shop.huaml.com'
 export const IMGHOST = 'https://img.huaml.com'
-export const CURRENT_ENV = 'dev'
+export const CURRENT_ENV = 'dev'
+export const WSSHOST = 'wss://chat.shop.huaml.com'

+ 1 - 1
hdApp/src/pages.json

@@ -424,7 +424,7 @@
 			"pages": [
 				{ "path": "detail", "style": { "navigationBarTitleText": "详情" } },
 				{ "path": "modify", "style": { "navigationBarTitleText": "修改地址" } },
-				{"path": "discount","style": {"navigationBarTitleText": "会员优惠"}}
+				{"path": "level","style": {"navigationBarTitleText": "会员等级"}}
 			]
 		},
 		{

+ 10 - 9
hdPad/src/pages/home/components/customList.vue

@@ -277,14 +277,15 @@ export default {
         border: 1px solid #eee;
         & .show-item_box {
             padding: 2upx;
-            & .item-body_box {
+                            & .item-body_box {
                 border-radius: 2upx;
                 padding: 5upx;
                 font-size: 14upx;
                 color:#666666;
-                height:70upx;
+                height:60upx;
                 display: flex;
-                align-items: center;
+                align-items: flex-start;
+                padding-top: 8upx;
                 
                 &.active {
                     background-color: #d4d6d6;
@@ -294,8 +295,8 @@ export default {
                 }
                 
                 & .avatar-image {
-                    width: 50upx;
-                    height: 50upx;
+                    width: 40upx;
+                    height: 40upx;
                     border-radius: 5upx;
                     margin-right: 10upx;
                     flex-shrink: 0;
@@ -305,13 +306,13 @@ export default {
                     flex: 1;
                     display: flex;
                     flex-direction: column;
-                    justify-content: space-between;
-                    height: 100%;
+                    justify-content: flex-start;
+                    height: 48upx;
                     overflow: hidden;
                     
                     & .customer-name {
                         font-size: 11upx;
-                        margin-bottom: 2upx;
+                        margin-bottom: 4upx;
                         display: flex;
                         justify-content: space-between;
                         align-items: center;
@@ -341,7 +342,7 @@ export default {
                         display: flex;
                         justify-content: space-between;
                         align-items: center;
-                        margin-bottom: 2upx;
+                        margin-bottom: 4upx;
                         
                         & .balance {
                             font-size: 10upx;

+ 5 - 1
mallApp/src/api/user/index.js

@@ -22,4 +22,8 @@ export const accountLogin = data => {
 
 export const clearLogin = data => {
 	return https.get("/user/clear-login", data);
-};
+};
+
+export const modifyBirthday = data => {
+	return https.get('/user/modify-birthday', data)
+}

+ 2 - 1
mallApp/src/config.js

@@ -1,3 +1,4 @@
 export const ProjectName = 'mall'
 export const CURRENT_ENV = 'dev'
-export const APIHOST = 'https://api.shop.theflorist.cn'
+export const APIHOST = 'https://api.shop.theflorist.cn'
+export const WSSHOST = 'wss://chat.shop.huaml.com'

+ 6 - 4
mallApp/src/pages.json

@@ -18,7 +18,9 @@
             "pages": [
                 { "path": "register", "style": { "navigationBarTitleText": "注册" } },
                 { "path": "password", "style": { "navigationBarTitleText": "修改密码" } },
-                { "path": "modify", "style": { "navigationBarTitleText": "资料修改" } }
+                { "path": "address", "style": { "navigationBarTitleText": "修改地址" } },
+                { "path": "edit", "style": { "navigationBarTitleText": "个人信息" } },
+                { "path": "birthday", "style": { "navigationBarTitleText": "您的生日" } }
             ]
         },
         {
@@ -98,7 +100,7 @@
         {
             "root": "pages/interest",
             "pages": [
-                { "path": "invite", "style": { "navigationBarTitleText": "邀请排行", "enablePullDownRefresh": true } },
+                { "path": "invite", "style": { "navigationBarTitleText": "邀请排行", "enablePullDownRefresh": false } },
                 { "path": "level", "style": { "navigationBarTitleText": "会员等级" } }
             ]
         },
@@ -112,13 +114,13 @@
         {
             "root": "pages/billing",
             "pages": [
-                { "path": "affirmGhs", "style": { "navigationBarTitleText": "订单结算", "enablePullDownRefresh": true } }
+                { "path": "affirmGhs", "style": { "navigationBarTitleText": "订单结算", "enablePullDownRefresh": false } }
             ]
         },
         {
             "root": "pages/recharge",
             "pages": [
-                { "path": "list", "style": { "navigationBarTitleText": "充值记录", "enablePullDownRefresh": true } },
+                { "path": "list", "style": { "navigationBarTitleText": "充值记录", "enablePullDownRefresh": false } },
                 { "path": "detail", "style": { "navigationBarTitleText": "充值详情" } }
             ]
         }

+ 16 - 60
mallApp/src/pages/home/category.vue

@@ -24,13 +24,12 @@
 			<view class="buy-flower-container">
 				<button class="buy-flower-btn" @click="buyAlbum()">
 					<view class="btn-content">
-						<view class="flower-icon-css"></view>
-						<text class="btn-text">花束相册</text>
+						<text class="btn-text">📷 花束相册</text>
 					</view>
 				</button>
 				<button class="buy-material-btn" @click="buyProduct()">
 					<view class="btn-content">
-						<text class="btn-text">花材绿植</text>
+						<text class="btn-text">🌸 花材绿植</text>
 					</view>
 				</button>
 			</view>
@@ -582,18 +581,17 @@ page {
 
 .buy-flower-btn {
 	position: relative;
-	background: linear-gradient(135deg, #ff6b6b, #ff8e8e, #ffa8a8);
+	background: #e91e63;
 	border: none;
 	border-radius: 50upx;
 	padding: 0;
 	height: 80upx;
 	min-width: 200upx;
-	box-shadow: 0 8upx 20upx rgba(255, 107, 107, 0.3);
+	box-shadow: 0 8upx 20upx rgba(233, 30, 99, 0.3);
 	overflow: hidden;
-	animation: pulse 2s infinite;
 
 	&:active {
-		box-shadow: 0 4upx 10upx rgba(255, 107, 107, 0.4);
+		box-shadow: 0 4upx 10upx rgba(233, 30, 99, 0.4);
 	}
 
 	.btn-content {
@@ -606,69 +604,32 @@ page {
 		text-align: center;
 	}
 
-	.flower-icon-css {
-		width: 24upx;
-		height: 24upx;
-		margin-right: 8upx;
-		position: relative;
-
-		&::before {
-			content: '';
-			position: absolute;
-			width: 16upx;
-			height: 16upx;
-			background: #fff;
-			border-radius: 50%;
-			top: 4upx;
-			left: 4upx;
-			box-shadow: 
-				0 -8upx 0 -2upx #fff,
-				8upx -6upx 0 -2upx #fff,
-				8upx 6upx 0 -2upx #fff,
-				0 8upx 0 -2upx #fff,
-				-8upx 6upx 0 -2upx #fff,
-				-8upx -6upx 0 -2upx #fff;
-		}
-
-		&::after {
-			content: '';
-			position: absolute;
-			width: 8upx;
-			height: 8upx;
-			background: #ffeb3b;
-			border-radius: 50%;
-			top: 8upx;
-			left: 8upx;
-		}
-	}
-
 	.btn-text {
 		color: white;
 		font-size: 28upx;
 		font-weight: bold;
 		text-shadow: 0 2upx 4upx rgba(0, 0, 0, 0.2);
-		margin-right: 8upx;
 		text-align: center;
 		line-height: 1;
 		display: flex;
 		align-items: center;
+		justify-content: center;
 	}
 }
 
 .buy-material-btn {
 	position: relative;
-	background: linear-gradient(135deg, #4caf50, #66bb6a, #81c784);
+	background: linear-gradient(135deg, #ff6b6b 0%, #ee5a24 100%);
 	border: none;
 	border-radius: 50upx;
 	padding: 0;
 	height: 80upx;
-	min-width: 160upx;
-	box-shadow: 0 8upx 20upx rgba(76, 175, 80, 0.3);
+	width: 208upx;
+	box-shadow: 0 8upx 20upx rgba(255, 107, 107, 0.3);
 	overflow: hidden;
 
-
 	&:active {
-		box-shadow: 0 4upx 10upx rgba(76, 175, 80, 0.4);
+		box-shadow: 0 4upx 10upx rgba(255, 107, 107, 0.4);
 	}
 
 	.btn-content {
@@ -686,20 +647,15 @@ page {
 		font-weight: bold;
 		text-shadow: 0 2upx 4upx rgba(0, 0, 0, 0.2);
 		margin: 0 8upx;
+		text-align: center;
+		line-height: 1;
+		display: flex;
+		align-items: center;
+		justify-content: center;
 	}
 }
 
-@keyframes pulse {
-	0% {
-		box-shadow: 0 8upx 20upx rgba(255, 107, 107, 0.3);
-	}
-	50% {
-		box-shadow: 0 12upx 30upx rgba(255, 107, 107, 0.4);
-	}
-	100% {
-		box-shadow: 0 8upx 20upx rgba(255, 107, 107, 0.3);
-	}
-}
+
 
 @keyframes fadeInFrames {
 	0% {

+ 35 - 50
mallApp/src/pages/home/mall.vue

@@ -24,12 +24,13 @@
 			<view class="buy-flower-container">
 				<button class="buy-flower-btn" @click="buyHs()">
 					<view class="btn-content">
-						<view class="flower-icon-css"></view>
+						<text class="flower-icon">💐</text>
 						<text class="btn-text">花束商城</text>
 					</view>
 				</button>
 				<button class="buy-material-btn" @click="buyProduct()">
 					<view class="btn-content">
+						<text class="material-icon">🌸</text>
 						<text class="btn-text">花材绿植</text>
 					</view>
 				</button>
@@ -572,22 +573,24 @@ page {
 	flex-shrink: 0;
 	display: flex;
 	gap: 10upx;
+	flex-wrap: nowrap;
 }
 
 .buy-flower-btn {
 	position: relative;
-	background: linear-gradient(135deg, #ff6b6b, #ff8e8e, #ffa8a8);
+	background: linear-gradient(135deg, #a55eea 0%, #8e44ad 100%);
 	border: none;
 	border-radius: 50upx;
 	padding: 0;
 	height: 80upx;
-	min-width: 200upx;
-	box-shadow: 0 8upx 20upx rgba(255, 107, 107, 0.3);
+	min-width: 205upx;
+	flex: 0 0 auto;
+	box-shadow: 0 8upx 20upx rgba(165, 94, 234, 0.3);
 	overflow: hidden;
-	animation: pulse 2s infinite;
+	animation: pulse-flower 2s infinite;
 
 	&:active {
-		box-shadow: 0 4upx 10upx rgba(255, 107, 107, 0.4);
+		box-shadow: 0 4upx 10upx rgba(165, 94, 234, 0.4);
 	}
 
 	.btn-content {
@@ -600,40 +603,12 @@ page {
 		text-align: center;
 	}
 
-	.flower-icon-css {
-		width: 24upx;
-		height: 24upx;
+	.flower-icon {
+		font-size: 28upx;
 		margin-right: 8upx;
-		position: relative;
-
-		&::before {
-			content: '';
-			position: absolute;
-			width: 16upx;
-			height: 16upx;
-			background: #fff;
-			border-radius: 50%;
-			top: 4upx;
-			left: 4upx;
-			box-shadow: 
-				0 -8upx 0 -2upx #fff,
-				8upx -6upx 0 -2upx #fff,
-				8upx 6upx 0 -2upx #fff,
-				0 8upx 0 -2upx #fff,
-				-8upx 6upx 0 -2upx #fff,
-				-8upx -6upx 0 -2upx #fff;
-		}
-
-		&::after {
-			content: '';
-			position: absolute;
-			width: 8upx;
-			height: 8upx;
-			background: #ffeb3b;
-			border-radius: 50%;
-			top: 8upx;
-			left: 8upx;
-		}
+		line-height: 1;
+		display: flex;
+		align-items: center;
 	}
 
 	.btn-text {
@@ -641,7 +616,6 @@ page {
 		font-size: 28upx;
 		font-weight: bold;
 		text-shadow: 0 2upx 4upx rgba(0, 0, 0, 0.2);
-		margin-right: 8upx;
 		text-align: center;
 		line-height: 1;
 		display: flex;
@@ -651,18 +625,18 @@ page {
 
 .buy-material-btn {
 	position: relative;
-	background: linear-gradient(135deg, #4caf50, #66bb6a, #81c784);
+	background: linear-gradient(135deg, #ff6b6b 0%, #ee5a24 100%);
 	border: none;
 	border-radius: 50upx;
 	padding: 0;
 	height: 80upx;
-	min-width: 160upx;
-	box-shadow: 0 8upx 20upx rgba(76, 175, 80, 0.3);
+	min-width: 206upx;
+	flex: 0 0 auto;
+	box-shadow: 0 8upx 20upx rgba(255, 107, 107, 0.3);
 	overflow: hidden;
 
-
 	&:active {
-		box-shadow: 0 4upx 10upx rgba(76, 175, 80, 0.4);
+		box-shadow: 0 4upx 10upx rgba(255, 107, 107, 0.4);
 	}
 
 	.btn-content {
@@ -674,24 +648,35 @@ page {
 		z-index: 1;
 	}
 
+	.material-icon {
+		font-size: 28upx;
+		margin-right: 8upx;
+		line-height: 1;
+		display: flex;
+		align-items: center;
+	}
+
 	.btn-text {
 		color: white;
 		font-size: 28upx;
 		font-weight: bold;
 		text-shadow: 0 2upx 4upx rgba(0, 0, 0, 0.2);
-		margin: 0 8upx;
+		text-align: center;
+		line-height: 1;
+		display: flex;
+		align-items: center;
 	}
 }
 
-@keyframes pulse {
+@keyframes pulse-flower {
 	0% {
-		box-shadow: 0 8upx 20upx rgba(255, 107, 107, 0.3);
+		box-shadow: 0 8upx 20upx rgba(165, 94, 234, 0.3);
 	}
 	50% {
-		box-shadow: 0 12upx 30upx rgba(255, 107, 107, 0.4);
+		box-shadow: 0 12upx 30upx rgba(165, 94, 234, 0.4);
 	}
 	100% {
-		box-shadow: 0 8upx 20upx rgba(255, 107, 107, 0.3);
+		box-shadow: 0 8upx 20upx rgba(165, 94, 234, 0.3);
 	}
 }
 

+ 245 - 120
mallApp/src/pages/home/recent.vue

@@ -5,7 +5,7 @@
       <view class="login-container">
         <view class="login-content">
           <text class="login-title">欢迎使用</text>
-          <text class="login-subtitle">请先登录查看您的花店</text>
+          <text class="login-subtitle">登录查看您的花店</text>
           <button class="login-btn" @click="pageTo({url:'/pages/login/index?needBack=1'})">立即登录</button>
         </view>
       </view>
@@ -13,47 +13,63 @@
     
     <!-- 已登录状态 -->
     <block v-else>
-      <view class="main-content" v-if="!$util.isEmpty(list.data)">
+      <view class="main-content">
         <!-- 个人中心版块 -->
         <view class="profile-section">
-          <view class="profile-header" @click="">
+          <view class="profile-header">
             <view class="avatar-container">
-              <image class="avatar" src="/static/images/default-avatar.png" mode="aspectFill" />
+              <button class="avatar-button" open-type="chooseAvatar" @chooseavatar="onChooseAvatar">
+                <image class="avatar" :src="user.smallAvatar" mode="aspectFill" />
+              </button>
             </view>
-            <view class="user-info">
-              <text class="username">刘小明</text>
-              <text class="user-id">ID 31548</text>
+            <view class="user-info" @click="goEdit()">
+              <text class="username">{{ user.name }}</text>
+              <text class="user-id">ID {{ user.id }}</text>
             </view>
-            <view class="arrow-container">
+            <view class="arrow-container" @click="goEdit()">
               <text class="arrow-icon">〉</text>
             </view>
           </view>
           
-          <view class="function-grid">
-            <view class="function-item" @click="">
-              <text class="function-icon">📊</text>
-              <text class="function-text">统计</text>
-            </view>
-            <view class="function-item" @click="">
-              <text class="function-icon">📍</text>
-              <text class="function-text">地址</text>
-            </view>
-            <view class="function-item message-item" @click="">
-              <view class="icon-container">
+                     <view class="function-grid">
+             <view class="function-item" @click="">
+               <text class="function-icon">📊</text>
+               <text class="function-text">统计</text>
+             </view>
+             <view class="function-item" @click="setAddress">
+               <text class="function-icon">📍</text>
+               <text class="function-text">地址</text>
+             </view>
+                         <view class="function-item-wrapper">
+              <view class="function-item message-item" @click="">
                 <text class="function-icon">💬</text>
-                <view class="message-dot"></view>
+                <text class="function-text">新消息</text>
               </view>
-              <text class="function-text">新消息</text>
+              <view class="message-badge">9</view>
             </view>
-            <view class="function-item" @click="">
-              <text class="function-icon">📱</text>
-              <text class="function-text">改号码</text>
-            </view>
-          </view>
-        </view>
+             <view class="function-item" @click="">
+               <text class="function-icon">📱</text>
+               <text class="function-text">改号码</text>
+             </view>
+           </view>
+
+           <!-- 生日礼物提示横幅 -->
+           <view class="birthday-banner" @click="goToBirthday" v-if="Number(user.birthdayMonth)==0">
+             <view class="gift-icon-container">
+               <text class="gift-icon">🎁</text>
+             </view>
+             <view class="banner-text">
+               <text class="banner-title">填写生日,有机会领取生日小礼品</text>
+             </view>
+             <view class="banner-button">
+               <text class="button-text">填写</text>
+             </view>
+           </view>
+
+         </view>
         
         <!-- 花店列表 -->
-        <view class="shop-list">
+        <view class="shop-list" v-if="!$util.isEmpty(list.data)">
           <view class="shop-card" v-for="(item, index) in list.data" :key="item.id">
             <!-- 更多选项按钮 -->
             <view class="more-btn" @click.stop="showMoreOptions(index)">
@@ -95,7 +111,7 @@
               <view class="balance-item" @click.stop="recharge(item)" v-if="Number(item.balance) < 0">
                 <text class="balance-label">待结金额</text>
                 <text class="balance-amount negative">¥{{parseFloat(Math.abs(item.balance))}}</text>
-                <text class="balance-action">去结账</text>
+                <text class="balance-action-2">去结账</text>
               </view>
               <view class="balance-item" @click.stop="recharge(item)" v-if="item.balance > 0">
                 <text class="balance-label">可用余额</text>
@@ -134,14 +150,15 @@
             </view>
           </view>
         </view>
+
+        <view v-else class="empty-state">
+          <text class="empty-icon">🏪</text>
+          <text class="empty-title">暂无花店</text>
+          <text class="empty-subtitle">您还没有关联花店</text>
+        </view>
+
       </view>
-      
-      <!-- 空状态 -->
-      <view v-else class="empty-state">
-        <text class="empty-icon">🏪</text>
-        <text class="empty-title">暂无花店</text>
-        <text class="empty-subtitle">您还没有关联任何花店</text>
-      </view>
+
     </block>
   </view>
 </template>
@@ -154,8 +171,9 @@ import { getList } from "@/api/hd";
 import { share } from "@/mixins";
 import AppAvatarModule from "@/components/module/app-avatar";
 import { mapGetters } from 'vuex'
-import { clearLogin } from "@/api/user";
+import { currentInfo } from "@/api/user";
 import { list } from "@/mixins";
+import { APIHOST } from '@/config'
 export default {
   name: "recent",
   components: { AppAvatarModule, AppSwiper, TuiListView, TuiListCell, AppActivilyCoupon },
@@ -165,7 +183,8 @@ export default {
       //0没有登录 1有登录
       loginStyle :0,
       activePopupIndex: -1,
-      pageAction:{refresh:0}
+      pageAction:{refresh:0},
+      user:{name:'',smallAvatar:'',id:0}
     };
   },
   computed: {
@@ -186,13 +205,10 @@ export default {
       }else{
         this.loginStyle = 0
       }
-
       if(this.pageAction.refresh == 1){
-        this.resetList()
-        this.getMyHdList()
+        this.init()
         this.pageAction.refresh == 0
       }
-
   },
   onPullDownRefresh() {
     this.resetList()
@@ -220,25 +236,6 @@ export default {
         uni.stopPullDownRefresh()
       }
     },
-    logout(){
-      let that = this
-      that.$util.confirmModal({content:'确认退出?'},() => {
-        // #ifdef APP-PLUS
-        uni.clearStorage()
-        that.$store.commit("setLoginInfo", {})
-        plus.runtime.restart()
-        // #endif
-        // #ifdef MP-WEIXIN
-        clearLogin().then(res=>{
-          if(res.code == 1){
-            uni.clearStorage()
-            that.$store.commit("setLoginInfo", {})
-            uni.reLaunch({url:'/pages/home/recent'})
-          }
-        })
-        // #endif
-      })
-    },
     getSettleList(item){
       this.pageTo({ url:'/pages/settle/list?id='+item.id+'&account='+item.shopId})
     },
@@ -261,9 +258,20 @@ export default {
       this.pageTo({ url:'/pages/home/mall?id='+item.id+'&account='+item.shopId})
       //this.pageTo({ url:'/pages/goods/picGoods?id='+item.id+'&account='+item.shopId})
     },
+    setAddress(){
+      this.pageTo({ url:'/pages/user/address'})
+    },
     init () {
+      this.getLoginInfo()
       this.getMyHdList()
     },
+    getLoginInfo(){
+      currentInfo().then(res=>{
+        if(res.code == 1){
+          this.user = res.data.info?res.data.info:[]
+        }
+      })
+    },
     getMyHdList(){
       return getList({page: this.list.page}).then(res=>{
         this.completes(res);
@@ -289,6 +297,45 @@ export default {
     toRechargeClear(item) {
       this.hideMoreOptions()
       this.recharge(item)
+    },
+    goToBirthday() {
+      this.pageTo({ url: '/pages/user/birthday' })
+    },
+    goEdit(){
+      this.pageTo({ url: '/pages/user/edit' })
+    },
+    onChooseAvatar(e) {
+      if (e.detail.avatarUrl) {
+        this.user.smallAvatar = e.detail.avatarUrl
+        this.updateUserAvatar(e.detail.avatarUrl)
+      } else {
+        uni.showToast({
+          title: '获取头像失败',
+          icon: 'none'
+        })
+      }
+    },
+    updateUserAvatar(avatarUrl) {
+      let token = uni.getStorageSync('token') || ''
+      let url = APIHOST+'/upload/save-file?actType=saveAvatar'
+      uni.uploadFile({
+        url: url,
+        filePath: avatarUrl,
+        name: 'file',
+        header: {
+          'token': token
+        },
+        formData: {},
+        success: (res) => {
+          const ret = JSON.parse(res.data);
+          if (ret.code == 1) {
+            //无操作
+          } else {
+            uni.showToast({ title: ret.msg, icon: 'none' })
+          }
+        },
+        fail: () => uni.showToast({ title: '上传失败', icon: 'none' })
+      })
     }
   }
 };
@@ -309,8 +356,8 @@ page {
   display: flex;
   align-items: center;
   justify-content: center;
-  min-height: 100vh;
-  padding: 40upx;
+  min-height: 70vh;
+  padding: 0upx 40upx 40upx 40upx;
   
   .login-content {
     text-align: center;
@@ -325,24 +372,23 @@ page {
     
     .login-subtitle {
       display: block;
-      font-size: 28upx;
+      font-size: 34upx;
       color: #666;
       margin-bottom: 60upx;
     }
     
     .login-btn {
-      background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
+      background: linear-gradient(135deg, #ff6b6b 0%, #ee5a24 100%);
       color: white;
       border: none;
       border-radius: 50upx;
       padding: 24upx 60upx;
       font-size: 32upx;
       font-weight: 500;
-      box-shadow: 0 8upx 20upx rgba(102, 126, 234, 0.3);
+      box-shadow: 0 8upx 20upx rgba(255, 107, 107, 0.3);
       
       &:active {
-        transform: translateY(2upx);
-        box-shadow: 0 4upx 12upx rgba(102, 126, 234, 0.4);
+        box-shadow: 0 4upx 12upx rgba(255, 107, 107, 0.4);
       }
     }
   }
@@ -366,19 +412,34 @@ page {
     justify-content: flex-start;
     margin-bottom: 35upx;
     padding: 0 10upx;
-    cursor: pointer;
-    transition: all 0.2s ease;
     border-radius: 10upx;
     
-    &:active {
-      background: rgba(255, 255, 255, 0.1);
-      transform: scale(0.98);
-    }
-    
     .avatar-container {
       margin-right: 30upx;
       flex-shrink: 0;
       
+      .avatar-button {
+        background: none !important;
+        border: none !important;
+        padding: 0 !important;
+        margin: 0 !important;
+        line-height: 1;
+        display: block;
+        color: transparent !important;
+        
+        &::after {
+          border: none !important;
+        }
+        
+        /* &:active {
+          background: none !important;
+        } */
+        
+        &:focus {
+          background: none !important;
+        }
+      }
+      
       .avatar {
         width: 110upx;
         height: 110upx;
@@ -398,8 +459,8 @@ page {
       .username {
         display: block;
         color: #ffffff;
-        font-size: 44upx;
-        font-weight: 600;
+        font-size: 45upx;
+        font-weight: bold;
         margin-bottom: 8upx;
         text-shadow: 0 2upx 4upx rgba(0, 0, 0, 0.1);
         line-height: 1.2;
@@ -426,10 +487,9 @@ page {
       }
     }
     
-    &:active .arrow-icon {
+    /* &:active .arrow-icon {
       color: #ffffff;
-      transform: translateX(4upx);
-    }
+    } */
   }
   
   .function-grid {
@@ -440,12 +500,38 @@ page {
     padding: 0 10upx;
     gap: 15upx;
     
+    .function-item-wrapper {
+      position: relative;
+      width: calc(20% - 6upx);
+      
+      .message-badge {
+        position: absolute;
+        top: -15upx;
+        right: -15upx;
+        width: 42upx;
+        height: 42upx;
+        background: #ff4757;
+        border-radius: 21upx;
+        display: flex;
+        align-items: center;
+        justify-content: center;
+        color: #ffffff;
+        font-size: 22upx;
+        font-weight: bold;
+        box-shadow: 0 4upx 12upx rgba(255, 56, 56, 0.6);
+        z-index: 10;
+        text-shadow: 0 1upx 2upx rgba(0, 0, 0, 0.3);
+        line-height: 1;
+        min-width: 42upx;
+      }
+    }
+    
     .function-item {
       display: flex;
       flex-direction: column;
       align-items: center;
       justify-content: center;
-      width: calc(20% - 6upx);
+      width: 100%;
       height: 110upx;
       background: rgba(255, 255, 255, 0.15);
       border-radius: 15upx;
@@ -454,10 +540,9 @@ page {
       transition: all 0.2s ease;
       box-shadow: 0 2upx 8upx rgba(0, 0, 0, 0.1);
       
-      &:active {
-        transform: scale(0.95);
+      /* &:active {
         background: rgba(255, 255, 255, 0.25);
-      }
+      } */
       
       .function-icon {
         font-size: 44upx;
@@ -480,36 +565,71 @@ page {
           margin-top: 0;
         }
       }
+    }
+    
+    // 对于没有包装器的普通按钮,保持原来的宽度
+    > .function-item {
+      width: calc(20% - 6upx);
+    }
+  }
+  
+  // 生日礼物提示横幅
+  .birthday-banner {
+    display: flex;
+    align-items: center;
+    justify-content: space-between;
+    background: #fff5f5;
+    border-radius: 15upx;
+    padding: 20upx 24upx;
+    margin-top: 20upx;
+    border: 1upx solid #ffe4e4;
+    box-shadow: 0 2upx 8upx rgba(255, 182, 193, 0.2);
+    
+    .gift-icon-container {
+      width: 60upx;
+      height: 60upx;
+      background: #ff4757;
+      border-radius: 30upx;
+      display: flex;
+      align-items: center;
+      justify-content: center;
+      margin-right: 20upx;
+      flex-shrink: 0;
       
-      // 新消息按钮特殊样式
-      &.message-item {
-        .icon-container {
-          position: relative;
-          display: flex;
-          align-items: center;
-          justify-content: center;
-          margin-bottom: 8upx;
-          
-          .function-icon {
-            margin-bottom: 0;
-          }
-          
-          .message-dot {
-            position: absolute;
-            top: -5upx;
-            right: -10upx;
-            width: 24upx;
-            height: 24upx;
-            background: #ff3838;
-            border-radius: 12upx;
-            border: 3upx solid #ffffff;
-            box-shadow: 0 4upx 12upx rgba(255, 56, 56, 0.6), 0 0 0 4upx rgba(255, 56, 56, 0.2);
-            animation: pulse 1.5s infinite;
-            z-index: 10;
-          }
-        }
+      .gift-icon {
+        font-size: 32upx;
+        color: #ffffff;
       }
     }
+    
+    .banner-text {
+      flex: 1;
+      margin-right: 20upx;
+      
+      .banner-title {
+        font-size: 28upx;
+        color: #ff4757;
+        font-weight: 500;
+        line-height: 1.4;
+      }
+    }
+    
+    .banner-button {
+      background: #ff4757;
+      border-radius: 20upx;
+      padding: 12upx 24upx;
+      flex-shrink: 0;
+      
+      .button-text {
+        font-size: 26upx;
+        color: #ffffff;
+        font-weight: 600;
+      }
+    }
+    
+    /* &:active {
+      background: #fff0f0;
+    } */
   }
 }
 
@@ -606,7 +726,7 @@ page {
          }
          
          &.positive {
-           color: #2ed573;
+           color: #667eea;
          }
        }
        
@@ -616,6 +736,12 @@ page {
          text-decoration: underline;
          font-weight: bold;
        }
+       .balance-action-2{
+        font-size: 28upx;
+        color: #ff4757;
+        text-decoration: underline;
+        font-weight: bold;
+       }
     }
   }
   
@@ -632,10 +758,9 @@ page {
       box-shadow: 0 4upx 12upx rgba(0, 0, 0, 0.15);
       transition: all 0.2s ease;
       
-      &:active {
-        transform: translateY(2upx);
+      /* &:active {
         box-shadow: 0 2upx 8upx rgba(0, 0, 0, 0.2);
-      }
+      } */
       
       &.primary {
         background: linear-gradient(135deg, #ff6b6b 0%, #ee5a24 100%);
@@ -672,9 +797,9 @@ page {
       text-align: center;
       border: 1upx solid #e9ecef;
       
-      &:active {
+      /* &:active {
         background: #e9ecef;
-      }
+      } */
       
       .record-text {
         font-size: 26upx;
@@ -724,9 +849,9 @@ page {
         border-bottom: none;
       }
       
-      &:active {
+      /* &:active {
         background-color: #f8f9fa;
-      }
+      } */
       
       &.cancel {
         color: #999;
@@ -734,7 +859,7 @@ page {
       
       text {
         color: #333;
-        font-size: 32upx;
+        font-size: 36upx;
         font-weight: 500;
       }
     }

+ 26 - 57
mallApp/src/pages/item/item.vue

@@ -15,16 +15,14 @@
 				<app-search-module v-model="py" placeholder="这里搜索" @input="searchFn" />
 			</view>
 			<view class="buy-flower-container">
-				<button class="buy-flower-btn" @click="buyAlbum()">
+				<button class="buy-album-btn" @click="buyAlbum()">
 					<view class="btn-content">
-						<view class="flower-icon-css"></view>
-						<text class="btn-text">花束相册</text>
+						<text class="btn-text">📷 花束相册</text>
 					</view>
 				</button>
-				<button class="buy-flower-btn" @click="buyHs()">
+				<button class="buy-mall-btn" @click="buyHs()">
 					<view class="btn-content">
-						<view class="flower-icon-css"></view>
-						<text class="btn-text">花束商城</text>
+						<text class="btn-text">💐 花束商城</text>
 					</view>
 				</button>
 			</view>
@@ -569,20 +567,35 @@ export default {
 		gap: 10upx;
 	}
 
-	.buy-flower-btn {
+	.buy-album-btn {
 		position: relative;
-		background: linear-gradient(135deg, #ff6b6b, #ff8e8e, #ffa8a8);
+		background: #e91e63;
 		border: none;
 		border-radius: 50upx;
 		padding: 0;
 		height: 80upx;
 		min-width: 200upx;
-		box-shadow: 0 8upx 20upx rgba(255, 107, 107, 0.3);
+		box-shadow: 0 8upx 20upx rgba(233, 30, 99, 0.3);
 		overflow: hidden;
-		animation: pulse 2s infinite;
 
 		&:active {
-			box-shadow: 0 4upx 10upx rgba(255, 107, 107, 0.4);
+			box-shadow: 0 4upx 10upx rgba(233, 30, 99, 0.4);
+		}
+	}
+
+	.buy-mall-btn {
+		position: relative;
+		background: linear-gradient(135deg, #a55eea 0%, #8e44ad 100%);
+		border: none;
+		border-radius: 50upx;
+		padding: 0;
+		height: 80upx;
+		min-width: 200upx;
+		box-shadow: 0 8upx 20upx rgba(165, 94, 234, 0.3);
+		overflow: hidden;
+
+		&:active {
+			box-shadow: 0 4upx 10upx rgba(165, 94, 234, 0.4);
 		}
 	}
 
@@ -596,52 +609,18 @@ export default {
 		text-align: center;
 	}
 
-	.flower-icon-css {
-		width: 24upx;
-		height: 24upx;
-		margin-right: 8upx;
-		position: relative;
-
-		&::before {
-			content: '';
-			position: absolute;
-			width: 16upx;
-			height: 16upx;
-			background: #fff;
-			border-radius: 50%;
-			top: 4upx;
-			left: 4upx;
-			box-shadow: 
-				0 -8upx 0 -2upx #fff,
-				8upx -6upx 0 -2upx #fff,
-				8upx 6upx 0 -2upx #fff,
-				0 8upx 0 -2upx #fff,
-				-8upx 6upx 0 -2upx #fff,
-				-8upx -6upx 0 -2upx #fff;
-		}
 
-		&::after {
-			content: '';
-			position: absolute;
-			width: 8upx;
-			height: 8upx;
-			background: #ffeb3b;
-			border-radius: 50%;
-			top: 8upx;
-			left: 8upx;
-		}
-	}
 
 	.btn-text {
 		color: white;
 		font-size: 28upx;
 		font-weight: bold;
 		text-shadow: 0 2upx 4upx rgba(0, 0, 0, 0.2);
-		margin-right: 8upx;
 		text-align: center;
 		line-height: 1;
 		display: flex;
 		align-items: center;
+		justify-content: center;
 	}
 
 	.sparkle-css {
@@ -673,17 +652,7 @@ export default {
 		}
 	}
 
-	@keyframes pulse {
-		0% {
-			box-shadow: 0 8upx 20upx rgba(255, 107, 107, 0.3);
-		}
-		50% {
-			box-shadow: 0 12upx 30upx rgba(255, 107, 107, 0.4);
-		}
-		100% {
-			box-shadow: 0 8upx 20upx rgba(255, 107, 107, 0.3);
-		}
-	}
+
 
 
 

+ 59 - 55
mallApp/src/pages/user/modify.vue → mallApp/src/pages/user/address.vue

@@ -1,11 +1,7 @@
 <template>
 	<view class="app-content">
-		<form @submit="formSubmit" @reset="formReset">
+		<form @submit="formSubmit">
 			<view class="module-com input-line-wrap">
-				<tui-list-cell class="line-cell" :hover="false">
-					<view class="tui-title">名称</view>
-					<input v-model="form.name" placeholder-class="phcolor" class="tui-input" name="name" placeholder="请输入名称" maxlength="50" type="text" />
-				</tui-list-cell>
 				<tui-list-cell class="line-cell" :hover="false" :arrow="true" @click="openAddres">
 					<view class="tui-title">城市</view>
 					<view class="tui-input" v-if="form.province || form.city">{{ form.province + '-' + form.city }}</view>
@@ -27,14 +23,14 @@
 					<input v-model="form.floor" placeholder-class="phcolor" class="tui-input" name="floor" placeholder="楼号门牌号(选填)" @input="modifyShow" />
 				</tui-list-cell>
 			</view>
-			<view class="confirm-btn">
-				<button class="admin-button-com big blue" formType="submit">修改</button>
+			<view style="text-align: center;">
+				<button class="admin-button-com big blue" style="width:84%;" formType="submit">修改</button>
 			</view>
 		</form>
 		<!-- 省市联动 -->
 		<simple-address ref="simpleAddress" :pickerValueDefault="cityPickerValueDefault" @onConfirm="onCityConfirm"></simple-address>
 		<!-- 选择地区 -->
-		<app-area-sel :show.sync="showRegion" :city="form.city" @change="changeAreaFn" />
+		<app-area-sel :show.sync="showRegion" :city="form.city" @change="changeAreaFn" :isFocus="false" />
 	</view>
 </template>
 <script>
@@ -42,10 +38,9 @@ import TuiListCell from '@/components/plugin/list-cell'
 import SimpleAddress from '@/components/plugin/simple-address'
 import AppAreaSel from '@/components/app-area-sel'
 const form = require('@/utils/formValidation.js')
-import {mapActions} from "vuex";
 import {currentInfo,updateInfo} from "@/api/user"
 export default {
-	name: 'modify',
+	name: 'address',
 	components: {
 		TuiListCell,
 		SimpleAddress,
@@ -54,7 +49,6 @@ export default {
 	data() {
 		return {
 			form: {
-				name: '',
 				province: '',
 				city: '',
 				address: '',
@@ -71,8 +65,7 @@ export default {
 			hasMap:0 // 是否具备定位功能 0不具备 1具备
 		}
 	},
-	onLoad(options) {
-		this.hasMap = options.hasMap || 0
+	onLoad() {
 		this.getUserInfo()
 	},
 	methods: {
@@ -90,6 +83,7 @@ export default {
                 })
                 this.region.lat = data.lat
                 this.region.long = data.long
+				this.hasMap = res.data.info.hasMap||0
             })
 		},
 		selectRegion() {
@@ -134,11 +128,6 @@ export default {
 		},
 		formSubmit(e) {
 			let rules = [
-				{
-					name: 'name',
-					rule: ['required'],
-					msg: ['请输入名称']
-				},
 				{
 					name: 'province',
 					rule: ['required'],
@@ -161,49 +150,64 @@ export default {
 	}
 }
 </script>
-
 <style lang="scss" scoped>
-	.app-content {
-		min-height: calc(100vh - 20upx);
-		padding-top: 20upx;
-		padding-bottom:130upx;
-	}
-	.prompt-text {
-		color: $fontColor3;
-		padding-left: 30upx;
-		margin-bottom: 30upx;
-	}
-	.module-com {
-		margin-bottom: 20upx;
-		  background-color: #fff;
-		.member-wrap {
-			.member-det {
-				font-size: 24upx;
-				margin-left: 20upx;
-			}
+.app-content {
+	min-height: calc(100vh - 20upx);
+	padding-top: 20upx;
+	padding-bottom:130upx;
+}
+.prompt-text {
+	color: $fontColor3;
+	padding-left: 30upx;
+	margin-bottom: 30upx;
+}
+.module-com {
+	margin-bottom: 20upx;
+		background-color: #fff;
+	// 参考edit.vue的样式,增加文字和input高度
+	.line-cell {
+		.tui-title {
+			width: 210upx;
+			color: $fontColor2;
+			line-height: 80upx;
+			font-size: 30upx;
 		}
-		.remark-wrap {
-			align-items: flex-start;
-			.remark {
-				height: 100upx;
-			}
+		.tui-input {
+			width: calc(100% - 210upx);
+			font-size: 30upx;
+			min-height: 80upx;
+			padding: 20upx;
+		}
+		.tui-placeholder {
+			color: #ccc;
+			font-size: 30upx;
+			min-height: 80upx;
+			padding: 20upx;
+			display: flex;
+			align-items: center;
 		}
-		.module-tit {
-			padding: 20upx 30upx;
-			font-size: 28upx;
+		.phcolor {
+			color: #ccc;
 		}
-		.module-det {
-			padding: 0 30upx;
+	}
+	.member-wrap {
+		.member-det {
+			font-size: 24upx;
+			margin-left: 20upx;
 		}
 	}
-	.confirm-btn {
-		position:fixed;
-		bottom:0upx;
-		width: calc(100% - 60upx);
-		margin: 60upx 30upx 0upx;
-		z-index:99;
-		.admin-button-com {
-			width: 100%;
+	.remark-wrap {
+		align-items: flex-start;
+		.remark {
+			height: 100upx;
 		}
 	}
+	.module-tit {
+		padding: 20upx 30upx;
+		font-size: 28upx;
+	}
+	.module-det {
+		padding: 0 30upx;
+	}
+}
 </style>

+ 288 - 0
mallApp/src/pages/user/birthday.vue

@@ -0,0 +1,288 @@
+<template>
+  <view class="birthday-page">
+    <div class="birthday-container">
+      <!-- 类型选择 -->
+      <div class="birthday-section">
+        <div class="section-title">类型</div>
+        <div class="type-buttons">
+          <button 
+            class="admin-button-com middle" 
+            :class="[lunar == 0 ? 'blue' : 'default']" 
+            @click="lunar = 0"
+          >公历</button>
+          <button 
+            class="admin-button-com middle" 
+            :class="[lunar == 1 ? 'blue' : 'default']" 
+            @click="lunar = 1"
+          >农历</button>
+        </div>
+      </div>
+      
+      <!-- 月份选择 -->
+      <div class="birthday-section">
+        <div class="section-title">月份</div>
+        <div class="month-buttons">
+          <button 
+            v-for="(month, index) in [1,2,3,4,5,6,7,8,9,10,11,12]" 
+            :key="index" 
+            class="month-button" 
+            :class="{ active: birthdayMonth == month }"
+            @click="birthdayMonth = month"
+          >{{ month }}</button>
+        </div>
+      </div>
+      
+      <!-- 日期选择 (数字按钮形式) -->
+      <div class="birthday-section">
+        <div class="section-title">日期</div>
+        <div class="date-buttons-container">
+          <!-- 使用固定高度的容器和绝对定位的滚动视图 -->
+          <view class="date-buttons-wrapper">
+            <scroll-view 
+              scroll-y="true" 
+              class="date-buttons-scroll" 
+              enhanced="true"
+              show-scrollbar="true"
+              always-bounce-vertical="true"
+            >
+              <div class="date-buttons">
+                <button 
+                  v-for="(date, index) in dateArray" 
+                  :key="index"
+                  class="date-button" 
+                  :class="{ active: birthdayDate == date }"
+                  @click="birthdayDate = date"
+                >{{ date }}</button>
+              </div>
+            </scroll-view>
+          </view>
+        </div>
+      </div>
+
+      <!-- 操作按钮 -->
+      <div class="action-buttons">
+        <button class="admin-button-com middle default" @click="cancel">取消</button>
+        <button class="admin-button-com middle blue" @click="confirm">确认</button>
+      </div>
+    </div>
+  </view>
+</template>
+<script>
+import { modifyBirthday } from "@/api/user"
+export default {
+  name: 'birthday',
+  components: {
+  },
+  data() {
+    return {
+      lunar: 0, // 0公历 1农历
+      birthdayMonth: '', // 选择的月份
+      birthdayDate: '', // 选择的日期
+      dateArray: Array.from({length: 31}, (_, i) => i + 1), // 1-31的数组
+    }
+  },
+  onLoad() {
+      //返回上一页时刷新
+      let pages = getCurrentPages();
+      let prevPage = pages[ pages.length - 2 ];
+      prevPage.$vm.pageAction = {refresh:1}
+  },
+  methods: {
+	init(){
+	},
+    cancel() {
+      // 取消操作
+      uni.navigateBack();
+    },
+    confirm() {
+      // 确认操作
+      if (!this.birthdayMonth || !this.birthdayDate) {
+        uni.showToast({
+          title: '请选择月份和日期',
+          icon: 'none'
+        });
+        return;
+      }
+      // 返回选中的数据
+      const params = {
+        lunar: this.lunar,
+        birthdayMonth: this.birthdayMonth,
+        birthdayDate: this.birthdayDate
+      };
+		this.$util.confirmModal({content:'确认修改?提交后将不能再修改'},() => {
+			modifyBirthday(params).then(res=>{
+				if(res.code == 1){
+					this.$msg('已修改')
+					setTimeout(() => {
+						uni.navigateBack()
+					}, 900);
+				}
+			})
+		})
+    }
+  }
+}
+</script>
+<style lang="scss" scoped>
+.birthday-page {
+  padding: 30upx;
+  background: #fff;
+  min-height: 100vh;
+}
+
+.birthday-container {
+  width: 100%;
+}
+
+.birthday-section {
+  margin-bottom: 30upx;
+  
+  &:last-child {
+    margin-bottom: 0;
+  }
+  
+  .section-title {
+    font-size: 32upx;
+    color: #333;
+    margin-bottom: 20upx;
+    font-weight: 500;
+  }
+  
+  .type-buttons {
+    display: flex;
+    gap: 20upx;
+    
+    button {
+      flex: 1;
+    }
+  }
+  
+  .month-buttons {
+    display: flex;
+    flex-wrap: wrap;
+    gap: 10upx;
+  }
+  
+  .month-button {
+    width: calc(25% - 10upx);
+    height: 80upx;
+    display: flex;
+    align-items: center;
+    justify-content: center;
+    background: #f8f9fa;
+    border: 2upx solid #e9ecef;
+    border-radius: 8upx;
+    font-size: 30upx;
+    color: #333;
+    margin-bottom: 10upx;
+    
+    &.active {
+      background: #e8f5ff;
+      border-color: #3385FF;
+      color: #3385FF;
+      font-weight: 500;
+    }
+    
+    &:active {
+      background: #e8f5ff;
+    }
+  }
+  
+  .date-buttons-container {
+    width: 100%;
+  }
+  
+  .date-buttons-wrapper {
+    width: 100%;
+    height: 340upx; /* 固定高度,显示4行 */
+    background: #f8f9fa;
+    border: 2upx solid #e9ecef;
+    border-radius: 8upx;
+    position: relative;
+    overflow: hidden;
+  }
+  
+  .date-buttons-scroll {
+    width: 100%;
+    height: 100%;
+    padding: 10upx;
+    box-sizing: border-box;
+  }
+  
+  .date-buttons {
+    display: flex;
+    flex-wrap: wrap;
+    gap: 10upx;
+  }
+  
+  .date-button {
+    width: calc(25% - 8upx);
+    height: 80upx;
+    display: flex;
+    align-items: center;
+    justify-content: center;
+    background: #ffffff;
+    border: 2upx solid #e9ecef;
+    border-radius: 8upx;
+    font-size: 30upx;
+    color: #333;
+    margin-bottom: 10upx;
+    box-sizing: border-box;
+    
+    &.active {
+      background: #e8f5ff;
+      border-color: #3385FF;
+      color: #3385FF;
+      font-weight: 500;
+    }
+    
+    &:active {
+      background: #e8f5ff;
+    }
+  }
+}
+
+.action-buttons {
+  margin-top: 50upx;
+  display: flex;
+  gap: 20upx;
+  padding: 0 20upx;
+  
+  button {
+    flex: 1;
+  }
+}
+
+/* 按钮基础样式 */
+.admin-button-com {
+  height: 80upx;
+  border-radius: 8upx;
+  font-size: 32upx;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  border: none;
+  outline: none;
+  
+  &.middle {
+    height: 80upx;
+    font-size: 30upx;
+  }
+  
+  &.default {
+    background: #f8f9fa;
+    color: #333;
+    border: 2upx solid #e9ecef;
+  }
+  
+  &.blue {
+    background: #3385FF;
+    color: #fff;
+    border: 2upx solid #3385FF;
+  }
+  
+  &:active {
+    opacity: 0.8;
+  }
+}
+</style>

+ 175 - 0
mallApp/src/pages/user/edit.vue

@@ -0,0 +1,175 @@
+<template>
+	<div class="app-content">
+		<form @submit="formSubmit">
+			<div class="module-com input-line-wrap">
+				<tui-list-cell class="line-cell" :hover="false">
+					<div class="tui-title">昵称</div>
+					<input v-model="form.name" placeholder-class="phcolor" class="tui-input" name="name" placeholder="请填写" type="nickname" />
+				</tui-list-cell>
+				<tui-list-cell class="line-cell" :hover="false">
+					<div class="tui-title">生日</div>
+
+					<div class="birthday-display" v-if="Number(userInfo.birthdayMonth)>0">
+					{{ userInfo.lunar==1?"农历 ":"" }}{{ userInfo.birthdayMonth }}月{{ userInfo.birthdayDate }}日
+					<text @click="goToBirthday()" style="color:#007aff;margin-left:20upx;">修改</text>
+					</div>
+					<div class="birthday-display" v-else>
+						<text @click="goToBirthday()" style="color:#007aff;">去设置</text>
+					</div>
+
+				</tui-list-cell>
+				<div class="btn-wrap">
+					<button class="button-com red big" formType="submit">确认</button>
+				</div>
+				<div class="btn-wrap">
+					<button class="button-com default big" @click="logout">退出登录</button>
+				</div>
+			</div>
+		</form>
+	</div>
+</template>
+<script>
+import TuiListCell from '@/components/plugin/list-cell'
+const form = require('@/utils/formValidation.js')
+import { currentInfo,updateInfo,clearLogin } from "@/api/user";
+export default {
+	name: 'edit',
+	components: {
+		TuiListCell
+	},
+	data() {
+		return {
+			form: {
+				name: ''
+			},
+			userInfo:{}
+		}
+	},
+	onLoad() {
+      //返回上一页时刷新
+      let pages = getCurrentPages();
+      let prevPage = pages[ pages.length - 2 ];
+      prevPage.$vm.pageAction = {refresh:1}
+	},
+	methods: {
+		logout(){
+			let that = this
+			that.$util.confirmModal({content:'确认退出?'},() => {
+				// #ifdef APP-PLUS
+				uni.clearStorage()
+				that.$store.commit("setLoginInfo", {})
+				plus.runtime.restart()
+				// #endif
+				// #ifdef MP-WEIXIN
+				clearLogin().then(res=>{
+					if(res.code == 1){
+						uni.clearStorage()
+						that.$store.commit("setLoginInfo", {})
+						uni.reLaunch({url:'/pages/home/recent'})
+					}
+				})
+				// #endif
+			})
+		},
+		init(){
+			this.getLoginInfo();
+		},
+		getLoginInfo(){
+			currentInfo().then(res=>{
+				if(res.code == 1){
+					this.userInfo = res.data.info?res.data.info:[]
+				}
+			})
+		},
+		goToBirthday() {
+			this.pageTo({ url: '/pages/user/birthday',type:2 })
+		},
+		formSubmit(e) {
+			// 表单规则
+			let rules = [
+				{
+					name: 'name',
+					rule: ['required'],
+					msg: ['请输入昵称']
+				}
+			]
+			// 进行表单检查
+			let formData = e.detail.value
+			let checkRes = form.validation(formData, rules)
+			// 验证通过!
+			if (!checkRes) {
+				setTimeout(() => {
+					this.confirmFn()
+				})
+			} else {
+				this.$msg(checkRes)
+			}
+		},
+		formSubmit(){
+			updateInfo(this.form).then(res=>{
+				if(res.code == 1){
+					this.$msg('已修改')
+					setTimeout(() => {
+						uni.navigateBack({})
+					}, 1000);
+				}
+			})
+		}
+	}
+}
+</script>
+<style lang="scss" scoped>
+	// 公共
+	.line-cell {
+		.tui-title {
+			width: 210upx;
+			color: $fontColor2;
+			line-height: 80upx;
+		}
+		.tui-input {
+			width: calc(100% - 210upx);
+			font-size: 28upx;
+			min-height: 80upx;
+			padding: 20upx;
+		}
+		.tui-placeholder {
+			color: #ccc;
+		}
+		.phcolor {
+			color: #ccc;
+		}
+		.birthday-display {
+			min-height: 80upx;
+			padding: 20upx;
+			display: flex;
+			align-items: center;
+			font-size: 28upx;
+		}
+	}
+	.btn-wrap {
+		width: 90%;
+		margin: 60upx auto;
+		.button-com {
+			width: 100%;
+			margin: 0 auto;
+			min-height: 100upx;
+			padding: 30upx;
+			font-size: 32upx;
+			display: flex;
+			align-items: center;
+			justify-content: center;
+		}
+	}
+	.code-wrap {
+		.tui-input {
+			width: calc(100% - 410upx);
+			font-size: 28upx;
+		}
+		.tui-code {
+			width: 200upx;
+			text-align: center;
+			border-left: 1upx solid $borderColor;
+			color: $mainColor;
+		}
+	}
+</style>

+ 2 - 1
开发http/hdApp/src/config.js

@@ -2,4 +2,5 @@ export const ProjectName = 'hd'
 export const APIHOST = 'http://api.shop.huaml.com'
 export const FORMALHOST = 'http://shop.huaml.com'
 export const IMGHOST = 'http://img.huaml.com'
-export const CURRENT_ENV = 'dev'
+export const CURRENT_ENV = 'dev'
+export const WSSHOST = 'wss://chat.shop.huaml.com'

+ 2 - 1
开发http/mallApp/src/config.js

@@ -1,3 +1,4 @@
 export const ProjectName = 'mall'
 export const CURRENT_ENV = 'dev'
-export const APIHOST = 'http://api.shop.theflorist.cn'
+export const APIHOST = 'http://api.shop.theflorist.cn'
+export const WSSHOST = 'wss://chat.shop.huaml.com'

+ 2 - 1
开发https/hdApp/src/config.js

@@ -2,4 +2,5 @@ export const ProjectName = 'hd'
 export const APIHOST = 'https://api.shop.huaml.com'
 export const FORMALHOST = 'https://shop.huaml.com'
 export const IMGHOST = 'https://img.huaml.com'
-export const CURRENT_ENV = 'dev'
+export const CURRENT_ENV = 'dev'
+export const WSSHOST = 'wss://chat.shop.huaml.com'

+ 2 - 1
开发https/mallApp/src/config.js

@@ -1,3 +1,4 @@
 export const ProjectName = 'mall'
 export const CURRENT_ENV = 'dev'
-export const APIHOST = 'https://api.shop.theflorist.cn'
+export const APIHOST = 'https://api.shop.theflorist.cn'
+export const WSSHOST = 'wss://chat.shop.huaml.com'

+ 2 - 1
线上/hdApp/src/config.js

@@ -2,4 +2,5 @@ export const ProjectName = 'hd'
 export const APIHOST = 'https://api.shop.huahb.cn'
 export const FORMALHOST = 'https://shop.huahb.cn'
 export const IMGHOST = 'https://img.huahb.cn'
-export const CURRENT_ENV = 'production'
+export const CURRENT_ENV = 'production'
+export const WSSHOST = 'wss://chat.shop.huahb.cn'

+ 2 - 1
线上/mallApp/src/config.js

@@ -1,3 +1,4 @@
 export const ProjectName = 'mall'
 export const CURRENT_ENV = 'production'
-export const APIHOST = 'https://api.shop.zhiguanhua.cn'
+export const APIHOST = 'https://api.shop.zhiguanhua.cn'
+export const WSSHOST = 'wss://chat.shop.huahb.cn'