fix: 字号恢复正常大小、下架改用api.post、翻译编辑器预填充
Some checks failed
PR Preview / teardown-preview (pull_request) Has been skipped
Test / unit-test (push) Successful in 5s
Test / build-check (push) Successful in 4s
PR Preview / test (pull_request) Successful in 4s
PR Preview / deploy-preview (pull_request) Successful in 14s
Test / e2e-test (push) Failing after 1m26s
Some checks failed
PR Preview / teardown-preview (pull_request) Has been skipped
Test / unit-test (push) Successful in 5s
Test / build-check (push) Successful in 4s
PR Preview / test (pull_request) Successful in 4s
PR Preview / deploy-preview (pull_request) Successful in 14s
Test / e2e-test (push) Failing after 1m26s
精油价目: - 字号恢复固定大小(14/10/13/11px),手机端@media缩小 - 不再用clamp()(之前太小) - 下架改用 api.post 替代 api() raw fetch,更可靠 - 稀释比例/使用禁忌卡片: emoji和标题合并为一行(flex row) 翻译同步: - 打开翻译编辑器时预填充: 读取 oilsMeta.enName → oilEn() → 填入输入框 - 用户看到当前英文名,修改后保存到 oils.en_name - 精油价目页 getEnglishName 读同一字段,自动同步 翻译表: - 补充 舒缓→Deep Blue 等常用精油英文名 - oilEn() 支持去掉/添加"复方"后缀匹配 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -103,7 +103,7 @@
|
|||||||
<button
|
<button
|
||||||
v-if="cardLang === 'en' && authStore.canManage"
|
v-if="cardLang === 'en' && authStore.canManage"
|
||||||
class="action-btn"
|
class="action-btn"
|
||||||
@click="showTranslationEditor = true"
|
@click="openTranslationEditor"
|
||||||
>✏️ 修改翻译</button>
|
>✏️ 修改翻译</button>
|
||||||
<button
|
<button
|
||||||
v-if="showBrandHint"
|
v-if="showBrandHint"
|
||||||
@@ -595,6 +595,18 @@ function copyText() {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function openTranslationEditor() {
|
||||||
|
// Pre-populate with existing English names from DB/translation table
|
||||||
|
const map = {}
|
||||||
|
for (const ing of cardIngredients.value) {
|
||||||
|
const existing = oilsStore.oilsMeta[ing.oil]?.enName || oilEn(ing.oil)
|
||||||
|
if (existing) map[ing.oil] = existing
|
||||||
|
}
|
||||||
|
customOilNameEn.value = map
|
||||||
|
customRecipeNameEn.value = recipe.value.en_name || recipeNameEn(recipe.value.name)
|
||||||
|
showTranslationEditor.value = true
|
||||||
|
}
|
||||||
|
|
||||||
async function applyTranslation() {
|
async function applyTranslation() {
|
||||||
showTranslationEditor.value = false
|
showTranslationEditor.value = false
|
||||||
let saved = 0
|
let saved = 0
|
||||||
|
|||||||
@@ -2,15 +2,19 @@
|
|||||||
<div class="oil-reference">
|
<div class="oil-reference">
|
||||||
<!-- Knowledge Cards at Top -->
|
<!-- Knowledge Cards at Top -->
|
||||||
<div style="display:flex;gap:10px;margin-bottom:16px;flex-wrap:wrap">
|
<div style="display:flex;gap:10px;margin-bottom:16px;flex-wrap:wrap">
|
||||||
<div @click="showDilution = true" style="flex:1;min-width:140px;background:linear-gradient(135deg,#e8f5e9,#c8e6c9);border-radius:14px;padding:16px;cursor:pointer;transition:transform 0.2s" @mouseover="$event.target.style.transform='translateY(-2px)'" @mouseout="$event.target.style.transform=''">
|
<div @click="showDilution = true" style="flex:1;min-width:140px;background:linear-gradient(135deg,#e8f5e9,#c8e6c9);border-radius:12px;padding:12px 16px;cursor:pointer;transition:transform 0.2s;display:flex;align-items:center;gap:10px" @mouseover="$event.currentTarget.style.transform='translateY(-2px)'" @mouseout="$event.currentTarget.style.transform=''">
|
||||||
<div style="font-size:24px;margin-bottom:6px">💧</div>
|
<span style="font-size:22px">💧</span>
|
||||||
|
<div>
|
||||||
<div style="font-size:14px;font-weight:600;color:#2e7d32">稀释比例</div>
|
<div style="font-size:14px;font-weight:600;color:#2e7d32">稀释比例</div>
|
||||||
<div style="font-size:11px;color:#558b2f;margin-top:4px">不同年龄段的稀释指南</div>
|
<div style="font-size:11px;color:#558b2f;margin-top:2px">不同年龄段的稀释指南</div>
|
||||||
</div>
|
</div>
|
||||||
<div @click="showContra = true" style="flex:1;min-width:140px;background:linear-gradient(135deg,#fff8e1,#ffecb3);border-radius:14px;padding:16px;cursor:pointer;transition:transform 0.2s" @mouseover="$event.target.style.transform='translateY(-2px)'" @mouseout="$event.target.style.transform=''">
|
</div>
|
||||||
<div style="font-size:24px;margin-bottom:6px">⚠️</div>
|
<div @click="showContra = true" style="flex:1;min-width:140px;background:linear-gradient(135deg,#fff8e1,#ffecb3);border-radius:12px;padding:12px 16px;cursor:pointer;transition:transform 0.2s;display:flex;align-items:center;gap:10px" @mouseover="$event.currentTarget.style.transform='translateY(-2px)'" @mouseout="$event.currentTarget.style.transform=''">
|
||||||
|
<span style="font-size:22px">⚠️</span>
|
||||||
|
<div>
|
||||||
<div style="font-size:14px;font-weight:600;color:#f57f17">使用禁忌</div>
|
<div style="font-size:14px;font-weight:600;color:#f57f17">使用禁忌</div>
|
||||||
<div style="font-size:11px;color:#ff8f00;margin-top:4px">安全使用精油的注意事项</div>
|
<div style="font-size:11px;color:#ff8f00;margin-top:2px">安全使用精油的注意事项</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@@ -673,27 +677,20 @@ async function toggleOilActive() {
|
|||||||
const meta = getMeta(name)
|
const meta = getMeta(name)
|
||||||
const newActive = meta?.isActive === false ? 1 : 0
|
const newActive = meta?.isActive === false ? 1 : 0
|
||||||
try {
|
try {
|
||||||
const res = await api('/api/oils', {
|
await api.post('/api/oils', {
|
||||||
method: 'POST',
|
|
||||||
body: JSON.stringify({
|
|
||||||
name,
|
name,
|
||||||
bottle_price: meta?.bottlePrice || 0,
|
bottle_price: meta?.bottlePrice || 0,
|
||||||
drop_count: meta?.dropCount || 1,
|
drop_count: meta?.dropCount || 1,
|
||||||
retail_price: meta?.retailPrice,
|
retail_price: meta?.retailPrice || null,
|
||||||
|
en_name: meta?.enName || null,
|
||||||
is_active: newActive,
|
is_active: newActive,
|
||||||
}),
|
|
||||||
})
|
})
|
||||||
if (!res.ok) {
|
|
||||||
const err = await res.json().catch(() => ({}))
|
|
||||||
ui.showToast('操作失败: ' + (err.detail || res.status))
|
|
||||||
return
|
|
||||||
}
|
|
||||||
await oils.loadOils()
|
await oils.loadOils()
|
||||||
cardVersion.value++
|
cardVersion.value++
|
||||||
ui.showToast(newActive ? '已重新上架' : '已下架')
|
ui.showToast(newActive ? '已重新上架' : '已下架')
|
||||||
editingOilName.value = null
|
editingOilName.value = null
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
ui.showToast('操作失败: ' + (e.message || ''))
|
ui.showToast('操作失败: ' + (e.message || e))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1206,33 +1203,39 @@ async function saveCardImage(name) {
|
|||||||
background: #fff5f5 !important;
|
background: #fff5f5 !important;
|
||||||
}
|
}
|
||||||
.oil-name-line {
|
.oil-name-line {
|
||||||
font-size: clamp(10px, 2.5vw, 14px);
|
font-size: 14px;
|
||||||
font-weight: 500;
|
font-weight: 500;
|
||||||
color: var(--text-dark);
|
color: var(--text-dark);
|
||||||
white-space: nowrap;
|
white-space: nowrap;
|
||||||
}
|
}
|
||||||
.oil-en-line {
|
.oil-en-line {
|
||||||
font-size: clamp(8px, 1.8vw, 10px);
|
font-size: 10px;
|
||||||
color: var(--text-light);
|
color: var(--text-light);
|
||||||
white-space: nowrap;
|
white-space: nowrap;
|
||||||
}
|
}
|
||||||
.oil-price-line {
|
.oil-price-line {
|
||||||
font-size: clamp(10px, 2.2vw, 13px);
|
font-size: 13px;
|
||||||
color: var(--sage-dark);
|
color: var(--sage-dark);
|
||||||
font-weight: 600;
|
font-weight: 600;
|
||||||
white-space: nowrap;
|
white-space: nowrap;
|
||||||
}
|
}
|
||||||
.oil-price-unit {
|
.oil-price-unit {
|
||||||
font-size: clamp(8px, 1.6vw, 10px);
|
font-size: 10px;
|
||||||
font-weight: 400;
|
font-weight: 400;
|
||||||
color: var(--text-light);
|
color: var(--text-light);
|
||||||
}
|
}
|
||||||
.oil-retail-line {
|
.oil-retail-line {
|
||||||
font-size: clamp(8px, 1.6vw, 11px);
|
font-size: 11px;
|
||||||
color: var(--text-light);
|
color: var(--text-light);
|
||||||
text-decoration: line-through;
|
text-decoration: line-through;
|
||||||
white-space: nowrap;
|
white-space: nowrap;
|
||||||
}
|
}
|
||||||
|
@media (max-width: 480px) {
|
||||||
|
.oil-name-line { font-size: 12px; }
|
||||||
|
.oil-en-line { font-size: 9px; }
|
||||||
|
.oil-price-line { font-size: 11px; }
|
||||||
|
.oil-retail-line { font-size: 9px; }
|
||||||
|
}
|
||||||
|
|
||||||
.oil-chip-actions {
|
.oil-chip-actions {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
|
|||||||
Reference in New Issue
Block a user