whx 9 meses atrás
pai
commit
508c47bb47
26 arquivos alterados com 2990 adições e 475 exclusões
  1. 27 0
      virgo.wzfrontend/console/package-lock.json
  2. 2 0
      virgo.wzfrontend/console/package.json
  3. BIN
      virgo.wzfrontend/console/public/assets/android_code.png
  4. BIN
      virgo.wzfrontend/console/public/assets/ios_code.png
  5. BIN
      virgo.wzfrontend/console/public/assets/wechat_code.jpg
  6. 5 5
      virgo.wzfrontend/console/public/index.html
  7. 110 54
      virgo.wzfrontend/console/src/assets/scss/index.scss
  8. 4 5
      virgo.wzfrontend/console/src/axios/index.js
  9. 125 0
      virgo.wzfrontend/console/src/components/website/houseFoot.vue
  10. 204 0
      virgo.wzfrontend/console/src/components/website/houseList.vue
  11. 375 0
      virgo.wzfrontend/console/src/components/website/login.vue
  12. 6 6
      virgo.wzfrontend/console/src/config/field.js
  13. 12 0
      virgo.wzfrontend/console/src/httpApi/space.js
  14. 163 163
      virgo.wzfrontend/console/src/layout/components/selectProject.vue
  15. 28 18
      virgo.wzfrontend/console/src/layout/components/topNav.vue
  16. 111 22
      virgo.wzfrontend/console/src/layout/website.vue
  17. 22 1
      virgo.wzfrontend/console/src/router/website.js
  18. 2 1
      virgo.wzfrontend/console/src/store/getters.js
  19. 15 6
      virgo.wzfrontend/console/src/store/modules/app.js
  20. 1012 0
      virgo.wzfrontend/console/src/uitls/citys.js
  21. 13 11
      virgo.wzfrontend/console/src/uitls/permission.js
  22. 51 129
      virgo.wzfrontend/console/src/views/login/index.vue
  23. 154 0
      virgo.wzfrontend/console/src/views/website/city.vue
  24. 42 54
      virgo.wzfrontend/console/src/views/website/home.vue
  25. 456 0
      virgo.wzfrontend/console/src/views/website/homeDetail.vue
  26. 51 0
      virgo.wzfrontend/console/src/views/website/search.vue

+ 27 - 0
virgo.wzfrontend/console/package-lock.json

@@ -6177,6 +6177,14 @@
 				}
 			}
 		},
+		"dom7": {
+			"version": "2.1.5",
+			"resolved": "https://registry.npmmirror.com/dom7/-/dom7-2.1.5.tgz",
+			"integrity": "sha512-xnhwVgyOh3eD++/XGtH+5qBwYTgCm0aW91GFgPJ3XG+jlsRLyJivnbP0QmUBFhI+Oaz9FV0s7cxgXHezwOEBYA==",
+			"requires": {
+				"ssr-window": "^2.0.0"
+			}
+		},
 		"domain-browser": {
 			"version": "1.2.0",
 			"resolved": "https://registry.npmmirror.com/domain-browser/-/domain-browser-1.2.0.tgz",
@@ -10755,6 +10763,11 @@
 				"pinkie": "^2.0.0"
 			}
 		},
+		"pinyin-pro": {
+			"version": "3.25.0",
+			"resolved": "https://registry.npmmirror.com/pinyin-pro/-/pinyin-pro-3.25.0.tgz",
+			"integrity": "sha512-MpwQPa9Ry+1vVHrsRgfJTvbtoMn0Gk529OZEWqN+O/iiSOqnd2dbKrDMaX87n7YvVPhy2W1/sKakK9zheYNWeg=="
+		},
 		"pkg-dir": {
 			"version": "4.2.0",
 			"resolved": "https://registry.npmmirror.com/pkg-dir/-/pkg-dir-4.2.0.tgz",
@@ -12732,6 +12745,11 @@
 				"tweetnacl": "~0.14.0"
 			}
 		},
+		"ssr-window": {
+			"version": "2.0.0",
+			"resolved": "https://registry.npmmirror.com/ssr-window/-/ssr-window-2.0.0.tgz",
+			"integrity": "sha512-NXzN+/HPObKAx191H3zKlYomE5WrVIkoCB5IaSdvKokxTpjBdWfr0RaP+1Z5KOfDT0ZVz+2tdtiBkhsEQ9p+0A=="
+		},
 		"ssri": {
 			"version": "8.0.1",
 			"resolved": "https://registry.npmmirror.com/ssri/-/ssri-8.0.1.tgz",
@@ -13129,6 +13147,15 @@
 				}
 			}
 		},
