first commit

This commit is contained in:
2026-07-23 09:40:36 +08:00
commit 090abf48fa
989 changed files with 145728 additions and 0 deletions
+136
View File
@@ -0,0 +1,136 @@
{extend name="../../base/view/common/base" /}
<!-- 主体 -->
{block name="body"}
<form class="layui-form p-4">
<h3 class="pb-1">新增产品</h3>
<table class="layui-table">
<tr>
<td class="layui-td-gray">产品名称<font>*</font></td>
<td colspan="3"><input type="text" name="title" autocomplete="off" placeholder="请输入产品名称" lay-verify="required" lay-reqText="请输入产品名称" class="layui-input"></td>
<td class="layui-td-gray">产品分类<font>*</font></td>
<td>
<select name="cate_id" lay-verify="required" lay-reqText="请选择分类">
<option value="">请选择分类</option>
{volist name=":set_recursion(get_base_data('ProductCate'))" id="v"}
<option value="{$v.id}">{$v.title}</option>
{/volist}
</select>
</td>
<td class="layui-td-gray" rowspan="4">缩略图</td>
<td rowspan="4" style="width: 150px; vertical-align:top:">
<div class="layui-upload">
<button type="button" class="layui-btn layui-btn-normal layui-btn-sm" id="test1">缩略图(尺寸:240x136)</button>
<div class="layui-upload-list" id="demo1" style="width: 150px; height:80px; overflow: hidden;">
<img src="" style="max-width: 100%; height:80px;" />
<input type="hidden" name="thumb" value="">
</div>
</div>
</td>
</tr>
<tr>
<td class="layui-td-gray">产品编码<font>*</font></td>
<td><input type="text" name="code" autocomplete="off" value="{:get_codeno('PR')}" readonly class="layui-input" lay-verify="required" lay-reqText="请输入产品编码"></td>
<td class="layui-td-gray">产品单位<font>*</font></td>
<td><input type="text" name="unit" autocomplete="off" value="" class="layui-input" lay-verify="required" lay-reqText="请输入产品单位"></td>
<td class="layui-td-gray">产品规格</td>
<td><input type="text" name="specs" autocomplete="off" placeholder="请输入产品规格" class="layui-input"></td>
</tr>
<tr>
<td class="layui-td-gray">销售价(元)<font>*</font></td>
<td><input type="text" name="sale_price" autocomplete="off" placeholder="请输入产品销售价" lay-verify="required|number" lay-reqText="请输入产品销售价" class="layui-input"></td>
<td class="layui-td-gray">成本价(元)</td>
<td><input type="text" name="base_price" autocomplete="off" placeholder="请输入产品成本价" class="layui-input" lay-verify="number"></td>
<td class="layui-td-gray">采购价(元)</td>
<td><input type="text" name="purchase_price" autocomplete="off" placeholder="请输入产品采购价" class="layui-input" lay-verify="number"></td>
</tr>
<tr>
<td class="layui-td-gray">是否实物<font>*</font></td>
<td colspan="7">
<input type="radio" name="is_object" value="1" title="是" checked>
<input type="radio" name="is_object" value="2" title="否" >
</td>
</tr>
<tr>
<td class="layui-td-gray-2">
<div class="layui-input-inline">产品附件</div>
<div class="layui-input-inline">
<button type="button" class="layui-btn layui-btn-xs" id="uploadBtn"><i class="layui-icon"></i></button>
</div>
</td>
<td colspan="7">
<div class="layui-row" id="uploadBox">
<input type="hidden" id="fileBoxInput" data-type="file" name="file_ids" value="">
</div>
</td>
</tr>
<tr>
<td class="layui-td-gray" style="vertical-align:top;">产品描述<font>*</font></td>
<td colspan="7">
<textarea name="content" placeholder="请输入内容" class="layui-textarea" id="container" style="border:0;padding:0"></textarea>
</td>
</tr>
</table>
<div class="pt-1">
<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">立即提交</button>
<button type="reset" class="layui-btn layui-btn-primary">重置</button>
</div>
</form>
{/block}
<!-- /主体 -->
<!-- 脚本 -->
{block name="script"}
<script>
const moduleInit = ['tool','tinymce','uploadPlus'];
function gouguInit() {
var form = layui.form,tool=layui.tool,upload = layui.upload,uploadPlus = layui.uploadPlus;
//封面上传
var uploadInst = upload.render({
elem: '#test1'
, url: "/api/index/upload"
, done: function (res) {
layer.msg(res.msg);
if (res.code == 0) {
//上传成功
$('#demo1 input').attr('value', res.data.id);
$('#demo1 img').attr('src', res.data.filepath);
}
}
});
//编辑器初始化
var editor = layui.tinymce;
var edit = editor.render({
selector: "#container",
images_upload_url: '/api/index/upload/sourse/tinymce',//图片上传接口
height: 500
});
//附件上传
var attachment = new uploadPlus({
"target":'uploadBtn',
"targetBox":'uploadBox'
});
//监听提交
form.on('submit(webform)', function(data){
data.field.content = tinyMCE.editors['container'].getContent();
if (data.field.content == '') {
layer.msg('请先完善产品的描述内容');
return false;
}
let callback = function (e) {
layer.msg(e.msg);
if (e.code == 0) {
tool.sideClose(1000);
}
}
let clickbtn = $(this);
tool.post("/contract/product/add", data.field, callback,clickbtn);
return false;
});
}
</script>
{/block}
<!-- /脚本 -->
+180
View File
@@ -0,0 +1,180 @@
{extend name="../../base/view/common/base" /}
{block name="style"}
<style>
.tree-left{width:220px; float:left; height:100%; overflow: scroll; border:1px solid #eeeeee; background-color:#fff; padding:12px 12px 12px 5px;}
.tree-left h3{font-size:16px; height:30px; padding-left:10px; font-weight:800}
</style>
{/block}
<!-- 主体 -->
{block name="body"}
<div class="p-page" style="height:calc(100% - 40px); box-sizing: border-box;">
<div class="tree-left">
<h3>产品分类</h3>
<div id="cate"></div>
</div>
<div class="body-table" style="margin-left:248px; overflow:hidden;">
<form class="layui-form gg-form-bar border-x border-t">
<div class="layui-input-inline" style="width:100px;">
<select name="status">
<option value="">选择状态</option>
<option value="1">正常</option>
<option value="0">禁用</option>
</select>
</div>
<div class="layui-input-inline" style="width:300px;">
<input type="text" name="keywords" placeholder="关键字,产品名称/产品编码" class="layui-input" />
</div>
<div class="layui-input-inline" style="width:150px;">
<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform"><i class="layui-icon layui-icon-search mr-1"></i>搜索</button>
<button type="reset" class="layui-btn layui-btn-reset" lay-filter="reset">重置</button>
</div>
</form>
<table class="layui-hide" id="test" lay-filter="test"></table>
</div>
</div>
<script type="text/html" id="toolbarDemo">
<div class="layui-btn-container">
<button class="layui-btn layui-btn-sm addNew" type="button">+ 添加产品</button>
</div>
</script>
{/block}
<!-- /主体 -->
<!-- 脚本 -->
{block name="script"}
<script>
const moduleInit = ['tool','tablePlus'];
function gouguInit() {
var table = layui.tablePlus, tool = layui.tool,tree = layui.tree,form = layui.form;
$.ajax({
url: "/contract/api/get_productcate_tree",
type:'get',
success:function(res){
//仅节点左侧图标控制收缩
tree.render({
elem: '#cate',
data: res.trees,
onlyIconControl: true, //是否仅允许节点左侧图标控制展开收缩
click: function(obj){
//layer.msg(JSON.stringify(obj.data));
$('#cate').find('.layui-tree-main').removeClass('on');
$(obj.elem).find('.layui-tree-main').eq(0).addClass('on');
layui.pageTable.reload({
where: {cate_id: obj.data.id},
page:{curr:1}
});
$('[name="keywords"]').val('');
$('[name="status"]').val('');
form.render();
}
});
}
})
$('[lay-filter="reset"]').click(function(){
$('#cate').find('.layui-tree-main').removeClass('on');
});
layui.pageTable = table.render({
elem: '#test'
,toolbar: '#toolbarDemo'
,title:'产品列表'
,url: "/contract/product/datalist"
,is_excel: true
,cellMinWidth: 60
,height: 'full-114'
,cols: [[
{field:'id',width:80, title: 'ID号', align:'center'}
,{field:'code',width:150, title: '产品编码', align:'center'}
,{field:'cate',width:150, title: '产品分类', align:'center'}
,{field:'title',title: '产品名称',minWidth:240}
,{field:'sale_price',width:100, title: '销售价(元)', align:'center','style':'color:#16b777'}
,{field:'purchase_price',width:100, title: '采购价(元)', align:'center','style':'color:#1e9fff'}
,{field:'base_price',width:100, title: '成本价(元)', align:'center','style':'color:#a233c6'}
,{field:'unit',width:60, title: '单位', align:'center'}
,{field:'specs',width:60, title: '规格', align:'center'}
,{field:'status', title: '状态',width:60,align:'center',templet: function(d){
var html1='<span class="green">正常</span>';
var html2='<span class="yellow">禁用</span>';
if(d.status==1){
return html1;
}
else{
return html2;
}
}}
,{width:150,fixed:'right', title: '操作', align:'center',templet: function(d){
var html='';
var btn='<a class="layui-btn layui-btn-xs" lay-event="edit">编辑</a><a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="view">详情</a>';
var btn1='<a class="layui-btn layui-btn-warm layui-btn-xs" lay-event="disable">禁用</a>';
var btn2='<a class="layui-btn layui-btn-xs" lay-event="open">启用</a>';
var btn3='<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</a>';
if(d.status==1){
html = '<div class="layui-btn-group">'+btn+btn1+btn3+'</div>';
}
else{
html = '<div class="layui-btn-group">'+btn+btn2+btn3+'</div>';
}
return html;
}}
]]
});
table.on('tool(test)',function (obj) {
if(obj.event === 'edit'){
tool.side("/contract/product/add?id="+obj.data.id);
}
if(obj.event === 'view'){
tool.side("/contract/product/view?id="+obj.data.id);
}
if(obj.event === 'disable'){
layer.confirm('确定要禁用该产品吗?', {icon: 3, title:'提示'}, function(index){
let callback = function (e) {
layer.msg(e.msg);
if (e.code == 0) {
layui.pageTable.reload();
}
}
tool.post("/contract/product/set", { id: obj.data.id,status: 0,title: obj.data.title}, callback);
layer.close(index);
});
}
if(obj.event === 'open'){
layer.confirm('确定要启用该产品吗?', {icon: 3, title:'提示'}, function(index){
let callback = function (e) {
layer.msg(e.msg);
if (e.code == 0) {
layui.pageTable.reload();
}
}
tool.post("/contract/product/set", { id: obj.data.id,status: 1,title: obj.data.title}, callback);
layer.close(index);
});
}
if(obj.event === 'del'){
layer.confirm('确定要删除该产品吗?', {icon: 3, title:'提示'}, function(index){
let callback = function (e) {
layer.msg(e.msg);
if (e.code == 0) {
layui.pageTable.reload();
}
}
tool.delete("/contract/product/del", { id: obj.data.id,status: 1,title: obj.data.title}, callback);
layer.close(index);
});
}
});
$('body').on('click','.addNew',function(){
tool.side("/contract/product/add");
});
//监听搜索提交
form.on('submit(webform)', function(data){
layui.pageTable.reload({where:data.field,page:{curr:1}});
return false;
});
}
</script>
{/block}
<!-- /脚本 -->
+142
View File
@@ -0,0 +1,142 @@
{extend name="../../base/view/common/base" /}
<!-- 主体 -->
{block name="body"}
<form class="layui-form p-4">
<h3 class="pb-3">编辑产品</h3>
<table class="layui-table">
<tr>
<td class="layui-td-gray">产品名称<font>*</font></td>
<td colspan="3"><input type="text" name="title" value="{$detail.title}" autocomplete="off" placeholder="请输入产品名称" lay-verify="required" lay-reqText="请输入产品名称" class="layui-input"></td>
<td class="layui-td-gray">产品分类<font>*</font></td>
<td>
<select name="cate_id" lay-verify="required" lay-reqText="请选择分类">
<option value="">请选择分类</option>
{volist name=":set_recursion(get_base_data('ProductCate'))" id="v"}
<option value="{$v.id}" {eq name="$v.id" value="$detail.cate_id"} selected{/eq}>{$v.title}</option>
{/volist}
</select>
</td>
<td class="layui-td-gray" rowspan="4">缩略图</td>
<td rowspan="4" style="width: 150px; vertical-align:top:">
<div class="layui-upload">
<button type="button" class="layui-btn layui-btn-normal layui-btn-sm" id="test1">缩略图(尺寸:240x136)</button>
<div class="layui-upload-list" id="demo1" style="width: 120px; height:66px; overflow: hidden;">
<img src="{:get_file($detail.thumb)}" style="max-width: 100%; height:66px;" />
<input type="hidden" name="thumb" value="{$detail.thumb}">
</div>
</div>
</td>
</tr>
<tr>
<td class="layui-td-gray">产品编码<font>*</font></td>
<td><input type="text" name="code" value="{$detail.code}" readonly class="layui-input" lay-verify="required"></td>
<td class="layui-td-gray">产品单位<font>*</font></td>
<td><input type="text" name="unit" autocomplete="off" value="{$detail.unit}" class="layui-input" lay-verify="required" lay-reqText="请输入产品单位"></td>
<td class="layui-td-gray">产品规格</td>
<td><input type="text" name="specs" autocomplete="off" value="{$detail.specs}" placeholder="请输入产品规格" class="layui-input"></td>
</tr>
<tr>
<td class="layui-td-gray">销售价(元)<font>*</font></td>
<td><input type="text" name="sale_price" value="{$detail.sale_price}" autocomplete="off" placeholder="请输入产品销售价" lay-verify="required|number" lay-reqText="请输入产品销售价" class="layui-input"></td>
<td class="layui-td-gray">成本价(元)</td>
<td><input type="text" name="base_price" value="{$detail.base_price}" lay-verify="number" autocomplete="off" placeholder="请输入产品成本价" class="layui-input"></td>
<td class="layui-td-gray">采购价(元)</td>
<td><input type="text" name="purchase_price" value="{$detail.purchase_price}" lay-verify="number" autocomplete="off" placeholder="请输入产品采购价" class="layui-input"></td>
</tr>
<tr>
<td class="layui-td-gray">是否实物<font>*</font></td>
<td colspan="7">
<input type="radio" name="is_object" value="1" title="是" {eq name="$detail.is_object" value="1"} checked {/eq}>
<input type="radio" name="is_object" value="2" title="否" {eq name="$detail.is_object" value="2"} checked {/eq}>
</td>
</tr>
<tr>
<td class="layui-td-gray-2">
<div class="layui-input-inline">产品附件</div>
<div class="layui-input-inline">
<button type="button" class="layui-btn layui-btn-xs" id="uploadBtn"><i class="layui-icon"></i></button>
</div>
</td>
<td colspan="7">
<div class="layui-row" id="uploadBox">
<input type="hidden" data-type="file" name="file_ids" value="{$detail.file_ids}">
{notempty name="$detail.file_ids"}
{volist name="$detail.file_array" id="vo"}
<div class="layui-col-md4" id="uploadFile{$vo.id}">{:file_card($vo)}</div>
{/volist}
{/notempty}
</div>
</td>
</tr>
<tr>
<td class="layui-td-gray" style="vertical-align:top;">产品描述<font>*</font></td>
<td colspan="7">
<textarea name="content" placeholder="请输入内容" class="layui-textarea" id="container" style="border:0;padding:0">{$detail.content}</textarea>
</td>
</tr>
</table>
<div class="pt-1">
<input type="hidden" name="id" value="{$detail.id}">
<button class="layui-btn layui-btn-normal" lay-submit="" lay-filter="webform">立即提交</button>
<button type="reset" class="layui-btn layui-btn-primary">重置</button>
</div>
</form>
{/block}
<!-- /主体 -->
<!-- 脚本 -->
{block name="script"}
<script>
const moduleInit = ['tool','tinymce','uploadPlus'];
function gouguInit() {
var form = layui.form,tool=layui.tool,upload = layui.upload,uploadPlus = layui.uploadPlus;
//封面上传
var uploadInst = upload.render({
elem: '#test1'
, url: "/api/index/upload"
, done: function (res) {
layer.msg(res.msg);
if (res.code == 0) {
//上传成功
$('#demo1 input').attr('value', res.data.id);
$('#demo1 img').attr('src', res.data.filepath);
}
}
});
//编辑器初始化
var editor = layui.tinymce;
var edit = editor.render({
selector: "#container",
images_upload_url: '/api/index/upload/sourse/tinymce',//图片上传接口
height: 500
});
//附件上传
var attachment = new uploadPlus({
"target":'uploadBtn',
"targetBox":'uploadBox'
});
//监听提交
form.on('submit(webform)', function(data){
data.field.content = tinyMCE.editors['container'].getContent();
if (data.field.content == '') {
layer.msg('请先完善产品的描述内容');
return false;
}
let callback = function (e) {
layer.msg(e.msg);
if (e.code == 0) {
tool.sideClose(1000);
}
}
let clickbtn = $(this);
tool.post("/contract/product/add", data.field, callback,clickbtn);
return false;
});
}
</script>
{/block}
<!-- /脚本 -->
+77
View File
@@ -0,0 +1,77 @@
{extend name="../../base/view/common/base" /}
<!-- 主体 -->
{block name="body"}
<div class="p-4">
<h3 class="pb-1">产品详情</h3>
<table class="layui-table">
<tr>
<td class="layui-td-gray">产品名称</td>
<td colspan="3">{$detail.title}</td>
<td class="layui-td-gray">产品分类</td>
<td>{$detail.cate}</td>
<td class="layui-td-gray" rowspan="4">缩略图</td>
<td rowspan="4" style="width:150px;">
<div class="layui-upload-list" id="demo1" style="width: 150px; height:80px; overflow: hidden;">
<img src="{:get_file($detail.thumb)}" style="max-width: 100%; height:66px;" />
</div>
</td>
</tr>
<tr>
<td class="layui-td-gray">产品编码</td>
<td>{$detail.code}</td>
<td class="layui-td-gray">产品单位</td>
<td>{$detail.unit}</td>
<td class="layui-td-gray">产品规格</td>
<td>{$detail.specs}</td>
</tr>
<tr>
<td class="layui-td-gray">销售价(元)</td>
<td>{$detail.sale_price}</td>
<td class="layui-td-gray">成本价(元)</td>
<td>{$detail.base_price}</td>
<td class="layui-td-gray">采购价(元)</td>
<td>{$detail.purchase_price}</td>
</tr>
<tr>
<td class="layui-td-gray">是否实物</td>
<td colspan="7">
{eq name="$detail.is_object" value="1"}是{/eq}
{eq name="$detail.is_object" value="2"}否{/eq}
</td>
</tr>
{notempty name="$detail.file_ids"}
<tr>
<td class="layui-td-gray">相关附件</td>
<td colspan="7">
<div class="layui-row">
{volist name="$detail.file_array" id="vo"}
<div class="layui-col-md4" id="uploadFile{$vo.id}">{:file_card($vo,'view')}</div>
{/volist}
</div>
</td>
</tr>
{/notempty}
<tr>
<td class="layui-td-gray" colspan="8" style="text-align:left; color:#666"><strong>产品描述</strong></td>
</tr>
<tr>
<td colspan="8">
{$detail.content|raw}
</td>
</tr>
</table>
</div>
{/block}
<!-- /主体 -->
<!-- 脚本 -->
{block name="script"}
<script>
const moduleInit = ['tool'];
function gouguInit() {
}
</script>
{/block}
<!-- /脚本 -->