提交代码

This commit is contained in:
manghe 2025-04-08 07:50:28 +00:00
parent 80cbb3d874
commit 66aeebd7dd
5 changed files with 708 additions and 1 deletions

1
.gitignore vendored
View File

@ -3,5 +3,4 @@ runtime/*
.htaccess
vendor/*
404.html
index.html
public/.well-known/*

View File

@ -0,0 +1,200 @@
{include file="Public/meta" /}
<title>奖励列表</title>
</head>
<body>
<div class="layui-fluid">
<div class="layui-card">
<div class="layui-card-header">奖励列表</div>
<div class="layui-card-body">
<div class="layui-form toolbar">
<div class="layui-form-item">
<div class="layui-inline">
<label class="layui-form-label w-auto">奖励类型:</label>
<div class="layui-input-inline mr0">
<select name="reward_type" lay-filter="reward_type">
<option value="">全部</option>
<option value="1" {if $reward_type=='1'}selected{/if}>优惠券</option>
<option value="2" {if $reward_type=='2'}selected{/if}>钻石</option>
<option value="3" {if $reward_type=='3'}selected{/if}>货币1</option>
<option value="4" {if $reward_type=='4'}selected{/if}>货币2</option>
</select>
</div>
</div>
<div class="layui-inline">
<label class="layui-form-label w-auto">关键词:</label>
<div class="layui-input-inline mr0">
<input name="keyword" class="layui-input" type="text" placeholder="输入奖励标题"/>
</div>
</div>
<div class="layui-inline">
<button class="layui-btn icon-btn" lay-filter="formSearch" lay-submit>
<i class="layui-icon">&#xe615;</i>搜 索
</button>
<button class="layui-btn icon-btn" id="btnAdd">
<i class="layui-icon">&#xe654;</i>添 加
</button>
</div>
</div>
</div>
<table class="layui-table" id="tableList" lay-filter="tableList"></table>
</div>
</div>
</div>
<!-- 表格操作列 -->
<script type="text/html" id="tableOpBar">
<a class="layui-btn layui-btn-sm" lay-event="edit">编辑</a>
<a class="layui-btn layui-btn-sm layui-btn-danger" lay-event="del">删除</a>
</script>
<!-- 表格状态列 -->
<script type="text/html" id="tableStateBar">
<input type="checkbox" lay-filter="ckState" value="{{d.id}}" lay-skin="switch"
lay-text="正常|禁用" {{d.status==1?'checked':''}}/>
</script>
<!-- 奖励类型 -->
<script type="text/html" id="rewardTypeTpl">
{{# if(d.reward_type == 1){ }}
<span class="layui-badge layui-bg-blue">优惠券</span>
{{# } else if(d.reward_type == 2){ }}
<span class="layui-badge layui-bg-green">钻石</span>
{{# } else if(d.reward_type == 3){ }}
<span class="layui-badge layui-bg-orange">货币1</span>
{{# } else if(d.reward_type == 4){ }}
<span class="layui-badge layui-bg-red">货币2</span>
{{# } }}
</script>
{include file="Public/footer" /}
<script>
layui.use(['layer', 'form', 'table', 'util', 'admin'], function () {
var $ = layui.jquery;
var layer = layui.layer;
var form = layui.form;
var table = layui.table;
var util = layui.util;
var admin = layui.admin;
// 渲染表格
var insTb = table.render({
elem: '#tableList',
url: '{:url("reward")}',
page: true,
cellMinWidth: 100,
cols: [[
{field: 'id', title: 'ID', width: 80},
{field: 'title', title: '奖励标题'},
{field: 'reward_type', title: '奖励类型', width: 100, templet: '#rewardTypeTpl'},
{field: 'reward_value', title: '奖励值', width: 100},
{
field: 'reward_id', title: '关联ID', width: 100,
templet: function(d){
if(d.reward_type == 1 && d.coupon){
return '券ID: ' + d.reward_id + ' (' + d.coupon.title + ')';
} else {
return '-';
}
}
},
{
field: 'create_time', title: '创建时间', width: 160,
templet: function(d){
return util.toDateString(d.create_time*1000);
}
},
{field: 'status', title: '状态', width: 90, templet: '#tableStateBar'},
{title: '操作', width: 120, align: 'center', toolbar: '#tableOpBar'}
]]
});
// 搜索按钮点击事件
form.on('submit(formSearch)', function (data) {
insTb.reload({where: data.field, page: {curr: 1}});
return false;
});
// 添加按钮点击事件
$('#btnAdd').click(function () {
showEditModel();
});
// 监听工具条
table.on('tool(tableList)', function (obj) {
var data = obj.data;
var layEvent = obj.event;
if (layEvent === 'edit') { // 修改
showEditModel(data.id);
} else if (layEvent === 'del') { // 删除
doDel(data.id);
}
});
// 修改状态
form.on('switch(ckState)', function (obj) {
var loadIndex = layer.load(2);
$.post('{:url("reward_status")}', {
id: obj.value,
status: obj.elem.checked ? 1 : 0
}, function (res) {
layer.close(loadIndex);
if (res.code === 0) {
layer.msg(res.msg, {icon: 1});
} else {
layer.msg(res.msg, {icon: 2});
$(obj.elem).prop('checked', !obj.elem.checked);
form.render('checkbox');
}
}, 'json');
});
// 显示编辑弹窗
function showEditModel(id) {
var title = id ? '修改奖励' : '添加奖励';
var url = id ? '{:url("reward_edit")}?id=' + id : '{:url("reward_add")}';
admin.popupRight({
title: title,
area: '500px',
path: url,
finish: function () {
table.reload('tableList');
}
});
}
// 删除
function doDel(id) {
layer.confirm('确定要删除此奖励吗?', {
skin: 'layui-layer-admin'
}, function (i) {
layer.close(i);
var loadIndex = layer.load(2);
$.post('{:url("reward_delete")}', {
id: id
}, function (res) {
layer.close(loadIndex);
if (res.code === 0) {
layer.msg(res.msg, {icon: 1});
insTb.reload();
} else {
layer.msg(res.msg, {icon: 2});
}
}, 'json');
});
}
// 奖励类型切换
form.on('select(reward_type)', function(data){
insTb.reload({
where: {
reward_type: data.value
},
page: {curr: 1}
});
});
});
</script>
</body>
</html>

View File

@ -0,0 +1,263 @@
{include file="Public:header2"/}
<div class="layui-fluid">
<div class="layui-card">
<div class="layui-card-body">
<div class="layui-form toolbar">
<div class="layui-form-item">
<div class="layui-inline">
<label class="layui-form-label w-auto">配置类型:</label>
<div class="layui-input-inline mr0">
<select name="type" lay-filter="config_type">
<option value="1" {if $type=='1' }selected{/if}>每日签到配置</option>
<option value="2" {if $type=='2' }selected{/if}>累计签到配置</option>
</select>
</div>
</div>
<div class="layui-inline">
<label class="layui-form-label w-auto">关键词:</label>
<div class="layui-input-inline mr0">
<input name="keyword" class="layui-input" type="text" placeholder="输入配置标题" />
</div>
</div>
<div class="layui-inline">
<button class="layui-btn icon-btn" lay-filter="formSearch" lay-submit>
<i class="layui-icon">&#xe615;</i>搜 索
</button>
<button class="layui-btn icon-btn" id="btnAdd">
<i class="layui-icon">&#xe654;</i>添 加
</button>
</div>
</div>
</div>
<table class="layui-table" id="tableList" lay-filter="tableList"></table>
</div>
</div>
</div>
<!-- 表格操作列 -->
<script type="text/html" id="tableOpBar">
<a style="text-decoration:none" title="编辑" lay-event="edit" class="layui-btn layui-btn-normal layui-btn-xs">
<i class="layui-icon layui-icon-edit"></i>编辑
</a>
<a style="text-decoration:none" title="编辑奖励" lay-event="editReward" class="layui-btn layui-btn-normal layui-btn-xs">
<i class="layui-icon layui-icon-edit"></i>编辑奖励
</a>
<a style="text-decoration:none" lay-event="del" class="layui-btn layui-btn-danger layui-btn-xs">
<i class="layui-icon layui-icon-delete"></i>删除
</a>
</script>
<!-- 表格状态列 -->
<script type="text/html" id="tableStateBar">
<input type="checkbox" lay-filter="ckState" value="{{d.id}}" lay-skin="switch"
lay-text="正常|禁用" {{d.status==1?'checked':''}}/>
</script>
<!-- 表格奖励信息 -->
<script type="text/html" id="rewardsTpl">
{{# if(d.rewards && d.rewards.length > 0){ }}
{{# layui.each(d.rewards, function(index, item){ }}
{{# if(item.reward_type == 1){ }}
<span class="layui-badge layui-bg-blue">钻石: {{item.reward_value}}</span>
{{# } else if(item.reward_type == 2){ }}
<span class="layui-badge layui-bg-green">货币1: {{item.reward_value}}</span>
{{# } else if(item.reward_type == 3){ }}
<span class="layui-badge layui-bg-orange">货币2: {{item.reward_value}}</span>
{{# } else if(item.reward_type == 4){ }}
<span class="layui-badge layui-bg-red">优惠券</span>
{{# } }}
{{# }); }}
{{# } else { }}
<span class="layui-text">无奖励</span>
{{# } }}
</script>
{include file="Public/footer" /}
<script>
layui.use(['layer', 'form', 'table', 'util'], function () {
var $ = layui.jquery;
var layer = layui.layer;
var form = layui.form;
var table = layui.table;
var util = layui.util;
// 获取当前配置类型
var configType = {$type};
// 渲染表格
var insTb = table.render({
elem: '#tableList',
url: '{:url("/admin/sign_config_list")}',
where: { type: configType },
page: true,
limit: 50,
cellMinWidth: 100,
cols: getTableCols(configType)
});
// 根据配置类型获取表格列配置
function getTableCols(type) {
var commonCols = [
{ field: 'id', title: 'ID', width: 60 },
{ field: 'title', title: '配置标题', width: 120 },
{
field: 'icon', title: '图标', width: 80, templet: function (d) {
return d.icon ? '<img src="' + d.icon + '" style="height:30px;">' : '-';
}
},
{ field: 'day', title: '签到天数/累计天数', width: 180 },
{ field: 'rewards', title: '奖励信息', templet: '#rewardsTpl' },
{ field: 'sort', title: '排序', width: 100, edit: 'text' },
{ field: 'status', title: '状态', width: 100, templet: '#tableStateBar' },
{ title: '操作', width: 240, align: 'center', toolbar: '#tableOpBar' }
];
return [commonCols];
}
// 搜索按钮点击事件
form.on('submit(formSearch)', function (data) {
insTb.reload({ where: data.field, page: { curr: 1 } });
return false;
});
// 添加按钮点击事件
$('#btnAdd').click(function () {
showEditModel();
});
// 监听工具条
table.on('tool(tableList)', function (obj) {
var data = obj.data;
var layEvent = obj.event;
if (layEvent === 'edit') { // 修改
showEditModel(data.id);
} else if (layEvent === 'editReward') { // 编辑奖励
showRewardEditModel(data.id, data.reward_id);
} else if (layEvent === 'del') { // 删除
doDel(data.id);
}
});
// 监听单元格编辑
table.on('edit(tableList)', function (obj) {
var value = obj.value;
var data = obj.data;
if (obj.field === 'sort') {
// 更新排序
var loadIndex = layer.load(2);
$.post('{:url("/admin/sign_config_sort")}', {
id: data.id,
sort: value
}, function (res) {
layer.close(loadIndex);
if (res.status === 1) {
layer.msg(res.msg, { icon: 1 });
} else {
layer.msg(res.msg, { icon: 2 });
insTb.reload();
}
}, 'json');
}
});
// 修改状态
form.on('switch(ckState)', function (obj) {
var loadIndex = layer.load(2);
$.post('{:url("/admin/sign_config_status")}', {
id: obj.value,
status: obj.elem.checked ? 1 : 0
}, function (res) {
layer.close(loadIndex);
if (res.status === 1) {
layer.msg(res.msg, { icon: 1 });
} else {
layer.msg(res.msg, { icon: 2 });
$(obj.elem).prop('checked', !obj.elem.checked);
form.render('checkbox');
}
}, 'json');
});
// 显示编辑弹窗
function showEditModel(id) {
var title = id ? '修改签到配置' : '添加签到配置';
var url = id ? '{:url("/admin/sign_config_edit")}?id=' + id : '{:url("/admin/sign_config_add")}?type=' + configType;
layer.open({
type: 2,
title: title,
shadeClose: false,
shade: 0.3,
area: ['90%', '90%'],
content: url,
end: function () {
table.reload('tableList');
}
});
}
// 显示编辑奖励弹窗
function showRewardEditModel(id, reward_id) {
if (!reward_id) {
layer.msg('该配置没有关联奖励信息', { icon: 2, time: 2000 });
return;
}
layer.open({
type: 2,
title: '编辑签到奖励',
shadeClose: false,
shade: 0.3,
area: ['800px', '500px'],
content: '{:url("/admin/sign_config_reward_edit")}?id=' + id + '&reward_id=' + reward_id,
end: function () {
table.reload('tableList');
}
});
}
// 删除
function doDel(id) {
layer.confirm('确定要删除此配置吗?', {
skin: 'layui-layer-admin'
}, function (i) {
layer.close(i);
var loadIndex = layer.load(2);
$.post('{:url("/admin/sign_config_delete")}', {
id: id
}, function (res) {
layer.close(loadIndex);
if (res.status === 1) {
layer.msg(res.msg, { icon: 1 });
insTb.reload();
} else {
layer.msg(res.msg || '删除失败', { icon: 2 });
console.error('删除失败:', res);
}
}).fail(function(xhr, textStatus, errorThrown) {
layer.close(loadIndex);
layer.msg('网络错误,请稍后重试', { icon: 2 });
console.error('删除请求失败:', textStatus, errorThrown);
});
});
}
// 监听配置类型切换
form.on('select(config_type)', function (data) {
configType = data.value;
// 重载表格,更新列配置
insTb.reload({
where: {
type: configType
},
cols: getTableCols(configType),
page: { curr: 1 }
});
});
});
</script>

View File

@ -0,0 +1,206 @@
{include file="Public:header2"/}
<div class="layui-fluid">
<div class="layui-row layui-col-space15">
<div class="layui-col-md12">
<div class="layui-card">
<div class="layui-card-body">
<div class="layui-btn-group">
<a class="layui-btn layui-btn-sm" id="addBtn">添加</a>
</div>
<table id="demo" lay-filter="test"></table>
</div>
</div>
</div>
</div>
</div>
<script type="text/html" id="barDemo">
<a class="layui-btn layui-btn-xs" lay-event="edit">编辑</a>
<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</a>
</script>
<script type="text/html" id="status">
<input type="checkbox" name="status" value="{{d.id}}" lay-skin="switch" lay-text="启用|禁用" lay-filter="statusSwitch" {{ d.status == 1 ? 'checked' : '' }}>
</script>
<script type="text/html" id="image">
<img src="{{d.image}}" style="max-width: 100px; max-height: 50px;">
</script>
<!-- 添加/编辑表单模板 -->
<script type="text/html" id="formTpl">
<form class="layui-form" action="" method="post" style="padding: 20px;">
<input type="hidden" name="id" value="{{ d.id || '' }}">
<div class="layui-form-item">
<label class="layui-form-label">名称</label>
<div class="layui-input-block">
<input type="text" name="name" value="{{ d.name || '' }}" required lay-verify="required" placeholder="请输入名称" autocomplete="off" class="layui-input">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">图片</label>
<div class="layui-input-block">
<button type="button" class="layui-btn" id="image-upload">
<i class="layui-icon">&#xe67c;</i>上传图片
</button>
<input type="hidden" name="image" value="{{ d.image || '' }}">
<div class="layui-upload-list">
<img class="layui-upload-img" id="imagePreview" src="{{ d.image || '' }}" style="max-width: 200px; max-height: 100px;">
</div>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">跳转路径</label>
<div class="layui-input-block">
<input type="text" name="url" value="{{ d.url || '' }}" required lay-verify="required" placeholder="请输入跳转路径" autocomplete="off" class="layui-input">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">排序</label>
<div class="layui-input-block">
<input type="number" name="sort" value="{{ d.sort || 0 }}" required lay-verify="required|number" placeholder="请输入排序" autocomplete="off" class="layui-input">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">状态</label>
<div class="layui-input-block">
<input type="checkbox" name="status" lay-skin="switch" lay-text="启用|禁用" {{ d.status == 1 ? 'checked' : '' }}>
</div>
</div>
<div class="layui-form-item">
<div class="layui-input-block">
<button class="layui-btn" lay-submit lay-filter="formSubmit">立即提交</button>
<button type="reset" class="layui-btn layui-btn-primary">重置</button>
</div>
</div>
</form>
</script>
{include file="Public:footer"/}
<script>
layui.use(['table', 'form', 'upload', 'laytpl'], function(){
var table = layui.table;
var form = layui.form;
var laytpl = layui.laytpl;
var upload = layui.upload;
// 数据表格实例
var tableIns = table.render({
elem: '#demo',
url: '/admin/welfare_house',
page: true,
cols: [[
{field: 'id', title: 'ID', width: 80, sort: true},
{field: 'name', title: '名称'},
{field: 'image', title: '图片', templet: '#image'},
{field: 'url', title: '跳转路径'},
{field: 'sort', title: '排序', width: 100},
{field: 'status', title: '状态', width: 100, templet: '#status'},
{field: 'create_time', title: '创建时间', width: 180},
{field: 'right', title: '操作', width: 150, align: 'center', toolbar: '#barDemo'}
]]
});
// 添加按钮点击事件
$('#addBtn').on('click', function(){
openFormLayer({});
});
// 监听工具条事件
table.on('tool(test)', function(obj){
var data = obj.data;
if(obj.event === 'del'){
layer.confirm('确定删除此记录?', function(index){
$.post('/admin/welfare_house_del', {id:data.id}, function(res){
if(res.status == 1){
layer.msg(res.msg, {icon: 1, time: 1000}, function(){
obj.del();
layer.close(index);
});
}else{
layer.msg(res.msg, {icon: 2, anim: 6, time: 1000});
}
}, 'json');
});
} else if(obj.event === 'edit'){
openFormLayer(data);
}
});
// 打开表单层
function openFormLayer(data) {
var title = data.id ? '编辑福利屋' : '添加福利屋';
var tpl = document.getElementById('formTpl').innerHTML;
laytpl(tpl).render(data, function(html){
layer.open({
type: 1,
title: title,
area: ['600px', '500px'],
content: html,
success: function(layero, index){
form.render();
// 执行上传实例
var uploadInst = upload.render({
accept: 'image',
elem: '#image-upload',
url: '/admin/picture',
done: function(res){
if(res.status == 1){
layer.msg("上传成功", {icon:1, time:1000}, function(){
$("#imagePreview").attr("src", res.data.path);
$("input[name=image]").val(res.data.imgurl);
});
} else {
layer.msg(res.msg, {icon:2, anim:6, time:1500});
}
},
error: function(){
layer.msg('服务繁忙,请稍后再试', {icon:2, anim:6, time:1500});
}
});
// 监听表单提交
form.on('submit(formSubmit)', function(formData){
var url = formData.field.id ? '/admin/welfare_house_edit' : '/admin/welfare_house_add';
$.ajax({
url: url,
type: 'post',
data: formData.field,
dataType: 'json',
success: function(res){
if(res.status == 1){
layer.msg(res.msg, {icon: 1, time: 1000}, function(){
layer.close(index);
tableIns.reload(); // 刷新表格
});
}else{
layer.msg(res.msg, {icon: 2, anim: 6, time: 1500});
}
}
});
return false;
});
}
});
});
}
form.on('switch(statusSwitch)', function(obj){
var id = this.value;
var status = obj.elem.checked ? 1 : 0;
$.post('/admin/welfare_house_status', {id:id, status:status}, function(res){
if(res.status == 1){
layer.msg(res.msg, {icon: 1, time: 1000});
}else{
layer.msg(res.msg, {icon: 2, anim: 6, time: 1000});
$(obj.elem).prop('checked', !obj.elem.checked);
form.render('checkbox');
}
}, 'json');
});
});
</script>

39
index.html Executable file
View File

@ -0,0 +1,39 @@
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>恭喜,站点创建成功!</title>
<style>
.container {
width: 60%;
margin: 10% auto 0;
background-color: #f0f0f0;
padding: 2% 5%;
border-radius: 10px
}
ul {
padding-left: 20px;
}
ul li {
line-height: 2.3
}
a {
color: #20a53a
}
</style>
</head>
<body>
<div class="container">
<h1>恭喜, 站点创建成功!</h1>
<h3>这是默认index.html本页面由系统自动生成</h3>
<ul>
<li>本页面在FTP根目录下的index.html</li>
<li>您可以修改、删除或覆盖本页面</li>
<li>FTP相关信息请到“面板系统后台 > FTP” 查看</li>
</ul>
</div>
</body>
</html>