feat: 外观专利改直连 LLM(DeepSeek/Gemini)、无效ASIN菜单更名 BRAND_DB、紫鸟店铺索引场景化
Build Backend JAR / build (push) Has been cancelled
Build Backend JAR / build (push) Has been cancelled
- AppearancePatent:Coze 工作流切换为 llm-host 直连模型(title/appearance 双模型、行并发、重试),配置键迁移并保留旧环境变量兜底 - InvalidAsinDataMapper 补充按值+品牌唯一键查询 - ZiniaoShopIndexService 新增店铺分类/索引场景 - V98:无效ASIN菜单 rename 补充 BRAND_DB;docs 架构优化规划 - 配套单测更新
This commit is contained in:
+58
-3
@@ -2777,7 +2777,7 @@
|
||||
document.getElementById('editDedupeTotalDataModal').classList.remove('show');
|
||||
};
|
||||
|
||||
// ========== 不符合ASIN数据 ==========
|
||||
// ========== 品牌数据库 ==========
|
||||
var invalidAsinDataPage = 1, invalidAsinDataPageSize = 15;
|
||||
function buildInvalidAsinDataQuery(page) {
|
||||
var q = 'page=' + (page || 1) + '&page_size=' + invalidAsinDataPageSize;
|
||||
@@ -3128,11 +3128,40 @@
|
||||
function renderShopPasswordCell(item) {
|
||||
var maskedPassword = item.password || '******';
|
||||
return '<span class="shop-password-cell">' +
|
||||
'<span class="shop-password-value" data-shop-password-value>' + escapeHtml(maskedPassword) + '</span>' +
|
||||
'<span class="shop-password-value" data-shop-password-value title="' + escapeHtml(maskedPassword) + '">' + escapeHtml(maskedPassword) + '</span>' +
|
||||
'<button type="button" class="shop-password-toggle" data-shop-password-toggle="' + escapeHtml(item.id) + '" data-shop-name="' + escapeHtml(item.shop_name || '') + '" data-masked-password="' + escapeHtml(maskedPassword) + '" aria-label="显示密码" aria-pressed="false" title="显示密码">' +
|
||||
shopPasswordIcon(false) + '</button></span>';
|
||||
}
|
||||
|
||||
function renderShopCheckBadge(check) {
|
||||
if (!check) return '';
|
||||
var map = {
|
||||
'SUCCESS': ['ok', '密码正确'],
|
||||
'FAILED': ['bad', '密码错误'],
|
||||
'RUNNING': ['run', '检测中'],
|
||||
'PENDING': ['wait', '等待客户端'],
|
||||
'NO_NEED_LOGIN': ['warn', '已登录态'],
|
||||
'ERROR': ['bad', '检测异常']
|
||||
};
|
||||
var entry = map[check.status] || ['wait', check.status || '未知'];
|
||||
var tipText = [check.status, check.detail, check.check_finished_at].filter(Boolean).join(' · ');
|
||||
return '<div class="shop-check-badge ' + entry[0] + '" title="' + escapeHtml(tipText) + '">' + escapeHtml(entry[1]) + '</div>';
|
||||
}
|
||||
|
||||
var shopCheckPollTimer = null;
|
||||
function startShopCheckPolling() {
|
||||
if (shopCheckPollTimer) return;
|
||||
var ticks = 0;
|
||||
shopCheckPollTimer = setInterval(function () {
|
||||
ticks += 1;
|
||||
loadShopManage(shopManagePage);
|
||||
if (ticks >= 9) {
|
||||
clearInterval(shopCheckPollTimer);
|
||||
shopCheckPollTimer = null;
|
||||
}
|
||||
}, 20000);
|
||||
}
|
||||
|
||||
function renderShopTableText(value, fallback) {
|
||||
var text = String(value == null ? '' : value).trim();
|
||||
var shown = text || fallback || '-';
|
||||
@@ -3162,11 +3191,12 @@
|
||||
'<td class="shop-col-mall">' + renderShopTableText(item.mall_name) + '</td>' +
|
||||
'<td class="shop-col-automation">' + renderShopTableText(item.zn_username) + '</td>' +
|
||||
'<td class="shop-col-account">' + renderShopTableText(item.account) + '</td>' +
|
||||
'<td class="shop-col-password">' + renderShopPasswordCell(item) + '</td>' +
|
||||
'<td class="shop-col-password">' + renderShopPasswordCell(item) + renderShopCheckBadge(item.latest_check) + '</td>' +
|
||||
'<td class="shop-col-created">' + renderShopTableText(item.created_at) + '</td>' +
|
||||
'<td class="shop-col-updated">' + renderShopTableText(item.updated_at) + '</td>' +
|
||||
'<td class="shop-col-actions">' +
|
||||
'<button type="button" class="btn btn-sm" data-shop-manage-edit="' + escapeHtml(item.id) + '" data-shop-manage="' + (JSON.stringify(item).replace(/"/g, '"')) + '">编辑</button> ' +
|
||||
'<button type="button" class="btn btn-sm btn-check" data-shop-credential-check="' + escapeHtml(item.id) + '" data-shop-check-name="' + escapeHtml(item.shop_name || '') + '">检测密码</button> ' +
|
||||
'<button type="button" class="btn btn-sm btn-danger" data-shop-manage-delete="' + escapeHtml(item.id) + '" data-shop-manage-name="' + escapeHtml(item.shop_name || '') + '">删除</button>' +
|
||||
'</td></tr>';
|
||||
}).join('');
|
||||
@@ -3186,6 +3216,7 @@
|
||||
var revealed = btn.dataset.revealed === 'true';
|
||||
if (revealed) {
|
||||
valueEl.textContent = btn.dataset.maskedPassword || '******';
|
||||
valueEl.title = btn.dataset.maskedPassword || '******';
|
||||
btn.dataset.revealed = 'false';
|
||||
btn.setAttribute('aria-label', '显示密码');
|
||||
btn.setAttribute('aria-pressed', 'false');
|
||||
@@ -3201,6 +3232,7 @@
|
||||
.then(function (res) {
|
||||
if (!res.success) throw new Error(res.error || '读取密码失败');
|
||||
valueEl.textContent = res.password || '';
|
||||
valueEl.title = res.password || '';
|
||||
btn.dataset.revealed = 'true';
|
||||
btn.setAttribute('aria-label', '隐藏密码');
|
||||
btn.setAttribute('aria-pressed', 'true');
|
||||
@@ -3245,6 +3277,29 @@
|
||||
});
|
||||
};
|
||||
});
|
||||
document.querySelectorAll('[data-shop-credential-check]').forEach(function (btn) {
|
||||
btn.onclick = function () {
|
||||
var name = (btn.dataset.shopCheckName || '').replace(/"/g, '"');
|
||||
btn.disabled = true;
|
||||
btn.textContent = '已提交...';
|
||||
fetch('/api/admin/shop-manage/' + encodeURIComponent(btn.dataset.shopCredentialCheck) + '/credential-check?shop_name=' + encodeURIComponent(name), { method: 'POST' })
|
||||
.then(function (r) { return r.json(); })
|
||||
.then(function (res) {
|
||||
if (res.success) {
|
||||
alert(res.msg || '检测任务已创建,客户端将在 1 分钟内执行');
|
||||
startShopCheckPolling();
|
||||
loadShopManage(shopManagePage);
|
||||
} else {
|
||||
alert(res.error || '发起检测失败');
|
||||
}
|
||||
})
|
||||
.catch(function () { alert('发起检测失败'); })
|
||||
.finally(function () {
|
||||
btn.disabled = false;
|
||||
btn.textContent = '检测密码';
|
||||
});
|
||||
};
|
||||
});
|
||||
}
|
||||
|
||||
function getInvalidAsinDataLockedGroupId() {
|
||||
|
||||
Reference in New Issue
Block a user