基于java,springboot和vue房屋租赁租房销售平台设计

摘要

在现代城市生活中,房屋租赁市场一直是一个活跃且复杂的领域。随着互联网技术的不断发展,基于Spring Boot和Vue的房屋租赁系统应运而生,旨在提供一个高效、方便、可靠的在线服务平台。该系统利用了前后端分离架构的优势,后端以Spring Boot为核心实现业务逻辑处理,并与数据库进行交互;前端则采用Vue.js构建动态用户界面。整合了Spring Security和JWT保证了交易的安全性。整个平台的设计注重提供流畅的用户交互体验和强大的房源管理功能,既满足了房东对房产管理的需求,也为租客寻找理想住所提供了便捷途径。

此房屋租赁系统的设计充分考虑了可维护性和扩展性,采用了模块化的开发方法,允许未来根据市场需求快速添加新功能。系统通过使用MySQL等现代数据库技术,保证了数据的稳定性和可靠性。整体而言,这个基于Spring Boot和Vue的房屋租赁系统为房屋的在线租赁提供了一个简洁而全面的解决方案,它不仅能够适应不断变化的市场需求,还能够保证用户体验的连贯性和系统的响应速度,为房东和租客之间搭建起一个值得信赖的桥梁。

主要技术

后端 JAVA语言、SpringBoot框架、maven依赖管理、mysql数据库等;

前端:Vue等。

主要功能

租房网站页可根据条件筛选房源
后台管理页面
用户登录注册功能
普通用户申请成为房东功能
房东用户上传个人房源功能
管理员通过后台页面管理所有用户账号
管理员审核申请房东身份的记录
管理员审核房东上传的房源信息
房源搜索、展示

部分代码展示

<template>
	<div>
		<!-- 搜索部分 -->
		<div>
			<el-input placeholder="请输入要查询用户的账号" v-model="userInfo.account" class="input-with-select">
				<!-- 搜索输入框 -->
				<el-select v-model="userInfo.isOwner" slot="prepend" placeholder="请选择" class="el-select">
					<el-option label="所有用户" value='-1'></el-option>
					<el-option label="普通用户" value='0'></el-option>
					<el-option label="房东用户" value='1'></el-option>
				</el-select>
				<el-button slot="append" icon="el-icon-search" @click='getUserList()'></el-button>
			</el-input>
		</div>
		<!-- 用户列表部分 -->
		<div class="table">
			<el-table :data="userList" border stripe>
				<el-table-column type="index"></el-table-column>
				<el-table-column label="用户账号" prop="account"></el-table-column>
				<el-table-column label="用户密码" prop="password"></el-table-column>
				<el-table-column label="房东权限" prop="owner">
					<!-- 作用域插槽 -->
					<template slot-scope="scope">
						<el-switch v-model="scope.row.owner" @change='changeOwner(scope.row)'></el-switch>
					</template>
				</el-table-column>
				<el-table-column label="操作">
					<template slot-scope="scope">
						<el-button type="primary" icon="el-icon-edit" size="small" @click="editDialogVisible=true,editUserPwd=scope.row.password,editUserAccount=scope.row.account"></el-button>
						<el-button type="danger" icon="el-icon-delete" size="small" @click='deleteUser(scope.row.account)'></el-button>
					</template>
				</el-table-column>
			</el-table>
			
			<!-- 修改密码的对话框 -->
			<el-dialog title="修改用户密码" :visible.sync="editDialogVisible">
				<el-form>
					<el-form-item label="用户账号" :label-width="editWidth">
						<el-input v-model="editUserAccount" disabled></el-input>
					</el-form-item>
					<el-form-item label="用户密码" :label-width="editWidth">
						<el-input v-model="editUserPwd" ></el-input>
					</el-form-item>
				</el-form>
				<div slot="footer" class="dialog-footer">
					<el-button @click="editUserPwd=editUserAccount">重设密码为账号</el-button>
					<el-button @click="editDialogVisible = false">取 消</el-button>
					<el-button type="primary" @click="editPwd(editUserAccount,editUserPwd)">确 定</el-button>
				</div>
			</el-dialog>
		</div>
		<!-- 分页 -->
		<div>
			<el-pagination @size-change="handleSizeChange" @current-change="handleCurrentChange" :current-page="1" :page-size="userInfo.pageSize"
			 layout="total, prev, pager, next, jumper" :total="userCounts" style="padding-left: 30%;">
			</el-pagination>
		</div>
	</div>
