Administrator
5 hours ago f1cf8741bad27ff99e644ad9cfa5458c78d79501
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
<div class="layui-fluid layui-anim febs-anim" id="firewall-country-rule-list" lay-title="防火墙国家规则管理">
    <div class="layui-row febs-container">
        <div class="layui-col-md12">
            <div class="layui-card">
                <div class="layui-card-body febs-table-full">
                    <form class="layui-form layui-table-form" lay-filter="firewall-rule-table-form">
                        <div class="layui-row">
                            <div class="layui-col-md10">
                                <div class="layui-form-item">
                                    <button class="layui-btn layui-btn-normal" type="button" id="add-btn">
                                        <i class="layui-icon">&#xe654;</i> 新增规则
                                    </button>
                                </div>
                            </div>
                            <div class="layui-col-md2 layui-col-sm12 layui-col-xs12 table-action-area">
                                <div class="layui-btn layui-btn-sm layui-btn-primary febs-button-green-plain table-action" id="reset">
                                    <i class="layui-icon">&#xe79b;</i>
                                </div>
                            </div>
                        </div>
                        <div class="layui-row">
                            <div class="layui-col-md3">
                                <div class="layui-form-item">
                                    <label class="layui-form-label">选择站点</label>
                                    <div class="layui-input-block">
                                        <select id="filter-site-id" name="siteId" lay-filter="filter-site" lay-search="">
                                            <option value="">全部站点</option>
                                        </select>
                                    </div>
                                </div>
                            </div>
                        </div>
                    </form>
                    <table lay-filter="firewallRuleTable" lay-data="{id: 'firewallRuleTable'}"></table>
                </div>
            </div>
        </div>
    </div>
</div>
<!-- 表格操作栏 -->
<script type="text/html" id="firewall-rule-option">
    <a lay-event="edit"><i class="layui-icon febs-edit-area febs-blue">&#xe7a5;</i></a>
    <a lay-event="del"><i class="layui-icon febs-edit-area febs-red">&#xe640;</i></a>
</script>
<style>
    .layui-form-label { width: 110px; }
    .layui-form-item .layui-input-block { margin-left: 140px; }
