核心业务3:借款人借款申请

news2025/1/19 17:05:42

核心业务3:借款人借款申请

1.借款人借款申请业务流程图

2.借款项数据库绑定

---------------------借款申请流程----------------------

3.借款申请流程

4.前端代码逻辑

5.后端代码逻辑

---------------------借款申请流程----------------------

核心业务3:借款人借款申请

1.借款人借款申请业务流程图

在这里插入图片描述

①此时用户已经获得了积分,可以在额度申请页面点击我要借款

在这里插入图片描述

②点击我要借款后展示借款信息填写页

在这里插入图片描述

③借款信息提交后显示等待审核

在这里插入图片描述

④后台管理员审核技术后获取审核结果

在这里插入图片描述

2.借款项数据库绑定

①数据库表

borrow_info
在这里插入图片描述
integral_grade
在这里插入图片描述

②关联

  • borrow_info表通过user_id与user_info关联,即一个user只能发起一次借款
  • user_info的积分字段可查integral_grade表获取对应额度,然后borrow_info根据user_info的额度来发起借款
  • borrow表和borrow_info表无关,两者都只是通过user_id与user_info关联,一个是借款额度申请表单,一个是借款申请表单

3.借款申请流程

①前端

  • 用户在注册登陆绑定数据和获得额度之后,可以发起我要借款
  • 进入界面判断借款的状态,如果未借款进入表单界面,如果其他状态跳到响应的界面
  • 表单数据的填写,用户可以看到自己的额度(调用api),用户也可以再下拉列表里填写数据(调用api)
  • 用户填写完表单后提交后台

②后端

  • 用户刚进入借款页面判断用户借款状态(通过user_id查询borrow_info看用户借款状态)
  • 用户未发起借款,需要返回数据字典数据初始化下拉列表,需要返回用户的借款额度
  • 用户提交表单,需要校验(防止恶意用户跳过入口直接访问后台),然后保存数据到borrow_info表

4.前端代码逻辑

①前端封装表单对象

在这里插入图片描述

②前端调用接口

在这里插入图片描述

③前端代码

  • 增加按钮到借款额度申请成功页
    srb-site\pages\user\borrower.vue
    添加按钮到审批通过组件下
 <!--在审批通过后,增加我要借款按钮,进入借款信息页面-->
          <NuxtLink to="/user/apply" v-if="borrowerStatus === 2">
            <el-button style="margin-top:20px;" type="success">
              我要借款
            </el-button>
          </NuxtLink>
  • 借款申请页面
    srb-site\pages\user\apply.vue