</template>

<script>
	export default {

		created() {
			this.getUserList();
		},

		data() {
			return {
				//查询功能所需要的数据
				userInfo: {
					isOwner: '-1',
					account: '',
					pageStart: 1,
					pageSize: 8,
				},
				userList: [], //用户列表
				userCounts: 0, //总记录数
				editUserAccount:'',//存储要修改密码的账号
				editUserPwd: '', //存储修改用户的新密码
				editDialogVisible: false, // 显示/隐藏修改窗口flag
				editWidth:'100px',
			}
		},
		methods: {
			//获取所有用户
			async getUserList() {
				//console.log(this.userInfo.pageSize);
				const {
					data: res
				} = await this.$http.get("/api/getuser", {
					params: this.userInfo
				});
				this.userList = res.userList;
				this.userCounts = res.userCounts;
				//console.log(123);
			},
			//修改用户房东权限
			async changeOwner(currentLine) {
				var formData = new FormData();
				formData.append('account', currentLine.account);
				
				//查找当前用户是否已经进行过申请
				const {data:res0} = await this.$http.put("/api/findOAByac",formData);
				if(res0.toString() == "false"){
					currentLine.account = !currentLine.account;
					this.$message.error("该用户没有提交申请信息,无法设置为房东!");
					this.getUserList();
					return;
				}
				
				//修改申请记录为已经通过
				this.$http.put("/api/updateOARecord",formData);
				
				const {
					data: res
				} = await this.$http.put('/api/updateuserowner', formData);
				if (res != "success") {
					currentLine.account = !currentLine.account;
					return this.$message.error("修改权限失败!")
				}
				this.$message.success("修改权限成功!");
			},
			//页面长度
			handleSizeChange(newSize) {
				this.userInfo.pageSize = newSize;
				this.getUserList();
			},
			//分页获取指定页面
			handleCurrentChange(newPage) {
				this.userInfo.pageStart = newPage;
				this.getUserList();
			},
			//删除用户操作
			async deleteUser(account) {
				const confirRes = await this.$confirm('确认删除该用户?删除后不可恢复', '提示', {
					confirmButtonText: '确定',
					cancelButtonText: '取消',
					type: 'warning'
				}).catch(err => err)
				if (confirRes != 'confirm') {
					//取消
					return this.$message.info("已取消")
				}
				
				//删除该用户的所有记录
				let formData = new FormData();
				formData.append('account', account);
				const {
					data: searchRes
				} = await this.$http.put('/api/submitApply', formData);
				if(searchRes != "false"){
					this.$http.delete("/api/deleteRecordByaccount?account="+account);
				}
				
				
				//删除该用户
				const {
					data: res
				} = await this.$http.delete("/api/deleteuser?account=" + account);
				if (res != "success") {
					return this.$message.error("删除失败!");
				}
				this.$message.success("删除成功!");
				this.getUserList();
			},
			
			//修改用户密码
			async editPwd(account,pwd) {
				if(pwd==''){
					this.$message.error("密码不能为空,请重新设置");
					return false;
				}
				var formData = new FormData();
				formData.append('account',account);
				formData.append('password',pwd);
				const {data:res} = await this.$http.put("/api/edituser",formData);
				if(res != "success"){
					return this.$message.error("密码修改失败")
				}
				this.$message.success("密码修改成功!");
				this.getUserList();
				this.editDialogVisible = false;
			}
		}
	}
</script>

演示视频

基于SpringBoot和Vue房屋租赁租房系统设计

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/399434.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

