Full Code of saysky/manland for AI

master f536d218d785 cached
222 files
2.2 MB
578.7k tokens
616 symbols
1 requests
Download .txt
Showing preview only (2,346K chars total). Download the full file or copy to clipboard to get everything.
Repository: saysky/manland
Branch: master
Commit: f536d218d785
Files: 222
Total size: 2.2 MB

Directory structure:
gitextract_uyewi9iz/

├── .gitattributes
├── .gitignore
├── README.md
├── pom.xml
└── src/
    └── main/
        ├── java/
        │   └── com/
        │       └── example/
        │           └── sens/
        │               ├── Application.java
        │               ├── common/
        │               │   ├── base/
        │               │   │   ├── BaseEntity.java
        │               │   │   └── BaseService.java
        │               │   └── constant/
        │               │       └── CommonConstant.java
        │               ├── config/
        │               │   ├── MvcConfig.java
        │               │   ├── mybatisplus/
        │               │   │   └── MybatisPlusConfig.java
        │               │   ├── properties/
        │               │   │   └── IgnoredUrlsProperties.java
        │               │   ├── schedule/
        │               │   │   └── SystemSchedule.java
        │               │   └── shiro/
        │               │       ├── MyRealm.java
        │               │       ├── ShiroConfig.java
        │               │       └── URLPathMatchingFilter.java
        │               ├── controller/
        │               │   ├── admin/
        │               │   │   ├── AdminController.java
        │               │   │   ├── AttachmentController.java
        │               │   │   ├── CategoryController.java
        │               │   │   ├── NoticeController.java
        │               │   │   ├── OrderController.java
        │               │   │   ├── PermissionController.java
        │               │   │   ├── PostController.java
        │               │   │   ├── ProfileController.java
        │               │   │   ├── RechargeRecordController.java
        │               │   │   ├── RoleController.java
        │               │   │   └── UserController.java
        │               │   ├── common/
        │               │   │   ├── BaseController.java
        │               │   │   └── CommonController.java
        │               │   └── home/
        │               │       ├── FrontPostController.java
        │               │       ├── IndexController.java
        │               │       └── LoginController.java
        │               ├── dto/
        │               │   ├── JsonResult.java
        │               │   ├── PostQueryCondition.java
        │               │   └── QueryCondition.java
        │               ├── entity/
        │               │   ├── Category.java
        │               │   ├── City.java
        │               │   ├── Notice.java
        │               │   ├── Order.java
        │               │   ├── Permission.java
        │               │   ├── Post.java
        │               │   ├── RechargeRecord.java
        │               │   ├── Role.java
        │               │   ├── RolePermissionRef.java
        │               │   ├── User.java
        │               │   └── UserRoleRef.java
        │               ├── enums/
        │               │   ├── CommonParamsEnum.java
        │               │   ├── OrderStatusEnum.java
        │               │   ├── PostIsRecommendEnum.java
        │               │   ├── PostIsStickyEnum.java
        │               │   ├── PostStatusEnum.java
        │               │   ├── PostTypeEnum.java
        │               │   ├── ResourceTypeEnum.java
        │               │   ├── ResultCodeEnum.java
        │               │   ├── RoleEnum.java
        │               │   ├── TrueFalseEnum.java
        │               │   └── UserStatusEnum.java
        │               ├── exception/
        │               │   ├── GlobalExceptionHandler.java
        │               │   └── MyBusinessException.java
        │               ├── mapper/
        │               │   ├── CategoryMapper.java
        │               │   ├── CityMapper.java
        │               │   ├── NoticeMapper.java
        │               │   ├── OrderMapper.java
        │               │   ├── PermissionMapper.java
        │               │   ├── PostMapper.java
        │               │   ├── RechargeRecordMapper.java
        │               │   ├── RoleMapper.java
        │               │   ├── RolePermissionRefMapper.java
        │               │   ├── UserMapper.java
        │               │   └── UserRoleRefMapper.java
        │               ├── service/
        │               │   ├── CategoryService.java
        │               │   ├── CityService.java
        │               │   ├── MailService.java
        │               │   ├── NoticeService.java
        │               │   ├── OrderService.java
        │               │   ├── PermissionService.java
        │               │   ├── PostService.java
        │               │   ├── RechargeRecordService.java
        │               │   ├── RolePermissionRefService.java
        │               │   ├── RoleService.java
        │               │   ├── UserRoleRefService.java
        │               │   ├── UserService.java
        │               │   └── impl/
        │               │       ├── CategoryServiceImpl.java
        │               │       ├── CityServiceImpl.java
        │               │       ├── MailServiceImpl.java
        │               │       ├── NoticeServiceImpl.java
        │               │       ├── OrderServiceImpl.java
        │               │       ├── PermissionServiceImpl.java
        │               │       ├── PostServiceImpl.java
        │               │       ├── RechargeRecordServiceImpl.java
        │               │       ├── RolePermissionRefServiceImpl.java
        │               │       ├── RoleServiceImpl.java
        │               │       ├── UserRoleRefServiceImpl.java
        │               │       └── UserServiceImpl.java
        │               ├── util/
        │               │   ├── DateUtil.java
        │               │   ├── FileUtil.java
        │               │   ├── IpInfoUtil.java
        │               │   ├── Md5Util.java
        │               │   ├── ObjectUtil.java
        │               │   ├── PageUtil.java
        │               │   ├── PermissionUtil.java
        │               │   ├── RegexUtil.java
        │               │   ├── RelativeDateFormat.java
        │               │   ├── Response.java
        │               │   ├── SensUtils.java
        │               │   ├── SpringUtil.java
        │               │   └── ThreadPoolUtil.java
        │               └── vo/
        │                   ├── PageVo.java
        │                   └── SearchVo.java
        └── resources/
            ├── application.yaml
            ├── mapper/
            │   ├── CategoryMapper.xml
            │   ├── CityMapper.xml
            │   ├── OrderMapper.xml
            │   ├── PermissionMapper.xml
            │   ├── PostMapper.xml
            │   ├── RechargeRecordMapper.xml
            │   ├── RoleMapper.xml
            │   ├── RolePermissionRefMapper.xml
            │   ├── UserMapper.xml
            │   └── UserRoleRefMapper.xml
            ├── static/
            │   ├── css/
            │   │   ├── AdminLTE.css
            │   │   ├── alt/
            │   │   │   ├── AdminLTE-bootstrap-social.css
            │   │   │   ├── AdminLTE-select2.css
            │   │   │   └── AdminLTE-without-plugins.css
            │   │   ├── loader.css
            │   │   ├── pay.css
            │   │   ├── skins/
            │   │   │   └── _all-skins.css
            │   │   └── style.css
            │   ├── front/
            │   │   ├── css/
            │   │   │   ├── pay.css
            │   │   │   └── style.css
            │   │   ├── js/
            │   │   │   ├── contact_me.js
            │   │   │   ├── custom.js
            │   │   │   └── jqBootstrapValidation.js
            │   │   └── vendor/
            │   │       └── select2/
            │   │           └── css/
            │   │               └── select2-bootstrap.css
            │   ├── js/
            │   │   ├── adminlte.js
            │   │   └── app.js
            │   └── plugins/
            │       ├── bootstrap/
            │       │   ├── css/
            │       │   │   ├── bootstrap-theme.css
            │       │   │   └── bootstrap.css
            │       │   └── js/
            │       │       ├── bootstrap.js
            │       │       └── npm.js
            │       ├── bootstrapStyle/
            │       │   └── bootstrapStyle.css
            │       ├── bootstrapvalidator/
            │       │   ├── css/
            │       │   │   └── bootstrapValidator.css
            │       │   └── js/
            │       │       ├── bootstrapValidator.js
            │       │       └── language/
            │       │           └── zh_CN.js
            │       ├── font-awesome/
            │       │   ├── css/
            │       │   │   └── font-awesome.css
            │       │   └── fonts/
            │       │       └── FontAwesome.otf
            │       ├── froala-editor/
            │       │   ├── css/
            │       │   │   ├── froala_editor.css
            │       │   │   ├── froala_editor.pkgd.css
            │       │   │   ├── froala_style.css
            │       │   │   ├── plugins/
            │       │   │   │   ├── char_counter.css
            │       │   │   │   ├── code_view.css
            │       │   │   │   ├── colors.css
            │       │   │   │   ├── draggable.css
            │       │   │   │   ├── emoticons.css
            │       │   │   │   ├── file.css
            │       │   │   │   ├── fullscreen.css
            │       │   │   │   ├── help.css
            │       │   │   │   ├── image.css
            │       │   │   │   ├── image_manager.css
            │       │   │   │   ├── line_breaker.css
            │       │   │   │   ├── quick_insert.css
            │       │   │   │   ├── special_characters.css
            │       │   │   │   ├── table.css
            │       │   │   │   └── video.css
            │       │   │   ├── themes/
            │       │   │   │   ├── dark.css
            │       │   │   │   ├── gray.css
            │       │   │   │   ├── red.css
            │       │   │   │   └── royal.css
            │       │   │   └── third_party/
            │       │   │       ├── embedly.css
            │       │   │       ├── font_awesome.css
            │       │   │       ├── image_tui.css
            │       │   │       └── spell_checker.css
            │       │   └── js/
            │       │       └── languages/
            │       │           ├── ar.js
            │       │           ├── bs.js
            │       │           ├── cs.js
            │       │           ├── da.js
            │       │           ├── de.js
            │       │           ├── el.js
            │       │           ├── en_ca.js
            │       │           ├── en_gb.js
            │       │           ├── es.js
            │       │           ├── et.js
            │       │           ├── fa.js
            │       │           ├── fi.js
            │       │           ├── fr.js
            │       │           ├── he.js
            │       │           ├── hr.js
            │       │           ├── hu.js
            │       │           ├── id.js
            │       │           ├── it.js
            │       │           ├── ja.js
            │       │           ├── ko.js
            │       │           ├── ku.js
            │       │           ├── me.js
            │       │           ├── nb.js
            │       │           ├── nl.js
            │       │           ├── pl.js
            │       │           ├── pt_br.js
            │       │           ├── pt_pt.js
            │       │           ├── ro.js
            │       │           ├── ru.js
            │       │           ├── sk.js
            │       │           ├── sr.js
            │       │           ├── sv.js
            │       │           ├── th.js
            │       │           ├── tr.js
            │       │           ├── uk.js
            │       │           ├── vi.js
            │       │           ├── zh_cn.js
            │       │           └── zh_tw.js
            │       ├── highlight/
            │       │   ├── highlight.css
            │       │   └── highlight.js
            │       ├── layer/
            │       │   ├── layer.js
            │       │   ├── mobile/
            │       │   │   ├── layer.js
            │       │   │   └── need/
            │       │   │       └── layer.css
            │       │   └── theme/
            │       │       └── default/
            │       │           └── layer.css
            │       ├── lazyload/
            │       │   └── jquery.lazyload.js
            │       ├── loaders/
            │       │   └── loaders.css
            │       ├── pace/
            │       │   ├── pace.css
            │       │   └── pace.js
            │       ├── pjax/
            │       │   └── jquery.pjax.js
            │       └── pretty-checkbox/
            │           └── pretty-checkbox.css
            └── 需要前端代码联系博主.txt

================================================
FILE CONTENTS
================================================

================================================
FILE: .gitattributes
================================================
*.js linguist-language=Java
*.css linguist-language=Java
*.html linguist-language=Java




================================================
FILE: .gitignore
================================================
target/
logs/
out/
!.mvn/wrapper/maven-wrapper.jar
### STS ###
.apt_generated
.classpath
.factorypath
.project
.settings
.springBeans
.sts4-cache
### IntelliJ IDEA ###
.idea
*.iws
*.iml
*.ipr
log/
### NetBeans ###
nbproject/private/
build/
nbbuild/
dist/
nbdist/
.nb-gradle/
### Mac
.DS_Store
*/.DS_Store
### VS Code ###
*.project
*.factorypath

### 屏蔽,需要完整代码联系博主:微信847064370
*.html
templates/
webapp/
*.sql



