Java全栈开发---Java ERP系统开发:商业ERP(八)采购申请(1)

(3)修改Orders

添加各个内容对应的名称属性

在这里插入图片描述

注入ISupplierDao,生成Get和Set方法

在这里插入图片描述

(4)修改OrdersBiz对象

通过对应不同的order当中的id到别的表当中查询对应id的name并设置到对应的属性到orders当中

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

public List getListByPage(Orders t1, Orders t2, Object param, int firstResult, int maxResults) {

// 获取分页后的订单列表,因为刚刚Orders当中设置的值还是为空下面需要遍历orderlist为其赋值

// 获取所有所有的订单集合

List ordersList = super.getListByPage(t1, t2, param, firstResult, maxResults);

// 缓存员工的编号和员工的名称,key=员工的编号,value=员工的名称

// (目的是从订单集合当中获取对应所有的每个订单对应的员工编号和员工姓名),应为id对应名称的重复概率很大所以需要一个MPA集合作为缓存

Map<Long, String> empNameMap = new HashMap<Long, String>();

// 缓存供应商的编号和供应商的名称,key=供应商的编号,value=供应商的名称

// (目的是从订单集合当中获取对应所有的每个订单对应的供应商编号和供应商姓名),应为id对应名称的重复概率很大所以需要一个MPA集合作为缓存

Map<Long, String> supplierNameMap = new HashMap<Long, String>();

// 循环,获取员工的名称

for (Orders o : ordersList) {// 遍历订单集合

// 下面通过Orders当中的id查询对应每一个id对应的名称

// 将对应的创建订单姓名的人放入到对应订单的姓名订单数据当中

o.setCreaterName(getEmpName(o.getCreater(), empNameMap));

// 设置订单审核人员的名称

o.setCheckerName(getEmpName(o.getChecker(), empNameMap));

o.setStarterName(getEmpName(o.getStarter(), empNameMap));

o.setEnderName(getEmpName(o.getEnder(), empNameMap));

// 供应商

o.setStarterName(getSupplierName(o.getSupplieruuid(), supplierNameMap));

}

return ordersList;

}

// 获取员工的名称

// uuid 员工编号

// empNameMap 员工编号以及员工的名称

// 返回员工的名称

private String getEmpName(Long uuid, Map<Long, String> empNameMap) {

// 通过当前集合当中的uuid获取对应的值的员工姓名

if(null == uuid) {

return null;

}

String empName = empNameMap.get(uuid);

// 先从Map集合当中通过对应的id获取name如果有就不需要获取对应的姓名,如果没有就通过id、

// 重新向数据库查询对应id的name并将其id】和姓名放入到map 集合当中

if (null == empName) {

// 如果没有找到员工的名称,则进行数据库查询

empName = empDao.get(uuid).getName();// 通过id查询对应员工的姓名

// 存入缓存中

empNameMap.put(uuid, empName);// 将员工的id和姓名存入emp集合当中

}

return empName;

}

// 获取供应商的名称

// uuid 供应商编号

// supplierNameMap 供应商编号以及供应商的名称

// 返回供应商的名称

private String getSupplierName(Long uuid, Map<Long, String> supplierNameMap) {

if(null == uuid) {

return null;

}

// 通过当前集合当中的uuid获取对应的值的供应商姓名

String supplierName = supplierNameMap.get(uuid);

// 先从Map集合当中通过对应的id获取name如果有就不需要获取对应的姓名,如果没有就通过id、

// 重新向数据库查询对应id的name并将其id】和姓名放入到map 集合当中

if (null == supplierName) {

// 如果没有找到供应商的名称,则进行数据库查询

supplierName = supplierDao.get(uuid).getName();// 通过id查询对应供应商的姓名

// 存入缓存中

supplierNameMap.put(uuid, supplierName);// 将供应商的id和姓名存入emp集合当中

}

return supplierName;

}

(5)修改applicationContext_biz.xml文件实现对orderBiz实现属性注入

在这里插入图片描述

(6)修改order.js文件

