您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
AI提示词管理和快速输入工具
// ==UserScript== // @name AI提示词助手 // @namespace http://tampermonkey.net/ // @version 0.2 // @description AI提示词管理和快速输入工具 // @author 初沐 (https://github.com/chumu) // @license MIT // @match https://pro.yrai.cc/new // @grant GM_addStyle // @grant GM_download // @grant GM_xmlhttpRequest // @connect cdn.jsdelivr.net // @run-at document-end // ==/UserScript== (function() { 'use strict'; // 首先加载xlsx库 function loadXLSX() { return new Promise((resolve, reject) => { GM_xmlhttpRequest({ method: 'GET', url: 'https://cdn.jsdelivr.net/npm/xlsx/dist/xlsx.full.min.js', onload: function(response) { try { // 创建script标签并执行代码 const script = document.createElement('script'); script.textContent = response.responseText; document.head.appendChild(script); resolve(); } catch (error) { reject(error); } }, onerror: function(error) { reject(error); } }); }); } // 等待xlsx库加载完成后初始化UI loadXLSX().then(() => { // 原有的初始化代码 createUI(); }).catch(error => { console.error('加载xlsx库失败:', error); // 即使加载失败也创建UI,只是Excel功能不可用 createUI(); }); // 添加样式 GM_addStyle(` .prompt-helper { position: fixed; right: 20px; top: 20px; background: white; border: 1px solid #ccc; padding: 20px; border-radius: 12px; box-shadow: 0 4px 20px rgba(0,0,0,0.15); z-index: 9999; width: 380px; font-family: Arial, sans-serif; transition: transform 0.3s ease; } .prompt-helper.collapsed { transform: translateX(calc(100% + 20px)); } .toggle-button { position: fixed; right: 20px; top: 20px; z-index: 9998; padding: 8px 15px; background: #4a90e2; color: white; border: none; border-radius: 6px; cursor: pointer; box-shadow: 0 2px 8px rgba(0,0,0,0.1); } .toggle-button:hover { background: #357abd; } .manage-categories { margin-top: 10px; padding: 10px; background: #f9f9f9; border-radius: 8px; display: none; } .manage-categories.active { display: block; } .category-list { margin: 10px 0; padding: 5px; background: white; border: 1px solid #eee; border-radius: 6px; max-height: 150px; overflow-y: auto; } .category-item { display: flex; justify-content: space-between; align-items: center; padding: 8px; border-bottom: 1px solid #eee; } .category-item:last-child { border-bottom: none; } .prompt-helper h3 { margin: 0 0 15px 0; color: #333; font-size: 18px; border-bottom: 2px solid #eee; padding-bottom: 10px; display: flex; align-items: center; justify-content: space-between; } .prompt-helper h3 .title { flex: 1; } .prompt-helper h3 .buttons { display: flex; gap: 8px; align-items: center; } .prompt-helper h3 button { padding: 4px 12px; border: 1px solid #ddd; border-radius: 4px; background: #f5f5f5; cursor: pointer; font-size: 14px; line-height: 1.5; transition: all 0.2s; } .prompt-helper h3 button:hover { background: #e5e5e5; } .prompt-helper button { margin: 5px; padding: 6px 12px; border: 1px solid #ddd; border-radius: 6px; background: #f5f5f5; cursor: pointer; transition: all 0.2s; } .prompt-helper button:hover { background: #e5e5e5; transform: translateY(-1px); } .prompt-helper input, .prompt-helper select, .prompt-helper textarea { padding: 6px 10px; border: 1px solid #ddd; border-radius: 6px; margin-bottom: 8px; } .prompt-list { margin-top: 15px; max-height: 400px; overflow-y: auto; } .prompt-item { margin: 8px 0; padding: 10px; border: 1px solid #eee; border-radius: 8px; background: #fafafa; } .prompt-item:hover { border-color: #ddd; background: #fff; box-shadow: 0 2px 8px rgba(0,0,0,0.05); } .prompt-content { margin: 5px 0; font-size: 14px; color: #666; } .prompt-comment { font-size: 12px; color: #888; margin-top: 5px; font-style: italic; } .category-section { margin: 15px 0; padding: 10px; border: 1px solid #eee; border-radius: 8px; } .category-title { font-weight: bold; color: #444; margin-bottom: 10px; } .search-box { width: 100%; margin-bottom: 15px; } .controls { display: flex; gap: 8px; margin-bottom: 10px; } .add-prompt-form { display: none; padding: 10px; background: #f9f9f9; border-radius: 8px; margin: 10px 0; } .add-prompt-form.active { display: block; } #addCategory { font-size: 12px; padding: 4px 8px; } #newCategory { font-size: 12px; } .import-section { margin: 10px 0; padding: 10px; background: #f9f9f9; border-radius: 8px; border: 2px dashed #ccc; text-align: center; transition: all 0.3s; overflow: hidden; } .import-section.collapsed { padding: 0; height: 0; border: none; margin: 0; } .import-section.dragover { background: #e9e9e9; border-color: #4a90e2; } .import-toggle { display: flex; align-items: center; padding: 8px; background: #f5f5f5; border-radius: 4px; cursor: pointer; user-select: none; margin-bottom: 10px; transition: all 0.3s; } .import-toggle:hover { background: #e8e8e8; } .import-toggle .arrow { width: 0; height: 0; border-left: 5px solid transparent; border-right: 5px solid transparent; border-top: 5px solid #666; margin-right: 8px; transition: transform 0.3s; } .import-toggle.collapsed .arrow { transform: rotate(-90deg); } .import-toggle-text { color: #666; font-size: 14px; } #fileInput { display: none; } .display-mode-switch { display: flex; align-items: center; gap: 8px; margin: 10px 0; padding: 8px; background: #f5f5f5; border-radius: 6px; } .display-mode-switch label { font-size: 14px; color: #666; } .prompt-content.simplified { max-height: 1.5em; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; cursor: pointer; } .prompt-content.simplified:hover { color: #4a90e2; } .settings-menu { display: none; position: absolute; top: 50px; right: 20px; background: white; border: 1px solid #ddd; border-radius: 8px; padding: 15px; box-shadow: 0 2px 10px rgba(0,0,0,0.1); z-index: 10001; width: 250px; } .settings-menu.active { display: block; } .settings-menu h4 { margin: 0 0 10px 0; padding-bottom: 8px; border-bottom: 1px solid #eee; color: #333; } .settings-item { margin: 8px 0; } .settings-item label { display: flex; align-items: center; gap: 8px; color: #666; font-size: 14px; } .settings-item input[type="checkbox"] { margin: 0; } .prompt-item { position: relative; } .prompt-name { font-weight: bold; margin-bottom: 5px; } .prompt-content { margin: 5px 0; color: #333; } .prompt-content.simplified { max-height: 1.5em; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; cursor: pointer; } .prompt-comment { font-size: 12px; color: #666; font-style: italic; margin-top: 3px; } .prompt-category { font-size: 12px; color: #4a90e2; margin-top: 3px; } .settings-menu h4 { margin: 0 0 10px 0; padding-bottom: 8px; border-bottom: 1px solid #eee; color: #333; } .settings-menu .author-info { margin-top: 15px; padding-top: 15px; border-top: 1px solid #eee; font-size: 13px; color: #666; } .settings-menu .author-info p { margin: 5px 0; line-height: 1.4; } .settings-menu .author-info a { color: #4a90e2; text-decoration: none; } .settings-menu .author-info a:hover { text-decoration: underline; } `); // 获取保存的分类 function getCategories() { return JSON.parse(localStorage.getItem('aiPromptCategories') || '["洗稿", "创作", "翻译"]'); } // 保存分类 function saveCategories(categories) { localStorage.setItem('aiPromptCategories', JSON.stringify(categories)); } // 更新分类列表 function updateCategoryList() { const categoryList = document.getElementById('categoryList'); const categories = getCategories(); categoryList.innerHTML = categories.map(category => ` <div class="category-item" data-category="${category}"> <span class="category-name">${category}</span> <button class="btn btn-danger" onclick="deleteCategory('${category}')">删除</button> </div> `).join(''); } // 删除分类 function deleteCategory(name) { if (confirm(`确定要删除分类"${name}"吗?`)) { const categories = getCategories(); const newCategories = categories.filter(c => c !== name); saveCategories(newCategories); updateCategoryList(); updateCategorySelectors(); } } // 清空表单 function clearForm() { document.getElementById('promptName').value = ''; document.getElementById('promptContent').value = ''; document.getElementById('promptComment').value = ''; } // 保存提示词 function savePrompt(name, content, comment, category) { const prompts = JSON.parse(localStorage.getItem('aiPrompts') || '{}'); prompts[name] = { content: content, comment: comment || '', category: category }; localStorage.setItem('aiPrompts', JSON.stringify(prompts)); } // 删除提示词 function deletePrompt(name) { const prompts = JSON.parse(localStorage.getItem('aiPrompts') || '{}'); if (prompts[name]) { delete prompts[name]; localStorage.setItem('aiPrompts', JSON.stringify(prompts)); loadPrompts(); showToast('提示词已删除'); } } // 复制提示词内容 function copyPromptContent(content) { // 确保content不为空 if (!content) { console.error('复制内容为空'); return; } // 使用 navigator.clipboard API if (navigator.clipboard && window.isSecureContext) { navigator.clipboard.writeText(content).then(() => { showToast('复制成功'); }).catch((err) => { console.error('Clipboard API failed:', err); fallbackCopy(content); }); } else { fallbackCopy(content); } } // 回退的复制方法 function fallbackCopy(content) { const textarea = document.createElement('textarea'); textarea.value = content; textarea.style.position = 'fixed'; textarea.style.left = '-9999px'; textarea.style.top = '0'; document.body.appendChild(textarea); textarea.focus(); textarea.select(); try { document.execCommand('copy'); showToast('复制成功'); } catch (err) { console.error('复制失败:', err); showToast('复制失败'); } document.body.removeChild(textarea); } // 显示提示信息 function showToast(message) { const toast = document.createElement('div'); toast.style.cssText = ` position: fixed; bottom: 20px; left: 50%; transform: translateX(-50%); background: rgba(0, 0, 0, 0.7); color: white; padding: 8px 16px; border-radius: 4px; font-size: 14px; z-index: 10000; `; toast.textContent = message; document.body.appendChild(toast); setTimeout(() => document.body.removeChild(toast), 2000); } // 获取显示设置 function getDisplaySettings() { return JSON.parse(localStorage.getItem('promptDisplaySettings') || JSON.stringify({ showName: true, showContent: true, showComment: true, showCategory: true, isSimplified: false })); } // 保存显示设置 function saveDisplaySettings(settings) { localStorage.setItem('promptDisplaySettings', JSON.stringify(settings)); } // 加载提示词 function loadPrompts(searchTerm = '') { const promptList = document.getElementById('promptList'); const prompts = JSON.parse(localStorage.getItem('aiPrompts') || '{}'); const selectedCategory = document.getElementById('categorySelect').value; const settings = getDisplaySettings(); promptList.innerHTML = ''; // 按分类组织提示词 const categorizedPrompts = {}; Object.entries(prompts).forEach(([name, data]) => { if (searchTerm && !name.toLowerCase().includes(searchTerm.toLowerCase()) && !data.content.toLowerCase().includes(searchTerm.toLowerCase())) { return; } if (selectedCategory !== 'all' && data.category !== selectedCategory) { return; } if (!categorizedPrompts[data.category]) { categorizedPrompts[data.category] = []; } categorizedPrompts[data.category].push({name, ...data}); }); Object.entries(categorizedPrompts).forEach(([category, items]) => { const categorySection = document.createElement('div'); categorySection.className = 'category-section'; categorySection.innerHTML = `<div class="category-title">${category}</div>`; items.forEach(item => { const div = document.createElement('div'); div.className = 'prompt-item'; // 根据设置显示内容 if (settings.showName) { const nameDiv = document.createElement('div'); nameDiv.className = 'prompt-name'; nameDiv.textContent = item.name; div.appendChild(nameDiv); } if (settings.showContent) { const contentDiv = document.createElement('div'); contentDiv.className = `prompt-content ${settings.isSimplified ? 'simplified' : ''}`; contentDiv.textContent = item.content; if (settings.isSimplified) { contentDiv.title = item.content; contentDiv.addEventListener('click', function() { this.classList.toggle('simplified'); }); } div.appendChild(contentDiv); } if (settings.showComment && item.comment) { const commentDiv = document.createElement('div'); commentDiv.className = 'prompt-comment'; commentDiv.textContent = `注释: ${item.comment}`; div.appendChild(commentDiv); } if (settings.showCategory) { const categoryDiv = document.createElement('div'); categoryDiv.className = 'prompt-category'; categoryDiv.textContent = `分类: ${item.category}`; div.appendChild(categoryDiv); } // 创建按钮容器 const buttonDiv = document.createElement('div'); buttonDiv.style.textAlign = 'right'; // 创建复制按钮 const copyButton = document.createElement('button'); copyButton.textContent = '复制'; copyButton.dataset.content = item.content; copyButton.addEventListener('click', function() { copyPromptContent(this.dataset.content); }); // 创建删除按钮 const deleteButton = document.createElement('button'); deleteButton.textContent = '删除'; deleteButton.dataset.name = item.name; deleteButton.addEventListener('click', function() { deletePrompt(this.dataset.name); }); buttonDiv.appendChild(copyButton); buttonDiv.appendChild(deleteButton); div.appendChild(buttonDiv); categorySection.appendChild(div); }); promptList.appendChild(categorySection); }); } // 初始化事件 function initEvents() { // 搜索功能 document.getElementById('searchPrompt').addEventListener('input', function(e) { loadPrompts(e.target.value); }); // 分类筛选 document.getElementById('categorySelect').addEventListener('change', function() { loadPrompts(document.getElementById('searchPrompt').value); }); // 新增提示词表单显示/隐藏 document.getElementById('addNewPrompt').addEventListener('click', function() { document.getElementById('addPromptForm').classList.add('active'); }); document.getElementById('cancelPrompt').addEventListener('click', function() { document.getElementById('addPromptForm').classList.remove('active'); clearForm(); }); // 保存提示词 document.getElementById('savePrompt').addEventListener('click', function() { const name = document.getElementById('promptName').value; const content = document.getElementById('promptContent').value; const comment = document.getElementById('promptComment').value; const category = document.getElementById('promptCategory').value; if (name && content) { savePrompt(name, content, comment, category); clearForm(); document.getElementById('addPromptForm').classList.remove('active'); loadPrompts(); } }); // 管理分类按钮 document.getElementById('manageCategories').addEventListener('click', function() { document.getElementById('manageCategoriesForm').classList.toggle('active'); }); // 添加新分类 document.getElementById('addCategory').addEventListener('click', function() { const newCategoryInput = document.getElementById('newCategory'); const newCategory = newCategoryInput.value.trim(); if (newCategory && !getCategories().includes(newCategory)) { const categories = getCategories(); categories.push(newCategory); saveCategories(categories); updateCategorySelectors(); updateCategoryList(); newCategoryInput.value = ''; } }); // 窗口控制 document.getElementById('toggleHelper').addEventListener('click', function() { const helper = document.querySelector('.prompt-helper'); const toggleButton = document.querySelector('.toggle-button'); helper.classList.toggle('collapsed'); toggleButton.style.display = helper.classList.contains('collapsed') ? 'block' : 'none'; }); // 为promptList添加事件委托 document.getElementById('promptList').addEventListener('click', function(e) { if (e.target.tagName === 'BUTTON') { if (e.target.textContent === '复制') { copyPromptContent(decodeURIComponent(e.target.getAttribute('data-content'))); } else if (e.target.textContent === '删除') { deletePrompt(decodeURIComponent(e.target.getAttribute('data-name'))); } } }); // 导入文件按钮点击事件 document.getElementById('importBtn').addEventListener('click', function() { document.getElementById('fileInput').click(); }); // 文件选择变化事件 document.getElementById('fileInput').addEventListener('change', handleFileImport); // 下载模板按钮点击事件 document.getElementById('downloadTemplate').addEventListener('click', downloadTemplate); // 添加拖拽相关事件 const importSection = document.querySelector('.import-section'); ['dragenter', 'dragover', 'dragleave', 'drop'].forEach(eventName => { importSection.addEventListener(eventName, preventDefaults, false); document.body.addEventListener(eventName, preventDefaults, false); }); function preventDefaults(e) { e.preventDefault(); e.stopPropagation(); } ['dragenter', 'dragover'].forEach(eventName => { importSection.addEventListener(eventName, highlight, false); }); ['dragleave', 'drop'].forEach(eventName => { importSection.addEventListener(eventName, unhighlight, false); }); function highlight(e) { importSection.classList.add('dragover'); } function unhighlight(e) { importSection.classList.remove('dragover'); } importSection.addEventListener('drop', handleDrop, false); function handleDrop(e) { const dt = e.dataTransfer; const files = dt.files; if (files.length) { handleFileImport({ target: { files: [files[0]] } }); } } // 设置按钮点击事件 document.getElementById('settingsBtn').addEventListener('click', function(e) { e.stopPropagation(); document.getElementById('settingsMenu').classList.toggle('active'); }); // 点击其他地方关闭设置菜单 document.addEventListener('click', function(e) { const settingsMenu = document.getElementById('settingsMenu'); if (!settingsMenu.contains(e.target) && e.target.id !== 'settingsBtn') { settingsMenu.classList.remove('active'); } }); // 设置选项变化事件 ['showName', 'showContent', 'showComment', 'showCategory', 'isSimplified'].forEach(id => { document.getElementById(id).addEventListener('change', function() { const settings = getDisplaySettings(); settings[id] = this.checked; saveDisplaySettings(settings); loadPrompts(document.getElementById('searchPrompt').value); }); }); // 导入区域显示/隐藏 document.getElementById('importToggle').addEventListener('click', function() { const importSection = document.getElementById('importSection'); const importToggle = document.getElementById('importToggle'); importSection.classList.toggle('collapsed'); importToggle.classList.toggle('collapsed'); }); } // 更新分类选择器 function updateCategorySelectors() { const categories = getCategories(); const selectors = document.querySelectorAll('#categorySelect, #promptCategory'); selectors.forEach(selector => { const currentValue = selector.value; selector.innerHTML = selector.id === 'categorySelect' ? '<option value="all">所有分类</option>' : ''; categories.forEach(category => { selector.innerHTML += `<option value="${category}">${category}</option>`; }); if (currentValue && categories.includes(currentValue)) { selector.value = currentValue; } }); } // 下载Excel模板 function downloadTemplate() { const template = [ ['名称', '内容', '注释', '分类'], ['示例1', '这是一个示例提示词', '这是注释', '创作'], ['示例2', '这是另一个示例', '可选的注释', '洗稿'] ]; // 创建工作簿 const wb = XLSX.utils.book_new(); const ws = XLSX.utils.aoa_to_sheet(template); XLSX.utils.book_append_sheet(wb, ws, "提示词"); // 生成Excel文件并下载 XLSX.writeFile(wb, '提示词模板.xlsx'); } // 处理导入的文件 function handleFileImport(event) { const file = event.target.files[0]; if (!file) return; const fileExtension = file.name.split('.').pop().toLowerCase(); if (fileExtension === 'xlsx' || fileExtension === 'xls') { // 处理Excel文件 const reader = new FileReader(); reader.onload = function(e) { try { const data = new Uint8Array(e.target.result); const workbook = XLSX.read(data, {type: 'array'}); const firstSheetName = workbook.SheetNames[0]; const worksheet = workbook.Sheets[firstSheetName]; // 转换为数组格式 const rows = XLSX.utils.sheet_to_json(worksheet, {header: 1}); if (rows.length < 2) { showToast('Excel文件内容为空'); return; } const prompts = JSON.parse(localStorage.getItem('aiPrompts') || '{}'); let importCount = 0; // 跳过标题行 for (let i = 1; i < rows.length; i++) { const row = rows[i]; if (!row || row.length === 0) continue; const [name, content, comment, category] = row; if (name && content) { prompts[name] = { content: content, comment: comment || '', category: category || '其他' }; importCount++; } } localStorage.setItem('aiPrompts', JSON.stringify(prompts)); showToast(`成功导入 ${importCount} 个提示词`); loadPrompts(); } catch (err) { console.error('Excel解析失败:', err); showToast('Excel文件格式错误,请检查格式是否正确'); } }; reader.readAsArrayBuffer(file); } else if (fileExtension === 'csv') { // 处理CSV文件的现有代码 handleCSVImport(file); } else { showToast('不支持的文件格式,请使用.xlsx、.xls或.csv格式'); } } // 处理CSV文件导入 function handleCSVImport(file) { // 尝试不同的编码 function tryReadFile(encoding) { return new Promise((resolve, reject) => { const reader = new FileReader(); reader.onload = function(e) { try { const text = e.target.result; // 检查是否包含乱码字符 if (text.includes('�')) { reject('encoding_error'); return; } resolve(text); } catch (err) { reject(err); } }; reader.onerror = reject; reader.readAsText(file, encoding); }); } // 按顺序尝试不同的编码 const encodings = ['UTF-8', 'GBK', 'GB2312', 'BIG5']; let currentEncodingIndex = 0; function tryNextEncoding() { if (currentEncodingIndex >= encodings.length) { showToast('无法正确读取文件,请确保文件编码正确'); return; } const currentEncoding = encodings[currentEncodingIndex]; tryReadFile(currentEncoding) .then(text => { try { // 处理 BOM 标记 const content = text.replace(/^\uFEFF/, ''); const rows = content.split(/\r?\n/); const prompts = JSON.parse(localStorage.getItem('aiPrompts') || '{}'); let importCount = 0; // 跳过标题行 for (let i = 1; i < rows.length; i++) { const row = rows[i].trim(); if (!row) continue; // 使用更可靠的CSV解析方式 let columns = []; let currentColumn = ''; let inQuotes = false; // 手动解析CSV,处理引号内的逗号 for (let j = 0; j < row.length; j++) { const char = row[j]; if (char === '"') { inQuotes = !inQuotes; } else if (char === ',' && !inQuotes) { columns.push(currentColumn.trim()); currentColumn = ''; } else { currentColumn += char; } } columns.push(currentColumn.trim()); // 清理引号 columns = columns.map(col => col.replace(/^["']|["']$/g, '')); if (columns.length >= 2) { const [name, content, comment, category] = columns; if (name && content) { prompts[name] = { content: content, comment: comment || '', category: category || '其他' }; importCount++; } } } localStorage.setItem('aiPrompts', JSON.stringify(prompts)); showToast(`成功导入 ${importCount} 个提示词`); loadPrompts(); } catch (err) { console.error('解析失败:', err); showToast('文件格式错误,请检查CSV格式是否正确'); } }) .catch(err => { if (err === 'encoding_error') { currentEncodingIndex++; tryNextEncoding(); } else { console.error('导入失败:', err); showToast('导入失败,请检查文件格式'); } }); } tryNextEncoding(); } // 创建UI function createUI() { // 添加切换按钮 const toggleButton = document.createElement('button'); toggleButton.className = 'toggle-button'; toggleButton.textContent = '提示词助手'; toggleButton.onclick = function() { const helper = document.querySelector('.prompt-helper'); helper.classList.toggle('collapsed'); this.style.display = helper.classList.contains('collapsed') ? 'block' : 'none'; }; document.body.appendChild(toggleButton); const container = document.createElement('div'); container.className = 'prompt-helper'; container.innerHTML = ` <h3> <span class="title">AI提示词助手</span> <div class="buttons"> <button id="settingsBtn">设置</button> <button id="toggleHelper">收起</button> </div> </h3> <div class="settings-menu" id="settingsMenu"> <h4>显示设置</h4> <div class="settings-item"> <label> <input type="checkbox" id="showName" ${getDisplaySettings().showName ? 'checked' : ''}> 显示名称 </label> </div> <div class="settings-item"> <label> <input type="checkbox" id="showContent" ${getDisplaySettings().showContent ? 'checked' : ''}> 显示内容 </label> </div> <div class="settings-item"> <label> <input type="checkbox" id="showComment" ${getDisplaySettings().showComment ? 'checked' : ''}> 显示注释 </label> </div> <div class="settings-item"> <label> <input type="checkbox" id="showCategory" ${getDisplaySettings().showCategory ? 'checked' : ''}> 显示分类 </label> </div> <div class="settings-item"> <label> <input type="checkbox" id="isSimplified" ${getDisplaySettings().isSimplified ? 'checked' : ''}> 简化显示(点击展开) </label> </div> <div class="author-info"> <p>作者:初沐</p> <p>联系方式:<a href="mailto:[email protected]">[email protected]</a></p> <p>如有问题或建议,欢迎反馈</p> </div> </div> <div class="import-toggle" id="importToggle"> <div class="arrow"></div> <span class="import-toggle-text">导入提示词</span> </div> <div class="import-section collapsed" id="importSection"> <p>拖拽文件到此处或点击下方按钮导入</p> <input type="file" id="fileInput" accept=".csv,.xlsx,.xls"> <button id="importBtn">导入提示词</button> <button id="downloadTemplate">下载模板</button> </div> <input type="text" id="searchPrompt" class="search-box" placeholder="搜索提示词..."> <div class="controls"> <select id="categorySelect" style="flex: 1"> <option value="all">所有分类</option> ${getCategories().map(category => `<option value="${category}">${category}</option>`).join('')} </select> <button id="addNewPrompt">新增提示词</button> <button id="manageCategories">分类管理</button> </div> <div id="manageCategoriesForm" class="manage-categories"> <div style="display: flex; gap: 8px; margin-bottom: 10px;"> <input type="text" id="newCategory" placeholder="输入新分类名称" style="flex: 1"> <button id="addCategory">添加分类</button> </div> <div class="category-list" id="categoryList"></div> </div> <div id="addPromptForm" class="add-prompt-form"> <input type="text" id="promptName" placeholder="提示词名称" style="width: 100%"> <textarea id="promptContent" placeholder="提示词内容" style="width: 100%; height: 80px; margin: 8px 0"></textarea> <textarea id="promptComment" placeholder="注释(可选)" style="width: 100%; height: 40px"></textarea> <select id="promptCategory" style="width: 100%; margin: 8px 0"> <option value="洗稿">洗稿</option> <option value="创作">创作</option> <option value="翻译">翻译</option> <option value="其他">其他</option> </select> <div style="text-align: right"> <button id="cancelPrompt">取消</button> <button id="savePrompt">保存</button> </div> </div> <div class="prompt-list" id="promptList"></div> `; document.body.appendChild(container); // 初始化事件 initEvents(); loadPrompts(); updateCategoryList(); } // 初始化 createUI(); })();