<template>
  <div class="personal-main">
    <div class="personal-pay">
      <h3><i>借款申请</i></h3>

      <el-steps :active="active" style="margin: 40px">
        <el-step title="提交借款信息"></el-step>
        <el-step title="审核"></el-step>
        <el-step title="等待审核结果"></el-step>
      </el-steps>

      <div v-if="active === 0" class="user-borrower">
        <el-form label-width="120px">
          <el-form-item label="借款金额">
            <el-col :span="6">
              <el-input v-model="borrowInfo.amount" />
            </el-col>
            <el-col :span="6">
              &nbsp;&nbsp;您最多可借款{{ borrowAmount }}</el-col>
          </el-form-item>

          <el-form-item label="期数">
            <el-select v-model="borrowInfo.period">
              <el-option :value="1" label="1个月" />
              <el-option :value="3" label="3个月" />
              <el-option :value="6" label="6个月" />
              <el-option :value="9" label="9个月" />
              <el-option :value="12" label="12个月" />
              <el-option :value="24" label="24个月" />
            </el-select>
          </el-form-item>

          <el-form-item label="还款方式">
            <el-select v-model="borrowInfo.returnMethod">
              <el-option
                v-for="item in returnMethodList"
                :key="item.value"
                :label="item.name"
                :value="item.value"
              />
            </el-select>
          </el-form-item>
          <el-form-item label="资金用途">
            <el-select v-model="borrowInfo.moneyUse">
              <el-option
                v-for="item in moneyUseList"
                :key="item.value"
                :label="item.name"
                :value="item.value"
              />
            </el-select>
          </el-form-item>
          <el-form-item label="年利率">
            <el-col :span="6">
              <el-input v-model="borrowInfo.borrowYearRate">
                <template slot="append">%</template>
              </el-input>
            </el-col>
            <el-col :span="8">
              &nbsp;&nbsp;年利率越高,借款越容易成功。
            </el-col>
          </el-form-item>
          <el-form-item>
            <el-button
              type="primary"
              :disabled="submitBtnDisabled"
              @click="save"
            >
              提交
            </el-button>
          </el-form-item>
        </el-form>
        <el-alert
          title="您提供的任何信息尚融宝都承诺予以保护,不会挪作他用。"
          type="warning"
          :closable="false"
        >
        </el-alert>
      </div>

      <div v-if="active === 1">
        <div style="margin-top:40px;">
          <el-alert
            title="您的借款申请已成功提交,请耐心等待"
            type="warning"
            show-icon
            :closable="false"
          >
            我们将在10分钟内完成审核,审核时间为周一至周五8:0020:00</el-alert>
        </div>
      </div>

      <div v-if="active === 2">
        <div style="margin-top:40px;">
          <el-alert
            v-if="borrowInfoStatus === 2"
            title="您的借款申请审批已通过"
            type="success"
            show-icon
            :closable="false"
          >
          </el-alert>

          <el-alert
            v-if="borrowInfoStatus === -1"
            title="您的借款申请审批未通过"
            type="error"
            show-icon
            :closable="false"
          >
          </el-alert>
        </div>
      </div>
    </div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      active: null, //步骤
      borrowInfoStatus: null, //审批状态
      //借款申请
      borrowInfo: {
        borrowYearRate: '12',
      },
      borrowAmount: 0, //借款额度
      submitBtnDisabled: false,
      returnMethodList: [], //还款方式列表
      moneyUseList: [], //资金用途列表
    }
  },
  methods: {
    //初始化下拉列表的数据
    initSelected() {
      //还款方式列表
      this.$axios
        .$get('/api/core/dict/findByDictCode/returnMethod')
        .then((response) => {
          this.returnMethodList = response.data.dictList
        })

      //资金用途列表
      this.$axios
        .$get('/api/core/dict/findByDictCode/moneyUse')
        .then((response) => {
          this.moneyUseList = response.data.dictList
        })
    },
    //获取借款额度
    getBorrowAmount() {
      this.$axios
        .$get('/api/core/borrowInfo/auth/getBorrowAmount')
        .then((response) => {
          this.borrowAmount = response.data.borrowAmount
        })
    },
    //提交借款申请
    save() {
      // this.submitBtnDisabled = true
      this.$axios
        .$post('/api/core/borrowInfo/auth/save', this.borrowInfo)
        .then((response) => {
          this.active = 1
        })
    },
    //获取借款审批状态
    getBorrowInfoStatus() {
      this.$axios
        .$get('/api/core/borrowInfo/auth/getBorrowInfoStatus')
        .then((response) => {
          this.borrowInfoStatus = response.data.borrowInfoStatus
          if (this.borrowInfoStatus === 0) {
            //未认证
            this.active = 0
            //获取借款额度
            this.getBorrowAmount()
            //初始化下拉列表
            this.initSelected()
          } else if (this.borrowInfoStatus === 1) {
            //审批中
            this.active = 1
          } else if (this.borrowInfoStatus === 2) {
            //审批成功
            this.active = 2
          } else if (this.borrowInfoStatus === -1) {
            //审批失败
            this.active = 2
          }
        })
    },
  },
  created() {
    //created方法默认情况下在前端服务器执行,而不是在浏览器执行,前端服务器端执行失败,在浏览器端还会再发起请求(浏览器端成功)
    //即在nuxt前端服务器初始化时候并没有带token,故可以用mounted渲染,mounted一定在浏览器端执行(渲染完成后执行)

    //获取借款额度
    //this.getBorrowAmount()

    //初始化下拉列表
    //this.initSelected()

    //获取审批状态
    this.getBorrowInfoStatus()
  },
  //监听某一个值,如果这一值一旦改变则调用
  watch: {
    'borrowInfo.amount'(value) {
      if (value > this.borrowAmount) {
        let _this = this
        this.$alert('您的借款额度不足!', {
          type: 'error',
          //当错误信息弹出完毕之后点击确定,然后执行回调函数
          callback() {
            //this的作用域和外部的作用域不一样(callback的作用域和外面的this不一样,需要传入this)
            _this.borrowInfo.amount = _this.borrowAmount
          },
        })
      }
    },
  },
}
</script>