$(function(){

$(‘#grid’).datagrid({

url: ‘orders_listByPage?t1.type=1’,

columns:[[

{field:‘uuid’,title:‘编号’,width:100},

{field:‘createtime’,title:‘生成日期’,width:100,formatter:formatDate},

{field:‘checktime’,title:‘审核日期’,width:100,formatter:formatDate},

{field:‘starttime’,title:‘确认日期’,width:100,formatter:formatDate},

{field:‘endtime’,title:‘入库日期’,width:100,formatter:formatDate},

{field:‘createrName’,title:‘下单员’,width:100},

{field:‘checkerName’,title:‘审核员’,width:100},

{field:‘starterName’,title:‘采购员’,width:100},

{field:‘enderName’,title:‘库管员’,width:100},

{field:‘supplierName’,title:‘供应商或客户’,width:100},

{field:‘totalmoney’,title:‘合计金额’,width:100},

{field:‘state’,title:‘状态’,width:100,formatter:getState},

{field:‘waybillsn’,title:‘运单号’,width:100}

]]

});

});

/**

  • 日期格式化器

  • @param value

  • @returns

*/

function formatDate(value){

return new Date(value).Format(‘yyyy-MM-dd’);

}

/**

  • 获取订单的状态

  • @param value

  • @returns

  • 采购: 0:未审核 1:已审核, 2:已确认, 3:已入库

*/

function getState(value){

switch(value * 1){

case 0:return ‘未审核’;

case 1:return ‘已审核’;

case 2:return ‘已确认’;

case 3:return ‘已入库’;

default: return ‘’;

}

}

(6)运行测试

在这里插入图片描述

2、显示订单明细(订单明细——前端实现)双击行显示订单详情
(1)修改orders.html
采购订单查询

height:320,width:700,title:‘订单详情’,modal:true,closed:true

" >

流水号 供应商 状态 下单员 审核员 采购员 库管员 下单日期 审核日期 采购日期 入库日期
(2)修改orders.js添加鼠标双击事件

在这里插入图片描述

向明细表格当中加载一些数据(Hibernate当中,当在类当中定义的外键变为类的时候,并且配置了一对多的关系映射)

在这里插入图片描述

(3)在表格当中显示订单详情

在orders.html当中修改表格,添加id

在这里插入图片描述

在orders.js当中

在这里插入图片描述

测试

在这里插入图片描述

加载明细

在这里插入图片描述

加载订单明细

在这里插入图片描述

3、采购订单审核(后端)

列出所有“未审核”的采购订单,双击某一行时弹出详细窗口,点击“审核”按钮后弹出确认框,确认后提示“审核”结果。审核成功,则关闭详细窗口并刷新“未审核”列表。

如下图

在这里插入图片描述

实现思路:

订单的状态:

0: 未审核, 1:已审核, 2:已确认, 3:已入库

(1)在IOrdersBiz当中创建doCheck方法

在这里插入图片描述

(2)在OrdersBiz当中实现这个方法

在这里插入图片描述

(3)在OrdersAction当中

在这里插入图片描述

(4)修改OrdersDao

在这里插入图片描述

4、采购订单审核(前端)
修改orders,js当中的

在这里插入图片描述

在这里插入图片描述

测试点击审核

在这里插入图片描述

审核成功

在这里插入图片描述

5、采购订单确认

使用Hibernate查询出的实体对象,该对象为持久化状态,在同一个事务内,都判断对象是否被更新。如果更新了,Hibernate会自动更新数据库。

在这里插入图片描述

(1)修改IOrdersBiz

在这里插入图片描述

(2)编写对应的实现类

在这里插入图片描述

(2)在OrdersAction当中编写doStart方法

在这里插入图片描述

(3)修改order.js

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

(4)测试订单确认

在这里插入图片描述

注意事项:http://localhost:8080/erp/orders.html??oper=doStart

下面的这段代码将?oper=doStart转换为JSON对象(实现静态传递参数)

在这里插入图片描述

四、采购订单入库(代码实现)


1、分析入库规则

在这里插入图片描述

2、入库(biz后端)
(1)在StoredetailDao当中添加条件

在这里插入图片描述

(2)在IOrderdetailBiz当中

在这里插入图片描述

(3)在实现类OrderdetailBiz当中,先实现上面的接口然后,OrderdetailBiz当中注入storedetailDao(入库明细)和storeoperDao(入库操作记录)并生成生成set方法在这里插入图片描述
(4)applicationContext_biz.xml设置对应的配置文件(实现注入)

