task-98: 移除 similar-asin/appearance-patent 模块 Coze,状态机与共享组件改名 LLM
Build Backend JAR / build (push) Has been cancelled
Build Backend JAR / build (push) Has been cancelled
- similarasin/appearancepatent 模块全部 Coze 工作流调用改走 direct-LLM(已确认唯一运行路径) - 共享组件改名:CozeTaskQueueGate→TaskQueueGate、CozeGroupResultPropagator→GroupResultPropagator - 状态机改名:biz_task_scope_state 的 coze_* 列→llm_*、stateJson coze 键→llm(V100 迁移已应用生产) - 删除 biz_coze_credential 表、CozeCredential* 类、SimilarAsinCozeClient、AppearancePatentCozeClient→LlmClient - 前端 brand 页 Coze 文案→LLM;Python 后端删除 cozepy 依赖与死配置 - 修复 TaskResultFileJobWorker 启动失败:TaskFileJobConfig 注册 ResultFileJobHandlerRegistry 与 13 个 handler bean(含 validateCoverage 启动校验)
This commit is contained in:
@@ -2181,6 +2181,67 @@ def update_column(cid):
|
||||
})
|
||||
|
||||
|
||||
def _reorder_columns_by_list(data):
|
||||
"""按前端拖动后的完整同级顺序重排菜单,只回写排序真正变化的记录。"""
|
||||
raw_ids = data.get('ordered_ids')
|
||||
if raw_ids is None:
|
||||
raw_ids = data.get('orderedIds')
|
||||
if not isinstance(raw_ids, list) or not raw_ids:
|
||||
return jsonify({'success': False, 'error': '菜单重排参数无效'}), 400
|
||||
ordered_ids = []
|
||||
for raw_id in raw_ids:
|
||||
try:
|
||||
parsed_id = int(raw_id)
|
||||
except (TypeError, ValueError):
|
||||
return jsonify({'success': False, 'error': '菜单重排参数无效'}), 400
|
||||
if parsed_id in ordered_ids:
|
||||
return jsonify({'success': False, 'error': '菜单重排参数重复'}), 400
|
||||
ordered_ids.append(parsed_id)
|
||||
menu_type = (data.get('menu_type') or data.get('menuType') or 'admin').strip() or 'admin'
|
||||
items, error_response, status = _java_permission_items(menu_type=menu_type)
|
||||
if error_response is not None:
|
||||
return error_response, status
|
||||
by_id = {}
|
||||
for item in _iter_permission_items(items):
|
||||
try:
|
||||
by_id[int(item.get('id'))] = item
|
||||
except (TypeError, ValueError):
|
||||
continue
|
||||
missing = [item_id for item_id in ordered_ids if item_id not in by_id]
|
||||
if missing:
|
||||
return jsonify({'success': False, 'error': '栏目不存在'}), 400
|
||||
parent_ids = {
|
||||
by_id[item_id].get('parentId') if by_id[item_id].get('parentId') is not None
|
||||
else by_id[item_id].get('parent_id')
|
||||
for item_id in ordered_ids
|
||||
}
|
||||
if len(parent_ids) > 1:
|
||||
return jsonify({'success': False, 'error': '只能在同级菜单之间排序'}), 400
|
||||
for index, item_id in enumerate(ordered_ids):
|
||||
item = by_id[item_id]
|
||||
sort_order = (index + 1) * 10
|
||||
current_order = item.get('sortOrder')
|
||||
if current_order is None:
|
||||
current_order = item.get('sort_order')
|
||||
if current_order is not None and int(current_order) == sort_order:
|
||||
continue
|
||||
_, error_response, status = _proxy_permission_java(
|
||||
'PUT',
|
||||
f'/api/admin/permission-menus/{item_id}',
|
||||
json_data={
|
||||
'name': item.get('name') or '',
|
||||
'columnKey': item.get('columnKey') or item.get('column_key') or '',
|
||||
'menuType': item.get('menuType') or item.get('menu_type') or menu_type,
|
||||
'routePath': item.get('routePath') or item.get('route_path') or '',
|
||||
'sortOrder': sort_order,
|
||||
'parentId': item.get('parentId') if item.get('parentId') is not None else item.get('parent_id'),
|
||||
},
|
||||
)
|
||||
if error_response is not None:
|
||||
return error_response, status
|
||||
return jsonify({'success': True, 'msg': '排序更新成功'})
|
||||
|
||||
|
||||
@admin_api.route('/column/reorder', methods=['POST'])
|
||||
@admin_required
|
||||
def reorder_column():
|
||||
@@ -2188,6 +2249,8 @@ def reorder_column():
|
||||
if denied:
|
||||
return denied
|
||||
data = request.get_json() or {}
|
||||
if data.get('ordered_ids') is not None or data.get('orderedIds') is not None:
|
||||
return _reorder_columns_by_list(data)
|
||||
try:
|
||||
column_id = int(data.get('column_id'))
|
||||
target_id = int(data.get('target_id'))
|
||||
|
||||
+3
-4
@@ -7,10 +7,9 @@ except ImportError:
|
||||
def load_dotenv(*args, **kwargs):
|
||||
return False
|
||||
|
||||
base_url = "https://api.coze.cn/v1"
|
||||
coze_token = "sat_12nW40INoJxArrDXbY4lSCoudbqkOYTcphC99BP2efWyzxmsk4q81WDX3ezWgqZ5"
|
||||
workflow_id = "7608812635877900322"
|
||||
STITCH_WORKFLOW_ID = "7608813873483300907"
|
||||
base_url = ""
|
||||
coze_token = ""
|
||||
workflow_id = ""
|
||||
|
||||
BASE_DIR = Path(__file__).resolve().parent
|
||||
LOADED_ENV_FILES = []
|
||||
|
||||
@@ -12,7 +12,6 @@ charset-normalizer==3.4.4
|
||||
click==8.1.8
|
||||
clr_loader==0.2.10
|
||||
colorama==0.4.6
|
||||
cozepy==0.20.0
|
||||
crcmod-plus==2.3.1
|
||||
cryptography==41.0.0
|
||||
distro==1.9.0
|
||||
|
||||
+112
-82
@@ -3694,12 +3694,13 @@
|
||||
#panel-digital-human-version .digital-human-version-table-scroll > table { min-width: 1120px; }
|
||||
#panel-history .history-table-scroll > table { min-width: 820px; }
|
||||
|
||||
.query-asin-table-scroll > table, .skip-price-asin-table-scroll > table { min-width: 1180px; table-layout: fixed; }
|
||||
.query-asin-table-scroll > table, .skip-price-asin-table-scroll > table { min-width: 1280px; table-layout: fixed; }
|
||||
#panel-query-asin .query-asin-table-scroll th:nth-child(1), #panel-skip-price-asin .skip-price-asin-table-scroll th:nth-child(1) { width: 6%; }
|
||||
#panel-query-asin .query-asin-table-scroll th:nth-child(2), #panel-skip-price-asin .skip-price-asin-table-scroll th:nth-child(2) { width: 11%; }
|
||||
#panel-query-asin .query-asin-table-scroll th:nth-child(3), #panel-skip-price-asin .skip-price-asin-table-scroll th:nth-child(3) { width: 12%; }
|
||||
#panel-query-asin .query-asin-table-scroll th:nth-child(n+4), #panel-skip-price-asin .skip-price-asin-table-scroll th:nth-child(n+4) { width: 14.2%; }
|
||||
#panel-query-asin .query-asin-table-scroll td, #panel-skip-price-asin .skip-price-asin-table-scroll td { vertical-align: top; }
|
||||
#panel-query-asin .query-asin-table-scroll th:nth-child(n+4), #panel-skip-price-asin .skip-price-asin-table-scroll th:nth-child(n+4) { width: 12.2%; }
|
||||
#panel-query-asin .query-asin-table-scroll th:last-child, #panel-skip-price-asin .skip-price-asin-table-scroll th:last-child { width: 10%; }
|
||||
#panel-query-asin .query-asin-table-scroll td, #panel-skip-price-asin .skip-price-asin-table-scroll td { vertical-align: middle; }
|
||||
|
||||
.table-ellipsis { display: block; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
|
||||
.asin-cell-layout { display: flex; flex-direction: column; align-items: stretch; gap: 8px; min-width: 0; }
|
||||
@@ -3713,6 +3714,56 @@
|
||||
.skip-price-country { color: var(--c-text-2); font-weight: 600; }
|
||||
.skip-price-entry input { min-width: 0 !important; width: auto !important; }
|
||||
|
||||
/* 站点列只做纯展示:点击 ASIN 即复制,编辑统一收进右侧抽屉 */
|
||||
.asin-copy-text { display: block; max-width: 100%; margin: -3px 0 -3px -7px; padding: 3px 7px; border: 1px solid transparent; border-radius: var(--radius-sm); background: none; color: inherit; font: inherit; font-size: 13.5px; font-variant-numeric: tabular-nums; line-height: 1.5; text-align: left; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; cursor: pointer; }
|
||||
.asin-copy-text:hover { border-color: #c7d7e5; background: #eef4fa; color: var(--c-primary-strong); }
|
||||
.asin-copy-text:focus-visible { outline: 2px solid #4f78a5; outline-offset: 1px; }
|
||||
.asin-copy-text.is-copied { border-color: #b9e3ca; background: #eaf8f0; color: var(--c-success); }
|
||||
.asin-col-actions { position: sticky; right: 0; z-index: 2; text-align: right; background: #ffffff; box-shadow: -9px 0 12px -10px rgba(31, 48, 66, 0.45); }
|
||||
th.asin-col-actions { z-index: 3; background: #f7f8fb; }
|
||||
tbody tr:hover td.asin-col-actions { background: #f6f8fd; }
|
||||
|
||||
/* 表单里「输入框 + 附属按钮」组合,避免按钮溢出所在列挤掉列间距 */
|
||||
.field-with-action { display: flex; align-items: center; gap: 8px; min-width: 0; }
|
||||
.field-with-action > input, .field-with-action > select { flex: 1 1 auto; width: auto; }
|
||||
.field-with-action > .btn { flex: 0 0 auto; white-space: nowrap; margin-top: 0; }
|
||||
|
||||
.visually-hidden { position: absolute; width: 1px; height: 1px; margin: -1px; padding: 0; border: 0; overflow: hidden; white-space: nowrap; clip: rect(0 0 0 0); clip-path: inset(50%); }
|
||||
|
||||
/* 菜单列表拖动排序 */
|
||||
#panel-columns .columns-table-scroll > table { min-width: 820px; }
|
||||
.columns-drag-tip { margin: -8px 0 14px; font-size: 13px; color: var(--c-text-2); }
|
||||
.column-drag-cell { width: 48px; }
|
||||
.column-drag-handle { display: inline-flex; align-items: center; justify-content: center; width: 28px; height: 28px; border: 1px solid transparent; border-radius: var(--radius-sm); background: none; color: #93a6b8; font-size: 15px; line-height: 1; cursor: grab; user-select: none; }
|
||||
.column-drag-handle:hover { border-color: #cbd9e6; background: #eef4fa; color: var(--c-primary-strong); }
|
||||
.column-drag-handle:focus-visible { outline: 2px solid #4f78a5; outline-offset: 1px; }
|
||||
.column-drag-handle:active { cursor: grabbing; }
|
||||
tr.is-column-dragging td { opacity: 0.45; }
|
||||
tr.is-column-drop-before td { box-shadow: inset 0 2px 0 var(--c-primary); }
|
||||
tr.is-column-drop-after td { box-shadow: inset 0 -2px 0 var(--c-primary); }
|
||||
.column-child-mark { margin-right: 6px; color: #9fb1c2; }
|
||||
|
||||
/* 右侧抽屉:站点数量增长时仍能在一处维护完整配置 */
|
||||
.drawer-mask { display: none; position: fixed; inset: 0; z-index: 1000; background: rgba(45, 66, 86, 0.36); backdrop-filter: blur(4px); }
|
||||
.drawer-mask.show { display: block; animation: modal-fade-in 0.16s ease; }
|
||||
.drawer { position: absolute; top: 0; right: 0; bottom: 0; display: flex; flex-direction: column; width: min(460px, 100%); background: #ffffff; border-left: 1px solid #c7d7e5; box-shadow: var(--shadow-pop); animation: drawer-slide-in 0.18s ease; }
|
||||
@keyframes drawer-slide-in { from { transform: translateX(26px); opacity: 0.4; } to { transform: none; opacity: 1; } }
|
||||
.drawer-header { display: flex; align-items: flex-start; justify-content: space-between; gap: 12px; padding: 20px 22px 14px; border-bottom: 1px solid #e6edf4; }
|
||||
.drawer-header h3 { margin: 0; font-size: 15px; font-weight: 600; color: var(--c-text); }
|
||||
.drawer-subtitle { margin: 6px 0 0; font-size: 13px; color: var(--c-text-2); }
|
||||
.drawer-hint { margin: 0 0 14px; font-size: 12.5px; color: var(--c-text-3); }
|
||||
.drawer-close { flex: 0 0 auto; width: 30px; height: 30px; border: 1px solid transparent; border-radius: var(--radius-sm); background: none; color: var(--c-text-2); font-size: 20px; line-height: 1; cursor: pointer; }
|
||||
.drawer-close:hover { border-color: #cbd9e6; background: #eef4fa; color: var(--c-text); }
|
||||
.drawer-body { flex: 1; min-height: 0; overflow-y: auto; padding: 18px 22px; }
|
||||
.drawer-body .form-group:last-of-type { margin-bottom: 0; }
|
||||
.drawer-footer { display: flex; gap: 8px; padding: 14px 22px 18px; border-top: 1px solid #e6edf4; }
|
||||
.drawer-price-grid { display: grid; grid-template-columns: minmax(0, 1fr) 128px; gap: 8px; }
|
||||
.drawer-price-grid input { min-width: 0; }
|
||||
@media (max-width: 560px) {
|
||||
.drawer { width: 100%; }
|
||||
.drawer-price-grid { grid-template-columns: minmax(0, 1fr); }
|
||||
}
|
||||
|
||||
#panel-query-asin .panel-box > .form-row, #panel-skip-price-asin .panel-box > .form-row { display: grid; grid-template-columns: minmax(150px, 0.8fr) minmax(180px, 1fr) minmax(180px, 1fr) auto auto; gap: 12px; align-items: end; }
|
||||
#panel-query-asin .panel-box > .form-row .form-group, #panel-skip-price-asin .panel-box > .form-row .form-group { min-width: 0 !important; }
|
||||
|
||||
@@ -4063,17 +4114,11 @@
|
||||
<label>菜单名称</label>
|
||||
<input type="text" id="columnName" placeholder="例如:店铺管理">
|
||||
</div>
|
||||
<div class=" form-group" style="min-width:200px;">
|
||||
<label>菜单标识</label>
|
||||
<input type="text" id="columnKey" placeholder="例如:shop_manage">
|
||||
</div>
|
||||
<div class="form-group" style="min-width:220px;">
|
||||
<label>页面路径</label>
|
||||
<input type="text" id="columnRoutePath" placeholder="例如:dedupe-total-data">
|
||||
</div>
|
||||
<div class="form-group" style="min-width:140px;">
|
||||
<label>排序</label>
|
||||
<input type="number" id="columnSortOrder" placeholder="例如:10">
|
||||
<div class="form-group" style="min-width:260px;">
|
||||
<label>页面</label>
|
||||
<select id="columnPageSelect">
|
||||
<option value="">请选择页面</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="form-group" style="min-width:160px;">
|
||||
<label>菜单类型</label>
|
||||
@@ -4092,17 +4137,16 @@
|
||||
</div>
|
||||
<div class="panel-box">
|
||||
<h3 style="margin-bottom:16px;">菜单列表</h3>
|
||||
<p class="columns-drag-tip">拖动每行左侧的手柄可调整同级菜单的显示顺序,松开后自动保存。</p>
|
||||
<div class="table-scroll columns-table-scroll">
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th class="column-drag-cell"><span class="visually-hidden">排序</span></th>
|
||||
<th>ID</th>
|
||||
<th>菜单名称</th>
|
||||
<th>菜单标识</th>
|
||||
<th>菜单类型</th>
|
||||
<th>上级菜单</th>
|
||||
<th>排序</th>
|
||||
<th>页面路径</th>
|
||||
<th>创建时间</th>
|
||||
<th>操作</th>
|
||||
</tr>
|
||||
@@ -4515,25 +4559,24 @@
|
||||
<div class="form-box">
|
||||
<h3 style="margin-bottom:16px;">新增 ASIN</h3>
|
||||
<div class="form-row">
|
||||
<div class="form-group" style="min-width:220px;">
|
||||
<div class="form-group" style="min-width:264px;">
|
||||
<label>分组</label>
|
||||
<div style="display:flex;gap:8px;align-items:center;">
|
||||
<div class="field-with-action">
|
||||
<select id="skipPriceAsinGroupSelect" style="min-width:150px;">
|
||||
<option value="">请选择分组</option>
|
||||
</select>
|
||||
<button class="btn btn-secondary" id="btnManageSkipPriceAsinGroups" type="button">管理分组</button>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group" style="min-width:180px;">
|
||||
<div class="form-group" style="min-width:340px;">
|
||||
<label>店铺名</label>
|
||||
<input type="text" id="skipPriceAsinShopName" placeholder="请输入店铺名称">
|
||||
</div>
|
||||
<div class=" form-group" style="min-width:220px;">
|
||||
<label>国家</label>
|
||||
<div style="margin-bottom:8px;">
|
||||
<label> </label>
|
||||
<div class="field-with-action">
|
||||
<input type="text" id="skipPriceAsinShopName" placeholder="请输入店铺名称" style="min-width:180px;">
|
||||
<button class="btn btn-secondary" id="btnChooseSkipPriceAsinShop" type="button">选择店铺</button>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group" style="min-width:220px;">
|
||||
<label>国家</label>
|
||||
<select id="skipPriceAsinCountries" class="js-dropdown-multi" multiple>
|
||||
<option value="DE">德国</option>
|
||||
<option value="UK">英国</option>
|
||||
@@ -4621,6 +4664,7 @@
|
||||
<th>法国</th>
|
||||
<th>意大利</th>
|
||||
<th>西班牙</th>
|
||||
<th class="asin-col-actions">操作</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody id="skipPriceAsinListBody"></tbody>
|
||||
@@ -4634,9 +4678,9 @@
|
||||
<div class="form-box">
|
||||
<h3 style="margin-bottom:16px;">新增查询 ASIN</h3>
|
||||
<div class="form-row">
|
||||
<div class="form-group" style="min-width:220px;">
|
||||
<div class="form-group" style="min-width:264px;">
|
||||
<label>分组</label>
|
||||
<div style="display:flex;gap:8px;align-items:center;">
|
||||
<div class="field-with-action">
|
||||
<select id="queryAsinGroupSelect" style="min-width:150px;">
|
||||
<option value="">请选择分组</option>
|
||||
</select>
|
||||
@@ -4645,8 +4689,8 @@
|
||||
</div>
|
||||
<div class="form-group" style="min-width:340px;">
|
||||
<label>店铺名</label>
|
||||
<div style="display:flex;gap:8px;align-items:center;">
|
||||
<input type="text" id="queryAsinShopName" placeholder="请输入店铺名称" style="flex:1;min-width:180px;">
|
||||
<div class="field-with-action">
|
||||
<input type="text" id="queryAsinShopName" placeholder="请输入店铺名称" style="min-width:180px;">
|
||||
<button class="btn btn-secondary" id="btnChooseQueryAsinShop" type="button">选择店铺</button>
|
||||
</div>
|
||||
</div>
|
||||
@@ -4740,6 +4784,7 @@
|
||||
<th>法国</th>
|
||||
<th>意大利</th>
|
||||
<th>西班牙</th>
|
||||
<th class="asin-col-actions">操作</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody id="queryAsinListBody"></tbody>
|
||||
@@ -5037,21 +5082,16 @@
|
||||
<div class="modal">
|
||||
<h3>编辑栏目</h3>
|
||||
<input type="hidden" id="editColumnId">
|
||||
<input type="hidden" id="editColumnSortOrder">
|
||||
<div class="form-group">
|
||||
<label>菜单名称</label>
|
||||
<input type="text" id="editColumnName" placeholder="菜单名称">
|
||||
</div>
|
||||
<div class=" form-group">
|
||||
<label>菜单标识</label>
|
||||
<input type="text" id="editColumnKey" placeholder="菜单标识">
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label>页面路径</label>
|
||||
<input type="text" id="editColumnRoutePath" placeholder="页面路径">
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label>排序</label>
|
||||
<input type="number" id="editColumnSortOrder" placeholder="排序">
|
||||
<label>页面</label>
|
||||
<select id="editColumnPageSelect">
|
||||
<option value="">请选择页面</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label>菜单类型</label>
|
||||
@@ -5175,31 +5215,24 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="modal-mask" id="editSkipPriceAsinModal">
|
||||
<div class="modal">
|
||||
<h3>编辑跳过跟价 ASIN</h3>
|
||||
<input type="hidden" id="editSkipPriceAsinId">
|
||||
<input type="hidden" id="editSkipPriceAsinCountry">
|
||||
<div class="form-group">
|
||||
<label>店铺名</label>
|
||||
<input type="text" id="editSkipPriceAsinShopName" readonly style="background:#f4f6fa;">
|
||||
<div class="drawer-mask" id="skipPriceAsinDrawer">
|
||||
<div class="drawer" role="dialog" aria-modal="true" aria-labelledby="skipPriceAsinDrawerTitle">
|
||||
<div class="drawer-header">
|
||||
<div>
|
||||
<h3 id="skipPriceAsinDrawerTitle">配置最低价 ASIN</h3>
|
||||
<p class="drawer-subtitle" id="skipPriceAsinDrawerSubtitle"></p>
|
||||
</div>
|
||||
<button class="drawer-close" id="btnCloseSkipPriceAsinDrawer" type="button" aria-label="关闭">×</button>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label>国家</label>
|
||||
<input type="text" id="editSkipPriceAsinCountryLabel" readonly style="background:#f4f6fa;">
|
||||
<div class="drawer-body">
|
||||
<input type="hidden" id="skipPriceAsinDrawerId">
|
||||
<p class="drawer-hint">留空表示删除该站点已有的 ASIN 与最低价。</p>
|
||||
<div id="skipPriceAsinDrawerFields"></div>
|
||||
<p class="msg" id="msgSkipPriceAsinDrawer"></p>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label>ASIN</label>
|
||||
<input type="text" id="editSkipPriceAsinValue" placeholder="请输入 ASIN">
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label>最低价</label>
|
||||
<input type="number" id="editSkipPriceMinimumPrice" min="0" step="0.01" placeholder="请输入最低价,可留空">
|
||||
</div>
|
||||
<p class="msg" id="msgEditSkipPriceAsin"></p>
|
||||
<div style="margin-top:16px;display:flex;gap:8px;">
|
||||
<button class="btn" id="btnSaveSkipPriceAsin">保存</button>
|
||||
<button class="btn btn-secondary" id="btnCloseEditSkipPriceAsin">取消</button>
|
||||
<div class="drawer-footer">
|
||||
<button class="btn" id="btnSaveSkipPriceAsinDrawer" type="button">保存</button>
|
||||
<button class="btn btn-secondary" id="btnCancelSkipPriceAsinDrawer" type="button">取消</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -5242,27 +5275,24 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="modal-mask" id="editQueryAsinModal">
|
||||
<div class="modal">
|
||||
<h3>编辑查询 ASIN</h3>
|
||||
<input type="hidden" id="editQueryAsinId">
|
||||
<input type="hidden" id="editQueryAsinCountry">
|
||||
<div class="form-group">
|
||||
<label>店铺名</label>
|
||||
<input type="text" id="editQueryAsinShopName" readonly style="background:#f4f6fa;">
|
||||
<div class="drawer-mask" id="queryAsinDrawer">
|
||||
<div class="drawer" role="dialog" aria-modal="true" aria-labelledby="queryAsinDrawerTitle">
|
||||
<div class="drawer-header">
|
||||
<div>
|
||||
<h3 id="queryAsinDrawerTitle">配置查询 ASIN</h3>
|
||||
<p class="drawer-subtitle" id="queryAsinDrawerSubtitle"></p>
|
||||
</div>
|
||||
<button class="drawer-close" id="btnCloseQueryAsinDrawer" type="button" aria-label="关闭">×</button>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label>国家</label>
|
||||
<input type="text" id="editQueryAsinCountryLabel" readonly style="background:#f4f6fa;">
|
||||
<div class="drawer-body">
|
||||
<input type="hidden" id="queryAsinDrawerId">
|
||||
<p class="drawer-hint">留空表示删除该站点已有的 ASIN。</p>
|
||||
<div id="queryAsinDrawerFields"></div>
|
||||
<p class="msg" id="msgQueryAsinDrawer"></p>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label>ASIN</label>
|
||||
<input type="text" id="editQueryAsinValue" placeholder="请输入 ASIN">
|
||||
</div>
|
||||
<p class="msg" id="msgEditQueryAsin"></p>
|
||||
<div style="margin-top:16px;display:flex;gap:8px;">
|
||||
<button class="btn" id="btnSaveQueryAsin">保存</button>
|
||||
<button class="btn btn-secondary" id="btnCloseEditQueryAsin">取消</button>
|
||||
<div class="drawer-footer">
|
||||
<button class="btn" id="btnSaveQueryAsinDrawer" type="button">保存</button>
|
||||
<button class="btn btn-secondary" id="btnCancelQueryAsinDrawer" type="button">取消</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
Reference in New Issue
Block a user