④前端代码逻辑难点

  • 需要监听额度字段如果超过最大额度设置其值为最大额度
    用watch方法监听字段
    在这里插入图片描述

5.后端代码逻辑

①后端对象

  • borrow_info对象即可不需要专门创建vo对象

②后端接口

在这里插入图片描述

③后端代码

  • controller
package com.atguigu.srb.core.controller.api;

import com.atguigu.common.result.R;
import com.atguigu.srb.base.util.JwtUtils;
import com.atguigu.srb.core.pojo.entity.BorrowInfo;
import com.atguigu.srb.core.service.BorrowInfoService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.math.BigDecimal;

@Api(tags = "借款信息")
@RestController
@RequestMapping("/api/core/borrowInfo")
@Slf4j
public class BorrowInfoController {

    @Resource
    private BorrowInfoService borrowInfoService;


    @ApiOperation("获取借款额度")
    @GetMapping("/auth/getBorrowAmount")
    public R getBorrowAmount(HttpServletRequest request) {
        String token = request.getHeader("token");
        Long userId = JwtUtils.getUserId(token);
        BigDecimal borrowAmount = borrowInfoService.getBorrowAmount(userId);
        return R.ok().data("borrowAmount", borrowAmount);
    }


    @ApiOperation("提交借款申请")
    @PostMapping("/auth/save")
    public R save(@RequestBody BorrowInfo borrowInfo, HttpServletRequest request) {

        //目标就是把用户提交的数据保存到数据表borrow_info中


        //该接口防止恶意攻击
        //前端不提供入口 + 后端进行校验(是否绑定,是否审批借款申请)
        String token = request.getHeader("token");
        Long userId = JwtUtils.getUserId(token);
        //将借款信息存储数据库,校验用户是否绑定和审批
        borrowInfoService.saveBorrowInfo(borrowInfo, userId);
        return R.ok().message("提交成功");
    }



    @ApiOperation("获取借款申请审批状态")
    @GetMapping("/auth/getBorrowInfoStatus")
    public R getBorrowerStatus(HttpServletRequest request){
        String token = request.getHeader("token");
        Long userId = JwtUtils.getUserId(token);
        Integer status = borrowInfoService.getStatusByUserId(userId);
        return R.ok().data("borrowInfoStatus", status);
    }
}
  • service
package com.atguigu.srb.core.service;

import com.atguigu.srb.core.pojo.entity.BorrowInfo;
import com.baomidou.mybatisplus.extension.service.IService;

import java.math.BigDecimal;

/**
 * <p>
 * 借款信息表 服务类
 * </p>
 *
 * @author Likejin
 * @since 2023-04-09
 */
public interface BorrowInfoService extends IService<BorrowInfo> {

    BigDecimal getBorrowAmount(Long userId);

    void saveBorrowInfo(BorrowInfo borrowInfo, Long userId);

    Integer getStatusByUserId(Long userId);
}

package com.atguigu.srb.core.service.impl;

import com.atguigu.common.exception.Assert;
import com.atguigu.common.result.ResponseEnum;
import com.atguigu.srb.core.enums.BorrowInfoStatusEnum;
import com.atguigu.srb.core.enums.BorrowerStatusEnum;
import com.atguigu.srb.core.enums.UserBindEnum;
import com.atguigu.srb.core.mapper.BorrowInfoMapper;
import com.atguigu.srb.core.mapper.IntegralGradeMapper;
import com.atguigu.srb.core.mapper.UserInfoMapper;
import com.atguigu.srb.core.pojo.entity.BorrowInfo;
import com.atguigu.srb.core.pojo.entity.IntegralGrade;
import com.atguigu.srb.core.pojo.entity.UserInfo;
import com.atguigu.srb.core.service.BorrowInfoService;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.math.BigDecimal;
import java.util.List;

/**
 * <p>
 * 借款信息表 服务实现类
 * </p>
 *
 * @author Likejin
 * @since 2023-04-09
 */
@Service
public class BorrowInfoServiceImpl extends ServiceImpl<BorrowInfoMapper, BorrowInfo> implements BorrowInfoService {

