当前位置: 首页 > news >正文

基于springboot的房屋租赁系统

博主主页:猫头鹰源码

博主简介:Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万+、专注Java技术领域和毕业设计项目实战

主要内容:毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询

文末联系获取

项目介绍:

该系统基于springboot技术,数据层为MyBatis,mysql数据库,具有完整的业务逻辑,适合选题:房屋租赁、房屋、酒店、民宿等。

项目功能: 

系统主要角色为租客和管理员用户两种角色。租客登录系统首页后就能看到推荐的房屋,同时也可以按照城市和房屋类型等条件查询房屋。租客可以查看房屋详细信息,如租金、房产证号、房间面积等,另外还可以查看房屋图片和地理位置。在查看房屋详细信息时,租客还可以收藏这个房屋,也可以直接预定。租客可以查看收藏的房屋和已经租赁的房屋,查看合同信息,申请退租。管理员用户主要功能权限是对其他实体的管理,包括对房屋的上架、下架、审核等,对租客账号的启用和冻结,对新闻的管理,对合同的管理。租客用户和管理员用户都有对自己信息的管理权限。

1.租客用户功能需求描述:

租客用户功能包括:注册、登录、租房、查看新闻、个人信息管理、反馈,下面是本文分别详细对租客用户各个功能需求进行描述。

(1)注册:进入到首页的游客只能查看相关信息,不能执行具体的操作,只有通过在系统注册页面中填写账号密码等相关信息注册成为租客用户后才能执行租房、收藏等具体操作。

(2)登录:租客用户使用自己的账号密码登录到系统中,系统会对账号密码进行判断,若用户输入的账号密码不正确,则返回给用户一条提示信息。登录成功后,系统会根据用户的身份展示租客用户的功能权限。

(3)租房:用户在页面中通过组合条件查询房屋信息,搜索出未出租的房屋列表。用户在查看房屋详细信息后可以预定这个房子,完成支付后,将会生成一条合同信息,用户可以查看自己租赁的房屋。 用户在查看房屋详细信息后还可以选择收藏这条房屋信息,收藏的房屋将会被记录下来,用户可以在自己的收藏中看到。

(4)查看新闻:租客可以在首页看到管理员发布的一些新闻资讯,在系统首页通过列表的形式展示出全部新闻,租客可以通过点击某条新闻的标题进入到新闻详情页面,新闻详情页面展示了新闻的详细信息和新闻的发布时间。

(5)个人信息管理:个人信息管理中显示当前用户的详细信息,如:姓名、手机号、性别等,租客可以在这部分修改自己的密码和相关信息,修改密码时,用户需要输入原密码进行验证,通过验证后才能成功修改密码。

(6)反馈:系统为用户提供了反馈功能,当租客用户发现了系统的一些问题时,租客可以给管理员发送一些反馈信息,用户可以查看到自己的反馈信息的状态,管理员可以在后台看到反馈信息并进行处理。

2.管理员功能需求描述:

管理员用户功能包括:用户管理、房屋管理、新闻管理、反馈管理和订单管理,下面本文分别详细对租客用户各个功能需求进行描述如下。

(1)用户管理:管理员可以在这部分查看到本系统所有的租客用户和对应的详细信息,包括用户名,联系方式和状态。管理员可以对用户进行冻结操作,被冻结的用户就不能再登录本系统,当然管理员也可以再次启用这个用户。

(2)房屋管理:管理员可以在这部分查看所有的房屋和其对应信息,房屋信息包括房屋图片、房屋地址、房屋名称等。管理员可以下架某一个房屋,也可以对房屋信息进行编辑和删除操作,管理员还可以在这部分发布新的房屋。

(3)新闻管理:与房屋管理类似,管理员可以在新闻管理中查看所有的新闻信息,还可以修改新闻信息,可以删除新闻,也可以发布新闻。管理员新发布的新闻会展示在首页,被管理员删除的新闻就不会再展示出来。

(4)反馈管理:管理员在这部分查看租客用户提交的反馈信息,管理员可以对反馈进行回复,被回复后的反馈信息的状态会发生变化,提交这条反馈的用户也可以查看到管理员的回复。管理员还可以删除已经处理过的反馈信息。

