租房小程序前端代码
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

527 lines
16 KiB

6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
  1. <template>
  2. <view>
  3. <view class="se-w-vw-100 se-h-500">
  4. <uv-swiper :radius="0" :list="list" :height="250" keyName="url" :autoplay="false"></uv-swiper>
  5. </view>
  6. <view class="se-py-20 se-flex se-bgc-white">
  7. <view class="se-w-vw-90 se-pl-30">
  8. <view class=" se-c-black se-fw-6 se-fs-32">
  9. {{detail.title}}
  10. </view>
  11. <view class="se-display-ib se-c-white se-bgc-orange se-fs-22 se-br-8 se-px-10 se-py-5">
  12. {{detail.iconTitle}}
  13. </view>
  14. </view>
  15. <view class="se-pr-30 se-flex se-flex-v-c">
  16. <button style="justify-content: center;" class="se-w-140 se-flex se-flex-ai-c se-h-60 se-lh-60 se-fs-22 se-bgc-green se-c-white se-py-0 se-br-30 se-px-20 se-m-0" open-type="share">
  17. <uv-icon name="share" color="#fff"></uv-icon>
  18. <text class="se-fs-20 se-pl-5">分享</text>
  19. </button>
  20. </view>
  21. </view>
  22. <view class="se-mt-30 se-bgc-white se-py-30 se-flex se-flex-h-fs">
  23. <view class="se-flex-1 se-flex-v-sa">
  24. <text class="se-c-66 se-fw-5">价格</text>
  25. <text class="se-c-red se-fw-6 se-mt-20">{{detail.price}}/</text>
  26. </view>
  27. <view class="se-flex-1 se-flex-v-sa">
  28. <text class="se-c-66 se-fw-5">户型</text>
  29. <text class="se-c-red se-fw-6 se-mt-20">{{detail.homeType}}</text>
  30. </view>
  31. <view class="se-flex-1 se-flex-v-sa">
  32. <text class="se-c-66 se-fw-5">面积</text>
  33. <text class="se-c-red se-fw-6 se-mt-20">{{detail.homeMi}}平方米</text>
  34. </view>
  35. </view>
  36. <view class="se-mt-30 se-p-40 se-bgc-white">
  37. <view class="se-flex se-flex-ai-c se-pb-10">
  38. <view class="line-green"></view>
  39. <view class="se-ml-10 se-fs-32 se-c-black se-fw-6">
  40. 房源信息
  41. </view>
  42. </view>
  43. <view class="se-flex se-fs-24">
  44. <view class="se-flex-1 se-py-20">
  45. <text class="se-c-66 se-mr-20">编号</text>
  46. <text class="se-c-black">{{detail.classId}}</text>
  47. </view>
  48. <view class="se-flex-1 se-py-20 se-flex se-flex-h-fe">
  49. <text class="se-c-66 se-mr-20">房屋结构</text>
  50. <text class="se-c-black">{{detail.homeJg}}</text>
  51. </view>
  52. </view>
  53. <view class="se-flex se-fs-24"
  54. v-if="userInfo.isPay == 1">
  55. <view class="se-flex-2 se-py-20">
  56. <text class="se-c-66 se-mr-20">房屋地址</text>
  57. <text class="se-c-black se-fw-6">{{ detail.address }}</text>
  58. </view>
  59. </view>
  60. <view class="se-flex bgc-active-lg se-py-20 se-br-10"
  61. v-if="userInfo.isPay == 1">
  62. <view class="se-w-p-85 se-pl-30">
  63. <view class=" se-c-black se-fw-6 se-fs-24">
  64. 您的位置{{ detail.address }}
  65. </view>
  66. <!-- <view class="se-fs-22 se-py-5">
  67. 距离你1.4km 骑行9分钟 步行18分钟
  68. </view> -->
  69. </view>
  70. <button class="default-btn se-w-p-15 se-pr-30 se-flex se-flex-v-c" open-type="getUserInfo" @click="openMap">
  71. <uv-icon name="map-fill"></uv-icon>
  72. <text class="se-c-black se-fs-20 se-mt-10">导航</text>
  73. </button>
  74. <!-- <view class="se-w-p-15 se-pr-30 se-flex se-flex-v-c" @click="onDaoHang">
  75. <uv-icon name="map-fill"></uv-icon>
  76. <text class="se-c-black se-fs-20 se-mt-10">导航</text>
  77. </view> -->
  78. </view>
  79. <view class="se-flex se-fs-24">
  80. <view class="se-flex-2 se-py-20">
  81. <text class="se-c-66 se-mr-20">房屋周边</text>
  82. <text class="se-c-black se-fw-6">{{detail.homeBian}}</text>
  83. </view>
  84. </view>
  85. <view class="se-flex se-fs-24">
  86. <view class="se-flex-1 se-py-20">
  87. <text class="se-c-66 se-mr-20">房间数量</text>
  88. <text class="se-c-black">{{detail.homeNum}}</text>
  89. </view>
  90. <view class="se-flex-1 se-py-20 se-flex se-flex-h-fe">
  91. <text class="se-c-66 se-mr-20">菜地</text>
  92. <text class="se-c-black">{{detail.homeCai}}</text>
  93. </view>
  94. </view>
  95. <view class="se-flex se-fs-24">
  96. <view class="se-flex-1 se-py-20">
  97. <text class="se-c-66 se-mr-20">距离场镇距离</text>
  98. <text class="se-c-black">{{detail.homeJl}}km</text>
  99. </view>
  100. <view class="se-flex-1 se-py-20 se-flex se-flex-h-fe">
  101. <text class="se-c-66 se-mr-20">距离成都西三环</text>
  102. <text class="se-c-black">{{detail.homeShjl}}km</text>
  103. </view>
  104. </view>
  105. <view class="se-flex se-fs-24">
  106. <view class="se-flex-1 se-py-20">
  107. <text class="se-c-66 se-mr-20">房屋主体是否改造</text>
  108. <text class="se-c-black">{{detail.homeGz}}</text>
  109. </view>
  110. <view class="se-flex-1 se-py-20 se-flex se-flex-h-fe">
  111. <text class="se-c-66 se-mr-20">房屋面积</text>
  112. <text class="se-c-black">{{detail.homeMj}}</text>
  113. </view>
  114. </view>
  115. <view class="se-flex se-fs-24">
  116. <view class="se-flex-1 se-py-20">
  117. <text class="se-c-66 se-mr-20">院子总面积</text>
  118. <text class="se-c-black">{{detail.homeYzmj}}</text>
  119. </view>
  120. <view class="se-flex-2 se-py-20 se-flex se-flex-h-fe">
  121. <text class="se-c-66 se-mr-20">房屋朝向及海拔</text>
  122. <text class="se-c-black">{{detail.homeHb}}</text>
  123. </view>
  124. </view>
  125. <view class="se-flex se-fs-24">
  126. <view class="se-flex-1 se-py-20">
  127. <text class="se-c-66 se-mr-20">是否经过安置</text>
  128. <text class="se-c-black">{{detail.homeAz}}</text>
  129. </view>
  130. <view class="se-flex-1 se-py-20 se-flex se-flex-h-fe">
  131. <text class="se-c-66 se-mr-20">交通</text>
  132. <text class="se-c-black">{{detail.homeJt}}</text>
  133. </view>
  134. </view>
  135. <view class="se-flex se-fs-24">
  136. <view class="se-flex-1 se-py-20">
  137. <text class="se-c-66 se-mr-20">坟包及电塔 工厂噪音</text>
  138. <text class="se-c-black">{{detail.homeZy}}</text>
  139. </view>
  140. <view class="se-flex-1 se-py-20 se-flex se-flex-h-fe">
  141. <text class="se-c-66 se-mr-20">水电气网</text>
  142. <text class="se-c-black">{{detail.homeSd}}</text>
  143. </view>
  144. </view>
  145. <view class="se-flex se-fs-24">
  146. <view class="se-flex-1 se-py-20">
  147. <text class="se-c-66 se-mr-20">停车</text>
  148. <text class="se-c-black">{{detail.homeCat}}</text>
  149. </view>
  150. <view class="se-flex-2 se-py-20 se-flex se-flex-h-fe">
  151. <text class="se-c-66 se-mr-20">付款方式及押金</text>
  152. <text class="se-c-black">{{detail.homePay}}</text>
  153. </view>
  154. </view>
  155. <view class="se-flex se-fs-24">
  156. <view class="se-flex-1 se-py-20">
  157. <text class="se-c-66 se-mr-20">租期</text>
  158. <text class="se-c-black">{{detail.homeTime}}</text>
  159. </view>
  160. <view class="se-flex-1 se-py-20 se-flex se-flex-h-fe">
  161. <text class="se-c-66 se-mr-20">非正常死亡</text>
  162. <text class="se-c-black">{{detail.homeSw}}</text>
  163. </view>
  164. </view>
  165. <view class="se-flex se-fs-24">
  166. <view class="se-flex-1 se-py-20">
  167. <text class="se-c-66 se-mr-20">邻居对房东评价</text>
  168. <text class="se-c-black">{{detail.homePj}}</text>
  169. </view>
  170. <view class="se-flex-1 se-py-20 se-flex se-flex-h-fe">
  171. <text class="se-c-66 se-mr-20">佣金</text>
  172. <text class="se-c-black">{{detail.homeMoney}}</text>
  173. </view>
  174. </view>
  175. <view class="se-flex se-fs-24">
  176. <view class="se-flex-1 se-py-20">
  177. <text class="se-c-66 se-mr-20">钥匙</text>
  178. <text class="se-c-black">{{detail.homeYs}}</text>
  179. </view>
  180. <view class="se-flex-1 se-py-20 se-flex se-flex-h-fe">
  181. <text class="se-c-66 se-mr-20">户主家庭职业</text>
  182. <text class="se-c-black">{{detail.homeJtzy}}</text>
  183. </view>
  184. </view>
  185. <view class="se-flex se-fs-24">
  186. <view class="se-flex-1 se-py-20">
  187. <text class="se-c-66 se-mr-20">报建手续</text>
  188. <text class="se-c-black">{{detail.homeBjsx}}</text>
  189. </view>
  190. <view class="se-flex-1 se-py-20 se-flex se-flex-h-fe">
  191. <text class="se-c-66 se-mr-20">户主年龄</text>
  192. <text class="se-c-black">{{detail.homeAge}}</text>
  193. </view>
  194. </view>
  195. </view>
  196. <view class="se-mt-30 se-p-40 se-bgc-white">
  197. <view class="se-flex se-flex-ai-c se-pb-10">
  198. <view class="line-green"></view>
  199. <view class="se-ml-10 se-fs-32 se-c-black se-fw-6">
  200. 产权证照片
  201. </view>
  202. </view>
  203. <view class="se-flex se-mt-20">
  204. <image @click="previewImage(detail.homeImages, items)" v-for="(items,indexs) in detail.homeImages" :key="indexs" class="se-w-320 se-h-180 se-br-5 se-mr-10" :src="items" mode=""></image>
  205. </view>
  206. </view>
  207. <view class="se-mt-30 se-p-40 se-bgc-white">
  208. <view class="se-flex se-flex-ai-c se-pb-10">
  209. <view class="line-green"></view>
  210. <view class="se-ml-10 se-fs-32 se-c-black se-fw-6">
  211. 房东评价
  212. </view>
  213. </view>
  214. <view v-if="rateList.length>0">
  215. <view class="se-mt-30" v-for="(items,indexs) in rateList" :key="indexs">
  216. <view class="se-flex se-w-p-100">
  217. <view class="se-flex se-flex-1">
  218. <image class="se-a-80 se-br-p-50 se-bgc-f5" style="min-width: 80rpx;" :src="items.userHead" mode=""></image>
  219. <view class="se-flex se-flex-v-sa se-flex-ai-fs se-ml-10">
  220. <text class="se-c-33 se-fs-26">{{items.userName}}</text>
  221. <text class="se-c-66 se-fs-22">{{items.createTime}}</text>
  222. </view>
  223. </view>
  224. <view class="se-flex se-flex-h-fe">
  225. <uv-rate :count="5" :readonly="true" activeColor="#FCD618" v-model="items.num"></uv-rate>
  226. </view>
  227. </view>
  228. <view class="se-lh-40 se-mt-10 se-fs-24 se-c-33">
  229. {{items.userValue}}
  230. </view>
  231. <view class="se-mt-10 se-flex">
  232. <image @click="previewImage(items.userImages, item)" v-for="(item,index) in items.userImages" :key="index" class="se-a-200 se-br-10 se-mr-10" :src="item" mode=""></image>
  233. </view>
  234. </view>
  235. </view>
  236. <view v-else class="se-py-30">
  237. <uv-empty mode="list" text="快来留言哦"></uv-empty>
  238. </view>
  239. </view>
  240. <view class="se-pb-160"></view>
  241. <view class="content-box">
  242. <view class="se-flex se-w-p-90 se-px-20" @click="show=true">
  243. <uv-input :disabled="true" class="se-br-p-50" placeholder="请输入评论信息" v-model="content"></uv-input>
  244. </view>
  245. </view>
  246. <view v-if="show" @click="show=false" style="z-index: 98;width: 750rpx;height:100vh; position: fixed;top: 0rpx;left:0rpx;background-color: rgba(0,0,0,0.4);"></view>
  247. <view v-if="show" class="se-b-t se-b-ts" style="z-index: 99;width: 750rpx;padding: 20rpx 0rpx 120rpx 0rpx; position: fixed;bottom: 0rpx;left:0rpx;background-color: #fff;">
  248. <view class="se-bgc-white se-px-40">
  249. <view class="se-flex se-flex-v se-fs-26 se-mt-20">
  250. <text class="se-pb-20">评论评分</text>
  251. <uv-rate :count="5" activeColor="#FCD618" v-model="rate"></uv-rate>
  252. </view>
  253. <view class="se-flex se-flex-v se-fs-26 se-mt-20">
  254. <text class="se-pb-20">评论内容</text>
  255. <uv-textarea v-model="userValue" placeholder="请输入评论内容"></uv-textarea>
  256. </view>
  257. <view class="se-lh-40 se-mt-20 se-fs-24 se-c-99">
  258. <text class="se-pb-20">评论图片</text>
  259. <uv-upload customStyle="margin-top:20rpx;" :fileList="userImages" @afterRead="afterImageRead" @delete="deleteImagePic" name="1"
  260. multiple :maxCount="10"></uv-upload>
  261. </view>
  262. <view class="se-flex se-flex-h-sb se-mt-40">
  263. <view @click="onSubmit" class="se-br-20 se-ml-20 se-flex-1 se-flex-h-c se-h-80 se-lh-80 se-ta-c se-fs-32 se-c-white se-bgc-green">
  264. <text class="se-ml-10">发布</text>
  265. </view>
  266. </view>
  267. </view>
  268. </view>
  269. </view>
  270. </template>
  271. <script>
  272. import { houseDetail,saveComment,commentPageList } from "@/common/api.js"
  273. import QQMapWX from "@/util/qqmap-wx-jssdk.min.js"
  274. export default{
  275. data(){
  276. return{
  277. show:false,
  278. content:"",
  279. id:null,
  280. address:"",
  281. detail:{},
  282. list:[],
  283. rate:0,
  284. userImages:[],
  285. userImage:"",
  286. userValue:"",
  287. pageNo:1,
  288. pageSize:10,
  289. rateList:[]
  290. }
  291. },
  292. onLoad(options) {
  293. //#ifdef MP-WEIXIN
  294. wx.showShareMenu({
  295. withShareTicket: true,
  296. menus: ['shareAppMessage', 'shareTimeline']
  297. });
  298. //#endif
  299. this.id = options.id;
  300. if(options.userId){
  301. uni.setStorageSync('userId',options.userId)
  302. }
  303. this.getLocation()
  304. this.onHouseDetail()
  305. this.onCommentPageList()
  306. },
  307. onShareTimeline(){
  308. let share = {
  309. title:this.detail.title,
  310. path:"/pages_subpack/detail/index?id="+this.id+"&userId="+uni.getStorageSync('userInfo').id,
  311. imageUrl:this.list[0].url,
  312. success:(res) => {
  313. console.info(res)
  314. },
  315. fail:(err)=>{
  316. console.info(err)
  317. }
  318. }
  319. console.info(share)
  320. return share
  321. },
  322. onShareAppMessage() {
  323. let share = {
  324. title:this.detail.title,
  325. path:"/pages_subpack/detail/index?id="+this.id+"&userId="+uni.getStorageSync('userInfo').id,
  326. imageUrl:this.list[0].url,
  327. success:(res) => {
  328. console.info(res)
  329. },
  330. fail:(err)=>{
  331. console.info(err)
  332. }
  333. }
  334. console.info(share)
  335. return share
  336. },
  337. methods:{
  338. openMap() {
  339. var that = this;
  340. uni.openLocation({
  341. longitude: parseFloat(that.detail.longitude),
  342. latitude: parseFloat(that.detail.latitude),
  343. scale: 18,
  344. name: that.detail.title,
  345. address: that.detail.address,
  346. success: function () {
  347. console.log('success');
  348. }
  349. })
  350. },
  351. getLocation(){
  352. const that = this;
  353. wx.getLocation({
  354. type: 'wgs84',
  355. success: function (res) {
  356. console.log('当前位置的经度:' + res.longitude);
  357. console.log('当前位置的纬度:' + res.latitude);
  358. const qqmapsdk = new QQMapWX({
  359. key: 'TT7BZ-Z3LW4-KOAUB-KWHOA-SBJJ6-Y5B6R' // 必填
  360. });
  361. qqmapsdk.reverseGeocoder({
  362. location: {
  363. latitude: res.latitude,
  364. longitude: res.longitude
  365. },
  366. success: function(response) {
  367. that.address = response.result.address
  368. console.log('逆地理编码结果:', response);
  369. },
  370. fail: function(error) {
  371. console.error('逆地理编码失败:', error);
  372. }
  373. });
  374. }
  375. })
  376. },
  377. previewImage(urls, current) {
  378. uni.previewImage({
  379. urls: urls, // 需要预览的图片 HTTP 链接列表
  380. current: current // 当前显示图片的链接,不填则默认为 urls 的第一张
  381. });
  382. },
  383. onCommentPageList(){
  384. let that = this
  385. let params ={
  386. houseId:that.id,
  387. pageNo:that.pageNo,
  388. pageSize:that.pageSize
  389. }
  390. commentPageList(params).then(response=>{
  391. console.info('response',response)
  392. response.result.records.forEach(items=>{
  393. if(items.userImage){
  394. items.userImages=items.userImage.split(',')
  395. }
  396. console.info(items.userImages)
  397. // items.userImages=items.userImage.split(',')
  398. })
  399. that.rateList = that.rateList.concat(response.result.records)
  400. }).catch(error=>{
  401. })
  402. },
  403. onSubmit(){
  404. let that = this
  405. if(that.userValue&&that.rate){
  406. let params={
  407. title:that.detail.title,
  408. num:that.rate,
  409. homeId:that.detail.id,
  410. userId:uni.getStorageSync('userInfo').id,
  411. userHead:uni.getStorageSync('userInfo').headImage,
  412. userName:uni.getStorageSync('userInfo').nickName,
  413. userValue: that.userValue,
  414. userImage:that.userImages.map(item => item.url).join(','),
  415. }
  416. saveComment(params).then(response=>{
  417. that.show = false
  418. that.pageNo=1
  419. that.rate = 0
  420. that.userImages = []
  421. that.userValue =''
  422. that.rateList=[]
  423. that.onCommentPageList()
  424. }).catch(error=>{
  425. })
  426. }else{
  427. return uni.showToast({
  428. icon:"none",
  429. title:"评分和内容不能为空!"
  430. })
  431. }
  432. },
  433. deleteImagePic(event) {
  434. this.userImages.splice(event.index, 1)
  435. },
  436. async afterImageRead(e) {
  437. let self = this
  438. e.file.forEach(file => {
  439. self.$Oss.ossUpload(file.url).then(url => {
  440. self.userImages.push({
  441. url
  442. })
  443. })
  444. })
  445. },
  446. onHouseDetail(){
  447. let that = this
  448. houseDetail({houseId:that.id}).then(response=>{
  449. let items = response.result
  450. console.info('response',response.result)
  451. if(items.homeMp4){
  452. that.list.push({
  453. url: items.homeMp4,
  454. type: 'video'
  455. })
  456. }
  457. if(items.image){
  458. console.info('items.image.split()',items.image.split(','))
  459. items.image.split(',').forEach(item=>{
  460. that.list.push({
  461. url: item,
  462. type: 'image'
  463. })
  464. })
  465. }
  466. if(items.homeImage){
  467. items.homeImages=[]
  468. items.homeImage.split(',').forEach(item=>{
  469. items.homeImages.push(item)
  470. })
  471. }else{
  472. items.homeImages=[]
  473. }
  474. that.detail = items
  475. }).catch(error=>{
  476. })
  477. }
  478. }
  479. }
  480. </script>
  481. <style>
  482. .default-btn{
  483. background-color: transparent;
  484. }
  485. .default-btn::after{
  486. content: "";
  487. border: none;
  488. }
  489. page{
  490. background-color: #f5f5f5;
  491. }
  492. .line-green {
  493. width: 8rpx;
  494. height: 32rpx;
  495. background: #20CD7D;
  496. border-radius: 4rpx;
  497. }
  498. .bgc-active-lg{
  499. background-color: #F1FFF9;
  500. }
  501. .content-box{
  502. position: fixed;
  503. bottom: 0;
  504. height: 120rpx;
  505. background: #fff;
  506. width: 100%;
  507. padding: 20rpx 0rpx;
  508. border-top: 1px solid #ddd;
  509. }
  510. </style>