    @Resource
    private UserInfoMapper userInfoMapper;

    @Resource
    private IntegralGradeMapper integralGradeMapper;

    /**
     * @param userId:
     * @return BigDecimal
     * @author Likejin
     * @description 根据用户id查询用户积分,根据积分获取用户额度
     * @date 2023/4/16 14:30
     */

    @Override
    public BigDecimal getBorrowAmount(Long userId) {
        //获取用户积分
        UserInfo userInfo = userInfoMapper.selectById(userId);
        Assert.notNull(userInfo, ResponseEnum.LOGIN_MOBILE_ERROR);
        Integer integral = userInfo.getIntegral();

        //根据积分获取用户额度
        QueryWrapper<IntegralGrade> integralGradeQueryWrapper = new QueryWrapper<>();
        //做一个区间比较,le为大于左边,ge为小于右边
        integralGradeQueryWrapper
                .le("integral_start",integral)
                .ge("integral_end",integral);
        IntegralGrade integralGrade = integralGradeMapper.selectOne(integralGradeQueryWrapper);
        if(integralGrade == null){
            return new BigDecimal("0");
        }
        return integralGrade.getBorrowAmount();
    }

    /**
     * @param borrowInfo:
     * @param userId:
     * @return void
     * @author Likejin
     * @description 将借款信息存储数据库,校验用户是否绑定和审批
     * @date 2023/4/16 15:11
     */

    @Override
    public void saveBorrowInfo(BorrowInfo borrowInfo, Long userId) {
        //校验绑定状态和借款人额度审批状态
        UserInfo userInfo = userInfoMapper.selectById(userId);
        Assert.isTrue(userInfo.getBindStatus().intValue() == UserBindEnum.BIND_OK.getStatus().intValue(),
                ResponseEnum.USER_NO_BIND_ERROR);
        Assert.isTrue(userInfo.getBorrowAuthStatus().intValue() == BorrowerStatusEnum.AUTH_OK.getStatus().intValue(),
                ResponseEnum.USER_NO_AMOUNT_ERROR);

        //判断借款人额度是否充足
        BigDecimal borrowAmount = this.getBorrowAmount(userId);
        Assert.isTrue(borrowInfo.getAmount().doubleValue() <=borrowAmount.doubleValue(),
                ResponseEnum.USER_AMOUNT_LESS_ERROR);


        //存储borrower_info数据
        borrowInfo.setUserId(userId);
        //百分比转小数
        borrowInfo.setBorrowYearRate(borrowInfo.getBorrowYearRate().divide(new BigDecimal(100)));
        //设置借款申请的审核状态
        borrowInfo.setStatus(BorrowInfoStatusEnum.CHECK_RUN.getStatus());
        baseMapper.insert(borrowInfo);
    }

    /**
     * @param userId:
     * @return Integer
     * @author Likejin
     * @description 获取用户申请借款的状态
     * @date 2023/4/16 15:35
     */
    @Override
    public Integer getStatusByUserId(Long userId) {
        //根据user_id查询用户的借款申请状态
        QueryWrapper<BorrowInfo> borrowInfoQueryWrapper = new QueryWrapper<>();
        borrowInfoQueryWrapper.select("status").eq("user_id", userId);
        List<Object> objects = baseMapper.selectObjs(borrowInfoQueryWrapper);

        if(objects.size() == 0){
            //借款人尚未提交信息
            return BorrowInfoStatusEnum.NO_AUTH.getStatus();
        }
        Integer status = (Integer)objects.get(0);
        return status;
    }
}

④后端代码逻辑难点

  • 获取借款额度
    通过token获得user_id,然后通过user_id查询user_info获得积分,在通过查表integral_grade表的的区间查询(根据积分所在的区间查询对应的额度)获取额度
  • 提交借贷申请
    需要从token中拿到user_id,通过user_id校验user是否绑定和是否申请借款额度(防止恶意攻击),还需要通过user_id校验该user的额度是否没被申请的额度超过,封装数据(年利率前端传整型,后端小数,除以100),设置借款流程的状态borrow_info的status,保存数据到数据库。
  • 获取借款流程状态
    直接根据user_id查询borrow_info中的status即可。

未更新

