Your commit message

This commit is contained in:
Jane Doe
2024-06-05 05:10:50 +08:00
parent b182234fe6
commit 06dfa7cd9d
200 changed files with 131815 additions and 0 deletions

View File

View File

View File

View File

@@ -0,0 +1,265 @@
<body>
<div class="layui-row" style="margin-top: 20px;">
<div class="layui-col-md3">
<!-- 添加文案按钮 -->
<button class="layui-btn layui-btn-sm" id="add-copywriting">添加文案</button>
</div>
<div class="layui-col-md6">
<!-- 搜索表单 -->
<div class="layui-form" style="display: flex; align-items: center;">
<div class="layui-input-inline" style="flex-grow: 1;">
<input type="text" id="search-text" placeholder="请输入文案内容进行搜索" autocomplete="off" class="layui-input">
</div>
<button class="layui-btn layui-btn-sm" id="search-btn">搜索</button>
</div>
</div>
<div class="layui-col-md3" style="text-align: right;">
<!-- 批量删除按钮 -->
<button class="layui-btn layui-btn-sm layui-btn-danger" id="batch-delete">批量删除</button>
</div>
</div>
<table id="copywriting-table" lay-filter="copywriting-table" style="margin-top: 20px;"></table>
<!-- 操作栏模板 -->
<script type="text/html" id="barDemo">
<a class="layui-btn layui-btn-xs" lay-event="edit">编辑</a>
<a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="approve">审核</a>
<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="delete">删除</a>
</script>
<script>
layui.use(['table', 'layer', 'form'], function(){
var table = layui.table;
var layer = layui.layer;
var form = layui.form;
// 初始化表格
table.render({
elem: '#copywriting-table',
url: '/admin/copywriting_library/', // 数据接口URL
method: 'POST',
where: { // 这里传入的是额外的请求参数LayUI会将这些参数合并到请求数据中
action: 'fetch', // 指定操作类型
},
contentType: 'application/json', // 设置发送请求的内容类型为JSON
page: true, // 开启分页
cols: [[ // 表头
{type: 'checkbox'},
{field: 'text_content', title: '文案', width: '40%', templet: function(d) { return decodeURIComponent(d.text_content); }},
{field: 'source', title: '来源', width: '10%'},
{field: 'popularity', title: '热度', width: '10%'},
{field: 'tag', title: '标签', width: '10%',hide:true},
{field: 'is_approved', title: '是否审核', width: '10%'},
{field: 'added_time', title: '添加时间', width: '10%', sort: true},
{title: '操作', width: '10%', toolbar: '#barDemo'}
]]
});
// 监听搜索按钮事件
$('#search-btn').on('click', function(){
var searchText = $('#search-text').val();
table.reload('copywriting-table', {
where: {search: searchText}
});
});
// 监听添加按钮事件
$('#add-copywriting').on('click', function(){
layer.open({
type: 1, // 页面层
area: ['500px', '400px'], // 宽高
title: '添加文案',
content: '<div class="layui-form" style="margin:20px;">' +
'<div class="layui-form-item">' +
'<label class="layui-form-label">文案内容</label>' +
'<div class="layui-input-block">' +
'<input style="display: none" type="text" name="action" value="add">' +
'<textarea name="text_content" required lay-verify="required" placeholder="请输入文案内容" autocomplete="off" class="layui-textarea"></textarea>' +
'</div>' +
'</div>' +
'<div class="layui-form-item">' +
'<label class="layui-form-label">来源</label>' +
'<div class="layui-input-block">' +
'<input type="text" name="source" 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="text" name="tag" placeholder="请输入标签" autocomplete="off" class="layui-input">' +
'</div>' +
'</div>' +
'<div class="layui-form-item">' +
'<div class="layui-input-block">' +
'<button class="layui-btn" lay-submit lay-filter="formDemo">立即提交</button>' +
'</div>' +
'</div>' +
'</div>', // 表单的HTML内容
success: function(layero, index){
layui.form.on('submit(formDemo)', function(data){
axios.post('/admin/copywriting_library/', JSON.stringify(data.field), {
headers: {'Content-Type': 'application/json'}
}).then(function(response){
if(response.data.status === 'success'){
layer.msg('操作成功', {icon: 1, time: 1000}, function(){
layer.close(index); // 关闭弹窗
layui.table.reload('copywriting-table'); // 重新加载表格
});
} else {
// 操作失败
layer.msg(response.data.message, {icon: 2});
layer.close(index); // 关闭弹窗
}
}).catch(function(error){
layer.msg('服务器出错了', {icon: 2});
console.error('操作失败', error);
});
return false; // 阻止表单跳转。
});
}
});
});
// 编辑文案的函数
function editCopywriting(data) {
layer.open({
type: 1, // 页面层
area: ['500px', '400px'], // 宽高
title: '编辑文案',
content: '<div class="layui-form" style="margin:20px;">' +
'<div class="layui-form-item">' +
'<label class="layui-form-label">文案内容</label>' +
'<div class="layui-input-block">' +
'<input style="display: none" type="text" name="action" value="edit">' +
'<input style="display: none" type="text" name="id" value="'+data.id+'">' +
'<textarea name="text_content" required lay-verify="required" placeholder="请输入文案内容" autocomplete="off" class="layui-textarea">'+data.text_content+'</textarea>' +
'</div>' +
'</div>' +
'<div class="layui-form-item">' +
'<label class="layui-form-label">来源</label>' +
'<div class="layui-input-block">' +
'<input type="text" name="source" value="'+data.source+'" 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="text" name="tag" value="'+data.tag+'" placeholder="请输入标签" autocomplete="off" class="layui-input">' +
'</div>' +
'</div>' +
'<div class="layui-form-item">' +
'<div class="layui-input-block">' +
'<button class="layui-btn" lay-submit lay-filter="editSubmit">立即提交</button>' +
'</div>' +
'</div>' +
'</div>' , // 使用LayUI的模板引擎渲染表单并填充当前行的数据
success: function(layero, index) {
layui.form.render(null, 'editForm'); // 重新渲染表单
// 表单提交事件
layui.form.on('submit(editSubmit)', function(formdata) {
axios.post('/admin/copywriting_library/', JSON.stringify(formdata.field), {
headers: {'Content-Type': 'application/json'}
}).then(function(response) {
if(response.data.status === 'success') {
layer.msg('编辑成功', {icon: 1});
layer.close(index); // 关闭弹窗
layui.table.reload('copywriting-table'); // 重新加载表格
} else {
layer.msg('编辑失败', {icon: 2});
}
}).catch(function(error) {
layer.msg('编辑过程中出错', {icon: 2});
console.error('编辑失败', error);
});
return false; // 阻止表单跳转。
});
}
});
}
// 监听批量删除按钮事件
$('#batch-delete').on('click', function(){
var checkStatus = table.checkStatus('copywriting-table');
var data = checkStatus.data;
var ids = data.map(function(item) {
return item.id;
});
if(ids.length > 0) {
layer.confirm('确认删除选中的文案吗?', function(index){
// 发送批量删除请求...
axios.post('/admin/copywriting_library/', JSON.stringify({ids: ids,action:'batch-delete'}), {
headers: {'Content-Type': 'application/json'}
}).then(function(response){
if(response.data.status === 'success'){
layer.msg('批量删除成功', {icon: 1});
layui.table.reload('copywriting-table'); // 重新加载表格
} else {
layer.msg('批量删除失败', {icon: 2});
}
}).catch(function(error){
console.error('批量删除失败', error);
});
});
} else {
layer.msg('请选择需要删除的文案');
}
});
// 监听表格操作事件
table.on('tool(copywriting-table)', function(obj){
var data = obj.data; // 获取当前行的数据
if(obj.event === 'edit'){
// 编辑操作
editCopywriting(data);
} else if(obj.event === 'delete'){
// 单项删除操作
layer.confirm('确定删除此文案吗?', function(index){
// 发送删除请求...
axios.post('/admin/copywriting_library/', JSON.stringify({action: 'delete', id: data.id}), {
headers: {'Content-Type': 'application/json'}
}).then(function(response){
if(response.data.status === 'success'){
layer.msg('删除成功', {icon: 1});
layui.table.reload('copywriting-table'); // 重新加载表格
} else {
layer.msg('删除失败', {icon: 2});
}
}).catch(function(error){
layer.msg('删除过程中出错', {icon: 2});
console.error('删除失败', error);
});
layer.close(index); // 关闭确认弹窗
});
}else if(obj.event === 'approve'){
layer.confirm('确定审核此文案吗?', function(index){
// 发送删除请求...
axios.post('/admin/copywriting_library/', JSON.stringify({action: 'approve', id: data.id}), {
headers: {'Content-Type': 'application/json'}
}).then(function(response){
if(response.data.status === 'success'){
layer.msg('审核完成', {icon: 1});
layui.table.reload('copywriting-table'); // 重新加载表格
} else {
layer.msg('审核失败', {icon: 2});
}
}).catch(function(error){
layer.msg('审核过程中出错', {icon: 2});
console.error('审核失败', error);
});
layer.close(index); // 关闭确认弹窗
});
}
});
});
</script>
</body>