护眼台灯哪个品牌质量比较好?五大热门产品点评

护眼台灯作为孩子书桌上的照明神器&#xff0c;因为能起到护眼作用和很好的照明体验&#xff0c;得到了不少的认可。不过如今市场中也有很多劣质台灯&#xff0c;存在各种不足、做工差、选材廉价&#xff0c;导致光线无法起到护眼作用&#xff0c;甚至会引起近视。那么护眼台灯…

说一下 JVM 有哪些垃圾回收算法?

一、标记-清除算法 标记无用对象&#xff0c;然后进行清除回收。 标记-清除算法&#xff08;Mark-Sweep&#xff09;是一种常见的基础垃圾收集算法&#xff0c;它将垃圾收集分为两个阶段&#xff1a; 标记阶段&#xff1a;标记出可以回收的对象。清除阶段&#xff1a;回收被标…

Flutter插件开发指南02: 事件订阅 EventChannel

Flutter插件开发指南02: 事件订阅 EventChannel 视频 https://www.bilibili.com/video/BV1zj411d7k4/ 前言 上一节我们讲了 Channel 通道&#xff0c;但是如果你是卫星定位业务&#xff0c;原生端主动推消息给 Flutter 这时候就要用到 EventChannel 通道了。 本节会写一个 1~…

Fiddler工具 — 18.Fiddler抓包HTTPS请求(一)

1、Fiddler抓取HTTPS过程 第一步&#xff1a;Fiddler截获客户端发送给服务器的HTTPS请求&#xff0c;Fiddler伪装成客户端向服务器发送请求进行握手 。 第二步&#xff1a;服务器发回相应&#xff0c;Fiddler获取到服务器的CA证书&#xff0c; 用根证书&#xff08;这里的根证…

redis的搭建 RabbitMq搭建

官网 Download | Redis wget https://github.com/redis/redis/archive/7.2.4.tar.gz 编译安装 yum install gcc g tar -zxvf redis-7.2.4.tar.gz -C /usr/localcd /usr/local/redis make && make install 常见报错 zmalloc.h:50:10: fatal error: jemalloc/jemal…

创作无版权素材:解放创意的利器

title: 创作无版权素材&#xff1a;解放创意的利器 date: 2024/2/21 13:52:09 updated: 2024/2/21 13:52:09 tags: 无版权创作自由法律合规节省成本提升质量多样素材创意工具 在当今数字化时代&#xff0c;内容创作成为了一种非常重要的方式来传达信息和表达创意。 然而&#…

07 Redis之持久化(RDB+AOF)

4 Redis持久化 Redis 是一个内存数据库&#xff0c;然而内存中的数据是不持久的&#xff0c;若主机宕机或 Redis 关机重启&#xff0c;则内存中的数据全部丢失。 当然&#xff0c;这是不允许的。Redis 具有持久化功能&#xff0c;其会按照设置以快照或操作日志的形式将数据持…

电脑开机蓝屏错误代码c000021a怎么办 电脑蓝屏报错c000021a的解决办法

很多小伙伴在电脑开机的时候出现蓝屏代码c000021a都不知道该怎么去解决&#xff0c;所以今天就给你们带来了c000021a蓝屏解救方法&#xff0c;如果你还没解决的话就快来看看吧。 解决办法&#xff1a; 原因&#xff1a; c000021a蓝屏的原因有很多&#xff0c;主要有以下几种…

office 2021安装教程(官方自动批量激活,无付费)

全程不需要第三方软件&#xff0c;所有用到的工具都是微软官方的&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 基于KMS的 GVLK&#xff1a;https://learn.microsoft.com/zh-cn/deployoffice/vlactivation/gvlks 首先我们需要去下载 office 软件部署工具&a…

开发模式:分支开发主干发布

基于分支开发 该操作必须基于某稳定代码版本&#xff0c;来支持新的feature和bugfix、improvement。 分支命名规则 建议以版本号前三位命名分支&#xff08;1.0.1.12&#xff09; 备注填写分支简介&#xff0c;如&#xff1a;feature *** or ****** 关于提测准入及发布上线…