(5)订单管理:管理员可以查看全部用户的租房订单信息,包括已取消的订单,待付款的订单和退款申请中的订单,管理员可以同意用户的退款申请,也可以拒绝用户的退款申请。

系统包含技术:

后端:springBoot、mybatis-plus
前端:bootstrap、js、css等
开发工具:idea
数据库:mysql 5.7
JDK版本:jdk1.8

部分截图说明:

下面是首页,展示最新的房屋信息

可以对房屋根据是否整租,价格,面积进行筛选

 

查看房屋详情,具有地图展示位置,可以收藏,预定

 预定后打印合同

然后支付房费,成功后我的家就有信息了

 下面是我的收藏

 我的反馈

个人信息管理

 

管理员可以对用户管理

 

对房屋进行上架,下架,编辑等操作

 

部分代码: 

配置拦截器等

 /**
     * @CreatedBy: mty
     * @Date: 2021-08-27
     * @Content: 配置静态资源
    */
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/**").addResourceLocations("classpath:/static/");
        registry.addResourceHandler("/uploads/**").addResourceLocations("file:///"+Constant.UPLOADS_PATH);
    }

    /**
     * @CreatedBy: mty
     * @Date: 2021-08-27
     * @Content: 配置jsp的访问前后缀
    */
    @Bean
    public InternalResourceViewResolver setViewViewResolver(){
        InternalResourceViewResolver resolver = new InternalResourceViewResolver();
        resolver.setPrefix("/jsp/");
        resolver.setSuffix(".jsp");
        return resolver;
    }


    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new CustomerInterceptor())
                .addPathPatterns("/admin/order")
                .addPathPatterns("/admin/profile")
                .addPathPatterns("/admin/mark")
                .addPathPatterns("/admin/feedback")
                .addPathPatterns("/admin/home")
                .addPathPatterns("/admin/password");
        registry.addInterceptor(new OwnerInterceptor())
                .addPathPatterns("/admin/house");
        registry.addInterceptor(new AdminInterceptor())
                .addPathPatterns("/admin/news")
                .addPathPatterns("/admin/user");
    }

文件上传

 /**
     * @CreatedBy: mty
     * @Date: 2021-08-30
     * @Content: 图片入口
    */
    public static Map<String, String> uploadToFile(MultipartFile file) throws Exception {
        Map<String, String> map = new HashMap<>();
        File path = new File(Constant.UPLOADS_PATH);
        if (!path.exists()){
            if (!path.mkdirs()){
                throw new Exception("文件上传失败,无法创建文件夹");
            }
        }
        //原始文件名
        String originalFilename = file.getOriginalFilename();
        //后缀 jpg
        String fileSuffix = originalFilename.substring(originalFilename.lastIndexOf(".") + 1);
        //新文件名
        String nameWithoutSuffix = UUID.randomUUID().toString().replaceAll("-","");
        //带后缀的新文件名
        String newFileName = nameWithoutSuffix + "." + fileSuffix;
        //上传
        File descFile = new File(path.getAbsolutePath(),newFileName);
        file.transferTo(descFile);
        //映射路径
        String filePath = Constant.UPLOADS_ABSOLUTE_PATH + newFileName;
        map.put("fileName",originalFilename);
        map.put("filePath",filePath);
        map.put("fileSuffix",fileSuffix);
        return map;
    }

反馈操作代码

@RequestMapping("/admin/feedback")
    public String adminFeedback(@RequestParam(value = "page",defaultValue = "1")Long pageNumber,
                                @RequestParam(value = "size",defaultValue = "6")Long pageSize,
                                Model model) {
        Page page = PageUtil.initMpgPage(pageNumber, pageSize);
        Feedback feedback = new Feedback();
        if (!loginUserIsAdmin()){
            feedback.setUserId(getLoginUserId());
        }
        Page<Feedback> feedbackServiceAll = this.feedbackService.findAll(page, feedback);
        model.addAttribute("pageInfo",feedbackServiceAll);
        model.addAttribute("tab","feedback-list");
        model.addAttribute("pagePrefix","/admin/feedback?");
        model.addAttribute("isAdmin",loginUserIsAdmin());
        return "admin/feedback-list";
    }

    /**
     * @CreatedBy: mty
     * @Date: 2021-09-09
     * @Content: 提交反馈回复
    */
    @ResponseBody
    @RequestMapping("/admin/feedback/reply/submit")
    public JsonResult replySubmit(Feedback feedback){
        this.feedbackService.update(feedback);
        return JsonResult.success("回复成功");
    }

    /**
     * @CreatedBy: mty
     * @Date: 2021-09-09
     * @Content: 删除反馈
     */
    @ResponseBody
    @RequestMapping("/admin/feedback/delete")
    public JsonResult feedbackDelete(@RequestParam("id")Long id){
        Feedback feedback = this.feedbackService.get(id);
        if (feedback == null){
            return JsonResult.error("反馈不存在");
        }
        if (!loginUserIsAdmin() && !Objects.equals(feedback.getUserId(),getLoginUserId())){
            return JsonResult.error("没有权限");
        }
        this.feedbackService.delete(id);
        return JsonResult.success("删除成功");
    }