未更新

未更新

未更新

未更新

未更新

未更新

未更新

未更新

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

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

相关文章

用SSH登陆Centos系统时,命令行最前面显示“的提示符[root@www myapp]”是什么意思?

用SSH登陆Centos系统时&#xff0c;命令行最前面显示“的提示符[rootwww myapp]”是什么意思&#xff1f; 在SSH登录到CentOS系统时&#xff0c;提示符 [rootwww myapp] 中的 www 表示当前登录的主机名&#xff08;hostname&#xff09;&#xff0c;也就是指当前运行的CentOS系…

基于html+css的盒子展示2

准备项目 项目开发工具 Visual Studio Code 1.44.2 版本: 1.44.2 提交: ff915844119ce9485abfe8aa9076ec76b5300ddd 日期: 2020-04-16T16:36:23.138Z Electron: 7.1.11 Chrome: 78.0.3904.130 Node.js: 12.8.1 V8: 7.8.279.23-electron.0 OS: Windows_NT x64 10.0.19044 项目…

蓝桥杯web备赛——Node.js

node.js之前只能说是略有了解&#xff0c;这次好好了解一下吧&#xff01; 东西还是比较多的。 目前来看就了解比赛会用到的http模块就可以了&#xff0c;其他的暂且不做了解 const http require("http");//1.引入http模块const app http.createServer();//2.创建…

【网络安全】--xss漏洞

xss漏洞xss漏洞介绍危害防御方法xss测试语句xss攻击语句1. 反射性xss2.存储型xss3.DOM型xssxss漏洞介绍 定义&#xff1a;XSS 攻击全称跨站脚本攻击&#xff0c;是为不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆&#xff0c;故将跨站脚本攻击缩写为 XSS&#xff0c…

线段树笔记草稿

一个左节点u << 1和右节点u << 1 | 1 的证明 区间修改部分 1.批量等值修改 前提条件 是要区间修改&#xff0c;区间查询&#xff0c;且修改操作修改的值是相同的 情景 一般是要对一个数组执行k次操作&#xff0c;每次改变其中一个区间内所有元素的值&#x…

B02-国际化语言配置

&#x1f9d1;‍&#x1f393; 个人主页&#xff1a;Silence Lamb &#x1f4d6; 本章内容&#xff1a;【国际化语言配置】 Silence-Vitev 1.0.0 基于VITE前端快速开发框架 一、创建工具类 &#x1f356;常用工具类&#xff1a;src\utils\modules\common.js /*** Descriptio…

JavaScript(WebAPI)+具体案例

专栏简介: 前端从入门到进阶 题目来源: leetcode,牛客,剑指offer. 创作目标: 记录学习JavaEE学习历程 希望在提升自己的同时,帮助他人,,与大家一起共同进步,互相成长. 学历代表过去,能力代表现在,学习能力代表未来! 目录: 1. WebAPI 背景知识 1.1 什么是 WebAPI 1.2 DOM 基…

2023MathorCup数模D题思路数据代码论文【全网最全分享】

文章目录赛题思路赛题详情参赛建议&#xff08;个人见解&#xff09;选择队友及任务分配问题&#xff08;重要程度&#xff1a;5星&#xff09;2023MathorCup数模D题思路数据论文代码【最新】赛题思路 (赛题出来以后第一时间在CSDN分享) 最新进度在文章最下方卡片&#xff0c;…

GitLab集成阿里规约进行代码质量检查

1. 获取P3C-PMD (1) 下载源码 源码地址:https://github.com/alibaba/p3c (2) 打包 (3) 把打好的包(p3c-pmd-2.1.1-jar-with-dependencies.jar)拷贝到gitlab hooks脚本可以引用到的路径下,比如我这里拷贝到gitlab的安装目录下:/var/opt/gitlab/git-hooks(我的git…

Hyperledger Fabric项目搭建区块链浏览器Hyperledger-blockchain-explorer

Hyperledger Fabric项目搭建区块链浏览器 1.下载配置文件 区块链浏览器官网&#xff1a;https://github.com/hyperledger/blockchain-explorer # 根据官网来部署 # 在项目目录创建文件夹 # org1部署区块浏览器 mkdir explorer cd explorer # 下载配置文件 wget https://raw.…