华清远见作业第三十九天——Qt(第一天)

思维导图&#xff1a; 登录界面&#xff1a; 代码&#xff1a; #include "mainwindow.h" #include<QToolBar> #include<QPushButton> MainWindow::MainWindow(QWidget *parent): QMainWindow(parent) {this->resize(600,400);this->setFixedSize…

PMP考试难度怎么样?

PMP考试整体难度并不大&#xff0c;因为目前的考试题型都是选择题&#xff0c;所以通过率相对较高。然而&#xff0c;新考纲中增加了更多关于敏捷方法的题型&#xff0c;这些题目相对更加变化多样&#xff0c;也有不少考生觉得难以抉择&#xff0c;四个选项都似乎都是正确的。P…

Python学习-列表1

十二、列表1 1、创建列表及基本运算 1&#xff09;使用中括号&#xff0c;将所有准备放入列表中的元素&#xff0c;包裹起来&#xff0c;不同元素之间使用逗号分隔。 举例&#xff1a; [1,2,3,4,5]2&#xff09;列表可以容纳不同类型的数据。 举例&#xff1a; [1,2,3,4,5,…

SmartForms笔记

目录 表Table表体区域脚标效果展示 带自增编号的结构新建循环设置变量的位置运行结果 表Table 右击“创建”—“表”&#xff1a; 绘制布局如下所示&#xff1a; 选择第一行&#xff0c;选择成“%LTYPE1”&#xff1a; 选择第二行&#xff0c;选择成“%LTYPE2”&#xff0c…

适用于高云FPGA的JTAG

目标板卡&#xff1a;小梅哥芯海无涯GOWIN高云ACG525(GW5A-LV25UG324) 1.软件要求&#xff1a;必须用商业版&#xff0c;因为教育版(V1.9.9Beta-4 Education)不支持此封装的GW5A。商业版需要上网申请License&#xff0c;此处提供D4D853392AD8.lic文件&#xff08;此方法为临时…

《MySQL MVCC 》

什么是 MySQL InnoDB 的 MVCC&#xff1f; MVCC (Multi-Version Concurrency Control)是一种基于多版本的并发控制协议&#xff0c;只有在 InnoDB 引擎下存在。MVCC 是为了实现事务的隔离性&#xff0c;即通过版本号&#xff0c;避免同一数据在不同事务间的竞争&#xff0c;可…

Job 和 DaemonSet

一、Job 1、Job 背景问题 K8s 里&#xff0c;最小的调度单元是 Pod&#xff0c;如果直接通过 Pod 来运行任务进程&#xff0c;会产生以下几种问题&#xff1a; ① 如何保证 Pod 内进程正确的结束&#xff1f; ② 如何保证进程运行失败后重试&#xff1f; ③ 如何管理多个任…

python在flask中的请求数据“无限流”

文章目录 一、问题描述二、解决方案 一、问题描述 在flask请求中&#xff0c;有个需求是让调用方一直调接口&#xff0c;并立马返回&#xff0c;而接口方缓存请求&#xff0c;依次执行。 二、解决方案 from flask import Flask, request, jsonify from queue import Queue i…

vue实现列表自动无缝滚动列表

大家好&#xff0c;今天给大家分享的知识是vue基于vue-seamless-scroll实现自动无缝滚动列表 一、实现自动滚动 最近在开发过程中遇到一个问题&#xff0c;就是需要实现自动滚动列表&#xff0c;效果图如下 就是这样一个列表在自动循环展示。在这里我是运用的 vue-seamless-sc…

数据结构——链表OJ题

目录 1.给你一个链表的头节点 head 和一个整数 val &#xff0c;请你删除链表中所有满足 Node.val val 的节点&#xff0c;并返回 新的头节点 。 2.给定一个带有头结点 head 的非空单链表&#xff0c;返回链表的中间结点。如果有两个中间结点&#xff0c;则返回第二个中间结点…
最新文章