以上就是部分功能展示,从整体上来看,本系统功能是十分完整的,界面设计简洁大方,交互友好,数据库设计也很合理,规模适中,代码工整,清晰,适合学习使用。

好了,今天就到这儿吧,小伙伴们点赞、收藏、评论,一键三连走起呀,下期见~~

相关文章:

  • map和sort 集合A-B
  • talcheck-looper(循环代码结构分析工具)
  • 项目经理的工作类型
  • sdut-Collection(Map)-1 读中国载人航天史,汇航天员数量,向航天员致敬
  • 【JVM笔记】加载与存储字节码指令
  • springboot社区再生资源上门回收平台毕业设计-附源码072049
  • React Router v6中的更新
  • xacro搭建ros仿真机器人(待更新)
  • Visual Studio C++ Hello World
  • 线程安全问题和多线程安全经典案例
  • IDEA2020创建JavaWeb项目并配置tomcat
  • Windows下小狼毫输入法(Rime)的安装与配置
  • java 调用C#语言写的dll文件代码 超详细过程
  • Java面试题11-ReentrantLock中的公平锁与非公平锁的底层实现
  • 股票行情查询易语言代码
  • JavaScript-如何实现克隆(clone)函数
  • 时间复杂度分析经典问题——最大子序列和
  • [译]Python中的类属性与实例属性的区别
  • Apache Zeppelin在Apache Trafodion上的可视化
  • express如何解决request entity too large问题
  • Hibernate【inverse和cascade属性】知识要点
  • input的行数自动增减
  • Javascripit类型转换比较那点事儿,双等号(==)
  • JavaScript DOM 10 - 滚动
  • Js实现点击查看全文(类似今日头条、知乎日报效果)
  • Linux gpio口使用方法
  • miaov-React 最佳入门
  • vagrant 添加本地 box 安装 laravel homestead
  • vue总结
  • 初识 beanstalkd
  • 关于 Cirru Editor 存储格式
  • 聊聊sentinel的DegradeSlot
  • 三分钟教你同步 Visual Studio Code 设置
  • 微信开源mars源码分析1—上层samples分析
  • 《码出高效》学习笔记与书中错误记录
  • postgresql行列转换函数
  • TPG领衔财团投资轻奢珠宝品牌APM Monaco
  • ​插件化DPI在商用WIFI中的价值
  • ​直流电和交流电有什么区别为什么这个时候又要变成直流电呢?交流转换到直流(整流器)直流变交流(逆变器)​
  • #162 (Div. 2)
  • #我与Java虚拟机的故事#连载05:Java虚拟机的修炼之道
  • (1/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序
  • (26)4.7 字符函数和字符串函数
  • (C++20) consteval立即函数
  • (floyd+补集) poj 3275
  • (iPhone/iPad开发)在UIWebView中自定义菜单栏
  • (JSP)EL——优化登录界面,获取对象,获取数据
  • (Matalb时序预测)WOA-BP鲸鱼算法优化BP神经网络的多维时序回归预测
  • (论文阅读30/100)Convolutional Pose Machines
  • (四)七种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (转)AS3正则:元子符,元序列,标志,数量表达符
  • (轉貼)《OOD启思录》:61条面向对象设计的经验原则 (OO)
  • .net Application的目录
  • .net core 依赖注入的基本用发
  • .Net Framework 4.x 程序到底运行在哪个 CLR 版本之上