租房小程序前端代码
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.

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