软件测试分享15个适合练手的项目【金融/银行/商城/电商/医药......】

还愁没有练手的项目&#xff1f;我已经给你准备好了&#xff0c;需要评论区留下你的想法吧 1、引言 1.1 文档版本 版本 作者 审批 备注 V1.0 XXXX 创建测试方案文档 1.2 项目情况 项目名称 XXX 项目版本 V1.0 项目经理 XX 测试人员 XXXXX&#xff0c;XX…

【游戏开发】自从遇见了口袋方舟后,我的世界变得精彩了起来

文章目录前言口袋方舟编辑器口袋方舟训练营第一款游戏&#xff1a;四季跑酷第二款游戏&#xff1a;梦境逃脱个人感受其他说起游戏开发&#xff0c;我不允许还有人不知道口袋方舟编辑器&#xff01;前言 一直想写一篇博客来感谢口袋方舟&#xff0c;同时记录自己第一次游戏开发…

Centos7上配置python环境

Centos7上配置python环境1 安装包准备2 pycharm安装3 Anaconda安装4 pycharm配置解释器5 更改pip源1 安装包准备 pycharm下载&#xff1a;jetbrains官网 Anaconda下载&#xff1a; 清华大学开源软件镜像站 2 pycharm安装 下载好的pycharm软件包 2. 在 opt 文件夹下新建 soft…

卫星物联网的发展背景、研究现状、以及未来前景

今天这篇文章&#xff0c;我们来聊聊卫星物联网。 请大家注意&#xff0c;我说的是“物联网”&#xff0c;而不是“互联网”。 物联网&#xff0c;Internet of Things 众所周知&#xff0c;按使用对象&#xff0c;互联网可以分为“人联网”和“物联网”。我们普通消费者用户使…

Linux Shell 实现一键部署Nginx

nginx前言 nginx [engine x] 是 HTTP 和反向代理服务器、邮件代理服务器和通用 TCP/UDP 代理服务器&#xff0c;最初由Igor Sysoev编写。很长一段时间以来&#xff0c;它一直在许多负载重的俄罗斯网站上运行&#xff0c;包括 Yandex、 Mail.Ru、 VK和 Rambler。根据 Netcraft …

资本/车企持续加码的新赛道,谁将成为本土赢家?

随着汽车行业逐渐复苏&#xff0c;汽车厂商开始规划未来5年能促进销量的新技术&#xff0c;而AR-HUD就是被看好的技术之一。 Envisics创始人兼CEO Jamieson Christmas博士表示&#xff1a;我们几乎在与所有人合作&#xff0c;除了捷豹路虎、松下汽车系统外还有其他合作伙伴。此…

说走就走的旅行?你需要一个旅行必备清单

可能很多朋友都不用清单这个东西&#xff0c;更别说清单模版了。那清单真的好用吗&#xff1f;说实话&#xff0c;当你真的用清单来整理自己的日常工作&#xff0c;乃至生活琐事后&#xff0c;你就会发现你的时间多了&#xff0c;想要完成的事&#xff0c;大部分都可以按时完成…

Mysql 学习(四)InnDB 存储引擎-B+树索引

没有索引的查找 上节我们知道了数据是怎么存储的&#xff0c;数据被分成一个个页&#xff0c;然后页与页之间是根据双向列表来进行连接的&#xff0c;页中的记录是根据单向列表来进行连接的&#xff0c;并且将主键生成页目录。根据这个规则我们查找对应的记录数据&#xff0c;…

责任链设计模式

模拟学生请假流程&#xff0c;用以说明责任链模式。 请假天数 < 10&#xff0c;老师审批&#xff1b; 10 < 请假天数 < 20&#xff0c;主任审批&#xff1b; 20 < 请假天数 < 30&#xff0c;校长审批&#xff1b; 请假天数 > 30&#xff0c;超出学校允许请假…

vulnhub Hackathon2渗透笔记

靶机下载地址&#xff1a;https://www.vulnhub.com/entry/hackathonctf-2,714/ kali ip地址&#xff1a;192.168.20.130 信息收集 扫描靶机ip地址 nmap -sP 192.168.20.0/24确定靶机ip 进行端口扫描 nmap -A -p 1-65535 192.168.20.134首先我们使用匿名用户登录ftp看看有…