在这里插入图片描述

(5)在实现类OrderdetailBiz当中,在deInStore方法当中

a、先在Storeoper当中定义常量

在这里插入图片描述

b、修改OrderdetailDao

在这里插入图片描述

c、OrderdetailBiz

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

全部代码

/*

  • 入库

  • uuid明细编号,这个是从订单编号当中获取

  • storeuuid 仓库编号

  • empuuid 库管员编号

*/

@Override

public void doInStore(Long uuid, Long storeuuid, Long empuuid) {

// 一、第一步,更新订单信息

//1、更新明细的状态,获取明细信息

Orderdetail orderdetail = orderdetailDao.get(uuid);//通过uuid获取订单明细

//2、在入库前判断订单明细的状态是否为入库的状态

if(!Orderdetail.STATE_NO_IN.equals(orderdetail.getState())) {

throw new ErpException(“亲!不能重复入库哦!”);

}

//3、修改状态已经入库

orderdetail.setState(Orderdetail.STATE_IN);

//4、入库时间

orderdetail.setEndtime(new Date());

//5.入库管理人员

orderdetail.setEnder(empuuid);

//6、入到哪一个仓库当中去

orderdetail.setStoreuuid(storeuuid);

//以上设置的值会自动保存到数据库当中

//第二步入库

//1、构建查询条件 查询的条件,查询对应

Storedetail storedetail = new Storedetail();

storedetail.setGoodsuuid(orderdetail.getGoodsuuid());

storedetail.setStoreuuid(storeuuid);

//2、通常查询 检查是否在库存信息(对应订单详情的库存信息)

List storeList = storedetailDao.getList(storedetail, null, null);

//如果通过订单明细可以查询到对应的库存信息

if(storeList.size()>0) {

//存在的话,则应该累加数据

long num = 0;

if(null != storeList.get(0).getNum()) {

num = storeList.get(0).getNum().longValue();

}

//库存数量加上订单明细当中的数量,上面获取到了持久化的属性之后就自动更新到数据库

storeList.get(0).setNum(num + orderdetail.getNum());

}else {

//如果不存在就插入库存的记录

//如果查不到,就说明没有对应订单明细的库存信息,直接将订单信息添加到对应的数据库当中

storedetail.setNum(orderdetail.getNum());//设置当前库存信息的数量为当前订单的数量

storedetailDao.add(storedetail);//保存到数据库当中

}

/第三步增加操作记录/

Storeoper log = new Storeoper();//获取操作记录的对象

//设置操作员的id

log.setEmpuuid(empuuid);

//设置商品id,当前商品id就是当前订单的id

log.setGoodsuuid(orderdetail.getGoodsuuid());

//设置数量操作记录的数量为当前订单详情的数量

log.setNum(orderdetail.getNum());

//设置操作时间为当前订单入库的时间

log.setOpertime(orderdetail.getEndtime());

//设置入库到那个仓库的记录

log.setStoreuuid(storeuuid);

//设置当前记录的状态为1

log.setType(Storeoper.TYPE_IN);

//保存到数据库当中(将操作记录保存到数据库当中)

storeoperDao.add(log);

/*

  • 第四部,判断当前订单下 所有的订单是否都已经更新完成(即入库完成)

*/

//1、查询当前订单是否还存在,状态为0 (0为未入库)的明细

//2、count(1) where state = 0 orderuuid = 为当前订单的uuid

//构建查询条件

Orderdetail queryParam = new Orderdetail();

Orders orders = orderdetail.getOrders();//获取订单明细对应的订单信息

queryParam.setOrders(orders);//设置订单是当前订单明细,对应的订单

queryParam.setState(Orderdetail.STATE_NO_IN);//设置查询条件状态为0,未审核

//3、调用getCount方法,来计算是否存在状态为0的明细

long count = orderdetailDao.getCount(queryParam, null, null);

if(count == 0) {

//4、 代表的所有订单当中 的订单明细都已经入库了

orders.setState(Orders.STATE_EDN);//设置当前订单装为结束

orders.setEndtime(orderdetail.getEndtime());//并设置当前订单结束时间为当前订单明细 的结束时间

orders.setEnder(empuuid);//设置库管员

//应为在上面过去过订单 状态

}

2、入库(Action后端)OrderdetailAction

在这里插入图片描述

//入库

public void doInStore(){

Emp loginUser = getLoginUser();

if(null == loginUser){

//用户没有登陆,session已失效

write(ajaxReturn(false, “亲!您还没有登陆”));

return;

}

try {

//调用明细入库业务

orderdetailBiz.doInStore(getId(), storeuuid, loginUser.getUuid());

write(ajaxReturn(true, “入库成功”));

}catch (ErpException e){

write(ajaxReturn(false, e.getMessage()));

} catch (Exception e) {

write(ajaxReturn(false, “入库失败”));

e.printStackTrace();

}

}

3、入库(前端)
(1) 修改orders.html

在这里插入图片描述

(2) 修改orders.js

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

全部代码

$(function(){

var url = “orders_listByPage?t1.type=1”;

//如果是审核业务,要加上state=0,只查询出未审核的订单

if(Request[‘oper’] == ‘doCheck’ ){

url += “&t1.state=0”;

}

//如果是确认业务,要加上state=1,只查询出已审核过的订单

if(Request[‘oper’] == ‘doStart’ ){

url += “&t1.state=1”;

}

//如果入库业务,要加上state=2,只查询出已确认过的订单

if(Request[‘oper’] == ‘doInStore’){

url += “&t1.state=2”;

}

$(‘#grid’).datagrid({

url:url,

columns:[[

{field:‘uuid’,title:‘编号’,width:100},

{field:‘createtime’,title:‘生成日期’,width:100,formatter:formatDate},

{field:‘checktime’,title:‘审核日期’,width:100,formatter:formatDate},

{field:‘starttime’,title:‘确认日期’,width:100,formatter:formatDate},

{field:‘endtime’,title:‘入库日期’,width:100,formatter:formatDate},

{field:‘createrName’,title:‘下单员’,width:100},

{field:‘checkerName’,title:‘审核员’,width:100},

{field:‘starterName’,title:‘采购员’,width:100},

{field:‘enderName’,title:‘库管员’,width:100},

{field:‘supplierName’,title:‘供应商或客户’,width:100},

{field:‘totalmoney’,title:‘合计金额’,width:100},

{field:‘state’,title:‘状态’,width:100,formatter:getState},

{field:‘waybillsn’,title:‘运单号’,width:100}

]],

singleSelect:true,

pagination:true,

fitColums:true,

onDblClickRow:function(rowIndex,rowData){

//rowIndex:行的索引

//rowData:行里的数据

//显示详情

$(“#uuid”).html(rowData.uuid);

$(“#suppliername”).html(rowData.supplierName);

$(“#state”).html(getState(rowData.state));

$(“#creater”).html(rowData.createrName);

$(“#checker”).html(rowData.checkerName);

$(“#starter”).html(rowData.starterName);

$(“#ender”).html(rowData.enderName);

$(“#createtime”).html(formatDate(rowData.createtime));

$(“#checktime”).html(formatDate(rowData.checktime));

$(“#starttime”).html(formatDate(rowData.starttime));

$(“#endtime”).html(formatDate(rowData.endtime));

//打开窗口

//alert(JSON.stringify(rowData));

$(‘#ordersDlg’).dialog(‘open’);

//加载明细列表

$(‘#itemgrid’).datagrid(‘loadData’,rowData.orderDetails);

}

});

/*

  • 明细表格

*/

$(‘#itemgrid’).datagrid({

columns:[[

{field:‘uuid’,title:‘编号’,width:100},

{field:‘goodsuuid’,title:‘商品编号’,width:100},

{field:‘goodsname’,title:‘商品名称’,width:100},

{field:‘price’,title:‘价格’,width:100},

{field:‘num’,title:‘数量’,width:100},

{field:‘money’,title:‘金额’,width:100},

{field:‘state’,title:‘状态’,width:100,formatter:getDetailState}

]],

fitColums:true,

singleSelect:true

});

//添加审核按钮

if(Request[‘oper’] == ‘doCheck’ ){

$(‘#ordersDlg’).dialog({

toolbar:[{

text:‘审核’,

iconCls:‘icon-search’,

handler:doCheck

}]

});

}

//添加确认按钮

if(Request[‘oper’] == ‘doStart’ ){

$(‘#ordersDlg’).dialog({

toolbar:[{

text:‘确认’,

iconCls:‘icon-search’,

handler:doStart

}]

});

}

//添加双击事件

if(Request[‘oper’] == ‘doInStore’){

$(‘#itemgrid’).datagrid({

onDblClickRow:function(rowIndex, rowData){

//显示数据

$(‘#itemuuid’).val(rowData.uuid);

$(‘#goodsuuid’).html(rowData.goodsuuid);

$(‘#goodsname’).html(rowData.goodsname);

$(‘#goodsnum’).html(rowData.num);

//打开入库窗口

$(‘#itemDlg’).dialog(‘open’);

}

});

}

//入库窗口

$(‘#itemDlg’).dialog({

width:300,

height:200,

title:‘入库’,

modal:true,

closed:true,

buttons:[

{

text:‘入库’,

iconCls:‘icon-save’,

handler:doInStore

}

]

});

});

/**

  • 日期格式化器

  • @param value

  • @returns

*/

function formatDate(value){

return new Date(value).Format(‘yyyy-MM-dd’);

}

/**

  • 获取订单的状态

  • @param value

  • @returns

  • 采购: 0:未审核 1:已审核, 2:已确认, 3:已入库

*/

function getState(value){

switch(value * 1){

case 0:return ‘未审核’;

case 1:return ‘已审核’;

case 2:return ‘已确认’;

case 3:return ‘已入库’;

default: return ‘’;

}

}

/*

  • 获取明细订单的状态

*/

function getDetailState(value){

switch(value * 1){

case 0:return ‘未入库’;

case 1:return ‘已入库’;

default: return ‘’;

}

}

//审核

function doCheck(){

$.messager.confirm(‘确认’, ‘确认要审核吗?’, function(yes){

if(yes){

$.ajax({

url: ‘orders_doCheck?id=’ + $(‘#uuid’).html(),

dataType: ‘json’,

type: ‘post’,

success:function(rtn){

$.messager.alert(‘提示’,rtn.message,‘info’,function(){

if(rtn.success){

//关闭窗口

$(‘#ordersDlg’).dialog(‘close’);

//刷新表格

$(‘#grid’).datagrid(‘reload’);

}

});

}

});

}

});

}

//确认

function doStart(){

$.messager.confirm(‘确认’, ‘确定要确认吗?’, function(yes){

if(yes){

$.ajax({

url: ‘orders_doStart?id=’ + $(‘#uuid’).html(),

dataType: ‘json’,

type: ‘post’,

success:function(rtn){

$.messager.alert(‘提示’,rtn.message,‘info’,function(){

if(rtn.success){

//关闭窗口

$(‘#ordersDlg’).dialog(‘close’);

//刷新表格

$(‘#grid’).datagrid(‘reload’);

}

});

}

});

}

});

}

/**

  • 入库

*/

function doInStore(){

var formdata = $(‘#itemForm’).serializeJSON();

if(formdata.storeuuid == ‘’){

$.messager.alert(‘提示’,‘请选择仓库!’,‘info’);

return;

}

$.messager.confirm(“确认”,“确认要入库吗?”,function(yes){

if(yes){

$.ajax({

url: ‘orderdetail_doInStore’,

data: formdata,

dataType: ‘json’,

type: ‘post’,

success:function(rtn){

$.messager.alert(‘提示’,rtn.message,‘info’,function(){

if(rtn.success){

//关闭入库窗口

$(‘#itemDlg’).dialog(‘close’);

//设置明细的状态

$(‘#itemgrid’).datagrid(‘getSelected’).state = “1”;

//刷新明细列

var data = $(‘#itemgrid’).datagrid(‘getData’);

$(‘#itemgrid’).datagrid(‘loadData’,data);

//如果所有明细都 入库了,应该关闭订单详情,并且刷新订单列表

var allIn = true;

$.each(data.rows,function(i,row){

if(row.state * 1 == 0){

allIn = false;

//跳出循环

return false;

}

});

if(allIn == true){

//关闭详情窗口

$(‘#ordersDlg’).dialog(‘close’);

//刷新订单列表

$(‘#grid’).datagrid(‘reload’);

}

}

});

}

});

}

});

}

4、显示当前登录用户的仓库

最后

为什么我不完全主张自学?
平台上的大牛基本上都有很多年的工作经验了,你有没有想过之前行业的门槛是什么样的,现在行业门槛是什么样的?以前企业对于程序员能力要求没有这么高,甚至十多年前你只要会写个“Hello World”,你都可以入门这个行业,所以以前要入门是完全可以入门的。
②现在也有一些优秀的年轻大牛,他们或许也是自学成才,但是他们一定是具备优秀的学习能力,优秀的自我管理能力(时间管理,静心坚持等方面)以及善于发现问题并总结问题。
如果说你认为你的目标十分明确,能做到第②点所说的几个点,以目前的市场来看,你才真正的适合去自学。

除此之外,对于绝大部分人来说,报班一定是最好的一种快速成长的方式。但是有个问题,现在市场上的培训机构质量参差不齐,如果你没有找准一个好的培训班,完全是浪费精力,时间以及金钱,这个需要自己去甄别选择。

我个人建议线上比线下的性价比更高,线下培训价格基本上没2W是下不来的,线上教育现在比较成熟了,此次疫情期间,学生基本上都感受过线上的学习模式。相比线下而言,线上的优势以我的了解主要是以下几个方面:
①价格:线上的价格基本上是线下的一半;
②老师:相对而言线上教育的师资力量比线下更强大也更加丰富,资源更好协调;
③时间:学习时间相对而言更自由,不用裸辞学习,适合边学边工作,降低生活压力;
④课程:从课程内容来说,确实要比线下讲的更加深入。

应该学哪些技术才能达到企业的要求?(下图总结)

json’,

type: ‘post’,

success:function(rtn){

$.messager.alert(‘提示’,rtn.message,‘info’,function(){

if(rtn.success){

//关闭入库窗口

$(‘#itemDlg’).dialog(‘close’);

//设置明细的状态

$(‘#itemgrid’).datagrid(‘getSelected’).state = “1”;

//刷新明细列

var data = $(‘#itemgrid’).datagrid(‘getData’);

$(‘#itemgrid’).datagrid(‘loadData’,data);

//如果所有明细都 入库了,应该关闭订单详情,并且刷新订单列表

var allIn = true;

$.each(data.rows,function(i,row){

if(row.state * 1 == 0){

allIn = false;

//跳出循环

return false;

}

});

if(allIn == true){

//关闭详情窗口

$(‘#ordersDlg’).dialog(‘close’);

//刷新订单列表

$(‘#grid’).datagrid(‘reload’);

}

}

});

}

});

}

});

}

4、显示当前登录用户的仓库

最后

为什么我不完全主张自学?
平台上的大牛基本上都有很多年的工作经验了,你有没有想过之前行业的门槛是什么样的,现在行业门槛是什么样的?以前企业对于程序员能力要求没有这么高,甚至十多年前你只要会写个“Hello World”,你都可以入门这个行业,所以以前要入门是完全可以入门的。
②现在也有一些优秀的年轻大牛,他们或许也是自学成才,但是他们一定是具备优秀的学习能力,优秀的自我管理能力(时间管理,静心坚持等方面)以及善于发现问题并总结问题。
如果说你认为你的目标十分明确,能做到第②点所说的几个点,以目前的市场来看,你才真正的适合去自学。

除此之外,对于绝大部分人来说,报班一定是最好的一种快速成长的方式。但是有个问题,现在市场上的培训机构质量参差不齐,如果你没有找准一个好的培训班,完全是浪费精力,时间以及金钱,这个需要自己去甄别选择。

我个人建议线上比线下的性价比更高,线下培训价格基本上没2W是下不来的,线上教育现在比较成熟了,此次疫情期间,学生基本上都感受过线上的学习模式。相比线下而言,线上的优势以我的了解主要是以下几个方面:
①价格:线上的价格基本上是线下的一半;
②老师:相对而言线上教育的师资力量比线下更强大也更加丰富,资源更好协调;
③时间:学习时间相对而言更自由,不用裸辞学习,适合边学边工作,降低生活压力;
④课程:从课程内容来说,确实要比线下讲的更加深入。

应该学哪些技术才能达到企业的要求?(下图总结)

[外链图片转存中…(img-FfGgupK5-1714342118401)]

[外链图片转存中…(img-z5kvvJOz-1714342118401)]

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

  • 21
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值