================================================
FILE: README.md
================================================
最新消息,博主已开通B站账号:[Java刘哥](https://space.bilibili.com/160340478)
<hr/> 



# 租房系统
基于SpringBoot实现的租房系统,包括三种角色:管理员、房东、租客。
- 详细介绍:[https://liuyanzhao.com/shop/manland.html](https://liuyanzhao.com/shop/manland.html) <br/>
- 预览地址:[http://manland.liuyanzhao.com](http://manland.liuyanzhao.com)  <br/> <br/>


## 博主开发的其他租房或房屋交易项目全部在这里 <br/>
[https://liuyanzhao.com/shop.html?k=房屋](https://liuyanzhao.com/shop.html?k=房屋)
- [基于SpringBoot+Vue房屋租赁系统 租房 Verio的Vue版本](https://liuyanzhao.com/shop/verio-vue.html)
- [基于SpringBoot的房屋租赁平台 房屋展示平台 留学生房屋租赁平台](https://liuyanzhao.com/shop/housekey.html)
- [基于SpringBoot/SSM的最新最轻量级最漂亮的的二手房屋交易系统RentUP](https://liuyanzhao.com/shop/rentup.html)
- [基于SpringBoot/SSM的房屋租赁系统租房系统Rello](https://liuyanzhao.com/shop/rello.html)
- [基于SpringBoot/SSM房屋租赁系统 verio3.0/协同过滤,房屋合租系统 租房系统](https://liuyanzhao.com/shop/verio.html)
- [基于SpringBoot房屋租赁系统manland4.0](https://liuyanzhao.com/shop/manland.html)

  
# 功能介绍
#### 管理员功能:
- 房屋管理
- 租房类型管理(合租/整租)
- 房屋管理
- 订单管理
- 新闻公告管理
- 收支明细
- 用户管理
- 角色管理、权限管理

#### 房东功能
- 房屋管理
- 订单管理:取消订单、审核退租、查看合同、下载打印合同
- 收支明细
- 个人信息修改、账号密码修改

## 租客功能
订单管理:创建订单、确认合同、支付订单、取消订单、退租、电子合同查看、下载打印合同
收支明细
个人信息修改、账号密码修改



## 技术组成
- SpringBoot
- MyBatis
- Shiro
- Thymeleaf
- Bootstrap + jQuery
- MySQL
- Maven


## 预览
1-首页1.png
![1-首页1.png](img/1-首页1.png)
2-首页2.png
![2-首页2.png](img/2-首页2.png)
3-房屋列表1.png
![3-房屋列表1.png](img/3-房屋列表1.png)
4-房屋列表2.png
![4-房屋列表2.png](img/4-房屋列表2.png)
5-房屋详情1.png
![5-房屋详情1.png](img/5-房屋详情1.png)
6-房屋详情2.png
![6-房屋详情2.png](img/6-房屋详情2.png)
7-新闻公告列表.png
![7-新闻公告列表.png](img/7-新闻公告列表.png)
8-新闻公告详情.png
![8-新闻公告详情.png](img/8-新闻公告详情.png)
10-注册页面.png
![10-注册页面.png](img/10-注册页面.png)
10-登录页面.png
![10-登录页面.png](img/10-登录页面.png)
11-点击预定.png
![11-点击预定.png](img/11-点击预定.png)
12-签订合同页面.png
![12-签订合同页面.png](img/12-签订合同页面.png)
13-支付订单页面.png
![13-支付订单页面.png](img/13-支付订单页面.png)
14-租客订单列表.png
![14-租客订单列表.png](img/14-租客订单列表.png)
15-租客的房屋信息.png
![15-租客的房屋信息.png](img/15-租客的房屋信息.png)
16-充值管理.png
![16-充值管理.png](img/16-充值管理.png)
17-个人信息.png
![17-个人信息.png](img/17-个人信息.png)
18-出租者的房屋信息列表.png
![18-出租者的房屋信息列表.png](img/18-出租者的房屋信息列表.png)
19-出租者的订单管理.png
![19-出租者的订单管理.png](img/19-出租者的订单管理.png)
20-管理员房屋管理.png
![20-管理员房屋管理.png](img/20-管理员房屋管理.png)
21-出租分类.png
![21-出租分类.png](img/21-出租分类.png)
22-财务统计.png
![22-财务统计.png](img/22-财务统计.png)
23-公告管理.png
![23-公告管理.png](img/23-公告管理.png)
24-编辑发布新闻公告.png
![24-编辑发布新闻公告.png](img/24-编辑发布新闻公告.png)
25-用户管理.png
![25-用户管理.png](img/25-用户管理.png)
26-房屋信息发布.png
![26-房屋信息发布.png](img/26-房屋信息发布.png)
27-房屋信息编辑.png
![27-房屋信息编辑.png](img/27-房屋信息编辑.png)



其他页面,请直接通过演示网站访问 <br/>
管理员账号admin/123456,房东mayun/123456,租客zhangsan/123456


## 联系方式
目前只开源后端代码,需要前端和sql等完整代码请联系博主 <br/>
同时也提供部署或讲解服务  <br/>
微信/QQ:847064370 <br/>
[博主博客主页](https://liuyanzhao.com) <br/>

## 日志

- 2021/11/13 4.0版本
    - 新增中介角色,功能跟房东类似,需要填写房东信息
    - 注册登录增加验证码,不区分大小写

- 2021/3/17  3.0版本
    - 大改
    - 角色改成 管理员、房东和租客三种,将原来用户角色拆分成房东和租客
    - 租房时间单位由月改成日,租房时可以选择租到具体哪一天
    - 新增退租功能
    - 取消充值,用户余额字段,新增收支明细
    - 管理员可以对订单做任何操作操作

- 2020/12/14 2.0版本
    - 根据部分同学要求,重构代码
    — 修改导航菜单,加入图标
    - 固定顶部导航
    - 添加城市切换切换卡
    - 添加合租室友信息
    
- 2020/12/06
    - 根据部分同学要求,重构代码
    - 把房东和租客两种角色合二为一,用户既可以租房也可以发布出租信息。 
    - 把租房分类改成了整租和合租。
    - 新增余额充值和收支明细,以及付款后租客余额减少,出租人越增加,定时返回押金
    - 修改了合同内容,新增合同下载和打印
    - 新增新闻公告
    - 新增联系我们页面
    - 新增押金字段
    - 新增支持租金和面积检索
<hr/>

- 2020/10/18 1.0 版本
- 完成初步开发
- 管理员功能:登录,房屋管理、房屋类型管理、订单管理、房东管理,租客管理、财务统计,个人信息等。还要角色管理和权限管理,这里隐藏了。
- 房东功能:注册,登录,房屋管理(房屋添加修改删除上架等)、订单管理、查看电子合同。
- 租客功能:注册,登录,房屋检索,房屋租赁,查看订单,查看电子合同。



================================================
FILE: pom.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.example</groupId>
    <artifactId>Manland</artifactId>
    <version>4.0.0</version>
    <name>Manland</name>


    <description>
        基于SpringBoot的房租租赁系统
    </description>

    <developers>
        <developer>
            <id>saysky</id>
            <name>言曌</name>
            <email>admin@example.com</email>
            <url>https://example.com</url>
        </developer>
    </developers>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.7.RELEASE</version>
        <relativePath/>
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
        <druid.version>1.1.10</druid.version>
        <lombok.version>1.18.2</lombok.version>
        <commons-lang3.version>3.8</commons-lang3.version>
        <hutool-all.version>4.1.13</hutool-all.version>
        <docker.image.prefix>saysky</docker.image.prefix>
    </properties>

    <dependencies>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-tomcat</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-aop</artifactId>
        </dependency>

        <!-- undertow -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-undertow</artifactId>
        </dependency>

        <!-- mybatis-plus begin -->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.1.2</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>
        <!--mybatis-plus end-->

        <!-- mysql-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>


        <!-- druid数据源 -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>${druid.version}</version>
        </dependency>

        <!--   thymeleaf     -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>


        <!-- Lombok -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>${lombok.version}</version>
            <scope>provided</scope>
        </dependency>


        <!-- commons-lang3工具包 -->
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
            <version>${commons-lang3.version}</version>
        </dependency>

        <!-- hutool工具包 -->
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>${hutool-all.version}</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <optional>true</optional>
        </dependency>

        <!--序列化-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.72</version>
        </dependency>

        <dependency>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
            <version>26.0-jre</version>
        </dependency>

        <!--Shiro-->
        <dependency>
            <groupId>org.apache.shiro</groupId>
            <artifactId>shiro-spring</artifactId>
            <version>1.4.0</version>
        </dependency>

        <!--thymeleaf-shiro-extras-->
        <dependency>
            <groupId>com.github.theborakompanioni</groupId>
            <artifactId>thymeleaf-extras-shiro</artifactId>
            <version>2.0.0</version>
        </dependency>
        <dependency>
            <groupId>com.google.code.gson</groupId>
            <artifactId>gson</artifactId>
            <version>2.8.5</version>
        </dependency>

        <!-- 邮件 -->
        <dependency>
            <groupId>io.github.biezhi</groupId>
            <artifactId>oh-my-email</artifactId>
            <version>0.0.3</version>
        </dependency>

        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>

        <!--        验证码-->
        <dependency>
            <groupId>com.github.penggle</groupId>
            <artifactId>kaptcha</artifactId>
            <version>2.3.2</version>
        </dependency>

    </dependencies>
    <repositories>
        <repository>
            <id>aliyun</id>
            <url>http://maven.aliyun.com/nexus/content/groups/public</url>
        </repository>
    </repositories>

    <pluginRepositories>
        <pluginRepository>
            <id>aliyun</id>
            <url>http://maven.aliyun.com/nexus/content/groups/public</url>
        </pluginRepository>
    </pluginRepositories>

    <build>
        <finalName>manland</finalName>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <fork>true</fork>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>




================================================
FILE: src/main/java/com/example/sens/Application.java
================================================
package com.example.sens;

import lombok.extern.slf4j.Slf4j;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.context.ApplicationContext;
import org.springframework.scheduling.annotation.EnableScheduling;

/**
 * <pre>
 *     SENS run!
 * </pre>
 *
 * @author : saysky
 * @date : 2019/11/14
 */
@Slf4j
@SpringBootApplication
@EnableCaching
@EnableScheduling
@MapperScan("com.example.sens.mapper*")
public class Application {
    public static void main(String[] args) {
        ApplicationContext context = SpringApplication.run(Application.class, args);
        String serverPort = context.getEnvironment().getProperty("server.port");
        log.info("SENS started at http://localhost:" + serverPort);
    }

}


================================================
FILE: src/main/java/com/example/sens/common/base/BaseEntity.java
================================================
package com.example.sens.common.base;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableLogic;
import com.example.sens.common.constant.CommonConstant;
import lombok.Data;

import java.io.Serializable;
import java.util.Date;

/**
 * @author 言曌
 * @date 2019-08-07 00:28
 */
@Data
public class BaseEntity implements Serializable {

    /**
     * ID,自动生成
     */
    @TableId(type = IdType.AUTO)
    private Long id;

    /**
     * 删除状态:1删除,0未删除
     */
    @TableField(value = "del_flag")
    @TableLogic
    private Integer delFlag = CommonConstant.STATUS_NORMAL;

    /**
     * 创建人账号
     */
    private String createBy;

    /**
     * 创建时间
     */
    private Date createTime;

    /**
     * 更新人
     */
    private String updateBy;

    /**
     * 更新时间
     */
    private Date updateTime;
}


================================================
FILE: src/main/java/com/example/sens/common/base/BaseService.java
================================================
package com.example.sens.common.base;

import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.example.sens.vo.SearchVo;
import com.example.sens.dto.QueryCondition;

import java.io.Serializable;
import java.lang.reflect.InvocationTargetException;
import java.util.Date;
import java.util.List;

/**
 * @author 言曌
 * @date 2019-09-04 22:47
 */
// JDK8函数式接口注解 仅能包含一个抽象方法
public interface BaseService<E, ID extends Serializable> {

    /**
     * @return
     */
    BaseMapper<E> getRepository();

    /**
     * 根据ID获取
     *
     * @param id
     * @return
     */
    default E get(ID id) {
        return getRepository().selectById(id);
    }

    /**
     * 获取所有列表
     *
     * @return
     */
    default List<E> getAll() {
        return getRepository().selectList(null);
    }

    /**
     * 获取总数
     *
     * @return
     */
    default Integer getTotalCount() {
        return getRepository().selectCount(null);
    }

    /**
     * 添加
     *
     * @param entity
     * @return
     */
    default E insert(E entity) {
        getRepository().insert(entity);
        return entity;
    }

    /**
     * 修改
     *
     * @param entity
     * @return
     */
    default E update(E entity) {
        getRepository().updateById(entity);
        return entity;
    }

    /**
     * 保存或者更新
     * @param entity
     * @return
     */
    default E insertOrUpdate(E entity) {
        try {
            Object id = entity.getClass().getMethod("getId").invoke(entity);
            if (id != null) {
                update(entity);
            } else {
                insert(entity);
            }
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        }
        return entity;
    }

    /**
     * 批量保存与修改
     *
     * @param list
     * @return
     */
    default List<E> batchInsert(List<E> list) {
        for (E e : list) {
            getRepository().insert(e);
        }
        return list;
    }


    /**
     * 根据Id删除
     *
     * @param id
     */
    default void delete(ID id) {
        getRepository().deleteById(id);
    }

    /**
     * 批量删除
     *
     * @param ids
     */
    default void batchDelete(List<ID> ids) {
        getRepository().deleteBatchIds(ids);
    }


    /**
     * 根据id批量查询
     * @param ids
     * @return
     */
    default List<E> findByBatchIds(List<ID> ids) {
        return getRepository().selectBatchIds(ids);
    }

    /**
     * 获取所有
     *
     * @return
     */
    default List<E> findAll() {
        return getRepository().selectList(null);
    }

    /**
     * 根据条件查询获取
     *
     * @param queryWrapper
     * @return
     */
    default List<E> findAll(QueryWrapper<E> queryWrapper) {
        return getRepository().selectList(queryWrapper);
    }

    /**
     * 根据查询条件不分页获取
     *
     * @param condition
     * @return
     */
    default List<E> findAll(QueryCondition<E> condition) {
        E e = condition.getData();

        //对指定字段查询
        QueryWrapper<E> queryWrapper = getQueryWrapper(e);

        return getRepository().selectList(queryWrapper);
    }

    /**
     * 分页获取
     *
     * @param page
     * @return
     */
    default Page<E> findAll(Page<E> page) {
        return (Page<E>) getRepository().selectPage(page, null);
    }

    /**
     * 获得查询器
     *
     * @param e
     * @return
     */
    QueryWrapper<E> getQueryWrapper(E e);

    /**
     * 根据查询条件分页获取
     *
     * @param page
     * @param condition
     * @return
     */
    default Page<E> findAll(Page<E> page, QueryCondition<E> condition) {
        E e = condition.getData();
        SearchVo searchVo = condition.getSearchVo();

        //对指定字段查询
        QueryWrapper<E> queryWrapper = getQueryWrapper(e);

        //查询日期范围
        if (searchVo != null) {
            String startDate = searchVo.getStartDate();
            String endDate = searchVo.getEndDate();
            if (StrUtil.isNotBlank(startDate) && StrUtil.isNotBlank(endDate)) {
                Date start = DateUtil.parse(startDate);
                Date end = DateUtil.parse(endDate);
                queryWrapper.between("create_time", start, end);
            }
        }
        return (Page<E>) getRepository().selectPage(page, queryWrapper);
    }

    /**
     * 获取查询条件的结果数
     *
     * @param queryWrapper
     * @return
     */
    default long count(QueryWrapper<E> queryWrapper) {
        return getRepository().selectCount(queryWrapper);
    }

}



================================================
FILE: src/main/java/com/example/sens/common/constant/CommonConstant.java
================================================
package com.example.sens.common.constant;

/**
 * 常量
 * @author 言曌
 */
public interface CommonConstant {

    /**
     * 正常状态
     */
    Integer STATUS_NORMAL = 0;

    /**
     * 用户密码加盐的盐
     */
    String PASSWORD_SALT = "sens";

    /**
     * none
     */
    String NONE = "none";

    String CONDITION = "condition";
}


================================================
FILE: src/main/java/com/example/sens/config/MvcConfig.java
================================================
package com.example.sens.config;

import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.web.servlet.LocaleResolver;
import org.springframework.web.servlet.config.annotation.*;
import org.springframework.web.servlet.i18n.SessionLocaleResolver;

import java.util.Locale;

/**
 * 拦截器,资源路径配置
 */
@Slf4j
@Configuration
@EnableWebMvc
@ComponentScan(basePackages = "com.example.sens.controller")
@PropertySource(value = "classpath:application.yaml", ignoreResourceNotFound = true, encoding = "UTF-8")
public class MvcConfig implements WebMvcConfigurer {


    /**
     * 配置静态资源路径
     *
     * @param registry registry
     */
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/static/**")
                .addResourceLocations("classpath:/static/");
        registry.addResourceHandler("/**")
                .addResourceLocations("classpath:/templates/themes/")
                .addResourceLocations("classpath:/robots.txt");
        registry.addResourceHandler("/upload/**")
                .addResourceLocations("file:///" + System.getProperties().getProperty("user.home") + "/sens/upload/");
        registry.addResourceHandler("/favicon.png")
                .addResourceLocations("classpath:/static/images/favicon.png");
    }

    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")
                .allowCredentials(true)
                .allowedHeaders("*")
                .allowedOrigins("*")
                .allowedMethods("*");
    }

    @Bean
    public LocaleResolver localeResolver() {
        SessionLocaleResolver slr = new SessionLocaleResolver();
        slr.setDefaultLocale(Locale.CHINA);
        return slr;
    }
}


================================================
FILE: src/main/java/com/example/sens/config/mybatisplus/MybatisPlusConfig.java
================================================
package com.example.sens.config.mybatisplus;

import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
import com.baomidou.mybatisplus.extension.plugins.PerformanceInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;


/**
 * @author 言曌
 * @date 2018/12/22 下午1:49
 */

@Configuration
public class MybatisPlusConfig {

    /***
     * plus 的性能优化
     * @return
     */
    @Bean
    public PerformanceInterceptor performanceInterceptor() {
        PerformanceInterceptor performanceInterceptor = new PerformanceInterceptor();
        /*<!-- SQL 执行性能分析,开发环境使用,线上不推荐。 maxTime 指的是 sql 最大执行时长 -->*/
        performanceInterceptor.setMaxTime(1000);
        /*<!--SQL是否格式化 默认false-->*/
        performanceInterceptor.setFormat(false);
        return performanceInterceptor;
    }

    /**
     * mybatis-plus分页插件
     */
    @Bean
    public PaginationInterceptor paginationInterceptor() {
        return new PaginationInterceptor();
    }



}


================================================
FILE: src/main/java/com/example/sens/config/properties/IgnoredUrlsProperties.java
================================================
package com.example.sens.config.properties;

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;

import java.util.ArrayList;
import java.util.List;

/**
 * @author example
 */
@Data
@Configuration
@ConfigurationProperties(prefix = "ignored")
public class IgnoredUrlsProperties {

    private List<String> urls = new ArrayList<>();
}


================================================
FILE: src/main/java/com/example/sens/config/schedule/SystemSchedule.java
================================================
package com.example.sens.config.schedule;

import com.example.sens.entity.Order;
import com.example.sens.entity.Post;
import com.example.sens.entity.User;
import com.example.sens.enums.OrderStatusEnum;
import com.example.sens.enums.PostStatusEnum;
import com.example.sens.mapper.OrderMapper;
import com.example.sens.mapper.PostMapper;
import com.example.sens.mapper.UserMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

/**
 * 定时器
 *
 * @author 言曌
 * @date 2020/3/21 7:18 下午
 */
@Component
public class SystemSchedule {

    @Autowired
    private PostMapper postMapper;

    @Autowired
    private OrderMapper orderMapper;

    @Autowired
    private UserMapper userMapper;

    /**
     * 更新到期的订单
     */
    @Scheduled(fixedRate = 10000)
    @Transactional(rollbackFor = Exception.class)
    public void updatePostStatus() {
        List<Order> orderList = orderMapper.findOverDueOrder();
        for (Order order : orderList) {


            // 更新房屋状态
            Post post = postMapper.selectById(order.getPostId());
            if (post == null) {
                return;
            }

            // 退还押金
            User user = userMapper.selectById(order.getUserId());
            if (user == null) {
                return;
            }


            User ownerUser = userMapper.selectById(post.getId());
            if (ownerUser == null) {
                return;
            }

            if (ownerUser.getMoney() < post.getDeposit()) {
                // 业主余额不足,无法退回押金
                // 结束订单
                order.setStatus(OrderStatusEnum.DEPOSIT_RETURN_FAIL.getCode());
                orderMapper.updateById(order);
                return;
            }


            //  以下代码暂不考虑并发问题,暂不用乐观锁实现
            // 业主余额减少
            ownerUser.setMoney(ownerUser.getMoney() - post.getDeposit());
            userMapper.updateById(ownerUser);

            // 租客余额增加
            user.setMoney(user.getMoney() + post.getDeposit());
            userMapper.updateById(user);

            // 结束订单
            order.setStatus(OrderStatusEnum.FINISHED.getCode());
            orderMapper.updateById(order);

            post.setPostStatus(PostStatusEnum.ON_SALE.getCode());
            postMapper.updateById(post);

        }


    }

}


================================================
FILE: src/main/java/com/example/sens/config/shiro/MyRealm.java
================================================
package com.example.sens.config.shiro;

import com.example.sens.common.constant.CommonConstant;
import com.example.sens.entity.Permission;
import com.example.sens.entity.Role;
import com.example.sens.service.PermissionService;
import com.example.sens.service.RoleService;
import com.example.sens.service.UserService;
import com.example.sens.entity.User;
import com.example.sens.enums.UserStatusEnum;
import com.example.sens.util.RegexUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.shiro.authc.*;
import org.apache.shiro.authz.AuthorizationInfo;
import org.apache.shiro.authz.SimpleAuthorizationInfo;
import org.apache.shiro.realm.AuthorizingRealm;
import org.apache.shiro.subject.PrincipalCollection;
import org.apache.shiro.util.ByteSource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Lazy;

import java.util.List;
import java.util.Objects;
import java.util.Set;
import java.util.stream.Collectors;

@Slf4j
public class MyRealm extends AuthorizingRealm {

    @Autowired
    @Lazy
    private UserService userService;

    @Autowired
    @Lazy
    private RoleService roleService;

    @Autowired
    @Lazy
    private PermissionService permissionService;


    /**
     * 认证信息(身份验证) Authentication 是用来验证用户身份
     */
    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
        log.info("认证-->MyShiroRealm.doGetAuthenticationInfo()");
        //1.验证账号
        User user;
        String account = (String) token.getPrincipal();
        if (RegexUtil.isIdCard(account)) {
            user = userService.findByIdCard(account);
        } else {
            user = userService.findByUserName(account);
        }
        if (user == null) {
            //用户不存在
            log.info("用户不存在! 登录名:{}, 密码:{}", account, token.getCredentials());
            return null;
        }
        Role role = roleService.findByUserId(user.getId());
        if (role != null) {
            user.setRole(role);
        }


        //2.判断账号是否被封号
        if (!Objects.equals(user.getStatus(), UserStatusEnum.NORMAL.getCode())) {
            throw new LockedAccountException("账号被封禁");
        }

        //3.封装authenticationInfo,准备验证密码
        SimpleAuthenticationInfo authenticationInfo = new SimpleAuthenticationInfo(
                user, // 账号
                user.getUserPass(), // 密码
                ByteSource.Util.bytes(CommonConstant.PASSWORD_SALT), // 盐
                getName() // realm name
        );
        System.out.println("realName:" + getName());
        return authenticationInfo;
    }


    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {

        SimpleAuthorizationInfo authorizationInfo = new SimpleAuthorizationInfo();
        User user = (User) principals.getPrimaryPrincipal();

        Role role = roleService.findByUserId(user.getId());

        authorizationInfo.addRole(role.getRole());
        List<Permission> permissions = permissionService.listPermissionsByRoleId(role.getId());
        //把权限的URL全部放到authorizationInfo中去
        Set<String> urls = permissions.stream().map(p -> p.getUrl()).collect(Collectors.toSet());
        authorizationInfo.addStringPermissions(urls);

        return authorizationInfo;
    }
}


================================================
FILE: src/main/java/com/example/sens/config/shiro/ShiroConfig.java
================================================
package com.example.sens.config.shiro;

import at.pollux.thymeleaf.shiro.dialect.ShiroDialect;
import com.example.sens.config.properties.IgnoredUrlsProperties;
import org.apache.shiro.authc.credential.AllowAllCredentialsMatcher;
import org.apache.shiro.authc.credential.HashedCredentialsMatcher;
import org.apache.shiro.mgt.SecurityManager;
import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import javax.servlet.Filter;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;


@Configuration
public class ShiroConfig {

    @Bean
    public ShiroDialect shiroDialect() {
        return new ShiroDialect();
    }

    @Bean
    IgnoredUrlsProperties getIgnoredUrlsProperties() {
        return new IgnoredUrlsProperties();
    }

    @Bean
    public ShiroFilterFactoryBean shiroFilter(SecurityManager securityManager) {
        ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
        shiroFilterFactoryBean.setSecurityManager(securityManager);
        //自定义拦截器
        Map<String, Filter> filtersMap = new LinkedHashMap<String, Filter>();
        //访问权限配置
        filtersMap.put("requestURL", getURLPathMatchingFilter());
        shiroFilterFactoryBean.setFilters(filtersMap);

        //拦截器.
        Map<String, String> filterChainDefinitionMap = new LinkedHashMap<String, String>();
        // 配置不会被拦截的链接 顺序判断
        List<String> urls = getIgnoredUrlsProperties().getUrls();
        for (String url : urls) {
            filterChainDefinitionMap.put(url, "anon");
        }
        filterChainDefinitionMap.put("/admin", "authc");
        filterChainDefinitionMap.put("/admin/**", "requestURL");
        filterChainDefinitionMap.put("/**", "anon");

        shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap);


        // 如果不设置默认会自动寻找Web工程根目录下的"/login"页面
        shiroFilterFactoryBean.setLoginUrl("/");
        // 登录成功后要跳转的链接
        shiroFilterFactoryBean.setSuccessUrl("/");
        //未授权界面;
        shiroFilterFactoryBean.setUnauthorizedUrl("/403");

        return shiroFilterFactoryBean;

    }

    @Bean
    public SecurityManager securityManager() {
        DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
        securityManager.setRealm(myRealm());
        return securityManager;
    }


    @Bean
    public MyRealm myRealm() {
        MyRealm normalRealm = new MyRealm();
        normalRealm.setCredentialsMatcher(hashedCredentialsMatcher());
        return normalRealm;
    }

    /**
     * 访问 权限 拦截器
     *
     * @return
     */
    public URLPathMatchingFilter getURLPathMatchingFilter() {
        return new URLPathMatchingFilter();
    }

    /**
     * MD5加盐加密十次
     *
     * @return
     */
    @Bean
    public HashedCredentialsMatcher hashedCredentialsMatcher() {
        HashedCredentialsMatcher hashedCredentialsMatcher = new HashedCredentialsMatcher();
        //散列算法:这里使用MD5算法;
        hashedCredentialsMatcher.setHashAlgorithmName("md5");
        //散列的次数,md5("")
        hashedCredentialsMatcher.setHashIterations(10);
        return hashedCredentialsMatcher;
    }

    @Bean
    public AllowAllCredentialsMatcher allowAllCredentialsMatcher() {
        return new AllowAllCredentialsMatcher();
    }



================================================
FILE: src/main/java/com/example/sens/config/shiro/URLPathMatchingFilter.java
================================================
package com.example.sens.config.shiro;

import com.alibaba.fastjson.JSONObject;
import com.example.sens.service.PermissionService;
import com.example.sens.util.SpringUtil;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.subject.Subject;
import org.apache.shiro.web.filter.PathMatchingFilter;
import org.apache.shiro.web.util.WebUtils;

import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import java.io.PrintWriter;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;

/**
 * URL拦截器
 */
public class URLPathMatchingFilter extends PathMatchingFilter {


    PermissionService permissionService = null;
    private PermissionService permissionService() {
        if (permissionService == null) {
            permissionService = (PermissionService) SpringUtil.getBean("permissionServiceImpl");
        }
        return permissionService;
    }

    @Override
    protected boolean onPreHandle(ServletRequest request, ServletResponse response, Object mappedValue) throws Exception {
        //请求的url
        String requestURL = getPathWithinApplication(request);
        System.out.println("请求的url :" + requestURL);
        Subject subject = SecurityUtils.getSubject();
        if (!subject.isAuthenticated()) {
            // 如果没有登录, 进入登录流程
            WebUtils.issueRedirect(request, response, "/login");
            return false;
        }

        //从session里读取当前用户的权限URL列表
        Set<String> urls = (Set<String>) subject.getSession().getAttribute("permissionUrls");
        if (urls.contains(requestURL)) {
            return true;
        }

        //没有权限
        if (isAjax((HttpServletRequest) request)) {
            response.setCharacterEncoding("utf-8");
            response.setContentType("application/json; charset=utf-8");
            PrintWriter writer = response.getWriter();
            Map<String, Object> map = new HashMap<>();
            map.put("code", 0);
            map.put("msg", "没有权限访问");
            writer.write(JSONObject.toJSONString(map));
        } else {
            WebUtils.issueRedirect(request, response, "/403");
        }

        return false;
    }


    public static boolean isAjax(HttpServletRequest httpRequest) {
        return (httpRequest.getHeader("X-Requested-With") != null
                && "XMLHttpRequest"
                .equals(httpRequest.getHeader("X-Requested-With").toString()));
    }



================================================
FILE: src/main/java/com/example/sens/controller/admin/AdminController.java
================================================
package com.example.sens.controller.admin;

import com.example.sens.entity.Permission;
import com.example.sens.entity.Role;
import com.example.sens.entity.User;
import com.example.sens.service.PermissionService;
import com.example.sens.controller.common.BaseController;
import com.example.sens.dto.JsonResult;
import com.example.sens.service.RoleService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;

import java.util.*;

/**
 * <pre>
 *     后台首页控制器
 * </pre>
 */
@Slf4j
@Controller
@RequestMapping(value = "/admin")
public class AdminController extends BaseController {

    @Autowired
    private PermissionService permissionService;

    @Autowired
    private RoleService roleService;

    /**
     * 请求后台页面
     *
     * @param model model
     * @return 模板路径admin/admin_index
     */
    @GetMapping
    public String index(Model model) {
        return "admin/admin_index";
    }


    /**
     * 获得当前用户的菜单
     *
     * @return
     */
    @GetMapping(value = "/currentMenus")
    @ResponseBody
    public JsonResult getMenu() {
        Long userId = getLoginUserId();
        List<Permission> permissions = permissionService.findPermissionTreeByUserIdAndResourceType(userId, "menu");
        return JsonResult.success("", permissions);
    }

    /**
     * 获得当前登录用户
     */
    @GetMapping(value = "/currentUser")
    @ResponseBody
    public JsonResult currentUser() {
        User user = getLoginUser();
        if (user != null) {
            return JsonResult.success("", user);
        }
        return JsonResult.error("用户未登录");
    }

    /**
     * 获得当前用户角色编码
     */
    @GetMapping(value = "/currentRole")
    @ResponseBody
    public JsonResult currentRole() {
        Role role = roleService.findByUserId(getLoginUserId());
        if (role == null) {
            return JsonResult.error("用户未登录或无角色");
        }
        return JsonResult.success("", role.getRole());
    }


    @GetMapping("/pay")
    public String pay(@RequestParam("money") Integer money, Model model) {
        model.addAttribute("money", money);
        return "admin/alipay";
    }

}


================================================
FILE: src/main/java/com/example/sens/controller/admin/AttachmentController.java
================================================
package com.example.sens.controller.admin;

import com.example.sens.controller.common.BaseController;
import com.example.sens.util.FileUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.util.HashMap;
import java.util.Map;


/**
 * <pre>
 *     后台附件控制器
 * </pre>
 *
 * @author : saysky
 * @date : 2019/12/19
 */
@Slf4j
@Controller
@RequestMapping(value = "/admin/file")
public class AttachmentController extends BaseController {


    /**
     * 上传文件
     *
     * @param file file
     * @return Map
     */
    @PostMapping(value = "/upload", produces = {"application/json;charset=UTF-8"})
    @ResponseBody
    public Map<String, Object> uploadFile(@RequestParam("file") MultipartFile file) {
        Map<String, Object> map = new HashMap<>(1);
        String path = FileUtil.upload(file);
        map.put("link", path);
        return map;
    }


}


================================================
FILE: src/main/java/com/example/sens/controller/admin/CategoryController.java
================================================
package com.example.sens.controller.admin;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.example.sens.controller.common.BaseController;
import com.example.sens.entity.Category;
import com.example.sens.dto.JsonResult;
import com.example.sens.service.CategoryService;
import com.example.sens.util.PageUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;

/**
 * <pre>
 *     后台分类管理控制器
 * </pre>
 *
 */
@Slf4j
@Controller
@RequestMapping(value = "/admin/category")
public class CategoryController extends BaseController {

    @Autowired
    private CategoryService categoryService;


    /**
     * 查询所有分类并渲染category页面
     *
     * @return 模板路径admin/admin_category
     */
    @GetMapping
    public String categories(@RequestParam(value = "page", defaultValue = "0") Integer pageNumber,
                             @RequestParam(value = "size", defaultValue = "10") Integer pageSize,
                             @RequestParam(value = "sort", defaultValue = "cateSort") String sort,
                             @RequestParam(value = "order", defaultValue = "desc") String order, Model model) {
        Page page = PageUtil.initMpPage(pageNumber, pageSize, sort, order);
        Page<Category> categoryPage = categoryService.findAll(page);
        model.addAttribute("categories", categoryPage.getRecords());
        model.addAttribute("pageInfo", PageUtil.convertPageVo(page));
        return "admin/admin_category";
    }

    /**
     * 新增/修改分类目录
     *
     * @param category category对象
     * @return 重定向到/admin/category
     */
    @PostMapping(value = "/save")
    @ResponseBody
    public JsonResult saveCategory(@ModelAttribute Category category) {
        categoryService.insertOrUpdate(category);
        return JsonResult.success("保存成功");
    }

    /**
     * 删除分类
     *
     * @param cateId 分类Id
     * @return JsonResult
     */
    @DeleteMapping(value = "/delete")
    @ResponseBody
    public JsonResult checkDelete(@RequestParam("id") Long cateId) {
        //1.判断这个分类有房屋
        Integer count = categoryService.countPostByCateId(cateId);
        if (count != 0) {
            return JsonResult.error("该分类已经有了房屋,无法删除");
        }
        categoryService.delete(cateId);
        return JsonResult.success("删除成功");
    }


    /**
     * 跳转到修改页面
     *
     * @param cateId cateId
     * @param model  model
     * @return 模板路径admin/admin_category
     */
    @GetMapping(value = "/edit")
    public String toEditCategory(Model model,
                                 @RequestParam(value = "page", defaultValue = "0") Integer pageNumber,
                                 @RequestParam(value = "size", defaultValue = "10") Integer pageSize,
                                 @RequestParam(value = "sort", defaultValue = "cateSort") String sort,
                                 @RequestParam(value = "order", defaultValue = "desc") String order,
                                 @RequestParam("id") Long cateId) {
        Page page = PageUtil.initMpPage(pageNumber, pageSize, sort, order);

        //更新的分类
        Category category = categoryService.get(cateId);
        if (category == null) {
            return this.renderNotFound();
        }
        model.addAttribute("updateCategory", category);

        // 所有分类
        Page<Category> categoryPage = categoryService.findAll(page);
        model.addAttribute("categories", categoryPage.getRecords());
        model.addAttribute("pageInfo", PageUtil.convertPageVo(page));
        return "admin/admin_category";
    }
}


================================================
FILE: src/main/java/com/example/sens/controller/admin/NoticeController.java
================================================
package com.example.sens.controller.admin;

import cn.hutool.http.HtmlUtil;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.example.sens.controller.common.BaseController;
import com.example.sens.dto.JsonResult;
import com.example.sens.entity.Notice;
import com.example.sens.exception.MyBusinessException;
import com.example.sens.service.NoticeService;
import com.example.sens.util.PageUtil;
import com.example.sens.vo.SearchVo;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * <pre>
 *     后台公告管理控制器
 * </pre>
 *
 * @author : saysky
 * @date : 2020/12/6
 */
@Slf4j
@Controller
@RequestMapping(value = "/admin/notice")
public class NoticeController extends BaseController {

    @Autowired
    private NoticeService noticeService;

    /**
     * 处理后台获取公告列表的请求
     *
     * @param model model
     * @return 模板路径admin/admin_notice
     */
    @GetMapping
    public String notices(Model model,
                          @RequestParam(value = "page", defaultValue = "1") Integer pageNumber,
                          @RequestParam(value = "size", defaultValue = "10") Integer pageSize,
                          @RequestParam(value = "sort", defaultValue = "createTime") String sort,
                          @RequestParam(value = "order", defaultValue = "desc") String order,
                          @ModelAttribute SearchVo searchVo) {


        Page page = PageUtil.initMpPage(pageNumber, pageSize, sort, order);
        Page<Notice> noticePage = noticeService.findAll(page);
        List<Notice> noticeList = noticePage.getRecords();

        model.addAttribute("notices", noticeList);
        model.addAttribute("pageInfo", PageUtil.convertPageVo(page));
        model.addAttribute("order", order);
        model.addAttribute("sort", sort);

        return "admin/admin_notice";
    }


    /**
     * 处理跳转到新建公告页面
     *
     * @return 模板路径admin/admin_editor
     */
    @GetMapping(value = "/new")
    public String newNotice(Model model) {
        return "admin/admin_notice_new";
    }


    /**
     * 添加/更新公告
     *
     * @param notice Notice实体
     */
    @PostMapping(value = "/save")
    @ResponseBody
    public JsonResult pushNotice(@ModelAttribute Notice notice) {
        // 1、提取摘要
        int postSummary = 100;
        //房屋摘要
        String summaryText = HtmlUtil.cleanHtmlTag(notice.getContent());
        if (summaryText.length() > postSummary) {
            String summary = summaryText.substring(0, postSummary);
            notice.setSummary(summary);
        } else {
            notice.setSummary(summaryText);
        }
        noticeService.insertOrUpdate(notice);
        return JsonResult.success("发布成功");
    }


    /**
     * 处理删除公告的请求
     *
     * @param noticeId 公告编号
     * @return 重定向到/admin/notice
     */
    @DeleteMapping(value = "/delete")
    @ResponseBody
    public JsonResult removeNotice(@RequestParam("id") Long noticeId) {
        noticeService.delete(noticeId);
        return JsonResult.success("删除成功");
    }


    /**
     * 跳转到编辑公告页面
     *
     * @param noticeId 公告编号
     * @param model    model
     * @return 模板路径admin/admin_editor
     */
    @GetMapping(value = "/edit")
    public String editNotice(@RequestParam("id") Long noticeId, Model model) {
        Notice notice = noticeService.get(noticeId);
        if (notice == null) {
            throw new MyBusinessException("公告不存在");
        }

        model.addAttribute("notice", notice);

        return "admin/admin_notice_edit";
    }


}


================================================
FILE: src/main/java/com/example/sens/controller/admin/OrderController.java
================================================
package com.example.sens.controller.admin;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.example.sens.controller.common.BaseController;
import com.example.sens.dto.JsonResult;
import com.example.sens.entity.Order;
import com.example.sens.enums.OrderStatusEnum;
import com.example.sens.service.OrderService;
import com.example.sens.util.PageUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;

/**
 * <pre>
 *     订单管理控制器
 * </pre>
 */
@Slf4j
@Controller
@RequestMapping(value = "/admin/order")
public class OrderController extends BaseController {

    @Autowired
    private OrderService orderService;

    /**
     * 查询所有订单并渲染order页面
     *
     * @return 模板路径admin/admin_order
     */
    @GetMapping
    public String orders(@RequestParam(value = "page", defaultValue = "0") Integer pageNumber,
                         @RequestParam(value = "size", defaultValue = "10") Integer pageSize,
                         @RequestParam(value = "sort", defaultValue = "id") String sort,
                         @RequestParam(value = "order", defaultValue = "desc") String order, Model model) {
        Page page = PageUtil.initMpPage(pageNumber, pageSize, sort, order);
        Page<Order> orderPage = null;

        Order orderCondition = new Order();
        orderPage = orderService.findAll(orderCondition, page);
        model.addAttribute("orders", orderPage.getRecords());
        model.addAttribute("pageInfo", PageUtil.convertPageVo(page));
        return "admin/admin_order";
    }

    /**
     * 我出租的房屋订单
     *
     * @return 模板路径admin/admin_order
     */
    @GetMapping("/lease")
    public String lease(@RequestParam(value = "page", defaultValue = "0") Integer pageNumber,
                        @RequestParam(value = "size", defaultValue = "10") Integer pageSize,
                        @RequestParam(value = "sort", defaultValue = "id") String sort,
                        @RequestParam(value = "order", defaultValue = "desc") String order, Model model) {
        Page page = PageUtil.initMpPage(pageNumber, pageSize, sort, order);
        Order orderCondition = new Order();
        orderCondition.setOwnerUserId(getLoginUserId());
        Page<Order> orderPage = orderService.findAll(orderCondition, page);
        model.addAttribute("orders", orderPage.getRecords());
        model.addAttribute("pageInfo", PageUtil.convertPageVo(page));

        model.addAttribute("type", "lease");
        return "admin/admin_order";
    }


    /**
     * 我的租房订单
     *
     * @return 模板路径admin/admin_order
     */
    @GetMapping("/rent")
    public String rent(@RequestParam(value = "page", defaultValue = "0") Integer pageNumber,
                       @RequestParam(value = "size", defaultValue = "10") Integer pageSize,
                       @RequestParam(value = "sort", defaultValue = "id") String sort,
                       @RequestParam(value = "order", defaultValue = "desc") String order, Model model) {
        Page page = PageUtil.initMpPage(pageNumber, pageSize, sort, order);
        Order orderCondition = new Order();
        orderCondition.setUserId(getLoginUserId());
        Page<Order> orderPage  = orderService.findAll(orderCondition, page);
        model.addAttribute("orders", orderPage.getRecords());
        model.addAttribute("pageInfo", PageUtil.convertPageVo(page));

        model.addAttribute("type", "rent");
        return "admin/admin_order";
    }


    /**
     * 删除订单
     *
     * @param id 订单Id
     * @return JsonResult
     */
    @DeleteMapping(value = "/delete")
    @ResponseBody
    public JsonResult delete(@RequestParam("id") Long id) {
        Order order = orderService.get(id);
        if (order == null) {
            return JsonResult.error("订单不存在");
        }
        if (OrderStatusEnum.HAS_PAY.getCode().equals(order.getStatus())) {
            return JsonResult.error("订单生效中,不能删除");
        }

        orderService.delete(id);
        return JsonResult.success("删除成功");
    }

    /**
     * 完结订单
     *
     * @param id 订单Id
     * @return JsonResult
     */
    @PostMapping(value = "/finish")
    @ResponseBody
    public JsonResult finish(@RequestParam("id") Long id) {
        Order order = orderService.get(id);
        if (order == null) {
            return JsonResult.error("订单不存在");
        }

        order.setStatus(OrderStatusEnum.FINISHED.getCode());
        orderService.update(order);
        return JsonResult.success("完结成功");
    }

    /**
     * 关闭订单
     *
     * @param id 订单Id
     * @return JsonResult
     */
    @PostMapping(value = "/close")
    @ResponseBody
    @Transactional
    public JsonResult close(@RequestParam("id") Long id) {
        // 修改订单状态
        Order order = orderService.get(id);
        if (order == null) {
            return JsonResult.error("订单不存在");
        }

        order.setStatus(OrderStatusEnum.CLOSED.getCode());
        orderService.update(order);

        return JsonResult.success("取消订单成功");
    }

    /**
     * 财务页面
     *
     * @param model
     * @return
     */
    @GetMapping("/finance")
    public String finance(@RequestParam(value = "startDate", required = false) String startDate,
                          @RequestParam(value = "endDate", required = false) String endDate,
                          @RequestParam(value = "page", defaultValue = "0") Integer pageNumber,
                          @RequestParam(value = "size", defaultValue = "10") Integer pageSize,
                          @RequestParam(value = "sort", defaultValue = "id") String sort,
                          @RequestParam(value = "order", defaultValue = "desc") String order,
                          Model model) throws ParseException {

        Page page = PageUtil.initMpPage(pageNumber, pageSize, sort, order);
        Order condition = new Order();
        Page<Order> orderPage = null;
        Order orderCondition = new Order();
        DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
        if (StringUtils.isNotEmpty(startDate)) {
            orderCondition.setStartDate(dateFormat.parse(startDate));
        }
        if (StringUtils.isNotEmpty(endDate)) {
            orderCondition.setEndDate(dateFormat.parse(endDate));
        }
        if (loginUserIsUser()) {
            // 用户
            orderCondition.setUserId(getLoginUserId());
        }
        orderPage = orderService.findAll(orderCondition, page);

        model.addAttribute("orders", orderPage.getRecords());
        model.addAttribute("pageInfo", PageUtil.convertPageVo(page));

        Integer totalPrice = orderService.getTotalPriceSum(condition);
        model.addAttribute("totalPrice", totalPrice == null ? 0 : totalPrice);
        model.addAttribute("startDate", startDate);
        model.addAttribute("endDate", endDate);
        return "admin/admin_finance";
    }


}


================================================
FILE: src/main/java/com/example/sens/controller/admin/PermissionController.java
================================================
package com.example.sens.controller.admin;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.example.sens.entity.Permission;
import com.example.sens.dto.JsonResult;
import com.example.sens.enums.ResourceTypeEnum;
import com.example.sens.service.PermissionService;
import com.example.sens.util.PageUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * 后台权限管理控制器
 */
@Slf4j
@Controller
@RequestMapping(value = "/admin/permission")
public class PermissionController {


    @Autowired
    private PermissionService permissionService;

    /**
     * 查询所有权限并渲染permission页面
     *
     * @return 模板路径admin/admin_permission
     */
    @GetMapping
    public String permissions(@RequestParam(value = "page", defaultValue = "1") Integer pageNumber,
                              @RequestParam(value = "size", defaultValue = "10") Integer pageSize,
                              @RequestParam(value = "sort", defaultValue = "id") String sort,
                              @RequestParam(value = "order", defaultValue = "asc") String order, Model model) {
        //权限列表
        Page page = PageUtil.initMpPage(pageNumber, pageSize, sort, order);

        Page<Permission> permissions = permissionService.findAll(page);
        model.addAttribute("permissionList", permissions.getRecords());
        model.addAttribute("pageInfo", PageUtil.convertPageVo(page));

        // 所有权限
        model.addAttribute("permissions", getPermissionList());
        return "admin/admin_permission";
    }

    /**
     * 新增/修改权限
     *
     * @param permission permission对象
     * @return 重定向到/admin/permission
     */
    @PostMapping(value = "/save")
    public String savePermission(@ModelAttribute Permission permission) {
        permissionService.insertOrUpdate(permission);
        return "redirect:/admin/permission";
    }

    /**
     * 删除权限
     *
     * @param permissionId 权限Id
     * @return JsonResult
     */
    @DeleteMapping(value = "/delete")
    @ResponseBody
    public JsonResult checkDelete(@RequestParam("id") Long permissionId) {
//        // 请先删除子权限
        Integer childCount = permissionService.countChildPermission(permissionId);
        if (childCount > 0) {
            return JsonResult.error("请先删除子节点");
        }
        permissionService.delete(permissionId);
        return JsonResult.success();
    }

    /**
     * 跳转到新增页面
     *
     * @param model model
     * @return 模板路径admin/admin_permission
     */
    @GetMapping(value = "/new")
    public String toAddPermission(Model model) {
        // 带有等级的权限列表
        model.addAttribute("permissionList", permissionService.findPermissionListWithLevel());
        // 权限列表
        model.addAttribute("permissions", getPermissionList());
        return "admin/admin_permission_new";
    }

    /**
     * 跳转到修改页面
     *
     * @param permissionId permissionId
     * @param model        model
     * @return 模板路径admin/admin_permission
     */
    @GetMapping(value = "/edit")
    public String toEditPermission(Model model, @RequestParam("id") Long permissionId) {
        //更新的权限
        Permission permission = permissionService.get(permissionId);
        model.addAttribute("updatePermission", permission);

        // 带有等级的权限列表
        model.addAttribute("permissionList", permissionService.findPermissionListWithLevel());
        // 权限列表
        model.addAttribute("permissions", getPermissionList());
        // 设置URL为编辑的URL
        return "admin/admin_permission_edit";
    }


    /**
     * 所有权限
     * @return
     */
    public List<Permission> getPermissionList() {
        //权限列表
        QueryWrapper queryWrapper = new QueryWrapper();
        queryWrapper.orderByAsc("sort");
        List<Permission> permissions = permissionService.findAll(queryWrapper);
        // 设置URL为编辑的URL
        for (Permission permission : permissions) {
            permission.setUrl("/admin/permission/edit?id=" + permission.getId());
            if (ResourceTypeEnum.MENU.getCode().equals(permission.getResourceType())) {
                permission.setName(permission.getName() + "[" + ResourceTypeEnum.MENU.getDescription() + "]");
            } else if (ResourceTypeEnum.BUTTON.getCode().equals(permission.getResourceType())) {
                permission.setName(permission.getName() + "[" + ResourceTypeEnum.BUTTON.getDescription() + "]");
            } else if (ResourceTypeEnum.PAGE.getCode().equals(permission.getResourceType())) {
                permission.setName(permission.getName() + "[" + ResourceTypeEnum.PAGE.getDescription() + "]");
            }
        }
        return permissions;
    }
}


================================================
FILE: src/main/java/com/example/sens/controller/admin/PostController.java
================================================
package com.example.sens.controller.admin;

import cn.hutool.http.HtmlUtil;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.example.sens.controller.common.BaseController;
import com.example.sens.dto.JsonResult;
import com.example.sens.exception.MyBusinessException;
import com.example.sens.entity.*;
import com.example.sens.enums.*;
import com.example.sens.service.*;
import com.example.sens.util.PageUtil;
import com.example.sens.util.RegexUtil;
import com.example.sens.util.SensUtils;
import com.example.sens.vo.SearchVo;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;

import java.util.List;
import java.util.Objects;

/**
 * <pre>
 *     后台房屋管理控制器
 * </pre>
 *
 * @author : saysky
 * @date : 2019/12/10
 */
@Slf4j
@Controller
@RequestMapping(value = "/admin/post")
public class PostController extends BaseController {

    @Autowired
    private PostService postService;

    @Autowired
    private CityService cityService;

    @Autowired
    private CategoryService categoryService;

    @Autowired
    private OrderService orderService;

    public static final String TITLE = "title";

    public static final String CONTENT = "content";


    /**
     * 处理后台获取房屋列表的请求
     *
     * @param model model
     * @return 模板路径admin/admin_post
     */
    @GetMapping
    public String posts(Model model,
                        @RequestParam(value = "status", defaultValue = "-1") Integer status,
                        @RequestParam(value = "page", defaultValue = "1") Integer pageNumber,
                        @RequestParam(value = "size", defaultValue = "10") Integer pageSize,
                        @RequestParam(value = "sort", defaultValue = "createTime") String sort,
                        @RequestParam(value = "order", defaultValue = "desc") String order,
                        @ModelAttribute SearchVo searchVo) {

        Post condition = new Post();
        condition.setPostStatus(status);

        Page page = PageUtil.initMpPage(pageNumber, pageSize, sort, order);
        Post postCondition = new Post();
        Page<Post> postPage = postService.findPostByCondition(postCondition, page);
        List<Post> postList = postPage.getRecords();

        //封装分类和标签
        model.addAttribute("posts", postList);
        model.addAttribute("pageInfo", PageUtil.convertPageVo(page));
        model.addAttribute("status", status);
        model.addAttribute("order", order);
        model.addAttribute("sort", sort);

        model.addAttribute("type", "all");
        return "admin/admin_post";
    }

    /**
     * 我的出租
     *
     * @param model model
     * @return 模板路径admin/admin_post
     */
    @GetMapping("/lease")
    public String lease(Model model,
                        @RequestParam(value = "status", defaultValue = "-1") Integer status,
                        @RequestParam(value = "page", defaultValue = "1") Integer pageNumber,
                        @RequestParam(value = "size", defaultValue = "10") Integer pageSize,
                        @RequestParam(value = "sort", defaultValue = "createTime") String sort,
                        @RequestParam(value = "order", defaultValue = "desc") String order,
                        @ModelAttribute SearchVo searchVo) {

        Post condition = new Post();
        condition.setPostStatus(status);
        condition.setUserId(getLoginUserId());

        Page page = PageUtil.initMpPage(pageNumber, pageSize, sort, order);
        Page<Post> postPage = postService.findPostByCondition(condition, page);
        List<Post> postList = postPage.getRecords();

        //封装分类和标签
        model.addAttribute("posts", postList);
        model.addAttribute("pageInfo", PageUtil.convertPageVo(page));
        model.addAttribute("status", status);
        model.addAttribute("order", order);
        model.addAttribute("sort", sort);

        model.addAttribute("type", "lease");
        return "admin/admin_post";
    }

    /**
     * 我的租赁
     *
     * @param model model
     * @return 模板路径admin/admin_post
     */
    @GetMapping("/rent")
    public String rent(Model model,
                       @RequestParam(value = "status", defaultValue = "-1") Integer status,
                       @RequestParam(value = "page", defaultValue = "1") Integer pageNumber,
                       @RequestParam(value = "size", defaultValue = "10") Integer pageSize,
                       @RequestParam(value = "sort", defaultValue = "createTime") String sort,
                       @RequestParam(value = "order", defaultValue = "desc") String order,
                       @ModelAttribute SearchVo searchVo) {

        Page page = PageUtil.initMpPage(pageNumber, pageSize, sort, order);
        Page<Post> postPage = postService.findByRentUserId(getLoginUserId(), page);
        List<Post> postList = postPage.getRecords();

        //封装分类和标签
        model.addAttribute("posts", postList);
        model.addAttribute("pageInfo", PageUtil.convertPageVo(page));
        model.addAttribute("status", status);
        model.addAttribute("order", order);
        model.addAttribute("sort", sort);

        model.addAttribute("type", "rent");
        return "admin/admin_post";
    }


    /**
     * 处理跳转到新建房屋页面
     *
     * @return 模板路径admin/admin_editor
     */
    @GetMapping(value = "/new")
    public String newPost(Model model) {
        //所有分类
        List<Category> allCategories = categoryService.findAll();
        model.addAttribute("categories", allCategories);
        //所有城市
        List<City> cities = cityService.findAll();
        model.addAttribute("cities", cities);
        return "admin/admin_post_new";
    }


    /**
     * 添加/更新房屋
     *
     * @param post Post实体
     */
    @PostMapping(value = "/save")
    @ResponseBody
    public JsonResult pushPost(@ModelAttribute Post post) {
        if (post.getId() != null) {
            // 只允许更新部分字段
            Post temp = new Post();
            temp.setId(post.getId());
            temp.setPostContent(post.getPostContent());
            temp.setPostSummary(post.getPostSummary());
            temp.setPostEditor(post.getPostEditor());
            post = temp;
        }
        // 1、提取摘要
        int postSummary = 100;
        //房屋摘要
        String summaryText = HtmlUtil.cleanHtmlTag(post.getPostContent());
        if (summaryText.length() > postSummary) {
            String summary = summaryText.substring(0, postSummary);
            post.setPostSummary(summary);
        } else {
            post.setPostSummary(summaryText);
        }

        // 2.处理imgUrl
        String postEditor = post.getPostEditor();
        if (StringUtils.isNotEmpty(postEditor)) {
            List<String> urlList = RegexUtil.getImgSrc(postEditor);
            String imgUrl = SensUtils.listToStr(urlList);
            post.setImgUrl(imgUrl);
        }

        // 2.添加/更新入库
        if (post.getId() == null) {
            post.setUserId(getLoginUserId());
        }
        postService.insertOrUpdate(post);
        return JsonResult.success("发布成功");
    }


    /**
     * 处理房屋为发布的状态
     *
     * @param postId 房屋编号
     * @return 重定向到/admin/post
     */
    @PostMapping(value = "/revert")
    @ResponseBody
    public JsonResult moveToPublish(@RequestParam("id") Long postId) {
        Post post = postService.get(postId);
        if (post == null) {
            throw new MyBusinessException("房屋不存在");
        }
        post.setPostStatus(PostStatusEnum.ON_SALE.getCode());
        postService.update(post);
        return JsonResult.success("操作成功");
    }


    /**
     * 处理删除房屋的请求
     *
     * @param postId 房屋编号
     * @return 重定向到/admin/post
     */
    @DeleteMapping(value = "/delete")
    @ResponseBody
    public JsonResult removePost(@RequestParam("id") Long postId) {
        Post post = postService.get(postId);
        if (post == null) {
            throw new MyBusinessException("房屋不存在");
        }
        if (PostStatusEnum.OFF_SALE.getCode().equals(post.getPostStatus())) {
            throw new MyBusinessException("该房屋已出租,不能删除");
        }
        // 判断是否有有效订单
        // 如果有有效订单,不能删除
        Order order = orderService.findByPostId(postId);
        if (order != null) {
            throw new MyBusinessException("该房屋已出租,不能删除");
        }

        // 判断权限
        if(!Objects.equals(post.getUserId(), getLoginUserId()) && !loginUserIsAdmin()) {
            throw new MyBusinessException("没有权限操作");
        }

        postService.delete(postId);
        return JsonResult.success("删除成功");
    }


    /**
     * 跳转到编辑房屋页面
     *
     * @param postId 房屋编号
     * @param model  model
     * @return 模板路径admin/admin_editor
     */
    @GetMapping(value = "/edit")
    public String editPost(@RequestParam("id") Long postId, Model model) {
        Post post = postService.get(postId);
        if (post == null) {
            throw new MyBusinessException("房屋不存在");
        }

        //当前房屋分类
        Category category = categoryService.get(post.getCateId());
        post.setCategory(category);
        model.addAttribute("post", post);


        //所有分类
        List<Category> allCategories = categoryService.findAll();
        model.addAttribute("categories", allCategories);

        //所有城市
        List<City> cities = cityService.findAll();
        model.addAttribute("cities", cities);
        return "admin/admin_post_edit";
    }


}


================================================
FILE: src/main/java/com/example/sens/controller/admin/ProfileController.java
================================================
package com.example.sens.controller.admin;

import com.example.sens.common.constant.CommonConstant;
import com.example.sens.controller.common.BaseController;
import com.example.sens.entity.User;
import com.example.sens.dto.JsonResult;
import com.example.sens.service.UserService;
import com.example.sens.util.Md5Util;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;

import java.util.Objects;

/**
 * 后台用户管理控制器
 */
@Slf4j
@Controller
@RequestMapping(value = "/admin/user")
public class ProfileController extends BaseController {

    @Autowired
    private UserService userService;

    /**
     * 获取用户信息并跳转
     *
     * @return 模板路径admin/admin_profile
     */
    @GetMapping("/profile")
    public String profile(Model model) {
        User user = userService.get(getLoginUserId());
        model.addAttribute("user", user);
        return "admin/admin_profile";
    }

    /**
     * 获取用户信息并跳转
     *
     * @return 模板路径admin/admin_info
     */
    @GetMapping("/info")
    public String info(@RequestParam("userId") Long userId,  Model model) {
        //1.用户信息
        User user = userService.get(userId);
        if(user == null) {
            return this.renderNotFound();
        }
        model.addAttribute("user", user);
        return "admin/admin_user_info";
    }


    /**
     * 处理修改用户资料的请求
     *
     * @param user user
     * @return JsonResult
     */
    @PostMapping(value = "/profile/save")
    @ResponseBody
    public JsonResult saveProfile(@ModelAttribute User user) {
        User loginUser = getLoginUser();

        User saveUser = userService.get(loginUser.getId());
        saveUser.setId(loginUser.getId());
        saveUser.setUserName(user.getUserName());
        saveUser.setUserDisplayName(user.getUserDisplayName());
        saveUser.setUserAvatar(user.getUserAvatar());
        saveUser.setUserDesc(user.getUserDesc());
        saveUser.setIdCard(user.getIdCard());
        saveUser.setEmail(user.getEmail());
        saveUser.setPhone(user.getPhone());
        userService.insertOrUpdate(saveUser);
        return JsonResult.success("资料修改成功,请重新登录");
    }


    /**
     * 处理修改密码的请求
     *
     * @param beforePass 旧密码
     * @param newPass    新密码
     * @return JsonResult
     */
    @RequestMapping(method = RequestMethod.POST, value = "/changePass")
    @ResponseBody
    public JsonResult changePass(@RequestParam(value = "id", required = false) Long id,
                                 @RequestParam(value = "beforePass", required = false) String beforePass,
                                 @RequestParam("newPass") String newPass) {
        User loginUser = getLoginUser();
        if (id == null) {
            // 用户修改密码
            User user = userService.get(loginUser.getId());
            if (user != null && Objects.equals(user.getUserPass(), Md5Util.toMd5(beforePass, CommonConstant.PASSWORD_SALT, 10))) {
                userService.updatePassword(user.getId(), newPass);
            } else {
                return JsonResult.error("旧密码错误");
            }
        } else {
            // 管理员修改用户密码
            if (!loginUserIsAdmin()) {
                return JsonResult.error("无权操作");
            }
            userService.updatePassword(id, newPass);
        }

        return JsonResult.success("密码重置成功");
    }


}


================================================
FILE: src/main/java/com/example/sens/controller/admin/RechargeRecordController.java
================================================
package com.example.sens.controller.admin;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.example.sens.controller.common.BaseController;
import com.example.sens.dto.JsonResult;
import com.example.sens.entity.RechargeRecord;
import com.example.sens.entity.User;
import com.example.sens.service.RechargeRecordService;
import com.example.sens.service.UserService;
import com.example.sens.util.PageUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;

import java.util.Date;

/**
 * @author 言曌
 * @date 2020/3/17 11:39 下午
 */
@Slf4j
@Controller
@RequestMapping(value = "/admin/rechargeRecord")
public class RechargeRecordController extends BaseController {

    @Autowired
    private RechargeRecordService rechargeRecordService;

    @Autowired
    private UserService userService;

    /**
     * 查询所有充值记录并渲染rechargeRecord页面
     *
     * @return 模板路径admin/admin_rechargeRecord
     */
    @GetMapping
    public String rechargeRecords(@RequestParam(value = "startDate", defaultValue = "") String startDate,
                                  @RequestParam(value = "endDate", defaultValue = "") String endDate,
                                  @RequestParam(value = "page", defaultValue = "1") Integer pageNumber,
                                  @RequestParam(value = "size", defaultValue = "10") Integer pageSize,
                                  @RequestParam(value = "sort", defaultValue = "createTime") String sort,
                                  @RequestParam(value = "order", defaultValue = "desc") String order, Model model) {
        Page page = PageUtil.initMpPage(pageNumber, pageSize, sort, order);
        Page<RechargeRecord> rechargeRecords = null;

        if (loginUserIsAdmin()) {
            rechargeRecords = rechargeRecordService.findAll(startDate, endDate, page);
        } else {
            rechargeRecords = rechargeRecordService.findByUserId(startDate, endDate, getLoginUserId(), page);
        }

        model.addAttribute("rechargeRecords", rechargeRecords.getRecords());
        model.addAttribute("pageInfo", PageUtil.convertPageVo(page));
        model.addAttribute("startDate", startDate);
        model.addAttribute("endDate", endDate);
        return "admin/admin_rechargeRecord";
    }


    /**
     * 删除充值记录
     *
     * @param rechargeRecordId 充值记录Id
     * @return JsonResult
     */
    @DeleteMapping(value = "/delete")
    @ResponseBody
    public JsonResult checkDelete(@RequestParam("id") Long rechargeRecordId) {
        rechargeRecordService.delete(rechargeRecordId);
        return JsonResult.success("删除充值记录成功");
    }


    /**
     * 充值界面
     *
     * @return JsonResult
     */
    @GetMapping(value = "/new")
    public String rechargePage(Model model) {
        User user = userService.get(getLoginUserId());
        model.addAttribute("currentMoney", user.getMoney());
        return "admin/admin_rechargeRecord_new";
    }

    /**
     * 充值保存
     *
     * @param money
     * @return
     */
    @PostMapping(value = "/save")
    @ResponseBody
    public JsonResult recharge(@RequestParam("money") Long money) {
        if (money > 10000 || money < 10) {
            return JsonResult.error("充值金额不合法(最少10元,最多1万元)");
        }
        // 充值操作
        // 忽略,假设直接充值成功
        // 修改余额
        User loginUser = getLoginUser();
        User user = userService.get(loginUser.getId());
        user.setMoney(user.getMoney() + money);
        userService.insertOrUpdate(user);

        // 添加充值记录
        RechargeRecord rechargeRecord = new RechargeRecord();
        rechargeRecord.setUserId(loginUser.getId());
        rechargeRecord.setMoney(money);
        rechargeRecord.setCreateTime(new Date());
        rechargeRecordService.insert(rechargeRecord);
        return JsonResult.success("充值成功", user.getMoney());
    }
}


================================================
FILE: src/main/java/com/example/sens/controller/admin/RoleController.java
================================================
package com.example.sens.controller.admin;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.example.sens.entity.Permission;
import com.example.sens.entity.Role;
import com.example.sens.dto.JsonResult;
import com.example.sens.enums.ResourceTypeEnum;
import com.example.sens.service.PermissionService;
import com.example.sens.service.RoleService;
import com.example.sens.util.PageUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.logging.log4j.util.Strings;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

/**
 * 后台角色管理控制器
 */
@Slf4j
@Controller
@RequestMapping(value = "/admin/role")
public class RoleController {

    @Autowired
    private RoleService roleService;

    @Autowired
    private PermissionService permissionService;

    /**
     * 查询所有角色并渲染role页面
     *
     * @return 模板路径admin/admin_role
     */
    @GetMapping
    public String roles(@RequestParam(value = "page", defaultValue = "1") Integer pageNumber,
                        @RequestParam(value = "size", defaultValue = "10") Integer pageSize,
                        @RequestParam(value = "sort", defaultValue = "level") String sort,
                        @RequestParam(value = "order", defaultValue = "desc") String order, Model model) {
        //角色列表
        Page page = PageUtil.initMpPage(pageNumber, pageSize, sort, order);

        Page<Role> roles = roleService.findAll(page);
        model.addAttribute("roles", roles.getRecords());
        model.addAttribute("pageInfo", PageUtil.convertPageVo(page));

        return "admin/admin_role";
    }

    /**
     * 新增/修改角色
     *
     * @param role role对象
     * @return 重定向到/admin/role
     */
    @PostMapping(value = "/save")
    @ResponseBody
    public JsonResult saveRole(@ModelAttribute Role role,
                               @RequestParam(value = "permissionIds") String permissionIds) {

        if (Strings.isNotEmpty(permissionIds)) {
            String[] arr = permissionIds.split(",");
            List<Permission> permissions = new ArrayList<>();
            for (String permissionId : arr) {
                Permission permission = new Permission();
                permission.setId(Long.valueOf(permissionId));
                permissions.add(permission);
            }
            role.setPermissions(permissions);
        }
        roleService.insertOrUpdate(role);
        return JsonResult.success();
    }

    /**
     * 删除角色
     *
     * @param roleId 角色Id
     * @return JsonResult
     */
    @DeleteMapping(value = "/delete")
    @ResponseBody
    public JsonResult checkDelete(@RequestParam("id") Long roleId) {
        //判断这个角色有没有用户
        Integer userCount = roleService.countUserByRoleId(roleId);
        if (userCount != 0) {
            return JsonResult.error("当前角色已关联用户,无法删除");
        }
        roleService.delete(roleId);
        return JsonResult.success("删除角色成功");
    }


    /**
     * 添加用户页面
     *
     * @return 模板路径admin/admin_edit
     */
    @GetMapping("/new")
    public String addRole(Model model) {
        // 所有权限
        model.addAttribute("permissions", getPermissionList());
        return "admin/admin_role_add";
    }

    /**
     * 跳转到修改页面
     *
     * @param roleId roleId
     * @param model  model
     * @return 模板路径admin/admin_role
     */
    @GetMapping(value = "/edit")
    public String toEditRole(Model model, @RequestParam("id") Long roleId) {
        //更新的角色
        Role role = roleService.findByRoleId(roleId);
        //当前角色的权限列表
        role.setPermissions(permissionService.listPermissionsByRoleId(roleId));
        model.addAttribute("updateRole", role);

        // 所有权限
        model.addAttribute("permissions", getPermissionList());

        // 当前角色的权限列表
        List<Long> currentPermissionIds = permissionService.findPermissionByRoleId(roleId).stream().map(p -> p.getId()).collect(Collectors.toList());
        model.addAttribute("currentPermissionIds", currentPermissionIds);
        return "admin/admin_role_edit";
    }

    /**
     * 所有权限
     * @return
     */
    public List<Permission> getPermissionList() {
        //权限列表
        QueryWrapper queryWrapper = new QueryWrapper();
        queryWrapper.orderByAsc("sort");
        List<Permission> permissions = permissionService.findAll(queryWrapper);
        // 设置URL为编辑的URL
        for (Permission permission : permissions) {
            permission.setUrl("/admin/permission/edit?id=" + permission.getId());
            if (ResourceTypeEnum.MENU.getCode().equals(permission.getResourceType())) {
                permission.setName(permission.getName() + "[" + ResourceTypeEnum.MENU.getDescription() + "]");
            } else if (ResourceTypeEnum.BUTTON.getCode().equals(permission.getResourceType())) {
                permission.setName(permission.getName() + "[" + ResourceTypeEnum.BUTTON.getDescription() + "]");
            } else if (ResourceTypeEnum.PAGE.getCode().equals(permission.getResourceType())) {
                permission.setName(permission.getName() + "[" + ResourceTypeEnum.PAGE.getDescription() + "]");
            }
        }
        return permissions;
    }
}


================================================
FILE: src/main/java/com/example/sens/controller/admin/UserController.java
================================================
package com.example.sens.controller.admin;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.example.sens.common.constant.CommonConstant;
import com.example.sens.entity.*;
import com.example.sens.enums.RoleEnum;
import com.example.sens.service.*;
import com.example.sens.controller.common.BaseController;
import com.example.sens.dto.JsonResult;
import com.example.sens.util.Md5Util;
import com.example.sens.util.PageUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * 后台用户管理控制器
 */
@Slf4j
@Controller
@RequestMapping(value = "/admin/user")
public class UserController extends BaseController {

    @Autowired
    private UserService userService;

    @Autowired
    private RoleService roleService;


    @Autowired
    private UserRoleRefService userRoleRefService;


    public static final String USER_NAME = "userName";
    public static final String USER_DISPLAY_NAME = "userDisplayName";
    public static final String EMAIL = "email";

    /**
     * 查询所有分类并渲染user页面
     *
     * @return 模板路径admin/admin_user
     */
    @GetMapping
    public String users(
            @RequestParam(value = "status", defaultValue = "0") Integer status,
            @RequestParam(value = "keywords", defaultValue = "") String keywords,
            @RequestParam(value = "searchType", defaultValue = "") String searchType,
            @RequestParam(value = "page", defaultValue = "1") Integer pageNumber,
            @RequestParam(value = "size", defaultValue = "10") Integer pageSize,
            @RequestParam(value = "sort", defaultValue = "createTime") String sort,
            @RequestParam(value = "order", defaultValue = "desc") String order, Model model) {
        //用户列表
        Page page = PageUtil.initMpPage(pageNumber, pageSize, sort, order);
        User condition = new User();
        condition.setStatus(status);
        if (!StringUtils.isBlank(keywords)) {
            if (USER_NAME.equals(searchType)) {
                condition.setUserName(keywords);
            } else if (USER_DISPLAY_NAME.equals(searchType)) {
                condition.setUserDisplayName(keywords);
            } else if (EMAIL.equals(searchType)) {
                condition.setIdCard(keywords);
            }
        }
        Page<User> users = userService.findByRoleAndCondition(CommonConstant.NONE, condition, page);
        for(User user : users.getRecords()) {
            user.setRole(roleService.findByUserId(user.getId()));
        }

        model.addAttribute("users", users.getRecords());
        model.addAttribute("pageInfo", PageUtil.convertPageVo(page));
        model.addAttribute("status", status);
        model.addAttribute("keywords", keywords);
        model.addAttribute("searchType", searchType);
        model.addAttribute("sort", sort);
        model.addAttribute("order", order);
        return "admin/admin_user";
    }



    /**
     * 删除用户
     *
     * @param userId 用户Id
     * @return JsonResult
     */
    @DeleteMapping(value = "/delete")
    @ResponseBody
    public JsonResult removeUser(@RequestParam("id") Long userId) {
        userService.delete(userId);
        return JsonResult.success("删除成功");
    }

    /**
     * 添加用户页面
     *
     * @return 模板路径admin/admin_edit
     */
    @GetMapping("/new")
    public String addUser(Model model) {

        //角色列表
        List<Role> roles = roleService.findAll();
        model.addAttribute("roles", roles);

        return "admin/admin_user_add";
    }

    /**
     * 编辑用户页面
     *
     * @return 模板路径admin/admin_edit
     */
    @GetMapping("/edit")
    public String edit(@RequestParam("id") Long userId, Model model) {
        User user = userService.get(userId);
        if (user != null) {
            model.addAttribute("user", user);
            //该用户的角色
            Role currentRole = roleService.findByUserId(userId);
            model.addAttribute("currentRole", currentRole);

            //角色列表
            List<Role> roles = roleService.findAll();
            model.addAttribute("roles", roles);


            return "admin/admin_user_edit";
        }
        return this.renderNotFound();
    }

    /**
     * 批量删除
     *
     * @param ids 用户ID列表
     * @return
     */
    @DeleteMapping(value = "/batchDelete")
    @ResponseBody
    public JsonResult batchDelete(@RequestParam("ids") List<Long> ids) {
        //批量操作
        if (ids == null || ids.size() == 0 || ids.size() >= 100) {
            return JsonResult.error("参数不合法!");
        }
        List<User> userList = userService.findByBatchIds(ids);
        for (User user : userList) {
            userService.delete(user.getId());
        }
        return JsonResult.success("删除成功");
    }

    /**
     * 新增/修改用户
     *
     * @param user user
     * @return 重定向到/admin/user
     */
    @PostMapping(value = "/save")
    @ResponseBody
    @Transactional(rollbackFor = Exception.class)
    public JsonResult saveUser(@ModelAttribute User user,
                               @RequestParam(value = "roleId", required = false) Long roleId) {
        // 1.添加用户
        if(user.getId() == null) {
            user.setUserPass(Md5Util.toMd5(user.getUserPass(), CommonConstant.PASSWORD_SALT, 10));
        }
        userService.insertOrUpdate(user);
        if(roleId != null) {
            // 2.先删除该用户的角色关联
            userRoleRefService.deleteByUserId(user.getId());
            // 3.添加角色关联
            userRoleRefService.insert(new UserRoleRef(user.getId(), roleId));
        }
        return JsonResult.success("保存成功");
    }

}


================================================
FILE: src/main/java/com/example/sens/controller/common/BaseController.java
================================================
package com.example.sens.controller.common;

import com.example.sens.entity.User;
import com.example.sens.enums.RoleEnum;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.subject.Subject;

/**
 * Controller抽象类
 */
public abstract class BaseController {

    /**
     * 渲染404页面
     *
     * @return redirect:/404
     */
    public String renderNotFound() {
        return "forward:/404";
    }


    /**
     * 渲染404页面
     *
     * @return redirect:/404
     */
    public String renderNotAllowAccess() {
        return "redirect:/403";
    }

    /**
     * 当前登录用户
     *
     * @return
     */
    public User getLoginUser() {
        Subject subject = SecurityUtils.getSubject();
        if (subject.isAuthenticated()) {
            return (User) subject.getPrincipal();
        }
        return null;
    }

    /**
     * 当前用户ID
     *
     * @return
     */
    public Long getLoginUserId() {
        return getLoginUser().getId();
    }

    /**
     * 当前用户是管理员
     *
     * @return
     */
    public Boolean loginUserIsAdmin() {
        User loginUser = getLoginUser();
        if (loginUser != null) {
            return  RoleEnum.ADMIN.getValue().equalsIgnoreCase(loginUser.getRole().getRole());
        }
        return false;
    }

    /**
     * 当前用户是消费者
     *
     * @return
     */
    public Boolean loginUserIsUser() {
        User loginUser = getLoginUser();
        if (loginUser != null) {
            return RoleEnum.USER.getValue().equalsIgnoreCase(loginUser.getRole().getRole());
        }
        return false;
    }


}


================================================
FILE: src/main/java/com/example/sens/controller/common/CommonController.java
================================================
package com.example.sens.controller.common;

import com.example.sens.enums.CommonParamsEnum;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.web.servlet.error.ErrorController;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;

import javax.servlet.http.HttpServletRequest;

/**
 * 错误页面控制器
 */
@Slf4j
@Controller
public class CommonController implements ErrorController {


    /**
     * 渲染404,500
     *
     * @param request request
     * @return String
     */
    @GetMapping(value = "/error")
    public String handleError(HttpServletRequest request) {
        Integer statusCode = (Integer) request.getAttribute("javax.servlet.error.status_code");
        if (statusCode.equals(CommonParamsEnum.NOT_FOUND.getValue())) {
            return "redirect:/404";
        } else {
            return "redirect:/500";
        }
    }

    /**
     * 渲染403页面
     *
     * @return String
     */
    @GetMapping(value = "/403")
    public String fourZeroThree() {
        return "common/error/403";
    }


    /**
     * 渲染404页面
     *
     * @return String
     */
    @GetMapping(value = "/404")
    public String fourZeroFour() {
        return "common/error/404";
    }


    /**
     * 渲染500页面
     *
     * @return String
     */
    @GetMapping(value = "/500")
    public String fiveZeroZero() {
        return "common/error/500";
    }

    /**
     * Returns the path of the error page.
     *
     * @return the error path
     */
    @Override
    public String getErrorPath() {
        return "/error";
    }
}


================================================
FILE: src/main/java/com/example/sens/controller/home/FrontPostController.java
================================================
package com.example.sens.controller.home;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.example.sens.controller.common.BaseController;
import com.example.sens.dto.JsonResult;
import com.example.sens.entity.*;
import com.example.sens.enums.OrderStatusEnum;
import com.example.sens.enums.PostStatusEnum;
import com.example.sens.service.*;
import com.example.sens.util.DateUtil;
import com.example.sens.util.FileUtil;
import com.example.sens.util.PageUtil;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;

import javax.servlet.ServletInputStream;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;

/**
 * @author 言曌
 * @date 2020/3/11 4:59 下午
 */
@Controller
public class FrontPostController extends BaseController {

    @Autowired
    private CategoryService categoryService;

    @Autowired
    private PostService postService;

    @Autowired
    private CityService cityService;

    @Autowired
    private OrderService orderService;

    @Autowired
    private UserService userService;

    /**
     * 房屋列表
     *
     * @param model
     * @return
     */
    @GetMapping("/post")
    public String postList(@RequestParam(value = "page", defaultValue = "1") Integer pageNumber,
                           @RequestParam(value = "size", defaultValue = "6") Integer pageSize,
                           @RequestParam(value = "sort", defaultValue = "createTime") String sort,
                           @RequestParam(value = "order", defaultValue = "desc") String order,
                           @RequestParam(value = "postTitle", defaultValue = "") String postTitle,
                           @RequestParam(value = "cityId", defaultValue = "-1") Long cityId,
                           @RequestParam(value = "cateId", defaultValue = "-1") Long cateId,
                           @RequestParam(value = "area", defaultValue = "") String area,
                           @RequestParam(value = "price", defaultValue = "") String price,
                           @RequestParam(value = "status", defaultValue = "-1") Integer status,
                           HttpSession session,
                           Model model) {
        Post condition = new Post();

        List<Category> categoryList = categoryService.findAll();
        model.addAttribute("categoryList", categoryList);


        List<City> cityList = cityService.findAll();
        model.addAttribute("cityList", cityList);

        model.addAttribute("postCount", postService.count(null));

        try {
            if (StringUtils.isNotEmpty(price)) {
                String[] priceArr = price.split("-");
                if (priceArr.length == 2) {
                    condition.setMinPrice(Integer.valueOf(priceArr[0]));
                    condition.setMaxPrice(Integer.valueOf(priceArr[1]));
                }
            }
            if (StringUtils.isNotEmpty(area)) {
                String[] areaArr = price.split("-");
                if (areaArr.length == 2) {
                    condition.setMinArea(Integer.valueOf(areaArr[0]));
                    condition.setMaxArea(Integer.valueOf(areaArr[1]));
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

        // 查询日期列表
        Page page = PageUtil.initMpPage(pageNumber, pageSize, sort, order);
        condition.setPostTitle(postTitle);
        condition.setPostStatus(status);
        condition.setCateId(cateId);
        condition.setCityId(cityId);

        Page<Post> postPage = postService.findPostByCondition(condition, page);
        model.addAttribute("page", postPage);
        model.addAttribute("postTitle", postTitle);
        model.addAttribute("cityId", cityId);
        model.addAttribute("cateId", cateId);
        model.addAttribute("status", status);
        model.addAttribute("area", area);
        model.addAttribute("price", price);

        // 侧边栏
        model.addAttribute("onCount", postService.countByStatus(PostStatusEnum.ON_SALE.getCode()));
        model.addAttribute("offCount", postService.countByStatus(PostStatusEnum.OFF_SALE.getCode()));

        if (cityId != null && cityId != -1) {
            City city = cityService.get(cityId);
            if (city != null) {
                session.setAttribute("city", city);
            }
        } else {
            session.removeAttribute("city");
        }
        return "home/postList";
    }


    /**
     * 房屋详情
     *
     * @param id
     * @param model
     * @return
     */
    @GetMapping("/post/{id}")
    public String postDetails(@PathVariable("id") Long id,
                              @RequestParam(value = "startDate", required = false) String start,
                              @RequestParam(value = "quantity", defaultValue = "1") Integer quantity,
                              HttpSession session,
                              Model model) {

        // 房屋
        Post post = postService.get(id);
        if (post == null) {
            return renderNotFound();
        }
        // 分类和城市
        Category category = categoryService.get(post.getCateId());
        City city = cityService.get(post.getCityId());
        User user = userService.get(post.getUserId());

        post.setCategory(category);
        post.setCity(city);
        post.setUser(user);
        model.addAttribute("post", post);

        boolean allowEdit = getLoginUser() != null && (loginUserIsAdmin() || Objects.equals(post.getUserId(), getLoginUserId()));
        model.addAttribute("allowEdit", allowEdit);

        String[] imgUrlList = post.getImgUrl().split(",");
        model.addAttribute("imgUrlList", imgUrlList);

        List<Category> categoryList = categoryService.findAll();
        model.addAttribute("categoryList", categoryList);
        List<City> cityList = cityService.findAll();
        model.addAttribute("cityList", cityList);

        City citySession = (City) session.getAttribute("city");
        Long cityId = citySession == null ? null : citySession.getId();
        List<Post> latestPostList = postService.getLatestPost(cityId, 6);
        model.addAttribute("latestPostList", latestPostList);

        // 可以考虑优化下,暂时没有时间优化
        List<Post> unionRentPost = postService.getUnionRentPost(post);
        List<Order> orderList = new ArrayList<>();
        for (Post temp : unionRentPost) {
            Order order = orderService.findByPostId(temp.getId());
            if (order == null) {
                order = new Order();
            } else {
                order.setUser(userService.get(order.getUserId()));
            }
            order.setPost(temp);
            orderList.add(order);
        }
        model.addAttribute("orderList", orderList);
        return "home/post";
    }


    /**
     * 结算页面
     *
     * @param postId
     * @param start
     * @param quantity
     * @param model
     * @return
     */
    @GetMapping("/checkout")
    public String checkout(@RequestParam("postId") Long postId,
                           @RequestParam(value = "startDate", required = false) String start,
                           @RequestParam(value = "quantity", defaultValue = "1") Integer quantity,
                           Model model) {
        DateFormat dateFormat = new SimpleDateFormat(DateUtil.FORMAT);

        if (quantity == null || quantity < 1) {
            quantity = 1;
        }

        Date today = new Date();

        // 判断入住日期是否合法
        if (StringUtils.isEmpty(start)) {
            start = dateFormat.format(today);
        } else {
            try {
                Date startDate = dateFormat.parse(start);
                if (startDate.before(today)) {
                    start = dateFormat.format(today);
                }
            } catch (ParseException e) {
                start = dateFormat.format(today);
                e.printStackTrace();
            }
        }

        Post post = postService.get(postId);
        if (post == null) {
            return this.renderNotFound();
        }

        User user = getLoginUser();
        if (user == null) {
            return "redirect:/";
        }

        // 分类列表
        List<Category> categoryList = categoryService.findAll();
        model.addAttribute("categoryList", categoryList);
        List<City> cityList = cityService.findAll();
        model.addAttribute("cityList", cityList);
        model.addAttribute("post", post);
        model.addAttribute("startDate", start);
        model.addAttribute("quantity", quantity);
        model.addAttribute("user", user);
        return "home/checkout";
    }


    /**
     * 创建订单
     *
     * @param postId
     * @param quantity
     * @return
     */
    @PostMapping("/order")
    @Transactional
    @ResponseBody
    public JsonResult addOrder(@RequestParam(value = "postId") Long postId,
                               @RequestParam(value = "quantity") Integer quantity) {
        User user = getLoginUser();
        if (user == null) {
            return JsonResult.error("请先登录");
        }

        if (quantity == null || quantity < 1 || quantity > 12) {
            return JsonResult.error("月数不合法");
        }

        Post post = postService.get(postId);
        if (post == null) {
            return JsonResult.error("房屋不存在");
        }

        if (Objects.equals(post.getUserId(), user.getId())) {
            return JsonResult.error("不能租赁自己的房子哦");
        }

        if (!PostStatusEnum.ON_SALE.getCode().equals(post.getPostStatus())) {
            return JsonResult.error("房屋已租出,暂时无法预定");
        }

        Date today = new Date();
        Calendar cal = Calendar.getInstance();
        cal.setTime(today);
        cal.add(Calendar.MONTH, quantity);

        // 添加订单
        Order order = new Order();
        order.setPostId(postId);
        order.setQuantity(quantity);
        order.setStartDate(today);
        order.setEndDate(cal.getTime());
        order.setUserId(user.getId());
        order.setOwnerUserId(post.getUserId());
        order.setStatus(OrderStatusEnum.NOT_PAY.getCode());
        order.setPrice(post.getPrice() * quantity + post.getDeposit());
        order.setCreateTime(new Date());
        order.setUpdateTime(new Date());
        orderService.insert(order);

        return JsonResult.success("订单创建成功", order.getId());
    }

    @GetMapping("/order/{id}")
    public String order(@PathVariable("id") Long id, Model model) {
        Order order = orderService.get(id);
        if (order == null) {
            return this.renderNotFound();
        }

        User user = getLoginUser();
        if (user == null) {
            return "redirect:/login";
        }

        if (!Objects.equals(user.getId(), order.getUserId()) && !Objects.equals(user.getId(), order.getOwnerUserId()) && !loginUserIsAdmin()) {
            return this.renderNotAllowAccess();
        }
        model.addAttribute("order", order);


        // 分类列表
        List<Category> categoryList = categoryService.findAll();
        model.addAttribute("categoryList", categoryList);
        List<City> cityList = cityService.findAll();
        model.addAttribute("cityList", cityList);
        model.addAttribute("user", userService.get(order.getUserId()));
        return "home/order";
    }

    /**
     * 电子合同
     *
     * @param orderId
     * @return
     */
    @GetMapping("/agreement")
    public String agreement(@RequestParam("orderId") Long orderId, Model model) {
        Order order = orderService.get(orderId);

        if (order == null) {
            return this.renderNotFound();
        }

        Post post = postService.get(order.getPostId());
        order.setPost(post);

        order.setUser(userService.get(order.getUserId()));
        order.setOwnerUser(userService.get(order.getOwnerUserId()));
//        User user = getLoginUser();
//        if (user == null) {
//            return "redirect:/login";
//        }
//
//        if (!Objects.equals(user.getId(), order.getUserId()) && !Objects.equals(user.getId(), order.getOwnerUserId()) && !loginUserIsAdmin()) {
//            return this.renderNotAllowAccess();
//        }

        model.addAttribute("order", order);
        List<City> cityList = cityService.findAll();
        model.addAttribute("cityList", cityList);
        List<Category> categoryList = categoryService.findAll();
        model.addAttribute("categoryList", categoryList);
        return "home/agreement";
    }


    /**
     * 下载合同
     *
     * @param orderId
     * @param response
     */
    @GetMapping("/agreement/download")
    public void agreementDownload(@RequestParam("orderId") Long orderId,
                                  HttpServletRequest request,
                                  HttpServletResponse response) {


        StringBuffer requestURL = request.getRequestURL();
        String tempContextUrl = requestURL.delete(requestURL.length() - request.getRequestURI().length(), requestURL.length()).append("/").toString();
        ServletOutputStream out = null;
        InputStream inputStream = null;
        try {
            Order order = orderService.get(orderId);

            User user = userService.get(order.getUserId());
            User ownerUser = userService.get(order.getOwnerUserId());
            String pdfName = ownerUser.getUserDisplayName() + "&" + user.getUserDisplayName() + "租房合同.html";
            // 获取外部文件流
            URL url = new URL(tempContextUrl + "agreement?orderId=" + orderId);

            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            conn.setConnectTimeout(3 * 1000);
            //防止屏蔽程序抓取而返回403错误
            conn.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)");
            inputStream = conn.getInputStream();
            int len = 0;
            // 输出 下载的响应头,如果下载的文件是中文名,文件名需要经过url编码
            response.setContentType("text/html;charset=utf-8");
            response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(pdfName, "UTF-8"));
            response.setHeader("Cache-Control", "no-cache");
            out = response.getOutputStream();
            byte[] buffer = new byte[1024];
            while ((len = inputStream.read(buffer)) > 0) {
                out.write(buffer, 0, len);
            }
            out.flush();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (out != null) {
                try {
                    out.close();
                } catch (Exception e) {
                }
            }
        }
    }

    /**
     * 支付页面
     *
     * @param orderId
     * @param model
     * @return
     */
    @GetMapping("/pay")
    public String pay(@RequestParam("orderId") Long orderId, Model model) {
        Order order = orderService.get(orderId);

        if (order == null) {
            return this.renderNotFound();
        }

        Post post = postService.get(order.getPostId());
        order.setPost(post);

        User user = getLoginUser();
        if (user == null) {
            return "redirect:/login";
        }

        if (!Objects.equals(user.getId(), order.getUserId()) && !Objects.equals(user.getId(), order.getOwnerUserId()) && !loginUserIsAdmin()) {
            return this.renderNotAllowAccess();
        }


        if (!Objects.equals(OrderStatusEnum.NOT_PAY.getCode(), order.getStatus())) {
            return this.renderNotAllowAccess();
        }

        model.addAttribute("order", order);

        List<City> cityList = cityService.findAll();
        model.addAttribute("cityList", cityList);
        List<Category> categoryList = categoryService.findAll();
        model.addAttribute("categoryList", categoryList);
        return "home/pay";
    }


    /**
     * 支付
     *
     * @return orderId
     */
    @PostMapping("/pay")
    @Transactional
    @ResponseBody
    public JsonResult paySuccess(@RequestParam(value = "orderId") Long orderId) {
        User user = userService.get(getLoginUserId());
        if (user == null) {
            return JsonResult.error("请先登录");
        }

        Order order = orderService.get(orderId);
        if (order == null) {
            return JsonResult.error("订单不存在");
        }

        if (user.getMoney() < order.getPrice()) {
            return JsonResult.error("余额不足,请充值");
        }

        if (!Objects.equals(user.getId(), order.getUserId())) {
            return JsonResult.error("没有权限");
        }

        Post post = postService.get(order.getPostId());
        if (post == null || !Objects.equals(post.getPostStatus(), PostStatusEnum.ON_SALE.getCode())) {
            return JsonResult.error("房屋已租出,暂时无法预定");
        }

        order.setStatus(OrderStatusEnum.HAS_PAY.getCode());
        orderService.update(order);

        post.setPostStatus(PostStatusEnum.OFF_SALE.getCode());
        postService.update(post);

        // 这里暂不用乐观锁实现,忽略并发问题
        // 我的余额减少
        user.setMoney(user.getMoney() - order.getPrice());
        userService.update(user);

        // 对方的余额增加
        User ownerUser = userService.get(order.getOwnerUserId());
        ownerUser.setMoney(ownerUser.getMoney() + order.getPrice());
        userService.update(ownerUser);


        return JsonResult.success("支付成功", order.getId());
    }


    @GetMapping("/login")
    public String login() {
        return "home/login";
    }


    @GetMapping("/register")
    public String register() {
        return "home/register";
    }


}


================================================
FILE: src/main/java/com/example/sens/controller/home/IndexController.java
================================================
package com.example.sens.controller.home;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.example.sens.controller.common.BaseController;
import com.example.sens.entity.*;
import com.example.sens.enums.PostStatusEnum;
import com.example.sens.service.*;
import com.example.sens.util.PageUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpSession;
import java.util.List;
import java.util.Objects;

/**
 * @author 言曌
 * @date 2020/3/9 11:00 上午
 */

@Controller
public class IndexController extends BaseController {

    @Autowired
    private PostService postService;

    @Autowired
    private CategoryService categoryService;

    @Autowired
    private CityService cityService;

    @Autowired
    private NoticeService noticeService;

    @GetMapping("/")
    public String index(Model model, HttpSession session) {

        List<Category> categoryList = categoryService.findAll();
        model.addAttribute("categoryList", categoryList);

        List<City> cityList = cityService.findAll();
        model.addAttribute("cityList", cityList);


        City city = (City) session.getAttribute("city");
        Long cityId = city == null ? null : city.getId();
        List<Post> latestPostList = postService.getLatestPost(cityId, 6);
        model.addAttribute("latestPostList", latestPostList);

        return "home/index";
    }

    @GetMapping("/contact")
    public String contact(Model model) {
        List<Category> categoryList = categoryService.findAll();
        model.addAttribute("categoryList", categoryList);

        List<City> cityList = cityService.findAll();
        model.addAttribute("cityList", cityList);

        return "home/contact";
    }


    /**
     * 新闻列表
     *
     * @param model
     * @return
     */
    @GetMapping("/notice")
    public String noticeList(@RequestParam(value = "page", defaultValue = "1") Integer pageNumber,
                             @RequestParam(value = "size", defaultValue = "10") Integer pageSize,
                             @RequestParam(value = "sort", defaultValue = "createTime") String sort,
                             @RequestParam(value = "order", defaultValue = "desc") String order,
                             Model model) {
        List<Category> categoryList = categoryService.findAll();
        model.addAttribute("categoryList", categoryList);

        List<City> cityList = cityService.findAll();
        model.addAttribute("cityList", cityList);

        Page page = PageUtil.initMpPage(pageNumber, pageSize, sort, order);
        Page<Notice> postPage = noticeService.findAll(page);
        model.addAttribute("page", postPage);
        model.addAttribute("noticeList", postPage.getRecords());

        return "home/noticeList";
    }


    /**
     * 新闻详情
     *
     * @param id
     * @param model
     * @return
     */
    @GetMapping("/notice/{id}")
    public String noticeDetails(@PathVariable("id") Long id,
                                @RequestParam(value = "startDate", required = false) String start,
                                @RequestParam(value = "quantity", defaultValue = "1") Integer quantity,
                                Model model) {

        // 新闻
        Notice notice = noticeService.get(id);
        if (notice == null) {
            return renderNotFound();
        }

        model.addAttribute("notice", notice);

        List<Category> categoryList = categoryService.findAll();
        model.addAttribute("categoryList", categoryList);

        List<City> cityList = cityService.findAll();
        model.addAttribute("cityList", cityList);
        return "home/notice";
    }


}


================================================
FILE: src/main/java/com/example/sens/controller/home/LoginController.java
================================================
package com.example.sens.controller.home;

import com.example.sens.common.constant.CommonConstant;
import com.example.sens.controller.common.BaseController;
import com.example.sens.entity.Role;
import com.example.sens.entity.User;
import com.example.sens.entity.UserRoleRef;
import com.example.sens.dto.JsonResult;
import com.example.sens.enums.RoleEnum;
import com.example.sens.enums.UserStatusEnum;
import com.example.sens.service.*;
import com.example.sens.util.Md5Util;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.RandomUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.IncorrectCredentialsException;
import org.apache.shiro.authc.LockedAccountException;
import org.apache.shiro.authc.UnknownAccountException;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.subject.Subject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.*;

import java.util.Set;

@Controller
@Slf4j
public class LoginController extends BaseController {

    @Autowired
    private PermissionService permissionService;

    @Autowired
    private UserService userService;

    @Autowired
    private RoleService roleService;

    @Autowired
    private UserRoleRefService userRoleRefService;

    /**
     * 验证登录信息
     *
     * @param userName 登录名:身份证号码/账号
     * @param userPass password 密码
     * @return JsonResult JsonResult
     */
    @PostMapping(value = "/login")
    @ResponseBody
    public JsonResult getLogin(@RequestParam("userName") String userName,
                               @RequestParam("userPass") String userPass) {
        Subject subject = SecurityUtils.getSubject();
        UsernamePasswordToken token = new UsernamePasswordToken(userName, userPass);
        try {
            subject.login(token);
            if (subject.isAuthenticated()) {
                //登录成功,修改登录错误次数为0
                User user = (User) subject.getPrincipal();
                Set<String> permissionUrls = permissionService.findPermissionUrlsByUserId(user.getId());
                subject.getSession().setAttribute("permissionUrls", permissionUrls);
                return JsonResult.success("登录成功");
            }
        } catch (UnknownAccountException e) {
            return JsonResult.error("账号不存在");
        } catch (IncorrectCredentialsException e) {
            e.printStackTrace();
            return JsonResult.error("账号或密码错误");
        } catch (LockedAccountException e) {
            return JsonResult.error(e.getMessage());
        } catch (Exception e) {
            e.printStackTrace();
            log.info(e.getMessage());
        }
        return JsonResult.error("服务器内部错误");
    }


    /**
     * 退出登录
     *
     * @return 重定向到/login
     */
    @GetMapping(value = "/logout")
    public String logOut() {
        Subject subject = SecurityUtils.getSubject();
        subject.logout();
        return "redirect:/";
    }

    /**
     * 退出登录
     *
     * @return 重定向到/login
     */
    @PostMapping(value = "/logout")
    @ResponseBody
    public JsonResult ajaxLogOut() {
        Subject subject = SecurityUtils.getSubject();
        subject.logout();
        return JsonResult.success();
    }

    /**
     * 验证注册信息
     *
     * @param userName 账号
     * @param idCard   身份证号码
     * @return JsonResult JsonResult
     */
    @PostMapping(value = "/register")
    @ResponseBody
    @Transactional
    public JsonResult getRegister(@RequestParam("userName") String userName,
                                  @RequestParam("userPass") String userPass,
                                  @RequestParam("idCard") String idCard,
                                  @RequestParam("userDisplayName") String userDisplayName) {
        // 1.校验是否输入完整
        if (StringUtils.isEmpty(userName) || StringUtils.isEmpty(userPass) || StringUtils.isEmpty(idCard)) {
            return JsonResult.error("请填写完整信息");
        }

        // 2.密码长度是否合法
        if (userPass.length() > 20 || userPass.length() < 6) {
            return JsonResult.error("用户密码长度为6-20位!");
        }

        // 3.密码长度是否合法
        Role role = roleService.findByRoleName(RoleEnum.USER.getValue());


        //3.创建用户
        User user = new User();
        user.setUserName(userName);
        user.setUserDisplayName(userDisplayName);
        user.setIdCard(idCard);
        user.setUserPass(Md5Util.toMd5(userPass, CommonConstant.PASSWORD_SALT, 10));
        user.setUserAvatar("/static/images/avatar/" + RandomUtils.nextInt(1, 41) + ".jpeg");
        user.setStatus(UserStatusEnum.NORMAL.getCode());
        userService.insert(user);

        //4.关联角色
        userRoleRefService.insert(new UserRoleRef(user.getId(), role.getId()));
        return JsonResult.success("注册成功");
    }


    /**
     * 检查用户是否登录
     *
     * @return JsonResult
     */
    @GetMapping(value = "/checkLogin")
    @ResponseBody
    public JsonResult checkLogin() {
        User user = getLoginUser();
        if (user == null) {
            return JsonResult.error("请先登录");
        } else {
            return JsonResult.success();
        }
    }


}


================================================
FILE: src/main/java/com/example/sens/dto/JsonResult.java
================================================
package com.example.sens.dto;

import lombok.Data;

/**
 * <pre>
 *     Json格式
 * </pre>
 *
 * @author : saysky
 * @date : 2018/5/24
 */
@Data
public class JsonResult {

    /**
     * 返回的状态码,0:失败,1:成功
     */
    private Integer code;

    /**
     * 返回信息
     */
    private String msg;

    /**
     * 返回的数据
     */
    private Object result;

    /**
     * 不返回数据的构造方法
     *
     * @param code 状态码
     * @param msg  信息
     */
    public JsonResult(Integer code, String msg) {
        this.code = code;
        this.msg = msg;
    }

    /**
     * 返回数据的构造方法
     *
     * @param code   状态码
     * @param msg    信息
     * @param result 数据
     */
    public JsonResult(Integer code, String msg, Object result) {
        this.code = code;
        this.msg = msg;
        this.result = result;
    }

    /**
     * 返回状态码和数据
     *
     * @param code   状态码
     * @param result 数据
     */
    public JsonResult(Integer code, Object result) {
        this.code = code;
        this.result = result;
    }

    public static JsonResult error(String msg) {
        return new JsonResult(0, msg);
    }
    public static JsonResult error(String msg, Object data) {
        return new JsonResult(0, msg, data);
    }
    public static JsonResult success() {
        return new JsonResult(1, "操作成功");
    }

    public static JsonResult success(String msg) {
        return new JsonResult(1, msg);
    }

    public static JsonResult success(String msg, Object result) {
        return new JsonResult(1, msg, result);
    }
}


================================================
FILE: src/main/java/com/example/sens/dto/PostQueryCondition.java
================================================
package com.example.sens.dto;

import lombok.Data;

import java.util.List;

/**
 * @author 言曌
 * @date 2020/3/12 4:53 下午
 */
@Data
public class PostQueryCondition {

    /**
     * 用户ID
     */
    private Long userId;


    /**
     * 分类ID
     */
    private Long cateId;

    /**
     * 预订的日期集合
     */
    private List<String> dateList;
}


================================================
FILE: src/main/java/com/example/sens/dto/QueryCondition.java
================================================
package com.example.sens.dto;

import com.example.sens.vo.SearchVo;
import lombok.Data;

import java.io.Serializable;

/**
 * 查询封装类
 * @author 言曌
 * @date 2019-08-16 13:45
 */
@Data
public class QueryCondition<T> implements Serializable {

    /**
     * 根据字段筛选
     */
    private T data;

    /**
     * 一般筛选
     */
    private SearchVo searchVo;


    public QueryCondition() {
    }

    public QueryCondition(T data) {
        this.data = data;
    }

    public QueryCondition(T data, SearchVo searchVo) {
        this.data = data;
        this.searchVo = searchVo;
    }
}


================================================
FILE: src/main/java/com/example/sens/entity/Category.java
================================================
package com.example.sens.entity;

import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import com.example.sens.common.base.BaseEntity;
import lombok.Data;

/**
 * <pre>
 *     房屋分类
 * </pre>
 *
 * @author : saysky
 * @date : 2019/11/30
 */
@Data
@TableName("category")
public class Category extends BaseEntity {

    /**
     * 分类名称
     */
    private String cateName;

    /**
     * 分类排序号
     */
    private Integer cateSort;

    /**
     * 分类描述
     */
    private String cateDesc;

    /**
     * 房屋数量
     */
    @TableField(exist = false)
    private Integer count;
}


================================================
FILE: src/main/java/com/example/sens/entity/City.java
================================================
package com.example.sens.entity;

import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import com.example.sens.common.base.BaseEntity;
import lombok.Data;

/**
 * <pre>
 *     城市
 * </pre>
 *
 * @author : saysky
 * @date : 2019/11/30
 */
@Data
@TableName("city")
public class City extends BaseEntity {

    /**
     * 分类名称
     */
    private String cityName;

    /**
     * 房屋数
     */
    @TableField(exist = false)
    private Integer count;
}


================================================
FILE: src/main/java/com/example/sens/entity/Notice.java
================================================
package com.example.sens.entity;

import com.baomidou.mybatisplus.annotation.TableName;
import com.example.sens.common.base.BaseEntity;
import lombok.Data;


/**
 * <pre>
 *     新闻公告
 * </pre>
 */
@Data
@TableName("notice")
public class Notice extends BaseEntity {

    /**
     * 标题
     */
    private String title;

    /**
     * 内容
     */
    private String content;

    /**
     * 摘要
     */
    private String summary;

}


================================================
FILE: src/main/java/com/example/sens/entity/Order.java
================================================
package com.example.sens.entity;

import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import com.example.sens.common.base.BaseEntity;
import lombok.Data;

import java.util.Date;

/**
 * 订单
 * @author 言曌
 * @date 2020/4/5 3:25 下午
 */
@Data
@TableName("t_order")
public class Order extends BaseEntity {

    /**
     * 下单用户ID
     */
    private Long userId;

    /**
     * 业主用户ID
     */
    private Long ownerUserId;

    /**
     * 房间ID
     */
    private Long postId;

    /**
     * 数量
     */
    private Integer quantity;

    /**
     * 开始日期
     */
    private Date startDate;


    /**
     * 结束日期
     */
    private Date endDate;


    /**
     * 订单状态:0待支付,1已支付生效中,2已完结
     */
    private Integer status;

    /**
     * 总价
     */
    private Long price;


    /**
     * 房屋
     */
    @TableField(exist = false)
    private Post post;

    /**
     * 下单用户
     */
    @TableField(exist = false)
    private User user;

    /**
     * 业主用户
     */
    @TableField(exist = false)
    private User ownerUser;

}


================================================
FILE: src/main/java/com/example/sens/entity/Permission.java
================================================
package com.example.sens.entity;

import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import com.example.sens.common.base.BaseEntity;
import lombok.Data;

import java.util.List;


/**
 *
 * 权限,后台的菜单
 * @author example
 */
@Data
@TableName("permission")
public class Permission  extends BaseEntity {

    /**
     * 权限名称
     */
    private String name;

    /**
     * pid
     */
    private Long pid;

    /**
     * 资源类型
     */
    private String resourceType;

    /**
     * 请求URL
     */
    private String url;

    /**
     * 图标
     */
    private String icon;

    /**
     * 序号(越小越靠前)
     */
    private Double sort;

    /**
     * 级别
     */
    @TableField(exist = false)
    private Integer level;

    /**
     * 子权限列表
     */
    @TableField(exist = false)
    private List<Permission> childPermissions;



================================================
FILE: src/main/java/com/example/sens/entity/Post.java
================================================
package com.example.sens.entity;

import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import com.example.sens.common.base.BaseEntity;
import lombok.Data;


/**
 * @author example
 */
@Data
@TableName("post")
public class Post extends BaseEntity {

    /**
     * 用户ID
     */
    private Long userId;
    /**
     * 房屋标题
     */
    private String postTitle;

    /**
     * 房屋描述
     */
    private String postContent;

    /**
     * 房屋摘要
     */
    private String postSummary;

    /**
     * 缩略图
     */
    private String postThumbnail;

    /**
     * 0 正在出租
     * 1 已经租出去
     * 2 已删除
     */
    private Integer postStatus;

    /**
     * 月付价格
     */
    private Integer price;

    /**
     * 房间编号
     */
    private String number;

    /**
     * 分类ID
     */
    private Long cateId;

    /**
     * 城市ID
     */
    private Long cityId;

    /**
     * 图片URL
     */
    private String imgUrl;

    /**
     * 富文本
     */
    private String postEditor;

    /**
     * 面积
     */
    private Double area;


    /**
     * 卧室数量
     */
    private Integer roomCount;


    /**
     * 洗手间数量
     */
    private Integer toiletCount;

    /**
     * 押金
     */
    private Long deposit;

    /**
     * 房屋所属分类
     */
    @TableField(exist = false)
    private Category category;


    /**
     * 房屋所属城市
     */
    @TableField(exist = false)
    private City city;

    /**
     * 房屋业主
     */
    @TableField(exist = false)
    private User user;

    /**
     * 用于搜索
     */
    @TableField(exist = false)
    private Integer minArea;

    /**
     * 用于搜索
     */
    @TableField(exist = false)
    private Integer maxArea;

    /**
     * 用于搜索
     */
    @TableField(exist = false)
    private Integer minPrice;

    /**
     * 用于搜索
     */
    @TableField(exist = false)
    private Integer maxPrice;



================================================
FILE: src/main/java/com/example/sens/entity/RechargeRecord.java
================================================
package com.example.sens.entity;

import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import com.example.sens.common.base.BaseEntity;
import lombok.Data;

/**
 * @author 言曌
 * @date 2020/3/22 3:15 下午
 */
@TableName("recharge_record")
@Data
public class RechargeRecord extends BaseEntity {

    /**
     * 用户ID
     */
    private Long userId;

    /**
     * 金额
     */
    private Long money;

    /**
     * 用户
     */
    @TableField(exist = false)
    private User user;
}


================================================
FILE: src/main/java/com/example/sens/entity/Role.java
================================================
package com.example.sens.entity;

import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import com.example.sens.common.base.BaseEntity;
import lombok.Data;

import java.util.List;

/**
 * @author example
 */
@Data
@TableName("role")
public class Role  extends BaseEntity {

    /**
     * 角色名称:admin,author,subscriber
     */
    private String role;

    /**
     * 描述:管理员,作者,订阅者
     */
    private String description;

    /**
     * 级别
     */
    private Integer level;

    /**
     * 用户注册默认角色
     */
    private Integer isRegisterDefault;

    /**
     * 该角色对应的用户数量,非数据库字段
     */
    @TableField(exist = false)
    private Integer count;

    /**
     * 当前角色的权限列表
     */
    @TableField(exist = false)
    private List<Permission> permissions;



================================================
FILE: src/main/java/com/example/sens/entity/RolePermissionRef.java
================================================
package com.example.sens.entity;

import com.baomidou.mybatisplus.annotation.TableName;
import com.example.sens.common.base.BaseEntity;
import lombok.Data;

@Data
@TableName("role_permission_ref")
public class RolePermissionRef  extends BaseEntity {

    /**
     * 角色Id
     */
    private Long roleId;

    /**
     * 权限Id
     */
    private Long permissionId;

    public RolePermissionRef() {
    }

    public RolePermissionRef(Long roleId, Long permissionId) {
        this.roleId = roleId;
        this.permissionId = permissionId;
    }


================================================
FILE: src/main/java/com/example/sens/entity/User.java
================================================
package com.example.sens.entity;

import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import com.example.sens.common.base.BaseEntity;
import com.fasterxml.jackson.annotation.JsonIgnore;
import lombok.Data;

import java.util.Date;

/**
 * 用户信息
 */
@Data
@TableName("user")
public class User extends BaseEntity {

    /**
     * 账号
     */
    private String userName;

    /**
     * 姓名称
     */
    private String userDisplayName;

    /**
     * 密码
     */
    @JsonIgnore
    private String userPass;

    /**
     * 身份证号码
     */
    private String idCard;

    /**
     * 头像
     */
    private String userAvatar;

    /**
     * 说明
     */
    private String userDesc;

    /**
     * 0 正常
     * 1 禁用
     * 2 已删除
     */
    private Integer status = 0;

    /**
     * 创建时间
     */
    private Date createTime;

    /**
     * 电子邮箱
     */
    private String email;

    /**
     * 手机号
     */
    private String phone;

    /**
     * 余额
     */
    private Long money;

    /**
     * 角色名称
     */
    @TableField(exist = false)
    private Role role;

}


================================================
FILE: src/main/java/com/example/sens/entity/UserRoleRef.java
================================================
package com.example.sens.entity;

import com.baomidou.mybatisplus.annotation.TableName;
import com.example.sens.common.base.BaseEntity;
import lombok.Data;


/**
 * 用户和角色关联
 * @author example
 */
@Data
@TableName("user_role_ref")
public class UserRoleRef  extends BaseEntity {


    /**
     * 用户Id
     */
    private Long userId;

    /**
     * 角色Id
     */
    private Long roleId;

    public UserRoleRef(Long userId, Long roleId) {
        this.userId = userId;
        this.roleId = roleId;
    }

    public UserRoleRef() {
    }


================================================
FILE: src/main/java/com/example/sens/enums/CommonParamsEnum.java
================================================
package com.example.sens.enums;

/**
 * 常用数字
 */
public enum CommonParamsEnum {

    /**
     * 数字10
     */
    TEN(10),

    /**
     * 数字5
     */
    FIVE(5),

    /**
     * 数字404
     */
    NOT_FOUND(404),

    /**
     * 数字1024
     */
    BYTE(1024);

    private Integer value;

    CommonParamsEnum(Integer value) {
        this.value = value;
    }

    public Integer getValue() {
        return value;
    }
}


================================================
FILE: src/main/java/com/example/sens/enums/OrderStatusEnum.java
================================================
package com.example.sens.enums;

/**
 * <pre>
 *     订单状态enum
 * </pre>
 */
public enum OrderStatusEnum {

    /**
     * 待支付
     */
    NOT_PAY(0),

    /**
     * 已支付
     */
    HAS_PAY(1),

    /**
     * 已完结
     */
    FINISHED(2),

    /**
     * 已关闭,已取消
     */
    CLOSED(3),

    /**
     * 押金退回失败
     */
    DEPOSIT_RETURN_FAIL(4)

    ;



    private Integer code;

    OrderStatusEnum(Integer code) {
        this.code = code;
    }

    public Integer getCode() {
        return code;
    }

}


================================================
FILE: src/main/java/com/example/sens/enums/PostIsRecommendEnum.java
================================================
package com.example.sens.enums;

/**
 * 房屋推荐枚举
 */
public enum PostIsRecommendEnum {

    /**
     * 真
     */
    TRUE(1),

    /**
     * 假
     */
    FALSE(0);

    private Integer value;

    PostIsRecommendEnum(Integer value) {
        this.value = value;
    }

    public Integer getValue() {
        return value;
    }
}


================================================
FILE: src/main/java/com/example/sens/enums/PostIsStickyEnum.java
================================================
package com.example.sens.enums;

/**
 * 房屋置顶枚举
 */
public enum PostIsStickyEnum {

    /**
     * 真
     */
    TRUE(1),

    /**
     * 假
     */
    FALSE(0);

    private Integer value;

    PostIsStickyEnum(Integer value) {
        this.value = value;
    }

    public Integer getValue() {
        return value;
    }
}


================================================
FILE: src/main/java/com/example/sens/enums/PostStatusEnum.java
================================================
package com.example.sens.enums;

/**
 * <pre>
 *     房屋状态enum
 * </pre>
 *
 * @author : saysky
 * @date : 2018/7/1
 */
public enum PostStatusEnum {

    /**
     * 正在出租
     */
    ON_SALE(0),

    /**
     * 已出租
     */
    OFF_SALE(1),

    /**
     * 已删除
     */
    RECYCLE(2);

    private Integer code;

    PostStatusEnum(Integer code) {
        this.code = code;
    }

    public Integer getCode() {
        return code;
    }

}


================================================
FILE: src/main/java/com/example/sens/enums/PostTypeEnum.java
================================================
package com.example.sens.enums;

/**
 * <pre>
 *     房屋类型enum
 * </pre>
 *
 * @author : saysky
 * @date : 2018/7/1
 */
public enum PostTypeEnum {

    /**
     * 房屋
     */
    POST_TYPE_POST("post"),

    /**
     * 页面
     */
    POST_TYPE_PAGE("page"),

    /**
     * 公告
     */
    POST_TYPE_NOTICE("notice");

    private String value;

    PostTypeEnum(String value) {
        this.value = value;
    }

    public String getValue() {
        return value;
    }
}


================================================
FILE: src/main/java/com/example/sens/enums/ResourceTypeEnum.java
================================================
package com.example.sens.enums;

/**
 * 资源类型
 */
public enum ResourceTypeEnum {

    /**
     * 菜单
     */
    MENU("menu", "菜单"),

    /**
     * 接口
     */
    BUTTON("button", "接口"),

    /**
     * 菜单
     */
    PAGE("page", "页面");


    private String code;

    private String description;

    ResourceTypeEnum(String code, String description) {
        this.code = code;
        this.description = description;
    }

    public String getCode() {
        return code;
    }

    public void setCode(String code) {
        this.code = code;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }
}


================================================
FILE: src/main/java/com/example/sens/enums/ResultCodeEnum.java
================================================
package com.example.sens.enums;

/**
 * 返回结果enum
 */
public enum ResultCodeEnum {

    /**
     * 成功
     */
    SUCCESS(1),

    /**
     * 失败
     */
    FAIL(0);

    Integer code;

    ResultCodeEnum(Integer code) {
        this.code = code;
    }

    public Integer getCode() {
        return code;
    }
}


================================================
FILE: src/main/java/com/example/sens/enums/RoleEnum.java
================================================
package com.example.sens.enums;

/**
 * <pre>
 *     角色枚举
 * </pre>
 *
 */
public enum RoleEnum {

    /**
     * 管理员
     */
    ADMIN("admin"),

    /**
     * 用户
     */
    USER("user");

    private String value;

    RoleEnum(String value) {
        this.value = value;
    }

    public String getValue() {
        return value;
    }
}


================================================
FILE: src/main/java/com/example/sens/enums/TrueFalseEnum.java
================================================
package com.example.sens.enums;

/**
 * true or false enum
 */
public enum TrueFalseEnum {

    /**
     * 真
     */
    TRUE("true"),

    /**
     * 假
     */
    FALSE("false");

    private String value;

    TrueFalseEnum(String value) {
        this.value = value;
    }

    public String getValue() {
        return value;
    }
}


================================================
FILE: src/main/java/com/example/sens/enums/UserStatusEnum.java
================================================
package com.example.sens.enums;

/**
 * 用户状态enum
 */
public enum UserStatusEnum {

    /**
     * 正常
     */
    NORMAL(0),

    /**
     * 禁止登录
     */
    BAN(1);


    private Integer code;

    UserStatusEnum(Integer code) {
        this.code = code;
    }

    public Integer getCode() {
        return code;
    }
}


================================================
FILE: src/main/java/com/example/sens/exception/GlobalExceptionHandler.java
================================================
package com.example.sens.exception;

import com.example.sens.dto.JsonResult;
import lombok.extern.slf4j.Slf4j;
import org.apache.shiro.authz.UnauthorizedException;
import org.springframework.http.HttpStatus;
import org.springframework.http.converter.HttpMessageNotReadableException;
import org.springframework.ui.Model;
import org.springframework.validation.BindException;
import org.springframework.validation.BindingResult;
import org.springframework.validation.FieldError;
import org.springframework.web.HttpMediaTypeNotSupportedException;
import org.springframework.web.HttpRequestMethodNotSupportedException;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.MissingServletRequestParameterException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.NoHandlerFoundException;
import org.springframework.web.servlet.view.json.MappingJackson2JsonView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.validation.ConstraintViolation;
import javax.validation.ConstraintViolationException;
import javax.validation.ValidationException;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;

/**
 * 全局异常捕获
 */

@ControllerAdvice
@Slf4j
public class GlobalExceptionHandler {

    //错误显示页面
    public static final String viewName = "common/error/error";

    /**
     * 是否是ajax请求
     */
    public static boolean isAjax(HttpServletRequest httpRequest) {
        return (httpRequest.getHeader("X-Requested-With") != null
                && "XMLHttpRequest"
                .equals(httpRequest.getHeader("X-Requested-With").toString()));
    }


    /**
     * 400 - Bad Request
     */
    @ResponseStatus(HttpStatus.BAD_REQUEST)
    @ExceptionHandler(MissingServletRequestParameterException.class)
    public String handleMissingServletRequestParameterException(MissingServletRequestParameterException e, Model model) {
        log.error("缺少请求参数", e);
        String message = "【缺少请求参数】" + e.getMessage();
        model.addAttribute("message", message);
        model.addAttribute("code", 400);
        return viewName;
    }

    /**
     * 400 - Bad Request
     */
    @ResponseStatus(HttpStatus.BAD_REQUEST)
    @ExceptionHandler(HttpMessageNotReadableException.class)
    public String handleHttpMessageNotReadableException(HttpMessageNotReadableException e, Model model) {
        log.error("参数解析失败", e);
        String message = "【参数解析失败】" + e.getMessage();
        model.addAttribute("message", message);
        model.addAttribute("code", 400);
        return viewName;
    }

    /**
     * 400 - Bad Request
     */
    @ResponseStatus(HttpStatus.BAD_REQUEST)
    @ExceptionHandler(MethodArgumentNotValidException.class)
    public String handleMethodArgumentNotValidException(MethodArgumentNotValidException e, Model model) {
        log.error("参数验证失败", e);
        BindingResult result = e.getBindingResult();
        FieldError error = result.getFieldError();
        String field = error.getField();
        String code = error.getDefaultMessage();
        String message = "【参数验证失败】" + String.format("%s:%s", field, code);
        model.addAttribute("message", message);
        model.addAttribute("code", 400);
        return viewName;
    }

    /**
     * 400 - Bad Request
     */
    @ResponseStatus(HttpStatus.BAD_REQUEST)
    @ExceptionHandler(BindException.class)
    public String handleBindException(BindException e, Model model) {
        log.error("参数绑定失败", e);
        BindingResult result = e.getBindingResult();
        FieldError error = result.getFieldError();
        String field = error.getField();
        String code = error.getDefaultMessage();
        String message = "【参数绑定失败】" + String.format("%s:%s", field, code);

        model.addAttribute("message", message);
        model.addAttribute("code", 400);
        return viewName;
    }


    /**
     * 400 - Bad Request
     */
    @ResponseStatus(HttpStatus.BAD_REQUEST)
    @ExceptionHandler(ConstraintViolationException.class)
    public String handleServiceException(ConstraintViolationException e, Model model) {
        log.error("参数验证失败", e);
        Set<ConstraintViolation<?>> violations = e.getConstraintViolations();
        ConstraintViolation<?> violation = violations.iterator().next();
        String message = "【参数验证失败】" + violation.getMessage();
        model.addAttribute("message", message);
        model.addAttribute("code", 400);
        return viewName;
    }

    /**
     * 400 - Bad Request
     */
    @ResponseStatus(HttpStatus.BAD_REQUEST)
    @ExceptionHandler(ValidationException.class)
    public String handleValidationException(ValidationException e, Model model) {
        log.error("参数验证失败", e);
        String message = "【参数验证失败】" + e.getMessage();
        model.addAttribute("message", message);
        model.addAttribute("code", 400);
        return viewName;
    }

    /**
     * 404 - Not Found
     */
    @ResponseStatus(HttpStatus.NOT_FOUND)
    @ExceptionHandler(NoHandlerFoundException.class)
    public String noHandlerFoundException(NoHandlerFoundException e, Model model) {
        log.error("Not Found", e);
        String message = "【页面不存在】" + e.getMessage();
        model.addAttribute("message", message);
        model.addAttribute("code", 404);
        return viewName;
    }


    /**
     * 405 - Method Not Allowed
     */
    @ResponseStatus(HttpStatus.METHOD_NOT_ALLOWED)
    @ExceptionHandler(HttpRequestMethodNotSupportedException.class)
    public String handleHttpRequestMethodNotSupportedException(HttpRequestMethodNotSupportedException e, Model model) {
        log.error("不支持当前请求方法", e);
        String message = "【不支持当前请求方法】" + e.getMessage();
        model.addAttribute("message", message);
        model.addAttribute("code", 405);
        return viewName;
    }

    /**
     * 415 - Unsupported Media Type
     */
    @ResponseStatus(HttpStatus.UNSUPPORTED_MEDIA_TYPE)
    @ExceptionHandler(HttpMediaTypeNotSupportedException.class)
    public String handleHttpMediaTypeNotSupportedException(HttpMediaTypeNotSupportedException e, Model model) {
        log.error("不支持当前媒体类型", e);
        String message = "【不支持当前媒体类型】" + e.getMessage();
        model.addAttribute("message", message);
        model.addAttribute("code", 415);
        return viewName;
    }

    /**
     * 统一异常处理
     *
     * @param response
     * @param e
     * @return
     */
    @ExceptionHandler(MyBusinessException.class)
    @ResponseBody
    public JsonResult processApiException(HttpServletResponse response,
                                          MyBusinessException e) {
        JsonResult result = new JsonResult(0, e.getMessage());
        response.setStatus(200);
        response.setContentType("application/json;charset=UTF-8");
        log.error("业务异常,提示前端操作不合法", e.getMessage(), e);
        return result;
    }

    /**
     * 获取其它异常。包括500
     *
     * @param e
     * @return
     * @throws Exception
     */
    @ExceptionHandler(value = Exception.class)
    public ModelAndView defaultErrorHandler(HttpServletRequest request,
                                            HttpServletResponse response,
                                            Exception e, Model model) throws IOException {
        e.printStackTrace();

        if (isAjax(request)) {
            ModelAndView mav = new ModelAndView();
            MappingJackson2JsonView view = new MappingJackson2JsonView();
            Map<String, Object> attributes = new HashMap<String, Object>();
            if (e instanceof UnauthorizedException) {
                attributes.put("msg", "没有权限");
            } else {
                attributes.put("msg", e.getMessage());
            }
            attributes.put("code", "0");
            view.setAttributesMap(attributes);
            mav.setView(view);
            return mav;
        }

        if (e instanceof UnauthorizedException) {
            //请登录
            log.error("无权访问", e);
            return new ModelAndView("common/error/403");
        }
        //其他异常
        String message = e.getMessage();
        model.addAttribute("code", 500);
        model.addAttribute("message", message);
        return new ModelAndView("common/error/500");
    }
}


================================================
FILE: src/main/java/com/example/sens/exception/MyBusinessException.java
================================================
package com.example.sens.exception;

/**
 * @author 言曌
 * @date 2019-08-09 16:47
 */

public class MyBusinessException extends RuntimeException {

    private Integer code;

    private String message;


    public MyBusinessException() {
        super();
    }

    public MyBusinessException(String message) {
        this.code = 500;
        this.message = message;
    }

    public MyBusinessException(Integer code, String message) {
        this.code = code;
        this.message = message;
    }

    public Integer getCode() {
        return code;
    }

    public void setCode(Integer code) {
        this.code = code;
    }

    @Override
    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }
}


================================================
FILE: src/main/java/com/example/sens/mapper/CategoryMapper.java
================================================
package com.example.sens.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.example.sens.entity.Category;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.List;

/**
 * @author liuyanzhao
 */
@Mapper
public interface CategoryMapper extends BaseMapper<Category> {

    /**
     * 获得子分类Id列表
     *
     * @param  pathTrace /138/ 这种格式
     * @return 子分类Id列表
     */
    List<Long> selectChildCateIds(@Param("pathTrace") String pathTrace);

    /**
     * 根据用户ID删除
     * @param userId
     * @return
     */
    Integer deleteByUserId(Long userId);

    /**
     * 获取所有分类
     * @return
     */
    List<Category> findAllWithCount();
}



================================================
FILE: src/main/java/com/example/sens/mapper/CityMapper.java
================================================
package com.example.sens.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.example.sens.entity.City;
import org.apache.ibatis.annotations.Mapper;

import java.util.List;

/**
 * @author liuyanzhao
 */
@Mapper
public interface CityMapper extends BaseMapper<City> {

    /**
     * 获取所有城市
     * @return
     */
    List<City> findAllWithCount();
}



================================================
FILE: src/main/java/com/example/sens/mapper/NoticeMapper.java
================================================
package com.example.sens.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.example.sens.entity.Notice;
import org.apache.ibatis.annotations.Mapper;


/**
 * @author liuyanzhao
 */
@Mapper
public interface NoticeMapper extends BaseMapper<Notice> {
}



================================================
FILE: src/main/java/com/example/sens/mapper/OrderMapper.java
================================================
package com.example.sens.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.example.sens.entity.Order;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.List;

/**
 * @author liuyanzhao
 */
@Mapper
public interface OrderMapper extends BaseMapper<Order> {

    /**
     * 根据条件查询订单
     *
     * @param condition
     * @return
     */
    List<Order> findAll(@Param("condition") Order condition, Page page);

    /**
     * 根据条件查询总金额
     *
     * @param condition
     * @return
     */
    Integer getTotalPriceSum(@Param("condition") Order condition);

    /**
     * 更新超时订单状态为超时
     *
     * @return
     */
    Integer updateOverDueOrder();

    /**
     * 根据房屋ID删除
     * @param postId
     * @return
     */
    Integer deleteByPostId(Long postId);

    /**
     * 获得到期的订单
     * @return
     */
    List<Order> findOverDueOrder();

    /**
     * 查询有效订单
     * @param postId
     * @return
     */
    Order findByPostId(Long postId);
}



================================================
FILE: src/main/java/com/example/sens/mapper/PermissionMapper.java
================================================
package com.example.sens.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.example.sens.entity.Permission;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.List;


/**
 * @author example
 */
@Mapper
public interface PermissionMapper extends BaseMapper<Permission> {

    /**
     * 根据角色Id获得权限列表
     *
     * @param roleId 角色Id
     * @return 权限列表
     */
    List<Permission> findByRoleId(Long roleId);

    /**
     * 获得某个用户的权限列表
     *
     * @param userId
     * @return
     */
    List<Permission> findPermissionByUserId(Long userId);

    /**
     * 获得某个用户的权限列表
     *
     * @param userId
     * @param resourceType
     * @return
     */
    List<Permission> findPermissionByUserIdAndResourceType(@Param("userId") Long userId,
                                                           @Param("resourceType") String resourceType);


    /**
     * 获得权限列表
     *
     * @param resourceType
     * @return
     */
    List<Permission> findPermissionByResourceType(Integer resourceType);

    /**
     * 根据角色ID获得权限列表
     * @param roleId
     * @return
     */
    List<Permission> findPermissionByRoleId(Long roleId);

    /**
     * 统计子节点数量
     * @param id
     * @return
     */
    Integer countChildPermission(Long id);

    /**
     * 根据URL获得权限
     * @param url
     * @return
     */
    Permission findByUrl(String url);
}



================================================
FILE: src/main/java/com/example/sens/mapper/PostMapper.java
================================================
package com.example.sens.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.example.sens.common.constant.CommonConstant;
import com.example.sens.entity.Post;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.List;

/**
 * @author liuyanzhao
 */
@Mapper
public interface PostMapper extends BaseMapper<Post> {

    /**
     * 根据条件查询房屋
     *
     * @param condition
     * @param page
     * @return
     */
    List<Post> findPostByCondition(@Param(CommonConstant.CONDITION) Post condition, Page page);

    /**
     * 根据租客用户ID查询
     *
     * @param userId
     * @param page
     * @return
     */
    List<Post> findByRentUserId(@Param("userId") Long userId, Page page);

    /**
     * 统计该分类的房屋
     *
     * @param cateId
     * @return
     */
    Integer countPostByCateId(Long cateId);


    /**
     * 获得最新房屋
     *
     * @param cityId
     * @param limit
     * @return
     */
    List<Post> getLatestPost(@Param("cityId") Long cityId, @Param("limit") Integer limit);

    /**
     * 根据状态统计
     *
     * @param postStatus 状态
     * @return
     */
    Integer countByStatus(Integer postStatus);

    /**
     * 获得合租房屋
     *
     * @return
     */
    List<Post> getUnionRentPost(Post post);

}



================================================
FILE: src/main/java/com/example/sens/mapper/RechargeRecordMapper.java
================================================
package com.example.sens.mapper;


import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.example.sens.entity.RechargeRecord;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.List;

/**
 * @author example
 */
@Mapper
public interface RechargeRecordMapper extends BaseMapper<RechargeRecord> {

    /**
     * 删除用户和预定关联
     *
     * @param userId 用户ID
     * @return 影响行数
     */
    Integer deleteByUserId(Long userId);

    /**
     * 查询所有充值记录
     *
     * @return
     */
    List<RechargeRecord> findAll(@Param("startDate") String startDate,
                                 @Param("endDate") String endDate,
                                 Page page);


    /**
     * 获得该用户的充值记录
     *
     * @return
     */
    List<RechargeRecord> findByUserId(@Param("startDate") String startDate,
                                      @Param("endDate") String endDate,
                                      @Param("userId") Long userId, Page page);

    /**
     * 根据时间范围查询总金额
     *
     * @param startDate
     * @param endDate
     * @return
     */
    Integer getTotalMoneySum(@Param("startDate") String startDate,
                             @Param("endDate") String endDate);
}



================================================
FILE: src/main/java/com/example/sens/mapper/RoleMapper.java
================================================
package com.example.sens.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.example.sens.entity.Role;
import org.apache.ibatis.annotations.Mapper;

import java.util.List;


/**
 * @author example
 */
@Mapper
public interface RoleMapper extends BaseMapper<Role> {


    /**
     * 根据用户Id获得角色
     *
     * @param userId 用户Id
     * @return 角色列表
     */
    Role findByUserId(Long userId);


    /**
     * 删除用户和角色管理
     *
     * @param userId 用户ID
     * @return 影响行数
     */
    Integer deleteByUserId(Long userId);

    /**
     * 统计某个角色的用户数
     *
     * @param roleId 角色Id
     * @return 用户数
     */
    Integer countUserByRoleId(Long roleId);


    /**
     * 获得所有角色和对应用户数量
     * @return
     */
    List<Role> findAllWithCount();

    /**
     * 查询小于等于该等级的角色
     * @param level
     * @return
     */
    List<Role> findByLessThanLevel(Integer level);

    /**
     * 查询某个用户最大的角色等级
     * @param userId
     * @return
     */
    Integer findMaxLevelByUserId(Long userId);

    /**
     * 获得用户注册默认角色
     * @return
     */
    Role findDefaultRole();
}



================================================
FILE: src/main/java/com/example/sens/mapper/RolePermissionRefMapper.java
================================================
package com.example.sens.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.example.sens.entity.RolePermissionRef;
import org.apache.ibatis.annotations.Mapper;

import java.util.List;


/**
 * @author example
 */
@Mapper
public interface RolePermissionRefMapper extends BaseMapper<RolePermissionRef> {


    /**
     * 根据角色Id删除
     *
     * @param roleId 角色Id
     * @return 影响行数
     */
   Integer deleteByRoleId(Long roleId);

    /**
     * 根据权限Id删除
     *
     * @param permissionId 权限Id
     * @return 影响行数
     */
    Integer deleteByPermissionId(Long permissionId);
    /**
     * 批量添加
     *
     * @param rolePermissionRefList 列表
     * @return 影响喊你高数
     */
   Integer batchInsert(List<RolePermissionRef> rolePermissionRefList);
}



================================================
FILE: src/main/java/com/example/sens/mapper/UserMapper.java
================================================
package com.example.sens.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.example.sens.entity.User;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.List;

/**
 * @author example
 */
@Mapper
public interface UserMapper extends BaseMapper<User> {

    /**
     * 根据角色Id获得用户
     *
     * @param roleId 角色Id
     * @param page 分页信息
     * @return 用户列表
     */
    List<User> findByRoleId(@Param("roleId") Long roleId, Page page);

    /**
     * 根据角色Id和条件获得用户
     *
     * @param roleId 角色Id
     * @param user 条件
     * @param page 分页信息
     * @return 用户列表
     */
    List<User> findByRoleIdAndCondition(@Param("roleId") Long roleId,
                                        @Param("user") User user, Page page);

    /**
     * 根据条件查询
     *
     * @param user 用户
     * @param page 分页
     * @return 用户列表
     */
    List<User> findByCondition( @Param("user") User user, Page page);

    /**
     * 获得今日新增数量
     * @return
     */
    Integer getTodayCount();

    /**
     * 获得用户房屋数排名
     * @param limit 查询数量
     * @return
     */
    List<User> getUserPostRanking(Integer limit);

    /**
     * 获得最新注册用户
     * @param limit
     * @return
     */
    List<User> getLatestUser(Integer limit);

    /**
     * 获得热门用户
     * @param limit 用户数量
     * @return
     */
    List<User> getHotUsers(Integer limit);

}



================================================
FILE: src/main/java/com/example/sens/mapper/UserRoleRefMapper.java
================================================
package com.example.sens.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.example.sens.entity.UserRoleRef;
import org.apache.ibatis.annotations.Mapper;

/**
 * @author example
 */
@Mapper
public interface UserRoleRefMapper extends BaseMapper<UserRoleRef> {

    /**
     * 根据用户Id删除
     *
     * @param userId 用户Id
     * @return 影响行数
     */
    Integer deleteByUserId(Long userId);
}



================================================
FILE: src/main/java/com/example/sens/service/CategoryService.java
================================================
package com.example.sens.service;


import com.example.sens.common.base.BaseService;
import com.example.sens.entity.Category;

import java.util.List;

/**
 * <pre>
 *     分类业务逻辑接口
 * </pre>
 *
 * @author : saysky
 * @date : 2019/11/30
 */
public interface CategoryService extends BaseService<Category, Long> {

    /**
     * 查询所有分类目录,带count和根据level封装name
     *
     * @return 返回List集合
     */
    List<Category> findByUserId(Long userId);

    /**
     * 获得某个分类的所有房屋数
     *
     * @param cateId 分类Id
     * @return 房屋数
     */
    Integer countPostByCateId(Long cateId);

    /**
     * 根据用户ID删除
     *
     * @param userId
     * @return
     */
    Integer deleteByUserId(Long userId);

    /**
     * 将分类ID列表转成分类
     *
     * @param cateIds
     * @param userId
     * @return
     */
    List<Category> cateIdsToCateList(List<Long> cateIds, Long userId);

}


================================================
FILE: src/main/java/com/example/sens/service/CityService.java
================================================
package com.example.sens.service;


import com.example.sens.common.base.BaseService;
import com.example.sens.entity.City;

public interface CityService extends BaseService<City, Long> {


}


================================================
FILE: src/main/java/com/example/sens/service/MailService.java
================================================
package com.example.sens.service;


import javax.mail.MessagingException;

/**
 * <pre>
 *     邮件发送业务逻辑接口
 * </pre>
 */
public interface MailService {

    /**
     * 发送邮件
     *
     * @param to      接收者
     * @param title   标题
     * @param content 内容
     */
    void sendMail(String to, String title, String content) throws MessagingException;

}


================================================
FILE: src/main/java/com/example/sens/service/NoticeService.java
================================================
package com.example.sens.service;


import com.example.sens.common.base.BaseService;
import com.example.sens.entity.Notice;

public interface NoticeService extends BaseService<Notice, Long> {


}


================================================
FILE: src/main/java/com/example/sens/service/OrderService.java
================================================
package com.example.sens.service;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.example.sens.common.base.BaseService;
import com.example.sens.entity.Order;

/**
 * 订单
 *
 * @author 言曌
 * @date 2020/4/6 2:00 下午
 */
public interface OrderService extends BaseService<Order, Long> {

    /**
     * 查询总金额
     *
     * @return
     */
    Integer getTotalPriceSum(Order condition);

    /**
     * 根据条件查询
     *
     * @param condition
     * @param page
     * @return
     */
    Page<Order> findAll(Order condition, Page<Order> page);

    /**
     * 查询有效订单
     * @param postId
     * @return
     */
    Order findByPostId(Long postId);

}


================================================
FILE: src/main/java/com/example/sens/service/PermissionService.java
================================================
package com.example.sens.service;

import com.example.sens.entity.Permission;
import com.example.sens.common.base.BaseService;

import java.util.List;
import java.util.Set;

/**
 * 权限逻辑接口
 */
public interface PermissionService extends BaseService<Permission, Long> {

    /**
     * 根据角色Id获得权限列表
     *
     * @param roleId 角色Id
     * @return 权限列表
     */
    List<Permission> listPermissionsByRoleId(Long roleId);

    /**
     * 获得某个用户的权限URL列表
     *
     * @param userId
     * @return
     */
    Set<String> findPermissionUrlsByUserId(Long userId);

    /**
     * 获得某个用户的用户ID和资源类型
     *
     * @param userId
     * @param resourceType
     * @return
     */
    List<Permission> findPermissionTreeByUserIdAndResourceType(Long userId, String resourceType);

    /**
     * 根据角色ID获得权限列表
     * @param roleId
     * @return
     */
    List<Permission> findPermissionByRoleId(Long roleId);

    /**
     * 获得所有权限,带有等级
     * @return
     */
    List<Permission> findPermissionListWithLevel();

    /**
     * 统计子节点数量
     * @param id
     * @return
     */
    Integer countChildPermission(Long id);

    /**
     * 根据URL获得权限
     * @param url
     * @return
     */
    Permission findByUrl(String url);
}


================================================
FILE: src/main/java/com/example/sens/service/PostService.java
================================================
package com.example.sens.service;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.example.sens.common.base.BaseService;
import com.example.sens.entity.Post;

import java.util.List;

/**
 * <pre>
 *     记录/页面业务逻辑接口
 * </pre>
 */
public interface PostService extends BaseService<Post, Long> {

    /**
     * 根据条件获得列表
     *
     * @param condition
     * @return
     */
    Page<Post> findPostByCondition(Post condition, Page<Post> page);


    /**
     * 根据租客userId查询
     *
     * @param userId
     * @return
     */
    Page<Post> findByRentUserId(Long userId, Page<Post> page);


    /**
     * 获得最新房屋
     *
     * @param cityId
     * @param limit
     * @return
     */
    List<Post> getLatestPost(Long cityId, int limit);

    /**
     * 根据状态统计
     *
     * @param postStatus 状态
     * @return
     */
    Integer countByStatus(Integer postStatus);

    /**
     * 获得合租房屋
     *
     * @return
     */
    List<Post> getUnionRentPost(Post post);
}


================================================
FILE: src/main/java/com/example/sens/service/RechargeRecordService.java
================================================
package com.example.sens.service;


import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.example.sens.common.base.BaseService;
import com.example.sens.entity.RechargeRecord;

/**
 * @author 言曌
 * @date 2020/3/22 3:18 下午
 */

public interface RechargeRecordService extends BaseService<RechargeRecord, Long> {


    Page<RechargeRecord> findAll(String startDate, String endDate, Page<RechargeRecord> page);

    /**
     * 根据用户ID获得预定列表
     *
     * @param userId
     * @param page
     * @return
     */
    Page<RechargeRecord> findByUserId(String startDate, String endDate, Long userId, Page<RechargeRecord> page);


    /**
     * 根据时间范围查询总金额
     *
     * @param startDate
     * @param endDate
     * @return
     */
    Integer getTotalMoneySum(String startDate, String endDate);
}


================================================
FILE: src/main/java/com/example/sens/service/RolePermissionRefService.java
================================================
package com.example.sens.service;

import com.example.sens.entity.RolePermissionRef;

import java.util.List;


public interface RolePermissionRefService {

    /**
     * 删除某个角色的所有关联
     *
     * @param roleId 角色Id
     */
    void deleteRefByRoleId(Long roleId);

    /**
     * 添加角色和权限关联
     *
     * @param rolePermissionRef RolePermissionRef
     * @return UserRoleRef
     */
    void saveByRolePermissionRef(RolePermissionRef rolePermissionRef);

    /**
     * 批量添加
     *
     * @param rolePermissionRefs 列表
     */
    void batchSaveByRolePermissionRef(List<RolePermissionRef> rolePermissionRefs);

}


================================================
FILE: src/main/java/com/example/sens/service/RoleService.java
================================================
package com.example.sens.service;

import com.example.sens.entity.Role;
import com.example.sens.common.base.BaseService;

import java.util.List;

/**
 * 角色逻辑接口
 */
public interface RoleService extends BaseService<Role, Long> {

    /**
     * 删除某个用户的所有关联
     *
     * @param userId 用户Id
     */
    void deleteByUserId(Long userId);

    /**
     * 根据编号查询单个权限
     *
     * @param roleId roleId
     * @return Role
     */
    Role findByRoleId(Long roleId);

    /**
     * 根据编号查询单个权限
     *
     * @param roleName roleName
     * @return Role
     */
    Role findByRoleName(String roleName);

    /**
     * 根据用户Id获得角色
     *
     * @param userId 用户Id
     * @return 角色列表
     */
    Role findByUserId(Long userId);

    /**
     * 统计这个角色的用户数
     *
     * @param roleId 角色Id
     */
    Integer countUserByRoleId(Long roleId);

    /**
     * 查询某个用户最大的角色等级
     * @param userId
     * @return
     */
    Integer findMaxLevelByUserId(Long userId);

    /**
     * 查询小于等于该等级的角色
     * @param level
     * @return
     */
    List<Role> findByLessThanLevel(Integer level);

    /**
     * 获得用户注册默认角色
     * @return
     */
    Role findDefaultRole();

    /**
     * 获得用户注册默认角色
     * @return
     */
    Role getMaxRoleByUserId(Long userId);

}


================================================
FILE: src/main/java/com/example/sens/service/UserRoleRefService.java
================================================
package com.example.sens.service;

import com.example.sens.entity.UserRoleRef;
import com.example.sens.common.base.BaseService;


public interface UserRoleRefService extends BaseService<UserRoleRef, Long> {

    /**
     * 根据用户Id删除
     *
     * @param userId 用户Id
     */
    void deleteByUserId(Long userId);


}


================================================
FILE: src/main/java/com/example/sens/service/UserService.java
================================================
package com.example.sens.service;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.example.sens.common.base.BaseService;
import com.example.sens.entity.User;

/**
 * 用户业务逻辑接口
 */
public interface UserService extends BaseService<User, Long> {

    /**
     * 根据账号获得用户
     *
     * @param userName 账号
     * @return 用户
     */
    User findByUserName(String userName);


    /**
     * 根据身份证号码查找用户
     *
     * @param idCard 身份证号码
     * @return User
     */
    User findByIdCard(String idCard);

    /**
     * 更新密码
     *
     * @param userId   用户Id
     * @param password 密码
     */
    void updatePassword(Long userId, String password);

    /**
     * 分页获取所有用户
     *
     * @param roleName  角色名称
     * @param condition 查询条件
     * @param page      分页信息
     * @return 用户列表
     */
    Page<User> findByRoleAndCondition(String roleName, User condition, Page<User> page);

}


================================================
FILE: src/main/java/com/example/sens/service/impl/CategoryServiceImpl.java
================================================
package com.example.sens.service.impl;

import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.example.sens.entity.Category;
import com.example.sens.mapper.CategoryMapper;
import com.example.sens.mapper.PostMapper;
import com.example.sens.service.CategoryService;
import com.example.sens.service.PostService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

/**
 * <pre>
 *     分类业务逻辑实现类
 * </pre>
 *
 */
@Service
public class CategoryServiceImpl implements CategoryService {

    @Autowired
    private CategoryMapper categoryMapper;

    @Autowired
    private PostMapper postMapper;

    @Autowired
    private PostService postService;

    @Override
    public BaseMapper<Category> getRepository() {
        return categoryMapper;
    }

    @Override
    public QueryWrapper<Category> getQueryWrapper(Category category) {
        //对指定字段查询
        QueryWrapper<Category> queryWrapper = new QueryWrapper<>();
        if (category != null) {
            if (StrUtil.isNotBlank(category.getCateName())) {
                queryWrapper.like("cate_name", category.getCateName());
            }
        }
        return queryWrapper;
    }

    @Override
    public Category insert(Category category) {
        categoryMapper.insert(category);
        return category;
    }

    @Override
    public Category update(Category category) {
        categoryMapper.updateById(category);
        return category;
    }

    @Override
    public void delete(Long id) {
        // 删除分类
        categoryMapper.deleteById(id);
    }


    @Override
    public List<Category> findByUserId(Long userId) {
        QueryWrapper queryWrapper = new QueryWrapper();
        queryWrapper.eq("user_id", userId);
        return categoryMapper.selectList(queryWrapper);
    }


    @Override
    public Integer countPostByCateId(Long cateId) {
        return postMapper.countPostByCateId(cateId);
    }

    @Override
    public Category insertOrUpdate(Category entity) {
        if (entity.getId() == null) {
            insert(entity);
        } else {
            update(entity);
        }
        return entity;
    }

    @Override
    public Integer deleteByUserId(Long userId) {
        return categoryMapper.deleteByUserId(userId);
    }

    @Override
    public List<Category> cateIdsToCateList(List<Long> cateIds, Long userId) {
        List<Category> categoryList = this.findByUserId(userId);
        List<Long> allCateIds = categoryList.stream().map(Category::getId).collect(Collectors.toList());
        List<Category> result = new ArrayList<>();
        for(Long id : cateIds) {
            if(allCateIds.contains(id)) {
                Category category = new Category();
                category.setId(id);
                result.add(category);
            }
        }
        return result;
    }


    @Override
    public List<Category> findAll() {
        return categoryMapper.findAllWithCount();
    }
}


================================================
FILE: src/main/java/com/example/sens/service/impl/CityServiceImpl.java
================================================
package com.example.sens.service.impl;

import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.example.sens.entity.City;
import com.example.sens.mapper.CityMapper;
import com.example.sens.service.CityService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * <pre>
 *     城市业务服务实现类
 * </pre>
 */
@Service
public class CityServiceImpl implements CityService {

    @Autowired
    private CityMapper cityMapper;


    @Override
    public BaseMapper<City> getRepository() {
        return cityMapper;
    }

    @Override
    public QueryWrapper<City> getQueryWrapper(City city) {
        //对指定字段查询
        QueryWrapper<City> queryWrapper = new QueryWrapper<>();
        if (city != null) {
            if (StrUtil.isNotBlank(city.getCityName())) {
                queryWrapper.like("city_name", city.getCityName());
            }
        }
        return queryWrapper;
    }

    @Override
    public List<City> findAll() {
        return cityMapper.findAllWithCount();
    }
}


================================================
FILE: src/main/java/com/example/sens/service/impl/MailServiceImpl.java
================================================
package com.example.sens.service.impl;

import com.example.sens.service.MailService;
import com.example.sens.util.SensUtils;
import io.github.biezhi.ome.OhMyEmail;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

import javax.mail.MessagingException;

/**
 * <pre>
 *     邮件发送业务逻辑实现类
 * </pre>
 *
 * @author : saysky
 * @date : 2018/1/23
 */
@Service
public class MailServiceImpl implements MailService {

    @Value("${mail.smtp.host}")
    private String host;

    @Value("${mail.smtp.username}")
    private String username;

    @Value("${mail.smtp.password}")
    private String password;

    @Value("${mail.from.name}")
    private String fromName;

    /**
     * 发送邮件
     *
     * @param to      to 接收者
     * @param title   subject 标题
     * @param content content 内容
     */
    @Override
    public void sendMail(String to, String title, String content) throws MessagingException {
        //配置邮件服务器
        SensUtils.configMail(host, username, password);
        OhMyEmail.subject(title)
                .from(fromName)
                .to(to)
                .text(content)
                .send();
    }
}


================================================
FILE: src/main/java/com/example/sens/service/impl/NoticeServiceImpl.java
================================================
package com.example.sens.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.example.sens.entity.Notice;
import com.example.sens.mapper.NoticeMapper;
import com.example.sens.service.NoticeService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;


/**
 * <pre>
 *     城市业务服务实现类
 * </pre>
 */
@Service
public class NoticeServiceImpl implements NoticeService {

    @Autowired
    private NoticeMapper noticeMapper;


    @Override
    public BaseMapper<Notice> getRepository() {
        return noticeMapper;
    }

    @Override
    public QueryWrapper<Notice> getQueryWrapper(Notice notice) {
        //对指定字段查询
        QueryWrapper<Notice> queryWrapper = new QueryWrapper<>();
        return queryWrapper;
    }

}


================================================
FILE: src/main/java/com/example/sens/service/impl/OrderServiceImpl.java
================================================
package com.example.sens.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.example.sens.entity.Order;
import com.example.sens.mapper.OrderMapper;
import com.example.sens.service.OrderService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

/**
 * @author 言曌
 * @date 2020/4/6 2:01 下午
 */
@Service
public class OrderServiceImpl implements OrderService {

    @Autowired
    private OrderMapper orderMapper;

    @Override
    public BaseMapper<Order> getRepository() {
        return orderMapper;
    }

    @Override
    public QueryWrapper<Order> getQueryWrapper(Order order) {
        //对指定字段查询
        QueryWrapper<Order> queryWrapper = new QueryWrapper<>();
        if (order != null) {
            if (order.getUserId() != null) {
                queryWrapper.eq("user_id", order.getUserId());
            }
            if (order.getOwnerUserId() != null) {
                queryWrapper.eq("owner_user_id", order.getOwnerUserId());
            }
            if (order.getPostId() != null) {
                queryWrapper.eq("post_id", order.getPostId());
            }
            if (order.getStatus() != null) {
                queryWrapper.eq("status", order.getStatus());
            }
            if (order.getStartDate() != null) {
                queryWrapper.eq("start_date", order.getStartDate());
            }
            if (order.getEndDate() != null) {
                queryWrapper.eq("end_date", order.getEndDate());
            }
        }
        return queryWrapper;
    }

    @Override
    public Integer getTotalPriceSum(Order condition) {
        return orderMapper.getTotalPriceSum(condition);
    }

    @Override
    public Page<Order> findAll(Order condition, Page<Order> page) {
        return page.setRecords(orderMapper.findAll(condition, page));
    }

    @Override
    public Order findByPostId(Long postId) {
        return orderMapper.findByPostId(postId);
    }
}


================================================
FILE: src/main/java/com/example/sens/service/impl/PermissionServiceImpl.java
================================================
package com.example.sens.service.impl;

import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.example.sens.entity.Permission;
import com.example.sens.mapper.PermissionMapper;
import com.example.sens.mapper.RolePermissionRefMapper;
import com.example.sens.service.PermissionService;
import com.example.sens.util.PermissionUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;

/**
 * 角色业务逻辑实现类
 */
@Service
public class PermissionServiceImpl implements PermissionService {

    @Autowired
    private PermissionMapper permissionMapper;

    @Autowired
    private RolePermissionRefMapper rolePermissionRefMapper;


    @Override
    public List<Permission> listPermissionsByRoleId(Long roleId) {
        return permissionMapper.findByRoleId(roleId);
    }

    @Override
    public Set<String> findPermissionUrlsByUserId(Long userId) {
        List<Permission> permissions = permissionMapper.findPermissionByUserId(userId);
        Set<String> urls = permissions.stream().map(p -> p.getUrl()).collect(Collectors.toSet());
        return urls;
    }

    @Override
    public List<Permission> findPermissionTreeByUserIdAndResourceType(Long userId, String resourceType) {
        List<Permission> permissions = permissionMapper.findPermissionByUserIdAndResourceType(userId, resourceType);
        return PermissionUtil.getPermissionTree(permissions);
    }

    @Override
    public List<Permission> findPermissionByRoleId(Long roleId) {
        return permissionMapper.findPermissionByRoleId(roleId);
    }


    @Override
    public BaseMapper<Permission> getRepository() {
        return permissionMapper;
    }

    @Override
    public QueryWrapper<Permission> getQueryWrapper(Permission permission) {
        //对指定字段查询
        QueryWrapper<Permission> queryWrapper = new QueryWrapper<>();
        if (permission != null) {
            if (StrUtil.isNotBlank(permission.getResourceType())) {
                queryWrapper.eq("resource_type", permission.getResourceType());
            }
            if (StrUtil.isNotBlank(permission.getResourceType())) {
                queryWrapper.eq("resource_type", permission.getResourceType());
            }
            if (StrUtil.isNotBlank(permission.getUrl())) {
                queryWrapper.eq("url", permission.getUrl());
            }
            if (StrUtil.isNotBlank(permission.getName())) {
                queryWrapper.eq("name", permission.getName());
            }
        }
        return queryWrapper;
    }

    @Override
    public Permission insertOrUpdate(Permission entity) {
        if (entity.getId() == null) {
            insert(entity);
        } else {
            update(entity);
        }
        return entity;
    }

    @Override
    @Transactional(rollbackFor = Exception.class)
    public void delete(Long id) {
        permissionMapper.deleteById(id);
        rolePermissionRefMapper.deleteByPermissionId(id);
    }

    @Override
    public List<Permission> findPermissionListWithLevel() {
        List<Permission> permissionList = permissionMapper.selectList(null);
        permissionList = PermissionUtil.getPermissionList(permissionList);

        // 加空格以展示等级
        for (Permission permission : permissionList) {
            for (int i = 1; i < permission.getLevel(); i++) {
                permission.setName("&nbsp;&nbsp;&nbsp;&nbsp;"+permission.getName());
            }
        }
        return permissionList;

    }

    @Override
    public Integer countChildPermission(Long id) {
        return permissionMapper.countChildPermission(id);
    }

    @Override
    public Permission findByUrl(String url) {
        return permissionMapper.findByUrl(url);
    }

}


================================================
FILE: src/main/java/com/example/sens/service/impl/PostServiceImpl.java
================================================
package com.example.sens.service.impl;

import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.example.sens.entity.*;
import com.example.sens.mapper.*;
import com.example.sens.service.*;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;


/**
 * <pre>
 *     房屋业务逻辑实现类
 * </pre>
 */
@Service
@Slf4j
public class PostServiceImpl implements PostService {


    @Autowired
    private PostMapper postMapper;

    @Override
    public Page<Post> findPostByCondition(Post condition, Page<Post> page) {
        List<Post> postList = postMapper.findPostByCondition(condition, page);
        return page.setRecords(postList);
    }

    @Override
    public Page<Post> findByRentUserId(Long userId, Page<Post> page) {
        List<Post> postList = postMapper.findByRentUserId(userId, page);
        return page.setRecords(postList);
    }


    @Override
    public BaseMapper<Post> getRepository() {
        return postMapper;
    }

    @Override
    public Post insert(Post post) {
        postMapper.insert(post);
        return post;
    }

    @Override
    public Post update(Post post) {
        postMapper.updateById(post);
        return post;
    }

    @Override
    @Transactional(rollbackFor = Exception.class)
    public void delete(Long postId) {
        postMapper.deleteById(postId);
    }

    @Override
    public QueryWrapper<Post> getQueryWrapper(Post post) {
        //对指定字段查询
        QueryWrapper<Post> queryWrapper = new QueryWrapper<>();
        if (post != null) {
            if (StrUtil.isNotBlank(post.getPostTitle())) {
                queryWrapper.like("post_title", post.getPostTitle());
            }
            if (StrUtil.isNotBlank(post.getPostContent())) {
                queryWrapper.like("post_content", post.getPostContent());
            }
            if (post.getPostStatus() != null && post.getPostStatus() != -1) {
                queryWrapper.eq("post_status", post.getPostStatus());
            }
        }
        return queryWrapper;
    }

    @Override
    public Post insertOrUpdate(Post post) {
        if (post.getId() == null) {
            insert(post);
        } else {
            update(post);
        }
        return post;
    }


    @Override
    public List<Post> getLatestPost(Long cityId, int limit) {
        return postMapper.getLatestPost(cityId, limit);
    }

    @Override
    public Integer countByStatus(Integer postStatus) {
        return postMapper.countByStatus(postStatus);
    }

    @Override
    public List<Post> getUnionRentPost(Post post) {

        Post temp = new Post();
        temp.setNumber(post.getNumber());
        temp.setUserId(post.getUserId());
        temp.setPostTitle(post.getPostTitle());
        temp.setCityId(post.getCityId());
        if (temp.getNumber() != null && temp.getNumber().length() > 2) {
            if (temp.getNumber().indexOf("室") != -1) {
                temp.setNumber(temp.getNumber().substring(0, temp.getNumber().indexOf("室") + 1));
            }
        }
        return postMapper.getUnionRentPost(temp);
    }

}



================================================
FILE: src/main/java/com/example/sens/service/impl/RechargeRecordServiceImpl.java
================================================
package com.example.sens.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.example.sens.entity.RechargeRecord;
import com.example.sens.mapper.RechargeRecordMapper;
import com.example.sens.service.RechargeRecordService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

/**
 * @author 言曌
 * @date 2020/3/22 3:19 下午
 */
@Service
public class RechargeRecordServiceImpl implements RechargeRecordService {

    @Autowired
    private RechargeRecordMapper rechargeRecordMapper;

    @Override
    public BaseMapper<RechargeRecord> getRepository() {
        return rechargeRecordMapper;
    }

    @Override
    public QueryWrapper<RechargeRecord> getQueryWrapper(RechargeRecord rechargeRecord) {
        //对指定字段查询
        QueryWrapper<RechargeRecord> queryWrapper = new QueryWrapper<>();
        if (rechargeRecord != null) {
            if (rechargeRecord.getUserId() != null) {
                queryWrapper.eq("user_id", rechargeRecord.getUserId());
            }
        }
        return queryWrapper;
    }

    @Override
    public Page<RechargeRecord> findAll(String startDate, String endDate, Page<RechargeRecord> page) {
        return page.setRecords(rechargeRecordMapper.findAll(startDate, endDate, page));
    }

    @Override
    public Page<RechargeRecord> findByUserId(String startDate, String endDate, Long userId, Page<RechargeRecord> page) {
        return page.setRecords(rechargeRecordMapper.findByUserId(startDate, endDate, userId, page));
    }

    @Override
    public Integer getTotalMoneySum(String startDate, String endDate) {
        return rechargeRecordMapper.getTotalMoneySum(startDate, endDate);
    }
}


================================================
FILE: src/main/java/com/example/sens/service/impl/RolePermissionRefServiceImpl.java
================================================
package com.example.sens.service.impl;

import com.example.sens.entity.RolePermissionRef;
import com.example.sens.mapper.RolePermissionRefMapper;
import com.example.sens.service.RolePermissionRefService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class RolePermissionRefServiceImpl implements RolePermissionRefService {

    @Autowired
    private RolePermissionRefMapper rolePermissionRefMapper;

    @Override
    public void deleteRefByRoleId(Long roleId) {
        rolePermissionRefMapper.deleteByRoleId(roleId);
    }

    @Override
    public void saveByRolePermissionRef(RolePermissionRef rolePermissionRef) {
        rolePermissionRefMapper.insert(rolePermissionRef);
    }

    @Override
    public void batchSaveByRolePermissionRef(List<RolePermissionRef> rolePermissionRefs) {
        rolePermissionRefMapper.batchInsert(rolePermissionRefs);
    }


================================================
FILE: src/main/java/com/example/sens/service/impl/RoleServiceImpl.java
================================================
package com.example.sens.service.impl;

import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.example.sens.entity.Permission;
import com.example.sens.entity.Role;
import com.example.sens.entity.RolePermissionRef;
import com.example.sens.mapper.RoleMapper;
import com.example.sens.service.RolePermissionRefService;
import com.example.sens.service.RoleService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.ArrayList;
import java.util.List;

/**
 * 角色业务逻辑实现类
 */
@Service
public class RoleServiceImpl implements RoleService {

    @Autowired
    private RoleMapper roleMapper;

    @Autowired
    private RolePermissionRefService rolePermissionRefService;

    @Override
    public BaseMapper<Role> getRepository() {
        return roleMapper;
    }

    @Override
    public QueryWrapper<Role> getQueryWrapper(Role role) {
        //对指定字段查询
        QueryWrapper<Role> queryWrapper = new QueryWrapper<>();
        if (role != null) {
            if (StrUtil.isNotBlank(role.getRole())) {
                queryWrapper.eq("role", role.getRole());
            }
            if (StrUtil.isNotBlank(role.getDescription())) {
                queryWrapper.eq("description", role.getDescription());
            }
        }
        return queryWrapper;
    }

    @Override
    public void deleteByUserId(Long userId) {
        roleMapper.deleteByUserId(userId);
    }

    @Override
    public Role findByRoleId(Long roleId) {
        return roleMapper.selectById(roleId);
    }

    @Override
    public Role findByRoleName(String roleName) {
        QueryWrapper queryWrapper = new QueryWrapper();
        queryWrapper.eq("role", roleName);
        return roleMapper.selectOne(queryWrapper);
    }

    @Override
    public Role findByUserId(Long userId) {
        return roleMapper.findByUserId(userId);
    }

    @Override
    public Integer countUserByRoleId(Long roleId) {
        return roleMapper.countUserByRoleId(roleId);
    }

    @Override
    public Integer findMaxLevelByUserId(Long userId) {
        return roleMapper.findMaxLevelByUserId(userId);
    }

    @Override
    public List<Role> findByLessThanLevel(Integer level) {
        return roleMapper.findByLessThanLevel(level);
    }

    @Override
    public Role findDefaultRole() {
        return roleMapper.findDefaultRole();
    }

    @Override
    public Role getMaxRoleByUserId(Long userId) {
        return null;
    }

    @Override
    @Transactional(rollbackFor = Exception.class)
    public Role insert(Role role) {
        roleMapper.insert(role);
        if (role.getPermissions() != null && role.getPermissions().size() > 0) {
            List<RolePermissionRef> rolePermissionRefs = new ArrayList<>(role.getPermissions().size());
            for (Permission permission : role.getPermissions()) {
                rolePermissionRefs.add(new RolePermissionRef(role.getId(), permission.getId()));
            }
            rolePermissionRefService.batchSaveByRolePermissionRef(rolePermissionRefs);
        }
        return role;
    }

    @Override
    @Transactional(rollbackFor = Exception.class)
    public Role update(Role role) {
        roleMapper.updateById(role);
        if (role.getPermissions() != null && role.getPermissions().size() > 0) {
            // 删除关联
            rolePermissionRefService.deleteRefByRoleId(role.getId());
            // 添加关联
            List<RolePermissionRef> rolePermissionRefs = new ArrayList<>(role.getPermissions().size());
            for (Permission permission : role.getPermissions()) {
                rolePermissionRefs.add(new RolePermissionRef(role.getId(), permission.getId()));
            }
            rolePermissionRefService.batchSaveByRolePermissionRef(rolePermissionRefs);
        }
        return role;
    }

    @Override
    public Role insertOrUpdate(Role entity) {
        if (entity.getId() == null) {
            insert(entity);
        } else {
            update(entity);
        }
        return entity;
    }

}


================================================
FILE: src/main/java/com/example/sens/service/impl/UserRoleRefServiceImpl.java
================================================
package com.example.sens.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.example.sens.entity.UserRoleRef;
import com.example.sens.mapper.UserRoleRefMapper;
import com.example.sens.service.UserRoleRefService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;


@Service
public class UserRoleRefServiceImpl implements UserRoleRefService {

    @Autowired
    private UserRoleRefMapper roleRefMapper;


    @Override
    public void deleteByUserId(Long userId) {
        roleRefMapper.deleteByUserId(userId);
    }

    @Override
    public BaseMapper<UserRoleRef> getRepository() {
        return roleRefMapper;
    }

    @Override
    public QueryWrapper<UserRoleRef> getQueryWrapper(UserRoleRef userRoleRef) {
        //对指定字段查询
        QueryWrapper<UserRoleRef> queryWrapper = new QueryWrapper<>();
        if (userRoleRef != null) {
            if (userRoleRef.getUserId() != null) {
                queryWrapper.eq("user_id", userRoleRef.getUserId());
            }
            if (userRoleRef.getRoleId() != null) {
                queryWrapper.eq("role_id", userRoleRef.getRoleId());
            }
        }
        return queryWrapper;
    }

}


================================================
FILE: src/main/java/com/example/sens/service/impl/UserServiceImpl.java
================================================
package com.example.sens.service.impl;

import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.example.sens.exception.MyBusinessException;
import com.example.sens.common.constant.CommonConstant;
import com.example.sens.entity.Role;
import com.example.sens.mapper.OrderMapper;
import com.example.sens.mapper.RechargeRecordMapper;
import com.example.sens.mapper.UserMapper;
import com.example.sens.entity.User;
import com.example.sens.service.RoleService;
import com.example.sens.service.UserService;
import com.example.sens.util.Md5Util;
import com.example.sens.util.RegexUtil;
import org.apache.commons.lang3.RandomUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.*;

/**
 * 用户业务逻辑实现类
 */
@Service
public class UserServiceImpl implements UserService {

    @Autowired
    private UserMapper userMapper;

    @Autowired
    private RoleService roleService;

    @Autowired
    private OrderMapper orderMapper;

    @Autowired
    private RechargeRecordMapper rechargeRecordMapper;

    @Override
    public User findByUserName(String userName) {
        QueryWrapper queryWrapper = new QueryWrapper();
        queryWrapper.eq("user_name", userName);
        return userMapper.selectOne(queryWrapper);
    }

    @Override
    public User findByIdCard(String idCard) {
        QueryWrapper queryWrapper = new QueryWrapper();
        queryWrapper.eq("id_card", idCard);
        return userMapper.selectOne(queryWrapper);
    }

    @Override
    public void updatePassword(Long userId, String password) {
        User user = new User();
        user.setId(userId);
        user.setUserPass(Md5Util.toMd5(password, CommonConstant.PASSWORD_SALT, 10));
        userMapper.updateById(user);
    }

    @Override
    public Page<User> findByRoleAndCondition(String roleName, User condition, Page<U
Download .txt
gitextract_uyewi9iz/

├── .gitattributes
├── .gitignore
├── README.md
├── pom.xml
└── src/
    └── main/
        ├── java/
        │   └── com/
        │       └── example/
        │           └── sens/
        │               ├── Application.java
        │               ├── common/
        │               │   ├── base/
        │               │   │   ├── BaseEntity.java
        │               │   │   └── BaseService.java
        │               │   └── constant/
        │               │       └── CommonConstant.java
        │               ├── config/
        │               │   ├── MvcConfig.java
        │               │   ├── mybatisplus/
        │               │   │   └── MybatisPlusConfig.java
        │               │   ├── properties/
        │               │   │   └── IgnoredUrlsProperties.java
        │               │   ├── schedule/
        │               │   │   └── SystemSchedule.java
        │               │   └── shiro/
        │               │       ├── MyRealm.java
        │               │       ├── ShiroConfig.java
        │               │       └── URLPathMatchingFilter.java
        │               ├── controller/
        │               │   ├── admin/
        │               │   │   ├── AdminController.java
        │               │   │   ├── AttachmentController.java
        │               │   │   ├── CategoryController.java
        │               │   │   ├── NoticeController.java
        │               │   │   ├── OrderController.java
        │               │   │   ├── PermissionController.java
        │               │   │   ├── PostController.java
        │               │   │   ├── ProfileController.java
        │               │   │   ├── RechargeRecordController.java
        │               │   │   ├── RoleController.java
        │               │   │   └── UserController.java
        │               │   ├── common/
        │               │   │   ├── BaseController.java
        │               │   │   └── CommonController.java
        │               │   └── home/
        │               │       ├── FrontPostController.java
        │               │       ├── IndexController.java
        │               │       └── LoginController.java
        │               ├── dto/
        │               │   ├── JsonResult.java
        │               │   ├── PostQueryCondition.java
        │               │   └── QueryCondition.java
        │               ├── entity/
        │               │   ├── Category.java
        │               │   ├── City.java
        │               │   ├── Notice.java
        │               │   ├── Order.java
        │               │   ├── Permission.java
        │               │   ├── Post.java
        │               │   ├── RechargeRecord.java
        │               │   ├── Role.java
        │               │   ├── RolePermissionRef.java
        │               │   ├── User.java
        │               │   └── UserRoleRef.java
        │               ├── enums/
        │               │   ├── CommonParamsEnum.java
        │               │   ├── OrderStatusEnum.java
        │               │   ├── PostIsRecommendEnum.java
        │               │   ├── PostIsStickyEnum.java
        │               │   ├── PostStatusEnum.java
        │               │   ├── PostTypeEnum.java
        │               │   ├── ResourceTypeEnum.java
        │               │   ├── ResultCodeEnum.java
        │               │   ├── RoleEnum.java
        │               │   ├── TrueFalseEnum.java
        │               │   └── UserStatusEnum.java
        │               ├── exception/
        │               │   ├── GlobalExceptionHandler.java
        │               │   └── MyBusinessException.java
        │               ├── mapper/
        │               │   ├── CategoryMapper.java
        │               │   ├── CityMapper.java
        │               │   ├── NoticeMapper.java
        │               │   ├── OrderMapper.java
        │               │   ├── PermissionMapper.java
        │               │   ├── PostMapper.java
        │               │   ├── RechargeRecordMapper.java
        │               │   ├── RoleMapper.java
        │               │   ├── RolePermissionRefMapper.java
        │               │   ├── UserMapper.java
        │               │   └── UserRoleRefMapper.java
        │               ├── service/
        │               │   ├── CategoryService.java
        │               │   ├── CityService.java
        │               │   ├── MailService.java
        │               │   ├── NoticeService.java
        │               │   ├── OrderService.java
        │               │   ├── PermissionService.java
        │               │   ├── PostService.java
        │               │   ├── RechargeRecordService.java
        │               │   ├── RolePermissionRefService.java
        │               │   ├── RoleService.java
        │               │   ├── UserRoleRefService.java
        │               │   ├── UserService.java
        │               │   └── impl/
        │               │       ├── CategoryServiceImpl.java
        │               │       ├── CityServiceImpl.java
        │               │       ├── MailServiceImpl.java
        │               │       ├── NoticeServiceImpl.java
        │               │       ├── OrderServiceImpl.java
        │               │       ├── PermissionServiceImpl.java
        │               │       ├── PostServiceImpl.java
        │               │       ├── RechargeRecordServiceImpl.java
        │               │       ├── RolePermissionRefServiceImpl.java
        │               │       ├── RoleServiceImpl.java
        │               │       ├── UserRoleRefServiceImpl.java
        │               │       └── UserServiceImpl.java
        │               ├── util/
        │               │   ├── DateUtil.java
        │               │   ├── FileUtil.java
        │               │   ├── IpInfoUtil.java
        │               │   ├── Md5Util.java
        │               │   ├── ObjectUtil.java
        │               │   ├── PageUtil.java
        │               │   ├── PermissionUtil.java
        │               │   ├── RegexUtil.java
        │               │   ├── RelativeDateFormat.java
        │               │   ├── Response.java
        │               │   ├── SensUtils.java
        │               │   ├── SpringUtil.java
        │               │   └── ThreadPoolUtil.java
        │               └── vo/
        │                   ├── PageVo.java
        │                   └── SearchVo.java
        └── resources/
            ├── application.yaml
            ├── mapper/
            │   ├── CategoryMapper.xml
            │   ├── CityMapper.xml
            │   ├── OrderMapper.xml
            │   ├── PermissionMapper.xml
            │   ├── PostMapper.xml
            │   ├── RechargeRecordMapper.xml
            │   ├── RoleMapper.xml
            │   ├── RolePermissionRefMapper.xml
            │   ├── UserMapper.xml
            │   └── UserRoleRefMapper.xml
            ├── static/
            │   ├── css/
            │   │   ├── AdminLTE.css
            │   │   ├── alt/
            │   │   │   ├── AdminLTE-bootstrap-social.css
            │   │   │   ├── AdminLTE-select2.css
            │   │   │   └── AdminLTE-without-plugins.css
            │   │   ├── loader.css
            │   │   ├── pay.css
            │   │   ├── skins/
            │   │   │   └── _all-skins.css
            │   │   └── style.css
            │   ├── front/
            │   │   ├── css/
            │   │   │   ├── pay.css
            │   │   │   └── style.css
            │   │   ├── js/
            │   │   │   ├── contact_me.js
            │   │   │   ├── custom.js
            │   │   │   └── jqBootstrapValidation.js
            │   │   └── vendor/
            │   │       └── select2/
            │   │           └── css/
            │   │               └── select2-bootstrap.css
            │   ├── js/
            │   │   ├── adminlte.js
            │   │   └── app.js
            │   └── plugins/
            │       ├── bootstrap/
            │       │   ├── css/
            │       │   │   ├── bootstrap-theme.css
            │       │   │   └── bootstrap.css
            │       │   └── js/
            │       │       ├── bootstrap.js
            │       │       └── npm.js
            │       ├── bootstrapStyle/
            │       │   └── bootstrapStyle.css
            │       ├── bootstrapvalidator/
            │       │   ├── css/
            │       │   │   └── bootstrapValidator.css
            │       │   └── js/
            │       │       ├── bootstrapValidator.js
            │       │       └── language/
            │       │           └── zh_CN.js
            │       ├── font-awesome/
            │       │   ├── css/
            │       │   │   └── font-awesome.css
            │       │   └── fonts/
            │       │       └── FontAwesome.otf
            │       ├── froala-editor/
            │       │   ├── css/
            │       │   │   ├── froala_editor.css
            │       │   │   ├── froala_editor.pkgd.css
            │       │   │   ├── froala_style.css
            │       │   │   ├── plugins/
            │       │   │   │   ├── char_counter.css
            │       │   │   │   ├── code_view.css
            │       │   │   │   ├── colors.css
            │       │   │   │   ├── draggable.css
            │       │   │   │   ├── emoticons.css
            │       │   │   │   ├── file.css
            │       │   │   │   ├── fullscreen.css
            │       │   │   │   ├── help.css
            │       │   │   │   ├── image.css
            │       │   │   │   ├── image_manager.css
            │       │   │   │   ├── line_breaker.css
            │       │   │   │   ├── quick_insert.css
            │       │   │   │   ├── special_characters.css
            │       │   │   │   ├── table.css
            │       │   │   │   └── video.css
            │       │   │   ├── themes/
            │       │   │   │   ├── dark.css
            │       │   │   │   ├── gray.css
            │       │   │   │   ├── red.css
            │       │   │   │   └── royal.css
            │       │   │   └── third_party/
            │       │   │       ├── embedly.css
            │       │   │       ├── font_awesome.css
            │       │   │       ├── image_tui.css
            │       │   │       └── spell_checker.css
            │       │   └── js/
            │       │       └── languages/
            │       │           ├── ar.js
            │       │           ├── bs.js
            │       │           ├── cs.js
            │       │           ├── da.js
            │       │           ├── de.js
            │       │           ├── el.js
            │       │           ├── en_ca.js
            │       │           ├── en_gb.js
            │       │           ├── es.js
            │       │           ├── et.js
            │       │           ├── fa.js
            │       │           ├── fi.js
            │       │           ├── fr.js
            │       │           ├── he.js
            │       │           ├── hr.js
            │       │           ├── hu.js
            │       │           ├── id.js
            │       │           ├── it.js
            │       │           ├── ja.js
            │       │           ├── ko.js
            │       │           ├── ku.js
            │       │           ├── me.js
            │       │           ├── nb.js
            │       │           ├── nl.js
            │       │           ├── pl.js
            │       │           ├── pt_br.js
            │       │           ├── pt_pt.js
            │       │           ├── ro.js
            │       │           ├── ru.js
            │       │           ├── sk.js
            │       │           ├── sr.js
            │       │           ├── sv.js
            │       │           ├── th.js
            │       │           ├── tr.js
            │       │           ├── uk.js
            │       │           ├── vi.js
            │       │           ├── zh_cn.js
            │       │           └── zh_tw.js
            │       ├── highlight/
            │       │   ├── highlight.css
            │       │   └── highlight.js
            │       ├── layer/
            │       │   ├── layer.js
            │       │   ├── mobile/
            │       │   │   ├── layer.js
            │       │   │   └── need/
            │       │   │       └── layer.css
            │       │   └── theme/
            │       │       └── default/
            │       │           └── layer.css
            │       ├── lazyload/
            │       │   └── jquery.lazyload.js
            │       ├── loaders/
            │       │   └── loaders.css
            │       ├── pace/
            │       │   ├── pace.css
            │       │   └── pace.js
            │       ├── pjax/
            │       │   └── jquery.pjax.js
            │       └── pretty-checkbox/
            │           └── pretty-checkbox.css
            └── 需要前端代码联系博主.txt
Download .txt
SYMBOL INDEX (616 symbols across 113 files)

FILE: src/main/java/com/example/sens/Application.java
  class Application (line 19) | @Slf4j
    method main (line 25) | public static void main(String[] args) {

FILE: src/main/java/com/example/sens/common/base/BaseEntity.java
  class BaseEntity (line 17) | @Data

FILE: src/main/java/com/example/sens/common/base/BaseService.java
  type BaseService (line 21) | public interface BaseService<E, ID extends Serializable> {
    method getRepository (line 26) | BaseMapper<E> getRepository();
    method get (line 34) | default E get(ID id) {
    method getAll (line 43) | default List<E> getAll() {
    method getTotalCount (line 52) | default Integer getTotalCount() {
    method insert (line 62) | default E insert(E entity) {
    method update (line 73) | default E update(E entity) {
    method insertOrUpdate (line 83) | default E insertOrUpdate(E entity) {
    method batchInsert (line 107) | default List<E> batchInsert(List<E> list) {
    method delete (line 120) | default void delete(ID id) {
    method batchDelete (line 129) | default void batchDelete(List<ID> ids) {
    method findByBatchIds (line 139) | default List<E> findByBatchIds(List<ID> ids) {
    method findAll (line 148) | default List<E> findAll() {
    method findAll (line 158) | default List<E> findAll(QueryWrapper<E> queryWrapper) {
    method findAll (line 168) | default List<E> findAll(QueryCondition<E> condition) {
    method findAll (line 183) | default Page<E> findAll(Page<E> page) {
    method getQueryWrapper (line 193) | QueryWrapper<E> getQueryWrapper(E e);
    method findAll (line 202) | default Page<E> findAll(Page<E> page, QueryCondition<E> condition) {
    method count (line 228) | default long count(QueryWrapper<E> queryWrapper) {

FILE: src/main/java/com/example/sens/common/constant/CommonConstant.java
  type CommonConstant (line 7) | public interface CommonConstant {

FILE: src/main/java/com/example/sens/config/MvcConfig.java
  class MvcConfig (line 17) | @Slf4j
    method addResourceHandlers (line 30) | @Override
    method addCorsMappings (line 43) | @Override
    method localeResolver (line 52) | @Bean

FILE: src/main/java/com/example/sens/config/mybatisplus/MybatisPlusConfig.java
  class MybatisPlusConfig (line 14) | @Configuration
    method performanceInterceptor (line 21) | @Bean
    method paginationInterceptor (line 34) | @Bean

FILE: src/main/java/com/example/sens/config/properties/IgnoredUrlsProperties.java
  class IgnoredUrlsProperties (line 13) | @Data

FILE: src/main/java/com/example/sens/config/schedule/SystemSchedule.java
  class SystemSchedule (line 24) | @Component
    method updatePostStatus (line 39) | @Scheduled(fixedRate = 10000)

FILE: src/main/java/com/example/sens/config/shiro/MyRealm.java
  class MyRealm (line 27) | @Slf4j
    method doGetAuthenticationInfo (line 46) | @Override
    method doGetAuthorizationInfo (line 85) | @Override

FILE: src/main/java/com/example/sens/config/shiro/ShiroConfig.java
  class ShiroConfig (line 19) | @Configuration
    method shiroDialect (line 22) | @Bean
    method getIgnoredUrlsProperties (line 27) | @Bean
    method shiroFilter (line 32) | @Bean
    method securityManager (line 67) | @Bean
    method myRealm (line 75) | @Bean
    method getURLPathMatchingFilter (line 87) | public URLPathMatchingFilter getURLPathMatchingFilter() {
    method hashedCredentialsMatcher (line 96) | @Bean
    method allowAllCredentialsMatcher (line 106) | @Bean

FILE: src/main/java/com/example/sens/config/shiro/URLPathMatchingFilter.java
  class URLPathMatchingFilter (line 22) | public class URLPathMatchingFilter extends PathMatchingFilter {
    method permissionService (line 26) | private PermissionService permissionService() {
    method onPreHandle (line 33) | @Override
    method isAjax (line 68) | public static boolean isAjax(HttpServletRequest httpRequest) {

FILE: src/main/java/com/example/sens/controller/admin/AdminController.java
  class AdminController (line 23) | @Slf4j
    method index (line 40) | @GetMapping
    method getMenu (line 51) | @GetMapping(value = "/currentMenus")
    method currentUser (line 62) | @GetMapping(value = "/currentUser")
    method currentRole (line 75) | @GetMapping(value = "/currentRole")
    method pay (line 86) | @GetMapping("/pay")

FILE: src/main/java/com/example/sens/controller/admin/AttachmentController.java
  class AttachmentController (line 22) | @Slf4j
    method uploadFile (line 34) | @PostMapping(value = "/upload", produces = {"application/json;charset=...

FILE: src/main/java/com/example/sens/controller/admin/CategoryController.java
  class CategoryController (line 21) | @Slf4j
    method categories (line 35) | @GetMapping
    method saveCategory (line 53) | @PostMapping(value = "/save")
    method checkDelete (line 66) | @DeleteMapping(value = "/delete")
    method toEditCategory (line 86) | @GetMapping(value = "/edit")

FILE: src/main/java/com/example/sens/controller/admin/NoticeController.java
  class NoticeController (line 28) | @Slf4j
    method notices (line 42) | @GetMapping
    method newNotice (line 69) | @GetMapping(value = "/new")
    method pushNotice (line 80) | @PostMapping(value = "/save")
    method removeNotice (line 104) | @DeleteMapping(value = "/delete")
    method editNotice (line 119) | @GetMapping(value = "/edit")

FILE: src/main/java/com/example/sens/controller/admin/OrderController.java
  class OrderController (line 27) | @Slf4j
    method orders (line 40) | @GetMapping
    method lease (line 60) | @GetMapping("/lease")
    method rent (line 82) | @GetMapping("/rent")
    method delete (line 105) | @DeleteMapping(value = "/delete")
    method finish (line 126) | @PostMapping(value = "/finish")
    method close (line 145) | @PostMapping(value = "/close")
    method finance (line 167) | @GetMapping("/finance")

FILE: src/main/java/com/example/sens/controller/admin/PermissionController.java
  class PermissionController (line 21) | @Slf4j
    method permissions (line 35) | @GetMapping
    method savePermission (line 58) | @PostMapping(value = "/save")
    method checkDelete (line 70) | @DeleteMapping(value = "/delete")
    method toAddPermission (line 88) | @GetMapping(value = "/new")
    method toEditPermission (line 104) | @GetMapping(value = "/edit")
    method getPermissionList (line 123) | public List<Permission> getPermissionList() {

FILE: src/main/java/com/example/sens/controller/admin/PostController.java
  class PostController (line 33) | @Slf4j
    method posts (line 61) | @GetMapping
    method lease (line 95) | @GetMapping("/lease")
    method rent (line 129) | @GetMapping("/rent")
    method newPost (line 159) | @GetMapping(value = "/new")
    method pushPost (line 176) | @PostMapping(value = "/save")
    method moveToPublish (line 222) | @PostMapping(value = "/revert")
    method removePost (line 241) | @DeleteMapping(value = "/delete")
    method editPost (line 275) | @GetMapping(value = "/edit")

FILE: src/main/java/com/example/sens/controller/admin/ProfileController.java
  class ProfileController (line 20) | @Slf4j
    method profile (line 33) | @GetMapping("/profile")
    method info (line 45) | @GetMapping("/info")
    method saveProfile (line 63) | @PostMapping(value = "/profile/save")
    method changePass (line 89) | @RequestMapping(method = RequestMethod.POST, value = "/changePass")

FILE: src/main/java/com/example/sens/controller/admin/RechargeRecordController.java
  class RechargeRecordController (line 23) | @Slf4j
    method rechargeRecords (line 39) | @GetMapping
    method checkDelete (line 69) | @DeleteMapping(value = "/delete")
    method rechargePage (line 82) | @GetMapping(value = "/new")
    method recharge (line 95) | @PostMapping(value = "/save")

FILE: src/main/java/com/example/sens/controller/admin/RoleController.java
  class RoleController (line 26) | @Slf4j
    method roles (line 42) | @GetMapping
    method saveRole (line 63) | @PostMapping(value = "/save")
    method checkDelete (line 88) | @DeleteMapping(value = "/delete")
    method addRole (line 106) | @GetMapping("/new")
    method toEditRole (line 120) | @GetMapping(value = "/edit")
    method getPermissionList (line 141) | public List<Permission> getPermissionList() {

FILE: src/main/java/com/example/sens/controller/admin/UserController.java
  class UserController (line 25) | @Slf4j
    method users (line 50) | @GetMapping
    method removeUser (line 95) | @DeleteMapping(value = "/delete")
    method addUser (line 107) | @GetMapping("/new")
    method edit (line 122) | @GetMapping("/edit")
    method batchDelete (line 147) | @DeleteMapping(value = "/batchDelete")
    method saveUser (line 167) | @PostMapping(value = "/save")

FILE: src/main/java/com/example/sens/controller/common/BaseController.java
  class BaseController (line 11) | public abstract class BaseController {
    method renderNotFound (line 18) | public String renderNotFound() {
    method renderNotAllowAccess (line 28) | public String renderNotAllowAccess() {
    method getLoginUser (line 37) | public User getLoginUser() {
    method getLoginUserId (line 50) | public Long getLoginUserId() {
    method loginUserIsAdmin (line 59) | public Boolean loginUserIsAdmin() {
    method loginUserIsUser (line 72) | public Boolean loginUserIsUser() {

FILE: src/main/java/com/example/sens/controller/common/CommonController.java
  class CommonController (line 14) | @Slf4j
    method handleError (line 25) | @GetMapping(value = "/error")
    method fourZeroThree (line 40) | @GetMapping(value = "/403")
    method fourZeroFour (line 51) | @GetMapping(value = "/404")
    method fiveZeroZero (line 62) | @GetMapping(value = "/500")
    method getErrorPath (line 72) | @Override

FILE: src/main/java/com/example/sens/controller/home/FrontPostController.java
  class FrontPostController (line 38) | @Controller
    method postList (line 62) | @GetMapping("/post")
    method postDetails (line 144) | @GetMapping("/post/{id}")
    method checkout (line 209) | @GetMapping("/checkout")
    method addOrder (line 267) | @PostMapping("/order")
    method order (line 316) | @GetMapping("/order/{id}")
    method agreement (line 349) | @GetMapping("/agreement")
    method agreementDownload (line 386) | @GetMapping("/agreement/download")
    method pay (line 440) | @GetMapping("/pay")
    method paySuccess (line 480) | @PostMapping("/pay")
    method login (line 528) | @GetMapping("/login")
    method register (line 534) | @GetMapping("/register")

FILE: src/main/java/com/example/sens/controller/home/IndexController.java
  class IndexController (line 23) | @Controller
    method index (line 38) | @GetMapping("/")
    method contact (line 56) | @GetMapping("/contact")
    method noticeList (line 74) | @GetMapping("/notice")
    method noticeDetails (line 102) | @GetMapping("/notice/{id}")

FILE: src/main/java/com/example/sens/controller/home/LoginController.java
  class LoginController (line 29) | @Controller
    method getLogin (line 52) | @PostMapping(value = "/login")
    method logOut (line 87) | @GetMapping(value = "/logout")
    method ajaxLogOut (line 99) | @PostMapping(value = "/logout")
    method getRegister (line 114) | @PostMapping(value = "/register")
    method checkLogin (line 156) | @GetMapping(value = "/checkLogin")

FILE: src/main/java/com/example/sens/dto/JsonResult.java
  class JsonResult (line 13) | @Data
    method JsonResult (line 37) | public JsonResult(Integer code, String msg) {
    method JsonResult (line 49) | public JsonResult(Integer code, String msg, Object result) {
    method JsonResult (line 61) | public JsonResult(Integer code, Object result) {
    method error (line 66) | public static JsonResult error(String msg) {
    method error (line 69) | public static JsonResult error(String msg, Object data) {
    method success (line 72) | public static JsonResult success() {
    method success (line 76) | public static JsonResult success(String msg) {
    method success (line 80) | public static JsonResult success(String msg, Object result) {

FILE: src/main/java/com/example/sens/dto/PostQueryCondition.java
  class PostQueryCondition (line 11) | @Data

FILE: src/main/java/com/example/sens/dto/QueryCondition.java
  class QueryCondition (line 13) | @Data
    method QueryCondition (line 27) | public QueryCondition() {
    method QueryCondition (line 30) | public QueryCondition(T data) {
    method QueryCondition (line 34) | public QueryCondition(T data, SearchVo searchVo) {

FILE: src/main/java/com/example/sens/entity/Category.java
  class Category (line 16) | @Data

FILE: src/main/java/com/example/sens/entity/City.java
  class City (line 16) | @Data

FILE: src/main/java/com/example/sens/entity/Notice.java
  class Notice (line 13) | @Data

FILE: src/main/java/com/example/sens/entity/Order.java
  class Order (line 15) | @Data

FILE: src/main/java/com/example/sens/entity/Permission.java
  class Permission (line 16) | @Data

FILE: src/main/java/com/example/sens/entity/Post.java
  class Post (line 12) | @Data

FILE: src/main/java/com/example/sens/entity/RechargeRecord.java
  class RechargeRecord (line 12) | @TableName("recharge_record")

FILE: src/main/java/com/example/sens/entity/Role.java
  class Role (line 13) | @Data

FILE: src/main/java/com/example/sens/entity/RolePermissionRef.java
  class RolePermissionRef (line 7) | @Data
    method RolePermissionRef (line 21) | public RolePermissionRef() {
    method RolePermissionRef (line 24) | public RolePermissionRef(Long roleId, Long permissionId) {

FILE: src/main/java/com/example/sens/entity/User.java
  class User (line 14) | @Data

FILE: src/main/java/com/example/sens/entity/UserRoleRef.java
  class UserRoleRef (line 12) | @Data
    method UserRoleRef (line 27) | public UserRoleRef(Long userId, Long roleId) {
    method UserRoleRef (line 32) | public UserRoleRef() {

FILE: src/main/java/com/example/sens/enums/CommonParamsEnum.java
  type CommonParamsEnum (line 6) | public enum CommonParamsEnum {
    method CommonParamsEnum (line 30) | CommonParamsEnum(Integer value) {
    method getValue (line 34) | public Integer getValue() {

FILE: src/main/java/com/example/sens/enums/OrderStatusEnum.java
  type OrderStatusEnum (line 8) | public enum OrderStatusEnum {
    method OrderStatusEnum (line 41) | OrderStatusEnum(Integer code) {
    method getCode (line 45) | public Integer getCode() {

FILE: src/main/java/com/example/sens/enums/PostIsRecommendEnum.java
  type PostIsRecommendEnum (line 6) | public enum PostIsRecommendEnum {
    method PostIsRecommendEnum (line 20) | PostIsRecommendEnum(Integer value) {
    method getValue (line 24) | public Integer getValue() {

FILE: src/main/java/com/example/sens/enums/PostIsStickyEnum.java
  type PostIsStickyEnum (line 6) | public enum PostIsStickyEnum {
    method PostIsStickyEnum (line 20) | PostIsStickyEnum(Integer value) {
    method getValue (line 24) | public Integer getValue() {

FILE: src/main/java/com/example/sens/enums/PostStatusEnum.java
  type PostStatusEnum (line 11) | public enum PostStatusEnum {
    method PostStatusEnum (line 30) | PostStatusEnum(Integer code) {
    method getCode (line 34) | public Integer getCode() {

FILE: src/main/java/com/example/sens/enums/PostTypeEnum.java
  type PostTypeEnum (line 11) | public enum PostTypeEnum {
    method PostTypeEnum (line 30) | PostTypeEnum(String value) {
    method getValue (line 34) | public String getValue() {

FILE: src/main/java/com/example/sens/enums/ResourceTypeEnum.java
  type ResourceTypeEnum (line 6) | public enum ResourceTypeEnum {
    method ResourceTypeEnum (line 28) | ResourceTypeEnum(String code, String description) {
    method getCode (line 33) | public String getCode() {
    method setCode (line 37) | public void setCode(String code) {
    method getDescription (line 41) | public String getDescription() {
    method setDescription (line 45) | public void setDescription(String description) {

FILE: src/main/java/com/example/sens/enums/ResultCodeEnum.java
  type ResultCodeEnum (line 6) | public enum ResultCodeEnum {
    method ResultCodeEnum (line 20) | ResultCodeEnum(Integer code) {
    method getCode (line 24) | public Integer getCode() {

FILE: src/main/java/com/example/sens/enums/RoleEnum.java
  type RoleEnum (line 9) | public enum RoleEnum {
    method RoleEnum (line 23) | RoleEnum(String value) {
    method getValue (line 27) | public String getValue() {

FILE: src/main/java/com/example/sens/enums/TrueFalseEnum.java
  type TrueFalseEnum (line 6) | public enum TrueFalseEnum {
    method TrueFalseEnum (line 20) | TrueFalseEnum(String value) {
    method getValue (line 24) | public String getValue() {

FILE: src/main/java/com/example/sens/enums/UserStatusEnum.java
  type UserStatusEnum (line 6) | public enum UserStatusEnum {
    method UserStatusEnum (line 21) | UserStatusEnum(Integer code) {
    method getCode (line 25) | public Integer getCode() {

FILE: src/main/java/com/example/sens/exception/GlobalExceptionHandler.java
  class GlobalExceptionHandler (line 38) | @ControllerAdvice
    method isAjax (line 48) | public static boolean isAjax(HttpServletRequest httpRequest) {
    method handleMissingServletRequestParameterException (line 58) | @ResponseStatus(HttpStatus.BAD_REQUEST)
    method handleHttpMessageNotReadableException (line 71) | @ResponseStatus(HttpStatus.BAD_REQUEST)
    method handleMethodArgumentNotValidException (line 84) | @ResponseStatus(HttpStatus.BAD_REQUEST)
    method handleBindException (line 101) | @ResponseStatus(HttpStatus.BAD_REQUEST)
    method handleServiceException (line 120) | @ResponseStatus(HttpStatus.BAD_REQUEST)
    method handleValidationException (line 135) | @ResponseStatus(HttpStatus.BAD_REQUEST)
    method noHandlerFoundException (line 148) | @ResponseStatus(HttpStatus.NOT_FOUND)
    method handleHttpRequestMethodNotSupportedException (line 162) | @ResponseStatus(HttpStatus.METHOD_NOT_ALLOWED)
    method handleHttpMediaTypeNotSupportedException (line 175) | @ResponseStatus(HttpStatus.UNSUPPORTED_MEDIA_TYPE)
    method processApiException (line 192) | @ExceptionHandler(MyBusinessException.class)
    method defaultErrorHandler (line 210) | @ExceptionHandler(value = Exception.class)

FILE: src/main/java/com/example/sens/exception/MyBusinessException.java
  class MyBusinessException (line 8) | public class MyBusinessException extends RuntimeException {
    method MyBusinessException (line 15) | public MyBusinessException() {
    method MyBusinessException (line 19) | public MyBusinessException(String message) {
    method MyBusinessException (line 24) | public MyBusinessException(Integer code, String message) {
    method getCode (line 29) | public Integer getCode() {
    method setCode (line 33) | public void setCode(Integer code) {
    method getMessage (line 37) | @Override
    method setMessage (line 42) | public void setMessage(String message) {

FILE: src/main/java/com/example/sens/mapper/CategoryMapper.java
  type CategoryMapper (line 13) | @Mapper
    method selectChildCateIds (line 22) | List<Long> selectChildCateIds(@Param("pathTrace") String pathTrace);
    method deleteByUserId (line 29) | Integer deleteByUserId(Long userId);
    method findAllWithCount (line 35) | List<Category> findAllWithCount();

FILE: src/main/java/com/example/sens/mapper/CityMapper.java
  type CityMapper (line 12) | @Mapper
    method findAllWithCount (line 19) | List<City> findAllWithCount();

FILE: src/main/java/com/example/sens/mapper/NoticeMapper.java
  type NoticeMapper (line 11) | @Mapper

FILE: src/main/java/com/example/sens/mapper/OrderMapper.java
  type OrderMapper (line 14) | @Mapper
    method findAll (line 23) | List<Order> findAll(@Param("condition") Order condition, Page page);
    method getTotalPriceSum (line 31) | Integer getTotalPriceSum(@Param("condition") Order condition);
    method updateOverDueOrder (line 38) | Integer updateOverDueOrder();
    method deleteByPostId (line 45) | Integer deleteByPostId(Long postId);
    method findOverDueOrder (line 51) | List<Order> findOverDueOrder();
    method findByPostId (line 58) | Order findByPostId(Long postId);

FILE: src/main/java/com/example/sens/mapper/PermissionMapper.java
  type PermissionMapper (line 14) | @Mapper
    method findByRoleId (line 23) | List<Permission> findByRoleId(Long roleId);
    method findPermissionByUserId (line 31) | List<Permission> findPermissionByUserId(Long userId);
    method findPermissionByUserIdAndResourceType (line 40) | List<Permission> findPermissionByUserIdAndResourceType(@Param("userId"...
    method findPermissionByResourceType (line 50) | List<Permission> findPermissionByResourceType(Integer resourceType);
    method findPermissionByRoleId (line 57) | List<Permission> findPermissionByRoleId(Long roleId);
    method countChildPermission (line 64) | Integer countChildPermission(Long id);
    method findByUrl (line 71) | Permission findByUrl(String url);

FILE: src/main/java/com/example/sens/mapper/PostMapper.java
  type PostMapper (line 15) | @Mapper
    method findPostByCondition (line 25) | List<Post> findPostByCondition(@Param(CommonConstant.CONDITION) Post c...
    method findByRentUserId (line 34) | List<Post> findByRentUserId(@Param("userId") Long userId, Page page);
    method countPostByCateId (line 42) | Integer countPostByCateId(Long cateId);
    method getLatestPost (line 52) | List<Post> getLatestPost(@Param("cityId") Long cityId, @Param("limit")...
    method countByStatus (line 60) | Integer countByStatus(Integer postStatus);
    method getUnionRentPost (line 67) | List<Post> getUnionRentPost(Post post);

FILE: src/main/java/com/example/sens/mapper/RechargeRecordMapper.java
  type RechargeRecordMapper (line 15) | @Mapper
    method deleteByUserId (line 24) | Integer deleteByUserId(Long userId);
    method findAll (line 31) | List<RechargeRecord> findAll(@Param("startDate") String startDate,
    method findByUserId (line 41) | List<RechargeRecord> findByUserId(@Param("startDate") String startDate,
    method getTotalMoneySum (line 52) | Integer getTotalMoneySum(@Param("startDate") String startDate,

FILE: src/main/java/com/example/sens/mapper/RoleMapper.java
  type RoleMapper (line 13) | @Mapper
    method findByUserId (line 23) | Role findByUserId(Long userId);
    method deleteByUserId (line 32) | Integer deleteByUserId(Long userId);
    method countUserByRoleId (line 40) | Integer countUserByRoleId(Long roleId);
    method findAllWithCount (line 47) | List<Role> findAllWithCount();
    method findByLessThanLevel (line 54) | List<Role> findByLessThanLevel(Integer level);
    method findMaxLevelByUserId (line 61) | Integer findMaxLevelByUserId(Long userId);
    method findDefaultRole (line 67) | Role findDefaultRole();

FILE: src/main/java/com/example/sens/mapper/RolePermissionRefMapper.java
  type RolePermissionRefMapper (line 13) | @Mapper
    method deleteByRoleId (line 23) | Integer deleteByRoleId(Long roleId);
    method deleteByPermissionId (line 31) | Integer deleteByPermissionId(Long permissionId);
    method batchInsert (line 38) | Integer batchInsert(List<RolePermissionRef> rolePermissionRefList);

FILE: src/main/java/com/example/sens/mapper/UserMapper.java
  type UserMapper (line 14) | @Mapper
    method findByRoleId (line 24) | List<User> findByRoleId(@Param("roleId") Long roleId, Page page);
    method findByRoleIdAndCondition (line 34) | List<User> findByRoleIdAndCondition(@Param("roleId") Long roleId,
    method findByCondition (line 44) | List<User> findByCondition( @Param("user") User user, Page page);
    method getTodayCount (line 50) | Integer getTodayCount();
    method getUserPostRanking (line 57) | List<User> getUserPostRanking(Integer limit);
    method getLatestUser (line 64) | List<User> getLatestUser(Integer limit);
    method getHotUsers (line 71) | List<User> getHotUsers(Integer limit);

FILE: src/main/java/com/example/sens/mapper/UserRoleRefMapper.java
  type UserRoleRefMapper (line 10) | @Mapper
    method deleteByUserId (line 19) | Integer deleteByUserId(Long userId);

FILE: src/main/java/com/example/sens/service/CategoryService.java
  type CategoryService (line 17) | public interface CategoryService extends BaseService<Category, Long> {
    method findByUserId (line 24) | List<Category> findByUserId(Long userId);
    method countPostByCateId (line 32) | Integer countPostByCateId(Long cateId);
    method deleteByUserId (line 40) | Integer deleteByUserId(Long userId);
    method cateIdsToCateList (line 49) | List<Category> cateIdsToCateList(List<Long> cateIds, Long userId);

FILE: src/main/java/com/example/sens/service/CityService.java
  type CityService (line 7) | public interface CityService extends BaseService<City, Long> {

FILE: src/main/java/com/example/sens/service/MailService.java
  type MailService (line 11) | public interface MailService {
    method sendMail (line 20) | void sendMail(String to, String title, String content) throws Messagin...

FILE: src/main/java/com/example/sens/service/NoticeService.java
  type NoticeService (line 7) | public interface NoticeService extends BaseService<Notice, Long> {

FILE: src/main/java/com/example/sens/service/OrderService.java
  type OrderService (line 13) | public interface OrderService extends BaseService<Order, Long> {
    method getTotalPriceSum (line 20) | Integer getTotalPriceSum(Order condition);
    method findAll (line 29) | Page<Order> findAll(Order condition, Page<Order> page);
    method findByPostId (line 36) | Order findByPostId(Long postId);

FILE: src/main/java/com/example/sens/service/PermissionService.java
  type PermissionService (line 12) | public interface PermissionService extends BaseService<Permission, Long> {
    method listPermissionsByRoleId (line 20) | List<Permission> listPermissionsByRoleId(Long roleId);
    method findPermissionUrlsByUserId (line 28) | Set<String> findPermissionUrlsByUserId(Long userId);
    method findPermissionTreeByUserIdAndResourceType (line 37) | List<Permission> findPermissionTreeByUserIdAndResourceType(Long userId...
    method findPermissionByRoleId (line 44) | List<Permission> findPermissionByRoleId(Long roleId);
    method findPermissionListWithLevel (line 50) | List<Permission> findPermissionListWithLevel();
    method countChildPermission (line 57) | Integer countChildPermission(Long id);
    method findByUrl (line 64) | Permission findByUrl(String url);

FILE: src/main/java/com/example/sens/service/PostService.java
  type PostService (line 14) | public interface PostService extends BaseService<Post, Long> {
    method findPostByCondition (line 22) | Page<Post> findPostByCondition(Post condition, Page<Post> page);
    method findByRentUserId (line 31) | Page<Post> findByRentUserId(Long userId, Page<Post> page);
    method getLatestPost (line 41) | List<Post> getLatestPost(Long cityId, int limit);
    method countByStatus (line 49) | Integer countByStatus(Integer postStatus);
    method getUnionRentPost (line 56) | List<Post> getUnionRentPost(Post post);

FILE: src/main/java/com/example/sens/service/RechargeRecordService.java
  type RechargeRecordService (line 13) | public interface RechargeRecordService extends BaseService<RechargeRecor...
    method findAll (line 16) | Page<RechargeRecord> findAll(String startDate, String endDate, Page<Re...
    method findByUserId (line 25) | Page<RechargeRecord> findByUserId(String startDate, String endDate, Lo...
    method getTotalMoneySum (line 35) | Integer getTotalMoneySum(String startDate, String endDate);

FILE: src/main/java/com/example/sens/service/RolePermissionRefService.java
  type RolePermissionRefService (line 8) | public interface RolePermissionRefService {
    method deleteRefByRoleId (line 15) | void deleteRefByRoleId(Long roleId);
    method saveByRolePermissionRef (line 23) | void saveByRolePermissionRef(RolePermissionRef rolePermissionRef);
    method batchSaveByRolePermissionRef (line 30) | void batchSaveByRolePermissionRef(List<RolePermissionRef> rolePermissi...

FILE: src/main/java/com/example/sens/service/RoleService.java
  type RoleService (line 11) | public interface RoleService extends BaseService<Role, Long> {
    method deleteByUserId (line 18) | void deleteByUserId(Long userId);
    method findByRoleId (line 26) | Role findByRoleId(Long roleId);
    method findByRoleName (line 34) | Role findByRoleName(String roleName);
    method findByUserId (line 42) | Role findByUserId(Long userId);
    method countUserByRoleId (line 49) | Integer countUserByRoleId(Long roleId);
    method findMaxLevelByUserId (line 56) | Integer findMaxLevelByUserId(Long userId);
    method findByLessThanLevel (line 63) | List<Role> findByLessThanLevel(Integer level);
    method findDefaultRole (line 69) | Role findDefaultRole();
    method getMaxRoleByUserId (line 75) | Role getMaxRoleByUserId(Long userId);

FILE: src/main/java/com/example/sens/service/UserRoleRefService.java
  type UserRoleRefService (line 7) | public interface UserRoleRefService extends BaseService<UserRoleRef, Lon...
    method deleteByUserId (line 14) | void deleteByUserId(Long userId);

FILE: src/main/java/com/example/sens/service/UserService.java
  type UserService (line 10) | public interface UserService extends BaseService<User, Long> {
    method findByUserName (line 18) | User findByUserName(String userName);
    method findByIdCard (line 27) | User findByIdCard(String idCard);
    method updatePassword (line 35) | void updatePassword(Long userId, String password);
    method findByRoleAndCondition (line 45) | Page<User> findByRoleAndCondition(String roleName, User condition, Pag...

FILE: src/main/java/com/example/sens/service/impl/CategoryServiceImpl.java
  class CategoryServiceImpl (line 24) | @Service
    method getRepository (line 36) | @Override
    method getQueryWrapper (line 41) | @Override
    method insert (line 53) | @Override
    method update (line 59) | @Override
    method delete (line 65) | @Override
    method findByUserId (line 72) | @Override
    method countPostByCateId (line 80) | @Override
    method insertOrUpdate (line 85) | @Override
    method deleteByUserId (line 95) | @Override
    method cateIdsToCateList (line 100) | @Override
    method findAll (line 116) | @Override

FILE: src/main/java/com/example/sens/service/impl/CityServiceImpl.java
  class CityServiceImpl (line 19) | @Service
    method getRepository (line 26) | @Override
    method getQueryWrapper (line 31) | @Override
    method findAll (line 43) | @Override

FILE: src/main/java/com/example/sens/service/impl/MailServiceImpl.java
  class MailServiceImpl (line 19) | @Service
    method sendMail (line 41) | @Override

FILE: src/main/java/com/example/sens/service/impl/NoticeServiceImpl.java
  class NoticeServiceImpl (line 17) | @Service
    method getRepository (line 24) | @Override
    method getQueryWrapper (line 29) | @Override

FILE: src/main/java/com/example/sens/service/impl/OrderServiceImpl.java
  class OrderServiceImpl (line 16) | @Service
    method getRepository (line 22) | @Override
    method getQueryWrapper (line 27) | @Override
    method getTotalPriceSum (line 54) | @Override
    method findAll (line 59) | @Override
    method findByPostId (line 64) | @Override

FILE: src/main/java/com/example/sens/service/impl/PermissionServiceImpl.java
  class PermissionServiceImpl (line 22) | @Service
    method listPermissionsByRoleId (line 32) | @Override
    method findPermissionUrlsByUserId (line 37) | @Override
    method findPermissionTreeByUserIdAndResourceType (line 44) | @Override
    method findPermissionByRoleId (line 50) | @Override
    method getRepository (line 56) | @Override
    method getQueryWrapper (line 61) | @Override
    method insertOrUpdate (line 82) | @Override
    method delete (line 92) | @Override
    method findPermissionListWithLevel (line 99) | @Override
    method countChildPermission (line 114) | @Override
    method findByUrl (line 119) | @Override

FILE: src/main/java/com/example/sens/service/impl/PostServiceImpl.java
  class PostServiceImpl (line 23) | @Service
    method findPostByCondition (line 31) | @Override
    method findByRentUserId (line 37) | @Override
    method getRepository (line 44) | @Override
    method insert (line 49) | @Override
    method update (line 55) | @Override
    method delete (line 61) | @Override
    method getQueryWrapper (line 67) | @Override
    method insertOrUpdate (line 85) | @Override
    method getLatestPost (line 96) | @Override
    method countByStatus (line 101) | @Override
    method getUnionRentPost (line 106) | @Override

FILE: src/main/java/com/example/sens/service/impl/RechargeRecordServiceImpl.java
  class RechargeRecordServiceImpl (line 16) | @Service
    method getRepository (line 22) | @Override
    method getQueryWrapper (line 27) | @Override
    method findAll (line 39) | @Override
    method findByUserId (line 44) | @Override
    method getTotalMoneySum (line 49) | @Override

FILE: src/main/java/com/example/sens/service/impl/RolePermissionRefServiceImpl.java
  class RolePermissionRefServiceImpl (line 11) | @Service
    method deleteRefByRoleId (line 17) | @Override
    method saveByRolePermissionRef (line 22) | @Override
    method batchSaveByRolePermissionRef (line 27) | @Override

FILE: src/main/java/com/example/sens/service/impl/RoleServiceImpl.java
  class RoleServiceImpl (line 22) | @Service
    method getRepository (line 31) | @Override
    method getQueryWrapper (line 36) | @Override
    method deleteByUserId (line 51) | @Override
    method findByRoleId (line 56) | @Override
    method findByRoleName (line 61) | @Override
    method findByUserId (line 68) | @Override
    method countUserByRoleId (line 73) | @Override
    method findMaxLevelByUserId (line 78) | @Override
    method findByLessThanLevel (line 83) | @Override
    method findDefaultRole (line 88) | @Override
    method getMaxRoleByUserId (line 93) | @Override
    method insert (line 98) | @Override
    method update (line 112) | @Override
    method insertOrUpdate (line 129) | @Override

FILE: src/main/java/com/example/sens/service/impl/UserRoleRefServiceImpl.java
  class UserRoleRefServiceImpl (line 12) | @Service
    method deleteByUserId (line 19) | @Override
    method getRepository (line 24) | @Override
    method getQueryWrapper (line 29) | @Override

FILE: src/main/java/com/example/sens/service/impl/UserServiceImpl.java
  class UserServiceImpl (line 29) | @Service
    method findByUserName (line 44) | @Override
    method findByIdCard (line 51) | @Override
    method updatePassword (line 58) | @Override
    method findByRoleAndCondition (line 66) | @Override
    method getRepository (line 80) | @Override
    method getQueryWrapper (line 85) | @Override
    method insert (line 100) | @Override
    method update (line 111) | @Override
    method checkUserNameAndIdCard (line 122) | private void checkUserNameAndIdCard(User user) {
    method delete (line 142) | @Override
    method insertOrUpdate (line 166) | @Override
    method basicCheck (line 177) | private void basicCheck(User user) {
    method get (line 195) | @Override

FILE: src/main/java/com/example/sens/util/DateUtil.java
  class DateUtil (line 12) | public class DateUtil {
    method getBetweenDates (line 18) | public static List<String> getBetweenDates(String start, int count) {
    method getBetweenDates (line 38) | public static List<String> getBetweenDates(String start, String end) {
    method main (line 62) | public static void main(String[] args) {

FILE: src/main/java/com/example/sens/util/FileUtil.java
  class FileUtil (line 17) | public class FileUtil {
    method upload (line 25) | public static String upload(MultipartFile file) {
    method readStringFromUrl (line 84) | public static String readStringFromUrl(String url) throws IOException,...
    method readAll (line 96) | private static String readAll(Reader rd) throws IOException {

FILE: src/main/java/com/example/sens/util/IpInfoUtil.java
  class IpInfoUtil (line 14) | @Slf4j
    method getIpAddr (line 22) | public static String  getIpAddr(HttpServletRequest request) {

FILE: src/main/java/com/example/sens/util/Md5Util.java
  class Md5Util (line 13) | public class Md5Util {
    method toMd5 (line 24) | public static String toMd5(String pwd, String salt, int i) {
    method createChecksum (line 36) | private static byte[] createChecksum(MultipartFile file) throws Except...
    method getMD5Checksum (line 61) | public static String getMD5Checksum(MultipartFile file) throws Excepti...
    method main (line 71) | public static void main(String args[]) {

FILE: src/main/java/com/example/sens/util/ObjectUtil.java
  class ObjectUtil (line 14) | public class ObjectUtil {
    method mapToString (line 16) | public static String mapToString(Map<String, String[]> paramMap){
    method mapToStringAll (line 32) | public static String mapToStringAll(Map<String, String[]> paramMap){
    method beanToMap (line 47) | public static <T> Map<String, Object> beanToMap(T bean) {

FILE: src/main/java/com/example/sens/util/PageUtil.java
  class PageUtil (line 15) | public class PageUtil {
    method initMpPage (line 31) | public static Page initMpPage(long pageNumber, long pageSize, String s...
    method listToPage (line 78) | public static List listToPage(PageVo page, List list) {
    method camelToUnderline (line 108) | private static String camelToUnderline(String str) {
    method convertPageVo (line 134) | public static PageVo convertPageVo(Page page) {

FILE: src/main/java/com/example/sens/util/PermissionUtil.java
  class PermissionUtil (line 12) | public class PermissionUtil {
    method getPermissionTree (line 21) | public static List<Permission> getPermissionTree(List<Permission> perm...
    method getChildTree (line 43) | private static List<Permission> getChildTree(Long id, List<Permission>...
    method getPermissionList (line 69) | public static List<Permission> getPermissionList(List<Permission> perm...
    method getChildList (line 89) | private static List<Permission> getChildList(Permission parentPermissi...

FILE: src/main/java/com/example/sens/util/RegexUtil.java
  class RegexUtil (line 13) | public class RegexUtil {
    method isEmail (line 21) | public static boolean isEmail(String email) {
    method isIdCard (line 36) | public static boolean isIdCard(String idCard) {
    method getImgSrc (line 43) | public static List<String> getImgSrc(String htmlStr) {

FILE: src/main/java/com/example/sens/util/RelativeDateFormat.java
  class RelativeDateFormat (line 11) | public class RelativeDateFormat {
    method format (line 25) | public static String format(Date date) {
    method toSeconds (line 55) | private static long toSeconds(long date) {
    method toMinutes (line 59) | private static long toMinutes(long date) {
    method toHours (line 63) | private static long toHours(long date) {
    method toDays (line 67) | private static long toDays(long date) {
    method toMonths (line 71) | private static long toMonths(long date) {
    method toYears (line 75) | private static long toYears(long date) {

FILE: src/main/java/com/example/sens/util/Response.java
  class Response (line 3) | public class Response<T> {
    method Response (line 16) | public Response() {
    method Response (line 19) | public Response(Boolean success) {
    method Response (line 23) | public Response(Boolean success, String message) {
    method Response (line 28) | public Response(Boolean success, String message, T data) {
    method Response (line 34) | public Response(Boolean success, Integer status, String message, T dat...
    method yes (line 42) | public static <T> Response<T> yes() {
    method yes (line 46) | public static <T> Response<T> yes(T data) {
    method yes (line 50) | public static <T> Response<T> yes(String message, T data) {
    method no (line 54) | public static <T> Response<T> no() {
    method no (line 58) | public static <T> Response<T> no(String message) {
    method no (line 62) | public static <T> Response<T> no(Integer status, String message) {
    method isSuccess (line 66) | public Boolean isSuccess() {
    method setSuccess (line 70) | public void setSuccess(Boolean success) {
    method getMessage (line 74) | public String getMessage() {
    method setMessage (line 78) | public void setMessage(String message) {
    method getData (line 82) | public T getData() {
    method setData (line 86) | public void setData(T data) {
    method getSuccess (line 90) | public Boolean getSuccess() {
    method getStatus (line 94) | public Integer getStatus() {
    method setStatus (line 98) | public void setStatus(Integer status) {

FILE: src/main/java/com/example/sens/util/SensUtils.java
  class SensUtils (line 13) | @Slf4j
    method configMail (line 23) | public static void configMail(String smtpHost, String userName, String...
    method listToStr (line 30) | public static String listToStr(List<String> list) {
    method main (line 42) | public static void main(String[] args) {

FILE: src/main/java/com/example/sens/util/SpringUtil.java
  class SpringUtil (line 8) | @Component
    method getApplicationContext (line 18) | public static ApplicationContext getApplicationContext() {
    method setApplicationContext (line 22) | @Override
    method getBean (line 35) | public static Object getBean(String name) {
    method getBean (line 46) | public static <T> T getBean(Class<T> clazz) {

FILE: src/main/java/com/example/sens/util/ThreadPoolUtil.java
  class ThreadPoolUtil (line 11) | public class ThreadPoolUtil {
    method getPool (line 37) | public static ThreadPoolExecutor getPool() {
    method main (line 41) | public static void main(String[] args) {

FILE: src/main/java/com/example/sens/vo/PageVo.java
  class PageVo (line 11) | @Data
    method PageVo (line 52) | public PageVo() {
    method PageVo (line 55) | public PageVo(int page, int size) {
    method PageVo (line 60) | public PageVo(int page, int size, String sort, String order) {

FILE: src/main/java/com/example/sens/vo/SearchVo.java
  class SearchVo (line 10) | @Data

FILE: src/main/resources/static/front/js/jqBootstrapValidation.js
  function regexFromString (line 875) | function regexFromString(inputstring) {
  function executeFunctionByName (line 885) | function executeFunctionByName(functionName, context /*, args*/) {

FILE: src/main/resources/static/js/adminlte.js
  function Plugin (line 99) | function Plugin(option) {
  function Plugin (line 269) | function Plugin(option) {
  function Plugin (line 414) | function Plugin(option) {
  function Plugin (line 483) | function Plugin(option) {
  function Plugin (line 659) | function Plugin(option) {
  function Plugin (line 838) | function Plugin(option) {
  function Plugin (line 944) | function Plugin(option) {
  function Plugin (line 1098) | function Plugin(option) {

FILE: src/main/resources/static/js/app.js
  function initMenus (line 1) | function initMenus() {
  function getLoginUser (line 47) | function getLoginUser() {
  function initMenu (line 83) | function initMenu() {
  function showMsg (line 115) | function showMsg(text, icon, hideAfter) {
  function showMsgAndReload (line 134) | function showMsgAndReload(text, icon, hideAfter) {
  function showMsgAndRedirect (line 156) | function showMsgAndRedirect(text, icon, hideAfter, redirectUrl) {
  function doCheck (line 183) | function doCheck() {
  function push (line 200) | function push(status) {
  function saveNotice (line 256) | function saveNotice() {

FILE: src/main/resources/static/plugins/bootstrap/js/bootstrap.js
  function transitionEnd (line 34) | function transitionEnd() {
  function removeElement (line 126) | function removeElement() {
  function Plugin (line 142) | function Plugin(option) {
  function Plugin (line 251) | function Plugin(option) {
  function Plugin (line 475) | function Plugin(option) {
  function getTargetFromTrigger (line 695) | function getTargetFromTrigger($trigger) {
  function Plugin (line 707) | function Plugin(option) {
  function getParent (line 774) | function getParent($this) {
  function clearMenus (line 787) | function clearMenus(e) {
  function Plugin (line 880) | function Plugin(option) {
  function Plugin (line 1208) | function Plugin(option, _relatedTarget) {
  function complete (line 1574) | function complete() {
  function Plugin (line 1750) | function Plugin(option) {
  function Plugin (line 1859) | function Plugin(option) {
  function ScrollSpy (line 1902) | function ScrollSpy(element, options) {
  function Plugin (line 2022) | function Plugin(option) {
  function next (line 2131) | function next() {
  function Plugin (line 2177) | function Plugin(option) {
  function Plugin (line 2334) | function Plugin(option) {

FILE: src/main/resources/static/plugins/bootstrapvalidator/js/bootstrapValidator.js
  function runCallback (line 6003) | function runCallback() {

FILE: src/main/resources/static/plugins/highlight/highlight.js
  function InsertSpaces (line 1) | function InsertSpaces(_36,pos,_38){var _39=_36.substr(0,pos);var _3a=_36...
  function ProcessLine (line 1) | function ProcessLine(_3d,_3e){if(_3d.indexOf(tab)==-1){return _3d;}var p...
  function Trim (line 1) | function Trim(str){return str.replace(/^\s*(.*?)[\s\n]*$/g,"$1");}
  function Chop (line 1) | function Chop(str){return str.replace(/\n*$/,"").replace(/^\n*/,"");}
  function Unindent (line 1) | function Unindent(str){var _4f=str.split("\n");var _50=new Array();var _...
  function Copy (line 1) | function Copy(_56,_57,_58){return _56.substr(_57,_58-_57);}
  function FindValue (line 1) | function FindValue(){var a=arguments;for(var i=0;i<a.length;i++){if(a[i]...
  function IsOptionSet (line 1) | function IsOptionSet(_66,_67){for(var i=0;i<_67.length;i++){if(_67[i]==_...
  function GetOptionValue (line 1) | function GetOptionValue(_69,_6a,_6b){var _6c=new RegExp("^"+_69+"\\[(\\w...
  function push (line 10) | function push(array,value){array[array.length]=value;}
  function clearText (line 20) | function clearText()
  function generateCode (line 27) | function generateCode()
  function docopy (line 43) | function docopy(src)
  function dopasted (line 68) | function dopasted(dst)
  function doclear (line 87) | function doclear(dst)
  function FindValue (line 113) | function FindValue()
  function IsoptionSet (line 132) | function IsoptionSet(value, list)
  function GetoptionValue (line 141) | function GetoptionValue(name, list, defaultValue)

FILE: src/main/resources/static/plugins/lazyload/jquery.lazyload.js
  function update (line 35) | function update() {

FILE: src/main/resources/static/plugins/pace/pace.js
  function ctor (line 5) | function ctor() { this.constructor = child; }
  function Evented (line 137) | function Evented() {}
  function NoTargetError (line 224) | function NoTargetError() {
  function Bar (line 234) | function Bar() {
  function Events (line 316) | function Events() {
  function RequestIntercept (line 419) | function RequestIntercept() {
  function AjaxMonitor (line 551) | function AjaxMonitor() {
  function XHRRequestTracker (line 578) | function XHRRequestTracker(request) {
  function SocketRequestTracker (line 617) | function SocketRequestTracker(request) {
  function ElementMonitor (line 635) | function ElementMonitor(options) {
  function ElementTracker (line 656) | function ElementTracker(selector) {
  function DocumentMonitor (line 688) | function DocumentMonitor() {
  function EventLagMonitor (line 706) | function EventLagMonitor() {
  function Scaler (line 737) | function Scaler(source) {

FILE: src/main/resources/static/plugins/pjax/jquery.pjax.js
  function fnPjax (line 30) | function fnPjax(selector, container, options) {
  function handleClick (line 56) | function handleClick(event, container, options) {
  function handleSubmit (line 113) | function handleSubmit(event, container, options) {
  function pjax (line 166) | function pjax(options) {
  function pjaxReload (line 380) | function pjaxReload(container, options) {
  function locationReplace (line 397) | function locationReplace(url) {
  function onPjaxPopstate (line 423) | function onPjaxPopstate(event) {
  function fallbackPjax (line 507) | function fallbackPjax(options) {
  function abortXHR (line 547) | function abortXHR(xhr) {
  function uniqueId (line 560) | function uniqueId() {
  function cloneContents (line 564) | function cloneContents(container) {
  function stripInternalParams (line 577) | function stripInternalParams(url) {
  function parseURL (line 587) | function parseURL(url) {
  function stripHash (line 599) | function stripHash(location) {
  function optionsFor (line 620) | function optionsFor(container, options) {
  function findAll (line 641) | function findAll(elems, selector) {
  function parseHTML (line 645) | function parseHTML(html) {
  function extractContainer (line 660) | function extractContainer(data, xhr, options) {
  function executeScriptTags (line 734) | function executeScriptTags(scripts) {
  function cachePush (line 767) | function cachePush(id, value) {
  function cachePop (line 787) | function cachePop(direction, id, value) {
  function trimCacheStack (line 814) | function trimCacheStack(stack, length) {
  function findVersion (line 822) | function findVersion() {
  function enable (line 838) | function enable() {
  function disable (line 870) | function disable() {
Condensed preview — 222 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (2,449K chars).
[
  {
    "path": ".gitattributes",
    "chars": 89,
    "preview": "*.js linguist-language=Java\n*.css linguist-language=Java\n*.html linguist-language=Java\n\n\n"
  },
  {
    "path": ".gitignore",
    "chars": 409,
    "preview": "target/\nlogs/\nout/\n!.mvn/wrapper/maven-wrapper.jar\n### STS ###\n.apt_generated\n.classpath\n.factorypath\n.project\n.settings"
  },
  {
    "path": "README.md",
    "chars": 3476,
    "preview": "最新消息,博主已开通B站账号:[Java刘哥](https://space.bilibili.com/160340478)\n<hr/> \n\n\n\n# 租房系统\n基于SpringBoot实现的租房系统,包括三种角色:管理员、房东、租客。\n- 详"
  },
  {
    "path": "pom.xml",
    "chars": 6657,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2"
  },
  {
    "path": "src/main/java/com/example/sens/Application.java",
    "chars": 919,
    "preview": "package com.example.sens;\n\nimport lombok.extern.slf4j.Slf4j;\nimport org.mybatis.spring.annotation.MapperScan;\nimport org"
  },
  {
    "path": "src/main/java/com/example/sens/common/base/BaseEntity.java",
    "chars": 956,
    "preview": "package com.example.sens.common.base;\n\nimport com.baomidou.mybatisplus.annotation.IdType;\nimport com.baomidou.mybatisplu"
  },
  {
    "path": "src/main/java/com/example/sens/common/base/BaseService.java",
    "chars": 4799,
    "preview": "package com.example.sens.common.base;\n\nimport cn.hutool.core.date.DateUtil;\nimport cn.hutool.core.util.StrUtil;\nimport c"
  },
  {
    "path": "src/main/java/com/example/sens/common/constant/CommonConstant.java",
    "chars": 327,
    "preview": "package com.example.sens.common.constant;\n\n/**\n * 常量\n * @author 言曌\n */\npublic interface CommonConstant {\n\n    /**\n     *"
  },
  {
    "path": "src/main/java/com/example/sens/config/MvcConfig.java",
    "chars": 2001,
    "preview": "package com.example.sens.config;\n\nimport lombok.extern.slf4j.Slf4j;\nimport org.springframework.context.annotation.Bean;\n"
  },
  {
    "path": "src/main/java/com/example/sens/config/mybatisplus/MybatisPlusConfig.java",
    "chars": 1027,
    "preview": "package com.example.sens.config.mybatisplus;\n\nimport com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;\ni"
  },
  {
    "path": "src/main/java/com/example/sens/config/properties/IgnoredUrlsProperties.java",
    "chars": 439,
    "preview": "package com.example.sens.config.properties;\n\nimport lombok.Data;\nimport org.springframework.boot.context.properties.Conf"
  },
  {
    "path": "src/main/java/com/example/sens/config/schedule/SystemSchedule.java",
    "chars": 2464,
    "preview": "package com.example.sens.config.schedule;\n\nimport com.example.sens.entity.Order;\nimport com.example.sens.entity.Post;\nim"
  },
  {
    "path": "src/main/java/com/example/sens/config/shiro/MyRealm.java",
    "chars": 3334,
    "preview": "package com.example.sens.config.shiro;\n\nimport com.example.sens.common.constant.CommonConstant;\nimport com.example.sens."
  },
  {
    "path": "src/main/java/com/example/sens/config/shiro/ShiroConfig.java",
    "chars": 3426,
    "preview": "package com.example.sens.config.shiro;\n\nimport at.pollux.thymeleaf.shiro.dialect.ShiroDialect;\nimport com.example.sens.c"
  },
  {
    "path": "src/main/java/com/example/sens/config/shiro/URLPathMatchingFilter.java",
    "chars": 2451,
    "preview": "package com.example.sens.config.shiro;\n\nimport com.alibaba.fastjson.JSONObject;\nimport com.example.sens.service.Permissi"
  },
  {
    "path": "src/main/java/com/example/sens/controller/admin/AdminController.java",
    "chars": 2269,
    "preview": "package com.example.sens.controller.admin;\n\nimport com.example.sens.entity.Permission;\nimport com.example.sens.entity.Ro"
  },
  {
    "path": "src/main/java/com/example/sens/controller/admin/AttachmentController.java",
    "chars": 1011,
    "preview": "package com.example.sens.controller.admin;\n\nimport com.example.sens.controller.common.BaseController;\nimport com.example"
  },
  {
    "path": "src/main/java/com/example/sens/controller/admin/CategoryController.java",
    "chars": 3713,
    "preview": "package com.example.sens.controller.admin;\n\nimport com.baomidou.mybatisplus.extension.plugins.pagination.Page;\nimport co"
  },
  {
    "path": "src/main/java/com/example/sens/controller/admin/NoticeController.java",
    "chars": 3706,
    "preview": "package com.example.sens.controller.admin;\n\nimport cn.hutool.http.HtmlUtil;\nimport com.baomidou.mybatisplus.extension.pl"
  },
  {
    "path": "src/main/java/com/example/sens/controller/admin/OrderController.java",
    "chars": 7212,
    "preview": "package com.example.sens.controller.admin;\n\nimport com.baomidou.mybatisplus.extension.plugins.pagination.Page;\nimport co"
  },
  {
    "path": "src/main/java/com/example/sens/controller/admin/PermissionController.java",
    "chars": 4880,
    "preview": "package com.example.sens.controller.admin;\n\nimport com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;\nimport c"
  },
  {
    "path": "src/main/java/com/example/sens/controller/admin/PostController.java",
    "chars": 9557,
    "preview": "package com.example.sens.controller.admin;\n\nimport cn.hutool.http.HtmlUtil;\nimport com.baomidou.mybatisplus.extension.pl"
  },
  {
    "path": "src/main/java/com/example/sens/controller/admin/ProfileController.java",
    "chars": 3463,
    "preview": "package com.example.sens.controller.admin;\n\nimport com.example.sens.common.constant.CommonConstant;\nimport com.example.s"
  },
  {
    "path": "src/main/java/com/example/sens/controller/admin/RechargeRecordController.java",
    "chars": 3996,
    "preview": "package com.example.sens.controller.admin;\n\nimport com.baomidou.mybatisplus.extension.plugins.pagination.Page;\nimport co"
  },
  {
    "path": "src/main/java/com/example/sens/controller/admin/RoleController.java",
    "chars": 5407,
    "preview": "package com.example.sens.controller.admin;\n\nimport com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;\nimport c"
  },
  {
    "path": "src/main/java/com/example/sens/controller/admin/UserController.java",
    "chars": 5834,
    "preview": "package com.example.sens.controller.admin;\n\nimport com.baomidou.mybatisplus.extension.plugins.pagination.Page;\nimport co"
  },
  {
    "path": "src/main/java/com/example/sens/controller/common/BaseController.java",
    "chars": 1565,
    "preview": "package com.example.sens.controller.common;\n\nimport com.example.sens.entity.User;\nimport com.example.sens.enums.RoleEnum"
  },
  {
    "path": "src/main/java/com/example/sens/controller/common/CommonController.java",
    "chars": 1598,
    "preview": "package com.example.sens.controller.common;\n\nimport com.example.sens.enums.CommonParamsEnum;\nimport lombok.extern.slf4j."
  },
  {
    "path": "src/main/java/com/example/sens/controller/home/FrontPostController.java",
    "chars": 18026,
    "preview": "package com.example.sens.controller.home;\n\nimport com.baomidou.mybatisplus.extension.plugins.pagination.Page;\nimport com"
  },
  {
    "path": "src/main/java/com/example/sens/controller/home/IndexController.java",
    "chars": 3827,
    "preview": "package com.example.sens.controller.home;\n\nimport com.baomidou.mybatisplus.extension.plugins.pagination.Page;\nimport com"
  },
  {
    "path": "src/main/java/com/example/sens/controller/home/LoginController.java",
    "chars": 5291,
    "preview": "package com.example.sens.controller.home;\n\nimport com.example.sens.common.constant.CommonConstant;\nimport com.example.se"
  },
  {
    "path": "src/main/java/com/example/sens/dto/JsonResult.java",
    "chars": 1524,
    "preview": "package com.example.sens.dto;\n\nimport lombok.Data;\n\n/**\n * <pre>\n *     Json格式\n * </pre>\n *\n * @author : saysky\n * @date"
  },
  {
    "path": "src/main/java/com/example/sens/dto/PostQueryCondition.java",
    "chars": 343,
    "preview": "package com.example.sens.dto;\n\nimport lombok.Data;\n\nimport java.util.List;\n\n/**\n * @author 言曌\n * @date 2020/3/12 4:53 下午"
  },
  {
    "path": "src/main/java/com/example/sens/dto/QueryCondition.java",
    "chars": 581,
    "preview": "package com.example.sens.dto;\n\nimport com.example.sens.vo.SearchVo;\nimport lombok.Data;\n\nimport java.io.Serializable;\n\n/"
  },
  {
    "path": "src/main/java/com/example/sens/entity/Category.java",
    "chars": 633,
    "preview": "package com.example.sens.entity;\n\nimport com.baomidou.mybatisplus.annotation.TableField;\nimport com.baomidou.mybatisplus"
  },
  {
    "path": "src/main/java/com/example/sens/entity/City.java",
    "chars": 504,
    "preview": "package com.example.sens.entity;\n\nimport com.baomidou.mybatisplus.annotation.TableField;\nimport com.baomidou.mybatisplus"
  },
  {
    "path": "src/main/java/com/example/sens/entity/Notice.java",
    "chars": 431,
    "preview": "package com.example.sens.entity;\n\nimport com.baomidou.mybatisplus.annotation.TableName;\nimport com.example.sens.common.b"
  },
  {
    "path": "src/main/java/com/example/sens/entity/Order.java",
    "chars": 1082,
    "preview": "package com.example.sens.entity;\n\nimport com.baomidou.mybatisplus.annotation.TableField;\nimport com.baomidou.mybatisplus"
  },
  {
    "path": "src/main/java/com/example/sens/entity/Permission.java",
    "chars": 881,
    "preview": "package com.example.sens.entity;\n\nimport com.baomidou.mybatisplus.annotation.TableField;\nimport com.baomidou.mybatisplus"
  },
  {
    "path": "src/main/java/com/example/sens/entity/Post.java",
    "chars": 1878,
    "preview": "package com.example.sens.entity;\n\nimport com.baomidou.mybatisplus.annotation.TableField;\nimport com.baomidou.mybatisplus"
  },
  {
    "path": "src/main/java/com/example/sens/entity/RechargeRecord.java",
    "chars": 534,
    "preview": "package com.example.sens.entity;\n\nimport com.baomidou.mybatisplus.annotation.TableField;\nimport com.baomidou.mybatisplus"
  },
  {
    "path": "src/main/java/com/example/sens/entity/Role.java",
    "chars": 810,
    "preview": "package com.example.sens.entity;\n\nimport com.baomidou.mybatisplus.annotation.TableField;\nimport com.baomidou.mybatisplus"
  },
  {
    "path": "src/main/java/com/example/sens/entity/RolePermissionRef.java",
    "chars": 546,
    "preview": "package com.example.sens.entity;\n\nimport com.baomidou.mybatisplus.annotation.TableName;\nimport com.example.sens.common.b"
  },
  {
    "path": "src/main/java/com/example/sens/entity/User.java",
    "chars": 1121,
    "preview": "package com.example.sens.entity;\n\nimport com.baomidou.mybatisplus.annotation.TableField;\nimport com.baomidou.mybatisplus"
  },
  {
    "path": "src/main/java/com/example/sens/entity/UserRoleRef.java",
    "chars": 538,
    "preview": "package com.example.sens.entity;\n\nimport com.baomidou.mybatisplus.annotation.TableName;\nimport com.example.sens.common.b"
  },
  {
    "path": "src/main/java/com/example/sens/enums/CommonParamsEnum.java",
    "chars": 424,
    "preview": "package com.example.sens.enums;\n\n/**\n * 常用数字\n */\npublic enum CommonParamsEnum {\n\n    /**\n     * 数字10\n     */\n    TEN(10)"
  },
  {
    "path": "src/main/java/com/example/sens/enums/OrderStatusEnum.java",
    "chars": 511,
    "preview": "package com.example.sens.enums;\n\n/**\n * <pre>\n *     订单状态enum\n * </pre>\n */\npublic enum OrderStatusEnum {\n\n    /**\n     "
  },
  {
    "path": "src/main/java/com/example/sens/enums/PostIsRecommendEnum.java",
    "chars": 331,
    "preview": "package com.example.sens.enums;\n\n/**\n * 房屋推荐枚举\n */\npublic enum PostIsRecommendEnum {\n\n    /**\n     * 真\n     */\n    TRUE("
  },
  {
    "path": "src/main/java/com/example/sens/enums/PostIsStickyEnum.java",
    "chars": 325,
    "preview": "package com.example.sens.enums;\n\n/**\n * 房屋置顶枚举\n */\npublic enum PostIsStickyEnum {\n\n    /**\n     * 真\n     */\n    TRUE(1),"
  },
  {
    "path": "src/main/java/com/example/sens/enums/PostStatusEnum.java",
    "chars": 439,
    "preview": "package com.example.sens.enums;\n\n/**\n * <pre>\n *     房屋状态enum\n * </pre>\n *\n * @author : saysky\n * @date : 2018/7/1\n */\np"
  },
  {
    "path": "src/main/java/com/example/sens/enums/PostTypeEnum.java",
    "chars": 472,
    "preview": "package com.example.sens.enums;\n\n/**\n * <pre>\n *     房屋类型enum\n * </pre>\n *\n * @author : saysky\n * @date : 2018/7/1\n */\np"
  },
  {
    "path": "src/main/java/com/example/sens/enums/ResourceTypeEnum.java",
    "chars": 730,
    "preview": "package com.example.sens.enums;\n\n/**\n * 资源类型\n */\npublic enum ResourceTypeEnum {\n\n    /**\n     * 菜单\n     */\n    MENU(\"men"
  },
  {
    "path": "src/main/java/com/example/sens/enums/ResultCodeEnum.java",
    "chars": 313,
    "preview": "package com.example.sens.enums;\n\n/**\n * 返回结果enum\n */\npublic enum ResultCodeEnum {\n\n    /**\n     * 成功\n     */\n    SUCCESS"
  },
  {
    "path": "src/main/java/com/example/sens/enums/RoleEnum.java",
    "chars": 344,
    "preview": "package com.example.sens.enums;\n\n/**\n * <pre>\n *     角色枚举\n * </pre>\n *\n */\npublic enum RoleEnum {\n\n    /**\n     * 管理员\n  "
  },
  {
    "path": "src/main/java/com/example/sens/enums/TrueFalseEnum.java",
    "chars": 339,
    "preview": "package com.example.sens.enums;\n\n/**\n * true or false enum\n */\npublic enum TrueFalseEnum {\n\n    /**\n     * 真\n     */\n   "
  },
  {
    "path": "src/main/java/com/example/sens/enums/UserStatusEnum.java",
    "chars": 322,
    "preview": "package com.example.sens.enums;\n\n/**\n * 用户状态enum\n */\npublic enum UserStatusEnum {\n\n    /**\n     * 正常\n     */\n    NORMAL("
  },
  {
    "path": "src/main/java/com/example/sens/exception/GlobalExceptionHandler.java",
    "chars": 8586,
    "preview": "package com.example.sens.exception;\n\nimport com.example.sens.dto.JsonResult;\nimport lombok.extern.slf4j.Slf4j;\nimport or"
  },
  {
    "path": "src/main/java/com/example/sens/exception/MyBusinessException.java",
    "chars": 799,
    "preview": "package com.example.sens.exception;\n\n/**\n * @author 言曌\n * @date 2019-08-09 16:47\n */\n\npublic class MyBusinessException e"
  },
  {
    "path": "src/main/java/com/example/sens/mapper/CategoryMapper.java",
    "chars": 717,
    "preview": "package com.example.sens.mapper;\n\nimport com.baomidou.mybatisplus.core.mapper.BaseMapper;\nimport com.example.sens.entity"
  },
  {
    "path": "src/main/java/com/example/sens/mapper/CityMapper.java",
    "chars": 374,
    "preview": "package com.example.sens.mapper;\n\nimport com.baomidou.mybatisplus.core.mapper.BaseMapper;\nimport com.example.sens.entity"
  },
  {
    "path": "src/main/java/com/example/sens/mapper/NoticeMapper.java",
    "chars": 276,
    "preview": "package com.example.sens.mapper;\n\nimport com.baomidou.mybatisplus.core.mapper.BaseMapper;\nimport com.example.sens.entity"
  },
  {
    "path": "src/main/java/com/example/sens/mapper/OrderMapper.java",
    "chars": 1095,
    "preview": "package com.example.sens.mapper;\n\nimport com.baomidou.mybatisplus.core.mapper.BaseMapper;\nimport com.baomidou.mybatisplu"
  },
  {
    "path": "src/main/java/com/example/sens/mapper/PermissionMapper.java",
    "chars": 1424,
    "preview": "package com.example.sens.mapper;\n\nimport com.baomidou.mybatisplus.core.mapper.BaseMapper;\nimport com.example.sens.entity"
  },
  {
    "path": "src/main/java/com/example/sens/mapper/PostMapper.java",
    "chars": 1357,
    "preview": "package com.example.sens.mapper;\n\nimport com.baomidou.mybatisplus.core.mapper.BaseMapper;\nimport com.baomidou.mybatisplu"
  },
  {
    "path": "src/main/java/com/example/sens/mapper/RechargeRecordMapper.java",
    "chars": 1319,
    "preview": "package com.example.sens.mapper;\n\n\nimport com.baomidou.mybatisplus.core.mapper.BaseMapper;\nimport com.baomidou.mybatispl"
  },
  {
    "path": "src/main/java/com/example/sens/mapper/RoleMapper.java",
    "chars": 1087,
    "preview": "package com.example.sens.mapper;\n\nimport com.baomidou.mybatisplus.core.mapper.BaseMapper;\nimport com.example.sens.entity"
  },
  {
    "path": "src/main/java/com/example/sens/mapper/RolePermissionRefMapper.java",
    "chars": 769,
    "preview": "package com.example.sens.mapper;\n\nimport com.baomidou.mybatisplus.core.mapper.BaseMapper;\nimport com.example.sens.entity"
  },
  {
    "path": "src/main/java/com/example/sens/mapper/UserMapper.java",
    "chars": 1469,
    "preview": "package com.example.sens.mapper;\n\nimport com.baomidou.mybatisplus.core.mapper.BaseMapper;\nimport com.baomidou.mybatisplu"
  },
  {
    "path": "src/main/java/com/example/sens/mapper/UserRoleRefMapper.java",
    "chars": 414,
    "preview": "package com.example.sens.mapper;\n\nimport com.baomidou.mybatisplus.core.mapper.BaseMapper;\nimport com.example.sens.entity"
  },
  {
    "path": "src/main/java/com/example/sens/service/CategoryService.java",
    "chars": 866,
    "preview": "package com.example.sens.service;\n\n\nimport com.example.sens.common.base.BaseService;\nimport com.example.sens.entity.Cate"
  },
  {
    "path": "src/main/java/com/example/sens/service/CityService.java",
    "chars": 190,
    "preview": "package com.example.sens.service;\n\n\nimport com.example.sens.common.base.BaseService;\nimport com.example.sens.entity.City"
  },
  {
    "path": "src/main/java/com/example/sens/service/MailService.java",
    "chars": 352,
    "preview": "package com.example.sens.service;\n\n\nimport javax.mail.MessagingException;\n\n/**\n * <pre>\n *     邮件发送业务逻辑接口\n * </pre>\n */\n"
  },
  {
    "path": "src/main/java/com/example/sens/service/NoticeService.java",
    "chars": 196,
    "preview": "package com.example.sens.service;\n\n\nimport com.example.sens.common.base.BaseService;\nimport com.example.sens.entity.Noti"
  },
  {
    "path": "src/main/java/com/example/sens/service/OrderService.java",
    "chars": 674,
    "preview": "package com.example.sens.service;\n\nimport com.baomidou.mybatisplus.extension.plugins.pagination.Page;\nimport com.example"
  },
  {
    "path": "src/main/java/com/example/sens/service/PermissionService.java",
    "chars": 1212,
    "preview": "package com.example.sens.service;\n\nimport com.example.sens.entity.Permission;\nimport com.example.sens.common.base.BaseSe"
  },
  {
    "path": "src/main/java/com/example/sens/service/PostService.java",
    "chars": 990,
    "preview": "package com.example.sens.service;\n\nimport com.baomidou.mybatisplus.extension.plugins.pagination.Page;\nimport com.example"
  },
  {
    "path": "src/main/java/com/example/sens/service/RechargeRecordService.java",
    "chars": 813,
    "preview": "package com.example.sens.service;\n\n\nimport com.baomidou.mybatisplus.extension.plugins.pagination.Page;\nimport com.exampl"
  },
  {
    "path": "src/main/java/com/example/sens/service/RolePermissionRefService.java",
    "chars": 612,
    "preview": "package com.example.sens.service;\n\nimport com.example.sens.entity.RolePermissionRef;\n\nimport java.util.List;\n\n\npublic in"
  },
  {
    "path": "src/main/java/com/example/sens/service/RoleService.java",
    "chars": 1249,
    "preview": "package com.example.sens.service;\n\nimport com.example.sens.entity.Role;\nimport com.example.sens.common.base.BaseService;"
  },
  {
    "path": "src/main/java/com/example/sens/service/UserRoleRefService.java",
    "chars": 315,
    "preview": "package com.example.sens.service;\n\nimport com.example.sens.entity.UserRoleRef;\nimport com.example.sens.common.base.BaseS"
  },
  {
    "path": "src/main/java/com/example/sens/service/UserService.java",
    "chars": 911,
    "preview": "package com.example.sens.service;\n\nimport com.baomidou.mybatisplus.extension.plugins.pagination.Page;\nimport com.example"
  },
  {
    "path": "src/main/java/com/example/sens/service/impl/CategoryServiceImpl.java",
    "chars": 3171,
    "preview": "package com.example.sens.service.impl;\n\nimport cn.hutool.core.util.StrUtil;\nimport com.baomidou.mybatisplus.core.conditi"
  },
  {
    "path": "src/main/java/com/example/sens/service/impl/CityServiceImpl.java",
    "chars": 1185,
    "preview": "package com.example.sens.service.impl;\n\nimport cn.hutool.core.util.StrUtil;\nimport com.baomidou.mybatisplus.core.conditi"
  },
  {
    "path": "src/main/java/com/example/sens/service/impl/MailServiceImpl.java",
    "chars": 1181,
    "preview": "package com.example.sens.service.impl;\n\nimport com.example.sens.service.MailService;\nimport com.example.sens.util.SensUt"
  },
  {
    "path": "src/main/java/com/example/sens/service/impl/NoticeServiceImpl.java",
    "chars": 874,
    "preview": "package com.example.sens.service.impl;\n\nimport com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;\nimport com.b"
  },
  {
    "path": "src/main/java/com/example/sens/service/impl/OrderServiceImpl.java",
    "chars": 2133,
    "preview": "package com.example.sens.service.impl;\n\nimport com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;\nimport com.b"
  },
  {
    "path": "src/main/java/com/example/sens/service/impl/PermissionServiceImpl.java",
    "chars": 3979,
    "preview": "package com.example.sens.service.impl;\n\nimport cn.hutool.core.util.StrUtil;\nimport com.baomidou.mybatisplus.core.conditi"
  },
  {
    "path": "src/main/java/com/example/sens/service/impl/PostServiceImpl.java",
    "chars": 3403,
    "preview": "package com.example.sens.service.impl;\n\nimport cn.hutool.core.util.StrUtil;\nimport com.baomidou.mybatisplus.core.conditi"
  },
  {
    "path": "src/main/java/com/example/sens/service/impl/RechargeRecordServiceImpl.java",
    "chars": 1857,
    "preview": "package com.example.sens.service.impl;\n\nimport com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;\nimport com.b"
  },
  {
    "path": "src/main/java/com/example/sens/service/impl/RolePermissionRefServiceImpl.java",
    "chars": 967,
    "preview": "package com.example.sens.service.impl;\n\nimport com.example.sens.entity.RolePermissionRef;\nimport com.example.sens.mapper"
  },
  {
    "path": "src/main/java/com/example/sens/service/impl/RoleServiceImpl.java",
    "chars": 4221,
    "preview": "package com.example.sens.service.impl;\n\nimport cn.hutool.core.util.StrUtil;\nimport com.baomidou.mybatisplus.core.conditi"
  },
  {
    "path": "src/main/java/com/example/sens/service/impl/UserRoleRefServiceImpl.java",
    "chars": 1313,
    "preview": "package com.example.sens.service.impl;\n\nimport com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;\nimport com.b"
  },
  {
    "path": "src/main/java/com/example/sens/service/impl/UserServiceImpl.java",
    "chars": 6531,
    "preview": "package com.example.sens.service.impl;\n\nimport cn.hutool.core.util.StrUtil;\nimport com.baomidou.mybatisplus.core.conditi"
  },
  {
    "path": "src/main/java/com/example/sens/util/DateUtil.java",
    "chars": 1991,
    "preview": "package com.example.sens.util;\n\nimport java.text.ParseException;\nimport java.text.SimpleDateFormat;\nimport java.util.*;\n"
  },
  {
    "path": "src/main/java/com/example/sens/util/FileUtil.java",
    "chars": 3542,
    "preview": "package com.example.sens.util;\n\nimport cn.hutool.core.date.DateUtil;\nimport cn.hutool.core.text.StrBuilder;\nimport com.a"
  },
  {
    "path": "src/main/java/com/example/sens/util/IpInfoUtil.java",
    "chars": 1558,
    "preview": "package com.example.sens.util;\n\n\nimport lombok.extern.slf4j.Slf4j;\n\nimport javax.servlet.http.HttpServletRequest;\nimport"
  },
  {
    "path": "src/main/java/com/example/sens/util/Md5Util.java",
    "chars": 1742,
    "preview": "package com.example.sens.util;\n\nimport cn.hutool.core.text.StrBuilder;\nimport org.apache.shiro.crypto.hash.Md5Hash;\nimpo"
  },
  {
    "path": "src/main/java/com/example/sens/util/ObjectUtil.java",
    "chars": 1781,
    "preview": "package com.example.sens.util;\n\nimport cn.hutool.core.util.StrUtil;\nimport com.google.common.collect.Maps;\nimport com.go"
  },
  {
    "path": "src/main/java/com/example/sens/util/PageUtil.java",
    "chars": 3869,
    "preview": "package com.example.sens.util;\n\nimport cn.hutool.core.util.StrUtil;\nimport com.baomidou.mybatisplus.core.metadata.OrderI"
  },
  {
    "path": "src/main/java/com/example/sens/util/PermissionUtil.java",
    "chars": 3381,
    "preview": "package com.example.sens.util;\n\nimport com.example.sens.entity.Permission;\n\nimport java.util.ArrayList;\nimport java.util"
  },
  {
    "path": "src/main/java/com/example/sens/util/RegexUtil.java",
    "chars": 1614,
    "preview": "package com.example.sens.util;\n\nimport java.util.ArrayList;\nimport java.util.List;\nimport java.util.regex.Matcher;\nimpor"
  },
  {
    "path": "src/main/java/com/example/sens/util/RelativeDateFormat.java",
    "chars": 2286,
    "preview": "package com.example.sens.util;\n\n\nimport java.util.Date;\n\n/**\n * @author 言曌\n * @date 2020/3/10 9:48 下午\n */\n\npublic class "
  },
  {
    "path": "src/main/java/com/example/sens/util/Response.java",
    "chars": 2121,
    "preview": "package com.example.sens.util;\n\npublic class Response<T> {\n\n    private Boolean success;\n\n    private String message;\n\n "
  },
  {
    "path": "src/main/java/com/example/sens/util/SensUtils.java",
    "chars": 1207,
    "preview": "package com.example.sens.util;\n\nimport io.github.biezhi.ome.OhMyEmail;\nimport lombok.extern.slf4j.Slf4j;\n\nimport java.ut"
  },
  {
    "path": "src/main/java/com/example/sens/util/SpringUtil.java",
    "chars": 1241,
    "preview": "package com.example.sens.util;\n\nimport org.springframework.beans.BeansException;\nimport org.springframework.context.Appl"
  },
  {
    "path": "src/main/java/com/example/sens/util/ThreadPoolUtil.java",
    "chars": 1094,
    "preview": "package com.example.sens.util;\n\nimport java.util.concurrent.ArrayBlockingQueue;\nimport java.util.concurrent.BlockingQueu"
  },
  {
    "path": "src/main/java/com/example/sens/vo/PageVo.java",
    "chars": 938,
    "preview": "package com.example.sens.vo;\n\nimport lombok.Data;\n\nimport java.io.Serializable;\n\n\n/**\n * @author example\n */\n@Data\npubli"
  },
  {
    "path": "src/main/java/com/example/sens/vo/SearchVo.java",
    "chars": 280,
    "preview": "package com.example.sens.vo;\n\nimport lombok.Data;\n\nimport java.io.Serializable;\n\n/**\n * @author example\n */\n@Data\npublic"
  },
  {
    "path": "src/main/resources/application.yaml",
    "chars": 1758,
    "preview": "server:\n  port: 8080\n  forward-headers-strategy: true\n  undertow:\n    io-threads: 2\n    worker-threads: 36\n    buffer-si"
  },
  {
    "path": "src/main/resources/mapper/CategoryMapper.xml",
    "chars": 864,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\" \"http://mybatis.org/"
  },
  {
    "path": "src/main/resources/mapper/CityMapper.xml",
    "chars": 506,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\" \"http://mybatis.org/"
  },
  {
    "path": "src/main/resources/mapper/OrderMapper.xml",
    "chars": 4763,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\" \"http://mybatis.org/"
  },
  {
    "path": "src/main/resources/mapper/PermissionMapper.xml",
    "chars": 3782,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\" \"http://mybatis.org/"
  },
  {
    "path": "src/main/resources/mapper/PostMapper.xml",
    "chars": 6505,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\" \"http://mybatis.org/"
  },
  {
    "path": "src/main/resources/mapper/RechargeRecordMapper.xml",
    "chars": 2933,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\" \"http://mybatis.org/"
  },
  {
    "path": "src/main/resources/mapper/RoleMapper.xml",
    "chars": 2752,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\" \"http://mybatis.org/"
  },
  {
    "path": "src/main/resources/mapper/RolePermissionRefMapper.xml",
    "chars": 865,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\" \"http://mybatis.org/"
  },
  {
    "path": "src/main/resources/mapper/UserMapper.xml",
    "chars": 4564,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\" \"http://mybatis.org/"
  },
  {
    "path": "src/main/resources/mapper/UserRoleRefMapper.xml",
    "chars": 606,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\" \"http://mybatis.org/"
  },
  {
    "path": "src/main/resources/static/css/AdminLTE.css",
    "chars": 111499,
    "preview": "/*!\n *   AdminLTE v2.4.5\n *   Author: Almsaeed Studio\n *\t Website: Almsaeed Studio <https://adminlte.io>\n *   License: O"
  },
  {
    "path": "src/main/resources/static/css/alt/AdminLTE-bootstrap-social.css",
    "chars": 15719,
    "preview": "/*\n * Social Buttons for Bootstrap\n *\n * Copyright 2013-2015 Panayiotis Lipiridis\n * Licensed under the MIT License\n *\n "
  },
  {
    "path": "src/main/resources/static/css/alt/AdminLTE-select2.css",
    "chars": 3042,
    "preview": "/*\n * Plugin: Select2\n * ---------------\n */\n.select2-container--default.select2-container--focus,\n.select2-selection.se"
  },
  {
    "path": "src/main/resources/static/css/alt/AdminLTE-without-plugins.css",
    "chars": 90125,
    "preview": "/*!\n *   AdminLTE v2.4.0 Without Third-Party Plugins\n *   Author: Almsaeed Studio\n *\t Website: Almsaeed Studio <https://"
  },
  {
    "path": "src/main/resources/static/css/loader.css",
    "chars": 3058,
    "preview": "#loading{\n    background-color: #fff;\n    height: 100%;\n    width: 100%;\n    position: fixed;\n    z-index: 9999;\n    mar"
  },
  {
    "path": "src/main/resources/static/css/pay.css",
    "chars": 5273,
    "preview": "html {\n    font-size: 62.5%;\n    font-family: \"Microsoft YaHei\";\n}\n\nbody, div, dl, dt, dd, ul, ol, li, h1, h2, h3, h4, h"
  },
  {
    "path": "src/main/resources/static/css/skins/_all-skins.css",
    "chars": 48423,
    "preview": "/*\n * Skin: Blue\n * ----------\n */\n.skin-blue .main-header .navbar {\n  background-color: #3c8dbc;\n}\n.skin-blue .main-hea"
  },
  {
    "path": "src/main/resources/static/css/style.css",
    "chars": 3533,
    "preview": "/**\n    皮肤颜色附加\n */\n.skin-blue .box.box-primary {\n    border-top-color: #fff;\n}\n\n.skin-blue .nav-tabs-custom > .nav-tabs "
  },
  {
    "path": "src/main/resources/static/front/css/pay.css",
    "chars": 5126,
    "preview": "html {\n    font-size: 62.5%;\n    font-family: \"Microsoft YaHei\";\n}\n\nbody, div, dl, dt, dd, ul, ol, li, h1, h2, h3, h4, h"
  },
  {
    "path": "src/main/resources/static/front/css/style.css",
    "chars": 16925,
    "preview": "/*\nTemplate Name: Manland - Bootstrap Light Real Estate HTML Template\nVersion: 1.0\n*/\n/*\n\t-- body\n\t-- Extra\n\t-- Navbar\n\t"
  },
  {
    "path": "src/main/resources/static/front/js/contact_me.js",
    "chars": 2807,
    "preview": "$(function() {\n\n  $(\"#contactForm input,#contactForm textarea\").jqBootstrapValidation({\n    preventSubmit: true,\n    sub"
  },
  {
    "path": "src/main/resources/static/front/js/custom.js",
    "chars": 4594,
    "preview": "/*\nTemplate Name: Manland - Bootstrap Light Real Estate HTML Template\nAuthor: Webartinfo\nAuthor URI: https://themeforest"
  },
  {
    "path": "src/main/resources/static/front/js/jqBootstrapValidation.js",
    "chars": 36236,
    "preview": "/* jqBootstrapValidation\n * A plugin for automating validation on Twitter Bootstrap formatted forms.\n *\n * v1.3.6\n *\n * "
  },
  {
    "path": "src/main/resources/static/front/vendor/select2/css/select2-bootstrap.css",
    "chars": 16890,
    "preview": "/*! Select2 Bootstrap 3 CSS v1.4.6 | MIT License | github.com/t0m/select2-bootstrap-css */\n/**\n * Reset Bootstrap 3 .for"
  },
  {
    "path": "src/main/resources/static/js/adminlte.js",
    "chars": 28469,
    "preview": "/*! AdminLTE app.js\n* ================\n* Main JS application file for AdminLTE v2. This file\n* should be included in all"
  },
  {
    "path": "src/main/resources/static/js/app.js",
    "chars": 8100,
    "preview": "function initMenus() {\n    $.ajax({\n        type: 'GET',\n        url: '/admin/currentMenus',\n        async: false,\n     "
  },
  {
    "path": "src/main/resources/static/plugins/bootstrap/css/bootstrap-theme.css",
    "chars": 26132,
    "preview": "/*!\n * Bootstrap v3.3.7 (http://getbootstrap.com)\n * Copyright 2011-2016 Twitter, Inc.\n * Licensed under MIT (https://gi"
  },
  {
    "path": "src/main/resources/static/plugins/bootstrap/css/bootstrap.css",
    "chars": 146010,
    "preview": "/*!\n * Bootstrap v3.3.7 (http://getbootstrap.com)\n * Copyright 2011-2016 Twitter, Inc.\n * Licensed under MIT (https://gi"
  },
  {
    "path": "src/main/resources/static/plugins/bootstrap/js/bootstrap.js",
    "chars": 69707,
    "preview": "/*!\n * Bootstrap v3.3.7 (http://getbootstrap.com)\n * Copyright 2011-2016 Twitter, Inc.\n * Licensed under the MIT license"
  },
  {
    "path": "src/main/resources/static/plugins/bootstrap/js/npm.js",
    "chars": 456,
    "preview": "// This file is autogenerated via the `commonjs` Grunt task. You can require() this file in a CommonJS environment.\nrequ"
  },
  {
    "path": "src/main/resources/static/plugins/bootstrapStyle/bootstrapStyle.css",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "src/main/resources/static/plugins/bootstrapvalidator/css/bootstrapValidator.css",
    "chars": 699,
    "preview": "/**\n * BootstrapValidator (http://bootstrapvalidator.com)\n * The best jQuery plugin to validate form fields. Designed to"
  },
  {
    "path": "src/main/resources/static/plugins/bootstrapvalidator/js/bootstrapValidator.js",
    "chars": 325824,
    "preview": "/*!\n * BootstrapValidator (http://bootstrapvalidator.com)\n * The best jQuery plugin to validate form fields. Designed to"
  },
  {
    "path": "src/main/resources/static/plugins/bootstrapvalidator/js/language/zh_CN.js",
    "chars": 9653,
    "preview": "(function ($) {\n    /**\n     * Simplified Chinese language package\n     * Translated by @shamiao\n     */\n    $.fn.bootst"
  },
  {
    "path": "src/main/resources/static/plugins/font-awesome/css/font-awesome.css",
    "chars": 37414,
    "preview": "/*!\n *  Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome\n *  License - http://fontawesome.io/lice"
  },
  {
    "path": "src/main/resources/static/plugins/froala-editor/css/froala_editor.css",
    "chars": 34801,
    "preview": "/*!\n * froala_editor v2.9.1 (https://www.froala.com/wysiwyg-editor)\n * License https://froala.com/wysiwyg-editor/terms/\n"
  },
  {
    "path": "src/main/resources/static/plugins/froala-editor/css/froala_editor.pkgd.css",
    "chars": 73102,
    "preview": "/*!\n * froala_editor v2.9.1 (https://www.froala.com/wysiwyg-editor)\n * License https://froala.com/wysiwyg-editor/terms/\n"
  },
  {
    "path": "src/main/resources/static/plugins/froala-editor/css/froala_style.css",
    "chars": 9360,
    "preview": "/*!\n * froala_editor v2.9.1 (https://www.froala.com/wysiwyg-editor)\n * License https://froala.com/wysiwyg-editor/terms/\n"
  },
  {
    "path": "src/main/resources/static/plugins/froala-editor/css/plugins/char_counter.css",
    "chars": 1288,
    "preview": "/*!\n * froala_editor v2.9.1 (https://www.froala.com/wysiwyg-editor)\n * License https://froala.com/wysiwyg-editor/terms/\n"
  },
  {
    "path": "src/main/resources/static/plugins/froala-editor/css/plugins/code_view.css",
    "chars": 2856,
    "preview": "/*!\n * froala_editor v2.9.1 (https://www.froala.com/wysiwyg-editor)\n * License https://froala.com/wysiwyg-editor/terms/\n"
  },
  {
    "path": "src/main/resources/static/plugins/froala-editor/css/plugins/colors.css",
    "chars": 3874,
    "preview": "/*!\n * froala_editor v2.9.1 (https://www.froala.com/wysiwyg-editor)\n * License https://froala.com/wysiwyg-editor/terms/\n"
  },
  {
    "path": "src/main/resources/static/plugins/froala-editor/css/plugins/draggable.css",
    "chars": 868,
    "preview": "/*!\n * froala_editor v2.9.1 (https://www.froala.com/wysiwyg-editor)\n * License https://froala.com/wysiwyg-editor/terms/\n"
  },
  {
    "path": "src/main/resources/static/plugins/froala-editor/css/plugins/emoticons.css",
    "chars": 897,
    "preview": "/*!\n * froala_editor v2.9.1 (https://www.froala.com/wysiwyg-editor)\n * License https://froala.com/wysiwyg-editor/terms/\n"
  },
  {
    "path": "src/main/resources/static/plugins/froala-editor/css/plugins/file.css",
    "chars": 3009,
    "preview": "/*!\n * froala_editor v2.9.1 (https://www.froala.com/wysiwyg-editor)\n * License https://froala.com/wysiwyg-editor/terms/\n"
  },
  {
    "path": "src/main/resources/static/plugins/froala-editor/css/plugins/fullscreen.css",
    "chars": 566,
    "preview": "/*!\n * froala_editor v2.9.1 (https://www.froala.com/wysiwyg-editor)\n * License https://froala.com/wysiwyg-editor/terms/\n"
  },
  {
    "path": "src/main/resources/static/plugins/froala-editor/css/plugins/help.css",
    "chars": 1356,
    "preview": "/*!\n * froala_editor v2.9.1 (https://www.froala.com/wysiwyg-editor)\n * License https://froala.com/wysiwyg-editor/terms/\n"
  },
  {
    "path": "src/main/resources/static/plugins/froala-editor/css/plugins/image.css",
    "chars": 4952,
    "preview": "/*!\n * froala_editor v2.9.1 (https://www.froala.com/wysiwyg-editor)\n * License https://froala.com/wysiwyg-editor/terms/\n"
  },
  {
    "path": "src/main/resources/static/plugins/froala-editor/css/plugins/image_manager.css",
    "chars": 8311,
    "preview": "/*!\n * froala_editor v2.9.1 (https://www.froala.com/wysiwyg-editor)\n * License https://froala.com/wysiwyg-editor/terms/\n"
  },
  {
    "path": "src/main/resources/static/plugins/froala-editor/css/plugins/line_breaker.css",
    "chars": 681,
    "preview": "/*!\n * froala_editor v2.9.1 (https://www.froala.com/wysiwyg-editor)\n * License https://froala.com/wysiwyg-editor/terms/\n"
  },
  {
    "path": "src/main/resources/static/plugins/froala-editor/css/plugins/quick_insert.css",
    "chars": 1593,
    "preview": "/*!\n * froala_editor v2.9.1 (https://www.froala.com/wysiwyg-editor)\n * License https://froala.com/wysiwyg-editor/terms/\n"
  },
  {
    "path": "src/main/resources/static/plugins/froala-editor/css/plugins/special_characters.css",
    "chars": 1262,
    "preview": "/*!\n * froala_editor v2.9.1 (https://www.froala.com/wysiwyg-editor)\n * License https://froala.com/wysiwyg-editor/terms/\n"
  },
  {
    "path": "src/main/resources/static/plugins/froala-editor/css/plugins/table.css",
    "chars": 4078,
    "preview": "/*!\n * froala_editor v2.9.1 (https://www.froala.com/wysiwyg-editor)\n * License https://froala.com/wysiwyg-editor/terms/\n"
  },
  {
    "path": "src/main/resources/static/plugins/froala-editor/css/plugins/video.css",
    "chars": 5095,
    "preview": "/*!\n * froala_editor v2.9.1 (https://www.froala.com/wysiwyg-editor)\n * License https://froala.com/wysiwyg-editor/terms/\n"
  },
  {
    "path": "src/main/resources/static/plugins/froala-editor/css/themes/dark.css",
    "chars": 40892,
    "preview": "/*!\n * froala_editor v2.9.1 (https://www.froala.com/wysiwyg-editor)\n * License https://froala.com/wysiwyg-editor/terms/\n"
  },
  {
    "path": "src/main/resources/static/plugins/froala-editor/css/themes/gray.css",
    "chars": 40891,
    "preview": "/*!\n * froala_editor v2.9.1 (https://www.froala.com/wysiwyg-editor)\n * License https://froala.com/wysiwyg-editor/terms/\n"
  },
  {
    "path": "src/main/resources/static/plugins/froala-editor/css/themes/red.css",
    "chars": 37095,
    "preview": "/*!\n * froala_editor v2.9.1 (https://www.froala.com/wysiwyg-editor)\n * License https://froala.com/wysiwyg-editor/terms/\n"
  },
  {
    "path": "src/main/resources/static/plugins/froala-editor/css/themes/royal.css",
    "chars": 41193,
    "preview": "/*!\n * froala_editor v2.9.1 (https://www.froala.com/wysiwyg-editor)\n * License https://froala.com/wysiwyg-editor/terms/\n"
  },
  {
    "path": "src/main/resources/static/plugins/froala-editor/css/third_party/embedly.css",
    "chars": 1282,
    "preview": "/*!\n * froala_editor v2.9.1 (https://www.froala.com/wysiwyg-editor)\n * License https://froala.com/wysiwyg-editor/terms/\n"
  },
  {
    "path": "src/main/resources/static/plugins/froala-editor/css/third_party/font_awesome.css",
    "chars": 1211,
    "preview": "/*!\n * froala_editor v2.9.1 (https://www.froala.com/wysiwyg-editor)\n * License https://froala.com/wysiwyg-editor/terms/\n"
  },
  {
    "path": "src/main/resources/static/plugins/froala-editor/css/third_party/image_tui.css",
    "chars": 748,
    "preview": "/*!\n * froala_editor v2.9.1 (https://www.froala.com/wysiwyg-editor)\n * License https://froala.com/wysiwyg-editor/terms/\n"
  },
  {
    "path": "src/main/resources/static/plugins/froala-editor/css/third_party/spell_checker.css",
    "chars": 1782,
    "preview": "/*!\n * froala_editor v2.9.1 (https://www.froala.com/wysiwyg-editor)\n * License https://froala.com/wysiwyg-editor/terms/\n"
  },
  {
    "path": "src/main/resources/static/plugins/froala-editor/js/languages/ar.js",
    "chars": 19223,
    "preview": "/*!\n * froala_editor v2.9.1 (https://www.froala.com/wysiwyg-editor)\n * License https://froala.com/wysiwyg-editor/terms/\n"
  },
  {
    "path": "src/main/resources/static/plugins/froala-editor/js/languages/bs.js",
    "chars": 11010,
    "preview": "/*!\n * froala_editor v2.9.1 (https://www.froala.com/wysiwyg-editor)\n * License https://froala.com/wysiwyg-editor/terms/\n"
  },
  {
    "path": "src/main/resources/static/plugins/froala-editor/js/languages/cs.js",
    "chars": 12747,
    "preview": "/*!\n * froala_editor v2.9.1 (https://www.froala.com/wysiwyg-editor)\n * License https://froala.com/wysiwyg-editor/terms/\n"
  },
  {
    "path": "src/main/resources/static/plugins/froala-editor/js/languages/da.js",
    "chars": 10597,
    "preview": "/*!\n * froala_editor v2.9.1 (https://www.froala.com/wysiwyg-editor)\n * License https://froala.com/wysiwyg-editor/terms/\n"
  },
  {
    "path": "src/main/resources/static/plugins/froala-editor/js/languages/de.js",
    "chars": 11280,
    "preview": "/*!\n * froala_editor v2.9.1 (https://www.froala.com/wysiwyg-editor)\n * License https://froala.com/wysiwyg-editor/terms/\n"
  },
  {
    "path": "src/main/resources/static/plugins/froala-editor/js/languages/el.js",
    "chars": 10654,
    "preview": "/*!\n * froala_editor v2.9.1 (https://www.froala.com/wysiwyg-editor)\n * License https://froala.com/wysiwyg-editor/terms/\n"
  },
  {
    "path": "src/main/resources/static/plugins/froala-editor/js/languages/en_ca.js",
    "chars": 7354,
    "preview": "/*!\n * froala_editor v2.9.1 (https://www.froala.com/wysiwyg-editor)\n * License https://froala.com/wysiwyg-editor/terms/\n"
  },
  {
    "path": "src/main/resources/static/plugins/froala-editor/js/languages/en_gb.js",
    "chars": 7361,
    "preview": "/*!\n * froala_editor v2.9.1 (https://www.froala.com/wysiwyg-editor)\n * License https://froala.com/wysiwyg-editor/terms/\n"
  },
  {
    "path": "src/main/resources/static/plugins/froala-editor/js/languages/es.js",
    "chars": 11213,
    "preview": "/*!\n * froala_editor v2.9.1 (https://www.froala.com/wysiwyg-editor)\n * License https://froala.com/wysiwyg-editor/terms/\n"
  },
  {
    "path": "src/main/resources/static/plugins/froala-editor/js/languages/et.js",
    "chars": 11090,
    "preview": "/*!\n * froala_editor v2.9.1 (https://www.froala.com/wysiwyg-editor)\n * License https://froala.com/wysiwyg-editor/terms/\n"
  },
  {
    "path": "src/main/resources/static/plugins/froala-editor/js/languages/fa.js",
    "chars": 18776,
    "preview": "/*!\n * froala_editor v2.9.1 (https://www.froala.com/wysiwyg-editor)\n * License https://froala.com/wysiwyg-editor/terms/\n"
  },
  {
    "path": "src/main/resources/static/plugins/froala-editor/js/languages/fi.js",
    "chars": 11145,
    "preview": "/*!\n * froala_editor v2.9.1 (https://www.froala.com/wysiwyg-editor)\n * License https://froala.com/wysiwyg-editor/terms/\n"
  },
  {
    "path": "src/main/resources/static/plugins/froala-editor/js/languages/fr.js",
    "chars": 11779,
    "preview": "/*!\n * froala_editor v2.9.1 (https://www.froala.com/wysiwyg-editor)\n * License https://froala.com/wysiwyg-editor/terms/\n"
  },
  {
    "path": "src/main/resources/static/plugins/froala-editor/js/languages/he.js",
    "chars": 18415,
    "preview": "/*!\n * froala_editor v2.9.1 (https://www.froala.com/wysiwyg-editor)\n * License https://froala.com/wysiwyg-editor/terms/\n"
  },
  {
    "path": "src/main/resources/static/plugins/froala-editor/js/languages/hr.js",
    "chars": 11136,
    "preview": "/*!\n * froala_editor v2.9.1 (https://www.froala.com/wysiwyg-editor)\n * License https://froala.com/wysiwyg-editor/terms/\n"
  },
  {
    "path": "src/main/resources/static/plugins/froala-editor/js/languages/hu.js",
    "chars": 12368,
    "preview": "/*!\n * froala_editor v2.9.1 (https://www.froala.com/wysiwyg-editor)\n * License https://froala.com/wysiwyg-editor/terms/\n"
  },
  {
    "path": "src/main/resources/static/plugins/froala-editor/js/languages/id.js",
    "chars": 10876,
    "preview": "/*!\n * froala_editor v2.9.1 (https://www.froala.com/wysiwyg-editor)\n * License https://froala.com/wysiwyg-editor/terms/\n"
  },
  {
    "path": "src/main/resources/static/plugins/froala-editor/js/languages/it.js",
    "chars": 10653,
    "preview": "/*!\n * froala_editor v2.9.1 (https://www.froala.com/wysiwyg-editor)\n * License https://froala.com/wysiwyg-editor/terms/\n"
  },
  {
    "path": "src/main/resources/static/plugins/froala-editor/js/languages/ja.js",
    "chars": 14897,
    "preview": "/*!\n * froala_editor v2.9.1 (https://www.froala.com/wysiwyg-editor)\n * License https://froala.com/wysiwyg-editor/terms/\n"
  },
  {
    "path": "src/main/resources/static/plugins/froala-editor/js/languages/ko.js",
    "chars": 14413,
    "preview": "/*!\n * froala_editor v2.9.1 (https://www.froala.com/wysiwyg-editor)\n * License https://froala.com/wysiwyg-editor/terms/\n"
  },
  {
    "path": "src/main/resources/static/plugins/froala-editor/js/languages/ku.js",
    "chars": 10737,
    "preview": "/*!\n * froala_editor v2.9.1 (https://www.froala.com/wysiwyg-editor)\n * License https://froala.com/wysiwyg-editor/terms/\n"
  },
  {
    "path": "src/main/resources/static/plugins/froala-editor/js/languages/me.js",
    "chars": 11064,
    "preview": "/*!\n * froala_editor v2.9.1 (https://www.froala.com/wysiwyg-editor)\n * License https://froala.com/wysiwyg-editor/terms/\n"
  },
  {
    "path": "src/main/resources/static/plugins/froala-editor/js/languages/nb.js",
    "chars": 10814,
    "preview": "/*!\n * froala_editor v2.9.1 (https://www.froala.com/wysiwyg-editor)\n * License https://froala.com/wysiwyg-editor/terms/\n"
  },
  {
    "path": "src/main/resources/static/plugins/froala-editor/js/languages/nl.js",
    "chars": 10846,
    "preview": "/*!\n * froala_editor v2.9.1 (https://www.froala.com/wysiwyg-editor)\n * License https://froala.com/wysiwyg-editor/terms/\n"
  },
  {
    "path": "src/main/resources/static/plugins/froala-editor/js/languages/pl.js",
    "chars": 11728,
    "preview": "/*!\n * froala_editor v2.9.1 (https://www.froala.com/wysiwyg-editor)\n * License https://froala.com/wysiwyg-editor/terms/\n"
  },
  {
    "path": "src/main/resources/static/plugins/froala-editor/js/languages/pt_br.js",
    "chars": 10954,
    "preview": "/*!\n * froala_editor v2.9.1 (https://www.froala.com/wysiwyg-editor)\n * License https://froala.com/wysiwyg-editor/terms/\n"
  },
  {
    "path": "src/main/resources/static/plugins/froala-editor/js/languages/pt_pt.js",
    "chars": 11188,
    "preview": "/*!\n * froala_editor v2.9.1 (https://www.froala.com/wysiwyg-editor)\n * License https://froala.com/wysiwyg-editor/terms/\n"
  },
  {
    "path": "src/main/resources/static/plugins/froala-editor/js/languages/ro.js",
    "chars": 12288,
    "preview": "/*!\n * froala_editor v2.9.1 (https://www.froala.com/wysiwyg-editor)\n * License https://froala.com/wysiwyg-editor/terms/\n"
  },
  {
    "path": "src/main/resources/static/plugins/froala-editor/js/languages/ru.js",
    "chars": 23995,
    "preview": "/*!\n * froala_editor v2.9.1 (https://www.froala.com/wysiwyg-editor)\n * License https://froala.com/wysiwyg-editor/terms/\n"
  },
  {
    "path": "src/main/resources/static/plugins/froala-editor/js/languages/sk.js",
    "chars": 12419,
    "preview": "/*!\n * froala_editor v2.9.1 (https://www.froala.com/wysiwyg-editor)\n * License https://froala.com/wysiwyg-editor/terms/\n"
  }
]

// ... and 22 more files (download for full content)

About this extraction

This page contains the full source code of the saysky/manland GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 222 files (2.2 MB), approximately 578.7k tokens, and a symbol index with 616 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!