</style>
<script data-th-inline="none" type="text/javascript">
    layui.use(['jquery', 'form', 'table', 'febs'], function () {
        var $ = layui.jquery,
            febs = layui.febs,
            form = layui.form,
            table = layui.table,
            layer = layui.layer,
            $view = $('#firewall-country-rule-list'),
            $reset = $view.find('#reset'),
            $addBtn = $view.find('#add-btn'),
            tableIns;
 
        form.render();
        loadSiteFilter();
        initTable();
 
        // 加载站点下拉选项
        function loadSiteFilter() {
            febs.get(ctx + 'admin/firewall/sites', null, function (res) {
                var sites = res.data || [];
                var $select = $('#filter-site-id');
                sites.forEach(function (s) {
                    $select.append('<option value="' + s.id + '">' + s.siteName + ' (' + s.domain + ')</option>');
                });
                form.render('select');
            });
        }
 
        // 站点筛选切换
        form.on('select(filter-site)', function () {
            tableIns.reload();
        });
 
        // 表格操作
        table.on('tool(firewallRuleTable)', function (obj) {
            var data = obj.data,
                layEvent = obj.event;
            if (layEvent === 'edit') {
                openEditModal(data);
            } else if (layEvent === 'del') {
                layer.confirm('确定删除 <b>' + data.countryName + ' (' + data.countryCode + ')</b> 的规则吗?<br>删除后会自动更新Nginx配置!', function (index) {
                    febs.get(ctx + 'admin/firewall/countryRule/delete/' + data.id, null, function () {
                        layer.close(index);
                        febs.alert.success('删除成功,Nginx配置已更新');
                        tableIns.reload();
                    });
                });
            }
        });
 
        // 新增按钮
        $addBtn.on('click', function () {
            openEditModal(null);
        });
 
        // 刷新按钮
        $reset.on('click', function () {
            tableIns.reload();
        });
 
        // 初始化表格
        function initTable() {
            tableIns = febs.table.init({
                elem: $view.find('table'),
                id: 'firewallRuleTable',
                url: ctx + 'admin/firewall/countryRuleList',
                where: function () {
                    var siteId = $('#filter-site-id').val();
                    return siteId ? { siteId: siteId } : {};
                },
                cols: [[
                    {field: 'id', title: 'ID', width: 60, align: 'center'},
                    {field: 'siteId', title: '站点ID', width: 80, align: 'center'},
                    {field: 'countryCode', title: '国家编码', width: 110, align: 'center'},
                    {field: 'countryName', title: '国家名称', width: 130, align: 'center'},
                    {field: 'enabled', title: '状态', width: 90, align: 'center',
                        templet: function (d) {
                            return d.enabled === 1
                                ? '<span style="color:#5FB878;">● 启用</span>'
                                : '<span style="color:#999;">● 禁用</span>';
                        }
                    },
                    {title: '操作', templet: '#firewall-rule-option', width: 120, align: 'center'},
                    {field: 'createdTime', title: '创建时间', width: 170, align: 'center'},
                ]]
            });
        }
 
        // 打开编辑弹窗
        function openEditModal(data) {
            var title = data ? '编辑国家规则' : '新增国家规则';
            var siteIdVal = data ? 'value="' + data.siteId + '"' : '';
 
            var html = '<div style="padding:20px 25px 0 0;">' +
                '<form class="layui-form" lay-filter="firewall-rule-form">' +
                (data ? '<div class="layui-form-item febs-hide"><label class="layui-form-label">ID</label><div class="layui-input-block"><input type="text" name="id" value="' + data.id + '"></div></div>' : '') +
                '  <div class="layui-form-item">' +
                '    <label class="layui-form-label febs-form-item-require">所属站点</label>' +
                '    <div class="layui-input-block">' +
                '      <select name="siteId" lay-verify="required" lay-search="" data-value="' + (data ? data.siteId : '') + '">' +
                '        <option value="">请选择站点</option>' +
                '      </select>' +
                '    </div>' +
                '  </div>' +
                '  <div class="layui-form-item">' +
                '    <label class="layui-form-label febs-form-item-require">国家编码</label>' +
                '    <div class="layui-input-block">' +
                '      <input type="text" name="countryCode" class="layui-input" ' + (data ? 'value="' + data.countryCode + '"' : 'placeholder="ISO国家编码,如CN/US/JP"') + ' lay-verify="required">' +
                '      <div class="layui-form-mid layui-word-aux">ISO 3166-1 alpha-2编码,如BR/US/JP</div>' +
                '    </div>' +
                '  </div>' +
                '  <div class="layui-form-item">' +
                '    <label class="layui-form-label febs-form-item-require">国家名称</label>' +
                '    <div class="layui-input-block">' +
                '      <input type="text" name="countryName" class="layui-input" ' + (data ? 'value="' + (data.countryName || '') + '"' : 'placeholder="中文名或英文名"') + ' lay-verify="required">' +
                '    </div>' +
                '  </div>' +
                '  <div class="layui-form-item">' +
                '    <label class="layui-form-label">状态</label>' +
                '    <div class="layui-input-block">' +
                '      <input type="radio" name="enabled" value="1" title="启用" ' + (!data || data.enabled === 1 ? 'checked' : '') + '>' +
                '      <input type="radio" name="enabled" value="0" title="禁用" ' + (data && data.enabled === 0 ? 'checked' : '') + '>' +
                '    </div>' +
                '  </div>' +
                '</form></div>';
 
            var layerIndex = layer.open({
                type: 1,
                title: title,
                area: ['520px', '400px'],
                content: html,
                success: function (layero) {
                    // 加载弹窗中的站点下拉
                    var $popupSelect = $(layero).find('select[name="siteId"]');
                    febs.get(ctx + 'admin/firewall/sites', null, function (res) {
                        var sites = res.data || [];
                        var preselected = data ? data.siteId : '';
                        sites.forEach(function (s) {
                            var sel = s.id == preselected ? ' selected' : '';
                            $popupSelect.append('<option value="' + s.id + '"' + sel + '>' + s.siteName + ' (' + s.domain + ')</option>');
                        });
                        form.render('select');
                    });
                    form.render('radio', 'firewall-rule-form');
                },
                btn: ['保存', '取消'],
                yes: function (index, layero) {
                    var formObj = $(layero).find('form');
                    var formData = form.val("firewall-rule-form");
                    if (!formData.siteId) {
                        layer.msg('请选择站点', {icon: 2});
                        return;
                    }
                    if (!formData.countryCode) {
                        layer.msg('请输入国家编码', {icon: 2});
                        return;
                    }
                    if (!formData.countryName) {
                        layer.msg('请输入国家名称', {icon: 2});
                        return;
                    }
                    febs.post(ctx + 'admin/firewall/countryRule/save', formData, function (res) {
                        layer.close(index);
                        febs.alert.success('保存成功,Nginx配置已自动更新');
                        tableIns.reload();
                    });
                },
                btn2: function () {
                    layer.closeAll();
                }
            });
        }
    });
</script>