本文使用layuiadmin pro+tp6制作。
关于layuiadmin资源,本人纯手工还原了std版本可下载学习使用,pro版也还原了,目前正在整理中 。
LayuiAdmin std 2.3.2,纯手工还原https://download.csdn.net/download/xych_ccui/88902038
源码仅限学习使用,请勿商用及传播。
效果:
HTLM部分:
<title>库房管理</title>
<style>
.inputbottom {
/*input显示下边线样式*/
border: none;
border-bottom: 1px #c9c9c9 solid;
}
</style>
<div class="layui-card layadmin-header">
<div class="layui-breadcrumb" lay-filter="breadcrumb">
<a lay-href="">控制台</a>
<a><cite>库房管理</cite></a>
<a><cite>入库单</cite></a>
</div>
</div>
<div class="layui-fluid">
<div class="layui-row layui-col-space15">
<div class="layui-col-md12">
<div class="layui-card layui-form" lay-filter="form" id="form">
<div class="layui-card-header layuiadmin-card-header-auto">
<button class="layui-btn layui-btn-normal" lay-href="storehouse/rukumingxi">入库明细列表</button>
<div style="float:right">
<button class="layui-btn layui-btn-normal" lay-submit lay-filter="layuiadmin-app-storehouse-form-submit">提交</button>
</div>
</div>
<div class="layui-card-body" pad15>
<div class="layui-card-body">
<input type="text" name="stor_num" lay-verify="" value="物品入库单" class="layui-input inputbottom" style="width:300px;text-align:center;font-size:18px;margin:0 auto;" readonly>
</div>
<table class="layui-table" lay-skin="nob">
<colgroup>
<col width="100">
<col>
<col width="150">
<col width="200">
<col width="200">
<col width="200">
</colgroup>
<tbody>
<tr>
<td align="right">入库说明:</td>
<td>
<div class="layui-input-inline" style="width:300px;">
<input type="text" name="stor_title" lay-verify="required" autocomplete="off" placeholder="请输入本次入库单相关说明" class="layui-input inputbottom">
</div>
</td>
<td align="right">入库时间:</td>
<td><input type="text" class="layui-input inputbottom" name="stor_time" id="stor_time" placeholder="yyyy-MM-dd"></td>
<td align="right">入库单号:</td>
<td>
<script type="text/html" template lay-url="/ccadmins/storehouse/stornum_rk" lay-type="get" lay-done="layui.form.render();">
<input type="text" name="stor_num" lay-verify="required" value="{{d.data.stornum}}" readonly class="layui-input inputbottom">
</script>
</td>
</tr>
</tbody>
</table>
<table class="layui-table">
<colgroup>
<col width="150">
<col width="150">
<col width="150">
<col width="110">
<col width="90">
<col width="150">
<col width="150">
<col width="150">
<col width="70">
</colgroup>
<thead lay-skin="nob">
<tr>
<th style="text-align:center">物品名称</th>
<th style="text-align:center">品牌/供应商</th>
<th style="text-align:center">规格型号</th>
<th style="text-align:center">计量单位</th>
<th style="text-align:center">数量</th>
<th style="text-align:center">单价</th>
<th style="text-align:center">金额</th>
<th style="text-align:center">备注</th>
<th style="text-align:center">
<span class="layui-btn layui-btn-xs layui-btn-normal add-line"> 增 </span>
</th>
</tr>
</thead>
<tbody style="text-align:center" id="lineList">
<tr>
<td><input type="text" name="item_name[]" lay-verify="required" class="layui-input" autocomplete="off"></td>
<td><input type="text" name="brand[]" class="layui-input" autocomplete="off"></td>
<td><input type="text" name="specification[]" class="layui-input" autocomplete="off">
</td>
<td><input type="text" name="unit[]" lay-verify="required" class="layui-input" autocomplete="off"></td>
<td><input type="text" name="amount[]" lay-verify="required|number" class="layui-input" autocomplete="off"></td>
<td><input type="text" name="price[]" lay-verify="required" class="layui-input" autocomplete="off"></td>
<td><input type="text" name="money[]" class="layui-input" readonly></td>
<td><input type="text" name="comment[]" class="layui-input" autocomplete="off"></td>
<td><span name="deleteGoods"></span></td>
</tr>
</tbody>
<tbody>
<tr>
<td>合计大写</td>
<td colspan="3"><input type="text" name="totaldx" class="layui-input" readonly></td>
<td>合计金额</td>
<td colspan="4"><input type="text" name="total" class="layui-input" readonly></td>
</tr>
</tbody>
</table>
<table class="layui-table" lay-skin="nob">
<colgroup>
<col width="120">
<col width="300">
<col width="120">
<col width="300">
<col width="120">
<col width="300">
</colgroup>
<tbody>
<tr>
<td align="right">入库申请人:</td>
<td>
<script type="text/html" template lay-url="/storehouse/userslist" lay-type="get" lay-done="layui.form.render('select');">
<select name="applicant" lay-filter="applicant" lay-verify="required" lay-reqText="请选择">
<option value="">请选择</option>
{{# layui.each(d.data, function(index, item){ }}
<option value="{{item.id}}">
{{item.user_name}}
</option>
{{# }); }}
</select>
</script>
</td>
<td align="right">操作人员:</td>
<td>
<script type="text/html" template lay-url="/storehouse/userslist" lay-type="get" lay-done="layui.form.render('select');">
<select name="operator" lay-filter="operator" lay-verify="required" lay-reqText="请选择">
<option value="">请选择</option>
{{# layui.each(d.data, function(index, item){ }}
<option value="{{item.id}}">
{{item.user_name}}
</option>
{{# }); }}
</select>
</script>
</td>
<td align="right">财务人员:</td>
<td>
<script type="text/html" template lay-url="/storehouse/userslist" lay-type="get" lay-done="layui.form.render('select');">
<select name="caiwu" lay-filter="caiwu" lay-verify="required" lay-reqText="请选择">
<option value="">请选择</option>
{{# layui.each(d.data, function(index, item){ }}
<option value="{{item.id}}">
{{item.user_name}}
</option>
{{# }); }}
</select>
</script>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
</div>
</div>
JS部分:
<script type="text/javascript">
layui.use(['laydate', 'table', 'layer', 'admin', 'form'], function () {
var $ = layui.jquery
, admin = layui.admin
, view = layui.view
, table = layui.table
, layer = layui.layer
, laydate = layui.laydate
, form = layui.form;
//初始时间赋值
laydate.render({
elem: '#stor_time'
, format: 'yyyy-MM-dd' //指定时间格式
, value: new Date()
});
calc(); //合计
numkeyup(); //输入数量
pricekeyup(); //输入单价
//监听增加行
$('.add-line').on('click', function () {
let tem = [
'<tr>\
<td><input type="text" name="item_name[]" lay-verify="required" class="layui-input" autocomplete="off"></td>\
<td><input type="text" name="brand[]" class="layui-input" autocomplete="off"></td>\
<td><input type="text" name="specification[]" class="layui-input" autocomplete="off"></td>\
<td><input type="text" name="unit[]" lay-verify="required" class="layui-input" autocomplete="off"></td>\
<td><input type="text" name="amount[]" lay-verify="required" class="layui-input" autocomplete="off"></td>\
<td><input type="text" name="price[]" value="" lay-verify="required" class="layui-input" autocomplete="off"></td>\
<td><input type="text" name="money[]" class="layui-input" readonly></td>\
<td><input type="text" name="comment[]" class="layui-input" autocomplete="off"></td>\
<td><span class="layui-btn layui-btn-danger layui-btn-xs" name="deleteGoods"> 删 </span></td>\
</tr>'
];
$('#lineList').append(tem);
calc(); //计算
numkeyup(); //输入数量
pricekeyup(); //输入单价
form.render();//渲染
});
//监听删除行
$('#lineList').on('click', '.layui-btn-danger', function () {
$(this).parents('tr').remove();
calc();
});
//监听输入数量
function numkeyup() {
//body是关键,不然获取不到新增行的属性。也可以是父级或者祖级。
var a = $("body input[name*='amount']").each(function () {
$(this).on('keyup', function () { calc(); });
});
}
//监听输入单价
function pricekeyup() {
var a = $("body input[name*='price']").each(function () {
$(this).on('keyup', function () { calc(); });
});
}
//计算价格
function calc() {
//找到共有对象
var $obj = $("span[name='deleteGoods']");
var sum = 0;
//循环共有对象,让它循环获得我们想要的对象的值
$obj.each(function () {
//获得数量
var $count = parseFloat($(this).parent().prev().prev().prev().prev().find("input").val());
//获得单价
var $price = parseFloat($(this).parent().prev().prev().prev().find("input").val());
var timSum = $count * $price;
if (timSum) {
$(this).parent().prev().prev().find("input").val(timSum.toFixed(2));//给金额赋值
} else {
timSum = 0;
$(this).parent().prev().prev().find("input").val(timSum.toFixed(2));//给金额赋值
}
sum += timSum; //累加计算总价
sumdx = num_change(sum.toFixed(2));//大写合计数
});
$("body input[name='total']").val(sum.toFixed(2));//赋值input合计
$("body input[name='totaldx']").val(sumdx); //赋值input合计大写
};
//监听提交
form.on('submit(layuiadmin-app-storehouse-form-submit)', function (data) {
var field = data.field; //获取提交的字段
//....略
});
function num_change(money) {
//汉字的数字
var cnNums = new Array('零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖');
//基本单位
var cnIntRadice = new Array('', '拾', '佰', '仟');
//对应整数部分扩展单位
var cnIntUnits = new Array('', '万', '亿', '兆');
//对应小数部分单位
var cnDecUnits = new Array('角', '分', '毫', '厘');
//整数金额时后面跟的字符
var cnInteger = '整';
//整型完以后的单位
var cnIntLast = '元';
//最大处理的数字
var maxNum = 999999999999999.9999;
//金额整数部分
var integerNum;
//金额小数部分
var decimalNum;
//输出的中文金额字符串
var chineseStr = '';
//分离金额后用的数组,预定义
var parts;
if (money == '') { return '零元'; }
money = parseFloat(money);
if (money >= maxNum) {
//超出最大处理数字
return '';
}
if (money == 0) {
chineseStr = cnNums[0] + cnIntLast + cnInteger;
return chineseStr;
}
//转换为字符串
money = money.toString();
if (money.indexOf('.') == -1) {
integerNum = money;
decimalNum = '';
} else {
parts = money.split('.');
integerNum = parts[0];
decimalNum = parts[1].substr(0, 4);
}
//获取整型部分转换
if (parseInt(integerNum, 10) > 0) {
var zeroCount = 0;
var IntLen = integerNum.length;
for (var i = 0; i < IntLen; i++) {
var n = integerNum.substr(i, 1);
var p = IntLen - i - 1;
var q = p / 4;
var m = p % 4;
if (n == '0') {
zeroCount++;
} else {
if (zeroCount > 0) {
chineseStr += cnNums[0];
}
//归零
zeroCount = 0;
chineseStr += cnNums[parseInt(n)] + cnIntRadice[m];
}
if (m == 0 && zeroCount < 4) {
chineseStr += cnIntUnits[q];
}
}
chineseStr += cnIntLast;
}
//小数部分
if (decimalNum != '') {
var decLen = decimalNum.length;
for (var i = 0; i < decLen; i++) {
var n = decimalNum.substr(i, 1);
if (n != '0') {
chineseStr += cnNums[Number(n)] + cnDecUnits[i];
}
}
}
if (chineseStr == '') {
chineseStr += cnNums[0] + cnIntLast + cnInteger;
} else if (decimalNum == '') {
chineseStr += cnInteger;
}
return chineseStr;
}
});
本文只写了关于前端的写法,关于后端获取数据库人员名单以及提交过程省略了,可以自行研究。
欢迎评论区进行评论和指导。