+		"swiper": {
+			"version": "5.4.5",
+			"resolved": "https://registry.npmmirror.com/swiper/-/swiper-5.4.5.tgz",
+			"integrity": "sha512-7QjA0XpdOmiMoClfaZ2lYN6ICHcMm72LXiY+NF4fQLFidigameaofvpjEEiTQuw3xm5eksG5hzkaRsjQX57vtA==",
+			"requires": {
+				"dom7": "^2.1.5",
+				"ssr-window": "^2.0.0"
+			}
+		},
 		"table": {
 			"version": "5.4.6",
 			"resolved": "https://registry.npmmirror.com/table/-/table-5.4.6.tgz",

+ 2 - 0
virgo.wzfrontend/console/package.json

@@ -17,7 +17,9 @@
 		"ezuikit-js": "^7.7.7",
 		"jquery": "^3.7.1",
 		"path-browserify": "^1.0.1",
+		"pinyin-pro": "^3.25.0",
 		"svg-sprite-loader": "^6.0.11",
+		"swiper": "^5.4.5",
 		"terser-webpack-plugin": "^3.0.1",
 		"vue": "^2.6.10",
 		"vue-organization-chart": "^1.1.6",

BIN
virgo.wzfrontend/console/public/assets/android_code.png


BIN
virgo.wzfrontend/console/public/assets/ios_code.png


BIN
virgo.wzfrontend/console/public/assets/wechat_code.jpg


+ 5 - 5
virgo.wzfrontend/console/public/index.html

@@ -5,11 +5,11 @@
 		<meta http-equiv="X-UA-Compatible" content="IE=edge">
 		<link rel="icon" href="https://file-node.oss-cn-shanghai.aliyuncs.com/youji/3156449b8a1a4874981b2a76d5947721">
 		<link rel="stylesheet" type="text/css" href="<%= BASE_URL %>reset.css" />
-		<link rel="stylesheet" href="//at.alicdn.com/t/c/font_4358860_x95h0gxg7vk.css">
-		<title>有极</title>
-		<script src="<%= BASE_URL %>jquery.js"></script>
-		<link rel="stylesheet" type="text/css" href="<%= BASE_URL %>icon/font.css" />
-		<script src="https://cdnjs.cloudflare.com/ajax/libs/echarts/5.4.3/echarts.min.js"></script>
+		<link rel="stylesheet" href="//at.alicdn.com/t/c/font_4358860_p6trcvlun6.css">
+		<title>有极</title>
+		<script src="<%= BASE_URL %>jquery.js"></script>
+		<link rel="stylesheet" type="text/css" href="<%= BASE_URL %>icon/font.css" />
+		<script src="https://cdnjs.cloudflare.com/ajax/libs/echarts/5.4.3/echarts.min.js"></script>
 		<script src="https://static.bimface.com/api/BimfaceSDKLoader/BimfaceSDKLoader@latest-release.js"></script>
 	</head>
 	<body id="body">

+ 110 - 54
virgo.wzfrontend/console/src/assets/scss/index.scss

@@ -1,57 +1,113 @@
-/* 清除滑条样式 */
-::-webkit-scrollbar {
-	width: 0;
-	height: 0;
-	background: none;
-}
-
-/*chrome--------------------------------------------start*/
-::-webkit-scrollbar {
-	width: 6px;
-	height: 6px;
-}
-
-/* Track */
-::-webkit-scrollbar-track {
-	background: rgba(255, 255, 255, 0);
-	border-radius: 6px;
-}
-
-/* Handle */
-::-webkit-scrollbar-thumb {
-	background: #394154;
-	border-radius: 6px;
-}
-::-webkit-scrollbar-corner{
-	display: none;
-}
-/* Handle on hover */
-::-webkit-scrollbar-thumb:hover {
-	background: #394154;
-}
-
-/*chrome--------------------------------------------end*/
-/*IE--------------------------------------------start*/
-* {
-	/*三角箭头的颜色*/
-	scrollbar-arrow-color: #c0c4cc;
-	/*滚动条滑块按钮的颜色*/
-	scrollbar-face-color: #A2A2A3;
-	/*滚动条整体颜色*/
-	scrollbar-highlight-color: #A2A2A3;
-	/*滚动条阴影*/
-	scrollbar-shadow-color: #A2A2A3;
-	/*滚动条轨道颜色*/
-	scrollbar-track-color: #f4f4f5;
-	/*滚动条3d亮色阴影边框的外观颜色——左边和上边的阴影色*/
-	scrollbar-3dlight-color: #A2A2A3;
-	/*滚动条3d暗色阴影边框的外观颜色——右边和下边的阴影色*/
-	scrollbar-darkshadow-color: #A2A2A3;
-	/*滚动条基准颜色*/
-	scrollbar-base-color: #f4f4f5;
+.work-layout{
+	/* 清除滑条样式 */
+	&::-webkit-scrollbar,*::-webkit-scrollbar {
+		width: 0;
+		height: 0;
+		background: none;
+	}
+	
+	/*chrome--------------------------------------------start*/
+	&::-webkit-scrollbar,*::-webkit-scrollbar {
+		width: 6px;
+		height: 6px;
+	}
+	
+	/* Track */
+	&::-webkit-scrollbar-track,*::-webkit-scrollbar-track {
+		background: rgba(255, 255, 255, 0);
+		border-radius: 6px;
+	}
+	
+	/* Handle */
+	&::-webkit-scrollbar-thumb,*::-webkit-scrollbar-thumb{
+		background: #394154;
+		border-radius: 6px;
+	}
+	&::-webkit-scrollbar-corner,*::-webkit-scrollbar-corner{
+		display: none;
+	}
+	/* Handle on hover */
+	&::-webkit-scrollbar-thumb:hover,*::-webkit-scrollbar-thumb:hover {
+		background: #394154;
+	}
+	
+	/*chrome--------------------------------------------end*/
+	/*IE--------------------------------------------start*/
+	* {
+		/*三角箭头的颜色*/
+		scrollbar-arrow-color: #c0c4cc;
+		/*滚动条滑块按钮的颜色*/
+		scrollbar-face-color: #A2A2A3;
+		/*滚动条整体颜色*/
+		scrollbar-highlight-color: #A2A2A3;
+		/*滚动条阴影*/
+		scrollbar-shadow-color: #A2A2A3;
+		/*滚动条轨道颜色*/
+		scrollbar-track-color: #f4f4f5;
+		/*滚动条3d亮色阴影边框的外观颜色——左边和上边的阴影色*/
+		scrollbar-3dlight-color: #A2A2A3;
+		/*滚动条3d暗色阴影边框的外观颜色——右边和下边的阴影色*/
+		scrollbar-darkshadow-color: #A2A2A3;
+		/*滚动条基准颜色*/
+		scrollbar-base-color: #f4f4f5;
+	}
+	/*IE--------------------------------------------end*/
+}
+.el-dialog__body,.el-drawer__body,.el-popper{
+	/* 清除滑条样式 */
+	&::-webkit-scrollbar,*::-webkit-scrollbar {
+		width: 0;
+		height: 0;
+		background: none;
+	}
+	
+	/*chrome--------------------------------------------start*/
+	&::-webkit-scrollbar,*::-webkit-scrollbar {
+		width: 6px;
+		height: 6px;
+	}
+	
+	/* Track */
+	&::-webkit-scrollbar-track,*::-webkit-scrollbar-track {
+		background: rgba(255, 255, 255, 0);
+		border-radius: 6px;
+	}
+	
+	/* Handle */
+	&::-webkit-scrollbar-thumb,*::-webkit-scrollbar-thumb{
+		background: #394154;
+		border-radius: 6px;
+	}
+	&::-webkit-scrollbar-corner,*::-webkit-scrollbar-corner{
+		display: none;
+	}
+	/* Handle on hover */
+	&::-webkit-scrollbar-thumb:hover,*::-webkit-scrollbar-thumb:hover {
+		background: #394154;
+	}
+	
+	/*chrome--------------------------------------------end*/
+	/*IE--------------------------------------------start*/
+	* {
+		/*三角箭头的颜色*/
+		scrollbar-arrow-color: #c0c4cc;
+		/*滚动条滑块按钮的颜色*/
+		scrollbar-face-color: #A2A2A3;
+		/*滚动条整体颜色*/
+		scrollbar-highlight-color: #A2A2A3;
+		/*滚动条阴影*/
+		scrollbar-shadow-color: #A2A2A3;
+		/*滚动条轨道颜色*/
+		scrollbar-track-color: #f4f4f5;
+		/*滚动条3d亮色阴影边框的外观颜色——左边和上边的阴影色*/
+		scrollbar-3dlight-color: #A2A2A3;
+		/*滚动条3d暗色阴影边框的外观颜色——右边和下边的阴影色*/
+		scrollbar-darkshadow-color: #A2A2A3;
+		/*滚动条基准颜色*/
+		scrollbar-base-color: #f4f4f5;
+	}
+	/*IE--------------------------------------------end*/
 }
-
-/*IE--------------------------------------------end*/
 .hui-ellipsis {
 	overflow: hidden;
 	white-space: nowrap;
@@ -1344,4 +1400,4 @@
 	.el-icon-warning::before {
 		content: '\e73b';
 	}
-}
+}

+ 4 - 5
virgo.wzfrontend/console/src/axios/index.js

@@ -7,8 +7,7 @@ import {
 	Message
 } from 'element-ui'
 const service = axios.create({
-	// baseURL: baseConfig.baseURL,
-	baseURL:'https://116.204.115.255',
+	baseURL: baseConfig.baseURL,
 	timeout: 6000000, // 请求超时时间
 })
 /* 消息提示 */
@@ -27,9 +26,9 @@ const tip = (msg, type) => {
 service.interceptors.request.use(
 	config => {
 		let token = getToken();
-		config.headers['token'] = token;
-		if(config.url === '/im/message/save' && localStorage.getItem('systemChatToken')){
-			config.headers['token'] = localStorage.getItem('systemChatToken');
+		config.headers['token'] = token;
+		if (config.url === '/im/message/save' && localStorage.getItem('systemChatToken')) {
+			config.headers['token'] = localStorage.getItem('systemChatToken');
 		}
 		return config
 	},

+ 125 - 0
virgo.wzfrontend/console/src/components/website/houseFoot.vue

@@ -0,0 +1,125 @@
+<template>
+	<footer id="tell" class="footer">
+		<div class="footer-box">
+			<div class="footer-content" v-if="type === 'all'">
+				<div class="footer-download">
+					<div class="footer-title">产品下载</div>
+					<div class="footer-qr">
+						<div class="qr-item">
+							<img src="/assets/android_code.png" alt="" />
+							<div class="qr-name">扫码下载安卓APP</div>
+						</div>
+						<div class="qr-item">
+							<img src="/assets/ios_code.png" alt="" />
+							<div class="qr-name">扫码下载苹果APP</div>
+						</div>
+						<div class="qr-item">
+							<img src="/assets/wechat_code.jpg" alt="" />
+							<div class="qr-name">关注公众号</div>
+						</div>
+					</div>
+				</div>
+				<div class="footer-tel">
+					<div class="footer-title">联系方式</div>
+					<div class="contact-information">
+						<p>业务咨询:18616333631</p>
+						<p>公司邮箱:youjiyun2016@163.com</p>
+						<p>公司地址:浙江省温州市鹿城区中关村信息谷温州创新中心1号楼4层405室</p>
+					</div>
+				</div>
+			</div>
+			<div class="foot-information">
+				<div style="margin-right: 30px;">Copyright © 2024 温州有极数据科技有限公司</div>
+				<a>浙ICP备2024128735号-1</a>
+			</div>
+		</div>
+	</footer>
+</template>
+
+<script>
+	export default {
+		props: ['type']
+	}
+</script>
+
+<style lang="scss">
+	.footer {
+		background: #212631;
+		min-width: 1200px;
+
+		.footer-box {
+			width: 1200px;
+			margin: 0 auto
+		}
+
+		.footer-content {
+			padding: 50px;
+			display: flex;
+			border-bottom: 1px solid rgba(255, 255, 255, .1)
+		}
+
+		.footer-title {
+			font-weight: 500;
+			font-size: 24px;
+			color: #fff;
+			line-height: 33px;
+			margin-bottom: 28px
+		}
+
+		.footer-download {
+			flex: 1;
+			width: 0
+		}
+
+		.footer-qr {
+			display: flex
+		}
+
+		.qr-item {
+			margin-right: 56px
+		}
+
+		.footer-qr img {
+			width: 130px;
+			height: 130px
+		}
+
+		.qr-name {
+			text-align: center;
+			font-size: 14px;
+			color: #98999d;
+			line-height: 20px;
+			margin-top: 10px
+		}
+
+		.contact-information {
+			font-weight: 400;
+			font-size: 14px;
+			color: #98999d;
+			line-height: 32px
+		}
+
+		.foot-information {
+			font-weight: 400;
+			font-size: 12px;
+			color: #98999d;
+			line-height: 17px;
+			display: flex;
+			align-items: center;
+			padding: 20px;
+			justify-content: center
+		}
+
+		.foot-information a {
+			color: #98999d;
+			margin-right: 30px
+		}
+
+		.foot-information img {
+			width: 14px;
+			height: 14px;
+			margin-left: 30px;
+			margin-right: 10px
+		}
+	}
+</style>

+ 204 - 0
virgo.wzfrontend/console/src/components/website/houseList.vue

@@ -0,0 +1,204 @@
+<template>
+	<div class="house-view">
+		<div class="house-list">
+			<div class="house-item" v-for="house in houseList" :key="house.id"
+				@click="$router.push('/website/homeDetail')">
+				<div class="house-item-image">
+					<img :src="imageUrl(house.showPicture)" :alt="house.name" />
+				</div>
+				<div class="house-content">
+					<div class="house-item-title hui-ellipsis">{{house.name}}</div>
+					<div class="space hui-ellipsis">
+						{{house.projectName}} / {{house.projectItemName}} / {{house.projectItemTargetName}}
+					</div>
+					<div class="tag hui-ellipsis">
+						<span>{{house.area}}m²</span>
+						<span v-for="(tag,index) in  house.tagList" :key="index">{{tag.name}}</span>
+					</div>
+					<div class="pirce">
+						<span class="number">{{house.price}}</span>
+						<span class="unit"> /月</span>
+					</div>
+				</div>
+			</div>
+		</div>
+		<div class="pagination">
+			<el-pagination background layout="prev, pager, next" :page-size="pageSize" :total="totalCount"
+				@current-change="changePage">
+			</el-pagination>
+		</div>
+	</div>
+</template>
+
+<script>
+	import {
+		getOpenHouseListByPage
+	} from '@/httpApi/space'
+	export default {
+		props: ['type'],
+		data() {
+			return {
+				currPage: 1,
+				pageSize: 8,
+				totalCount: 0,
+				houseList: []
+			}
+		},
+		created() {
+			this.init()
+		},
+		methods: {
+			init() {
+				if (this.type === 'highseas') {
+					getOpenHouseListByPage({
+						currPage: this.currPage,
+						pageSize: this.pageSize,
+						code: this.$store.getters.city.cityCode
+					}).then(res => {
+						if (res.state) {
+							this.houseList = res.data.dataList;
+							this.totalCount = res.data.totalCount;
+						}
+					})
+				}
+			},
+			changePage(page) {
+				this.currPage = page;
+				this.init();
+			},
+			imageUrl(data) {
+				if (!data) return 'https://assets.api.uizard.io/api/cdn/stream/c05650d2-192b-4a56-ae97-05638f53804c.png';
+				return JSON.parse(data)[0].url;
+			}
+		}
+	}
+</script>
+
+<style lang="scss">
+	.house-view {
+		.house-list {
+			display: flex;
+			flex-wrap: wrap;
+
+			.house-item {
+				width: 275px;
+				background: #fff;
+				border-radius: 8px;
+				box-sizing: border-box;
+				position: relative;
+				cursor: pointer;
+				box-shadow: 0px 1px 12px rgba(3, 3, 3, 0.1);
+				overflow: hidden;
+				padding: 15px;
+				box-sizing: border-box;
+				margin-right: 20px;
+				margin-bottom: 20px;
+
+				.house-item-image {
+					width: 100%;
+					height: 180px;
+					overflow: hidden;
+					border-radius: 8px;
+				}
+
+				img {
+					width: 100%;
+					height: 100%;
+					border: 0;
+					vertical-align: top;
+					transition: all 0.7s;
+				}
+
+				&:nth-child(4n) {
+					margin-right: 0;
+				}
+
+				&:hover {
+					img {
+						transform: scale(1.05);
+					}
+				}
+
+				.house-content {
+					padding-top: 15px;
+				}
+
+				.house-item-title {
+					font-size: 16px;
+					font-weight: 600;
+					margin-bottom: 7px;
+				}
+
+				.space,
+				.tag {
+					color: #9399a5;
+					font-size: 12px;
+					font-weight: 300;
+					margin-bottom: 3px;
+				}
+
+				.tag {
+					span {
+						font-weight: 300;
+						padding: 0 7px;
+						position: relative;
+
+						&:first-child {
+							padding-left: 0;
+						}
+
+						&::after {
+							content: "";
+							display: inline-block;
+							width: 1px;
+							height: 8px;
+							background: #b2bacc;
+							position: absolute;
+							right: 0;
+							top: 50%;
+							margin-top: -4px;
+						}
+
+						&:last-child::after {
+							display: none;
+						}
+					}
+				}
+
+				.pirce {
+					color: $--color-red;
+					display: flex;
+					align-items: end;
+
+					.number {
+						font-size: 20px;
+						font-weight: 600;
+						height: 20px;
+					}
+
+					.unit {
+						height: 15px;
+						font-size: 12px;
+					}
+				}
+			}
+		}
+
+		.pagination {
+			margin-top: 30px;
+			text-align: center;
+		}
+
+		.el-pagination.is-background .btn-prev,
+		.el-pagination.is-background .btn-next,
+		.el-pagination.is-background .el-pager li {
+			background-color: #fff;
+			border-color: #cfcfcf !important;
+		}
+
+		.el-pagination.is-background .el-pager li:not(.disabled).active {
+			background-color: #3371FF;
+			border-color: #3371FF !important;
+		}
+	}
+</style>

+ 375 - 0
virgo.wzfrontend/console/src/components/website/login.vue

@@ -0,0 +1,375 @@
+<template>
+	<div class="website-login-box">
+		<div class="login-box">
+			<i class="el-icon-circle-close close-icon" @click="$emit('callback')"></i>
+			<div class="login-form">
+				<el-form :model="loginForm" :rules="loginRules" status-icon ref="loginForm" label-position="left">
+					<el-form-item prop="phone">
+						<el-input type="text" prefix-icon="iconfont huifont-shoujihao" v-model="loginForm.phone"
+							placeholder="手机号" maxlength="11">
+						</el-input>
+					</el-form-item>
+					<el-form-item prop="code" class="image-item">
+						<el-input type="text" prefix-icon="iconfont huifont-tuxingyanzhengma" v-model="loginForm.code"
+							placeholder="图片验证码" maxlength="4"></el-input>
+						<img v-if="codeImg" :src="codeImg" alt="图片验证码" class="code-image" @click="imgCodeFunc">
+					</el-form-item>
+					<el-form-item prop="phoneCode" class="phone-code">
+						<el-input type="number" prefix-icon="iconfont huifont-duanxinyanzhengma"
+							v-model="loginForm.phoneCode" placeholder="短信验证码"
+							oninput="if(value.length > 6) value=value.slice(0, 6)"></el-input>
+						<div :class="codeName === '获取验证码'?'get-code-btn' : 'get-code-btn-disabled get-code-btn'"
+							@click="getPhoneCode">
+							{{codeName}}
+						</div>
+					</el-form-item>
+				</el-form>
+				<el-button type="primary" @click="loginSubmit" :loading="loginLoading">登录</el-button>
+			</div>
+		</div>
+	</div>
+</template>
+
+<script>
+	import {
+		login,
+		getImgCode,
+		sendPhoneCode,
+		getUserInfo
+	} from '@/httpApi/loginRegister';
+	import {
+		getProjectListByIdentity
+	} from '@/httpApi/space'
+	import {
+		getIdentityResource
+	} from '@/httpApi/system'
+	import {
+		setToken,
+		setComment
+	} from '@/uitls/auth';
+	export default {
+		data() {
+			return {
+				loginForm: {
+					phone: '',
+					code: '',
+					phoneCode: ''
+				},
+				loginLoading: false,
+				codeImg: '',
+				codeName: '获取验证码', //获取验证码text
+				isDisabled: false, //获取验证码按钮状态
+				loginRules: {
+					code: [{
+						required: true,
+						message: '请输入图片验证码',
+						trigger: 'blur'
+					}],
+					phone: [{
+						required: true,
+						message: '请输入手机号',
+						trigger: 'blur'
+					}, {
+						validator: (rule, value, callback) => {
+							if (!/^1[123456789]\d{9}$/.test(value)) {
+								callback(new Error("请输入正确的手机号"));
+							} else {
+								callback();
+							}
+						},
+						trigger: 'blur'
+					}],
+					phoneCode: [{
+						required: true,
+						message: '请输入短信验证码',
+						trigger: 'blur'
+					}]
+				},
+			};
+		},
+		created() {
+			this.imgCodeFunc();
+			if (this.$store.getters.codeNumber != 60) this.codeReset();
+		},
+		methods: {
+			imgCodeFunc() {
+				getImgCode().then(res => {
+					if (res.state) {
+						this.codeImg = res.data.pngBase64;
+					}
+				})
+			},
+			getPhoneCode() {
+				if (this.isDisabled) return;
+				this.$refs.loginForm.validateField('phone', valid => {
+					if (!valid) {
+						this.$refs.loginForm.validateField('code', valid => {
+							if (!valid) {
+								sendPhoneCode(this.loginForm.phone, this.loginForm.code).then(res => {
+									if (res.state) {
+										this.codeReset();
+										this.$message.success('发送成功');
+									}
+								})
+							}
+						})
+					}
+				})
+			},
+			codeReset() {
+				//重置获取验证码倒计时
+				let codeNumber = this.$store.getters.codeNumber;
+				codeNumber--;
+				this.handleCode(codeNumber);
+				let codeRestFn = setInterval(() => {
+					codeNumber--;
+					this.handleCode(codeNumber);
+					if (codeNumber == 0) clearInterval(codeRestFn); //停止
+				}, 1000);
+			},
+			handleCode(codeNumber) {
+				//code操作
+				this.codeName = codeNumber == 0 ? '获取验证码' : '重新获取' + codeNumber;
+				this.isDisabled = codeNumber == 0 ? false : true;
+				this.$store.dispatch('loginRegister/changeCodeNumber', codeNumber == 0 ? 60 : codeNumber);
+			},
+			loginSubmit() {
+				if (this.loginLoading) return;
+				this.loginLoading = true;
+				this.$refs['loginForm'].validate(valid => {
+					if (!valid) return this.loginLoading = false;
+					this.loginFunc();
+				})
+			},
+			loginFunc() {
+				let postData = {
+					phone: this.loginForm.phone,
+					phoneCode: this.loginForm.phoneCode
+				}
+				login(postData).then(res => {
+					if (res.state) {
+						setToken(res.data.token);
+						getUserInfo().then(res => {
+							if (res.state) {
+								let user = res.data;
+								this.$store.dispatch('app/changeOrganization', user.organization);
+								this.$store.dispatch('app/changeUser', user);
+								this.$store.dispatch('app/changeMenuData', user.resource ? JSON.parse(user
+									.resource) : []);
+								setComment(user.menu ? user.menu : JSON.stringify([]));
+								this.initProjectData(user.projectId);
+							} else {
+								this.loginLoading = false;
+							}
+						})
+					} else {
+						this.loginLoading = false;
+					}
+				})
+			},
+			initProjectData(projectId) {
+				getProjectListByIdentity().then(res => {
+					if (res.state) {
+						if (res.data.length === 0) {
+							this.$store.dispatch('projectBase/changeProject', {});
+							this.$store.dispatch('app/changeIdentity', {
+								id: 6,
+								name: '所有者',
+								remark: '所有者'
+							});
+							localStorage.setItem('projectId', 0);
+							return this.successLogin();
+						}
+						let project = projectId === -1 ? res.data[0] : res.data.find(node => node.id ===
+							projectId);
+						this.$store.dispatch('projectBase/changeProject', project);
+						this.$store.dispatch('app/changeIdentity', project.projectListIdentity[0]);
+						localStorage.setItem('projectId', projectId);
+						this.successLogin();
+					} else {
+						this.loginLoading = false;
+					}
+				})
+			},
+			successLogin() {
+				let item = this.$store.getters.identity;
+				if (item.id === 3 || this.$store.getters.user.userId === 1) {
+					this.loginLoading = false;
+					this.$emit('callback', 'init');
+					this.$message.success('登录成功');
+				} else {
+					getIdentityResource({
+						identityId: item.id,
+						type: this.$store.getters.project.type || 1
+					}).then(node => {
+						if (node.state) {
+							let role = node.data[0] || {};
+							this.$store.dispatch('app/changeMenuData', role
+								.resource ? JSON.parse(role.resource) : []);
+							setComment(role.menus ? role.menus : JSON.stringify(
+								[]));
+							this.loginLoading = false;
+							this.$emit('callback', 'init');
+							this.$message.success('登录成功');
+						} else {
+							this.loginLoading = false;
+						}
+					})
+				}
+			}
+		}
+	};
+</script>
+
+<style lang="scss">
+	.website-login-box {
+		width: 100%;
+		height: 100%;
+		display: flex;
+		align-items: center;
+		justify-content: center;
+
+		.login-box {
+			width: 440px;
+			background: #FFFFFF;
+			box-shadow: 0px 4px 16px 0px rgba(164, 178, 203, 0.15);
+			border-radius: 8px;
+			border: 0px solid #FFFFFF;
+			position: relative;
+		}
+
+		.close-icon {
+			position: absolute;
+			top: 10px;
+			right: 10px;
+			font-size: 30px;
+			color: #c9cdd3;
+		}
+
+		.get-code-btn {
+			position: absolute;
+			font-size: 16px;
+			color: #3371FF;
+			height: 52px;
+			line-height: 52px;
+			top: 0;
+			right: 16px;
+			padding: 0 16px;
+			cursor: pointer;
+		}
+
+		.get-code-btn-disabled {
+			color: #BEBEBE;
+		}
+
+		.login-form {
+			padding: 0 52px;
+			border-bottom: none;
+
+			input:-webkit-autofill {
+				box-shadow: 0 0 0 30px #fff inset !important;
+				-webkit-text-fill-color: #333E4D !important;
+				background-color: #fff !important;
+				transition: background-color 5000s ease-in-out 0s;
+			}
+
+			.el-form {
+				display: block;
+				margin-top: 80px;
+
+				.el-form-item {
+					width: 100%;
+					padding: 0;
+					margin-bottom: 28px;
+					position: relative;
+				}
+
+				.el-input__inner {
+					border-radius: 4px;
+					border: 1px solid #EDEFF2;
+					background: transparent;
+					color: #333E4D;
+					padding: 15px 15px 15px 63px;
+					height: 52px;
+					line-height: 52px;
+					font-size: 16px;
+				}
+
+				.el-form-item.is-error .el-input__inner,
+				.el-form-item.is-error .el-input__inner:focus,
+				.el-form-item.is-error .el-textarea__inner,
+				.el-form-item.is-error .el-textarea__inner:focus {
+					border-color: $--color-red;
+				}
+
+				.el-form-item__error {
+					color: $--color-red;
+				}
+
+				.el-input__inner::placeholder,
+				.el-range-input::placeholder,
+				.el-textarea__inner::placeholder {
+					color: $--color-common;
+				}
+
+				.el-input__icon,
+				.el-range-separator {
+					line-height: 52px;
+					font-size: 16px;
+				}
+
+				.el-input__prefix {
+					left: 16px;
+				}
+
+				.el-input__prefix::before {
+					content: '';
+					top: 16px;
+					right: -16px;
+					height: 21px;
+					width: 1px;
+					background-color: #EDEFF2;
+					position: absolute;
+				}
+
+				.el-input__icon.iconfont {
+					font-size: 20px;
+					color: #4d5e79;
+				}
+
+				.el-input__icon.huifont-mima {
+					opacity: 0.95;
+					margin-left: 2px;
+				}
+			}
+
+
+			.el-button {
+				width: 100%;
+				margin-bottom: 60px;
+				font-weight: 600;
+				font-size: 20px;
+				color: #FFFFFF;
+				line-height: 28px;
+			}
+		}
+
+		.image-item {
+			.el-form-item__content {
+				display: flex;
+			}
+
+			.el-input {
+				width: 190px;
+				margin-right: 12px;
+			}
+
+			.code-image {
+				width: 131px;
+				height: 50px;
+				cursor: pointer;
+			}
+		}
+
+	}
+</style>

+ 6 - 6
virgo.wzfrontend/console/src/config/field.js

@@ -222,27 +222,27 @@ const clearWorkWay = [{
 const supportingFacilities = [{
 	id: 1,
 	name: '交通便利',
-	icon: 'icon-jiaotong'
+	icon: 'huifont-jiaotong'
 }, {
 	id: 2,
 	name: '免费wifi',
-	icon: 'icon-wifi'
+	icon: 'huifont-wifi'
 }, {
 	id: 3,
 	name: '幼儿教育',
-	icon: 'icon-zhishiku'
+	icon: 'huifont-zhishiku'
 }, {
 	id: 4,
 	name: '医疗完善',
-	icon: 'icon-tubiao_-'
+	icon: 'huifont-tubiao_-'
 }, {
 	id: 5,
 	name: '靠近公园',
-	icon: 'icon-gongyuan'
+	icon: 'huifont-gongyuan'
 }, {
 	id: 6,
 	name: '便捷购物',
-	icon: 'icon-gouwu'
+	icon: 'huifont-gouwu'
 }];
 
 const findItem = (type, id) => {

+ 12 - 0
virgo.wzfrontend/console/src/httpApi/space.js

@@ -352,4 +352,16 @@ export function getProjectTreeList(projectId) {
 		url: `/api/project/getProject/${projectId}`,
 		method: 'get'
 	})
+}
+/* 
+ * 获取公海
+ * 
+ * 
+ */
+export function getOpenHouseListByPage(data) {
+	return request({
+		url: `/api/projectItemTargetRoom/open/${data.currPage}/${data.pageSize}`,
+		method: 'post',
+		data: data
+	})
 }

+ 163 - 163
virgo.wzfrontend/console/src/layout/components/selectProject.vue

@@ -1,164 +1,164 @@
-<template>
-	<div class="hui-flex hui-dialog select-project-index">
-		<div class="hui-flex-box hui-dialog-content">
-			<el-table :data="tableData" row-key="id" border height="100%">
-				<el-table-column label="序号" width="50">
-					<template slot-scope="scope">
-						<div style="text-align: center;">{{scope.$index + 1}}</div>
-					</template>
-				</el-table-column>
-				<el-table-column label="项目名称" prop="name"></el-table-column>
-				<el-table-column label="所属企业" prop="organizationName"></el-table-column>
-				<el-table-column label="项目身份">
-					<template slot-scope="scope">
-						<div class="hui-table-tag" style="display: flex;align-items: center;">
-							<div class="hui-tag hui-tag-success" v-for="(node,index) in scope.row.projectListIdentity"
-								:key="index">
-								{{node.name}}
-							</div>
-						</div>
-					</template>
-				</el-table-column>
-				<el-table-column label="操作" width="100">
-					<template slot-scope="scope">
-						<div class="hui-table-operation">
-							<span class="table-operation" @click="changeProject(scope.row)">
-								切换项目
-							</span>
-						</div>
-					</template>
-				</el-table-column>
-				<template slot="empty">
-					<empty description="暂无数据"></empty>
-				</template>
-			</el-table>
-		</div>
-		<el-dialog custom-class="identity" title="选择身份" :visible.sync="visible" width="300px" :append-to-body="true">
-			<div class="hui-flex hui-dialog">
-				<div class="hui-flex-box hui-dialog-content">
-					<el-radio-group v-model="indentity">
-						<div class="select-identity-item" v-for="item in  project.projectListIdentity" :key="item.id">
-							<el-radio :label="item.id">{{item.name}}</el-radio>
-						</div>
-					</el-radio-group>
-				</div>
-				<div class="hui-dialog-submit">
-					<el-button size="medium" @click="visible = false">取 消</el-button>
-					<el-button size="medium" type="primary" @click="submit">确定</el-button>
-				</div>
-			</div>
-		</el-dialog>
-	</div>
-</template>
-
-<script>
-	import {
-		selectProject,
-		selectOrangaized
-	} from '@/httpApi/loginRegister'
-	import {
-		getOrganizationDetailById
-	} from '@/httpApi/organization'
-	import {
-		getProjectListByIdentity
-	} from '@/httpApi/space'
-	import {
-		getIdentityResource
-	} from '@/httpApi/system'
-	import {
-		setComment
-	} from '@/uitls/auth';
-	export default {
-		data() {
-			return {
-				tableData: [],
-				visible: false,
-				indentity: '',
-				project: {
-					projectListIdentity: []
-				}
-			}
-		},
-		created() {
-			this.init();
-		},
-		methods: {
-			init() {
-				getProjectListByIdentity().then(res => {
-					if (res.state) {
-						this.tableData = res.data;
-					}
-				})
-			},
-			changeProject(item) {
-				this.project = item;
-				this.indentity = item.projectListIdentity[0].id;
-				this.visible = true;
-			},
-			submit() {
-				if (this.indentity == 6 || this.indentity == 3) {
-					getOrganizationDetailById(this.project.organizationId).then(res => {
-						if (res.state) {
-							this.$store.dispatch('app/changeOrganization', res.data);
-							selectOrangaized(res.data)
-						}
-					})
-				}
-				selectProject(this.project.id).then(res => {
-					if (res.state) {
-						let user = res.data;
-						this.$store.dispatch('app/changeiIdentityId', this.indentity);
-						this.$store.dispatch('projectBase/changeProject', this.project);
-						localStorage.setItem('projectId', this.project.id);
-						this.$store.dispatch('app/changeUser', user);
-						if (this.indentity === 3 || user.userId === 1) {
-							this.$store.dispatch('app/changeMenuData', user.resource ? JSON.parse(user.resource) :
-								[]);
-							setComment(user.menu ? user.menu : JSON.stringify([]));
-							this.$emit('callback');
-							this.$router.push({
-								path: '/',
-								replace: true
-							})
-							this.$message.success('切换成功');
-						} else {
-							getIdentityResource({
-								identityId: this.indentity.identityId,
-								type: this.project.type
-							}).then(node => {
-								if (node.state) {
-									let role = node.data[0] || {};
-									this.$store.dispatch('app/changeMenuData', role
-										.resource ? JSON.parse(role.resource) : []);
-									setComment(role.menus ? role.menus : JSON.stringify(
-										[]));
-									this.$emit('callback');
-									this.$router.push({
-										path: '/',
-										replace: true
-									})
-									this.$message.success('切换成功');
-								} else {
-									this.$message.error('切换失败');
-								}
-							})
-						}
-					} else {
-						this.$message.error('切换失败');
-					}
-				});
-			}
-		}
-	}
-</script>
-
-<style lang="scss">
-	.identity.el-dialog {
-		height: 40vh;
-		margin-top: 30vh !important;
-
-		.select-identity-item {
-			margin-bottom: 10px;
-		}
-	}
+<template>
+	<div class="hui-flex hui-dialog select-project-index">
+		<div class="hui-flex-box hui-dialog-content">
+			<el-table :data="tableData" row-key="id" border height="100%">
+				<el-table-column label="序号" width="50">
+					<template slot-scope="scope">
+						<div style="text-align: center;">{{scope.$index + 1}}</div>
+					</template>
+				</el-table-column>
+				<el-table-column label="项目名称" prop="name"></el-table-column>
+				<el-table-column label="所属企业" prop="organizationName"></el-table-column>
+				<el-table-column label="项目身份">
+					<template slot-scope="scope">
+						<div class="hui-table-tag" style="display: flex;align-items: center;">
+							<div class="hui-tag hui-tag-success" v-for="(node,index) in scope.row.projectListIdentity"
+								:key="index">
+								{{node.name}}
+							</div>
+						</div>
+					</template>
+				</el-table-column>
+				<el-table-column label="操作" width="100">
+					<template slot-scope="scope">
+						<div class="hui-table-operation">
+							<span class="table-operation" @click="changeProject(scope.row)">
+								切换项目
+							</span>
+						</div>
+					</template>
+				</el-table-column>
+				<template slot="empty">
+					<empty description="暂无数据"></empty>
+				</template>
+			</el-table>
+		</div>
+		<el-dialog custom-class="identity" title="选择身份" :visible.sync="visible" width="300px" :append-to-body="true">
+			<div class="hui-flex hui-dialog">
+				<div class="hui-flex-box hui-dialog-content">
+					<el-radio-group v-model="indentity">
+						<div class="select-identity-item" v-for="item in  project.projectListIdentity" :key="item.id">
+							<el-radio :label="item.id">{{item.name}}</el-radio>
+						</div>
+					</el-radio-group>
+				</div>
+				<div class="hui-dialog-submit">
+					<el-button size="medium" @click="visible = false">取 消</el-button>
+					<el-button size="medium" type="primary" @click="submit">确定</el-button>
+				</div>
+			</div>
+		</el-dialog>
+	</div>
+</template>
+
+<script>
+	import {
+		selectProject,
+		selectOrangaized
+	} from '@/httpApi/loginRegister'
+	import {
+		getOrganizationDetailById
+	} from '@/httpApi/organization'
+	import {
+		getProjectListByIdentity
+	} from '@/httpApi/space'
+	import {
+		getIdentityResource
+	} from '@/httpApi/system'
+	import {
+		setComment
+	} from '@/uitls/auth';
+	export default {
+		data() {
+			return {
+				tableData: [],
+				visible: false,
+				indentity: '',
+				project: {
+					projectListIdentity: []
+				}
+			}
+		},
+		created() {
+			this.init();
+		},
+		methods: {
+			init() {
+				getProjectListByIdentity().then(res => {
+					if (res.state) {
+						this.tableData = res.data;
+					}
+				})
+			},
+			changeProject(item) {
+				this.project = item;
+				this.indentity = item.projectListIdentity[0].id;
+				this.visible = true;
+			},
+			submit() {
+				if (this.indentity == 6 || this.indentity == 3) {
+					getOrganizationDetailById(this.project.organizationId).then(res => {
+						if (res.state) {
+							this.$store.dispatch('app/changeOrganization', res.data);
+							selectOrangaized(res.data)
+						}
+					})
+				}
+				selectProject(this.project.id).then(res => {
+					if (res.state) {
+						let user = res.data;
+						this.$store.dispatch('app/changeIdentityId', this.indentity);
+						this.$store.dispatch('projectBase/changeProject', this.project);
+						localStorage.setItem('projectId', this.project.id);
+						this.$store.dispatch('app/changeUser', user);
+						if (this.indentity === 3 || user.userId === 1) {
+							this.$store.dispatch('app/changeMenuData', user.resource ? JSON.parse(user.resource) :
+								[]);
+							setComment(user.menu ? user.menu : JSON.stringify([]));
+							this.$emit('callback');
+							this.$router.push({
+								path: '/',
+								replace: true
+							})
+							this.$message.success('切换成功');
+						} else {
+							getIdentityResource({
+								identityId: this.indentity.identityId,
+								type: this.project.type
+							}).then(node => {
+								if (node.state) {
+									let role = node.data[0] || {};
+									this.$store.dispatch('app/changeMenuData', role
+										.resource ? JSON.parse(role.resource) : []);
+									setComment(role.menus ? role.menus : JSON.stringify(
+										[]));
+									this.$emit('callback');
+									this.$router.push({
+										path: '/',
+										replace: true
+									})
+									this.$message.success('切换成功');
+								} else {
+									this.$message.error('切换失败');
+								}
+							})
+						}
+					} else {
+						this.$message.error('切换失败');
+					}
+				});
+			}
+		}
+	}
+</script>
+
+<style lang="scss">
+	.identity.el-dialog {
+		height: 40vh;
+		margin-top: 30vh !important;
+
+		.select-identity-item {
+			margin-bottom: 10px;
+		}
+	}
 </style>

+ 28 - 18
virgo.wzfrontend/console/src/layout/components/topNav.vue

@@ -16,6 +16,9 @@
 			</div>
 		</div>
 		<div class="work-layout-right">
+			<div class="work-layout-button" @click="$router.push('/website/home')">
+				<i class="iconfont huifont-shouye"></i><span>公海房源</span>
+			</div>
 			<div class="work-layout-badge" @click="$router.push('/message')">
 				<el-badge is-dot>
 					<i class="iconfont huifont-xiaoxi"></i>
@@ -126,12 +129,36 @@
 		justify-content: space-between;
 		background: #1E2430;
 
+		.work-layout-button {
+			background-color: #2b2f3a;
+			width: 82px;
+			height: 36px;
+			border-radius: 4px;
+			display: flex;
+			align-items: center;
+			cursor: pointer;
+			justify-content: center;
+
+			.iconfont {
+				font-size: 23px;
+			}
+
+			span {
+				font-size: 13px;
+				margin-left: 6px;
+			}
+		}
+
 		.work-layout-right {
 			height: 100%;
 			padding-right: 24px;
 			display: flex;
 			align-items: center;
 
+			.work-layout-button {
+				width: 100px;
+			}
+
 			.work-layout-type {
 				display: flex;
 				align-items: center;
@@ -194,6 +221,7 @@
 			}
 		}
 
+
 		.work-layout-left {
 			height: 100%;
 			padding-left: 24px;
@@ -221,25 +249,7 @@
 				margin-right: 77px;
 			}
 
-			.work-layout-button {
-				background-color: #2b2f3a;
-				width: 82px;
-				height: 36px;
-				border-radius: 4px;
-				display: flex;
-				align-items: center;
-				cursor: pointer;
-				justify-content: center;
 
-				.iconfont {
-					font-size: 23px;
-				}
-
-				span {
-					font-size: 13px;
-					margin-left: 6px;
-				}
-			}
 
 			.work-layout-line {
 				background: #a9a9a9;

+ 111 - 22
virgo.wzfrontend/console/src/layout/website.vue

@@ -4,39 +4,102 @@
 			<div class="title-box">
 				<div class="title-logo">
 					<img src="https://file-node.oss-cn-shanghai.aliyuncs.com/youji/3156449b8a1a4874981b2a76d5947721"
-						alt="logo.png">
-					<div class="title-label">
+						alt="logo.png" @click="$router.push('/website/home')">
+					<div class="title-label" @click="$router.push('/website/home')">
 						<div class="title-name">有极智慧园区</div>
 						<div class="title-sub-name">SMART PARK SYSTEM</div>
 					</div>
-					<div class="location">
+					<div class="location" @click="$router.push('/website/city')">
 						<i class="el-icon-location"></i>
-						<span class="location-name">上海</span>
+						<span class="location-name">{{$store.getters.city.cityName}}</span>
 					</div>
 				</div>
-				<div class="login">
+				<div class="login" v-if="user.userId">
+					<div class="login-avatar">
+						<avatar :user="user"></avatar>
+					</div>
+					<span class="login-name">{{user.userName}}</span>
+					<span class="color-blue loginout" @click="loginout">退出</span>
+					<span class="color-blue loginout" @click="$router.push('/')">管理系统</span>
+				</div>
+				<div class="login" v-else>
 					<div class="login-icon">
 						<i class="el-icon-s-custom"></i>
 					</div>
-					<span class="login-name">登录 / 注册</span>
+					<span class="login-name" @click="login">登录 / 注册</span>
 				</div>
 			</div>
 		</div>
-		<transition name="slide-fade">
-			<router-view :key="key" />
-		</transition>
+		<router-view :key="routerViewKey" />
+		<div class="login-toggle" v-if="visible">
+			<login @callback="callback"></login>
+		</div>
 	</div>
 </template>
 
 <script>
+	import city from '@/uitls/citys.js';
+	import login from '@/components/website/login';
+	import avatar from '@/components/common/avatar'
+	import {
+		removeToken
+	} from '@/uitls/auth';
 	export default {
 		data() {
-			return {}
-		},
-		computed: {
-			key() {
-				return this.$route.path;
+			return {
+				visible: false,
+				user: {},
+				routerViewKey: 1
 			}
+		},
+		created() {
+			this.init();
+		},
+		mounted() {
+			document.getElementById('body').style.overflow = 'auto'
+		},
+		methods: {
+			init() {
+				if (this.$store.getters.user) this.user = this.$store.getters.user;
+				this.initLocation();
+			},
+			initLocation() {
+				if (this.$store.getters.city) return;
+				$.getJSON("https://restapi.amap.com/v3/ip?key=36b8970fe5bcfd92fe9e34e32d0e7461", res => {
+					for (let i = 0; i < city.length; i++) {
+						if (city[i].cityCode == res.adcode) {
+							this.$store.dispatch('app/changeCity', city[i]);
+						}
+					}
+				}).fail(error => {
+					this.$store.dispatch('app/changeCity', city[0]);
+				});
+			},
+			login() {
+				this.visible = true;
+			},
+			callback(type) {
+				if (type === 'init') {
+					this.routerViewKey++;
+					this.init();
+				}
+				this.visible = false;
+			},
+			loginout() {
+				this.$confirm('是否要退出登录?', () => {
+					removeToken();
+					this.$store.dispatch('projectBase/changeProject', {});
+					this.$store.dispatch('app/changeUser', {});
+					this.$store.dispatch('app/changeOrganization', {});
+					this.$message.success('退出成功');
+					this.init();
+					this.routerViewKey++;
+				});
+			},
+		},
+		components: {
+			login,
+			avatar
 		}
 	}
 </script>
@@ -44,22 +107,31 @@
 <style lang="scss">
 	.website-layout {
 		width: 100%;
-		height: 100%;
 
-		.layout-title {
+		.login-toggle {
 			position: fixed;
 			top: 0;
 			left: 0;
 			right: 0;
-			height: 100px;
+			bottom: 0;
+			z-index: 998;
+			background: rgba(0, 0, 0, 0.5);
+		}
+
+		.layout-title {
+			position: fixed;
+			left: 0;
+			right: 0;
+			top: 0;
+			height: 60px;
 			color: #fff;
+			z-index: 9;
+			background: rgba(0, 0, 0, 0.5);
 
 			.title-box {
-				width: 100%;
+				width: 1200px;
 				height: 100%;
-				max-width: 1200px;
 				margin: 0 auto;
-				padding: 0 20px;
 				display: flex;
 				align-items: center;
 				justify-content: space-between;
@@ -70,14 +142,16 @@
 				align-items: center;
 
 				img {
-					width: 50px;
-					height: 50px;
+					width: 44px;
+					height: 44px;
 					border-radius: 4px;
 					margin-right: 10px;
+					cursor: pointer;
 				}
 
 				.title-label {
 					width: 130px;
+					cursor: pointer;
 				}
 
 				.title-name {
@@ -104,6 +178,7 @@
 
 				.location-name {
 					font-size: 12px;
+					margin-left: 3px;
 				}
 			}
 
@@ -111,6 +186,20 @@
 				display: flex;
 				align-items: center;
 
+				.loginout {
+					font-size: 12px;
+					margin-left: 5px;
+					cursor: pointer;
+				}
+
+				.login-avatar {
+					width: 32px;
+					height: 32px;
+					border-radius: 32px;
+					margin-right: 10px;
+					overflow: hidden;
+				}
+
 				.login-icon {
 					width: 32px;
 					height: 32px;

+ 22 - 1
virgo.wzfrontend/console/src/router/website.js

@@ -1,4 +1,4 @@
-import Layout from '@/layout/website'
+import Layout from '@/layout/website'
 const websiteRouter = {
 	path: '/website',
 	component: Layout,
@@ -9,6 +9,27 @@ const websiteRouter = {
 		meta: {
 			title: '房源首页'
 		}
+	}, {
+		path: 'homeDetail',
+		component: () => import('@/views/website/homeDetail'),
+		name: '房源详情',
+		meta: {
+			title: '房源详情'
+		}
+	}, {
+		path: 'search',
+		component: () => import('@/views/website/search'),
+		name: '房源搜索',
+		meta: {
+			title: '房源搜索'
+		}
+	}, {
+		path: 'city',
+		component: () => import('@/views/website/city'),
+		name: '选择城市',
+		meta: {
+			title: '选择城市'
+		}
 	}]
 }
 export default websiteRouter;

+ 2 - 1
virgo.wzfrontend/console/src/store/getters.js

@@ -6,7 +6,8 @@ const getters = {
 	project: state => state.projectBase.project || {}, //项目
 	config: state => state.app.config, //url配置信息
 	document: state => state.app.document, //模板context渲染
-	identityId: state => state.app.identityId, //身份
+	identity: state => state.app.identity, //身份
 	houseData: state => state.projectBase.houseData, //房源编辑
+	city: state => state.app.city, //当前位置
 }
 export default getters

+ 15 - 6
virgo.wzfrontend/console/src/store/modules/app.js

@@ -9,7 +9,8 @@ const state = {
 	menuData: [],
 	config: {},
 	document: {},
-	identityId: 0
+	identity: {},
+	city: {}
 }
 
 const mutations = {
@@ -31,8 +32,11 @@ const mutations = {
 	CHANGE_DOCUMENT: (state, document) => {
 		state.document = document;
 	},
-	CHANGE_IDENTITYID: (state, identityId) => {
-		state.identityId = identityId;
+	CHANGE_IDENTITY: (state, identity) => {
+		state.identity = identity;
+	},
+	CHANGE_CITY: (state, city) => {
+		state.city = city;
 	}
 }
 
@@ -67,10 +71,15 @@ const actions = {
 	}, document) {
 		commit('CHANGE_DOCUMENT', document);
 	},
-	changeiIdentityId({
+	changeIdentity({
+		commit
+	}, identity) {
+		commit('CHANGE_IDENTITY', identity);
+	},
+	changeCity({
 		commit
-	}, identityId) {
-		commit('CHANGE_IDENTITYID', identityId);
+	}, city) {
+		commit('CHANGE_CITY', city);
 	}
 }
 

Diferenças do arquivo suprimidas por serem muito extensas
+ 1012 - 0
virgo.wzfrontend/console/src/uitls/citys.js


+ 13 - 11
virgo.wzfrontend/console/src/uitls/permission.js

@@ -13,7 +13,7 @@ import {
 NProgress.configure({
 	showSpinner: false
 })
-const baseUrl = ['/', '/401', '/404', '/loginRegister/login', '/work', '/message', '/space/project',
+const baseUrl = ['/', '/401', '/404', '/loginRegister/login', '/work', '/message', '/work/space/project',
 	'/iot/device/detail', '/work/system/main', '/website/home'
 ];
 
@@ -44,16 +44,18 @@ const testComment = (path) => { //判断权限路由
 router.beforeEach((to, from, next) => {
 	if (getToken() && !(store.getters && store.getters.user && store.getters.user.userId) && !sessionStorage
 		.getItem('store')) removeToken();
-	/* 判断是否登录 */
-	if (!getToken() && testBaseUrl(to.path)) return next('/loginRegister/login');
-	/* 判断路由是否存在 */
-	if (to.matched.length === 0) return next('/404');
-	/* 判断是否有权限 */
-	if (testComment(to.path)) return next('/401');
-	/* 无项目时跳转项目列表页面 */
-	if (getToken() && localStorage.getItem('projectId') == 0 && to.path !== '/space/project') {
-		tip('暂无项目,请先添加项目');
-		return next('/space/project');
+	if (to.path.indexOf('website') === -1) {
+		/* 判断是否登录 */
+		if (!getToken() && testBaseUrl(to.path)) return next('/loginRegister/login');
+		/* 判断路由是否存在 */
+		if (to.matched.length === 0) return next('/404');
+		/* 判断是否有权限 */
+		if (testComment(to.path)) return next('/401');
+		/* 无项目时跳转项目列表页面 */
+		if (getToken() && localStorage.getItem('projectId') == 0 && to.path !== '/work/space/project') {
+			tip('暂无项目,请先添加项目');
+			return next('/work/space/project');
+		}
 	}
 	NProgress.start();
 	next();

+ 51 - 129
virgo.wzfrontend/console/src/views/login/index.vue

@@ -34,18 +34,12 @@
 <script>
 	import {
 		login,
-		getUserInfo,
-		selectProject,
-		selectOrangaized,
-		getOrganizedProjectList,
 		getImgCode,
-		sendPhoneCode
+		sendPhoneCode,
+		getUserInfo
 	} from '@/httpApi/loginRegister';
 	import {
-		bindProjectDetail
-	} from '@/httpApi/organization'
-	import {
-		getProjectDetailById
+		getProjectListByIdentity
 	} from '@/httpApi/space'
 	import {
 		getIdentityResource
@@ -159,19 +153,12 @@
 						getUserInfo().then(res => {
 							if (res.state) {
 								let user = res.data;
-								let organized = this.testOrganized(user);
-								this.selectOrganized(organized);
-								this.$store.dispatch('app/changeOrganization', organized);
+								this.$store.dispatch('app/changeOrganization', user.organization);
 								this.$store.dispatch('app/changeUser', user);
-								if (user.userId === 1) {
-									this.selectProject({
-										projectId: user.projectId,
-										identityId: 6
-									});
-								} else {
-									this.getUserProjectList(user.projectId);
-								}
-
+								this.$store.dispatch('app/changeMenuData', user.resource ? JSON.parse(user
+									.resource) : []);
+								setComment(user.menu ? user.menu : JSON.stringify([]));
+								this.initProjectData(user.projectId);
 							} else {
 								this.loginLoading = false;
 							}
@@ -181,120 +168,55 @@
 					}
 				})
 			},
-			testOrganized(data) {
-				let organized = !data.organization ? data.organizationList[0] : data.organization;
-				return organized;
-			},
-			getUserProjectList(projectId) {
-				bindProjectDetail({
-					userId: this.$store.getters.user.userId
-				}).then(res => {
+			initProjectData(projectId) {
+				getProjectListByIdentity().then(res => {
 					if (res.state) {
-						let clientData = res.data;
-						bindProjectDetail({
-							bindOrganizationId: this.$store.getters.organization.id
-						}).then(res => {
-							if (res.state) {
-								let organizationData = res.data;
-								getOrganizedProjectList(this.$store.getters.organization.id).then(res => {
-									if (res.state) {
-										let data = res.data || [];
-										let obj = []
-										if (this.$store.getters.user.phone == this.$store.getters
-											.organization.contactTel) {
-											obj = data.map(node => {
-												return {
-													projectId: node.id,
-													projectName: node.name,
-													organizationId: node.organizationId,
-													organizationName: this.$store.getters
-														.user.organizationList.find(item =>
-															item.id === node.organizationId
-														).name,
-													identityId: 6
-												}
-											})
-										}
-										let projectList = clientData.concat(organizationData, obj)
-											.sort((a, b) => a.projectId - b.projectId);
-										if (projectList.length === 0) {
-											this.loginLoading = false;
-											this.$store.dispatch('app/changeMenuData', []);
-											setComment(JSON.stringify([]));
-											this.$store.dispatch('projectBase/changeProject', {});
-											localStorage.setItem('projectId', 0);
-											this.$store.dispatch('app/changeiIdentityId', 6);
-											this.$message.success('登录成功');
-											return this.$router.push('/space/project');
-										} else {
-											if (projectId === -1) {
-												this.selectProject(projectList[0]);
-											} else {
-												this.selectProject(projectList.filter(project =>
-													project.projectId === projectId)[0]);
-											}
-										}
-									} else {
-										this.loginLoading = false;
-									}
-								});
-							} else {
-								this.loginLoading = false;
-							}
-						})
+						if (res.data.length === 0) {
+							this.$store.dispatch('projectBase/changeProject', {});
+							this.$store.dispatch('app/changeIdentity', {
+								id: 6,
+								name: '所有者',
+								remark: '所有者'
+							});
+							localStorage.setItem('projectId', 0);
+							return this.successLogin('/work/space/project');
+						}
+						let project = projectId === -1 ? res.data[0] : res.data.find(node => node.id ===
+							projectId);
+						this.$store.dispatch('projectBase/changeProject', project);
+						this.$store.dispatch('app/changeIdentity', project.projectListIdentity[0]);
+						localStorage.setItem('projectId', projectId);
+						this.successLogin('/');
 					} else {
 						this.loginLoading = false;
 					}
 				})
 			},
-			selectProject(item) {
-				getProjectDetailById(item.projectId).then(res => {
-					if (res.state) {
-						let data = res.data;
-						selectProject(data.id).then(res => {
-							if (res.state) {
-								let user = res.data;
-								this.$store.dispatch('app/changeiIdentityId', item.identityId);
-								this.$store.dispatch('projectBase/changeProject', data);
-								localStorage.setItem('projectId', data.id);
-								this.$store.dispatch('app/changeUser', user);
-								if (item.identityId === 3 || user.userId === 1) {
-									this.$store.dispatch('app/changeMenuData', user.resource ? JSON.parse(
-										user.resource) : []);
-									setComment(user.menu ? user.menu : JSON.stringify([]));
-									this.loginLoading = false;
-									this.$router.push('/');
-									this.$message.success('登录成功');
-								} else {
-									getIdentityResource({
-										identityId: item.identityId,
-										type: data.type
-									}).then(node => {
-										if (node.state) {
-											let role = node.data[0] || {};
-											this.$store.dispatch('app/changeMenuData', role
-												.resource ? JSON.parse(role.resource) : []);
-											setComment(role.menus ? role.menus : JSON.stringify(
-												[]));
-											this.loginLoading = false;
-											this.$router.push('/');
-											this.$message.success('登录成功');
-										} else {
-											this.loginLoading = false;
-										}
-									})
-								}
-							} else {
-								this.loginLoading = false;
-							}
-						});
-					} else {
-						this.loginLoading = false;
-					}
-				})
-			},
-			selectOrganized(data) {
-				selectOrangaized(data)
+			successLogin(url) {
+				let item = this.$store.getters.identity;
+				if (item.id === 3 || this.$store.getters.user.userId === 1) {
+					this.loginLoading = false;
+					this.$router.push(url);
+					this.$message.success('登录成功');
+				} else {
+					getIdentityResource({
+						identityId: item.id,
+						type: this.$store.getters.project.type || 1
+					}).then(node => {
+						if (node.state) {
+							let role = node.data[0] || {};
+							this.$store.dispatch('app/changeMenuData', role
+								.resource ? JSON.parse(role.resource) : []);
+							setComment(role.menus ? role.menus : JSON.stringify(
+								[]));
+							this.loginLoading = false;
+							this.$router.push(url);
+							this.$message.success('登录成功');
+						} else {
+							this.loginLoading = false;
+						}
+					})
+				}
 			}
 		}
 	};

+ 154 - 0
virgo.wzfrontend/console/src/views/website/city.vue

@@ -0,0 +1,154 @@
+<template>
+	<div class="city-index">
+		<div class="container">
+			<div class="hot-city">
+				<div class="label">热门城市</div>
+				<div class="city-list">
+					<div class="city-item" v-for="(item,i) in hotCityList" :key="-i" @click="changeCity(item)">
+						{{item.cityName}}
+					</div>
+				</div>
+			</div>
+			<div class="city-container">
+				<div class="title">按字母选择</div>
+				<div class="city-container-item" v-for="(list,key,index) in cityList" :key="index">
+					<div class="city-container-label">{{key}}</div>
+					<div class="city-list">
+						<div class="city-item" v-for="(item,i) in list" :key="i" @click="changeCity(item)">
+							{{item.cityName}}
+						</div>
+					</div>
+				</div>
+			</div>
+		</div>
+	</div>
+</template>
+
+<script>
+	import city from '@/uitls/citys.js';
+	import {
+		pinyin
+	} from 'pinyin-pro';
+	export default {
+		data() {
+			return {
+				cityList: {},
+				hotCityList: [{
+					'cityCode': '110100',
+					'cityName': '北京'
+				}, {
+					'cityCode': '120100',
+					'cityName': '天津'
+				}, {
+					'cityCode': '310100',
+					'cityName': '上海'
+				}, {
+					'cityCode': '330100',
+					'cityName': '杭州'
+				}, {
+					'cityCode': '440300',
+					'cityName': '深圳'
+				}]
+			}
+		},
+		created() {
+			this.initCity();
+		},
+		methods: {
+			initCity() {
+				let obj = {}
+				for (let i = 0; i < city.length; i++) {
+					let firstName = pinyin(city[i].cityName, {
+						pattern: 'first',
+						type: 'array',
+						toneType: 'none'
+					})[0].toUpperCase();
+					if (!obj[firstName]) obj[firstName] = [];
+					obj[firstName].push(city[i]);
+				}
+				let sortedKeys = Object.keys(obj).sort();
+				let sortedObj = {};
+				sortedKeys.forEach(key => {
+					sortedObj[key] = obj[key];
+				});
+				this.cityList = sortedObj;
+			},
+			changeCity(item) {
+				this.$store.dispatch('app/changeCity', item);
+				this.$router.go(-1)
+			}
+		}
+	}
+</script>
+
+<style lang="scss">
+	.city-index {
+		padding-top: 65px;
+		color: #000;
+
+		.container {
+			width: 1200px;
+			margin: 0 auto;
+
+		}
+
+		.hot-city {
+			height: 95px;
+			display: flex;
+			align-items: center;
+			border-bottom: 1px solid #e7ebee;
+
+			.label {
+				font-size: 24px;
+				font-weight: 500;
+				line-height: 24px;
+				margin-right: 30px;
+			}
+		}
+
+		.city-list {
+			display: flex;
+			align-items: center;
+			flex-wrap: wrap;
+
+			.city-item {
+				cursor: pointer;
+				margin-right: 28px;
+
+				&:hover {
+					color: $--color-primary;
+					text-decoration: underline;
+				}
+			}
+		}
+
+		.city-container {
+
+			.title {
+				font-size: 20px;
+				font-weight: 500;
+				line-height: 20px;
+				padding-top: 32px;
+			}
+
+			.city-container-item {
+				display: flex;
+				padding: 20px 20px 0 20px;
+				border-bottom: 1px solid #e7ebee;
+			}
+
+			.city-container-label {
+				font-size: 24px;
+				font-weight: 500;
+				line-height: 24px;
+				margin-right: 20px;
+				position: relative;
+				top: -3px;
+			}
+
+			.city-item {
+				margin-bottom: 20px;
+			}
+		}
+	}
+</style>

+ 42 - 54
virgo.wzfrontend/console/src/views/website/home.vue

@@ -1,49 +1,74 @@
 <template>
 	<div class="website-home">
-		<div class="main">
-			<div class="container">
+		<div class="website-home-bg"></div>
+		<div class="container">
+			<div class="main-container">
 				<div class="main-title">有极-寻找合适的房源</div>
 				<div class="main-sub-title">方便、快捷、精准</div>
 				<div class="main-input">
-					<input type="text" placeholder="请输入房源名称或项目名称" />
+					<input type="text" placeholder="请输入房源名称" />
 					<div class="main-input-button">
 						<i class="el-icon-search"></i>
 					</div>
 				</div>
 			</div>
-		</div>
-		<div class="container high-seas">
-			<div class="title">公海房源</div>
-			<div class="house-list">
-				<div class="house-item">
-					<img src="https://img0.baidu.com/it/u=3837888269,660016232&fm=253&fmt=auto&app=138&f=JPEG?w=1067&h=800"
-						alt="滨湖万丽南排小高,耳朵户型凤凰层" />
-				</div>
+			<div class="high-seas">
+				<div class="title">公海房源</div>
+				<house-list type="highseas"></house-list>
 			</div>
 		</div>
+		<house-foot type="all"></house-foot>
 	</div>
 </template>
 
 <script>
+	import houseList from "@/components/website/houseList.vue"
+	import houseFoot from "@/components/website/houseFoot.vue"
+	export default {
+		data() {
+			return {}
+		},
+		created() {
+
+		},
+		components: {
+			houseList,
+			houseFoot
+		}
+	}
 </script>
 
 <style lang="scss">
 	.website-home {
+		position: relative;
+
 		.container {
-			width: 100%;
-			max-width: 1200px;
+			width: 1200px;
 			margin: 0 auto;
-			padding: 0 20px;
 		}
 
-		.main {
+		.website-home-bg {
+			width: 100%;
+			min-width: 1200px;
 			height: 600px;
 			background: url(https://file-node.oss-cn-shanghai.aliyuncs.com/youji/5ea8dc9317c643d0b0254d8d13a154f3);
 			background-repeat: no-repeat;
 			background-size: 100% 100%;
+			position: absolute;
+			top: 0;
+			left: 0;
+		}
+
+		.main-container {
+			height: 600px;
 			color: #fff;
-			padding-top: 100px;
+			padding-top: 80px;
 			box-sizing: border-box;
+			display: flex;
+			flex-direction: column;
+			justify-content: center;
+			position: relative;
+			z-index: 8;
 
 			.main-title {
 				font-weight: 500;
@@ -87,22 +112,12 @@
 					}
 				}
 			}
-
-			.container {
-				width: 100%;
-				height: 100%;
-				max-width: 1200px;
-				margin: 0 auto;
-				padding: 0 20px;
-				display: flex;
-				flex-direction: column;
-				justify-content: center;
-			}
 		}
 
 		.high-seas {
 			color: #191919;
 			margin-top: 80px;
+			padding-bottom: 200px;
 
 			.title {
 				font-size: 36px;
@@ -110,33 +125,6 @@
 				font-weight: 600;
 				margin-bottom: 30px;
 			}
-
-			.house-list {
-				display: flex;
-
-				.house-item {
-					width: 265px;
-					background: #fff;
-					border-radius: 8px;
-					box-sizing: border-box;
-					position: relative;
-					margin-bottom: 15px;
-					cursor: pointer;
-
-					&:hover {
-						box-shadow: 0px 1px 12px rgba(3, 3, 3, 0.08);
-					}
-
-					img {
-						border-radius: 4px;
-						width: 265px;
-						height: 205px;
-						border: 0;
-						vertical-align: top;
-					}
-				}
-			}
-
 		}
 	}
 </style>

+ 456 - 0
virgo.wzfrontend/console/src/views/website/homeDetail.vue

@@ -0,0 +1,456 @@
+<template>
+	<div class="home-detail">
+		<div class="container">
+			<div class="title">滨湖万丽</div>
+			<div class="home-detail-content">
+				<div class="home-detail-swiper">
+					<div class="swiper-container">
+						<div class="swiper-wrapper">
+							<div v-for="item in swiperList" :key="item.id" class="swiper-slide"
+								:style="`background-image:url(${item.imgUrl})`">
+							</div>
+						</div>
+						<div class="swiper-button-prev"></div>
+						<div class="swiper-button-next"></div>
+					</div>
+				</div>
+				<div class="home-detail-information">
+					<div class="house-name">滨湖万丽南排小高,耳朵户型凤凰层</div>
+					<div class="tag">
+						<span>120m²</span>
+						<span>标签1</span>
+						<span>标签2</span>
+						<span>标签3</span>
+					</div>
+					<div class="house-price">
+						<div>
+							<span class="average alibaba">7116</span><span class="unit">元/月</span>
+						</div>
+						<div class="hui-button">预约看房</div>
+					</div>
+					<div class="content-title">基本信息</div>
+					<div class="information-list">
+						<div class="information-box">
+							<div class="information-title">所属楼宇:</div>
+							<div class="information-div">1号楼</div>
+						</div>
+						<div class="information-box">
+							<div class="information-title">所属楼层:</div>
+							<div class="information-div">2层</div>
+						</div>
+						<div class="information-box">
+							<div class="information-title">房源类型:</div>
+							<div class="information-div">写字楼</div>
+						</div>
+						<div class="information-box">
+							<div class="information-title">房间号码:</div>
+							<div class="information-div">204</div>
+						</div>
+						<div class="information-box">
+							<div class="information-title">房源面积:</div>
+							<div class="information-div">120m²</div>
+						</div>
+						<div class="information-box">
+							<div class="information-title">付款方式:</div>
+							<div class="information-div">公对公帐户</div>
+						</div>
+						<div class="information-box" style="margin-bottom: 0;">
+							<div class="information-title">产权证书:</div>
+							<div class="information-div">SD123333234</div>
+						</div>
+						<div class="information-box" style="margin-bottom: 0;">
+							<div class="information-title">是否装修:</div>
+							<div class="information-div">是</div>
+						</div>
+					</div>
+					<div class="content-title">房源简介</div>
+					<div class="desc-text">
+						【小区优点】小区位置还不错,位于日月湖板块,主推大面积户型,洋房157平,小高层137平,改户可以选择。
+						【推荐人群】本小区适合想在日月湖买房,改善客户选择,可以选择洋房4室2卫的户型。
+					</div>
+				</div>
+			</div>
+			<div class="sub-title">周边配套</div>
+			<div class="map-container">
+				<div id="map"></div>
+				<div class="content-device">
+					<div class="people-tell">
+						<img class="people-avatar"
+							src="https://img0.baidu.com/it/u=3837888269,660016232&fm=253&fmt=auto&app=138&f=JPEG?w=1067&h=800"
+							mode="aspectFill">
+						</img>
+						<div class="people-text">
+							<div class="people-name">房东名称</div>
+							<div class="people-organization">
+								组织名称
+							</div>
+						</div>
+					</div>
+					<div class="device-list">
+						<div class="device-item"
+							v-for="item in $field.findTypeNameByList('supportingFacilities','1,2,3,4,5,6')"
+							:key="item.id">
+							<i :class="'iconfont device-icon ' + item.icon"></i>
+							<span class="device-label">{{item.name}}</span>
+						</div>
+					</div>
+				</div>
+			</div>
+		</div>
+		<house-foot></house-foot>
+	</div>
+</template>
+
+<script>
+	// 引入插件
+	import Swiper from 'swiper'; // 注意引入的是Swiper
+	import 'swiper/css/swiper.min.css' // 注意这里的引入
+	import houseFoot from "@/components/website/houseFoot.vue"
+	import AMapLoader from "@amap/amap-jsapi-loader"; //引入AMapLoader
+	window._AMapSecurityConfig = {
+		// 设置安全密钥
+		securityJsCode: "3e392dc7eb2cf2c04b1b8899776e8905",
+	};
+	export default {
+		data() {
+			return {
+				swiper: null,
+				swiperList: [{
+					id: 1,
+					title: '采集国家二级保护野生植物审批',
+					imgUrl: 'https://img0.baidu.com/it/u=3837888269,660016232&fm=253&fmt=auto&app=138&f=JPEG?w=1067&h=800',
+				}, {
+					id: 2,
+					title: '农村危房改造',
+					imgUrl: 'https://img0.baidu.com/it/u=3837888269,660016232&fm=253&fmt=auto&app=138&f=JPEG?w=1067&h=800',
+				}, {
+					id: 3,
+					title: '乡村医生执业注册',
+					imgUrl: 'https://img0.baidu.com/it/u=3837888269,660016232&fm=253&fmt=auto&app=138&f=JPEG?w=1067&h=800',
+				}, {
+					id: 4,
+					title: '生鲜乳准运证明核发',
+					imgUrl: 'https://img0.baidu.com/it/u=3837888269,660016232&fm=253&fmt=auto&app=138&f=JPEG?w=1067&h=800',
+				}, {
+					id: 5,
+					title: '常量命名全部大写,单词间用下划线隔开,力求语义表达完整清楚, 不要嫌名字长',
+					imgUrl: 'https://img0.baidu.com/it/u=3837888269,660016232&fm=253&fmt=auto&app=138&f=JPEG?w=1067&h=800',
+				}, {
+					id: 6,
+					title: '使用 2 个空格进行缩进',
+					imgUrl: 'https://img0.baidu.com/it/u=3837888269,660016232&fm=253&fmt=auto&app=138&f=JPEG?w=1067&h=800',
+				}, {
+					id: 7,
+					title: '不同逻辑、不同语义、不同业务的代码之间插入一个空行分隔开来以 提升可读性',
+					imgUrl: 'https://img0.baidu.com/it/u=3837888269,660016232&fm=253&fmt=auto&app=138&f=JPEG?w=1067&h=800',
+				}, {
+					id: 8,
+					title: '使用字面量来代替对象构造器',
+					imgUrl: 'https://img0.baidu.com/it/u=3837888269,660016232&fm=253&fmt=auto&app=138&f=JPEG?w=1067&h=800',
+				}],
+				detail: {}
+			};
+		},
+		mounted() {
+			window.scrollTo(0, 0);
+			this.getSwiper();
+			this.initMap();
+
+		},
+		methods: {
+			initMap() {
+				AMapLoader.load({
+					key: "880f8193c52d9dee80cd82212d9508cf", //申请好的Web端开发者key,调用 load 时必填
+					version: "2.0", //指定要加载的 JS API 的版本,缺省时默认为 1.4.15
+				}).then((AMap) => {
+					//JS API 加载完成后获取AMap对象
+					const map = new AMap.Map("map", {
+						divMode: '2D', //默认使用 2D 模式
+						zoom: 11, //地图级别
+						center: [116.397428, 39.90923], //地图中心点
+					});
+					const marker = new AMap.Marker({
+						position: [116.397428, 39.90923],
+					});
+					map.add(marker);
+				}).catch((e) => {
+					console.error(e); //加载错误提示
+				});
+			},
+			getSwiper() {
+				this.swiper = new Swiper(".swiper-container", {
+					navigation: {
+						nextEl: '.swiper-button-next',
+						prevEl: '.swiper-button-prev',
+					},
+				})
+			}
+		},
+		components: {
+			houseFoot
+		}
+	};
+</script>
+
+<style lang="scss">
+	.home-detail {
+		padding-top: 60px;
+		color: #000;
+
+		.title {
+			font-size: 30px;
+			font-weight: bolder;
+			line-height: 30px;
+			margin: 20px 0;
+		}
+
+		.sub-title {
+			font-size: 24px;
+			font-weight: bolder;
+			line-height: 30px;
+			margin: 20px 0;
+		}
+
+		.map-container {
+			display: flex;
+			margin-bottom: 30px;
+
+			#map {
+				width: 670px;
+				height: 400px;
+			}
+
+			.content-device {
+				width: 470px;
+				height: 400px;
+				margin-left: 60px;
+
+				.people-tell {
+					border-bottom: 1px solid #e7ebee;
+					display: flex;
+					align-items: center;
+					padding: 15px 0;
+					margin-bottom: 15px;
+
+					.people-avatar {
+						width: 50px;
+						height: 50px;
+						border-radius: 50%;
+						margin-right: 15px;
+					}
+
+					.people-text {
+						flex: 1;
+						width: 0;
+						overflow: hidden;
+					}
+
+					.people-name {
+						font-size: 20px;
+						font-weight: 500;
+					}
+
+					.people-organization {
+						font-weight: 300;
+						font-size: 14px;
+					}
+				}
+
+				.device-list {
+					display: flex;
+					flex-wrap: wrap;
+					align-content: flex-start;
+				}
+
+				.device-item {
+					width: 50%;
+					display: flex;
+					align-items: center;
+					margin-bottom: 15px;
+
+					.device-label {
+						flex: 1;
+						width: 0;
+						font-weight: 200;
+						margin-left: 10px;
+					}
+
+					.device-icon {
+						font-size: 18px;
+						margin-right: 5px;
+					}
+				}
+			}
+		}
+
+
+		.container {
+			width: 1200px;
+			margin: 0 auto;
+		}
+
+		.home-detail-content {
+			display: flex;
+		}
+
+		.home-detail-swiper {
+			width: 670px;
+			height: 480px;
+
+			.swiper-container,
+			.swiper-wrapper {
+				width: 100%;
+				height: 100%;
+			}
+
+			.swiper-button-next:after,
+			.swiper-button-prev:after {
+				color: #eee;
+				font-size: 16px;
+			}
+
+			.swiper-button-prev,
+			.swiper-container-rtl .swiper-button-next {
+				left: 0;
+				background: rgba(0, 0, 0, 0.3);
+				height: 70px;
+				margin-top: -35px;
+			}
+
+			.swiper-button-next,
+			.swiper-container-rtl .swiper-button-prev {
+				right: 0;
+				background: rgba(0, 0, 0, 0.3);
+				height: 70px;
+				margin-top: -35px;
+			}
+		}
+
+		.home-detail-information {
+			width: 470px;
+			height: 480px;
+			margin-left: 60px;
+
+			.house-name {
+				font-size: 26px;
+				font-weight: 500;
+			}
+
+			.tag {
+				margin: 10px 0;
+
+				span {
+					background: #eee;
+					padding: 5px 10px;
+					border-radius: 4px;
+					margin: 5px 5px 5px 0;
+					font-size: 12px;
+					color: #7b7979;
+				}
+			}
+
+			.content-title {
+				font-size: 16px;
+				font-weight: 500;
+			}
+
+			.house-price {
+				display: flex;
+				align-items: center;
+				justify-content: space-between;
+
+				span {
+					color: $--color-red;
+				}
+
+				border-bottom: 1px solid #e7ebee;
+				margin-bottom: 15px;
+				padding-bottom: 5px;
+
+				.hui-button {
+					color: #fff;
+					background: $--color-primary;
+					width: 100px;
+					height: 34px;
+					text-align: center;
+					line-height: 34px;
+					border-radius: 4px;
+					cursor: pointer;
+
+					&:hover {
+						opacity: 0.8;
+					}
+				}
+			}
+
+			.average {
+				font-size: 30px;
+				font-weight: 900;
+				margin-right: 5px;
+			}
+
+			.desc-text {
+				margin-top: 10px;
+			}
+
+			.information-list {
+				display: flex;
+				flex-wrap: wrap;
+				margin-bottom: 10px;
+
+				.information-box {
+					width: 50%;
+					display: flex;
+					padding: 7px 20px 7px 0;
+					box-sizing: border-box;
+				}
+
+				.information-title {
+					color: #979b9e;
+					font-weight: 500;
+				}
+
+				.information-text {
+					flex: 1;
+					width: 0;
+					overflow: hidden;
+					white-space: nowrap;
+					font-weight: 300;
+				}
+			}
+		}
+
+		.footer {
+			background: #212631;
+			min-width: 1200px;
+
+			.footer-box {
+				width: 1200px;
+				margin: 0 auto
+			}
+
+			.foot-information {
+				font-weight: 400;
+				font-size: 12px;
+				color: #98999d;
+				line-height: 17px;
+				display: flex;
+				align-items: center;
+				padding: 20px;
+				justify-content: center
+			}
+
+			.foot-information a {
+				color: #98999d;
+				margin-right: 30px
+			}
+
+			.foot-information img {
+				width: 14px;
+				height: 14px;
+				margin-left: 30px;
+				margin-right: 10px
+			}
+		}
+	}
+</style>

+ 51 - 0
virgo.wzfrontend/console/src/views/website/search.vue

@@ -0,0 +1,51 @@
+<template>
+	<div class="search-list">
+		<div class="container" style="margin-bottom: 30px;">
+			<div class="title">搜索“aa”结果</div>
+			<div class="search-list-box">
+				<house-list></house-list>
+				<!-- <el-empty description="暂无房源"></el-empty> -->
+			</div>
+		</div>
+		<house-foot></house-foot>
+	</div>
+</template>
+
+<script>
+	import houseList from "@/components/website/houseList.vue"
+	import houseFoot from "@/components/website/houseFoot.vue"
+	export default {
+		data() {
+			return {
+
+			}
+		},
+		components: {
+			houseList,
+			houseFoot
+		},
+	}
+</script>
+
+<style lang="scss">
+	.search-list {
+		padding-top: 60px;
+		color: #000;
+
+		.title {
+			font-size: 30px;
+			font-weight: bolder;
+			line-height: 30px;
+			margin: 20px 0;
+		}
+
+		.container {
+			width: 1200px;
+			margin: 0 auto;
+		}
+
+		.search-list-box {
+			min-height: calc(100vh - 217px);
+		}
+	}
+</style>