|
37 | 37 | </div> |
38 | 38 | </div> |
39 | 39 | <div class="card-body"> |
| 40 | + <div class="alert alert-info" role="alert">注📢: 勾选"拉取失败时仅保存网址"功能对应行背景色高亮, 记得点击编辑修改呦!</div> |
40 | 41 | <div class="table-responsive"> |
41 | | - <table class="table table-bordered"> |
| 42 | + <table class="table table-bordered" id="siteTable"> |
42 | 43 | <thead> |
43 | 44 | <tr> |
44 | 45 | <th>ID</th> |
|
56 | 57 | <tbody class="tbody"></tbody> |
57 | 58 | </table> |
58 | 59 | </div> |
59 | | - <ul class="pagination"> |
60 | | - <ul class="pagination" id="paginationDiv"></ul> |
61 | | - </ul> |
| 60 | + <ul class="pagination" id="paginationDiv"></ul> |
62 | 61 | </div> |
63 | 62 | </div> |
64 | 63 | </div> |
|
80 | 79 | $(document).ready(function () { |
81 | 80 | // 加载分类选项 |
82 | 81 | loadCategories(); |
83 | | - |
84 | 82 | // 监听分类选择器的变化 |
85 | 83 | $(document).on('change', '#category-filter', function () { |
86 | 84 | const categoryId = $(this).val(); // 获取选中的分类ID |
87 | 85 | const searchKeyword = $("#search-keyword").val(); // 获取搜索关键字 |
88 | 86 | getPageListData(1, 10, searchKeyword, categoryId); // 重新加载数据 |
89 | 87 | }); |
90 | | - |
91 | 88 | // 加载列表页数据 |
92 | 89 | getPageListData(); |
93 | 90 |
|
|
126 | 123 | "GET", |
127 | 124 | url, |
128 | 125 | {page: page, page_size: page_size, search: search, category_id: category_id}, |
129 | | - function () {}, |
| 126 | + function () { |
| 127 | + }, |
130 | 128 | function (data) { |
131 | 129 | if (data.list.length > 0) { |
132 | 130 | var totalNum = data.pagination.total; // 总条数 |
|
150 | 148 | }); |
151 | 149 | $(".tbody").html(""); |
152 | 150 | $.each(data.list, function (index, value) { |
153 | | - var showUsedBadge = ""; |
154 | | - var optionUsedName = ""; |
| 151 | + let showUsedBadge; |
| 152 | + let optionUsedName; |
155 | 153 | if (value.is_used) { |
156 | 154 | optionUsedName = '禁用'; |
157 | 155 | showUsedBadge = '<span class="badge badge-success">启用</span></td>' |
158 | 156 | } else { |
159 | 157 | optionUsedName = '启用'; |
160 | 158 | showUsedBadge = '<span class="badge badge-danger">禁用</span></td>' |
161 | 159 | } |
162 | | - const tr = '<tr>' + |
| 160 | + |
| 161 | + let trHtml = '<tr>'; |
| 162 | + if (value.url === value.title) { // 如果url和title相同,则显示警告样式 |
| 163 | + trHtml = '<tr class="table-warning">' |
| 164 | + } |
| 165 | + |
| 166 | + const tr = trHtml + |
163 | 167 | '<td>' + value.id + '</td>' + |
164 | | - '<td><img class="lozad img-circle" width="30" src="data:image/png;base64,' + value.thumb + '" data-loaded="true"></td>' + |
| 168 | + '<td><img class="lozad img-circle" width="30" src="data:image/png;base64,' + value.icon + '" data-loaded="true"></td>' + |
165 | 169 | '<td>' + value.title + '</td>' + |
166 | 170 | '<td><a href="' + value.url + '" target="_blank">' + value.url + '</a></td>' + |
167 | 171 | '<td>' + value.category + '</td>' + |
|
212 | 216 | } |
213 | 217 | ); |
214 | 218 | } |
| 219 | + |
215 | 220 | // 一键同步 |
216 | 221 | $(document).on('click', '.btn-sync', function () { |
217 | 222 | const id = $(this).attr('data-id'); |
|
232 | 237 | "GET", |
233 | 238 | '/api/admin/site/sync/' + id, |
234 | 239 | "", |
235 | | - function () {}, |
| 240 | + function () { |
| 241 | + }, |
236 | 242 | function (data) { |
237 | 243 | $.alert({ |
238 | 244 | title: '操作成功', |
|
434 | 440 | '</div>' + |
435 | 441 | '<div>' + |
436 | 442 | ' <label>排序</label>' + |
437 | | - ' <small class="help-block">(相同分类下网站排序)</small>'+ |
| 443 | + ' <small class="help-block">(相同分类下网站排序)</small>' + |
438 | 444 | ' <input autofocus="" type="number" placeholder="请输入排序值" class="form-control" id="sort_order" value="' + sort + '">' + <!-- 新增排序输入框 --> |
439 | 445 | '</div>', |
440 | 446 | onOpen: function () { |
|
454 | 460 | "GET", |
455 | 461 | "/api/admin/category", |
456 | 462 | "", |
457 | | - function () {}, |
| 463 | + function () { |
| 464 | + }, |
458 | 465 | function (data) { |
459 | 466 | const treeData = buildTree(data.list);// 将扁平化数据转换为树形结构 |
460 | 467 | const selectElement = document.getElementById('category_id');// 获取 <select> 元素 |
|
554 | 561 | </script> |
555 | 562 | <script> |
556 | 563 | $(document).ready(function () { |
557 | | - // 导出按钮点击事件 |
558 | 564 | $(document).on('click', '#exportBtn', function () { |
559 | | - // 获取搜索关键字 |
560 | 565 | const searchKeyword = $("#search-keyword").val(); |
561 | | - // 发起导出请求 |
562 | | - exportData(searchKeyword); |
| 566 | + exportData(searchKeyword); // 发起导出请求 |
563 | 567 | }); |
564 | | - // 导出数据函数 |
| 568 | + |
565 | 569 | function exportData(searchKeyword) { |
566 | | - // 构造请求 URL |
567 | 570 | let url = "/api/admin/site/export"; |
568 | 571 | if (searchKeyword) { |
569 | 572 | url += "?search=" + encodeURIComponent(searchKeyword); |
|
576 | 579 | responseType: 'blob' // 重要:告诉 jQuery 返回的是一个二进制文件 |
577 | 580 | }, |
578 | 581 | success: function (data, status, xhr) { |
579 | | - // 获取文件名(从响应头中提取) |
580 | | - const contentDisposition = xhr.getResponseHeader('Content-Disposition'); |
| 582 | + const contentDisposition = xhr.getResponseHeader('Content-Disposition');// 获取文件名(从响应头中提取) |
581 | 583 | let fileName = "sites.xlsx"; // 默认文件名 |
582 | 584 | if (contentDisposition && contentDisposition.includes('filename=')) { |
583 | 585 | fileName = contentDisposition.split('filename=')[1].trim(); |
584 | 586 | } |
585 | | - // 创建一个链接元素 |
586 | 587 | const link = document.createElement('a'); |
587 | 588 | link.href = window.URL.createObjectURL(data); // 将文件流转换为 URL |
588 | 589 | link.download = fileName; // 设置下载文件名 |
|
0 commit comments