optimize
This commit is contained in:
@@ -66,15 +66,6 @@
|
|||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
<!-- Chat / Custom Instructions -->
|
|
||||||
<section class="bg-white p-4 rounded-lg shadow-sm border border-gray-200 mb-4">
|
|
||||||
<h2 class="text-sm font-semibold mb-2">自定义指令</h2>
|
|
||||||
<div class="flex gap-2">
|
|
||||||
<input type="text" id="customInput" class="flex-1 border border-gray-300 rounded px-2 py-1 text-sm focus:ring-1 focus:ring-indigo-500 outline-none" placeholder="例如:查找电池容量...">
|
|
||||||
<button id="sendCustom" class="bg-indigo-100 text-indigo-700 px-3 py-1 rounded text-sm font-medium hover:bg-indigo-200 transition-colors">执行</button>
|
|
||||||
</div>
|
|
||||||
</section>
|
|
||||||
|
|
||||||
<!-- Logs / Status -->
|
<!-- Logs / Status -->
|
||||||
<section class="bg-gray-100 rounded-lg p-3 text-xs">
|
<section class="bg-gray-100 rounded-lg p-3 text-xs">
|
||||||
<div class="flex items-center justify-between mb-2">
|
<div class="flex items-center justify-between mb-2">
|
||||||
|
|||||||
28
sidepanel.js
28
sidepanel.js
@@ -3,8 +3,6 @@ const apiKeyInput = document.getElementById('apiKey');
|
|||||||
const scriptUrlInput = document.getElementById('scriptUrl');
|
const scriptUrlInput = document.getElementById('scriptUrl');
|
||||||
const modelInput = document.getElementById('modelInput');
|
const modelInput = document.getElementById('modelInput');
|
||||||
const saveConfigBtn = document.getElementById('saveConfig');
|
const saveConfigBtn = document.getElementById('saveConfig');
|
||||||
const customInput = document.getElementById('customInput');
|
|
||||||
const sendCustomBtn = document.getElementById('sendCustom');
|
|
||||||
const statusBadge = document.getElementById('statusBadge');
|
const statusBadge = document.getElementById('statusBadge');
|
||||||
const resultsArea = document.getElementById('results');
|
const resultsArea = document.getElementById('results');
|
||||||
|
|
||||||
@@ -70,11 +68,19 @@ saveConfigBtn.addEventListener('click', () => {
|
|||||||
addPresetBtn.addEventListener('click', async () => {
|
addPresetBtn.addEventListener('click', async () => {
|
||||||
const name = newPresetName.value.trim();
|
const name = newPresetName.value.trim();
|
||||||
const sheetName = newPresetSheet.value.trim();
|
const sheetName = newPresetSheet.value.trim();
|
||||||
const fields = newPresetFields.value.trim();
|
const rawFields = newPresetFields.value.trim();
|
||||||
if (!name || !fields) return alert('请输入名称和字段');
|
|
||||||
|
if (!name || !rawFields) return alert('请输入名称和字段');
|
||||||
|
|
||||||
|
// 核心逻辑:支持中英文逗号,并清理多余空格
|
||||||
|
const normalizedFields = rawFields
|
||||||
|
.split(/[,,]/) // 使用正则匹配中英文逗号
|
||||||
|
.map(f => f.trim()) // 清理每一项前后的空格
|
||||||
|
.filter(f => f !== "") // 过滤掉空项
|
||||||
|
.join(', '); // 统一用英文逗号+空格连接
|
||||||
|
|
||||||
const { userPresets = DEFAULT_PRESETS } = await chrome.storage.local.get('userPresets');
|
const { userPresets = DEFAULT_PRESETS } = await chrome.storage.local.get('userPresets');
|
||||||
const newPreset = { id: Date.now().toString(), name, sheetName, fields };
|
const newPreset = { id: Date.now().toString(), name, sheetName, fields: normalizedFields };
|
||||||
currentPresets = [...userPresets, newPreset];
|
currentPresets = [...userPresets, newPreset];
|
||||||
|
|
||||||
await chrome.storage.local.set({ userPresets: currentPresets });
|
await chrome.storage.local.set({ userPresets: currentPresets });
|
||||||
@@ -133,8 +139,6 @@ runPresetBtn.addEventListener('click', () => {
|
|||||||
if (preset) handleExtraction('preset', preset);
|
if (preset) handleExtraction('preset', preset);
|
||||||
});
|
});
|
||||||
|
|
||||||
sendCustomBtn.addEventListener('click', () => handleExtraction('custom', { fields: customInput.value, sheetName: '' }));
|
|
||||||
|
|
||||||
async function handleExtraction(type, presetObj) {
|
async function handleExtraction(type, presetObj) {
|
||||||
const { geminiApiKey, googleScriptUrl, geminiModel } = await chrome.storage.local.get(['geminiApiKey', 'googleScriptUrl', 'geminiModel']);
|
const { geminiApiKey, googleScriptUrl, geminiModel } = await chrome.storage.local.get(['geminiApiKey', 'googleScriptUrl', 'geminiModel']);
|
||||||
|
|
||||||
@@ -172,7 +176,6 @@ Title: ${pageData.title}`;
|
|||||||
const geminiResult = await callGemini(geminiApiKey, selectedModel, systemPrompt, pageData.text, userPrompt);
|
const geminiResult = await callGemini(geminiApiKey, selectedModel, systemPrompt, pageData.text, userPrompt);
|
||||||
let cleanedJson = parseGeminiJson(geminiResult);
|
let cleanedJson = parseGeminiJson(geminiResult);
|
||||||
|
|
||||||
// 核心修复:处理 AI 返回数组的情况
|
|
||||||
if (Array.isArray(cleanedJson)) {
|
if (Array.isArray(cleanedJson)) {
|
||||||
cleanedJson = cleanedJson[0] || {};
|
cleanedJson = cleanedJson[0] || {};
|
||||||
}
|
}
|
||||||
@@ -181,28 +184,19 @@ Title: ${pageData.title}`;
|
|||||||
|
|
||||||
if (googleScriptUrl) {
|
if (googleScriptUrl) {
|
||||||
updateStatus('保存至表格...', 'bg-purple-500 text-white');
|
updateStatus('保存至表格...', 'bg-purple-500 text-white');
|
||||||
|
|
||||||
// 1. 获取用户预设的业务表头
|
|
||||||
const businessHeaders = presetObj.fields.split(',').map(f => f.trim()).filter(f => f !== "");
|
const businessHeaders = presetObj.fields.split(',').map(f => f.trim()).filter(f => f !== "");
|
||||||
|
|
||||||
// 2. 定义元数据表头(可选,方便您追踪来源)
|
|
||||||
const metaHeaders = ["来源链接", "提取时间"];
|
const metaHeaders = ["来源链接", "提取时间"];
|
||||||
|
|
||||||
// 3. 合并总表头顺序
|
|
||||||
const allHeaders = [...businessHeaders, ...metaHeaders];
|
const allHeaders = [...businessHeaders, ...metaHeaders];
|
||||||
|
|
||||||
// 4. 构建发送给后端的最终数据
|
|
||||||
const payload = {
|
const payload = {
|
||||||
sheetName: presetObj.sheetName || '',
|
sheetName: presetObj.sheetName || '',
|
||||||
headers: allHeaders
|
headers: allHeaders
|
||||||
};
|
};
|
||||||
|
|
||||||
// 将提取的数据填入 payload
|
|
||||||
businessHeaders.forEach(h => {
|
businessHeaders.forEach(h => {
|
||||||
payload[h] = cleanedJson[h] || "N/A";
|
payload[h] = cleanedJson[h] || "N/A";
|
||||||
});
|
});
|
||||||
|
|
||||||
// 填入元数据
|
|
||||||
payload["来源链接"] = pageData.url;
|
payload["来源链接"] = pageData.url;
|
||||||
payload["提取时间"] = new Date().toLocaleString();
|
payload["提取时间"] = new Date().toLocaleString();
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user