165
templates/index.html Normal file
View File

@@ -0,0 +1,165 @@
{% load static %}
<html>
<head>
<meta charset="utf-8">
<title>后台管理系统</title>
<meta name="renderer" content="webkit">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="{% static '/js/layui/css/layui.css' %}">
<script src="{% static '/js/jquery.js' %}"></script>
<script src="{% static '/js/layui/layui.js' %}"></script>
<script src="{% static '/js/qs.js' %}"></script>
<script src="{% static '/js/axios.js' %}"></script>
<style>
.layui-nav .layui-nav-item a:hover, .layui-nav .layui-this a {
background-color: #009688 !important;
}
.layui-nav-tree .layui-nav-child dd.layui-this, .layui-nav-tree .layui-nav-child dd.layui-this a, .layui-nav-tree .layui-this, .layui-nav-tree .layui-this>a, .layui-nav-tree .layui-this>a:hover {
background-color: #009688 !important;
}
.clickable-element:hover {
/* 鼠标悬停时的样式 */
cursor: pointer; /* 指定鼠标悬停时的光标样式 */
}
</style>
</head>
<body>
<div class="layui-layout layui-layout-admin">
<div class="layui-header">
<div class="layui-logo layui-hide-xs layui-bg-black nev_list clickable-element" data-url="/admin/main" >后台主页</div>
<!-- 头部区域可配合layui 已有的水平导航) -->
{# <ul class="layui-nav layui-layout-left">#}
{# <!-- 移动端显示 -->#}
{# <li class="layui-nav-item layui-show-xs-inline-block layui-hide-sm" lay-header-event="menuLeft">#}
{# <i class="layui-icon layui-icon-spread-left"></i>#}
{# </li>#}
{# <li class="layui-nav-item layui-hide-xs"><a href="javascript:;">nav 1</a></li>#}
{# <li class="layui-nav-item layui-hide-xs"><a href="javascript:;">nav 2</a></li>#}
{# <li class="layui-nav-item layui-hide-xs"><a href="javascript:;">nav 3</a></li>#}
{# <li class="layui-nav-item">#}
{# <a href="javascript:;">nav groups</a>#}
{# <dl class="layui-nav-child">#}
{# <dd><a href="javascript:;">menu 11</a></dd>#}
{# <dd><a href="javascript:;">menu 22</a></dd>#}
{# <dd><a href="javascript:;">menu 33</a></dd>#}
{# </dl>#}
{# </li>#}
{# </ul>#}
<ul class="layui-nav layui-layout-right">
<li class="layui-nav-item layui-hide layui-show-sm-inline-block">
<a href="javascript:;">
<img src="//unpkg.com/outeres@0.0.10/img/layui/icon-v2.png" class="layui-nav-img">
{{ username }}
</a>
<dl class="layui-nav-child">
<dd><a href="javascript:;">修改信息</a></dd>
<dd><a href="javascript:;">设置</a></dd>
<dd><a href="/admin/admin_logout">退出</a></dd>
</dl>
</li>
</ul>
</div>
<div class="layui-side layui-bg-black">
<div class="layui-side-scroll">
<!-- 左侧导航区域可配合layui已有的垂直导航 -->
<ul class="layui-nav layui-nav-tree" id="side-menu" lay-filter="test">
<li class="layui-nav-item layui-nav-itemed">
<a class="" href="javascript:;" data-url="">用户管理</a>
<dl class="layui-nav-child">
<dd><a href="javascript:void(0)" class="nev_list" data-url="/admin/miniapp_users">小程序用户</a></dd>
<dd><a href="javascript:void(0)" class="nev_list" data-url="/admin/wechat_users">微信用户</a></dd>
<dd><a href="javascript:void(0)" class="nev_list" data-url="/admin/other_sources">其它来源</a></dd>
<dd><a href="javascript:void(0)" class="nev_list" data-url="/admin/site_admins">网站管理员</a></dd>
<dd><a href="javascript:void(0)" class="nev_list" data-url="/admin/redemption-cards">卡密管理</a></dd>
<dd><a href="javascript:void(0)" class="nev_list" data-url="/admin/transaction-logs">订单记录</a></dd>
<dd><a href="javascript:void(0)" class="nev_list" data-url="/admin/membership-types">会员配置</a></dd>
</dl>
</li>
<li class="layui-nav-item">
<a href="javascript:;" data-url="">产品信息</a>
<dl class="layui-nav-child">
<dd><a href="javascript:void(0)" class="nev_list" data-url="/admin/video_extraction_records">视频提取记录</a></dd>
{# <dd><a href="javascript:void(0)" class="nev_list" data-url="/admin/copy_extraction_records">文案提取记录</a></dd>#}
<dd><a href="javascript:void(0)" class="nev_list" data-url="/admin/ai_api_usage">API接口使用</a></dd>
</dl>
</li>
<li class="layui-nav-item">
<a href="javascript:;" data-url="">增加内容</a>
<dl class="layui-nav-child">
<dd><a href="javascript:void(0)" class="nev_list" data-url="/admin/copywriting_library">文案库</a></dd>
<dd><a href="javascript:void(0)" class="nev_list" data-url="/admin/article_records">文章</a></dd>
<dd><a href="javascript:void(0)" class="nev_list" data-url="/admin/material_library">素材库</a></dd>
</dl>
</li>
<li class="layui-nav-item"><a href="javascript:void(0)" class="nev_list" data-url="/admin/website_settings">网站设置</a></li>
<li class="layui-nav-item"><a href="javascript:void(0)" class="nev_list" data-url="/admin/miniapp_settings">小程序设置</a></li>
</ul>
</div>
</div>
<div class="layui-body" >
<!-- 内容主体区域 -->
<div id="content" style="padding: 15px;">
</div>
<div class="layui-footer">
<!-- 底部固定区域 -->
底部固定区域
</div>
</div>
</div>
<script>
//JS
layui.use(['element', 'layer', 'util'], function(){
var element = layui.element;
var layer = layui.layer;
var util = layui.util;
var $ = layui.$;
});
$(document).ready(function () {
function loadContent(url) {
// 使用 AJAX 加载内容
$.get(url, function (data) {
$('#content').html(data);
console.log(url);
});
}
// 在 localStorage 中存储当前 URL
function saveActiveMenuUrl(url) {
localStorage.setItem('activeMenuUrl', url);
}
// 从 localStorage 中获取当前 URL
function getActiveMenuUrl() {
return localStorage.getItem('activeMenuUrl');
}
$('.nev_list').on('click', function () {
$('.nev_list').removeClass('layui-this');
$(this).addClass('layui-this');
var url = $(this).data('url');
loadContent(url);
saveActiveMenuUrl(url);
});
// 默认加载上次激活的菜单项的内容,如果没有则加载第一个菜单项
var activeMenuUrl = getActiveMenuUrl();
if (activeMenuUrl) {
loadContent(activeMenuUrl);
$('.nev_list[data-url="' + activeMenuUrl + '"]').addClass('layui-this');
} else {
$('.nev_list').eq(0).trigger('click');
}
});
</script>
</body>
</html>

79
templates/login.html Normal file
View File

@@ -0,0 +1,79 @@
{% load static %}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="{% static 'css/style.css' %}">
<script src="{% static '/js/jquery.js' %}"></script>
<script src="{% static '/js/layui/layui.js' %}"></script>
<script src="{% static '/js/qs.js' %}"></script>
<script src="{% static '/js/axios.js' %}"></script>
<title>管理员登陆</title>
</head>
<body>
<section>
<!-- 背景颜色 -->
<div class="color"></div>
<div class="color"></div>
<div class="color"></div>
<div class="box">
<!-- 背景圆 -->
<div class="circle" style="--x:0"></div>
<div class="circle" style="--x:1"></div>
<div class="circle" style="--x:2"></div>
<div class="circle" style="--x:3"></div>
<div class="circle" style="--x:4"></div>
<!-- 登录框 -->
<div class="container">
<div class="form">
<h2>管理员登陆</h2>
<form class="layui-form">
<div class="inputBox">
<input type="text" name="username" placeholder="用户名">
</div>
<div class="inputBox">
<input type="password" name="password" placeholder="密码">
</div>
<div class="inputBox">
<input type="submit" lay-submit lay-filter="login" value="登录">
</div>
</form>
</div>
</div>
</div>
</section>
</body>
<script>
layui.use(['form', 'layer'], function(){
var form = layui.form,
layer = layui.layer;
// 监听提交
form.on('submit(login)', function(data){
axios.post('/admin/', data.field)
.then(function (response) {
// 登录成功
if(response.data.status === 'success'){
layer.msg('登录成功', {icon: 1, time: 1000}, function(){
window.location.href = 'admin_dashboard/'
});
} else {
// 登录失败
layer.msg(response.data.message, {icon: 2});
}
})
.catch(function (error) {
console.error(error);
layer.msg('登录请求失败', {icon: 2});
});
return false; // 阻止表单跳转
});
});
</script>
</html>

0
templates/main.html Normal file
View File

View File

View File

@@ -0,0 +1,329 @@
<body>
<div class="layui-btn-container">
<button class="layui-btn layui-btn-sm" id="addMembershipType">添加</button>
</div>
<div class="layui-tab layui-tab-brief" lay-filter="membershipTab">
<ul class="layui-tab-title">
<li class="layui-this" lay-id="membership">会员充值</li>
<li lay-id="quota">额度充值</li>
</ul>
<div class="layui-tab-content">
<div class="layui-tab-item layui-show">
<table class="layui-hide" id="membershipTable" lay-filter="membershipTableFilter"></table>
</div>
<div class="layui-tab-item">
<table class="layui-hide" id="quotaTable" lay-filter="quotaTableFilter"></table>
</div>
</div>
</div>
<script type="text/html" id="operationBar">
<a class="layui-btn layui-btn-xs" lay-event="edit">编辑</a>
<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="delete">删除</a>
</script>
<script>
layui.use(['table', 'layer', 'element',['form']], function(){
var table = layui.table;
var layer = layui.layer;
var element = layui.element;
var form = layui.form;
// 初始化会员充值表格
table.render({
elem: '#membershipTable',
url: '/admin/membership-types/', // 数据接口URL
page: true, // 开启分页
method: 'post', // 使用POST请求
where: { // 这里传入的是额外的请求参数LayUI会将这些参数合并到请求数据中
action: 'fetch', // 指定操作类型
is_quota: false // 仅获取会员充值数据
},
contentType: 'application/json', // 设置发送请求的内容类型为JSON
cols: [[
{field: 'id', title: 'id'},
{field: 'type', title: '卡类型'},
{field: 'title', title: '标题'},
{field: 'description', title: '描述'},
{field: 'price', title: '价格'},
{field: 'duration_days', title: '有效天数'},
{field: 'coins', title: '额度'}, // 修改字段
{title: '操作', align: 'center', toolbar: '#operationBar'}
]]
});
// 初始化额度充值表格
table.render({
elem: '#quotaTable',
url: '/admin/membership-types/', // 数据接口URL
page: true, // 开启分页
method: 'post', // 使用POST请求
where: { // 这里传入的是额外的请求参数LayUI会将这些参数合并到请求数据中
action: 'fetch', // 指定操作类型
is_quota: true // 仅获取额度充值数据
},
contentType: 'application/json', // 设置发送请求的内容类型为JSON
cols: [[
{field: 'id', title: 'id'},
{field: 'type', title: '卡类型'},
{field: 'title', title: '标题'},
{field: 'description', title: '描述'},
{field: 'price', title: '价格'},
{field: 'coins', title: '充值额度'}, // 修改字段
{title: '操作', align: 'center', toolbar: '#operationBar'}
]]
});
// 监听工具条
table.on('tool(membershipTableFilter)', function(obj){
var data = obj.data; // 获得当前行数据
if(obj.event === 'edit'){
// 编辑操作
console.log('编辑会员卡类型', data);
// 打开编辑窗口的代码
layer.open({
type: 1,
zIndex: 999,
title: '编辑会员卡类型',
area: ['500px', '600px'],
content: '<div id="editMembershipTypeForm" style="padding:20px;">'+
'<form class="layui-form" lay-filter="editMembershipTypeForm">'+
'<input type="text" name="id" value="'+data.id+'" lay-verify="required" style="display: none" class="layui-input">'+
'<div class="layui-form-item">'+
' <label class="layui-form-label">卡类型</label>'+
' <div class="layui-input-block">'+
'<input type="text" name="type" value="'+data.type+'" 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="text" name="title" value="'+data.title+'" 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">'+
' <textarea name="description" lay-verify="required" placeholder="请输入描述" class="layui-textarea">'+data.description+'</textarea>'+
'</div>'+
' </div>'+
' <div class="layui-form-item">'+
' <label class="layui-form-label">价格</label>'+
' <div class="layui-input-block">'+
' <input type="text" name="price" value="'+data.price+'" 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="text" name="duration_days" value="'+data.duration_days+'" 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="text" name="coins" value="'+data.coins+'" 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="is_quota" lay-skin="switch" lay-text="是|否" '+(data.is_quota ? 'checked' : '')+'>'+
'</div>'+
' </div>'+
'</form>'+
'</div>',
success: function(layero, index){
// 将当前行数据填充到表单中
form.render();
},
btn: ['保存', '取消'],
yes: function(index, form){
axios.post('/admin/membership-types/', {
action: 'edit',
id: $('input[name="id"]').val(),
type: $('input[name="type"]').val(),
title: $('input[name="title"]').val(),
description: $('textarea[name="description"]').val(),
price: $('input[name="price"]').val(),
duration_days: $('input[name="duration_days"]').val(),
coins: $('input[name="coins"]').val(), // 修改字段
is_quota: $('input[name="is_quota"]').prop('checked') // 新增字段
},{
headers: {'Content-Type': 'application/json'}
})
.then(function(response) {
// 编辑成功后的操作...
if(response.data.status === 'success'){
layer.msg(response.data.message, {icon: 1, time: 1000}, function(){
layer.close(index); // 关闭弹窗
table.reload('membershipTable'); // 重载表格
table.reload('quotaTable'); // 重载表格
});
} else {
layer.msg(response.data.message, function(){
layer.close(index); // 关闭弹窗
});
}
})
.catch(function(error) {
console.error('编辑失败:', error);
});
},
btn2: function(index, layero){
// 取消操作
layer.close(index);
}
});
} else if(obj.event === 'delete'){
// 删除操作
layer.confirm('真的删除行么', function(index){
axios.post('/admin/membership-types/', {
action: 'delete',
id: data.id
},{
headers: {'Content-Type': 'application/json'}
})
.then(function(response) {
if(response.data.status === 'success'){
layer.msg(response.data.message, {icon: 1, time: 1000}, function(){
table.reload('membershipTable'); // 重载表格
table.reload('quotaTable'); // 重载表格
});
} else {
layer.msg(response.data.message, function(){
table.reload('membershipTable'); // 重载表格
table.reload('quotaTable'); // 重载表格
});
}
})
.catch(function(error) {
console.error('删除失败:', error);
});
layer.close(index);
});
}
});
// 监听添加会员卡类型按钮点击事件
document.getElementById('addMembershipType').onclick = function() {
// 打开添加会员卡类型窗口的代码...
layer.open({
type: 1,
zIndex: 999,
title: '添加会员卡类型',
area: ['500px', '600px'],
content: '<div id="addMembershipTypeForm" style="padding:20px;">'+
'<form class="layui-form" lay-filter="addMembershipTypeForm">'+
'<div class="layui-form-item">'+
' <label class="layui-form-label">卡类型</label>'+
' <div class="layui-input-block">'+
'<input type="text" name="type" 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="text" name="title" 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">'+
' <textarea name="description" lay-verify="required" placeholder="请输入描述" class="layui-textarea"></textarea>'+
'</div>'+
' </div>'+
' <div class="layui-form-item">'+
' <label class="layui-form-label">价格</label>'+
' <div class="layui-input-block">'+
' <input type="text" name="price" 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="text" name="duration_days" 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="text" name="coins" 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="is_quota" lay-skin="switch" lay-text="是|否">'+
'</div>'+
' </div>'+
'</form>'+
'</div>',
success: function(layero, index){
// 将当前行数据填充到表单中
form.render();
},
btn: ['保存', '取消'],
yes: function(index, form){
axios.post('/admin/membership-types/', {
action: 'add',
type: $('input[name="type"]').val(),
title: $('input[name="title"]').val(),
description: $('textarea[name="description"]').val(),
price: $('input[name="price"]').val(),
duration_days: $('input[name="duration_days"]').val(),
coins: $('input[name="coins"]').val(), // 修改字段
is_quota: $('input[name="is_quota"]').prop('checked') // 新增字段
},{
headers: {'Content-Type': 'application/json'}
})
.then(function(response) {
// 添加成功后的操作...
if(response.data.status === 'success'){
layer.msg(response.data.message, {icon: 1, time: 1000}, function(){
layer.close(index); // 关闭弹窗
table.reload('membershipTable'); // 重载表格
table.reload('quotaTable'); // 重载表格
});
} else {
layer.msg(response.data.message, function(){
layer.close(index); // 关闭弹窗
});
}
})
.catch(function(error) {
console.error('添加失败:', error);
});
},
btn2: function(index, layero){
// 取消操作
layer.close(index);
}
});
};
// 监听选项卡切换
element.on('tab(membershipTab)', function(data){
if(data.index === 0){
table.reload('membershipTable', {
where: {
action: 'fetch',
is_quota: false
}
});
} else if(data.index === 1){
table.reload('quotaTable', {
where: {
action: 'fetch',
is_quota: true
}
});
}
});
});
</script>
</body>

View File

View File

@@ -0,0 +1,214 @@
<table class="layui-hide" id="userTable" lay-filter="userTableFilter"></table>
<script type="text/html" id="operationBar">
<a class="layui-btn layui-btn-xs" lay-event="edit">编辑</a>
<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="delete">删除</a>
</script>
<script>
layui.use(['table'], function(){
var table = layui.table;
//判断进入的场景值
function mapScene(scene) {
const sceneList = {
'1000': '其他',
'1001': '发现页小程序「最近使用」列表',
'1005': '微信首页顶部搜索框的搜索结果页',
'1006': '发现栏小程序主入口搜索框的搜索结果页',
'1007': '单人聊天会话中的小程序消息卡片',
'1008': '群聊会话中的小程序消息卡片',
'1010': '收藏夹',
'1011': '扫描二维码',
'1012': '长按图片识别二维码',
'1013': '扫描手机相册中选取的二维码',
'1014': '小程序订阅消息与1107相同',
'1017': '前往小程序体验版的入口页',
'1019': '微信钱包微信客户端7.0.0版本改为支付入口)',
'1020': '公众号 profile 页相关小程序列表(已废弃)',
'1022': '聊天顶部置顶小程序入口',
'1023': '安卓系统桌面图标',
'1024': '小程序 profile 页 ',
'1025': '扫描一维码',
'1026': '发现栏小程序主入口,「附近的小程序」列表',
'1027': '微信首页顶部搜索框搜索结果页「使用过的小程序」列表',
'1028': '我的卡包',
'1029': '小程序中的卡券详情页',
'1030': '自动化测试下打开小程序',
'1031': '长按图片识别一维码',
'1032': '扫描手机相册中选取的一维码',
'1034': '微信支付完成页',
'1035': '公众号自定义菜单',
'1036': 'App 分享消息卡片',
'1037': '小程序打开小程序',
'1038': '从另一个小程序返回',
'1039': '摇电视',
'1042': '添加好友搜索框的搜索结果页',
'1043': '公众号模板消息',
'1044': '带 shareTicket 的小程序消息卡片',
'1045': '朋友圈广告',
'1046': '朋友圈广告详情页',
'1047': '扫描小程序码',
'1048': '长按图片识别小程序码',
'1049': '扫描手机相册中选取的小程序码',
'1052': '卡券的适用门店列表',
'1053': '搜一搜的结果页',
'1054': '顶部搜索框小程序快捷入口',
'1056': '聊天顶部音乐播放器右上角菜单',
'1057': '钱包中的银行卡详情页',
'1058': '公众号文章',
'1059': '体验版小程序绑定邀请页',
'1060': '微信支付完成页与1034相同',
'1064': '微信首页连Wi-Fi状态栏',
'1065': 'URL scheme',
'1067': '公众号文章广告',
'1068': '附近小程序列表广告(已废弃)',
'1069': '移动应用通过openSDK进入微信打开小程序',
'1071': '钱包中的银行卡列表页',
'1072': '二维码收款页面',
'1073': '客服消息列表下发的小程序消息卡片',
'1074': '公众号会话下发的小程序消息卡片',
'1077': '摇周边',
'1078': '微信连Wi-Fi成功提示页',
'1079': '微信游戏中心',
'1081': '客服消息下发的文字链',
'1082': '公众号会话下发的文字链',
'1084': '朋友圈广告原生页',
'1088': '会话中,系统消息,打开小程序',
'1089': '微信聊天主界面下拉,「最近使用」栏',
'1090': '长按小程序右上角菜单唤出最近使用历史',
'1091': '公众号文章商品卡片',
'1092': '城市服务入口',
'1095': '小程序广告组件',
'1096': '聊天记录,打开小程序',
'1097': '微信支付签约原生页,打开小程序',
'1099': '页面内嵌插件',
'1100': '红包封面详情页打开小程序',
'1101': '远程调试热更新(开发者工具中,预览 -> 自动预览 -> 编译并预览)',
'1102': '公众号 profile 页服务预览',
'1103': '发现页小程序「我的小程序」列表',
'1104': '微信聊天主界面下拉,「我的小程序」栏',
'1106': '聊天主界面下拉,从顶部搜索结果页,打开小程序',
'1107': '订阅消息,打开小程序',
'1113': '安卓手机负一屏,打开小程序(三星)',
'1114': '安卓手机侧边栏,打开小程序(三星)',
'1119': '【企业微信】工作台内打开小程序',
'1120': '【企业微信】个人资料页内打开小程序',
'1121': '【企业微信】聊天加号附件框内打开小程序',
'1124': '扫“一物一码”打开小程序',
'1125': '长按图片识别“一物一码”',
'1126': '扫描手机相册中选取的“一物一码”',
'1129': '微信爬虫访问',
'1131': '浮窗',
'1133': '硬件设备打开小程序',
'1135': '小程序profile页相关小程序列表打开小程序',
'1144': '公众号文章 - 视频贴片',
'1145': '发现栏 - 发现小程序',
'1146': '地理位置信息打开出行类小程序',
'1148': '卡包-交通卡,打开小程序',
'1150': '扫一扫商品条码结果页打开小程序',
'1151': '发现栏 - 我的订单',
'1152': '订阅号视频打开小程序',
'1153': '“识物”结果页打开小程序',
'1154': '朋友圈内打开“单页模式”',
'1155': '“单页模式”打开小程序',
'1157': '服务号会话页打开小程序',
'1158': '群工具打开小程序',
'1160': '群待办',
'1167': 'H5 通过开放标签打开小程序',
'1168': '移动/网站应用直接运行小程序',
'1169': '发现栏小程序主入口,各个生活服务入口(例如快递服务、出行服务等)',
'1171': '微信运动记录(仅安卓)',
'1173': '聊天素材用小程序打开 详情',
'1175': '视频号主页商店入口',
'1176': '视频号直播间主播打开小程序',
'1177': '视频号直播商品',
'1178': '在电脑打开手机上打开的小程序',
'1179': '#话题页打开小程序',
'1181': '网站应用打开PC小程序',
'1183': 'PC微信 - 小程序面板 - 发现小程序 - 搜索',
'1184': '视频号链接打开小程序',
'1185': '群公告',
'1186': '收藏 - 笔记',
'1187': '浮窗',
'1189': '表情雨广告',
'1191': '视频号活动',
'1192': '企业微信联系人profile页',
'1193': '视频号主页服务菜单打开小程序',
'1194': 'URL Link 详情',
'1195': '视频号主页商品tab',
'1196': '个人状态打开小程序',
'1197': '视频号主播从直播间返回小游戏',
'1198': '视频号开播界面打开小游戏',
'1200': '视频号广告打开小程序',
'1201': '视频号广告详情页打开小程序',
'1202': '企微客服号会话打开小程序卡片',
'1203': '微信小程序压测工具的请求',
'1206': '视频号小游戏直播间打开小游戏',
'1207': '企微客服号会话打开小程序文字链',
'1208': '聊天打开商品卡片',
'1212': '青少年模式申请页打开小程序',
'1215': '广告预约打开小程序',
'1216': '视频号订单中心打开小程序',
'1223': '安卓桌面Widget打开小程序',
'1228': '视频号原生广告组件打开小程序',
'1230': '订阅号H5广告进入小程序',
'1231': '动态消息提醒入口打开小程序',
'1242': '小程序发现页门店快送模块频道页进入小程序',
'1245': '小程序发现页门店快送搜索结果页进入小程序',
'1252': '搜一搜小程序搜索页「小功能」模块进入小程序'
}
return sceneList[scene] || '未知'; // 返回映射值或默认为“未知”
}
// 初始化表格
table.render({
elem: '#userTable',
url: '/admin/miniapp_users/', // 数据接口URL
page: true, // 开启分页
method: 'post', // 使用POST请求
where: { // 这里传入的是额外的请求参数LayUI会将这些参数合并到请求数据中
action: 'fetch', // 指定操作类型
},
contentType: 'application/json', // 设置发送请求的内容类型为JSON
cols: [[
{field: 'openid', title: 'OpenID'},
{field: 'nickname', title: 'UUid'},
{field: 'wxid', title: '微信ID'},
{field: 'wechat_number', title: '微信号'},
{field: 'nickname', title: '昵称', hide: true},
{field: 'gender', title: '性别' ,hide: true},
{field: 'region', title: '地区' ,hide: true},
{field: 'email', title: '邮箱' ,hide: true},
{field: 'phone', title: '号码' ,hide: true},
{field: 'scene', title: '用户来源',templet: function(d) { return mapScene(d.scene); }},
{field: 'is_member', title: '是否会员', templet: function(d) { return d.is_member ? '是' : '否'; }},
{field: 'member_start_time', title: '会员开始时间',hide: true},
{field: 'member_end_time', title: '会员到期时间',hide: true},
{field: 'is_active', title: '状态', templet: function(d) { return d.is_active ? '启用' : '禁用'; }},
{field: 'usage_count', title: '使用次数'},
{field: 'created_at', title: '创建时间', sort: true},
{title: '操作', align: 'center', toolbar: '#operationBar'}
]]
});
// 监听工具条
table.on('tool(userTableFilter)', function(obj){
var data = obj.data; // 获得当前行数据
if(obj.event === 'edit'){
// 编辑操作
console.log('编辑用户', data);
// 打开编辑窗口的代码...
} else if(obj.event === 'delete'){
// 删除操作
layer.confirm('真的删除行么', function(index){
obj.del(); // 删除对应行tr的DOM结构并更新缓存
layer.close(index);
// 向服务端发送删除指令的代码...
});
}
});
});
</script>
</body>
</html>

View File

View File

@@ -0,0 +1,190 @@
<div class="layui-row">
<div class="layui-col-md4">
<button class="layui-btn layui-btn-sm" id="addRedemptionCard">增加</button>
<button class="layui-btn layui-btn-danger layui-btn-sm" id="batchDeleteRedemptionCard">批量删除</button>
</div>
</div>
<table id="redemptionCardTable" lay-filter="redemptionCardTable">
</table>
<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="delete">删除</a>
</script>
<script>
layui.use(['table', 'layer',['form']], function(){
var table = layui.table;
var layer = layui.layer;
var form = layui.form;
// 渲染表格
table.render({
elem: '#redemptionCardTable',
url: '/admin/redemption-cards/', // 数据接口URL
page: true, // 开启分页
limit: 10, // 每页显示的条数
method: 'post', // 使用POST请求
where: { // 这里传入的是额外的请求参数LayUI会将这些参数合并到请求数据中
action: 'fetch', // 指定操作类型
},
contentType: 'application/json', // 设置发送请求的内容类型为JSON
cols: [[
{type: 'checkbox', fixed: 'left'},
{field: 'code', title: '卡密', sort: true},
{field: 'card_type', title: '卡类型', templet: function(d){
return d.card_type === 'member' ? '会员卡' : '额度卡';
}},
{field: 'created_date', title: '生成日期', sort: true, templet: function(d){
return layui.util.toDateString(d.created_date, 'yyyy-MM-dd HH:mm:ss');
}},
{field: 'expiry_date', title: '到期时间', sort: true, templet: function(d){
return layui.util.toDateString(d.expiry_date, 'yyyy-MM-dd HH:mm:ss');
}},
{field: 'is_used', title: '是否已使用', templet: function(d) { return d.is_used ? '是' : '否'; }},
{field: 'validity_period', title: '额度'},
{field: 'used_by_openid', title: '使用者OpenID'},
{title: '操作', toolbar: '#barDemo'}
]]
});
// 监听工具条
// 监听工具条
table.on('tool(redemptionCardTable)', function(obj){
var data = obj.data; // 获得当前行数据
if(obj.event === 'edit'){
// 编辑操作
console.log('编辑卡密', data);
// 打开编辑窗口的代码...
} else if(obj.event === 'delete'){
// 删除操作
layer.confirm('真的删除行么', function(index){
axios.post('/admin/redemption-cards/', JSON.stringify({action: 'delete', id: data.id}), {
headers: {'Content-Type': 'application/json'}
}).then(function(response){
if(response.data.status === 'success'){
layer.msg('删除成功', {icon: 1});
layui.table.reload('redemptionCardTable'); // 重新加载表格
} else {
layer.msg('删除失败', {icon: 2});
}
}).catch(function(error){
layer.msg('删除过程中出错', {icon: 2});
console.error('删除失败', error);
});
layer.close(index); // 关闭确认弹窗
// 向服务端发送删除指令的代码...
});
}
});
// 监听添加卡密按钮点击事件
document.getElementById('addRedemptionCard').onclick = function() {
layer.open({
type: 1,
title: '添加卡密管理',
area: ['500px', '400px'],
content: '<form class="layui-form" lay-filter="addRedemptionCardForm">' +
'<div class="layui-form-item">' +
'<label class="layui-form-label">卡密前缀</label>' +
'<div class="layui-input-inline">' +
'<input style="display: none" type="text" name="action" value="add">' +
'<input type="text" name="code_prefix" 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-inline">' +
'<select name="card_type" lay-verify="required">' +
'<option value="">请选择卡类型</option>' +
'<option value="member">会员卡</option>' +
'<option value="quota">额度卡</option>' +
'</select>' +
'</div>' +
'</div>' +
'<div class="layui-form-item">' +
'<label class="layui-form-label">数量</label>' +
'<div class="layui-input-inline">' +
'<input type="number" name="quantity" 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-inline">' +
'<input type="date" name="expiry_date" 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-inline">' +
'<input type="text" name="validity_period" lay-verify="required" placeholder="额度" autocomplete="off" class="layui-input">' +
'</div>' +
'</div>' +
'<div class="layui-form-item">' +
'<div class="layui-input-block">' +
'<button class="layui-btn" lay-submit lay-filter="addRedemptionCard">添加</button>' +
'</div>' +
'</div>' +
'</form>',
success: function(layero, index) {
form.render();
layui.form.on('submit(addRedemptionCard)', function(data){
axios.post('/admin/redemption-cards/', JSON.stringify(data.field), {
headers: {'Content-Type': 'application/json'}
}).then(function(response){
if(response.data.status === 'success'){
layer.msg('操作成功', {icon: 1, time: 1000}, function(){
layer.close(index); // 关闭弹窗
layui.table.reload('redemptionCardTable'); // 重新加载表格
});
} else {
// 操作失败
layer.msg(response.data.message, {icon: 2});
layer.close(index); // 关闭弹窗
}
}).catch(function(error){
layer.msg('服务器出错了', {icon: 2});
console.error('操作失败', error);
});
return false; // 阻止表单跳转。
});
}
});
};
// 监听批量删除按钮点击事件
document.getElementById('batchDeleteRedemptionCard').onclick = function() {
var checkStatus = table.checkStatus('redemptionCardTable');
var selectedData = checkStatus.data;
var ids = selectedData.map(function(item) {
return item.id;
});
if (selectedData.length === 0) {
layer.msg('请选择要删除的卡密', {icon: 5});
} else {
layer.confirm('确认删除选中的卡密吗?', function(index){
// 发送批量删除请求...
axios.post('/admin/redemption-cards/', JSON.stringify({ids: ids,action:'batch_delete'}), {
headers: {'Content-Type': 'application/json'}
}).then(function(response){
if(response.data.status === 'success'){
layer.msg('批量删除成功', {icon: 1});
layui.table.reload('redemptionCardTable'); // 重新加载表格
} else {
layer.msg('批量删除失败', {icon: 2});
}
}).catch(function(error){
console.error('批量删除失败', error);
});
});
}
};
});
</script>

View File

View File

@@ -0,0 +1,116 @@
<body>
<div class="layui-row">
<div class="layui-col-md4">
<button class="layui-btn layui-btn-danger layui-btn-sm" id="batchDeleteTransaction">批量删除</button>
</div>
</div>
<table id="transactionLogTable" lay-filter="transactionLogTable"></table>
<script type="text/html" id="barDemo">
<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="delete">删除</a>
</script>
<script>
layui.use(['table', 'layer'], function(){
var table = layui.table;
var layer = layui.layer;
// 渲染表格
table.render({
elem: '#transactionLogTable',
url: '/admin/transaction-logs/', // 数据接口URL
page: true, // 开启分页
limit: 10, // 每页显示的条数
method: 'post', // 使用POST请求
where: { // 这里传入的是额外的请求参数LayUI会将这些参数合并到请求数据中
action: 'fetch', // 指定操作类型
},
contentType: 'application/json', // 设置发送请求的内容类型为JSON
cols: [[
{type: 'checkbox', fixed: 'left'},
{field: 'transaction_no', title: '交易编号', sort: true},
{field: 'transaction_status', title: '交易状态', templet: function(d){
return d.transaction_status === 'pending' ? '待处理' : (d.transaction_status === 'completed' ? '完成' : '失败');
}},
{field: 'user_openid', title: '用户OpenID'},
{field: 'transaction_type', title: '交易类型',templet: function(d){
return d.transaction_type === 'member' ? '开通会员' : '续费会员'
}},
{field: 'transaction_amount', title: '交易金额'},
{field: 'remark', title: '备注', templet: function(d){
var remarkMap = {
'day': '一天会员充值',
'week': '一周会员充值',
'month': '一月会员充值',
'season': '三月会员充值',
'year': '一年会员充值'
};
return remarkMap[d.remark] || '未知';
}},
{field: 'created_at', title: '创建时间', templet: function(d){
return layui.util.toDateString(d.created_at, 'yyyy-MM-dd HH:mm:ss');
}},
{field: 'updated_at', title: '更新时间', templet: function(d){
return layui.util.toDateString(d.updated_at, 'yyyy-MM-dd HH:mm:ss');
}},
{title: '操作', toolbar: '#barDemo'}
]]
});
// 监听工具条
table.on('tool(transactionLogTable)', function(obj){
var data = obj.data; // 获得当前行数据
if(obj.event === 'delete'){
// 删除操作
layer.confirm('真的删除行么', function(index){
axios.post('/admin/transaction-logs/', JSON.stringify({action: 'delete', id: data.id}), {
headers: {'Content-Type': 'application/json'}
}).then(function(response){
if(response.data.status === 'success'){
layer.msg('删除成功', {icon: 1});
layui.table.reload('transactionLogTable'); // 重新加载表格
} else {
layer.msg('删除失败', {icon: 2});
}
}).catch(function(error){
layer.msg('删除过程中出错', {icon: 2});
console.error('删除失败', error);
});
layer.close(index); // 关闭确认弹窗
// 向服务端发送删除指令的代码...
});
}
});
// 监听批量删除按钮点击事件
document.getElementById('batchDeleteTransaction').onclick = function() {
var checkStatus = table.checkStatus('transactionLogTable');
var selectedData = checkStatus.data;
var ids = selectedData.map(function(item) {
return item.id;
});
if (selectedData.length === 0) {
layer.msg('请选择要删除的订单记录', {icon: 5});
} else {
layer.confirm('确认删除选中的订单记录么?', function(index) {
axios.post('/admin/transaction-logs/', JSON.stringify({ids: ids,action:'batch_delete'}), {
headers: {'Content-Type': 'application/json'}
}).then(function(response){
if(response.data.status === 'success'){
layer.msg('批量删除成功', {icon: 1});
layui.table.reload('transactionLogTable'); // 重新加载表格
} else {
layer.msg('批量删除失败', {icon: 2});
}
}).catch(function(error){
console.error('批量删除失败', error);
});
});
}
};
});
</script>

View File

View File

View File

@@ -0,0 +1,71 @@
<body>
<table class="layui-hide" id="friendRequestTable" lay-filter="friendRequestTableFilter"></table>
<script>
layui.use(['table', 'layer'], function(){
var table = layui.table;
var layer = layui.layer;
// 初始化表格
table.render({
elem: '#friendRequestTable',
url: '/admin/wechat_users/', // 修改为你的接口地址
method: 'post',
where: {action: 'fetch'}, // 传递给后端的参数例如action: 'fetch'用于获取数据
contentType: 'application/json', // 设置发送请求的内容类型为JSON
page: true,
cols: [[
{field: 'fromusername', title: '微信ID', sort: true},
{field: 'alias', title: '微信号'},
{field: 'fromnickname', title: '昵称'},
{field: 'country', title: '国家'},
{field: 'province', title: '省份'},
{field: 'city', title: '城市'},
{field: 'sex', title: '性别', sort: true},
{field: 'scene', title: '来源'},
{field: 'time', title: '申请时间', sort: true},
{field: 'towxid', title: '目标微信ID'},
{title: '操作', toolbar: '#barDemo'} // 操作列,使用模板引擎渲染
]]
});
// 工具条事件
table.on('tool(friendRequestTableFilter)', function(obj){
var data = obj.data; // 获取当前行数据
if(obj.event === 'edit'){
// 编辑操作
console.log('编辑', data);
// 实现编辑操作...
} else if(obj.event === 'delete'){
// 删除操作
console.log('删除', data.id);
layer.confirm('确定删除该好友请求吗?', function(index){
// 发起POST请求到后端进行删除
layui.$.post('/admin/wechat_users/', {
action: 'delete',
id: data.id
}, function(res){
if(res.status === 'success'){
layer.msg('删除成功');
obj.del(); // 删除表格行
} else {
layer.msg('删除失败');
}
});
layer.close(index);
});
}
});
});
</script>
<!-- 表格操作栏模板 -->
<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="delete">删除</a>
</script>
</body>