【金融项目】尚融宝项目(十一)
21、借款申请
21.1、需求介绍
21.1.1、借款人申请借款
1、需求描述
2、相关数据库表
21.1.2、具体步骤
step1:借款人点击“我要借款”
step2:展示借款信息填写页面
step3:借款人填写信息并提交
step4:展示等待审核页面
step5:平台审核
step6:显示审批结果
未通过
通过
21.2、获取借款额度
21.2.1、获取借款额度
1、实现思路
(1)获取借款人积分
(2)根据积分获取借款额度,借款人每次借款不能超过借款额度
2、Controller
BorrowInfoController
package com.atguigu.srb.core.controller.api;@Api(tags = "借款信息")
@RestController
@RequestMapping("/api/core/borrowInfo")
@Slf4j
public class BorrowInfoController {@Resourceprivate 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);}
}
3、Service
接口:BorrowInfoService
BigDecimal getBorrowAmount(Long userId);
实现:BorrowInfoServiceImpl
package com.atguigu.srb.core.service.impl;@Service
public class BorrowInfoServiceImpl extends ServiceImpl<BorrowInfoMapper, BorrowInfo> implements BorrowInfoService {@Resourceprivate UserInfoMapper userInfoMapper;@Resourceprivate IntegralGradeMapper integralGradeMapper;@Overridepublic BigDecimal getBorrowAmount(Long userId) {//获取用户积分UserInfo userInfo = userInfoMapper.selectById(userId);Assert.notNull(userInfo, ResponseEnum.LOGIN_MOBILE_ERROR);Integer integral = userInfo.getIntegral();//根据积分查询借款额度QueryWrapper<IntegralGrade> queryWrapper = new QueryWrapper<>();queryWrapper.le("integral_start", integral);queryWrapper.ge("integral_end", integral);IntegralGrade integralGradeConfig = integralGradeMapper.selectOne(queryWrapper);if(integralGradeConfig == null){return BigDecimal.ZERO;}return integralGradeConfig.getBorrowAmount();}
}
21.2.2、借款入口前端
pages/user/borrower.vue
<NuxtLink to="/user/apply" v-if="borrowerStatus === 2"><el-button style="margin-top:20px;" type="success">我要借款</el-button>
</NuxtLink>
21.2.3、借款申请
1、页面
pages/user/apply.vue
2、获取下拉列表
methods中定义
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})},},
mounted中调用
mounted() {//初始化下拉列表this.initSelected()},
3、获取借款额度
methods中定义
//获取借款额度getBorrowAmount() {this.$axios.$get('/api/core/borrowInfo/auth/getBorrowAmount').then((response) => {this.borrowAmount = response.data.borrowAmount})},
created中调用
mounted() {//获取借款额度this.getBorrowAmount()//初始化下拉列表......},
4、判断借款额度
借款人每次借款不能超过借款额度
watch: {'borrowInfo.amount'(value) {if (value > this.borrowAmount) {let _this = thisthis.$alert('您的借款额度不足!', {type: 'error',callback() {_this.borrowInfo.amount = _this.borrowAmount},})}},},
21.3、提交借款申请
21.3.1、后端实现
1、实现思路
借款人提交借款要判断借款人账户绑定状态与借款人信息审批状态,只有这两个状态都成立才能借款,这两个状态都在会员表中
目标:将借款申请表单中用户填写的数据保存在borrow_info数据库表中
2、枚举
BorrowInfoStatusEnum
NO_AUTH(0, "未提交"),CHECK_RUN(1, "审核中"),CHECK_OK(2, "审核通过"),CHECK_FAIL(-1, "审核不通过"),;
状态(0:未提交,1:审核中, 2:审核通过, -1:审核不通过)
3、Controller
BorrowInfoController
@ApiOperation("提交借款申请")
@PostMapping("/auth/save")
public R save(@RequestBody BorrowInfo borrowInfo, HttpServletRequest request) {String token = request.getHeader("token");Long userId = JwtUtils.getUserId(token);borrowInfoService.saveBorrowInfo(borrowInfo, userId);return R.ok().message("提交成功");
}
4、Service
接口:BorrowInfoService
void saveBorrowInfo(BorrowInfo borrowInfo, Long userId);
实现:BorrowInfoServiceImpl
@Override
public void saveBorrowInfo(BorrowInfo borrowInfo, Long userId) {//获取userInfo的用户数据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);//存储数据borrowInfo.setUserId(userId);// 校验年化利率(此处真实开发中,应该限制用户最大输入的小数点位数,并且在数据库中做足够大的小数点位数存储,否则计算利息的时候会出现精度不足导致的一系列问题)String borrowYearRate = borrowInfo.getBorrowYearRate().toPlainString();String[] borrowYearRateSplit = borrowYearRate.split("\\.");if (borrowYearRateSplit.length >1 && borrowYearRateSplit[1].length() > 2) {throw new BusinessException("年化利率仅支持到小数点后两位");}// 百分比转成小数(数据库类型修改为decimal(10,4))borrowInfo.setBorrowYearRate(borrowInfo.getBorrowYearRate().divide(new BigDecimal(100), 4, RoundingMode.DOWN));borrowInfo.setStatus(BorrowInfoStatusEnum.CHECK_RUN.getStatus());baseMapper.insert(borrowInfo);
}
21.3.2、前端
提交借款申请
pages/user/apply.vue
//提交借款申请save() {// this.submitBtnDisabled = truethis.$axios.$post('/api/core/borrowInfo/auth/save', this.borrowInfo).then((response) => {this.active = 1})},
21.4、获取借款申请状态
21.4.1、获取借款状态
1、BorrowInfoController
@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);
}
2、service
接口:BorrowInfoService
Integer getStatusByUserId(Long userId);
实现:BorrowInfoServiceImpl
@Override
public Integer getStatusByUserId(Long userId) {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;
}
21.4.2、前端开发
脚本
pages/user/apply.vue
将this.getBorrowAmount()和this.initSelected()移植到this.getBorrowInfoStatus()中
mounted() {//获取审批状态this.getBorrowInfoStatus()
},
methods中添加方法:
//获取借款审批状态
getBorrowInfoStatus() {this.$axios.$get('/api/core/borrowInfo/auth/getBorrowInfoStatus').then((response) => {this.borrowInfoStatus = response.data.borrowInfoStatusif (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}})
},
将 data() 中 active的初始化值设置为null
active: null, //步骤
22、借款审核
22.1、借款信息列表
22.1.1、需求
22.1.2、后端实现
1、扩展实体对象
列表的结果需要关联查询,数据字典的数据也需要展示对应的文本内容而不是值,除了定义VO的方式,我们也可以使用扩展实体类的方式
在BorrowInfo类中扩展以下字段
//扩展字段
@ApiModelProperty(value = "姓名")
@TableField(exist = false)
private String name;@ApiModelProperty(value = "手机")
@TableField(exist = false)
private String mobile;@ApiModelProperty(value = "其他参数")
@TableField(exist = false)
private Map<String,Object> param = new HashMap<>();
2、Controller
添加 AdminBorrowInfoController
package com.atguigu.srb.core.controller.admin;@Api(tags = "借款管理")
@RestController
@RequestMapping("/admin/core/borrowInfo")
@Slf4j
public class AdminBorrowInfoController {@Resourceprivate BorrowInfoService borrowInfoService;@ApiOperation("借款信息列表")@GetMapping("/list")public R list() {List<BorrowInfo> borrowInfoList = borrowInfoService.selectList();return R.ok().data("list", borrowInfoList);}
}
3、Service
接口:BorrowInfoService
List<BorrowInfo> selectList();
实现:BorrowInfoServiceImpl
@Resource
private DictService dictService;@Override
public List<BorrowInfo> selectList() {List<BorrowInfo> borrowInfoList = baseMapper.selectBorrowInfoList();borrowInfoList.forEach(borrowInfo -> {String returnMethod = dictService.getNameByParentDictCodeAndValue("returnMethod", borrowInfo.getReturnMethod());String moneyUse = dictService.getNameByParentDictCodeAndValue("moneyUse", borrowInfo.getMoneyUse());String status = BorrowInfoStatusEnum.getMsgByStatus(borrowInfo.getStatus());borrowInfo.getParam().put("returnMethod", returnMethod);borrowInfo.getParam().put("moneyUse", moneyUse);borrowInfo.getParam().put("status", status);});return borrowInfoList;
}
4、Mapper
接口:BorrowInfoMapper
List<BorrowInfo> selectBorrowInfoList();
xml:BorrowInfoMapper.xml
<select id="selectBorrowInfoList" resultType="com.atguigu.srb.core.pojo.entity.BorrowInfo">SELECTbi.*,b.name,b.mobileFROMborrow_info AS biLEFT JOIN borrower AS b ON bi.user_id = b.user_idWHERE bi.is_deleted = 0
</select>
22.1.3、前端
1、创建页面组件
创建 src/views/core/borrow-info/list.vue
<template><div class="app-container">借款列表</div>
</template>
<script>
export default {}
</script>
创建 src/views/core/borrow-info/detail.vue
<template><div class="app-container">借款详情</div>
</template>
<script>
export default {}
</script>
2、配置路由
src/router/index.js
在“借款管理”下添加子路由
{path: 'info-list',name: 'coreBorrowInfoList',component: () => import('@/views/core/borrow-info/list'),meta: { title: '借款列表' }},{path: 'info-detail/:id',name: 'coreBorrowInfoDetail',component: () => import('@/views/core/borrow-info/detail'),meta: { title: '借款详情' },hidden: true}
3、定义api
创建 src/api/core/borrow-info.js
import request from '@/utils/request'
export default {getList() {return request({url: `/admin/core/borrowInfo/list`,method: 'get'})}
}
4、页面脚本
src/views/core/borrow-info/list.vue
<script>
import borrowInfoApi from '@/api/core/borrow-info'
export default {data() {return {list: null // 列表}},created() {this.fetchData()},methods: {// 加载列表数据fetchData() {borrowInfoApi.getList().then(response => {this.list = response.data.list})}}
}
</script>
5、页面模板
src/views/core/borrow-info/list.vue
<template><div class="app-container"><!-- 列表 --><el-table :data="list" stripe><el-table-column type="index" label="序号" width="60" align="center" /><el-table-column prop="name" label="借款人姓名" width="90" /><el-table-column prop="mobile" label="手机" /><el-table-column prop="amount" label="借款金额" /><el-table-column label="借款期限" width="90"><template slot-scope="scope">{{ scope.row.period }}个月</template></el-table-column><el-table-column prop="param.returnMethod" label="还款方式" width="150" /><el-table-column prop="param.moneyUse" label="资金用途" width="100" /><el-table-column label="年化利率" width="90"><template slot-scope="scope">{{ scope.row.borrowYearRate * 100 }}%</template></el-table-column><el-table-column prop="param.status" label="状态" width="100" /><el-table-column prop="createTime" label="申请时间" width="150" /><el-table-column label="操作" width="150" align="center"><template slot-scope="scope"><el-button type="primary" size="mini"><router-link :to="'/core/borrower/info-detail/' + scope.row.id">查看</router-link></el-button><el-buttonv-if="scope.row.status === 1"type="warning"size="mini"@click="approvalShow(scope.row)">审批</el-button></template></el-table-column></el-table></div>
</template>
22.2、借款详情
22.2.1、需求
借款详情展示借款信息与借款人信息
22.2.2、后端实现
1、Controller
AdminBorrowInfoController
@ApiOperation("获取借款信息")
@GetMapping("/show/{id}")
public R show(@ApiParam(value = "借款id", required = true)@PathVariable Long id) {Map<String, Object> borrowInfoDetail = borrowInfoService.getBorrowInfoDetail(id);return R.ok().data("borrowInfoDetail", borrowInfoDetail);
}
2、Service
接口:BorrowInfoService
Map<String, Object> getBorrowInfoDetail(Long id);
实现:BorrowInfoServiceImpl
@Resource
private BorrowerMapper borrowerMapper;
@Resource
private BorrowerService borrowerService;@Override
public Map<String, Object> getBorrowInfoDetail(Long id) {//查询借款对象BorrowInfo borrowInfo = baseMapper.selectById(id);//组装数据String returnMethod = dictService.getNameByParentDictCodeAndValue("returnMethod", borrowInfo.getReturnMethod());String moneyUse = dictService.getNameByParentDictCodeAndValue("moneyUse", borrowInfo.getMoneyUse());String status = BorrowInfoStatusEnum.getMsgByStatus(borrowInfo.getStatus());borrowInfo.getParam().put("returnMethod", returnMethod);borrowInfo.getParam().put("moneyUse", moneyUse);borrowInfo.getParam().put("status", status);//根据user_id获取借款人对象QueryWrapper<Borrower> borrowerQueryWrapper = new QueryWrapper<Borrower>();borrowerQueryWrapper.eq("user_id", borrowInfo.getUserId());Borrower borrower = borrowerMapper.selectOne(borrowerQueryWrapper);//组装借款人对象BorrowerDetailVO borrowerDetailVO = borrowerService.getBorrowerDetailVOById(borrower.getId());//组装数据Map<String, Object> result = new HashMap<>();result.put("borrowInfo", borrowInfo);result.put("borrower", borrowerDetailVO);return result;
}
22.2.3、前端
1、定义api
src/api/core/borrow-info.js
show(id) {return request({url: `/admin/core/borrowInfo/show/${id}`,method: 'get'})}
2、添加自定义css
src/styles/show.css
3、页面脚本
src/views/core/borrow-info/detail.vue
<script>
import borrowInfoApi from '@/api/core/borrow-info'
import '@/styles/show.css'
export default {data() {return {borrowInfoDetail: {borrowInfo: {param: {}},borrower: {}}}},created() {if (this.$route.params.id) {this.fetchDataById()}},methods: {fetchDataById() {borrowInfoApi.show(this.$route.params.id).then(response => {this.borrowInfoDetail = response.data.borrowInfoDetail})},back() {this.$router.push({ path: '/core/borrower/info-list' })}}
}
</script>
4、页面模板
src/views/core/borrow-info/detail.vue
<template><div class="app-container"><h4>借款信息</h4><tableclass="table table-striped table-condenseda table-bordered"width="100%"><tbody><tr><th width="15%">借款金额</th><td width="35%">{{ borrowInfoDetail.borrowInfo.amount }}元</td><th width="15%">借款期限</th><td width="35%">{{ borrowInfoDetail.borrowInfo.period }}个月</td></tr><tr><th>年化利率</th><td>{{ borrowInfoDetail.borrowInfo.borrowYearRate * 100 }}%</td><th>还款方式</th><td>{{ borrowInfoDetail.borrowInfo.param.returnMethod }}</td></tr><tr><th>资金用途</th><td>{{ borrowInfoDetail.borrowInfo.param.moneyUse }}</td><th>状态</th><td>{{ borrowInfoDetail.borrowInfo.param.status }}</td></tr><tr><th>创建时间</th><td>{{ borrowInfoDetail.borrowInfo.createTime }}</td><th></th><td></td></tr></tbody></table><h4>借款人信息</h4><tableclass="table table-striped table-condenseda table-bordered"width="100%"><tbody><tr><th width="15%">借款人</th><td width="35%"><b>{{ borrowInfoDetail.borrower.name }}</b></td><th width="15%">手机</th><td width="35%">{{ borrowInfoDetail.borrower.mobile }}</td></tr><tr><th>身份证</th><td>{{ borrowInfoDetail.borrower.idCard }}</td><th>性别</th><td>{{ borrowInfoDetail.borrower.sex }}</td></tr><tr><th>年龄</th><td>{{ borrowInfoDetail.borrower.age }}</td><th>是否结婚</th><td>{{ borrowInfoDetail.borrower.marry }}</td></tr><tr><th>学历</th><td>{{ borrowInfoDetail.borrower.education }}</td><th>行业</th><td>{{ borrowInfoDetail.borrower.industry }}</td></tr><tr><th>月收入</th><td>{{ borrowInfoDetail.borrower.income }}</td><th>还款来源</th><td>{{ borrowInfoDetail.borrower.returnSource }}</td></tr><tr><th>创建时间</th><td>{{ borrowInfoDetail.borrower.createTime }}</td><th>状态</th><td>{{ borrowInfoDetail.borrower.status }}</td></tr></tbody></table><el-row style="text-align:center;margin-top: 40px;"><el-button @click="back">返回</el-button></el-row></div>
</template>
22.3、借款审批
22.3.1、需求
管理平台借款审批,审批通过后产生标的,审批前我们需要跟借款人进行电话沟通,确定借款年化和平台服务费率(平台收益),借款年化可能根据实际情况调高或调低;起息日通常我们把它确定为募集结束时间(或放款时间)
22.3.2、后端实现
1、定义VO对象
package com.atguigu.srb.core.pojo.vo;@Data
@ApiModel(description = "借款信息审批")
public class BorrowInfoApprovalVO {@ApiModelProperty(value = "id")private Long id;@ApiModelProperty(value = "状态")private Integer status;@ApiModelProperty(value = "审批内容")private String content;@ApiModelProperty(value = "标题")private String title;@ApiModelProperty(value = "年化利率")private BigDecimal lendYearRate;@ApiModelProperty(value = "平台服务费率")private BigDecimal serviceRate;@ApiModelProperty(value = "开始日期")private String lendStartDate;@ApiModelProperty(value = "描述信息")private String lendInfo;
}
2、Controller
AdminBorrowInfoController
@ApiOperation("审批借款信息")
@PostMapping("/approval")
public R approval(@RequestBody BorrowInfoApprovalVO borrowInfoApprovalVO) {borrowInfoService.approval(borrowInfoApprovalVO);return R.ok().message("审批完成");
}
3、Service
接口:BorrowInfoService
void approval(BorrowInfoApprovalVO borrowInfoApprovalVO);
实现:BorrowInfoServiceImpl
@Transactional(rollbackFor = Exception.class)
@Override
public void approval(BorrowInfoApprovalVO borrowInfoApprovalVO) {//修改借款信息状态Long borrowInfoId = borrowInfoApprovalVO.getId();BorrowInfo borrowInfo = baseMapper.selectById(borrowInfoId);borrowInfo.setStatus(borrowInfoApprovalVO.getStatus());borrowInfo.setUpdateTime(LocalDateTime.now());baseMapper.updateById(borrowInfo);//审核通过则创建标的if (borrowInfoApprovalVO.getStatus().intValue() == BorrowInfoStatusEnum.CHECK_OK.getStatus().intValue()) {//创建标的//TODO}
}
22.3.3、前端实现
1、定义api
src/api/core/borrow-info.js
approval(borrowInfoApproval) {return request({url: '/admin/core/borrowInfo/approval',method: 'post',data: borrowInfoApproval})}
2、页面脚本
src/views/core/borrow-info/list.vue
data:
dialogVisible: false, //审批对话框
borrowInfoApproval: {status: 2,serviceRate: 5,lendYearRate: 0 //初始化,解决表单中数据修改时无法及时渲染的问题
} //审批对象
methods:
approvalShow(row) {this.dialogVisible = truethis.borrowInfoApproval.id = row.idthis.borrowInfoApproval.lendYearRate = row.borrowYearRate * 100},approvalSubmit() {borrowInfoApi.approval(this.borrowInfoApproval).then(response => {this.dialogVisible = falsethis.$message.success(response.message)this.fetchData()})}
3、页面模板
src/views/core/borrow-info/list.vue
<!-- 审批对话框 -->
<el-dialog title="审批" :visible.sync="dialogVisible" width="490px"><el-form label-position="right" label-width="100px"><el-form-item label="是否通过"><el-radio-group v-model="borrowInfoApproval.status"><el-radio :label="2">通过</el-radio><el-radio :label="-1">不通过</el-radio></el-radio-group></el-form-item><el-form-item v-if="borrowInfoApproval.status == 2" label="标的名称"><el-input v-model="borrowInfoApproval.title" /></el-form-item><el-form-item v-if="borrowInfoApproval.status == 2" label="起息日"><el-date-pickerv-model="borrowInfoApproval.lendStartDate"type="date"placeholder="选择开始时间"value-format="yyyy-MM-dd"/></el-form-item><el-form-item v-if="borrowInfoApproval.status == 2" label="年化收益率"><el-input v-model="borrowInfoApproval.lendYearRate"><template slot="append">%</template></el-input></el-form-item><el-form-item v-if="borrowInfoApproval.status == 2" label="服务费率"><el-input v-model="borrowInfoApproval.serviceRate"><template slot="append">%</template></el-input></el-form-item><el-form-item v-if="borrowInfoApproval.status == 2" label="标的描述"><el-input v-model="borrowInfoApproval.lendInfo" type="textarea" /></el-form-item></el-form><div slot="footer" class="dialog-footer"><el-button @click="dialogVisible = false">取消</el-button><el-button type="primary" @click="approvalSubmit">确定</el-button></div>
</el-dialog>
本文章参考B站 尚硅谷《尚融宝》Java微服务分布式金融项目,仅供个人学习使用,部分内容为本人自己见解,与尚硅谷无关。
【金融项目】尚融宝项目(十一)相关推荐
- 【金融项目】尚融宝项目(一)
1.尚融宝项目简介 1.1.前言 尚融宝项目是一个网络借贷信息中介服务平台,为个人投资者.个人融资用户和小微企业提供专业的线上信贷及出借撮合服务. 行业案例:人人贷 https://www.renre ...
- 【金融项目】尚融宝项目(十四)
27.放款 27.1.需求介绍 27.1.1.平台放款 1.需求描述 标的募资时间到,平台会操作放款或撤标,如果达到放款条件则操作放款 说明:撤标过程与放款过程一致,处理业务相对简单,只是将出借金额返 ...
- 【金融项目】尚融宝项目(十六)
31.RabbitMQ 31.1.整合Rabbit MQ发送短信 31.1.1.MQ服务器设置 1.访问MQ控制台 http://192.168.100.103:15672 2.创建用户 创建用户 s ...
- 【金融项目】尚融宝项目(十五)
29.提现和还款 29.1.提现 29.1.1.需求 放款成功后,借款人可以申请提现. 参考<汇付宝商户账户技术文档>3.15用户申请提现 29.1.2.前端整合 pages/user/w ...
- 【金融项目】尚融宝项目(十)
19.申请借款额度 19.1.需求介绍 19.1.1.借款人申请额度 1.需求描述 平台管理员根据借款人个人信息设置积分,通过积分规则借款人可以获取额度. 2.相关数据库表 19.1.2.具体步骤 s ...
- 【金融项目】尚融宝项目(四)
6.Alibaba EasyExcel 6.1.EasyExcel简介 6.1.1.Excel导入导出的应用场景 6.1.1.1.数据导入 减轻录入工作量 6.1.1.2.数据导出 统计信息归档 6. ...
- 【金融项目】尚融宝项目(六)
11.访问令牌 11.1.单点登录 11.1.1.用户身份认证 11.1.1.1.单一服务器模式 一般过程如下: 用户向服务器发送用户名和密码. 验证服务器后,相关数据(如用户名,用户角色等)将保存在 ...
- 【金融项目】尚融宝项目(九)
18.账户绑定 18.1.需求介绍 18.1.1.运行汇付宝 1.数据库 hfb.sql 2.程序 hfb 3.数据库配置 application-dev.yml 中修改数据库配置 4.启动程序 端口 ...
- 【金融项目】尚融宝项目(八)
16.服务调用 16.1.注册中心和服务发现 16.1.1.运行Nacos注册中心 16.1.1.1.Nacos下载和安装 下载地址:https://github.com/alibaba/nacos/ ...
最新文章
- 理解JavaScript中的事件
- linux shell ddos木马,利用Shell 脚本解决DDOS攻击问题
- MongoDB和Java(4):Spring Data整合MongoDB(XML配置)
- Hyperledger Fabric 智能合约实战 (5) go语言开发
- vue代码怎么变成小程序_使用vue编写h5公众号跳转小程序的实现代码
- 第11讲++数据的基本查询
- 数据库调优过程(五):物理分表,及写入方案调整
- 锁定 ASP.NET 配置设定
- 裁员下老公老婆的对话
- php 405,php Restler 405 Method Not Allowed 问题解决啦,restlerallowed_PHP教程
- java左移负数位_java的左移运算符和右移运算符
- shell添加用户时设置密码脚本
- 高德地图----经纬度转地理位置,地理位置获取经纬度
- 单片机很简单?我们来聊聊如何进阶
- php的坑,PHP中的这容易被踩的坑,新人必看
- C++求最大与最小值
- python的cfg是什么模块_使用安装模块设置.py以及设置.cfg
- freescale R10 ipu lib 分析 - ipu_device.c
- 淘宝直通车的打法的方法与问题分析
- 华硕服务器怎么装win7系统教程视频,华硕电脑离线重装win7系统详细教程