Your commit message
This commit is contained in:
		
							
								
								
									
										0
									
								
								templates/ai_api_usage.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										0
									
								
								templates/ai_api_usage.html
									
									
									
									
									
										Normal file
									
								
							
							
								
								
									
										0
									
								
								templates/article_records.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										0
									
								
								templates/article_records.html
									
									
									
									
									
										Normal file
									
								
							
							
								
								
									
										0
									
								
								templates/copy_extraction_records.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										0
									
								
								templates/copy_extraction_records.html
									
									
									
									
									
										Normal file
									
								
							
							
								
								
									
										265
									
								
								templates/copywriting_library.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										265
									
								
								templates/copywriting_library.html
									
									
									
									
									
										Normal 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
									
								
							
							
						
						
									
										165
									
								
								templates/index.html
									
									
									
									
									
										Normal 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
									
								
							
							
						
						
									
										79
									
								
								templates/login.html
									
									
									
									
									
										Normal 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
									
								
							
							
						
						
									
										0
									
								
								templates/main.html
									
									
									
									
									
										Normal file
									
								
							
							
								
								
									
										0
									
								
								templates/material_library.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										0
									
								
								templates/material_library.html
									
									
									
									
									
										Normal file
									
								
							
							
								
								
									
										329
									
								
								templates/membership-types.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										329
									
								
								templates/membership-types.html
									
									
									
									
									
										Normal 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> | ||||
							
								
								
									
										0
									
								
								templates/miniapp_settings.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										0
									
								
								templates/miniapp_settings.html
									
									
									
									
									
										Normal file
									
								
							
							
								
								
									
										214
									
								
								templates/miniapp_users.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										214
									
								
								templates/miniapp_users.html
									
									
									
									
									
										Normal 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> | ||||
							
								
								
									
										0
									
								
								templates/other_sources.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										0
									
								
								templates/other_sources.html
									
									
									
									
									
										Normal file
									
								
							
							
								
								
									
										190
									
								
								templates/redemption_card.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										190
									
								
								templates/redemption_card.html
									
									
									
									
									
										Normal 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> | ||||
							
								
								
									
										0
									
								
								templates/site_admins.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										0
									
								
								templates/site_admins.html
									
									
									
									
									
										Normal file
									
								
							
							
								
								
									
										116
									
								
								templates/transaction-logs.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										116
									
								
								templates/transaction-logs.html
									
									
									
									
									
										Normal 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> | ||||
							
								
								
									
										0
									
								
								templates/video_extraction_records.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										0
									
								
								templates/video_extraction_records.html
									
									
									
									
									
										Normal file
									
								
							
							
								
								
									
										0
									
								
								templates/website_settings.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										0
									
								
								templates/website_settings.html
									
									
									
									
									
										Normal file
									
								
							
							
								
								
									
										71
									
								
								templates/wechat_users.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										71
									
								
								templates/wechat_users.html
									
									
									
									
									
										Normal 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> | ||||
|  | ||||
		Reference in New Issue
	
	Block a user
	 Jane Doe
					Jane Doe