1
0
Эх сурвалжийг харах

feat: tabler theme in admin/announcement

Cat 2 жил өмнө
parent
commit
a31d6a1fb9

+ 1 - 1
app/routes.php

@@ -181,7 +181,7 @@ return function (SlimApp $app): void {
         $this->post('/announcement', App\Controllers\Admin\AnnController::class . ':add');
         $this->get('/announcement/{id}/edit', App\Controllers\Admin\AnnController::class . ':edit');
         $this->put('/announcement/{id}', App\Controllers\Admin\AnnController::class . ':update');
-        $this->delete('/announcement', App\Controllers\Admin\AnnController::class . ':delete');
+        $this->delete('/announcement/{id}', App\Controllers\Admin\AnnController::class . ':delete');
         $this->post('/announcement/ajax', App\Controllers\Admin\AnnController::class . ':ajax');
 
         // Detect Mange

+ 0 - 1
db/migrations/20000101000000_init_database.php.new

@@ -104,7 +104,6 @@ final class InitDatabase extends AbstractMigration
             ->addColumn('id', 'integer', [ 'identity' => true ])
             ->addColumn('date', 'datetime', [])
             ->addColumn('content', 'text', [])
-            ->addColumn('markdown', 'text', [])
             ->create();
 
         $this->table('bought', [ 'id' => false, 'primary_key' => [ 'id' ]])

+ 24 - 0
db/migrations/20221204134100_remove_ann_markdown.php

@@ -0,0 +1,24 @@
+<?php
+
+declare(strict_types=1);
+
+use Phinx\Migration\AbstractMigration;
+
+final class RemoveAnnMarkdown extends AbstractMigration
+{
+    public function up(): void
+    {
+        if ($this->table('announcement')->hasColumn('markdown')) {
+            $this->table('announcement')
+                ->removeColumn('markdown')
+                ->save();
+        }
+    }
+
+    public function down(): void
+    {
+        $this->table('announcement')
+            ->addColumn('markdown', 'text', [])
+            ->save();
+    }
+}

+ 105 - 109
resources/views/tabler/admin/announcement/create.tpl

@@ -1,124 +1,120 @@
-{include file='admin/main.tpl'}
+{include file='admin/tabler_header.tpl'}
 
-<main class="content">
-    <div class="content-header ui-content-header">
-        <div class="container">
-            <h1 class="content-heading">添加公告</h1>
+<link rel="stylesheet" type="text/css" id="mce-u0" href="//cdn.jsdelivr.net/npm/@tabler/core@latest/dist/libs/tinymce/skins/ui/oxide/skin.min.css">
+<script src="//cdn.jsdelivr.net/npm/@tabler/core@latest/dist/libs/tinymce/tinymce.min.js"></script>
+
+<div class="page-wrapper">
+    <div class="container-xl">
+        <div class="page-header d-print-none text-white">
+            <div class="row align-items-center">
+                <div class="col">
+                    <h2 class="page-title">
+                        <span class="home-title">创建公告</span>
+                    </h2>
+                    <div class="page-pretitle my-3">
+                        <span class="home-subtitle">创建站点公告</span>
+                    </div>
+                </div>
+                <div class="col-auto ms-auto d-print-none">
+                    <div class="btn-list">
+                        <a id="create-ann" href="#" class="btn btn-primary">
+                            <i class="icon ti ti-device-floppy"></i>
+                            保存
+                        </a>
+                    </div>
+                </div>
+            </div>
         </div>
     </div>
-    <div class="container">
-        <div class="col-lg-12 col-md-12">
-            <section class="content-inner margin-top-no">
-                <div class="card">
-                    <div class="card-main">
-                        <div class="card-inner">
-                            <div class="form-group form-group-label">
-                                <label class="floating-label" for="content">内容</label>
-                                <link rel="stylesheet"
-                                      href="https://cdn.jsdelivr.net/npm/[email protected]/css/editormd.min.css"/>
-                                <div id="editormd">
-                                    <textarea style="display:none;" id="content"></textarea>
-                                </div>
-                            </div>
+    <div class="page-body">
+        <div class="container-xl">
+            <div class="card">
+                <div class="card-body">
+                    <div class="mb-3">
+                        <form method="post">
+                            <textarea id="tinymce"></textarea>
+                        </form>
+                    </div>
+                    <div class="mb-3">
+                        <label class="form-label col-3 col-form-label">公告通知的用户等级,0为不分级</label>
+                        <div class="col">
+                            <input id="email_notify_class" type="text" class="form-control" value=""></input>
                         </div>
                     </div>
-                </div>
-                <div class="card">
-                    <div class="card-main">
-                        <div class="card-inner">
-                            <div class="form-group">
-                                <div class="row">
-                                    <div class="col-md-10 col-md-push-1">
-                                        <div class="form-group form-group-label">
-                                            <label class="floating-label" for="vip">VIP等级</label>
-                                            <input class="form-control maxwidth-edit" id="vip" type="text" name="vip">
-                                            <p class="form-control-guide"><i class="mdi mdi-information"></i>发送给等于或高于这个等级的用户
-                                                0为不分级</p>
-                                            <div class="checkbox switch">
-                                                <label for="issend">
-                                                    <input class="access-hide" id="issend" type="checkbox"
-                                                           name="issend"><span class="switch-toggle"></span>是否发送邮件
-                                                </label>
-                                            </div>
-                                        </div>
-                                        <button id="submit" type="submit"
-                                                class="btn btn-block btn-brand waves-attach waves-light">添加
-                                        </button>
-                                    </div>
-                                </div>
+                    <div class="mb-3">
+                        <div class="divide-y">
+                            <div>
+                                <label class="row">
+                                    <span class="col">发送邮件通知</span>
+                                    <span class="col-auto">
+                                        <label class="form-check form-check-single form-switch">
+                                            <input id="email_notify" class="form-check-input" type="checkbox"
+                                                checked="">
+                                        </label>
+                                    </span>
+                                </label>
                             </div>
                         </div>
                     </div>
                 </div>
-                {include file='dialog.tpl'}
-            </section>
+            </div>              
         </div>
     </div>
-</main>
-
-{include file='admin/footer.tpl'}
+</div>
 
-<script src="//cdn.jsdelivr.net/npm/[email protected]/editormd.min.js"></script>
 <script>
-    (() => {
-        editor = editormd("editormd", {
-            path: "https://cdn.jsdelivr.net/npm/[email protected]/lib/", // Autoload modules mode, codemirror, marked... dependents libs path
-            height: 720,
-            saveHTMLToTextarea: true
-        });
-        /*
-        // or
-        var editor = editormd({
-            id   : "editormd",
-            path : "../lib/"
-        });
-        */
-    })();
-    window.addEventListener('load', () => {
-        function submit(page = -1) {
-            if ($$.getElementById('issend').checked) {
-                var issend = 1;
-            } else {
-                var issend = 0;
-            }
-            if (page === -1) {
-                sedPage = 1;
-            } else {
-                sedPage = page;
-            }
-            $.ajax({
-                type: "POST",
-                url: "/admin/announcement",
-                dataType: "json",
-                data: {
-                    content: editor.getHTML(),
-                    markdown: $('.editormd-markdown-textarea').val(),
-                    vip: $$getValue('vip'),
-                    issend,
-                    page: sedPage
-                },
-                success: data => {
-                    if (data.ret === 1) {
-                        $("#result").modal();
-                        $$.getElementById('msg').innerHTML = data.msg;
-                        window.setTimeout("location.href=top.document.referrer", {$config['jump_delay']});
-                    } else if (data.ret === 2) {
-                        submit(data.msg);
-                    } else {
-                        $("#result").modal();
-                        $$.getElementById('msg').innerHTML = data.msg;
-                    }
-                },
-                error: jqXHR => {
-                    $("#result").modal();
-                    $$.getElementById('msg').innerHTML = `发生错误:${
-                        jqXHR.status
-                    }`;
-                }
-            });
+    <script>
+      // @formatter:off
+      document.addEventListener("DOMContentLoaded", function () {
+        let options = {
+          selector: '#tinymce',
+          height: 300,
+          menubar: false,
+          statusbar: false,
+          plugins: [
+            'advlist autolink lists link image charmap print preview anchor',
+            'searchreplace visualblocks code fullscreen',
+            'insertdatetime media table paste code help wordcount'
+          ],
+          toolbar: 'undo redo | formatselect | ' +
+            'bold italic backcolor | alignleft aligncenter ' +
+            'alignright alignjustify | bullist numlist outdent indent | ' +
+            'removeformat',
+          content_style: 'body { font-family: -apple-system, BlinkMacSystemFont, San Francisco, Segoe UI, Roboto, Helvetica Neue, sans-serif; font-size: 14px; -webkit-font-smoothing: antialiased; }'
+        }
+        if (localStorage.getItem("tablerTheme") === 'dark') {
+          options.skin = 'oxide-dark';
+          options.content_css = 'dark';
         }
-        $$.getElementById('submit').addEventListener('click', () => {
-            submit();
-        });
+        tinyMCE.init(options);
+      })
+      // @formatter:on
+    </script>
+
+    $("#create-ann").click(function() {
+        $.ajax({
+            url: '/announcement',
+            type: 'POST',
+            dataType: "json",
+            data: {
+                {foreach $update_field as $key}
+                {$key}: $('#{$key}').val(),
+                {/foreach}
+                email_notify: $("#email_notify").is(":checked"),
+                content: tinyMCE.activeEditor.getContent(),
+            },
+            success: function(data) {
+                if (data.ret == 1) {
+                    $('#success-message').text(data.msg);
+                    $('#success-dialog').modal('show');
+                    window.setTimeout("location.href=top.document.referrer", {$config['jump_delay']});
+                } else {
+                    $('#fail-message').text(data.msg);
+                    $('#fail-dialog').modal('show');
+                }
+            }
+        })
     });
-</script>
+</script>
+
+{include file='admin/tabler_footer.tpl'}

+ 84 - 85
resources/views/tabler/admin/announcement/edit.tpl

@@ -1,96 +1,95 @@
-{include file='admin/main.tpl'}
+{include file='admin/tabler_header.tpl'}
 
-<main class="content">
-    <div class="content-header ui-content-header">
-        <div class="container">
-            <h1 class="content-heading">编辑公告 #{$ann->id}</h1>
-        </div>
-    </div>
-    <div class="container">
-        <div class="col-lg-12 col-md-12">
-            <section class="content-inner margin-top-no">
-                <div class="card">
-                    <div class="card-main">
-                        <div class="card-inner">
-                            <div class="form-group form-group-label">
-                                <label class="floating-label" for="content">内容</label>
-                                <link rel="stylesheet"
-                                      href="https://cdn.jsdelivr.net/npm/[email protected]/css/editormd.min.css"/>
-                                <div id="editormd">
-                                    <textarea style="display:none;" id="content">{$ann->markdown}</textarea>
-                                </div>
-                            </div>
-                        </div>
+<link rel="stylesheet" type="text/css" id="mce-u0" href="//cdn.jsdelivr.net/npm/@tabler/core@latest/dist/libs/tinymce/skins/ui/oxide/skin.min.css">
+<script src="//cdn.jsdelivr.net/npm/@tabler/core@latest/dist/libs/tinymce/tinymce.min.js"></script>
+
+<div class="page-wrapper">
+    <div class="container-xl">
+        <div class="page-header d-print-none text-white">
+            <div class="row align-items-center">
+                <div class="col">
+                    <h2 class="page-title">
+                        <span class="home-title">编辑公告</span>
+                    </h2>
+                    <div class="page-pretitle my-3">
+                        <span class="home-subtitle">编辑站点公告</span>
                     </div>
                 </div>
-                <div class="card">
-                    <div class="card-main">
-                        <div class="card-inner">
-                            <div class="form-group">
-                                <div class="row">
-                                    <div class="col-md-10 col-md-push-1">
-                                        <button id="submit" type="submit"
-                                                class="btn btn-block btn-brand waves-attach waves-light">修改
-                                        </button>
-                                    </div>
-                                </div>
-                            </div>
-                        </div>
+                <div class="col-auto ms-auto d-print-none">
+                    <div class="btn-list">
+                        <a id="save-ann" href="#" class="btn btn-primary">
+                            <i class="icon ti ti-device-floppy"></i>
+                            保存
+                        </a>
                     </div>
                 </div>
-                {include file='dialog.tpl'}
-            </section>
+            </div>
         </div>
     </div>
-</main>
-
-{include file='admin/footer.tpl'}
+    <div class="page-body">
+        <div class="container-xl">
+            <div class="card">
+                <div class="card-body">
+                    <div class="mb-3">
+                        <form method="post">
+                            <textarea id="tinymce">{$ann->content}</textarea>
+                        </form>
+                    </div>
+                </div>
+            </div>              
+        </div>
+    </div>
+</div>
 
-<script src="//cdn.jsdelivr.net/npm/[email protected]/editormd.min.js"></script>
 <script>
-    (() => {
-        editor = editormd("editormd", {
-            path: "https://cdn.jsdelivr.net/npm/[email protected]/lib/", // Autoload modules mode, codemirror, marked... dependents libs path
-            height: 720,
-            saveHTMLToTextarea: true,
-            emoji: true
-        });
-        /*
-        // or
-        var editor = editormd({
-            id   : "editormd",
-            path : "../lib/"
-        });
-        */
-    })();
-    window.addEventListener('load', () => {
-        function submit() {
-            $.ajax({
-                type: "PUT",
-                url: "/admin/announcement/{$ann->id}",
-                dataType: "json",
-                data: {
-                    content: editor.getHTML(),
-                    markdown: editor.getMarkdown()
-                },
-                success: data => {
-                    if (data.ret) {
-                        $("#result").modal();
-                        $$.getElementById('msg').innerHTML = data.msg;
-                        window.setTimeout("location.href=top.document.referrer", {$config['jump_delay']});
-                    } else {
-                        $("#result").modal();
-                        document.getElementById('msg').innerHTML = data.msg;
-                    }
-                },
-                error: jqXHR => {
-                    $("#result").modal();
-                    $$.getElementById('msg').innerHTML = `发生错误:${
-                        jqXHR.status
-                    }`;
-                }
-            });
+    <script>
+      // @formatter:off
+      document.addEventListener("DOMContentLoaded", function () {
+        let options = {
+          selector: '#tinymce',
+          height: 300,
+          menubar: false,
+          statusbar: false,
+          plugins: [
+            'advlist autolink lists link image charmap print preview anchor',
+            'searchreplace visualblocks code fullscreen',
+            'insertdatetime media table paste code help wordcount'
+          ],
+          toolbar: 'undo redo | formatselect | ' +
+            'bold italic backcolor | alignleft aligncenter ' +
+            'alignright alignjustify | bullist numlist outdent indent | ' +
+            'removeformat',
+          content_style: 'body { font-family: -apple-system, BlinkMacSystemFont, San Francisco, Segoe UI, Roboto, Helvetica Neue, sans-serif; font-size: 14px; -webkit-font-smoothing: antialiased; }'
+        }
+        if (localStorage.getItem("tablerTheme") === 'dark') {
+          options.skin = 'oxide-dark';
+          options.content_css = 'dark';
         }
-        $$.getElementById('submit').addEventListener('click', submit);
+        tinyMCE.init(options);
+      })
+      // @formatter:on
+    </script>
+
+    $("#save-ann").click(function() {
+        $.ajax({
+            url: '/announcement/' + {$ann->id},
+            type: 'PUT',
+            dataType: "json",
+            data: {
+                content: tinyMCE.activeEditor.getContent(),
+            },
+            success: function(data) {
+                if (data.ret == 1) {
+                    $('#success-message').text(data.msg);
+                    $('#success-dialog').modal('show');
+                    window.setTimeout("location.href=top.document.referrer", {$config['jump_delay']});
+                } else {
+                    $('#fail-message').text(data.msg);
+                    $('#fail-dialog').modal('show');
+                }
+            }
+        })
     });
-</script>
+</script>
+
+{include file='admin/tabler_footer.tpl'}

+ 116 - 83
resources/views/tabler/admin/announcement/index.tpl

@@ -1,98 +1,131 @@
-{include file='admin/main.tpl'}
+{include file='admin/tabler_header.tpl'}
 
-<main class="content">
-    <div class="content-header ui-content-header">
-        <div class="container">
-            <h1 class="content-heading">公告管理</h1>
-        </div>
-    </div>
-    <div class="container">
-        <div class="col-lg-12 col-md-12">
-            <section class="content-inner margin-top-no">
-
-                <div class="card">
-                    <div class="card-main">
-                        <div class="card-inner">
-                            <p>系统中所有公告。</p>
-                            <p>显示表项:
-                                {include file='table/checkbox.tpl'}
-                            </p>
-                        </div>
+<div class="page-wrapper">
+    <div class="container-xl">
+        <div class="page-header d-print-none text-white">
+            <div class="row align-items-center">
+                <div class="col">
+                    <h2 class="page-title">
+                        <span class="home-title my-3">公告管理</span>
+                    </h2>
+                    <div class="page-pretitle">
+                        <span class="home-subtitle">查看并管理站点中的公告</span>
                     </div>
                 </div>
-                <div class="table-responsive">
-                    {include file='table/table.tpl'}
-                </div>
-                <div class="fbtn-container">
-                    <div class="fbtn-inner">
-                        <a class="fbtn fbtn-lg fbtn-brand-accent waves-attach waves-circle waves-light"
-                           href="/admin/announcement/create">+</a>
+                <div class="col-auto ms-auto d-print-none">
+                    <div class="btn-list">
+                        <a href="/admin/announcement/create" class="btn btn-primary">
+                            <i class="icon ti ti-plus"></i>
+                            创建
+                        </a>
                     </div>
                 </div>
-                <div aria-hidden="true" class="modal modal-va-middle fade" id="delete_modal" role="dialog"
-                     tabindex="-1">
-                    <div class="modal-dialog modal-xs">
-                        <div class="modal-content">
-                            <div class="modal-heading">
-                                <a class="modal-close" data-dismiss="modal">×</a>
-                                <h2 class="modal-title">确认要删除?</h2>
-                            </div>
-                            <div class="modal-inner">
-                                <p>请您确认。</p>
-                            </div>
-                            <div class="modal-footer">
-                                <p class="text-right">
-                                    <button class="btn btn-flat btn-brand-accent waves-attach waves-effect"
-                                            data-dismiss="modal" type="button">取消
-                                    </button>
-                                    <button class="btn btn-flat btn-brand-accent waves-attach" data-dismiss="modal"
-                                            id="delete_input" type="button">确定
-                                    </button>
-                                </p>
-                            </div>
+            </div>
+        </div>
+    </div>
+    <div class="page-body">
+        <div class="container-xl">
+            <div class="row row-deck row-cards">
+                <div class="col-12">
+                    <div class="card">
+                        <div class="table-responsive">
+                            <table id="data_table" class="table card-table table-vcenter text-nowrap datatable">
+                                <thead>
+                                    <tr>
+                                        {foreach $details['field'] as $key => $value}
+                                            <th>{$value}</th>
+                                        {/foreach}
+                                    </tr>
+                                </thead>
+                            </table>
                         </div>
                     </div>
                 </div>
-                {include file='dialog.tpl'}
-            </section>
+            </div>
         </div>
     </div>
-</main>
 
-{include file='admin/footer.tpl'}
-
-<script>
-    function delete_modal_show(id) {
-        deleteid = id;
-        $("#delete_modal").modal();
-    }
-    {include file='table/js_1.tpl'}
-    window.addEventListener('load', () => {
-        {include file='table/js_2.tpl'}
-        function delete_id() {
-            $.ajax({
-                type: "DELETE",
-                url: "/admin/announcement",
-                dataType: "json",
-                data: {
-                    id: deleteid
+    <script>
+        var table = $('#data_table').DataTable({
+            ajax: {
+                url: '/admin/announcement/ajax',
+                type: 'POST',
+                dataSrc: 'anns'
+            },
+            "autoWidth":false,
+            'iDisplayLength': 10,
+            'scrollX': true,
+            'order': [
+                [1, 'asc']
+            ],
+            columns: [
+                {foreach $details['field'] as $key => $value}
+                { data: '{$key}' },
+                {/foreach}
+            ],
+            "columnDefs":[
+                { targets:[0],orderable:false }
+            ],
+            "dom": "<'row px-3 py-3'<'col-sm-12 col-md-6'l><'col-sm-12 col-md-6'f>>" +
+                "<'row'<'col-sm-12'tr>>" +
+                "<'row card-footer d-flex d-flexalign-items-center'<'col-sm-12 col-md-5'i><'col-sm-12 col-md-7'p>>",
+            language: {
+                "sProcessing": "处理中...",
+                "sLengthMenu": "显示 _MENU_ 条",
+                "sZeroRecords": "没有匹配结果",
+                "sInfo": "第 _START_ 至 _END_ 项结果,共 _TOTAL_项",
+                "sInfoEmpty": "第 0 至 0 项结果,共 0 项",
+                "sInfoFiltered": "(在 _MAX_ 项中查找)",
+                "sInfoPostFix": "",
+                "sSearch": "<i class=\"ti ti-search\"></i> ",
+                "sUrl": "",
+                "sEmptyTable": "表中数据为空",
+                "sLoadingRecords": "载入中...",
+                "sInfoThousands": ",",
+                "oPaginate": {
+                    "sFirst": "首页",
+                    "sPrevious": "<i class=\"titi-arrow-left\"></i>",
+                    "sNext": "<i class=\"ti ti-arrow-right\"><i>",
+                    "sLast": "末页"
                 },
-                success: data => {
-                    if (data.ret) {
-                        $("#result").modal();
-                        $$.getElementById('msg').innerHTML = data.msg;
-                        {include file='table/js_delete.tpl'}
-                    } else {
-                        $("#result").modal();
-                        $$.getElementById('msg').innerHTML = data.msg;
-                    }
-                },
-                error: jqXHR => {
-                    $("#result").modal();
-                    $$.getElementById('msg').innerHTML = `${ldelim}data.msg{rdelim} 发生错误了。`;
+                "oAria": {
+                    "sSortAscending": ": 以升序排列此列",
+                    "sSortDescending": ": 以降序排列此列"
                 }
+            },
+        });
+
+        function loadTable() {
+            table;
+        }
+
+        function deleteAnn(ann_id) {
+            $('#notice-message').text('确定删除此公告?');
+            $('#notice-dialog').modal('show');
+            $('#notice-confirm').on('click', function() {
+                $.ajax({
+                    url: "/admin/announcement/" + ann_id,
+                    type: 'DELETE',
+                    dataType: "json",
+                    success: function(data) {
+                        if (data.ret == 1) {
+                            $('#success-message').text(data.msg);
+                            $('#success-dialog').modal('show');
+                            reloadTableAjax();
+                        } else {
+                            $('#fail-message').text(data.msg);
+                            $('#fail-dialog').modal('show');
+                        }
+                    }
+                })
             });
+        };
+
+        function reloadTableAjax() {
+            table.ajax.reload(null, false);
         }
-        $$.getElementById('delete_input').addEventListener('click', delete_id);
-    })
-</script>
+
+        loadTable();
+    </script>
+
+{include file='admin/tabler_footer.tpl'}

+ 1 - 4
resources/views/tabler/admin/node/create.tpl

@@ -17,13 +17,10 @@
                 </div>
                 <div class="col-auto ms-auto d-print-none">
                     <div class="btn-list">
-                        <a id="create-node" href="#" class="btn btn-primary d-none d-sm-inline-block">
+                        <a id="create-node" href="#" class="btn btn-primary">
                             <i class="icon ti ti-device-floppy"></i>
                             保存
                         </a>
-                        <a id="create-node" href="#" class="btn btn-primary d-sm-none btn-icon">
-                            <i class="icon ti ti-device-floppy"></i>
-                        </a>
                     </div>
                 </div>
             </div>

+ 1 - 4
resources/views/tabler/admin/node/edit.tpl

@@ -17,13 +17,10 @@
                 </div>
                 <div class="col-auto ms-auto d-print-none">
                     <div class="btn-list">
-                        <a id="save-node" href="#" class="btn btn-primary d-none d-sm-inline-block">
+                        <a id="save-node" href="#" class="btn btn-primary">
                             <i class="icon ti ti-device-floppy"></i>
                             保存
                         </a>
-                        <a id="save-node" href="#" class="btn btn-primary d-sm-none btn-icon">
-                            <i class="icon ti ti-device-floppy"></i>
-                        </a>
                     </div>
                 </div>
             </div>

+ 1 - 4
resources/views/tabler/admin/node/index.tpl

@@ -16,13 +16,10 @@
                 </div>
                 <div class="col-auto ms-auto d-print-none">
                     <div class="btn-list">
-                        <a href="/admin/node/create" class="btn btn-primary d-none d-sm-inline-block">
+                        <a href="/admin/node/create" class="btn btn-primary">
                             <i class="icon ti ti-plus"></i>
                             创建
                         </a>
-                        <a href="/admin/node/create" class="btn btn-primary d-sm-none btn-icon">
-                            <i class="icon ti ti-plus"></i>
-                        </a>
                     </div>
                 </div>
             </div>

+ 29 - 40
src/Controllers/Admin/AnnController.php

@@ -7,13 +7,26 @@ namespace App\Controllers\Admin;
 use App\Controllers\BaseController;
 use App\Models\Ann;
 use App\Models\User;
-use App\Utils\ResponseHelper;
 use App\Utils\Telegram;
 use Slim\Http\Request;
 use Slim\Http\Response;
 
 final class AnnController extends BaseController
 {
+    public static $details =
+    [
+        'field' => [
+            'op' => '操作',
+            'id' => '公告ID',
+            'date' => '日期',
+            'content' => '公告内容',
+        ],
+    ];
+
+    public static $update_field = [
+        'email_notify_class',
+    ];
+
     /**
      * 后台公告页面
      *
@@ -23,12 +36,7 @@ final class AnnController extends BaseController
     {
         return $response->write(
             $this->view()
-                ->assign('table_config', ResponseHelper::buildTableConfig([
-                    'op' => '操作',
-                    'id' => 'ID',
-                    'date' => '日期',
-                    'content' => '内容',
-                ], 'announcement/ajax'))
+                ->assign('details', self::$details)
                 ->display('admin/announcement/index.tpl')
         );
     }
@@ -40,33 +48,16 @@ final class AnnController extends BaseController
      */
     public function ajax(Request $request, Response $response, array $args)
     {
-        $query = Ann::getTableDataFromAdmin(
-            $request,
-            static function (&$order_field): void {
-                if (\in_array($order_field, ['op'])) {
-                    $order_field = 'id';
-                }
-            }
-        );
+        $anns = Ann::orderBy('id', 'asc')->get();
 
-        $data = [];
-        foreach ($query['datas'] as $value) {
-            /** @var Ann $value */
-
-            $tempdata = [];
-            $tempdata['op'] = '<a class="btn btn-brand" href="/admin/announcement/' . $value->id . '/edit">编辑</a> <a class="btn btn-brand-accent" id="delete" value="' . $value->id . '" href="javascript:void(0);" onClick="delete_modal_show(\'' . $value->id . '\')">删除</a>';
-            $tempdata['id'] = $value->id;
-            $tempdata['date'] = $value->date;
-            $tempdata['content'] = $value->content;
-
-            $data[] = $tempdata;
+        foreach ($anns as $ann) {
+            $ann->op = '<button type="button" class="btn btn-red" id="delete-announcement" 
+            onclick="deleteAnn(' . $ann->id . ')">删除</button>
+            <a class="btn btn-blue" href="/admin/announcement/' . $ann->id . '/edit">编辑</a>';
         }
 
         return $response->withJson([
-            'draw' => $request->getParam('draw'),
-            'recordsTotal' => Ann::count(),
-            'recordsFiltered' => $query['count'],
-            'data' => $data,
+            'anns' => $anns,
         ]);
     }
 
@@ -79,6 +70,7 @@ final class AnnController extends BaseController
     {
         return $response->write(
             $this->view()
+                ->assign('update_field', self::$update_field)
                 ->display('admin/announcement/create.tpl')
         );
     }
@@ -90,17 +82,15 @@ final class AnnController extends BaseController
      */
     public function add(Request $request, Response $response, array $args)
     {
-        $vip = (int) $request->getParam('vip');
-        $page = (int) $request->getParam('page');
-        $issend = (int) $request->getParam('issend');
+        $email_notify_class = (int) $request->getParam('email_notify_class');
+        $email_notify = (int) $request->getParam('email_notify');
         $content = (string) $request->getParam('content');
         $subject = $_ENV['appName'] . ' - 公告';
 
-        if ($page === 1) {
+        if ($content !== '') {
             $ann = new Ann();
             $ann->date = date('Y-m-d H:i:s');
             $ann->content = $content;
-            $ann->markdown = $request->getParam('markdown');
 
             if (! $ann->save()) {
                 return $response->withJson([
@@ -109,8 +99,8 @@ final class AnnController extends BaseController
                 ]);
             }
         }
-        if ($issend === 1) {
-            $users = User::where('class', '>=', $vip)
+        if ($email_notify === 1) {
+            $users = User::where('class', '>=', $email_notify_class)
                 ->get();
 
             foreach ($users as $user) {
@@ -133,7 +123,7 @@ final class AnnController extends BaseController
 
         return $response->withJson([
             'ret' => 1,
-            'msg' => $issend === 1 ? '公告添加成功,邮件发送成功' : '公告添加成功',
+            'msg' => $email_notify === 1 ? '公告添加成功,邮件发送成功' : '公告添加成功',
         ]);
     }
 
@@ -161,7 +151,6 @@ final class AnnController extends BaseController
     {
         $ann = Ann::find($args['id']);
         $ann->content = $request->getParam('content');
-        $ann->markdown = $request->getParam('markdown');
         $ann->date = date('Y-m-d H:i:s');
         if (! $ann->save()) {
             return $response->withJson([
@@ -183,7 +172,7 @@ final class AnnController extends BaseController
      */
     public function delete(Request $request, Response $response, array $args)
     {
-        $ann = Ann::find($request->getParam('id'));
+        $ann = Ann::find($args['id']);
         if (! $ann->delete()) {
             return $response->withJson([
                 'ret' => 0,

+ 2 - 2
src/Controllers/UserController.php

@@ -890,8 +890,8 @@ final class UserController extends BaseController
 
         $user->method = $method;
         $user->save();
-        
-        return ResponseHelper::successfully($response, '修改成功');;
+
+        return ResponseHelper::successfully($response, '修改成功');
     }
 
     /**