htc преди 6 дни
родител
ревизия
568c194487
променени са 94 файла, в които са добавени 2706 реда и са изтрити 1269 реда
  1. 7 10
      App.vue
  2. 12 12
      components/CusTabbar/index.vue
  3. 99 0
      components/bindDevice/index.vue
  4. 3 0
      manifest.json
  5. 98 27
      pages.json
  6. 0 184
      pages/agentCreate.vue
  7. 0 173
      pages/agentDetail.vue
  8. 0 72
      pages/code.vue
  9. 0 115
      pages/device.vue
  10. 206 228
      pages/home.vue
  11. 53 17
      pages/login.vue
  12. 153 0
      pages/my.vue
  13. 221 0
      pages/role.vue
  14. 0 189
      pages/roleSet.vue
  15. 0 118
      pages/wifi - 副本.vue
  16. 0 99
      pages/wifi.vue
  17. 69 0
      pagesHome/wifiSetMemo1.vue
  18. 68 0
      pagesHome/wifiSetMemo2.vue
  19. 68 0
      pagesHome/wifiSetMemo3.vue
  20. 68 0
      pagesHome/wifiSetMemo4.vue
  21. 249 0
      pagesMy/device.vue
  22. 161 0
      pagesMy/deviceAdd.vue
  23. 220 0
      pagesMy/feedback.vue
  24. 70 0
      pagesMy/scanResult.vue
  25. 22 0
      pagesMy/useBook.vue
  26. 232 0
      pagesMy/wifi.vue
  27. 115 25
      pages/wifiSet.vue
  28. 91 0
      pagesMy/wifiSuccess.vue
  29. 296 0
      pagesRole/addRole.vue
  30. 125 0
      pagesRole/roleModel.vue
  31. BIN
      static/add.png
  32. BIN
      static/ai_shape.png
  33. BIN
      static/arrow_right.png
  34. BIN
      static/avatar_big.png
  35. BIN
      static/avatar_default.png
  36. BIN
      static/bind.png
  37. BIN
      static/box_bg1.png
  38. BIN
      static/box_bg2.png
  39. BIN
      static/change.png
  40. BIN
      static/change2.png
  41. BIN
      static/device_add_bg.png
  42. BIN
      static/device_gl.png
  43. BIN
      static/device_mini.png
  44. BIN
      static/device_next.png
  45. BIN
      static/device_query.png
  46. BIN
      static/device_scan.png
  47. BIN
      static/device_wifi.png
  48. BIN
      static/edit_mini.png
  49. BIN
      static/empty_device.png
  50. BIN
      static/feedback_bg.png
  51. BIN
      static/home_active.png
  52. BIN
      static/home_inactive.png
  53. BIN
      static/home_topbg.png
  54. BIN
      static/info_mini.png
  55. BIN
      static/login_top.png
  56. BIN
      static/my_active.png
  57. BIN
      static/my_avatat_default.png
  58. BIN
      static/my_book.png
  59. BIN
      static/my_device.png
  60. BIN
      static/my_inactive.png
  61. BIN
      static/my_topbg.png
  62. BIN
      static/my_version.png
  63. BIN
      static/myu_idea.png
  64. BIN
      static/offline_mini.png
  65. BIN
      static/online_mini.png
  66. BIN
      static/query_mini.png
  67. BIN
      static/role_active.png
  68. BIN
      static/role_avatar0.png
  69. 0 0
      static/role_avatar1.png
  70. BIN
      static/role_avatar2.png
  71. BIN
      static/role_inactive.png
  72. BIN
      static/role_upload.png
  73. BIN
      static/scan_bind.png
  74. BIN
      static/scan_result.png
  75. BIN
      static/selected.png
  76. BIN
      static/selected_dh.png
  77. BIN
      static/selected_not.png
  78. BIN
      static/set_dian1.png
  79. BIN
      static/set_dian2.png
  80. BIN
      static/set_dian3.png
  81. BIN
      static/set_dian4.png
  82. BIN
      static/top_bg.png
  83. BIN
      static/top_boxbg.png
  84. BIN
      static/upload.png
  85. BIN
      static/upload_add.png
  86. BIN
      static/user_set.png
  87. BIN
      static/wifi_bind.png
  88. BIN
      static/wifi_off_mini.png
  89. BIN
      static/wifi_on_mini.png
  90. BIN
      static/wifi_set1.png
  91. BIN
      static/wifi_set2.png
  92. BIN
      static/wifi_set3.png
  93. BIN
      static/wifi_set4.png
  94. BIN
      static/wifi_success.png

+ 7 - 10
App.vue

@@ -9,13 +9,10 @@
 			
 		},
 		onLaunch: function() {
-			
 		},
 		onShow: function() {
-
 		},
 		onHide: function() {
-			
 		}
 	}
 </script>
@@ -118,27 +115,27 @@
 	}
 	.zt_btn{
 		width: 100%;
-		height: 88rpx;
-		background: #0066FE;
+		height: 90rpx;
+		background: #D9F159;
 		border-radius: 24rpx;
 		font-family: PingFangSC, PingFang SC;
-		font-weight: 400;
+		font-weight: bold;
 		font-size: 32rpx;
-		color: #FFFFFF;
-		line-height: 88rpx;
+		color: #111111;
+		line-height: 90rpx;
 		text-align: center;
 		letter-spacing: 2rpx;
 	}
 	.qx_btn{
 		width: 100%;
-		height: 88rpx;
+		height: 90rpx;
 		background: #FAFAFA;
 		border-radius: 24rpx;
 		font-family: PingFangSC, PingFang SC;
 		font-weight: 400;
 		font-size: 32rpx;
 		color: #393939;
-		line-height: 88rpx;
+		line-height: 90rpx;
 		text-align: center;
 		letter-spacing: 2rpx;
 	}

+ 12 - 12
components/CusTabbar/index.vue

@@ -17,20 +17,20 @@
 				tabbarValue: 0,
 				list: [
 					{
-						inactiveImg: require('@/static/tab_qa.png'),
-						activeImg: require('@/static/tab_qa_active.png'),
-						text: '问答',
-						path: '/pages/dialog'
+						inactiveImg: require('@/static/home_inactive.png'),
+						activeImg: require('@/static/home_active.png'),
+						text: '首页',
+						path: '/pages/home'
 					},
 					{
-						inactiveImg: require('@/static/tab_wj.png'),
-						activeImg: require('@/static/tab_wj_active.png'),
-						text: '问卷',
-						path: '/pages/questionnaire'
+						inactiveImg: require('@/static/role_inactive.png'),
+						activeImg: require('@/static/role_active.png'),
+						text: '角色',
+						path: '/pages/role'
 					},
 					{
-						inactiveImg: require('@/static/tab_my.png'),
-						activeImg: require('@/static/tab_my_active.png'),
+						inactiveImg: require('@/static/my_inactive.png'),
+						activeImg: require('@/static/my_active.png'),
 						text: '我的',
 						path: '/pages/my'
 					}
@@ -83,12 +83,12 @@
 				font-family: PingFangSC, PingFang SC;
 				font-weight: 400;
 				font-size: 22rpx;
-				color: #808080;
+				color: #7C8592;
 				line-height: 22rpx;
 				text-align: center;
 				&.active{
 					font-weight: bold;
-					color: #761E6A;
+					color: #111111;
 				}
 			}
 		}

+ 99 - 0
components/bindDevice/index.vue

@@ -0,0 +1,99 @@
+<template>
+	<u-popup :show="show" :round="36" mode="bottom" @close="close">
+		<view class="bind_device">
+			<div class="top adfacjb">
+				<div class="pre adffcacjc" @tap="scanBind">
+					<image src="@/static/scan_bind.png"></image>
+					<text>扫码绑定设备</text>
+				</div>
+				<div class="pre adffcacjc" @tap="wifiBind">
+					<image src="@/static/wifi_bind.png"></image>
+					<text>配网并绑定设备</text>
+				</div>
+			</div>
+			<div class="close">
+				<u-icon name="close" color="#5C5C5C" size="50" @tap="close"></u-icon>
+			</div>
+		</view>
+	</u-popup>
+</template>
+
+<script>
+	export default {
+		data(){
+			return {
+				show:false
+			}
+		},
+		methods:{
+			close(){
+				this.show = false;
+			},
+			scanBind(){
+				this.show = false;
+				let that = this;
+				uni.scanCode({
+					success: (res) => {
+						let result = JSON.parse(res.result);
+						if(res.errMsg==='scanCode:ok'){
+							that.$api.post('/device/bindAdd',{
+								...result,
+								"type": "",
+								"userId": 0,
+								"agentId": ""
+							}).then(res=>{
+								if(res.data.code!==0) return that.$showToast(res.data.msg)
+								that.$showToast('绑定成功')
+								setTimeout(()=>{
+									that.show = false;
+									uni.reLaunch({
+										url:'/pages/home'
+									})
+								},1500)
+							})
+						}
+					}
+				})
+			},
+			wifiBind(){
+				this.show = false;
+				uni.navigateTo({
+					url:'/pagesMy/deviceAdd'
+				})
+			},
+		}
+	}
+</script>
+
+<style scoped lang="less">
+	.bind_device{
+		width: 100%;
+		padding: 74rpx 74rpx 20rpx;
+		box-sizing: border-box;
+		.top{
+			.pre{
+				width: calc(50% - 51rpx);
+				image{
+					width: 110rpx;
+					height: 110rpx;
+				}
+				text{
+					font-family: PingFangSC, PingFang SC;
+					font-weight: 400;
+					font-size: 28rpx;
+					color: #111111;
+					line-height: 32rpx;
+					text-align: center;
+					margin-top: 24rpx;
+				}
+			}
+		}
+		.close{
+			width: 100%;
+			margin-top: 113rpx;
+			display: flex;
+			align-items: center;
+			justify-content: center;
+		}
+	}
+</style>

+ 3 - 0
manifest.json

@@ -117,6 +117,9 @@
         "permission" : {
             "scope.wifi" : {
                 "desc" : "获取WiFi列表用于设备联网"
+            },
+            "scope.userLocation" : {
+                "desc" : "获取WiFi列表进行设备连接"
             }
         }
     },

+ 98 - 27
pages.json

