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

news2025/1/12 17:15:48

摘要

在现代城市生活中,房屋租赁市场一直是一个活跃且复杂的领域。随着互联网技术的不断发展,基于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.coloradmin.cn/o/1459506.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【嵌入式学习】QT-Day1-Qt基础

笔记 https://lingjun.life/wiki/EmbeddedNote/20QT 毛玻璃登录界面实现&#xff1a;

模式匹配这么好,Java语法里有吗?

这篇文章我们借助新版Java来理解模式匹配&#xff0c;Rust版的模式匹配稍后就端上来&#xff0c;各位先尝尝Java这杯老咖啡还香不香&#x1f604;。 什么是模式匹配&#xff1f; 下图直观的表达了模式匹配的概念。 所谓模式类似上图中木盒的各种形状的洞洞&#xff0c;我们…

UG NX二次开发(C#)-PMI-获取PMI尺寸数据

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 1、前言2、在UG NX的三维模型中添加PMI尺寸信息3、采用二次开发获取尺寸数据4、测试结果1、前言 PMI(Product and Manufacturing Information)是产品和制造信息的简称,主要用于将产品部件设计的…

工具分享:在线键盘测试工具

在数字化时代&#xff0c;键盘作为我们与计算机交互的重要媒介之一&#xff0c;其性能和稳定性直接影响到我们的工作效率和使用体验。为了确保键盘的每个按键都能正常工作&#xff0c;并帮助用户检测潜在的延迟、连点等问题&#xff0c;一款优质的在线键盘测试工具显得尤为重要…

智能运维乱象有哪些?智能运维业务包括哪些

在实施智能运维过程中可能遇到的乱象及其原因&#xff0c;系统地阐述智能运维业务所涵盖的各个方面&#xff0c;包括但不限于预防性维护、故障检测与诊断、自动化修复以及持续的性能优化等关键组成部分。 实施智能运维过程中可能遇到的乱象及原因包括&#xff1a; 数据不一致或…

Qt|大小端数据转换(补充)

Qt|大小端数据转换-CSDN博客 之前这篇文章大小端数据转换如果是小数就会有问题。 第一个方法&#xff1a; template <typename T> static QByteArray toData(const T &value, bool isLittle) {QByteArray data;for (int i 0; i < sizeof(T); i) {int bitOffset…

小米14 ULTRA:重新定义手机摄影的新篇章

引言 随着科技的飞速发展&#xff0c;智能手机已经不仅仅是一个通讯工具&#xff0c;它更是我们生活中的一位全能伙伴。作为科技领域的佼佼者&#xff0c;小米公司再次引领潮流&#xff0c;推出了全新旗舰手机——小米14 ULTRA。这款手机不仅在性能上进行了全面升级&am…

电脑文件msvcr110.dll缺失的多种解决方法,msvcr110.dll文件修复手段

遭遇"程序无法启动&#xff0c;因为电脑中缺失msvcr110.dll"这样的错误提示&#xff0c;是Windows操作系统用户可能会遇到的一种情况。尽管这种现象在一些用户中较为常见&#xff0c;但解决这一问题并非复杂的过程。本文将深入剖析此问题&#xff0c;并分享一些实用的…

2.16日学习打卡----初学Dubbo(一)

2.16日学习打卡 目录: 2.16日学习打卡一. 什么是分布式&#xff1f;二. 什么是RPC?三. Dubbo概念_简介四. Dubbo核心组件五.Dubbo配置开发环境六. Dubbo配置开发环境_管理控制台 一. 什么是分布式&#xff1f; 可以看我的这篇文章–2.14日学习打卡----初学Zookeeper(一) 二.…

【设计模式】23种设计模式笔记

设计模式分类 模板方法模式 核心就是设计一个部分抽象类。 这个类具有少量具体的方法&#xff0c;和大量抽象的方法&#xff0c;具体的方法是为外界提供服务的点&#xff0c;具体方法中定义了抽象方法的执行序列 装饰器模式 现在有一个对象A&#xff0c;希望A的a方法被修饰 …

Android挖取原图中心区域RectF(并框线标记)放大到ImageView宽高,Kotlin

Android挖取原图中心区域RectF(并框线标记)放大到ImageView宽高&#xff0c;Kotlin 红色线框区域即为选中的原图中心区域&#xff0c;放大后放到等宽高的ImageView里面。 import android.content.Context import android.graphics.Bitmap import android.graphics.BitmapFactor…

Mybatis | 初识Mybatis

初识Mybatis 目录: 初识Mybatis什么是Mybatis&#xff1f;Hibernate 和 MyBatis的区别&#xff1f;Mybatis的下载和使用Mybatis的工作原理 作者简介 &#xff1a;一只大皮卡丘&#xff0c;计算机专业学生&#xff0c;正在努力学习、努力敲代码中! 让我们一起继续努力学习&#…

牛客网 OR141 密码检查

答案&#xff1a; #include <stdio.h> #include <string.h> #include <ctype.h> int main() {int n 0;int count1 0, count2 0, count3 0;scanf("%d", &n);while (n--){char ch[100];scanf("%s", ch);int len strlen(ch);if (…

UE5 C++ UENUM 和 USTRUCT

一.首先在APawn里声明 UENUM 和 USTRUCT。UENUM 有两种定义方式 一种是使用命名空间&#xff1a; 还有是继承uint8&#xff1a; 通过申明class类 别名来替代 USTRUCT的定义 上面的第二种有类似但仍然有很多的差异&#xff1a; 首先要有GENERATED_USTRUCT_BODY()这个函数 并且…

element-ui 自定义表头label(利用 :slot=“header“ slot-scope=“slot“)

<el-table :data"Gbtable" border style"width: 100%"><el-table-column prop" date" label"责任方" align"center" ></el-table-column><el-table-column prop"name" label"柜名"…

图片文字编辑软件app分享5个!

在数字化时代&#xff0c;图片和文字的结合已经成为信息传播的重要形式之一。无论是制作精美的海报、设计独特的社交媒体封面&#xff0c;还是简单地为图片添加一些说明性文字&#xff0c;都离不开专业的图片文字编辑软件。今天&#xff0c;就让我们一起探索那些不可错过的图片…

ai自动证件照片制作的软件?分享3款先进工具!

随着科技的发展&#xff0c;我们的生活变得越来越便捷。尤其在图像处理领域&#xff0c;AI技术的应用更是让许多传统行业焕发出新的活力。其中&#xff0c;AI证件照制作工具就是近年来备受瞩目的创新产品。这些工具利用先进的AI技术&#xff0c;帮助用户在家中就能轻松制作出专…

【git 使用】使用 git rebase -i 修改任意的提交信息/合并多个提交

修改最近一次的提交信息的方法有很多&#xff0c;可以参考这篇文章&#xff0c;但是对于之前的提交信息进行修改只能使用 rebase。 修改提交信息 假设我们想修改下面这个提交信息&#xff0c;想把【登录】改成【退出登录】步骤如下 运行 git rebase -i head~3 打开了一个文本…

open3d 点云体素化

open3d 点云体素化 一、算法原理1.从点云到体素化&#xff08;主要函数&#xff09;2.从网格到体素化&#xff08;主要函数&#xff09; 二、代码三、结果1.从点云到体素化2.从网格到体素化 四、相关数据 一、算法原理 点云和三角网格是非常灵活但不规则的几何类型。体素网格是…

互联网大厂职级和薪资一览表!看看WebGIS能到多少级?

以上薪资来源网络&#xff0c;仅供参考。 我们再来看下这些大厂在招的webgis岗位薪资&#xff1a; 01. 华为职级和薪资水平 02. 华为WebGIS薪资 13-26K&#xff0c;经验不限 勉强能够上13级 03. 腾讯职级与薪资 04. 腾讯WebGIS薪资 13-35K&#xff0c;3-5年工作经验 范围挺…