@@ -13,46 +13,117 @@
 			}
 		},
 		{
-			"path": "pages/wifi",
+			"path": "pages/role",
 			"style": {
 				"navigationStyle": "custom"
 			}
 		},
 		{
-			"path": "pages/wifiSet",
+			"path": "pages/my",
 			"style": {
 				"navigationStyle": "custom"
 			}
-		},
-		{
-			"path": "pages/code",
-			"style": {
-				"navigationStyle": "custom"
-			}
-		},
-		{
-			"path": "pages/agentCreate",
-			"style": {
-				"navigationStyle": "custom"
-			}
-		},
+		}
+	],
+	"subPackages": [
 		{
-			"path": "pages/agentDetail",
-			"style": {
-				"navigationStyle": "custom"
-			}
+			"root": "pagesHome",
+			"pages": [
+				{
+					"path": "wifiSetMemo1",
+					"style": {
+						"navigationStyle": "custom"
+					}
+				},
+				{
+					"path": "wifiSetMemo2",
+					"style": {
+						"navigationStyle": "custom"
+					}
+				},
+				{
+					"path": "wifiSetMemo3",
+					"style": {
+						"navigationStyle": "custom"
+					}
+				},
+				{
+					"path": "wifiSetMemo4",
+					"style": {
+						"navigationStyle": "custom"
+					}
+				}
+			]
 		},
 		{
-			"path": "pages/roleSet",
-			"style": {
-				"navigationStyle": "custom"
-			}
+			"root": "pagesRole",
+			"pages": [
+				{
+					"path": "addRole",
+					"style": {
+						"navigationStyle": "custom"
+					}
+				},
+				{
+					"path": "roleModel",
+					"style": {
+						"navigationStyle": "custom"
+					}
+				}
+			]
 		},
 		{
-			"path": "pages/device",
-			"style": {
-				"navigationStyle": "custom"
-			}
+			"root": "pagesMy",
+			"pages": [
+				{
+					"path": "device",
+					"style": {
+						"navigationStyle": "custom"
+					}
+				},
+				{
+					"path": "deviceAdd",
+					"style": {
+						"navigationStyle": "custom"
+					}
+				},
+				{
+					"path": "wifi",
+					"style": {
+						"navigationStyle": "custom"
+					}
+				},
+				{
+					"path": "wifiSet",
+					"style": {
+						"navigationStyle": "custom"
+					}
+				},
+				{
+					"path": "wifiSuccess",
+					"style": {
+						"navigationStyle": "custom"
+					}
+				},
+				{
+					"path": "scanResult",
+					"style": {
+						"navigationStyle": "custom"
+					}
+				},
+				{
+					"path": "useBook",
+					"style": {
+						"navigationStyle": "custom"
+					}
+				},
+				{
+					"path": "feedback",
+					"style": {
+						"navigationStyle": "custom"
+					}
+				}
+			]
 		}
 	],
 	"globalStyle": {

+ 0 - 184
pages/agentCreate.vue

@@ -1,184 +0,0 @@
-<template>
-	<view class="page" :style="{'min-height':h+'px', 'padding-top':mt+'px'}">
-		<cus-header title='创建智能体' :showback="false" bgColor="transparent" backUrl="/pages/home"></cus-header>
-		<div class="title">角色昵称</div>
-		<div class="inp">
-			<input v-model="agentDto.agentName" type="text" placeholder="请输入昵称">
-		</div>
-		<div class="title">角色模板</div>
-		<div class="list">
-			<div class="pre" v-for="(item,index) in list" :key="index" :class="{'active':midx===index}" @tap="changeModel(item,index)">
-				<image src="@/static/selected.png" v-if="midx===index"></image>
-				{{item.agentName}}
-			</div>
-		</div>
-		<div class="title">角色介绍</div>
-		<div class="intro">
-			<u-parse :content="agentDto.systemPrompt"></u-parse>
-		</div>
-		<div class="title">角色音色</div>
-		<div class="inp" @tap="show=true">
-			<input type="text" placeholder="请选择音色" disabled v-if="!agentDto.ttsVoiceId">
-			<text v-else>{{voiceText}}</text>
-		</div>
-		<div class="zt_btn" @tap="comfirmSure">确定</div>
-		<u-picker :itemHeight="88" title="角色音色" :show="show" :columns="voiceList" keyName="name"
-			@cancel="show=false" @confirm="confirm" :immediateChange="true" style="height: 500rpx;">
-		</u-picker>
-	</view>
-</template>
-
-<script>
-	export default {
-		data(){
-			return {
-				list:[],
-				agentDto:{
-					"agentName": "",
-					"asrModelId": "",
-					"vadModelId": "",
-					"llmModelId": "",
-					"ttsModelId": "",
-					"ttsVoiceId": "",
-					"memModelId": "",
-					"intentModelId": "",
-					"systemPrompt": "",
-					"langCode": "",
-					"language": "",
-					"deviceId": ""
-				},
-				modelMap:new Map(),
-				midx:0,
-				voiceText:'',
-				voiceList:[],
-				show:false
-			}
-		},
-		async onLoad() {
-			await this.getAgentModelList()
-			this.getModelVoiceList()
-		},
-		methods:{
-			changeModel(item,index){
-				this.midx = index;
-				this.agentDto = this.modelMap.get(item.agentName);
-				this.getModelVoiceList()
-			},
-			getAgentModelList(){
-				return new Promise((resolve,reject)=>{
-					this.$api.get('/agent/template').then(res=>{
-						if(res.data.code!==0) return this.$showToast(res.data.msg)
-						this.list = res.data.data;
-						if(this.list.length){
-							this.agentDto = {...this.agentDto,...this.list[0]}
-							let map = new Map();
-							this.list.forEach(l=>{
-								map.set(l.agentName,l)
-							})
-							this.modelMap = map;
-						}
-						resolve();
-					})
-				})
-			},
-			getModelVoiceList(){
-				this.$api.get(`/models/${this.agentDto.ttsModelId}/voices`).then(res=>{
-					if(res.data.code!==0) return this.$showToast(res.data.msg)
-					this.voiceList = [res.data.data];
-					this.voiceText = res.data.data.find(v=>v.id===this.agentDto.ttsVoiceId)?.name||'';
-				})
-			},
-			comfirmSure(){
-				let dto = JSON.parse(JSON.stringify(this.agentDto));
-				this.$api.post('/agent',dto).then(res=>{
-					if(res.data.code!==0) return this.$showToast(res.data.msg)
-					this.$showToast('创建成功');
-					setTimeout(()=>{
-						uni.reLaunch({
-							url:'/pages/home'
-						})
-					},1500)
-				})
-			},
-			confirm(e){
-				this.show = false;
-				this.agentDto.ttsVoiceId = e.value[0].id;
-				this.voiceText = e.value[0].name;
-			},
-		}
-	}
-</script>
-
-<style scoped lang="less">
-	.page{
-		background: linear-gradient( 180deg, #E0EEFF 0%, #F6FCFF 100%);
-		padding: 0 30rpx 30rpx;
-		box-sizing: border-box;
-		
-		.title{
-			font-family: PingFang-SC, PingFang-SC;
-			font-weight: bold;
-			font-size: 32rpx;
-			color: #111111;
-			line-height: 32rpx;
-			margin-top: 48rpx;
-		}
-		.inp{
-			margin-top: 40rpx;
-			background: #FFFFFF;
-			border-radius: 16rpx;
-			padding: 30rpx 24rpx;
-			input{
-				border: none;
-			}
-		}
-		.list{
-			margin-top: 20rpx;
-			display: flex;
-			flex-wrap: wrap;
-			margin-left: -10rpx;
-			.pre{
-				margin-top: 20rpx;
-				margin-left: 10rpx;
-				width: calc(100% / 3 - 10rpx);
-				height: 80rpx;
-				background: #FFFFFF;
-				border-radius: 16rpx;
-				font-family: PingFangSC, PingFang SC;
-				font-weight: 400;
-				font-size: 28rpx;
-				color: #333333;
-				line-height: 80rpx;
-				text-align: center;
-				position: relative;
-				&.active{
-					background: #0066FE;
-					font-weight: bold;
-					color: #FFFFFF;
-				}
-				image{
-					width: 48rpx;
-					height: 48rpx;
-					position: absolute;
-					right: 0;
-					bottom: 0;
-					z-index: 22;
-				}
-			}
-		}
-		.intro{
-			margin-top: 40rpx;
-			background: #FFFFFF;
-			border-radius: 16rpx;
-			padding: 21rpx 24rpx 100rpx;
-			font-family: PingFangSC, PingFang SC;
-			font-weight: 400;
-			font-size: 28rpx;
-			color: #616161;
-			line-height: 56rpx;
-		}
-		.zt_btn{
-			margin-top: 96rpx;
-		}
-	}
-</style>

+ 0 - 173
pages/agentDetail.vue

@@ -1,173 +0,0 @@
-<template>
-	<view class="page" :style="{'min-height':h+'px', 'padding-top':mt+'px'}">
-		<cus-header title='智能体详情' bgColor="transparent"></cus-header>
-		<!-- <div class="top adffcacjc">
-			<image src="@/static/avatar_big.png"></image>
-			<div class="change adfacjb">
-				<image src="@/static/change2.png"></image>
-				<span>更换形象</span>
-			</div>
-		</div> -->
-		<div class="box b1 adfac">
-			<text>角色昵称</text>
-			<span>{{info.agentName||''}}</span>
-		</div>
-		<div class="box b2">
-			<text>角色介绍</text>
-			<p>{{info.systemPrompt||''}}</p>
-		</div>
-		<div class="box b1 adfac">
-			<text>角色音色</text>
-			<span>{{vname||''}}</span>
-		</div>
-		<div class="item adfacjb" @tap="toTurn('/pages/roleSet?id='+info.id+'&agentId='+id)">
-			<div class="i_l adfac">
-				<image src="@/static/user_set.png"></image>
-				<span>配置角色</span>
-			</div>
-			<div class="i_r adfac">
-				<span>编辑</span>
-				<u-icon name="arrow-right" color="#D3D2D2" size="28rpx"></u-icon>
-			</div>
-		</div>
-		<div class="item adfacjb" @tap="toTurn('/pages/device?agentId='+id)">
-			<div class="i_l adfac">
-				<image src="@/static/device_gl.png"></image>
-				<span>设备管理</span>
-			</div>
-			<div class="i_r adfac">
-				<span>编辑</span>
-				<u-icon name="arrow-right" color="#D3D2D2" size="28rpx"></u-icon>
-			</div>
-		</div>
-	</view>
-</template>
-
-<script>
-	export default {
-		data(){
-			return {
-				id:'',
-				vname:'',
-				info:null
-			}
-		},
-		onLoad(option) {
-			this.id = option.id;
-			this.vname = option.vname;
-			this.getDetail();
-		},
-		methods:{
-			getDetail(){
-				this.$api.get(`/agent/${this.id}`).then(res=>{
-					if(res.data.code!==0) return this.$showToast(res.data.msg)
-					this.info = res.data.data;
-				})
-			},
-			toTurn(url){
-				uni.navigateTo({
-					url
-				})
-			}
-		}
-	}
-</script>
-
-<style scoped lang="less">
-	.page{
-		background: linear-gradient( 180deg, #E0EEFF 0%, #F6FCFF 100%);
-		padding: 0 31rpx 40rpx;
-		box-sizing: border-box;
-		
-		.top{
-			&>image{
-				margin-top: 20rpx;
-				width: 200rpx;
-				height: 233rpx;
-			}
-			.change{
-				margin-top: 40rpx;
-				width: 232rpx;
-				height: 72rpx;
-				background: #FFFFFF;
-				border-radius: 36rpx;
-				padding: 18rpx 36rpx;
-				box-sizing: border-box;
-				image{
-					width: 28rpx;
-					height: 25rpx;
-				}
-				span{
-					font-family: PingFangSC, PingFang SC;
-					font-weight: 400;
-					font-size: 28rpx;
-					color: #0066FE;
-					line-height: 32rpx;
-				}
-			}
-		}
-		
-		.box{
-			background: #FFFFFF;
-			border-radius: 16rpx;
-			padding: 35rpx 34rpx;
-			margin-top: 20rpx;
-			&.b1{
-				margin-top: 40rpx;
-			}
-			text{
-				font-family: PingFang-SC, PingFang-SC;
-				font-weight: bold;
-				font-size: 30rpx;
-				color: #111111;
-				line-height: 32rpx;
-			}
-			span{
-				font-family: PingFangSC, PingFang SC;
-				font-weight: 400;
-				font-size: 30rpx;
-				color: #333333;
-				line-height: 42rpx;
-				margin-left: 52rpx;
-			}
-			p{
-				margin-top: 30rpx;
-				font-family: PingFangSC, PingFang SC;
-				font-weight: 400;
-				font-size: 30rpx;
-				color: #616161;
-				line-height: 56rpx;
-			}
-		}
-		.item{
-			margin-top: 20rpx;
-			background: #FFFFFF;
-			border-radius: 16rpx;
-			padding: 18rpx 34rpx;
-			.i_l{
-				image{
-					width: 64rpx;
-					height: 64rpx;
-				}
-				span{
-					font-family: PingFang-SC, PingFang-SC;
-					font-weight: bold;
-					font-size: 30rpx;
-					color: #111111;
-					line-height: 32rpx;
-					margin-left: 30rpx;
-				}
-			}
-			.i_r{
-				span{
-					font-family: PingFangSC, PingFang SC;
-					font-weight: 400;
-					font-size: 26rpx;
-					color: #0066FE;
-					line-height: 32rpx;
-					margin-right: 14rpx;
-				}
-			}
-		}
-	}
-</style>

+ 0 - 72
pages/code.vue

@@ -1,72 +0,0 @@
-<template>
-	<view class="page" :style="{'min-height':h+'px', 'padding-top':mt+'px'}">
-		<cus-header title='验证码' bgColor="transparent"></cus-header>
-		<div class="box adffcacjc" :style="{'height':h-mt+'px'}">
-			<p>请输入6为验证码</p>
-			<text>验证码已发送至设备</text>
-			<div class="inps adfacjb">
-				<div class="pre adfacjc" v-for="(item,index) in 6" :key="index">
-					<input type="text" @blur="toTurn">
-				</div>
-			</div>
-		</div>
-	</view>
-</template>
-
-<script>
-	export default {
-		data(){
-			return {
-				
-			}
-		},
-		methods:{
-			toTurn(){
-				uni.navigateTo({
-					url:'/pages/agentCreate'
-				})
-			}
-		}
-	}
-</script>
-
-<style scoped lang="less">
-	.page{
-		background: #F7F7F7;
-		box-sizing: border-box;
-		.box{
-			width: 100%;
-			height: 100vh;
-			p{
-				font-family: PingFang-SC, PingFang-SC;
-				font-weight: bold;
-				font-size: 40rpx;
-				color: #111111;
-				line-height: 56rpx;
-			}
-			text{
-				font-family: PingFangSC, PingFang SC;
-				font-weight: 400;
-				font-size: 28rpx;
-				color: rgba(17,17,17,0.4);
-				line-height: 28rpx;
-				margin-top: 24rpx;
-			}
-			.inps{
-				width: calc(100% - 100rpx);
-				margin: 80rpx 50rpx 0;
-				.pre{
-					width: calc(100% / 6 - 10rpx);
-					height: 110rpx;
-					background: #FFFFFF;
-					border-radius: 16rpx;
-					padding: 10rpx 20rpx;
-					box-sizing: border-box;
-					input{
-						border: none;
-					}
-				}
-			}
-		}
-	}
-</style>

+ 0 - 115
pages/device.vue

@@ -1,115 +0,0 @@
-<template>
-	<view class="page" :style="{'min-height':h+'px', 'padding-top':mt+'px'}">
-		<cus-header title='设备管理' bgColor="transparent"></cus-header>
-		<block v-if="list.length">
-			<div class="box" v-for="(item,index) in list" :key="index">
-				<div class="name">{{item.board}}</div>
-				<div class="btn" @tap="toUnBind(item)">解绑设备</div>
-			</div>
-		</block>
-		<block v-else>
-			<page-empty :height="'calc(100vh - 200px)'"></page-empty>
-		</block>
-		<div class="zt_btn" @tap="bindDevice">新增设备</div>
-	</view>
-</template>
-
-<script>
-	import pageEmpty from '@/components/pageEmpty/index.vue'
-	export default {
-		components:{pageEmpty},
-		data(){
-			return {
-				agentId:'',
-				list:[]
-			}
-		},
-		onLoad(option) {
-			this.agentId = option.agentId;
-			this.getList();
-		},
-		methods:{
-			getList(){
-				this.$api.get(`/device/bind/${this.agentId}`).then(res=>{
-					if(res.data.code!==0) return this.$showToast(res.data.msg)
-					this.list = res.data.data;
-				})
-			},
-			bindDevice(){
-				uni.scanCode({
-					success: (res) => {
-						let result = JSON.parse(res.result);
-						if(res.errMsg==='scanCode:ok'){
-							this.$api.post('/device/bindAdd',{
-								...result,
-								"type": "",
-								"userId": 0,
-								"agentId": this.agentId
-							}).then(res=>{
-								if(res.data.code!==0) return this.$showToast(res.data.msg)
-								this.$showToast('新增设备成功');
-								setTimeout(()=>{
-									this.getList();
-								},1000)
-							})
-						}
-					}
-				})
-			},
-			toUnBind(item){
-				uni.showModal({
-					title:'温馨提示',
-					content:'确定要解绑该设备吗?',
-					success: (res) => {
-						this.$api.post('/device/unbind',{deviceId:item.id}).then(res=>{
-							if(res.data.code!==0) return this.$showToast(res.data.msg)
-							this.$showToast('解绑成功');
-							setTimeout(()=>{
-								this.getList();
-							},1000)
-						})
-					}
-				})
-			}
-		}
-	}
-</script>
-
-<style scoped lang="less">
-	.page{
-		background: linear-gradient( 180deg, #E0EEFF 0%, #F6FCFF 100%);
-		padding: 0 30rpx 200rpx;
-		box-sizing: border-box;
-		
-		.box{
-			background: #FFFFFF;
-			border-radius: 16rpx;
-			margin-top: 20rpx;
-			.name{
-				padding: 36rpx 24rpx;
-				border-bottom: 1px solid #E2E2E2;
-				font-family: PingFangSC, PingFang SC;
-				font-weight: 400;
-				font-size: 30rpx;
-				color: #111111;
-				line-height: 32rpx;
-			}
-			.btn{
-				font-family: PingFang-SC, PingFang-SC;
-				font-weight: bold;
-				font-size: 28rpx;
-				color: #0066FE;
-				line-height: 32rpx;
-				text-align: center;
-				padding: 34rpx 0;
-			}
-		}
-		
-		.zt_btn{
-			position: fixed;
-			bottom: 64rpx;
-			width: calc(100% - 120rpx);
-			left: 60rpx;
-		}
-	}
-</style>

+ 206 - 228
pages/home.vue

@@ -1,271 +1,249 @@
 <template>
-	<view class="page" :style="{'min-height':h+'px', 'padding-top':mt+'px'}">
-		<div class="top" :style="{'background-image':'url('+require('../static/top_bg.png')+')','margin-top':-mt+'px'}">
-			<div class="t_box" :style="{'background-image':'url('+require('../static/top_boxbg.png')+')'}">
-				<image src="@/static/ai_shape.png"></image>
-				<div class="text adffcac">
-					<text>Hi!我是甜心小兔</text>
-					<p>
-						支持语音唤醒 按键对话<br>
-						回应每一个奇思妙想<br>
-						好奇的孩子更聪明~
-					</p>
-				</div>
+	<view class="tabPage" :style="{'min-height':h+'px', 'padding-top':mt+'px'}">
+		<image class="topbg" src="@/static/home_topbg.png"></image>
+		<template v-if="list.length">
+			<div class="list" :style="{'margin-top':(360-mt-61)+'px'}">
+				<u-list @scrolltolower="scrolltolower">
+					<u-list-item v-for="(item, index) in list" :key="index">
+						<div class="l_box box">
+							<div class="l_top adfacjb">
+								<div class="lt_l">我的设备:{{1}}</div>
+								<div class="lt_r adfac">
+									<image src="@/static/wifi_on_mini.png" v-if="index===0"></image>
+									<image src="@/static/wifi_off_mini.png" v-else></image>
+									<image src="@/static/online_mini.png" v-if="index===0"></image>
+									<image src="@/static/offline_mini.png" v-else></image>
+									<div class="ltr_zt" :class="{'zx':index===0,'lx':index===1}">{{index===0?'在线':'离线'}}</div>
+								</div>
+							</div>
+							<div class="l_content">
+								<div class="lc_role adfac">
+									<image class="lcr_l" src="@/static/avatar_default.png"></image>
+									<div class="lcr_r">
+										<p>{{'角色昵称'}}</p>
+										<div class="text">角色模板:{{'英语老师'}}</div>
+										<div class="text">绑定时间:{{'2025-05-25'}}</div>
+									</div>
+								</div>
+								<div class="lc_info">
+									{{'一个充满活力与好奇心的年轻人。性格开朗乐观,对生活充满热情。你喜欢在公园等自由自在的地方与朋友们一起探索乐趣…'}}
+								</div>
+								<div class="lc_btns adfac">
+									<div class="lcb_pre">角色编辑</div>
+									<div class="lcb_pre">更换网络</div>
+									<div class="lcb_pre">解绑设备</div>
+								</div>
+							</div>
+						</div>
+					</u-list-item>
+				</u-list>
 			</div>
-		</div>
-		<div class="card">
-			<div class="title adfacjb">
-				<div class="t_l">我的设备</div>
+		</template>
+		<template v-else>
+			<div class="empty box">
+				<image src="@/static/empty_device.png"></image>
+				<p>暂无设备,快去添加开始聊天吧~</p>
+				<div class="zt_btn" @tap="addDevice"> + 添加新设备</div>
 			</div>
-			<div class="device_boxs adfacjb">
-				<div class="db_pre adffcjb" :style="{'background-image':'url('+require('../static/box_bg2.png')+')'}" @tap="addBindDevice">
-					<div class="dp_top adfac">
-						<image src="@/static/bind.png"></image>
-						<span>绑定设备</span>
-					</div>
-					<div class="dp_tip">按照产品教程绑定设备,添加成功后选择角色</div>
-				</div>
-				<div class="db_pre adffcjb" :style="{'background-image':'url('+require('../static/box_bg1.png')+')'}" @tap="toTurn('/pages/wifi')">
-					<div class="dp_top adfac">
-						<image src="@/static/change.png"></image>
-						<span>网络连接</span>
-					</div>
-					<div class="dp_tip">请先连接热点,然后选择要连接的网络</div>
-				</div>
-			</div>
-			<template v-if="agentList.length">
-				<div class="title adfacjb" style="margin-top: 70rpx;margin-bottom: 22rpx;">
-					<div class="t_l">我的角色</div>
-					<div class="t_r">查看全部</div>
-				</div>
-				<div class="a_item adfacjb" v-for="(item,index) in agentList" :key="index">
-					<div class="ai_l">
-						{{item.agentName}}
-					</div>
-					<div class="ai_r" @tap="toAgentDetail(item)">查看</div>
-				</div>
-			</template>
-		</div>
+		</template>
+		<cus-tabbar :tabbarIndex="0"></cus-tabbar>
+		<bind-device ref="bdRef"></bind-device>
 	</view>
 </template>
 
 <script>
+	import cusTabbar from '@/components/CusTabbar/index.vue'
+	import bindDevice from '@/components/bindDevice/index.vue'
 	export default {
+		components:{
+			cusTabbar,
+			bindDevice
+		},
 		data(){
 			return {
-				deviceList:[],
-				agentList:[]
+				list:[]
 			}
 		},
-		onLoad() {
-			this.getAgentList();
-		},
 		methods:{
-			getAgentList(){
-				this.$api.get('/agent/list').then(res=>{
-					if(res.data.code!==0) return this.$showToast(res.data.msg)
-					this.agentList = res.data.data.splice(0,5);
-				})
-			},
-			addBindDevice(){
-				uni.scanCode({
-					success: (res) => {
-						let result = JSON.parse(res.result);
-						if(res.errMsg==='scanCode:ok'){
-							this.$api.post('/device/bindAdd',{
-								...result,
-								"type": "",
-								"userId": 0,
-								"agentId": ""
-							}).then(res=>{
-								if(res.data.code!==0) return this.$showToast(res.data.msg)
-								uni.navigateTo({
-									url:'/pages/agentCreate'
-								})
-							})
-						}
-					}
-				})
+			addDevice(){
+				this.$refs.bdRef.show = true;
 			},
-			toTurn(url){
-				uni.navigateTo({ url })
-			},
-			toAgentDetail(item){
-				uni.navigateTo({
-					url:'/pages/agentDetail?id='+item.id+'&vname='+item.ttsVoiceName
-				})
+			scrolltolower(){
+				
 			}
 		}
 	}
 </script>
 
 <style scoped lang="less">
-	.page{
-		background: linear-gradient( 180deg, #E0EEFF 0%, #F6FCFF 100%);
+	.tabPage{
+		background: #FFFFFF;
+		padding-bottom: 192rpx;
 		box-sizing: border-box;
-		.top{
+		
+		.topbg{
 			width: 100%;
-			height: 564rpx;
-			background-repeat: no-repeat;
-			background-size: 100% 100%;
+			height: 720rpx;
+			position: fixed;
+			top: 0;
+			left: 0;
+		}
+	
+		.box{
 			position: relative;
-			display: flex;
-			flex-direction: column;
-			justify-content: flex-end;
-			.t_box{
-				width: calc(100% - 60rpx);
-				height: 296rpx;
-				background-repeat: no-repeat;
-				background-size: 100% 100%;
-				position: relative;
-				bottom: 30rpx;
-				left: 30rpx;    
-				image{
-					width: 256rpx;
-					height: 336rpx;
-					position: absolute;
-					left: 38rpx;
-					bottom: 14rpx;
-				}
-				.text{
-					padding: 66rpx 46rpx 0 332rpx;
-					text{
-						font-family: PingFangSC, PingFang SC;
-						font-weight: 500;
-						font-size: 40rpx;
-						color: #FFFFFF;
-						line-height: 56rpx;
-					}
-					p{
-						font-family: PingFangSC, PingFang SC;
-						font-weight: 400;
-						font-size: 26rpx;
-						color: #FFFFFF;
-						line-height: 48rpx;
-						margin-top: 12rpx;
-					}
-				}
-				
-			}
+			width: calc(100% - 60rpx);
+			background: #FFFFFF;
+			box-shadow: 0rpx 4rpx 20rpx 0rpx rgba(0,0,0,0.04);
+			border-radius: 32rpx;
+			border: 1rpx solid #D9F159;
+			box-sizing: border-box;
 		}
-		.card{
-			padding: 0 30rpx 30rpx;
-			.title{
-				margin-top: 36rpx;
-				.t_l{
-					font-family: PingFangSC, PingFang SC;
-					font-weight: 600;
-					font-size: 36rpx;
-					color: #111111;
-					line-height: 50rpx;
-					text-align: left;
-				}
-				.t_r{
-					font-family: PingFangSC, PingFang SC;
-					font-weight: 400;
-					font-size: 28rpx;
-					color: #0066FE;
-					line-height: 40rpx;
-					text-align: right;
-				}
+		.list{
+			position: relative;
+			margin: 0 30rpx 0;
+			width: calc(100% - 60rpx);
+			height: calc(100vh - 740rpx);
+			::v-deep .u-list{
+				width: 100%;
+				height: 100% !important;
 			}
-			.device_empty{
-				background: #FFFFFF;
-				box-shadow: 0rpx 4rpx 20rpx 0rpx #E5EDFF;
-				border-radius: 24rpx;
-				margin-top: 32rpx;
-				padding: 48rpx 79rpx;
-				background: #FFFFFF;
-				p{
-					font-family: PingFangSC, PingFang SC;
-					font-weight: 400;
-					font-size: 28rpx;
-					color: #5C5C5C;
-					line-height: 48rpx;
-					text-align: center;
-				}
-				.de_btn{
-					width: 320rpx;
-					height: 72rpx;
-					background: #0066FE;
-					border-radius: 16rpx;
-					margin-top: 40rpx;
-					image{
-						width: 30rpx;
-						height: 30rpx;
-					}
-					span{
+			::v-deep .u-list-item{
+				width: 100%;
+			}
+			.l_box{
+				width: 100%;
+				padding: 49rpx 30rpx 40rpx;
+				margin-top: 20rpx;
+				.l_top{
+					.lt_l{
 						font-family: PingFang-SC, PingFang-SC;
 						font-weight: bold;
-						font-size: 28rpx;
-						color: #FFFFFF;
-						line-height: 32rpx;
-						margin-left: 16rpx;
+						font-size: 32rpx;
+						color: #111111;
+						line-height: 40rpx;
 					}
-				}
-			}
-			.device_boxs{
-				margin-top: 31rpx;
-				.db_pre{
-					width: calc(50% - 15rpx);
-					height: 138px;
-					padding: 36rpx 30rpx;
-					box-sizing: border-box;
-					background-repeat: no-repeat;
-					background-size: 100% 100%;
-					.dp_top{
+					.lt_r{
 						image{
-							width: 40rpx;
-							height: 40rpx;
+							width: 42rpx;
+							height: 42rpx;
+							margin-right: 34rpx;
 						}
-						span{
-							font-family: PingFang-SC, PingFang-SC;
-							font-weight: bold;
-							font-size: 32rpx;
-							color: #333333;
-							line-height: 32rpx;
-							text-align: left;
-							margin-left: 40rpx;
+						.ltr_zt{
+							font-family: PingFangSC, PingFang SC;
+							font-weight: 400;
+							font-size: 26rpx;
+							line-height: 37rpx;
+							padding-left: 22rpx;
+							position: relative;
+							&::before{
+								content: '';
+								width: 12rpx;
+								height: 12rpx;
+								border-radius: 50%;
+								position: absolute;
+								left: 0;
+								top: 50%;
+								margin-top: -6rpx;
+							}
+							&.zx{
+								color: #1B50FF;
+								&::before{
+									background: #1B50FF;
+								}
+							}
+							&.lx{
+								color: #C7C7C7;
+								&::before{
+									background: #C7C7C7;
+								}
+							}
+						}
+					}
+				}
+				.l_content{
+					border-top: 1rpx solid #E2E2E2;
+					margin-top: 37rpx;
+					padding-top: 36rpx;
+					overflow: hidden;
+					.lc_role{
+						.lcr_l{
+							width: 148rpx;
+							height: 148rpx;
+							border-radius: 50%;
+						}
+						.lcr_r{
+							width: calc(100% - 148rpx);
+							padding-left: 30rpx;
+							box-sizing: border-box;
+							p{
+								font-family: PingFang-SC, PingFang-SC;
+								font-weight: bold;
+								font-size: 32rpx;
+								color: #111111;
+								line-height: 32rpx;
+								overflow: hidden;
+								white-space: nowrap;
+								text-overflow: ellipsis;
+							}
+							.text{
+								font-family: PingFangSC, PingFang SC;
+								font-weight: 400;
+								font-size: 24rpx;
+								color: #7C8592;
+								line-height: 24rpx;
+								margin-top: 24rpx;
+							}
 						}
 					}
-					.dp_tip{
+					.lc_info{
+						margin-top: 36rpx;
 						font-family: PingFangSC, PingFang SC;
 						font-weight: 400;
 						font-size: 24rpx;
-						color: #6E696F;
+						color: #7C8592;
 						line-height: 40rpx;
 					}
+					.lc_btns{
+						margin-top: 62rpx;
+						margin-left: -1rpx;
+						overflow: hidden;
+						.lcb_pre{
+							width: calc(100% / 3);
+							height: 37rpx;
+							border-left: 1rpx solid #72832B;
+							font-family: PingFang-SC, PingFang-SC;
+							font-weight: bold;
+							font-size: 26rpx;
+							color: #72832B;
+							line-height: 37rpx;
+							text-align: center;
+						}
+					}
 				}
 			}
-			.a_item{
-				width: 100%;
-				padding: 37rpx 20rpx;
-				box-sizing: border-box;
-				background: #FFFFFF;
+		}
+		.empty{
+			display: flex;
+			flex-direction: column;
+			align-items: center;
+			margin: 392rpx 30rpx 0;
+			padding: 84rpx 40rpx 64rpx;
+			
+			image{
+				width: 64rpx;
+				height: 66rpx;
+			}
+			p{
+				font-family: PingFangSC, PingFang SC;
+				font-weight: 400;
+				font-size: 30rpx;
+				color: #A6A6A6;
+				line-height: 42rpx;
+				text-align: center;
 				margin-top: 30rpx;
-				.ai_l{
-					width: calc(100% - 114rpx);
-					font-family: PingFang-SC, PingFang-SC;
-					font-weight: bold;
-					font-size: 32rpx;
-					color: #111111;
-					line-height: 32rpx;
-					overflow: hidden;
-					white-space: nowrap;
-					text-overflow: ellipsis;
-				}
-				.ai_r{
-					width: 94rpx;
-					height: 56rpx;
-					background: #0066FE;
-					border-radius: 16rpx;
-					font-family: PingFang-SC, PingFang-SC;
-					font-weight: bold;
-					font-size: 24rpx;
-					color: #FFFFFF;
-					line-height: 56rpx;
-					text-align: center;
-				}
+			}
+			.zt_btn{
+				margin-top: 80rpx;
 			}
 		}
 	}

+ 53 - 17
pages/login.vue

@@ -1,9 +1,13 @@
 <template>
 	<view class="page" :style="{'min-height':h+'px', 'padding-top':mt+'px'}">
-		<cus-header title='传秀AI终端' :showback="false"></cus-header>
-		<div class="content">
-			<button class="zt_btn" open-type="getPhoneNumber" @getphonenumber="decryptPhoneNumber">手机号一键登录</button>
-			<div class="qx_btn" @click="cancelLogin">取消</div>
+		<image class="topbg" src="@/static/login_top.png" mode="widthFix"></image>
+		<div class="content adffcacjc">
+			<button class="zt_btn" open-type="getPhoneNumber" @getphonenumber="decryptPhoneNumber">快速登录</button>
+			<div class="agree adfacjc" @tap="changeAgree">
+				<image src="@/static/selected_not.png" v-if="!agree"></image>
+				<image src="@/static/selected.png" v-else></image>
+				<div class="a_text">已阅读并同意 <span>《用户协议》</span><span>《隐私政策》</span></div>
+			</div>
 		</div>
 	</view>
 </template>
@@ -12,18 +16,28 @@
 	export default {
 		data(){
 			return {
-				
+				agree:false
 			}
 		},
-		onShow() {
+		onShow: () => {
 			if(uni.getStorageSync('userInfo')){
-				uni.redirectTo({
+				uni.reLaunch({
 					url:'/pages/home'
 				})
 			}
 		},
 		methods:{
+			changeAgree(){
+				this.agree = !this.agree;
+			},
 			decryptPhoneNumber(e){
+				if(!this.agree) return this.$showToast('请勾选协议和政策');
+				uni.reLaunch({
+					url:'/pages/home'
+				})
+				uni.setStorageSync('userInfo',JSON.stringify({id:1,mobile:'13888888888',username:'龙傲天'}))
+				return 
+				
 				if(e.detail.code) this.wxLogin(e.detail.code);
 			},
 			wxLogin(code){
@@ -52,9 +66,6 @@
 						})
 					}
 				})
-			},
-			cancelLogin(){
-				uni.exitMiniProgram();
 			}
 		}
 	}
@@ -66,15 +77,40 @@
 		display: flex;
 		flex-direction: column;
 		box-sizing: border-box;
+		
+		.topbg{
+			width: 100%;
+			position: fixed;
+			top: 0;
+			left: 0;
+			z-index: 0;
+		}
+		
+		
 		.content{
-			padding: 0 45rpx;
+			position: relative;
+			display: flex;
 			flex: 1;
-			overflow-y: auto;
-			.zt_btn{
-				margin-top: 216rpx;
-			}
-			.qx_btn{
-				margin-top: 36rpx;
+			width: calc(100% - 140rpx);
+			margin: 307rpx 70rpx 0;
+			
+			.agree{
+				margin-top: 50rpx;
+				&>image{
+					width: 32rpx;
+					height: 32rpx;
+					margin-right: 10rpx;
+				}
+				.a_text{
+					font-family: PingFangSC, PingFang SC;
+					font-weight: 400;
+					font-size: 24rpx;
+					color: #A6A6A6;
+					line-height: 33rpx;
+					span{
+						color: #72832B;
+					}
+				}
 			}
 		}
 	}

+ 153 - 0
pages/my.vue

@@ -0,0 +1,153 @@
+<template>
+	<view class="tabPage" :style="{'min-height':h+'px', 'padding-top':mt+'px'}">
+		<cus-header title='我的' :showback="false" bgColor='transparent'></cus-header>
+		<image class="topbg" src="../static/my_topbg.png"></image>
+		<div class="info adffcacjc">
+			<image src="../static/my_avatat_default.png"></image>
+			<p>{{'187 **** 8769'}}</p>
+		</div>
+		<div class="items">
+			<div class="item adfacjb" @tap="toTurn('/pagesMy/device')">
+				<div class="il adfac">
+					<image src="@/static/my_device.png"></image>
+					<text>我的设备</text>
+				</div>
+				<div class="ir">
+					<u-icon name="arrow-right" color="#D3D2D2" size="34"></u-icon>
+				</div>
+			</div>
+			<div class="item adfacjb" @tap="toTurn('/pagesMy/useBook')">
+				<div class="il adfac">
+					<image src="@/static/my_book.png"></image>
+					<text>用户使用手册</text>
+				</div>
+				<div class="ir">
+					<u-icon name="arrow-right" color="#D3D2D2" size="34"></u-icon>
+				</div>
+			</div>
+			<div class="item adfacjb" @tap="toTurn('/pagesMy/feedback')">
+				<div class="il adfac">
+					<image src="@/static/myu_idea.png"></image>
+					<text>意见反馈</text>
+				</div>
+				<div class="ir">
+					<u-icon name="arrow-right" color="#D3D2D2" size="34"></u-icon>
+				</div>
+			</div>
+			<div class="item adfacjb">
+				<div class="il adfac">
+					<image src="@/static/my_version.png"></image>
+					<text>版本</text>
+				</div>
+				<div class="ir">{{'1.0.0'}}</div>
+			</div>
+		</div>
+		<div class="exit">退出登录</div>
+		<cus-tabbar :tabbarIndex="2"></cus-tabbar>
+	</view>
+</template>
+
+<script>
+	import cusTabbar from '@/components/CusTabbar/index.vue'
+	export default {
+		components:{
+			cusTabbar
+		},
+		data(){
+			return {
+				
+			}
+		},
+		methods:{
+			toTurn(url){
+				if(!url) return
+				uni.navigateTo({ url })
+			}
+		}
+	}
+</script>
+
+<style scoped lang="less">
+	.tabPage{
+		background: #FFFFFF;
+		padding: 0 30rpx 192rpx;
+		box-sizing: border-box;
+		
+		.topbg{
+			width: 100%;
+			height: 720rpx;
+			position: fixed;
+			top: 0;
+			left: 0;
+		}
+		
+		.info{
+			position: relative;
+			margin-top: 68rpx;
+			&>image{
+				width: 200rpx;
+				height: 200rpx;
+				border-radius: 50%;
+			}
+			p{
+				font-family: PingFang-SC, PingFang-SC;
+				font-weight: bold;
+				font-size: 48rpx;
+				color: #111111;
+				line-height: 32rpx;
+				text-align: center;
+				margin-top: 40rpx;
+			}
+		}
+		
+		.items{
+			position: relative;
+			margin-top: 93rpx;
+			.item{
+				width: 100%;
+				padding: 39rpx 20rpx;
+				box-sizing: border-box;
+				background: #FFFFFF;
+				box-shadow: inset 0rpx -1rpx 0rpx 0rpx #ECECEC;
+				border-radius: 16rpx 16rpx 0rpx 0rpx;
+				.il{
+					image{
+						width: 36rpx;
+						height: 36rpx;
+					}
+					text{
+						font-family: PingFangSC, PingFang SC;
+						font-weight: 400;
+						font-size: 30rpx;
+						color: #111111;
+						line-height: 32rpx;
+						margin-left: 34rpx;
+					}
+				}
+				.ir{
+					font-family: PingFang-SC, PingFang-SC;
+					font-weight: bold;
+					font-size: 30rpx;
+					color: #111111;
+					line-height: 32rpx;
+					text-align: right;
+				}
+			}
+		}
+		
+		.exit{
+			width: 100%;
+			height: 88rpx;
+			background: #F8F8F7;
+			border-radius: 24rpx;
+			margin-top: 190rpx;
+			font-family: PingFangSC, PingFang SC;
+			font-weight: 400;
+			font-size: 30rpx;
+			color: #111111;
+			line-height: 88rpx;
+			text-align: center;
+			letter-spacing: 2rpx;
+		}
+	}
+</style>

+ 221 - 0
pages/role.vue

@@ -0,0 +1,221 @@
+<template>
+	<view class="tabPage" :style="{'min-height':h+'px', 'padding-top':mt+'px'}">
+		<cus-header title='角色' :showback="false" bgColor='transparent'></cus-header>
+		<template v-if="list.length">
+			<div class="query adfacjb">
+				<div class="ql adfac">
+					<image src="@/static/query_mini.png"></image>
+					<input type="text" placeholder="搜索" placeholder-class="ph">
+				</div>
+				<div class="qr" @tap="addRole"> + 新增角色</div>
+			</div>
+			<div class="list" :style="{'height':'calc(100vh - '+(mt+156)+'px)'}">
+				<u-list @scrolltolower="scrolltolower">
+					<u-list-item v-for="(item, index) in list" :key="index">
+						<u-swipe-action @touchstart.stop>
+							<u-swipe-action-item :options="options" @click="deleteRole(item)" :ref="'swipeAction' + index" :threshold="5"/>
+								<view class="swipe-action u-border-top u-border-bottom">
+									<view class="swipe-action__content">
+										<div class="l_item adfacjb">
+											<div class="li_l adfac">
+												<image :src="require('@/static/role_avatar'+(index%3)+'.png')"></image>
+												<div class="lil_info">
+													<p>{{'词语接龙'}}</p>
+													<div class="tip">
+														<u--text :lines="2" :text="'擅长词语接龙,规范词汇,助你锻炼词汇量与反应能力'" size="24rpx" color="#A6A6A6" :bold="true" lineHeight="40rpx"></u--text>
+													</div>
+												</div>
+											</div>
+											<div class="li_r">配置到设备</div>
+										</div>
+									</view>
+								</view>
+							</u-swipe-action-item>
+						</u-swipe-action>
+					</u-list-item>
+				</u-list>
+			</div>
+		</template>
+		<template v-else>
+			<div class="empty adffcacjc" :style="{'height':'calc(100vh - '+(mt+106)+'px)'}">
+				<image src="@/static/empty_device.png"></image>
+				<p>请先绑定设备</p>
+				<div class="zt_btn" @tap="addDevice"> + 添加新设备</div>
+			</div>
+		</template>
+		<cus-tabbar :tabbarIndex="1"></cus-tabbar>
+		<bind-device ref="bdRef"></bind-device>
+	</view>
+</template>
+
+<script>
+	import cusTabbar from '@/components/CusTabbar/index.vue'
+	import bindDevice from '@/components/bindDevice/index.vue'
+	export default {
+		components:{
+			cusTabbar,
+			bindDevice
+		},
+		data(){
+			return {
+				list:[1],
+				options: [{
+					text: '删除',
+					style: {
+						backgroundColor: '#f56c6c'
+					}
+				}],
+			}
+		},
+		methods:{
+			addDevice(){
+				this.$refs.bdRef.show = true;
+			},
+			addRole(){
+				uni.navigateTo({
+					url:'/pagesRole/addRole'
+				})
+			},
+		}
+	}
+</script>
+
+<style>
+	.u-swipe-action-item__right__button__wrapper {
+		background: #F55454 !important;
+		font-size: 32rpx;
+		font-family: PingFang-SC-Bold, PingFang-SC;
+		font-weight: bold;
+		color: #FFFFFF;
+		letter-spacing: 2rpx;
+	}
+	.swipe-action {
+	  width: 100%;
+	}
+	.u-swipe-action {
+	  z-index: 100 !important;
+	}
+</style>
+<style scoped lang="less">
+	::v-deep .list .u-list-item{
+		margin-top: 60rpx;
+	}
+	::v-deep .list .swipe-action{
+		border: none !important;
+	}
+	
+	.tabPage{
+		background: #FFFFFF;
+		padding-bottom: 192rpx;
+		box-sizing: border-box;
+		
+		.query{
+			margin-top: 20rpx;
+			width: 100%;
+			padding-left: 30rpx;
+			box-sizing: border-box;
+			.ql{
+				width: calc(100% - 230rpx);
+				height: 80rpx;
+				background: #F6F6F8;
+				border-radius: 40rpx;
+				padding: 26rpx 36rpx;
+				box-sizing: border-box;
+				image{
+					width: 28rpx;
+					height: 28rpx;
+				}
+				input{
+					font-family: PingFangSC, PingFang SC;
+					font-weight: 400;
+					font-size: 26rpx;
+					color: #222222;
+					line-height: 40rpx;
+					padding-left: 20rpx;
+				}
+			}
+			.qr{
+				width: 204rpx;
+				height: 80rpx;
+				background: #D9F159;
+				border-radius: 45rpx  0rpx  0rpx  45rpx;
+				font-family: PingFang-SC, PingFang-SC;
+				font-weight: bold;
+				font-size: 28rpx;
+				color: #111111;
+				line-height: 80rpx;
+				text-align: center;
+			}
+		}
+		
+		.list{
+			padding: 0 30rpx;
+			::v-deep .u-list{
+				width: 100%;
+				height: 100% !important;
+			}
+			::v-deep .u-list-item{
+				width: 100%;
+			}
+			.l_item{
+				width: 100%;
+				.li_l{
+					width: calc(100% - 200rpx);
+					image{
+						width: 116rpx;
+						height: 116rpx;
+					}
+					.lil_info{
+						width: calc(100% - 116rpx);
+						padding-left: 23rpx;
+						p{
+							font-family: PingFang-SC, PingFang-SC;
+							font-weight: bold;
+							font-size: 32rpx;
+							color: #111111;
+							line-height: 32rpx;
+							margin-bottom: 16rpx;
+						}
+					}
+				}
+				.li_r{
+					width: 160rpx;
+					height: 64rpx;
+					background: #D9F159;
+					border-radius: 16rpx;
+					font-family: PingFangSC, PingFang SC;
+					font-weight: 400;
+					font-size: 24rpx;
+					color: #111111;
+					line-height: 64rpx;
+					text-align: center;
+					letter-spacing: 2rpx;
+				}
+			}
+		}
+		
+		.empty{
+			image{
+				width: 64rpx;
+				height: 66rpx;
+			}
+			p{
+				font-family: PingFangSC, PingFang SC;
+				font-weight: 400;
+				font-size: 30rpx;
+				color: #A6A6A6;
+				line-height: 42rpx;
+				text-align: center;
+				margin-top: 30rpx;
+			}
+			.zt_btn{
+				width: calc(100% - 140rpx);
+				margin: 230rpx 70rpx 0;
+			}
+		}
+		
+		.ph{
+			color: #A6A6A6;
+		}
+	}
+</style>

+ 0 - 189
pages/roleSet.vue

@@ -1,189 +0,0 @@
-<template>
-	<view class="page" :style="{'min-height':h+'px', 'padding-top':mt+'px'}">
-		<cus-header title='配置角色' bgColor="transparent"></cus-header>
-		<div class="title">助手昵称</div>
-		<div class="inp">
-			<input v-model="agentDto.agentName" type="text" placeholder="请输入昵称">
-		</div>
-		<div class="title">角色模板</div>
-		<div class="list">
-			<div class="pre" v-for="(item,index) in list" :key="index" :class="{'active':midx===index}" @tap="changeModel(item,index)">
-				<image src="@/static/selected.png" v-if="midx===index"></image>
-				{{item.agentName}}
-			</div>
-		</div>
-		<div class="title">角色介绍</div>
-		<div class="intro">
-			<u-parse :content="agentDto.systemPrompt"></u-parse>
-		</div>
-		<div class="title">角色音色</div>
-		<div class="inp" @tap="show=true">
-			<input type="text" placeholder="请选择音色" disabled v-if="!agentDto.ttsVoiceId">
-			<text v-else>{{voiceText}}</text>
-		</div>
-		<div class="zt_btn" @tap="comfirmSure">确定</div>
-		<u-picker :itemHeight="88" title="角色音色" :show="show" :columns="voiceList" keyName="name"
-			@cancel="show=false" @confirm="confirm" :immediateChange="true" style="height: 500rpx;">
-		</u-picker>
-	</view>
-</template>
-
-<script>
-	export default {
-		data(){
-			return {
-				id:'',
-				agentId:'',
-				agentDto:null,
-				list:[],
-				midx:0,
-				modelMap:new Map(),
-				midx:0,
-				voiceText:'',
-				voiceList:[],
-				show:false
-			}
-		},
-		async onLoad(option) {
-			this.id = option.id;
-			this.agentId = option.agentId;
-			await this.getDetail();
-			await this.getAgentModelList()
-			this.getModelVoiceList()
-		},
-		methods:{
-			getDetail(){
-				return new Promise((resolve,reject)=>{
-					this.$api.get(`/agent/${this.id}`).then(res=>{
-						if(res.data.code!==0) return this.$showToast(res.data.msg)
-						this.agentDto = res.data.data;
-							resolve();
-					})
-				})
-			},
-			getAgentModelList(){
-				return new Promise((resolve,reject)=>{
-					this.$api.get('/agent/template').then(res=>{
-						if(res.data.code!==0) return this.$showToast(res.data.msg)
-						this.list = res.data.data;
-						let idx = this.list.findIndex(l=>l.systemPrompt===this.agentDto.systemPrompt);
-						if(idx>-1){
-							this.midx = idx;
-						}
-						if(this.list.length){
-							let map = new Map();
-							this.list.forEach(l=>{
-								map.set(l.agentName,l)
-							})
-							this.modelMap = map;
-						}
-						resolve();
-					})
-				})
-			},
-			getModelVoiceList(){
-				this.$api.get(`/models/${this.agentDto.ttsModelId}/voices`).then(res=>{
-					if(res.data.code!==0) return this.$showToast(res.data.msg)
-					this.voiceList = [res.data.data];
-					this.voiceText = res.data.data.find(v=>v.id===this.agentDto.ttsVoiceId)?.name||'';
-				})
-			},
-			confirm(e){
-				this.show = false;
-				this.agentDto.ttsVoiceId = e.value[0].id;
-				this.voiceText = e.value[0].name;
-			},
-			changeModel(item,index){
-				this.midx = index;
-				this.agentDto = {...this.agentDto,...this.modelMap.get(item.agentName)};
-				this.getModelVoiceList()
-			},
-			comfirmSure(){
-				let dto = JSON.parse(JSON.stringify(this.agentDto));
-				this.$api.put('/agent/'+this.agentId,dto).then(res=>{
-					if(res.data.code!==0) return this.$showToast(res.data.msg)
-					this.$showToast('配置成功');
-					setTimeout(()=>{
-						uni.reLaunch({
-							url:'/pages/home'
-						})
-					},1500)
-				})
-			},
-		}
-	}
-</script>
-
-<style scoped lang="less">
-	.page{
-		background: linear-gradient( 180deg, #E0EEFF 0%, #F6FCFF 100%);
-		padding: 0 30rpx 30rpx;
-		box-sizing: border-box;
-		
-		.title{
-			font-family: PingFang-SC, PingFang-SC;
-			font-weight: bold;
-			font-size: 32rpx;
-			color: #111111;
-			line-height: 32rpx;
-			margin-top: 48rpx;
-		}
-		.inp{
-			margin-top: 40rpx;
-			background: #FFFFFF;
-			border-radius: 16rpx;
-			padding: 30rpx 24rpx;
-			input{
-				border: none;
-			}
-		}
-		.list{
-			margin-top: 20rpx;
-			display: flex;
-			flex-wrap: wrap;
-			margin-left: -10rpx;
-			.pre{
-				margin-top: 20rpx;
-				margin-left: 10rpx;
-				width: calc(100% / 3 - 10rpx);
-				height: 80rpx;
-				background: #FFFFFF;
-				border-radius: 16rpx;
-				font-family: PingFangSC, PingFang SC;
-				font-weight: 400;
-				font-size: 28rpx;
-				color: #333333;
-				line-height: 80rpx;
-				text-align: center;
-				position: relative;
-				&.active{
-					background: #0066FE;
-					font-weight: bold;
-					color: #FFFFFF;
-				}
-				image{
-					width: 48rpx;
-					height: 48rpx;
-					position: absolute;
-					right: 0;
-					bottom: 0;
-					z-index: 22;
-				}
-			}
-		}
-		.intro{
-			margin-top: 40rpx;
-			background: #FFFFFF;
-			border-radius: 16rpx;
-			padding: 21rpx 24rpx 100rpx;
-			font-family: PingFangSC, PingFang SC;
-			font-weight: 400;
-			font-size: 28rpx;
-			color: #616161;
-			line-height: 56rpx;
-		}
-		.zt_btn{
-			margin-top: 96rpx;
-		}
-	}
-</style>

+ 0 - 118
pages/wifi - 副本.vue

@@ -1,118 +0,0 @@
-<template>
-	<view class="page" :style="{'min-height':h+'px', 'padding-top':mt+'px'}">
-		<cus-header title='无线局域网' bgColor="transparent"></cus-header>
-		<view class="content">
-		    <button @click="initWifi">初始化WiFi模块</button>
-		    <button @click="getConnectedWifi">获取已连接WiFi</button>
-		    <button @click="getWifiList">扫描WiFi列表</button>
-		    
-		    <view v-if="connectedWifi">
-		      <text>已连接: {{ connectedWifi.SSID }}</text>
-		      <text>信号强度: {{ connectedWifi.level }} dBm</text>
-		    </view>
-		
-		    <view v-for="(wifi, index) in wifiList" :key="index">
-		      <text>{{ wifi.SSID }}</text>
-		      <text>信号: {{ wifi.level }} dBm</text>
-		      <button @click="connectWifi(wifi)">连接</button>
-		    </view>
-		  </view>
-	</view>
-</template>
-
-<script>
-	export default {
-		data() {
-		    return {
-		      wifiList: [],
-		      connectedWifi: null
-		    }
-		  },
-		  methods: {
-		    // 初始化WiFi模块
-		    initWifi() {
-		      uni.startWifi({
-		        success: () => {
-		          uni.showToast({ title: 'WiFi模块初始化成功' });
-		          this.startWifiListener();
-		        },
-		        fail: (err) => {
-		          console.error('初始化失败:', err);
-		        }
-		      });
-		    },
-		
-		    // 获取已连接WiFi
-		    getConnectedWifi() {
-		      uni.getConnectedWifi({
-		        success: (res) => {
-		          this.connectedWifi = res.wifi;
-		        },
-		        fail: (err) => {
-		          console.error('获取失败:', err);
-		        }
-		      });
-		    },
-		
-		    // 扫描WiFi列表
-		    getWifiList() {
-		      uni.startWifi({
-		        success: () => {
-		          uni.getWifiList({
-		            success: (res) => {
-		              console.log('获取列表成功');
-		            },
-		            fail: (err) => {
-		              console.error('获取列表失败:', err);
-		            }
-		          });
-		        }
-		      });
-		    },
-		
-		    // 监听WiFi变化
-		    startWifiListener() {
-		      uni.onWifiConnected((res) => {
-		        this.connectedWifi = res.wifi;
-		      });
-		
-		      uni.onGetWifiList((res) => {
-		        this.wifiList = res.wifiList.sort((a, b) => b.level - a.level);
-		      });
-		    },
-		
-		    // 连接指定WiFi
-		    connectWifi(wifi) {
-		      uni.connectWifi({
-		        SSID: wifi.SSID,
-		        password: 'your_password', // 需要实际密码
-		        success: () => {
-		          uni.showToast({ title: '连接成功' });
-		        },
-		        fail: (err) => {
-		          console.error('连接失败:', err);
-		        }
-		      });
-		    }
-		  }
-	}
-</script>
-
-<style scoped lang="less">
-	.page{
-		background: #F1F3F5;
-		box-sizing: border-box;
-		
-		.content {
-		  padding: 20px;
-		}
-		
-		button {
-		  margin: 10px 0;
-		  padding: 8px;
-		  background-color: #007AFF;
-		  color: white;
-		  border-radius: 5px;
-		}
-	}
-</style>

+ 0 - 99
pages/wifi.vue

@@ -1,99 +0,0 @@
-<template>
-	<view class="page" :style="{'min-height':h+'px', 'padding-top':mt+'px'}">
-		<cus-header title='无线局域网' bgColor="transparent"></cus-header>
-		<div class="box" @tap="toSet">
-			<div class="info adffcacjc">
-				<image src="@/static/wifi.png"></image>
-				<text>无线局域网</text>
-				<p>接入无线局域网、查看可用网络,并管理加入网络及附近热点设置。<span>进一步了解...</span></p>
-			</div>
-			<div class="pre adfacjb">
-				<div class="p_l">无线局域网</div>
-				<div class="p_r">
-					<u-switch></u-switch>
-				</div>
-			</div>
-			<div class="pre adfacjb">
-				<div class="p_l">
-					<p>{{'传秀科技_5G'}}</p>
-					<span>低安全性</span>
-				</div>
-				<div class="p_r"></div>
-			</div>
-		</div>
-	</view>
-</template>
-
-<script>
-	export default {
-		data(){
-			return {
-				
-			}
-		},
-		methods:{
-			toSet(){
-				uni.navigateTo({
-					url:'/pages/wifiSet'
-				})
-			}
-		}
-	}
-</script>
-
-<style scoped lang="less">
-	.page{
-		background: #F1F3F5;
-		padding: 0 31rpx 30rpx;
-		box-sizing: border-box;
-		
-		.box{
-			width: 100%;
-			padding: 50rpx 30rpx 0;
-			box-sizing: border-box;
-			background: #FFFFFF;
-			
-			.info{
-				margin-bottom: 60rpx;
-				image{
-					width: 114rpx;
-					height: 114rpx;
-				}
-				text{
-					font-family: PingFang-SC, PingFang-SC;
-					font-weight: bold;
-					font-size: 40rpx;
-					color: #111111;
-					line-height: 40rpx;
-					margin-top: 20rpx;
-				}
-				p{
-					font-family: PingFang-SC, PingFang-SC;
-					font-weight: 400;
-					font-size: 34rpx;
-					color: #111111;
-					line-height: 40rpx;
-					text-align: center;
-					margin-top: 20rpx;
-				}
-			}
-			
-			.pre{
-				padding: 20rpx 30rpx;
-				border-top:1rpx solid #E5E5E5;
-				.p_l{
-					font-family: PingFang-SC, PingFang-SC;
-					font-weight: 400;
-					font-size: 32rpx;
-					color: #111111;
-					line-height: 40rpx;
-					display: flex;
-					flex-direction: column;
-					span{
-						font-size: 26rpx;
-					}
-				}
-			}
-		}
-	}
-</style>

+ 69 - 0
pagesHome/wifiSetMemo1.vue

@@ -0,0 +1,69 @@
+<template>
+	<view class="page" :style="{'min-height':h+'px', 'padding-top':mt+'px'}">
+		<cus-header title='配置网络说明'></cus-header>
+		<div class="top">打开设备开关,确认设备已通电开机成功</div>
+		<image class="tl" src="@/static/wifi_set1.png" mode="widthFix"></image>
+		<div class="tip">首次开机设备将会自动进入配网模式</div>
+		<div class="tip">已开机状态下,连续按Wi-Fi键三下,听到语音播报:“快去小程序绑定设备吧”,即已开始进入配网模式</div>
+		<div class="adffcacjc">
+			<image class="step" src="@/static/set_dian1.png"></image>
+			<div class="zt_btn" @tap="next">下一步</div>
+		</div>
+	</view>
+</template>
+
+<script>
+	export default {
+		data(){
+			return {
+				
+			}
+		},
+		methods:{
+			next(){
+				uni.navigateTo({
+					url:'/pagesHome/wifiSetMemo2'
+				})
+			}
+		}
+	}
+</script>
+
+<style scoped lang="less">
+	.page{
+		background: #FFFFFF;
+		.top{
+			font-family: PingFang-SC, PingFang-SC;
+			font-weight: bold;
+			font-size: 32rpx;
+			color: #000000;
+			line-height: 45rpx;
+			text-align: left;
+			margin-top: 40rpx;
+			padding-left: 40rpx;
+		}
+		.tl{
+			width: 100%;
+			margin-top: 60rpx;
+		}
+		.tip{
+			font-family: PingFangSC, PingFang SC;
+			font-weight: 400;
+			font-size: 24rpx;
+			color: #111111;
+			line-height: 33rpx;
+			text-align: left;
+			margin-top: 40rpx;
+			padding-left: 40rpx;
+		}
+		.step{
+			width: 100rpx;
+			height: 16rpx;
+			margin-top: 166rpx;
+		}
+		.zt_btn{
+			width: calc(100% - 140rpx) !important;
+			margin-top: 139rpx;
+		}
+	}
+</style>

+ 68 - 0
pagesHome/wifiSetMemo2.vue

@@ -0,0 +1,68 @@
+<template>
+	<view class="page" :style="{'min-height':h+'px', 'padding-top':mt+'px'}">
+		<cus-header title='配置网络说明'></cus-header>
+		<div class="top">授权打开 设置 - 开启无限局域网 </div>
+		<image class="tl" src="@/static/wifi_set2.png" mode="widthFix"></image>
+		<div class="adffcacjc">
+			<image class="step" src="@/static/set_dian2.png"></image>
+			<div class="zt_btn" @tap="next">下一步</div>
+		</div>
+	</view>
+</template>
+
+<script>
+	export default {
+		data(){
+			return {
+				
+			}
+		},
+		methods:{
+			next(){
+				uni.navigateTo({
+					url:'/pagesHome/wifiSetMemo3'
+				})
+			}
+		}
+	}
+</script>
+
+<style scoped lang="less">
+	.page{
+		background: #FFFFFF;
+		
+		.top{
+			font-family: PingFang-SC, PingFang-SC;
+			font-weight: bold;
+			font-size: 32rpx;
+			color: #000000;
+			line-height: 45rpx;
+			text-align: left;
+			margin-top: 40rpx;
+			padding-left: 40rpx;
+		}
+		.tl{
+			width: 100%;
+			margin-top: 60rpx;
+		}
+		.tip{
+			font-family: PingFangSC, PingFang SC;
+			font-weight: 400;
+			font-size: 24rpx;
+			color: #111111;
+			line-height: 33rpx;
+			text-align: left;
+			margin-top: 40rpx;
+			padding-left: 40rpx;
+		}
+		.step{
+			width: 100rpx;
+			height: 16rpx;
+			margin-top: 166rpx;
+		}
+		.zt_btn{
+			width: calc(100% - 140rpx) !important;
+			margin-top: 139rpx;
+		}
+	}
+</style>

+ 68 - 0
pagesHome/wifiSetMemo3.vue

@@ -0,0 +1,68 @@
+<template>
+	<view class="page" :style="{'min-height':h+'px', 'padding-top':mt+'px'}">
+		<cus-header title='配置网络说明'></cus-header>
+		<div class="top">找到 “Xiaozhi” Wi-Fi热点,点击连接成功</div>
+		<image class="tl" src="@/static/wifi_set3.png" mode="widthFix"></image>
+		<div class="adffcacjc">
+			<image class="step" src="@/static/set_dian3.png"></image>
+			<div class="zt_btn" @tap="next">下一步</div>
+		</div>
+	</view>
+</template>
+
+<script>
+	export default {
+		data(){
+			return {
+				
+			}
+		},
+		methods:{
+			next(){
+				uni.navigateTo({
+					url:'/pagesHome/wifiSetMemo4'
+				})
+			}
+		}
+	}
+</script>
+
+<style scoped lang="less">
+	.page{
+		background: #FFFFFF;
+		
+		.top{
+			font-family: PingFang-SC, PingFang-SC;
+			font-weight: bold;
+			font-size: 32rpx;
+			color: #000000;
+			line-height: 45rpx;
+			text-align: left;
+			margin-top: 40rpx;
+			padding-left: 40rpx;
+		}
+		.tl{
+			width: 100%;
+			margin-top: 60rpx;
+		}
+		.tip{
+			font-family: PingFangSC, PingFang SC;
+			font-weight: 400;
+			font-size: 24rpx;
+			color: #111111;
+			line-height: 33rpx;
+			text-align: left;
+			margin-top: 40rpx;
+			padding-left: 40rpx;
+		}
+		.step{
+			width: 100rpx;
+			height: 16rpx;
+			margin-top: 166rpx;
+		}
+		.zt_btn{
+			width: calc(100% - 140rpx) !important;
+			margin-top: 139rpx;
+		}
+	}
+</style>

+ 68 - 0
pagesHome/wifiSetMemo4.vue

@@ -0,0 +1,68 @@
+<template>
+	<view class="page" :style="{'min-height':h+'px', 'padding-top':mt+'px'}">
+		<cus-header title='配置网络说明'></cus-header>
+		<div class="top">选择要连接的Wi-Fi,输入Wi-Fi密码,配网成功</div>
+		<image class="tl" src="@/static/wifi_set4.png" mode="widthFix"></image>
+		<div class="adffcacjc">
+			<image class="step" src="@/static/set_dian4.png"></image>
+			<div class="zt_btn" @tap="goback">返回</div>
+		</div>
+	</view>
+</template>
+
+<script>
+	export default {
+		data(){
+			return {
+				
+			}
+		},
+		methods:{
+			goback(){
+				uni.redirectTo({
+					url:'/pagesMy/deviceAdd'
+				})
+			}
+		}
+	}
+</script>
+
+<style scoped lang="less">
+	.page{
+		background: #FFFFFF;
+		
+		.top{
+			font-family: PingFang-SC, PingFang-SC;
+			font-weight: bold;
+			font-size: 32rpx;
+			color: #000000;
+			line-height: 45rpx;
+			text-align: left;
+			margin-top: 40rpx;
+			padding-left: 40rpx;
+		}
+		.tl{
+			width: 100%;
+			margin-top: 60rpx;
+		}
+		.tip{
+			font-family: PingFangSC, PingFang SC;
+			font-weight: 400;
+			font-size: 24rpx;
+			color: #111111;
+			line-height: 33rpx;
+			text-align: left;
+			margin-top: 40rpx;
+			padding-left: 40rpx;
+		}
+		.step{
+			width: 100rpx;
+			height: 16rpx;
+			margin-top: 166rpx;
+		}
+		.zt_btn{
+			width: calc(100% - 140rpx) !important;
+			margin-top: 139rpx;
+		}
+	}
+</style>

+ 249 - 0
pagesMy/device.vue

@@ -0,0 +1,249 @@
+<template>
+	<view class="page" :style="{'min-height':h+'px', 'padding-top':mt+'px'}">
+		<cus-header title='设备管理'></cus-header>
+		<template v-if="list.length">
+			<div class="list" :style="{'height':'calc(100vh - '+(mt+100)+'px)'}">
+				<u-list @scrolltolower="scrolltolower">
+					<u-list-item v-for="(item, index) in list" :key="index">
+						<div class="l_box box">
+							<div class="l_top adfacjb">
+								<div class="lt_l">我的设备:{{1}}</div>
+								<div class="lt_r adfac">
+									<image src="@/static/wifi_on_mini.png" v-if="index===0"></image>
+									<image src="@/static/wifi_off_mini.png" v-else></image>
+									<image src="@/static/online_mini.png" v-if="index===0"></image>
+									<image src="@/static/offline_mini.png" v-else></image>
+									<div class="ltr_zt" :class="{'zx':index===0,'lx':index===1}">{{index===0?'在线':'离线'}}</div>
+								</div>
+							</div>
+							<div class="l_content">
+								<div class="lc_role adfac">
+									<image class="lcr_l" src="@/static/avatar_default.png"></image>
+									<div class="lcr_r">
+										<p>{{'角色昵称'}}</p>
+										<div class="text">角色模板:{{'英语老师'}}</div>
+										<div class="text">绑定时间:{{'2025-05-25'}}</div>
+									</div>
+								</div>
+								<div class="lc_btns adfac">
+									<div class="lcb_pre">角色编辑</div>
+									<div class="lcb_pre">更换网络</div>
+									<div class="lcb_pre" @tap="unbindDevice">解绑设备</div>
+								</div>
+							</div>
+						</div>
+					</u-list-item>
+				</u-list>
+			</div>
+		</template>
+		<template v-else>
+			<div class="empty adffcacjc" :style="{'height':'calc(100vh - '+(mt+100)+'px)'}">
+				<image src="@/static/empty_device.png"></image>
+				<p>暂无绑定设备</p>
+			</div>
+		</template>
+		<div class="btns adfacjb">
+			<div class="zt_btn" @tap="scanBindDevice">扫码绑定设备</div>
+			<div class="zt_btn" @tap="wifiBindDevice">配网并绑定设备</div>
+		</div>
+	</view>
+</template>
+
+<script>
+	export default {
+		data(){
+			return {
+				list:[]
+			}
+		},
+		methods:{
+			scrolltolower(){
+				
+			},
+			getList(){
+				
+			},
+			scanBindDevice(){
+				
+			},
+			wifiBindDevice(){
+				this.list = [1,1,1,1];
+				uni.navigateTo({
+					url:'/pagesMy/deviceAdd'
+				})
+			},
+			unbindDevice(){
+				uni.showModal({
+					title:'温馨提示',
+					content:'确定要解绑该设备吗?',
+					success: (res) => {
+						this.$api.post('/device/unbind',{deviceId:item.id}).then(res=>{
+							if(res.data.code!==0) return this.$showToast(res.data.msg)
+							this.$showToast('解绑成功');
+							setTimeout(()=>{
+								this.getList();
+							},1000)
+						})
+					}
+				})
+			}
+		}
+	}
+</script>
+
+<style scoped lang="less">
+	.page{
+		padding: 0 21rpx 172rpx;
+		box-sizing: border-box;
+		
+		.box{
+			position: relative;
+			width: calc(100% - 60rpx);
+			background: #FFFFFF;
+			box-shadow: 0rpx 4rpx 20rpx 0rpx rgba(0,0,0,0.04);
+			border-radius: 32rpx;
+			border: 1rpx solid #D9F159;
+			box-sizing: border-box;
+		}
+		
+		.list{
+			position: relative;
+			::v-deep .u-list{
+				width: 100%;
+				height: 100% !important;
+			}
+			::v-deep .u-list-item{
+				width: 100%;
+			}
+			.l_box{
+				width: 100%;
+				padding: 49rpx 30rpx 40rpx;
+				margin-top: 20rpx;
+				.l_top{
+					.lt_l{
+						font-family: PingFang-SC, PingFang-SC;
+						font-weight: bold;
+						font-size: 32rpx;
+						color: #111111;
+						line-height: 40rpx;
+					}
+					.lt_r{
+						image{
+							width: 42rpx;
+							height: 42rpx;
+							margin-right: 34rpx;
+						}
+						.ltr_zt{
+							font-family: PingFangSC, PingFang SC;
+							font-weight: 400;
+							font-size: 26rpx;
+							line-height: 37rpx;
+							padding-left: 22rpx;
+							position: relative;
+							&::before{
+								content: '';
+								width: 12rpx;
+								height: 12rpx;
+								border-radius: 50%;
+								position: absolute;
+								left: 0;
+								top: 50%;
+								margin-top: -6rpx;
+							}
+							&.zx{
+								color: #1B50FF;
+								&::before{
+									background: #1B50FF;
+								}
+							}
+							&.lx{
+								color: #C7C7C7;
+								&::before{
+									background: #C7C7C7;
+								}
+							}
+						}
+					}
+				}
+				.l_content{
+					border-top: 1rpx solid #E2E2E2;
+					margin-top: 37rpx;
+					padding-top: 36rpx;
+					overflow: hidden;
+					.lc_role{
+						.lcr_l{
+							width: 148rpx;
+							height: 148rpx;
+							border-radius: 50%;
+						}
+						.lcr_r{
+							width: calc(100% - 148rpx);
+							padding-left: 30rpx;
+							box-sizing: border-box;
+							p{
+								font-family: PingFang-SC, PingFang-SC;
+								font-weight: bold;
+								font-size: 32rpx;
+								color: #111111;
+								line-height: 32rpx;
+								overflow: hidden;
+								white-space: nowrap;
+								text-overflow: ellipsis;
+							}
+							.text{
+								font-family: PingFangSC, PingFang SC;
+								font-weight: 400;
+								font-size: 24rpx;
+								color: #7C8592;
+								line-height: 24rpx;
+								margin-top: 24rpx;
+							}
+						}
+					}
+					.lc_btns{
+						margin-top: 62rpx;
+						margin-left: -1rpx;
+						overflow: hidden;
+						.lcb_pre{
+							width: calc(100% / 3);
+							height: 37rpx;
+							border-left: 1rpx solid #72832B;
+							font-family: PingFang-SC, PingFang-SC;
+							font-weight: bold;
+							font-size: 26rpx;
+							color: #72832B;
+							line-height: 37rpx;
+							text-align: center;
+						}
+					}
+				}
+			}
+		}
+	
+		.empty{
+			image{
+				width: 64rpx;
+				height: 66rpx;
+			}
+			p{
+				font-family: PingFangSC, PingFang SC;
+				font-weight: 400;
+				font-size: 30rpx;
+				color: #A6A6A6;
+				line-height: 42rpx;
+				text-align: center;
+				margin-top: 30rpx;
+			}
+		}
+	
+		.btns{
+			width: calc(100% - 60rpx);
+			position: fixed;
+			left: 20rpx;
+			bottom: 64rpx;
+			.zt_btn{
+				width: calc(50% - 15rpx);
+			}
+		}
+	}
+</style>

+ 161 - 0
pagesMy/deviceAdd.vue

@@ -0,0 +1,161 @@
+<template>
+	<view class="page" :style="{'min-height':h+'px', 'padding-top':mt+'px'}">
+		<cus-header title='添加新设备' bgColor='transparent'></cus-header>
+		<image class="topbg" src="@/static/device_add_bg.png" mode="widthFix"></image>
+		<div class="icons adfacjb">
+			<image src="@/static/device_query.png"></image>
+			<image class="next" src="@/static/device_next.png"></image>
+			<image src="@/static/device_wifi.png"></image>
+			<image class="next" src="@/static/device_next.png"></image>
+			<image src="@/static/device_scan.png"></image>
+		</div>
+		<div class="tip">请确认玩具已开机,点击下方开始配网</div>
+		<div class="memo adfacjb" @tap="showSetMemo">
+			<image src="@/static/info_mini.png"></image>
+			<text>配置网络说明</text>
+		</div>
+		<div class="steps">
+			<div class="item">
+				<div class="yuan"></div>
+				<p>首次开机设备将会自动进入配网模式</p>
+			</div>
+			<div class="item">
+				<div class="yuan"></div>
+				<p>选择<span>"xiaozhi"</span>Wi-Fi热点,连接成功</p>
+			</div>
+			<div class="item">
+				<div class="yuan"></div>
+				<p>选择网络,输入Wi-Fi密码,设备配网成功</p>
+			</div>
+			<div class="item">
+				<div class="yuan"></div>
+				<p>扫描设备或说明书上的二维码,绑定设备成功</p>
+			</div>
+		</div>
+		<div class="zt_btn" @tap="startWiFi">开始配网</div>
+	</view>
+</template>
+
+<script>
+	export default {
+		data(){
+			return {
+				
+			}
+		},
+		methods:{
+			startWiFi(){
+				uni.navigateTo({
+					url:'/pagesMy/wifi'
+				})
+			},
+			showSetMemo(){
+				uni.navigateTo({
+					url:'/pagesHome/wifiSetMemo1'
+				})
+			}
+		}
+	}
+</script>
+
+<style scoped lang="less">
+	.page{
+		background: #FFFFFF;
+		padding: 0 60rpx 160rpx;
+		box-sizing: border-box;
+		display: flex;
+		flex-direction: column;
+		align-items: center;
+		
+		.topbg{
+			width: 100%;
+			position: fixed;
+			left: 0;
+			top: 0;
+		}
+		
+		.icons{
+			width: 100%;
+			position: relative;
+			margin-top: 57rpx;
+			image{
+				width: 56rpx;
+				height: 56rpx;
+				&.next{
+					width: 80rpx;
+					height: 14rpx;
+				}
+			}
+		}
+		.tip{
+			position: relative;
+			margin-top: 260rpx;
+			font-family: PingFangSC, PingFang SC;
+			font-weight: 400;
+			font-size: 26rpx;
+			color: #7C8592;
+			line-height: 37rpx;
+			text-align: center;
+		}
+		.memo{
+			width: 250rpx;
+			position: relative;
+			margin-top: 36rpx;
+			background: rgba(27,80,255,0.06);
+			border-radius: 28rpx;
+			padding: 10rpx 29rpx;
+			box-sizing: border-box;
+			image{
+				width: 26rpx;
+				height: 26rpx;
+			}
+			text{
+				font-family: PingFangSC, PingFang SC;
+				font-weight: 400;
+				font-size: 26rpx;
+				color: #1B50FF;
+				line-height: 37rpx;
+				margin-left: 10rpx;
+			}
+		}
+		.steps{
+			margin-top: 219rpx;
+			margin-left: 16rpx;
+			border-left: 1rpx solid #E2E2E2;
+			padding-left: 30rpx;
+			.item{
+				margin-top: 58rpx;
+				position: relative;
+				&:first-child{
+					margin-top: 0;
+				}
+				.yuan{
+					width: 32rpx;
+					height: 32rpx;
+					border-radius: 50%;
+					border: 2rpx solid #C7C7C7;
+					background: #FFFFFF;
+					box-shadow: 0 0 4rpx 4rpx #FFFFFF;
+					position: absolute;
+					left: -48rpx;
+					top: 50%;
+					margin-top: -16rpx;
+				}
+				p{
+					font-family: PingFangSC, PingFang SC;
+					font-weight: 400;
+					font-size: 26rpx;
+					color: #7C8592;
+					line-height: 37rpx;
+					span{
+						font-weight: bold;
+						color: #111111;
+					}
+				}
+			}
+		}
+		.zt_btn{
+			margin-top: 149rpx;
+		}
+	}
+</style>

+ 220 - 0
pagesMy/feedback.vue

@@ -0,0 +1,220 @@
+<template>
+	<view class="page" :style="{'min-height':h+'px', 'padding-top':mt+'px'}">
+		<cus-header title='意见反馈' :titleStyle="{'color':'transparent'}" bgColor='transparent'></cus-header>
+		<image class="topbg" src="@/static/feedback_bg.png"></image>
+		<div class="box" style="margin-top: 189rpx;">
+			<div class="title adfac">选择问题类型<span>*</span></div>
+			<div class="list adfacjb">
+				<div class="pre adffcacjc" :class="{'active':tidx===1}" @tap="changeType(1)">
+					<text>功能异常</text>
+					<image src="@/static/selected_dh.png" v-if="tidx===1"></image>
+				</div>
+				<div class="pre adffcacjc" :class="{'active':tidx===2}" @tap="changeType(2)">
+					<text>新功能建议</text>
+					<image src="@/static/selected_dh.png" v-if="tidx===2"></image>
+				</div>
+				<div class="pre adffcacjc" :class="{'active':tidx===3}" @tap="changeType(3)">
+					<text>其他</text>
+					<image src="@/static/selected_dh.png" v-if="tidx===3"></image>
+				</div>
+			</div>
+		</div>
+		<div class="box">
+			<div class="title adfac">问题描述<span>*</span></div>
+			<div class="desc">
+				<u-textarea height="160rpx" v-model="dto.desc" placeholder="尽量详细描述您遇到的问题、具体位置及体现形式等" border="none"></u-textarea>
+			</div>
+		</div>
+		<div class="box">
+			<div class="title adfac">图片补充<span class="tip">上传问题截图可以让问题快速解决哦!</span></div>
+			<div class="upload">
+				<u-upload width="148rpx" height="148rpx"
+					:fileList="fileList"
+				    @afterRead="afterRead"
+				    @delete="deletePic"
+				    :maxCount="1"
+				></u-upload>
+			</div>
+		</div>
+		<div class="box lxfs adfacjb">
+			<div class="title">联系方式</div>
+			<div class="contact">
+				<u-input v-model="dto.contact" placeholder="手机号/QQ号/微信号,方便与您联系" border="none"></u-input>
+			</div>
+		</div>
+		<div class="zt_btn" @tap="submit">提交</div>
+	</view>
+</template>
+
+<script>
+	const baseApi = require('@/http/baseApi.js')
+	export default {
+		data(){
+			return {
+				tidx:1,
+				dto:{
+					type:1,
+					desc:'',
+					photo:'',
+					contact:''
+				},
+				fileList:[],
+			}
+		},
+		methods:{
+			changeType(type){
+				this.tidx = type;
+			},
+			// 删除图片
+			deletePic(event) {
+				this.fileList.splice(event.index, 1);
+			},
+			// 新增图片
+			async afterRead(event) {
+				// 当设置 multiple 为 true 时, file 为数组格式,否则为对象格式
+				let lists = [].concat(event.file);
+				let fileListLen = this.fileList.length;
+				lists.map((item) => {
+				  this.fileList.push({
+					...item,
+					status: "uploading",
+					message: "上传中",
+				  });
+				});
+				for (let i = 0; i < lists.length; i++) {
+				  const result = await this.uploadFilePromise(lists[i].url);
+				  let item = this.fileList[fileListLen];
+				  this.fileList.splice(
+					fileListLen,
+					1,
+					Object.assign(item, {
+					  status: "success",
+					  message: "",
+					  url: result,
+					})
+				  );
+				  fileListLen++;
+				}
+			},
+			uploadFilePromise(url) {
+				return new Promise((resolve, reject) => {
+				  let a = uni.uploadFile({
+					url: baseApi.BaseApi + '/uploadFile',
+					filePath: url,
+					name: "file",
+					success: (res) => {
+						let data = JSON.parse(res.data);
+						if(data){
+							if(data.code!==0) return
+							setTimeout(() => {
+								resolve(data.data);
+							}, 1000);
+						}
+					},
+				  });
+				});
+			},
+			submit(){
+				if(!this.dto.desc) return this.$showToast('请输入问题描述')
+			}
+		}
+	}
+</script>
+
+<style scoped lang="less">
+	.page{
+		background: #F7F6F9;
+		padding: 0 30rpx 30rpx;
+		box-sizing: border-box;
+		
+		.topbg{
+			width: 100%;
+			position: fixed;
+			left: 0;
+			top: 0;
+		}
+		
+		.box{
+			width: 100%;
+			background: #FFFFFF;
+			border-radius: 24rpx;
+			margin-top: 20rpx;
+			padding: 40rpx 24rpx;
+			box-sizing: border-box;
+			position: relative;
+			
+			.title{
+				font-family: PingFang-SC, PingFang-SC;
+				font-weight: bold;
+				font-size: 32rpx;
+				color: #111111;
+				line-height: 32rpx;
+				span{
+					color: #F31616;
+					&.tip{
+						font-weight: 400;
+						font-size: 24rpx;
+						color: #A6A6A6;
+						margin-left: 10rpx;
+					}
+				}
+			}
+			
+			&.lxfs{
+				.title{
+					width: 154rpx;
+				}
+				.contact{
+					width: calc(100% - 154rpx);
+				}
+			}
+		}
+		
+		.list{
+			margin-top: 48rpx;
+			.pre{
+				width: calc(100% / 3 - 14rpx);
+				height: 80rpx;
+				background: #FFFFFF;
+				border-radius: 16rpx;
+				border: 1rpx solid #C7C7C7;
+				font-family: PingFangSC, PingFang SC;
+				font-weight: 400;
+				font-size: 28rpx;
+				color: #333333;
+				line-height: 80rpx;
+				text-align: center;
+				position: relative;
+				image{
+					width: 48rpx;
+					height: 48rpx;
+					position: absolute;
+					right: 0;
+					bottom: 0;
+				}
+				&.active{
+					background: #D9F159;
+					border: 1rpx solid #D9F159;
+					font-weight: bold;
+					color: #111111;
+				}
+			}
+		}
+		
+		.desc{
+			margin-top: 40rpx;
+		}
+		
+		.upload{
+			margin-top: 54rpx;
+			width: 148rpx;
+			height: 148rpx;
+			background: url('@/static/upload.png') no-repeat;
+			background-size: 100% 100%;
+		}
+		
+		.zt_btn{
+			margin-top: 30rpx;
+		}
+	}
+</style>

+ 70 - 0
pagesMy/scanResult.vue

@@ -0,0 +1,70 @@
+<template>
+	<view class="page" :style="{'min-height':h+'px', 'padding-top':mt+'px'}">
+		<cus-header title='扫码结果'></cus-header>
+		<image src="@/static/scan_result.png"></image>
+		<p>设备绑定成功</p>
+		<p class="tip">您可以创建新角色,或选择已有角色<br>配置到当前设备</p>
+		<div class="zt_btn" @tap="addRole">为设备添加角色</div>
+		<div class="qx_btn" @tap="goBack">返回首页</div>
+	</view>
+</template>
+
+<script>
+	export default {
+		data(){
+			return {
+				
+			}
+		},
+		methods:{
+			addRole(){
+				uni.navigateTo({
+					url:'/pagesRole/addRole'
+				})
+			},
+			goBack(){
+				uni.reLaunch({
+					url:'/pages/home'
+				})
+			},
+		}
+	}
+</script>
+
+<style scoped lang="less">
+	.page{
+		background: #FFFFFF;
+		display: flex;
+		flex-direction: column;
+		align-items: center;
+		padding: 0 60rpx;
+		image{
+			width: 400rpx;
+			height: 430rpx;
+			margin-top: 92rpx;
+		}
+		p{
+			font-family: PingFang-SC, PingFang-SC;
+			font-weight: bold;
+			font-size: 40rpx;
+			color: #111111;
+			line-height: 40rpx;
+			text-align: center;
+			margin-top: 35rpx;
+			&.tip{
+				font-weight: 400;
+				font-size: 26rpx;
+				color: #7C8592;
+				line-height: 41rpx;
+				text-align: center;
+				margin-top: 29rpx;
+			}
+		}
+		.zt_btn{
+			margin-top: 232rpx;
+		}
+		.qx_btn{
+			margin-top: 60rpx;
+		}
+	}
+</style>

+ 22 - 0
pagesMy/useBook.vue

@@ -0,0 +1,22 @@
+<template>
+	<view class="page" :style="{'min-height':h+'px', 'padding-top':mt+'px'}">
+		<cus-header title='用户使用手册'></cus-header>
+	</view>
+</template>
+
+<script>
+	export default {
+		data(){
+			return {
+				
+			}
+		},
+		methods:{
+			
+		}
+	}
+</script>
+
+<style scoped lang="less">
+	
+</style>

+ 232 - 0
pagesMy/wifi.vue

@@ -0,0 +1,232 @@
+<template>
+	<view class="page" :style="{'min-height':h+'px', 'padding-top':mt+'px'}">
+		<cus-header title='无线局域网' bgColor="transparent"></cus-header>
+		<div class="box">
+			<div class="info adffcacjc">
+				<image src="@/static/wifi.png"></image>
+				<text>无线局域网</text>
+				<p>接入无线局域网、查看可用网络,并管理加入网络及附近热点设置。</p>
+			</div>
+			<div class="pre adfacjb">
+				<div class="p_l">无线局域网</div>
+				<div class="p_r">
+					<u-switch v-model="openWifi" size="46" activeColor="#5AC725"></u-switch>
+				</div>
+			</div>
+			<div class="pre adfacjb" v-for="(item,index) in wifiList" :key="index" @tap="toSet(item)">
+				<div class="p_l">
+					<p>{{item.SSID}}</p>
+					<span>{{item.secure?'高安全性':'低安全性'}}</span>
+				</div>
+				<div class="p_r"></div>
+			</div>
+		</div>
+		<div class="box" v-if="myWifi">
+			<div class="title">我的网络</div>
+			<div class="pre adfacjb">
+				<div class="p_l">{{myWifi}}</div>
+				<div class="p_r"></div>
+			</div>
+		</div>
+	</view>
+</template>
+
+<script>
+	export default {
+		data(){
+			return {
+				openWifi:false,
+				wifiList:[],
+				myWifi:'111'
+			}
+		},
+		watch:{
+			openWifi:{
+				handler(newval,oldval){
+					if(newval!==oldval){
+						this.dealWifi(newval)
+					}
+				}
+			}
+		},
+		onLoad() {
+			this.getCurrentWifi();
+		},
+		methods:{
+			getCurrentWifi(){
+				wx.startWifi({
+					success(res){
+						wx.getConnectedWifi({
+							success(res){
+								
+							}
+						})
+					},
+					fail: (err) => {
+						console.log(err,'err');
+						if(err.errMsg.indexOf('wifi is disable')>-1) that.$showToast('WiFi未开启')
+					}
+				})
+			},
+			dealWifi(flag){
+				uni.navigateTo({
+					url:'/pagesMy/wifiSet'
+				})
+				return
+				
+				let that = this;
+				if(flag){
+					uni.showLoading({
+						title:'获取WiFi列表中'
+					})
+					wx.startWifi({
+						success (res) {
+							wx.getWifiList({
+								success(res2) {
+									wx.onGetWifiList(res3 => {
+										let temp = [];
+										res3.wifiList.forEach(w=>{
+											if(w.SSID){
+												let exit = temp.find(t=>t.SSID===w.SSID);
+												if(!exit) temp = [...temp,w]
+											}
+										})
+										that.$nextTick(()=>{
+											that.wifiList = temp;
+											that.$forceUpdate();
+											uni.hideLoading();
+										})
+									})
+								},
+								fail(err) {
+									console.log(err,'err')
+								}
+							})
+						},
+						fail: (err) => {
+							console.log(err,'err');
+							if(err.errMsg.indexOf('wifi is disable')>-1) that.$showToast('WiFi未开启')
+						}
+					})
+				}else{
+					this.wifiList = [];
+				} 
+			},
+			toSet(item){
+				if(item.SSID.indexOf('Xiaozhi-')>-1){
+					uni.connectWifi({
+						SSID: item.SSID,
+						password: '',
+						success: (resu) => {
+							console.log(resu,'resu');
+							wx.request({
+								url:'http://192.168.4.1/scan',
+								success:res=>{
+									console.log(res,'res');
+									wx.request({
+										url:'http://192.168.4.1/submit',
+										method:'POST',
+										data:{
+											ssid:'传秀科技',
+											password:'cx868688'
+										},
+										success:res2=>{
+											console.log(res2,'res2');
+											wx.request({
+												url:'http://192.168.4.1/reboot',
+												method:'POST',
+												success:res3=>{
+													console.log(res3,'res3');
+												},
+												fail:err3=>{
+													console.log(err3,'err3');
+												}
+											})
+										},
+										fail:err2=>{
+											console.log(err2,'err2');
+										}
+									})
+								},
+								fail:err=>{
+									console.log(err,'err');
+								}
+							})
+							
+							// setTimeout(()=>{
+							// 	uni.navigateTo({
+							// 		url:'/pages/wifiSet'
+							// 	})
+							// },1500)
+						},
+						fail: (err) => { 
+							console.log(err,'err');
+						}
+					});
+				}else this.$showToast('请选择Xiaozhi开头的热点')
+			}
+		}
+	}
+</script>
+
+<style scoped lang="less">
+	.page{
+		background: #FFFFFF;
+		padding: 0 31rpx 30rpx;
+		box-sizing: border-box;
+		
+		.box{
+			width: 100%;
+			padding: 50rpx 30rpx 0;
+			box-sizing: border-box;
+			background: #FFFFFF;
+			
+			.info{
+				margin-bottom: 60rpx;
+				image{
+					width: 114rpx;
+					height: 114rpx;
+				}
+				text{
+					font-family: PingFang-SC, PingFang-SC;
+					font-weight: bold;
+					font-size: 40rpx;
+					color: #111111;
+					line-height: 40rpx;
+					margin-top: 20rpx;
+				}
+				p{
+					font-family: PingFang-SC, PingFang-SC;
+					font-weight: 400;
+					font-size: 34rpx;
+					color: #111111;
+					line-height: 40rpx;
+					text-align: center;
+					margin-top: 20rpx;
+				}
+			}
+			
+			.pre{
+				padding: 20rpx 30rpx;
+				border-top:1rpx solid #E5E5E5;
+				.p_l{
+					font-family: PingFang-SC, PingFang-SC;
+					font-weight: 400;
+					font-size: 32rpx;
+					color: #111111;
+					line-height: 40rpx;
+					display: flex;
+					flex-direction: column;
+					span{
+						font-size: 26rpx;
+					}
+				}
+			}
+		
+			.title{
+				color: #666666;
+				margin-bottom: 40rpx;
+			}
+		}
+	}
+</style>

+ 115 - 25
pages/wifiSet.vue

@@ -9,21 +9,21 @@
 			<div class="b_pre">
 				<div class="bp_text">SSID:</div>
 				<div class="bp_inp">
-					<input type="text">
+					<input type="text" v-model="wifiSSID">
 				</div>
 			</div>
 			<div class="b_pre">
 				<div class="bp_text">密码:</div>
 				<div class="bp_inp">
-					<input type="password">
+					<input type="password" v-model="wifiPwd">
 				</div>
 			</div>
 			<div class="zt_btn" @tap="toConnectWiFi">连接</div>
 		</div>
 		<div class="box">
 			<div class="b_title">从下面列表选择2.4GWiFi:</div>
-			<div class="b_wifi adfac" v-for="(item,index) in wifi2gList" :key="index" @tap="toCode">
-				<text>{{'REITH SPAEC(-40 dBm)'}}</text>
+			<div class="b_wifi adfac" v-for="(item,index) in wifi2gList" :key="index" @tap="toCode(item)">
+				<text>{{item.SSID}}</text>
 				<image src="@/static/lock.png"></image>
 			</div>
 		</div>
@@ -42,37 +42,127 @@
 	export default {
 		data(){
 			return {
-				wifi2gList:[1,1,1],
-				show:false
+				wifiSSID:'',
+				wifiPwd:'',
+				wifi2gList:[],
+				show:false,
+				tcp:'',
 			}
 		},
+		onLoad() {
+			this.initWiFi();
+		},
 		methods:{
+			initWiFi(){
+				uni.showLoading({
+					title:'获取WiFi列表中'
+				})
+				try{
+					// wx.request({
+					// 	url:'http://192.168.4.1/scan',
+					// 	success:res=>{
+					// 		console.log(res,'res');
+					// 		uni.hideLoading();
+					// 	},
+					// 	fail:err=>{
+					// 		console.log(err,'err');
+					// 		uni.hideLoading();
+					// 	}
+					// })
+				}catch(e){
+					console.log(e,'e');
+					uni.hideLoading();
+				}
+				// let that = this;
+				// wx.startWifi({
+				// 	complete (res) {
+				// 		wx.getWifiList({
+				// 			success(res2) {
+				// 				wx.onGetWifiList(res3=> {
+				// 					let temp = [];
+				// 					res3.wifiList.forEach(w=>{
+				// 						if(w.SSID&&w.SSID.indexOf('Xiaozhi-')<0){
+				// 							let exit = temp.find(t=>t.SSID===w.SSID);
+				// 							if(!exit) temp = [...temp,w]
+				// 						}
+				// 					})
+				// 					that.$nextTick(()=>{
+				// 						that.wifi2gList = temp;
+				// 						that.$forceUpdate();
+				// 						uni.hideLoading();
+				// 					})
+				// 				})
+				// 			},
+				// 			fail(err) {
+				// 				console.log(err,'err')
+				// 			}
+				// 		})
+				// 	}
+				// })
+			},
 			toConnectWiFi(){
-				this.show = true;
+				uni.navigateTo({
+					url:'/pagesMy/wifiSuccess'
+				})
+				return
+				
+				console.log(111);
+				console.log(this.wifiSSID,'this.wifiSSID');
+				console.log(this.wifiPwd,'this.wifiPwd');
+				uni.connectWifi({
+					SSID: this.wifiSSID,
+					password: this.wifiPwd,
+					success: (res) => { 
+						console.log(res,'res');
+						this.show = false;
+						this.$showToast('网络连接成功,开始TCP链接');
+						this.connectTCP();
+					},
+					fail: (err) => { 
+						console.log(err,'err');
+						this.show = true;
+					}
+				});
 			},
 			toTryAgain(){
-				this.show = false;
-				uni.showToast({
-					icon:'success',
-					title:'网络连接成功'
-				})
+				this.toConnectWiFi();
+			},
+			// 链接TCP
+			connectTCP() {
+				console.log(222);
+				try{
+					this.tcp = wx.createTCPSocket();
+					this.tcp.connect({
+					  address: '192.168.4.1',
+					  // port: 8266,
+					});
+					this.$nextTick(()=>{
+						this.sendDataTCP();
+					})
+				}catch(e){
+					console.log(e,'e');
+					this.$showModal(JSON.stringify(e))
+				}
+			},
+			// 发送命令-账号密码
+			sendDataTCP() {
+				console.log(333);
+				this.tcp.write(`AT+CJWAP=${this.wifiSSID},${this.wifiPwd}`);
+				this.$nextTick(()=>{
+					this.sendRST();
+				})
+			},
+			// 发送命令-重启
+			sendRST(){
+				console.log(444);
+				this.tcp.write('AT+RST');
+				this.$showToast('配置成功,设备已重启')
 			},
 			close(){
 				this.show = false;
 			},
-			toCode(){
-				uni.scanCode({
-					success: (res) => {
-						console.log(res,'res');
-						uni.navigateTo({
-							url:'/pages/code'
-						})
-					},
-					fail: (err) => {
-						console.log(err,'err');
-					}
-				})
-				
+			toCode(item){
+				this.wifiSSID = item.SSID;
 			}
 		}
 	}

+ 91 - 0
pagesMy/wifiSuccess.vue

@@ -0,0 +1,91 @@
+<template>
+	<view class="page" :style="{'min-height':h+'px', 'padding-top':mt+'px'}">
+		<cus-header title='配置网络'></cus-header>
+		<image src="@/static/wifi_success.png"></image>
+		<p>网络配置成功</p>
+		<p class="tip">请扫描设备或说明书上的二维码<br>点击下方扫码绑定设备,<br>如您已添加过设备,可返回首页开始使用</p>
+		<div class="zt_btn" @tap="scanDevice">扫码绑定设备</div>
+		<div class="qx_btn" @tap="goBack">返回首页</div>
+	</view>
+</template>
+
+<script>
+	export default {
+		data(){
+			return {
+				
+			}
+		},
+		methods:{
+			scanDevice(){
+				uni.navigateTo({
+					url:'/pagesMy/scanResult'
+				})
+				return
+				
+				uni.scanCode({
+					success: (res) => {
+						let result = JSON.parse(res.result);
+						if(res.errMsg==='scanCode:ok'){
+							this.$api.post('/device/bindAdd',{
+								...result,
+								"type": "",
+								"userId": 0,
+								"agentId": ""
+							}).then(res=>{
+								if(res.data.code!==0) return this.$showToast(res.data.msg)
+								uni.navigateTo({
+									url:'/pagesMy/scanResult'
+								})
+							})
+						}
+					}
+				})
+			},
+			goBack(){
+				uni.reLaunch({
+					url:'/pages/home'
+				})
+			}
+		}
+	}
+</script>
+
+<style scoped lang="less">
+	.page{
+		background: #FFFFFF;
+		display: flex;
+		flex-direction: column;
+		align-items: center;
+		padding: 0 70rpx;
+		
+		image{
+			width: 213rpx;
+			height: 163rpx;
+			margin-top: 198rpx;
+		}
+		p{
+			font-family: PingFang-SC, PingFang-SC;
+			font-weight: bold;
+			font-size: 40rpx;
+			color: #111111;
+			line-height: 40rpx;
+			text-align: center;
+			margin-top: 54rpx;
+			&.tip{
+				font-weight: 400;
+				font-size: 28rpx;
+				color: #7C8592;
+				line-height: 42rpx;
+				text-align: center;
+				margin-top: 40rpx;
+			}
+		}
+		.zt_btn{
+			margin-top: 193rpx;
+		}
+		.qx_btn{
+			margin-top: 60rpx;
+		}
+	}
+</style>

+ 296 - 0
pagesRole/addRole.vue

@@ -0,0 +1,296 @@
+<template>
+	<view class="page" :style="{'min-height':h+'px', 'padding-top':mt+'px'}">
+		<cus-header title='创建角色' bgColor="transparent"></cus-header>
+		<div class="box">
+			<div class="title adfac">角色形象<span>*</span></div>
+			<div class="upload">
+				<div class="sc">
+					<u-upload width="188rpx" height="188rpx"
+						:fileList="fileList"
+					    @afterRead="afterRead"
+					    @delete="deletePic"
+					    :maxCount="1"
+					>
+						<div class="imgs">
+							<image class="img1" src="@/static/role_upload.png"></image>
+							<image class="img2" src="@/static/upload_add.png"></image>
+						</div>
+					</u-upload>
+				</div>
+				<div class="text">上传角色形象</div>
+			</div>
+		</div>
+		<div class="box adfacjb">
+			<div class="title">角色昵称<span>*</span></div>
+			<input type="text" placeholder="请输入角色昵称" placeholder-class="ph">
+		</div>
+		<div class="box adfacjb" @tap="selectModel">
+			<div class="title">角色模板<span>*</span></div>
+			<div class="right adfac">
+				<div class="mtext" :class="{'active':modelText!=='请选择角色模版'}">{{modelText}}</div>
+				<image src="@/static/arrow_right.png"></image>
+			</div>
+		</div>
+		<div class="box">
+			<div class="top adfacjb">
+				<div class="title">设备描述</div>
+				<div class="tip">回显不可编辑</div>
+			</div>
+			<div class="desc">{{''}}</div>
+		</div>
+		<div class="box adfacjb">
+			<div class="title">音色<span>*</span></div>
+			<div class="right adfac">
+				<div class="mtext" :class="{'active':voiceText!=='请选择音色'}">{{voiceText}}</div>
+				<image src="@/static/arrow_right.png"></image>
+			</div>
+		</div>
+		<div class="zt_btn">创建角色</div>
+		<u-picker :itemHeight="88" title="角色音色" :show="show" :columns="voiceList" keyName="name"
+			@cancel="show=false" @confirm="confirm" :immediateChange="true" style="height: 500rpx;">
+		</u-picker>
+	</view>
+</template>
+
+<script>
+	const baseApi = require('@/http/baseApi.js')
+	export default {
+		data(){
+			return {
+				modelText:'请选择角色模版',
+				voiceText:'请选择音色',
+				fileList:[],
+				show:false,
+				voiceList:[],
+				modelMap:new Map(),
+				agentDto:{
+					
+				}
+			}
+		},
+		async onLoad() {
+			await this.getAgentModelList()
+			this.getModelVoiceList()
+		},
+		methods:{
+			// 删除图片
+			deletePic(event) {
+				this.fileList.splice(event.index, 1);
+			},
+			// 新增图片
+			async afterRead(event) {
+				// 当设置 multiple 为 true 时, file 为数组格式,否则为对象格式
+				let lists = [].concat(event.file);
+				let fileListLen = this.fileList.length;
+				lists.map((item) => {
+				  this.fileList.push({
+					...item,
+					status: "uploading",
+					message: "上传中",
+				  });
+				});
+				for (let i = 0; i < lists.length; i++) {
+				  const result = await this.uploadFilePromise(lists[i].url);
+				  let item = this.fileList[fileListLen];
+				  this.fileList.splice(
+					fileListLen,
+					1,
+					Object.assign(item, {
+					  status: "success",
+					  message: "",
+					  url: result,
+					})
+				  );
+				  fileListLen++;
+				}
+			},
+			uploadFilePromise(url) {
+				return new Promise((resolve, reject) => {
+				  let a = uni.uploadFile({
+					url: baseApi.BaseApi + '/uploadFile',
+					filePath: url,
+					name: "file",
+					success: (res) => {
+						let data = JSON.parse(res.data);
+						if(data){
+							if(data.code!==0) return
+							setTimeout(() => {
+								resolve(data.data);
+							}, 1000);
+						}
+					},
+				  });
+				});
+			},
+			changeModel(item,index){
+				this.midx = index;
+				this.agentDto = this.modelMap.get(item.agentName);
+				this.getModelVoiceList()
+			},
+			selectModel(){
+				uni.navigateTo({
+					url:'/pagesRole/roleModel',
+					events:{
+						selectRoleModel:data=>{
+							console.log(data,'data');
+						}
+					}
+				})
+			},
+			getAgentModelList(){
+				return new Promise((resolve,reject)=>{
+					this.$api.get('/agent/template').then(res=>{
+						if(res.data.code!==0) return this.$showToast(res.data.msg)
+						this.list = res.data.data;
+						if(this.list.length){
+							this.agentDto = {...this.agentDto,...this.list[0]}
+							let map = new Map();
+							this.list.forEach(l=>{
+								map.set(l.agentName,l)
+							})
+							this.modelMap = map;
+						}
+						resolve();
+					})
+				})
+			},
+			getModelVoiceList(){
+				this.$api.get(`/models/${this.agentDto.ttsModelId}/voices`).then(res=>{
+					if(res.data.code!==0) return this.$showToast(res.data.msg)
+					this.voiceList = [res.data.data];
+					this.voiceText = res.data.data.find(v=>v.id===this.agentDto.ttsVoiceId)?.name||'';
+				})
+			},
+			confirm(e){
+				this.show = false;
+				this.agentDto.ttsVoiceId = e.value[0].id;
+				this.voiceText = e.value[0].name;
+			},
+			comfirmSure(){
+				let dto = JSON.parse(JSON.stringify(this.agentDto));
+				this.$api.post('/agent',dto).then(res=>{
+					if(res.data.code!==0) return this.$showToast(res.data.msg)
+					this.$showToast('创建成功');
+					setTimeout(()=>{
+						uni.reLaunch({
+							url:'/pages/home'
+						})
+					},1500)
+				})
+			},
+		}
+	}
+</script>
+
+<style scoped lang="less">
+	.ph{
+		font-family: PingFangSC, PingFang SC;
+		font-weight: 400;
+		font-size: 28rpx;
+		color: #A6A6A6;
+		line-height: 40rpx;
+		text-align: right;
+	}
+	.page{
+		background: #F7F6F9;
+		padding: 0 30rpx 30rpx;
+		.box{
+			background: #FFFFFF;
+			border-radius: 24rpx;
+			margin-top: 20rpx;
+			width: 100%;
+			padding: 40rpx 30rpx;
+			box-sizing: border-box;
+			
+			.title{
+				font-family: PingFang-SC, PingFang-SC;
+				font-weight: bold;
+				font-size: 30rpx;
+				color: #111111;
+				line-height: 32rpx;
+				span{
+					font-size: 32rpx;
+					color: #F31616;
+				}
+			}
+			.upload{
+				margin-top: 12rpx;
+				display: flex;
+				flex-direction: column;
+				align-items: center;
+				.sc{
+					width: 188rpx;
+					height: 188rpx;
+				}
+				.text{
+					font-family: PingFangSC, PingFang SC;
+					font-weight: 400;
+					font-size: 26rpx;
+					color: #A6A6A6;
+					line-height: 37rpx;
+					text-align: center;
+					margin-top: 8rpx;
+				}
+			}
+			.right{
+				.mtext{
+					font-family: PingFangSC, PingFang SC;
+					font-weight: 400;
+					font-size: 28rpx;
+					color: #A6A6A6;
+					line-height: 40rpx;
+					text-align: right;
+					&.active{
+						color: #111111;
+					}
+				}
+				image{
+					width: 36rpx;
+					height: 36rpx;
+					margin-left: 10rpx;
+				}
+			}
+			.desc{
+				margin-top: 20rpx;
+				min-height: 200rpx;
+			}
+			.tip{
+				font-family: PingFangSC, PingFang SC;
+				font-weight: 400;
+				font-size: 28rpx;
+				color: #A6A6A6;
+				line-height: 40rpx;
+				text-align: right;
+			}
+			.imgs{
+				width: 188rpx;
+				height: 188rpx;
+				border-radius: 50%;
+				position: relative;
+				.img1{
+					width: 188rpx;
+					height: 188rpx;
+					border-radius: 50%;
+					position: absolute;
+					z-index: 2;
+				}
+				.img2{
+					width: 42rpx;
+					height: 42rpx;
+					position: absolute;
+					right: 0;
+					bottom: 0;
+					z-index: 3;
+				}
+			}
+		}
+		.zt_btn{
+			margin-top: 54rpx;
+		}
+		input{
+			border: none;
+			text-align: right;
+			font-size: 28rpx;
+		}
+	}
+</style>

+ 125 - 0
pagesRole/roleModel.vue

@@ -0,0 +1,125 @@
+<template>
+	<view class="page" :style="{'min-height':h+'px', 'padding-top':mt+'px'}">
+		<cus-header title='角色模板'></cus-header>
+		<div class="title">选择角色模板<span>*</span></div>
+		<div class="list">
+			<div class="pre" v-for="(item,index) in list" :key="index" :class="{'active':midx===index}" @tap="changeModel(item,index)">
+				<image src="@/static/selected_dh.png" v-if="midx===index"></image>
+				{{item}}
+			</div>
+		</div>
+		<div class="adffcacjc">
+			<image src="@/static/avatar_default.png"></image>
+			<p>{{'湾湾小何'}}</p>
+		</div>
+		<div class="desc">{{'你是一个充满活力与好奇心的年轻。以性格开朗乐观,对生活充满热情。你喜欢在公园等自然环境中放松自己,思考人生。你很善于观察,总能发现一些别人忽略的小美好。你和我在公园偶然相遇,之后我们时常一起在公园漫步、聊天,分享生活中的喜怒哀乐。你总是能给我带来积极的能量和独特的见解。'}}</div>
+		<div class="zt_btn" @tap="confirm">确认选择</div>
+	</view>
+</template>
+
+<script>
+	export default {
+		data(){
+			return {
+				midx:0,
+				list:['湾湾小何','星际游子','英语老师','好奇男孩','汪汪队长']
+			}
+		},
+		methods:{
+			changeModel(item,index){
+				this.midx = index;
+			},
+			confirm(){
+				this.getOpenerEventChannel().emit('selectRoleModel', {
+					
+				})
+				uni.navigateBack();
+			}
+		}
+	}
+</script>
+
+<style scoped lang="less">
+	.page{
+		width: 100%;
+		background: #FFFFFF;
+		padding: 0 30rpx 30rpx;
+		box-sizing: border-box;
+		overflow: hidden;
+		.title{
+			font-family: PingFang-SC, PingFang-SC;
+			font-weight: bold;
+			font-size: 32rpx;
+			color: #111111;
+			line-height: 32rpx;
+			margin-top: 30rpx;
+			span{
+				color: #F31616;
+			}
+		}
+		
+		.list{
+			width: 100%;
+			margin-top: 12rpx;
+			display: flex;
+			flex-wrap: wrap;
+			margin-left: -10rpx;
+			.pre{
+				margin-top: 20rpx;
+				margin-left: 15rpx;
+				width: calc(100% / 3 - 21rpx);
+				height: 80rpx;
+				background: #FFFFFF;
+				border-radius: 16rpx;
+				border: 1rpx solid #C7C7C7;
+				font-family: PingFangSC, PingFang SC;
+				font-weight: 400;
+				font-size: 28rpx;
+				color: #333333;
+				line-height: 80rpx;
+				text-align: center;
+				position: relative;
+				&.active{
+					background: #D9F159;
+					border: 1rpx solid #D9F159;
+					font-weight: bold;
+					color: #111111;
+				}
+				image{
+					width: 48rpx;
+					height: 48rpx;
+					position: absolute;
+					right: 0;
+					bottom: 0;
+					z-index: 22;
+				}
+			}
+		}
+		
+		.adffcacjc image{
+			width: 240rpx;
+			height: 240rpx;
+			margin-top: 95rpx;
+		}
+		p{
+			font-family: PingFang-SC, PingFang-SC;
+			font-weight: bold;
+			font-size: 48rpx;
+			color: #111111;
+			line-height: 67rpx;
+			text-align: center;
+			margin-top: 24rpx;
+		}
+		.desc{
+			font-family: PingFangSC, PingFang SC;
+			font-weight: 400;
+			font-size: 26rpx;
+			color: #7C8592;
+			line-height: 37rpx;
+			margin-top: 36rpx;
+		}
+		.zt_btn{
+			margin-top: 285rpx;
+		}
+	}
+</style>

BIN
static/add.png


BIN
static/ai_shape.png


BIN
static/arrow_right.png


BIN
static/avatar_big.png


BIN
static/avatar_default.png


BIN
static/bind.png


BIN
static/box_bg1.png


BIN
static/box_bg2.png


BIN
static/change.png


BIN
static/change2.png


BIN
static/device_add_bg.png


BIN
static/device_gl.png


BIN
static/device_mini.png


BIN
static/device_next.png


BIN
static/device_query.png


BIN
static/device_scan.png


BIN
static/device_wifi.png


BIN
static/edit_mini.png


BIN
static/empty_device.png


BIN
static/feedback_bg.png


BIN
static/home_active.png


BIN
static/home_inactive.png


BIN
static/home_topbg.png


BIN
static/info_mini.png


BIN
static/login_top.png


BIN
static/my_active.png


BIN
static/my_avatat_default.png


BIN
static/my_book.png


BIN
static/my_device.png


BIN
static/my_inactive.png


BIN
static/my_topbg.png


BIN
static/my_version.png


BIN
static/myu_idea.png


BIN
static/offline_mini.png


BIN
static/online_mini.png


BIN
static/query_mini.png


BIN
static/role_active.png


BIN
static/role_avatar0.png


static/avatar_small.png → static/role_avatar1.png


BIN
static/role_avatar2.png


BIN
static/role_inactive.png


BIN
static/role_upload.png


BIN
static/scan_bind.png


BIN
static/scan_result.png


BIN
static/selected.png


BIN
static/selected_dh.png


BIN
static/selected_not.png


BIN
static/set_dian1.png


BIN
static/set_dian2.png


BIN
static/set_dian3.png


BIN
static/set_dian4.png


BIN
static/top_bg.png


BIN
static/top_boxbg.png


BIN
static/upload.png


BIN
static/upload_add.png


BIN
static/user_set.png


BIN
static/wifi_bind.png


BIN
static/wifi_off_mini.png


BIN
static/wifi_on_mini.png


BIN
static/wifi_set1.png


BIN
static/wifi_set2.png


BIN
static/wifi_set3.png


BIN
static/wifi_set4.png


BIN
static/wifi_success.png