Compare commits

..

1 Commits

@ -191,7 +191,7 @@ A: 系统设计注重引导而非替代1AI提供建议而非直接答案
## 联系我们
### 开发团队
- **技术支持**267278466@qq.com
- **技术支持**
## 开源协议

@ -558,6 +558,167 @@ For each error found, please provide:
grammar_data['score'] = max(0, min(100, grammar_data['score']))
return grammar_data
def vocabulary_upgrade(self, content: str, context: Dict,
user_settings: Optional[Dict] = None) -> Dict:
"""升级词汇,识别基础词汇并提供高阶替代"""
settings = self._get_ai_settings(user_settings)
model = self._create_llm_model(settings)
# 提取上下文信息
ctx_info = self._extract_context_info(context)
# 根据学科制作不同的提示词
if ctx_info['subject'] == '英语':
prompt = f"""As an experienced American English writing instructor, please analyze this {ctx_info['article_type']} and identify basic vocabulary that can be upgraded to more sophisticated alternatives.
Topic: {ctx_info['topic']}
Student's Content:
{content}
Please identify 5-8 basic words or phrases that could be replaced with more advanced vocabulary appropriate for {ctx_info['grade']} level American academic writing.
For each vocabulary item, provide:
1. The original basic word/phrase
2. 2-3 more sophisticated alternatives with explanations
3. Example sentences showing proper usage
4. Contextual guidance on when to use each alternative
Focus on vocabulary that would make the writing sound more like a native American student's work.
请用完整JSON格式回复包含以下字段讲解文字用中文示范文字用英文
- overall_assessment: 总体词汇水平评估中文
- total_suggestions: 总建议数量
- vocabulary_suggestions: 词汇建议列表每个建议包含
- original_word: 原始词汇
- alternatives: 替代词汇列表每个包含
- word: 高阶词汇
- meaning: 词汇含义解释中文
- usage_example: 使用示例英文
- explanation: 升级理由中文
- difficulty_level: 难度等级初级/中级/高级
- learning_tips: 学习建议列表中文
- next_steps: 后续学习步骤中文"""
else:
prompt = f"""作为专业的{ctx_info['subject']}写作指导老师,请分析这篇{ctx_info['article_type']}并识别可以升级的基础词汇。
题目{ctx_info['topic']}
学生作文
{content}
请识别5-8个可以升级的基础词汇或短语为每个词汇提供更高级的替代方案
对于每个词汇项目请提供
1. 原始基础词汇
2. 2-3个更高级的替代词汇及解释
3. 使用示例句子
4. 使用场景指导
请用JSON格式回复包含以下字段
- overall_assessment: 总体词汇水平评估
- total_suggestions: 总建议数量
- vocabulary_suggestions: 词汇建议列表每个建议包含
- original_word: 原始词汇
- alternatives: 替代词汇列表每个包含
- word: 高阶词汇
- meaning: 词汇含义解释
- usage_example: 使用示例
- explanation: 升级理由
- difficulty_level: 难度等级初级/中级/高级
- learning_tips: 学习建议列表
- next_steps: 后续学习步骤"""
try:
result = quick_generate(
prompt=prompt,
model=model,
max_tokens=1200,
grade=ctx_info['grade'],
subject=ctx_info['subject'],
topic=ctx_info['topic'],
requirement="词汇升级分析",
json_mode=True,
temperature=0.3
)
print("===== 词汇升级返回数据 =====")
print(result)
print("==========================")
try:
vocabulary_data = json.loads(result)
except json.JSONDecodeError:
# 尝试提取JSON部分
import re
json_match = re.search(r'\{.*\}', result, re.DOTALL)
if json_match:
try:
vocabulary_data = json.loads(json_match.group(0))
except json.JSONDecodeError:
logger.error("[词汇升级] 提取到的JSON片段解析失败")
return self._get_default_vocabulary_response(content)
else:
logger.error("[词汇升级] AI返回内容非JSON且未能提取JSON片段")
return self._get_default_vocabulary_response(content)
# 验证和补充词汇升级数据
vocabulary_data = self._validate_vocabulary_data(vocabulary_data, content)
return vocabulary_data
except Exception as e:
logger.error(f"词汇升级失败: {str(e)}")
return self._get_default_vocabulary_response(content, str(e))
def _get_default_vocabulary_response(self, content: str, error_msg: str = "") -> Dict:
"""获取默认的词汇升级响应"""
return {
"overall_assessment": "词汇升级功能暂时不可用" + (f"{error_msg}" if error_msg else ""),
"total_suggestions": 0,
"vocabulary_suggestions": [],
"learning_tips": ["请检查网络连接后重试", "建议先保存作品再尝试词汇升级"],
"next_steps": ["继续积累词汇量", "多阅读优秀范文"],
"error": error_msg or "未知错误"
}
def _validate_vocabulary_data(self, vocabulary_data: Dict, content: str) -> Dict:
"""验证和补充词汇升级数据"""
# 确保必要字段存在
required_fields = {
'overall_assessment': '词汇使用基本正确,有提升空间。',
'total_suggestions': 0,
'vocabulary_suggestions': [],
'learning_tips': ['多阅读优秀作品,积累词汇'],
'next_steps': ['定期复习升级的词汇']
}
for field, default_value in required_fields.items():
if field not in vocabulary_data or vocabulary_data[field] is None:
vocabulary_data[field] = default_value
# 确保vocabulary_suggestions是列表格式
if not isinstance(vocabulary_data.get('vocabulary_suggestions'), list):
vocabulary_data['vocabulary_suggestions'] = []
# 计算总建议数如果与vocabulary_suggestions不一致
if vocabulary_data['total_suggestions'] == 0 and vocabulary_data['vocabulary_suggestions']:
vocabulary_data['total_suggestions'] = len(vocabulary_data['vocabulary_suggestions'])
# 确保每个建议都有必要的字段
for suggestion in vocabulary_data['vocabulary_suggestions']:
if 'original_word' not in suggestion:
suggestion['original_word'] = '未知词汇'
if 'alternatives' not in suggestion or not isinstance(suggestion.get('alternatives'), list):
suggestion['alternatives'] = []
if 'explanation' not in suggestion:
suggestion['explanation'] = '可以升级为更高级的词汇'
if 'difficulty_level' not in suggestion:
suggestion['difficulty_level'] = '中级'
return vocabulary_data
def generate_suggestions(self, content: str, context: Dict,
suggestion_type: str = "improvement",
@ -1174,4 +1335,9 @@ def sync_health_check() -> Dict[str, Any]:
def sync_check_grammar(content: str, context: Dict,
user_settings: Optional[Dict] = None) -> Dict:
"""同步语法检查"""
return ai_service.check_grammar(content, context, user_settings)
return ai_service.check_grammar(content, context, user_settings)
def sync_vocabulary_upgrade(content: str, context: Dict,
user_settings: Optional[Dict] = None) -> Dict:
"""同步词汇升级"""
return ai_service.vocabulary_upgrade(content, context, user_settings)

@ -72,7 +72,16 @@ class ProjectDAO:
def __exit__(self, exc_type, exc_val, exc_tb):
pass
def update_project(self, project_id: int, **kwargs) -> Optional[Dict]:
"""更新项目信息"""
return ProjectStorage.update_project(project_id, **kwargs)
def save_vocabulary_upgrade(self, project_id: int, vocabulary_data: Dict[str, Any]) -> Optional[Dict]:
"""保存词汇升级结果"""
vocabulary_json = json.dumps(vocabulary_data, ensure_ascii=False)
return ProjectStorage.update_project(project_id, vocabulary_upgrade=vocabulary_json)
def save_grammar_check(self, project_id: int, grammar_data: Dict[str, Any]) -> Optional[Dict]:
"""保存语法检查结果"""
grammar_json = json.dumps(grammar_data, ensure_ascii=False)

@ -7,7 +7,7 @@ from datetime import datetime
import json
from json_dao import UserDAO, ProjectDAO, with_user_dao, with_project_dao, dict_to_user, dict_to_project, dicts_to_projects
from ai_service import sync_generate_topic, sync_analyze_content, sync_evaluate_article, sync_health_check, sync_test_connection, sync_generate_suggestions, sync_generate_stage_suggestions, sync_check_grammar
from ai_service import sync_generate_topic, sync_analyze_content, sync_evaluate_article, sync_health_check, sync_test_connection, sync_generate_suggestions, sync_generate_stage_suggestions, sync_check_grammar,sync_vocabulary_upgrade
from scoring_service import ScoringService
from ai_service import AIService
@ -770,6 +770,102 @@ def generate_suggestions():
traceback.print_exc()
return error_response(f"生成建议失败: {str(e)}", 500)
@api_bp.route('/ai/vocabulary_upgrade', methods=['POST'])
def vocabulary_upgrade():
"""词汇升级"""
# 自动设置为已登录状态
if 'user_id' not in session:
session['user_id'] = 1
session['username'] = '267278466@qq.com'
user_id = session.get('user_id')
try:
data = request.get_json()
content = data.get('content')
project_id = data.get('project_id')
if not content:
return error_response("内容不能为空")
# 获取用户信息
@with_user_dao
def _get_user_data(dao):
user = dao.get_user_by_id(user_id)
return user # JSON DAO直接返回字典
user_data = _get_user_data()
if not user_data:
return error_response("用户不存在", 404)
# 获取项目信息
project_data = None
if project_id:
@with_project_dao
def _get_project_data(dao):
proj = dao.get_project_by_id(project_id)
return proj if proj and proj.get('user_id') == user_id else None
project_data = _get_project_data()
# 构建AI上下文 - 优先使用项目的年级和学科信息
if project_data:
# 使用项目的年级和学科信息
context = {
'grade': project_data.get('grade', user_data.get('grade', '')),
'subject': project_data.get('subject', user_data.get('subject', '')),
'content': content,
'topic': project_data.get('topic', ''),
'article_type': project_data.get('article_type', ''),
'title': project_data.get('title', '')
}
else:
# 没有项目信息时使用用户设置
context = {
'grade': user_data.get('grade', ''),
'subject': user_data.get('subject', ''),
'content': content,
'topic': data.get('topic', ''),
'article_type': data.get('article_type', '')
}
# 获取用户AI设置
user_ai_settings = get_user_ai_settings(user_id)
# 词汇升级
vocabulary_result = sync_vocabulary_upgrade(
content=content,
context=context,
user_settings=user_ai_settings
)
# 保存词汇升级结果到项目
if project_id:
@with_project_dao
def _save_vocabulary_result(dao):
project = dao.get_project_by_id(project_id)
if project and project.get('user_id') == user_id:
# 更新项目的词汇升级信息
vocab_data_str = project.get('vocabulary_upgrade', '{}')
if not vocab_data_str or vocab_data_str.strip() == '':
vocab_data_str = '{}'
vocab_data = json.loads(vocab_data_str)
vocab_data['latest_upgrade'] = vocabulary_result
vocab_data['last_upgraded_at'] = datetime.utcnow().isoformat()
# 使用DAO更新项目 - 需要先添加这个字段到项目存储
dao.save_vocabulary_upgrade(project_id, vocab_data)
return True
return False
_save_vocabulary_result()
return success_response(vocabulary_result)
except Exception as e:
import traceback
traceback.print_exc()
return error_response(f"词汇升级失败: {str(e)}", 500)
@api_bp.route('/ai/check_grammar', methods=['POST'])
def check_grammar():
"""检查语法错误"""

@ -416,6 +416,9 @@
<button class="btn btn-outline-warning btn-sm w-100" onclick="checkGrammar()">
<i class="fas fa-spell-check me-1"></i> 语法检查
</button>
<button class="btn btn-outline-info btn-sm w-100" onclick="vocabularyUpgrade()">
<i class="fas fa-language me-1"></i> 词汇升级
</button>
</div>
<div class="ai-feedback" id="aiFeedback">
@ -1201,6 +1204,47 @@
.recommendation {
border-left: 4px solid #0dcaf0;
}
/* 词汇升级特定样式 */
.vocabulary-upgrade-result {
height: auto;
overflow-y: auto;
}
.suggestion-item {
border-left: 4px solid #28a745;
transition: all 0.3s ease;
}
.suggestion-item:hover {
box-shadow: 0 2px 8px rgba(0,0,0,0.1);
transform: translateY(-1px);
}
.alternative-item {
border: 1px solid #dee2e6;
transition: all 0.3s ease;
}
.alternative-item:hover {
border-color: #28a745;
background-color: #f8fff9 !important;
}
.assessment-content {
line-height: 1.6;
color: #495057;
}
.usage code {
background: transparent;
color: #f8f9fa;
border: none;
font-family: 'Courier New', monospace;
}
.learning-tips li, .next-steps li {
border-radius: 6px;
}
</style>
{% endblock %}
@ -1493,6 +1537,213 @@ async function getAISuggestions() {
}
}
// 词汇升级功能
async function vocabularyUpgrade() {
const textarea = document.getElementById(currentStage + 'Content');
const content = textarea.value.trim();
if (!content) {
Utils.showAlert('请先输入要升级的内容', 'warning');
return;
}
// 获取AI设置
const userSettings = Utils.getUserSettings();
if (!userSettings.aiProvider || !userSettings.aiModel) {
Utils.showAlert('请先配置AI设置', 'warning');
return;
}
// 构建AI设置对象
const parsedSettings = {
provider: userSettings.aiProvider,
model: userSettings.aiModel,
base_url: userSettings.aiBaseUrl,
api_key: localStorage.getItem('aiApiKey') || ''
};
showLoading('AI正在分析词汇并生成升级建议...');
try {
// 获取项目信息
const projectResponse = await fetch(`/api/projects/${projectId}`);
let grade = '初中';
let subject = '语文';
if (projectResponse.ok) {
const projectData = await projectResponse.json();
if (projectData.success && projectData.data) {
grade = projectData.data.grade || '初中';
subject = projectData.data.subject || '语文';
}
}
const response = await fetch('/api/ai/vocabulary_upgrade', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
project_id: projectId,
content: content,
grade: grade,
subject: subject,
ai_provider: parsedSettings.provider,
ai_model: parsedSettings.model,
ai_base_url: parsedSettings.base_url,
ai_api_key: parsedSettings.api_key
})
});
if (!response.ok) {
throw new Error(`HTTP ${response.status}`);
}
const result = await response.json();
if (result.success) {
displayVocabularyResult(result.data);
} else {
Utils.showAlert('词汇升级失败:' + result.message, 'error');
}
} catch (error) {
console.error('词汇升级错误:', error);
Utils.showAlert('词汇升级失败,请检查网络连接', 'error');
} finally {
hideLoading();
}
}
// 显示词汇升级结果
function displayVocabularyResult(vocabularyData) {
const feedbackDiv = document.getElementById('aiFeedback');
let html = '<div class="vocabulary-upgrade-result">';
// 总体评估
html += '<div class="vocabulary-header mb-4 p-3 bg-light rounded">';
html += '<h6 class="text-primary mb-2"><i class="fas fa-language me-2"></i>词汇升级报告</h6>';
if (vocabularyData.overall_assessment) {
html += `<div class="mb-3">
<div class="fw-bold text-secondary mb-1">总体评估:</div>
<div class="assessment-content">${vocabularyData.overall_assessment}</div>
</div>`;
}
if (vocabularyData.total_suggestions !== undefined) {
const suggestionCount = parseInt(vocabularyData.total_suggestions);
html += `<div class="d-flex align-items-center mb-2">
<span class="me-3">升级建议:</span>
<span class="badge ${suggestionCount > 0 ? 'bg-success' : 'bg-secondary'}">${suggestionCount} 个词汇可升级</span>
</div>`;
}
html += '</div>';
// 词汇建议列表
if (vocabularyData.vocabulary_suggestions && vocabularyData.vocabulary_suggestions.length > 0) {
html += '<div class="vocabulary-suggestions mb-4">';
html += '<h6 class="text-success mb-3"><i class="fas fa-lightbulb me-2"></i>词汇升级建议</h6>';
vocabularyData.vocabulary_suggestions.forEach((suggestion, index) => {
html += `<div class="suggestion-item mb-4 p-3 border rounded">`;
html += `<div class="suggestion-header d-flex justify-content-between align-items-center mb-3">`;
html += `<div>
<span class="badge bg-primary me-2">建议 ${index + 1}</span>
<span class="fw-bold text-danger">${suggestion.original_word || '未知词汇'}</span>
<span class="text-muted ms-2"></span>
</div>`;
html += `<span class="badge bg-secondary">${suggestion.difficulty_level || '中级'}</span>`;
html += `</div>`;
if (suggestion.explanation) {
html += `<div class="explanation mb-3">
<div class="text-muted small">升级理由:</div>
<div class="fw-bold">${suggestion.explanation}</div>
</div>`;
}
// 替代词汇
if (suggestion.alternatives && suggestion.alternatives.length > 0) {
html += '<div class="alternatives">';
html += '<div class="text-success fw-bold mb-2">推荐替代词汇:</div>';
suggestion.alternatives.forEach((alternative, altIndex) => {
html += `<div class="alternative-item mb-3 p-2 bg-light rounded">`;
html += `<div class="d-flex align-items-center mb-2">
<span class="badge bg-success me-2">${altIndex + 1}</span>
<span class="fw-bold text-primary">${alternative.word || '未知词汇'}</span>
</div>`;
if (alternative.meaning) {
html += `<div class="meaning mb-2">
<div class="text-muted small">含义:</div>
<div>${alternative.meaning}</div>
</div>`;
}
if (alternative.usage_example) {
html += `<div class="usage">
<div class="text-muted small">使用示例:</div>
<div class="bg-dark text-white p-2 rounded mt-1">
<code>${alternative.usage_example}</code>
</div>
</div>`;
}
html += `</div>`;
});
html += '</div>';
}
html += `</div>`;
});
html += '</div>';
} else {
html += '<div class="text-center text-muted py-4">';
html += '<i class="fas fa-check-circle fa-3x mb-3 text-success"></i>';
html += '<p class="mb-0">恭喜!当前词汇使用恰当,暂无升级建议</p>';
html += '</div>';
}
// 学习建议
if (vocabularyData.learning_tips && vocabularyData.learning_tips.length > 0) {
html += '<div class="learning-tips mb-4">';
html += '<h6 class="text-info mb-3"><i class="fas fa-graduation-cap me-2"></i>学习建议</h6>';
html += '<ul class="list-unstyled">';
vocabularyData.learning_tips.forEach(tip => {
html += `<li class="mb-2 p-2 bg-info bg-opacity-10 rounded">
<i class="fas fa-chevron-right text-info me-2"></i>${tip}
</li>`;
});
html += '</ul></div>';
}
// 后续步骤
if (vocabularyData.next_steps && vocabularyData.next_steps.length > 0) {
html += '<div class="next-steps">';
html += '<h6 class="text-warning mb-3"><i class="fas fa-road me-2"></i>后续步骤</h6>';
html += '<ul class="list-unstyled">';
vocabularyData.next_steps.forEach(step => {
html += `<li class="mb-2 p-2 bg-warning bg-opacity-10 rounded">
<i class="fas fa-flag text-warning me-2"></i>${step}
</li>`;
});
html += '</ul></div>';
}
html += '</div>';
feedbackDiv.innerHTML = html;
// 添加滚动到顶部功能
feedbackDiv.scrollTop = 0;
}
// 显示AI建议
function displayAISuggestions(suggestions) {
const feedbackDiv = document.getElementById('aiFeedback');

@ -10,13 +10,33 @@
"brainstorm_content": "",
"outline_content": "",
"writing_content": "Generative AI, such as large language models, are becoming increasingly popular. They offers students a powerful tool for complete homework and generating ideas. However, its impact on learning ability are a subject of intense debate.\n\nOn one hand, it is argued that AI hinder the development of critical thinking. When a student rely on AI to write essays, they doesn't engage in the rigorous process of research and analysis their own. This lead to a superficial understanding and a failure to develop their own voice. Furthermore, the convenience of AI means that less effort are put into mastering fundamental skills, such as grammar and structuring arguments.",
"ai_feedback": "{\"writing_analysis\": {\"strengths\": [\"文章结构清晰,采用了标准的议论文框架:引入话题-正反论证-总结观点\", \"能够从正反两个角度分析AI对学习的影响体现了辩证思维\", \"结论段明确提出了核心观点,强调使用方式而非技术本身决定影响\", \"使用了适当的学术词汇如'critical thinking''personalized tutor'等\"], \"issues\": [\"语法错误较多,特别是主谓一致问题(如'are becoming''it offers''they doesn't'等)\", \"论点发展不够深入,缺乏具体例证和数据支持\", \"过渡词使用单一,缺乏美国学术写作中常见的递进、转折等复杂过渡\", \"部分表达不够地道,存在中式英语痕迹(如'more better than before'\", \"论点之间的逻辑衔接可以更紧密,缺乏对反论的深入反驳\"], \"suggestions\": [{\"讲解\": \"修正主谓一致等基础语法错误,确保语言准确性\", \"示例\": \"Generative AI, such as large language models, is becoming increasingly popular. It offers students a powerful tool for completing homework and generating ideas. However, its impact on learning ability is a subject of intense debate.\"}, {\"讲解\": \"在主题句后添加具体例证,增强说服力\", \"示例\": \"When students rely exclusively on AI to write essays, they bypass the rigorous process of research and analysis. For instance, instead of wrestling with primary sources to form original arguments, they might simply paraphrase AI-generated content, resulting in a superficial understanding and failure to develop their own academic voice.\"}, {\"讲解\": \"使用更丰富的过渡词和逻辑连接词\", \"示例\": \"While critics emphasize the risks of over-reliance, proponents counter that AI, when used judiciously, can serve as a personalized tutor. Specifically, it can adapt explanations to individual learning styles, breaking down complex concepts until the student achieves genuine comprehension.\"}, {\"讲解\": \"改进结论段,使其更具深度和号召力\", \"示例\": \"Ultimately, the educational impact of generative AI depends less on the technology itself and more on the intentionality behind its use. The key lies in leveraging it as a supplement to—not a replacement for—authentic intellectual engagement, ensuring that technology enhances rather than diminishes our cognitive development.\"}, {\"讲解\": \"使用更地道的学术表达方式\", \"示例\": \"Furthermore, the convenience of AI may reduce the effort students invest in mastering fundamental skills. This could potentially undermine their long-term academic growth, as proficiency in grammar and logical argumentation requires consistent practice and refinement.\"}], \"next_steps\": [\"系统学习英语主谓一致、时态等基础语法规则\", \"阅读美国学生的议论文范文,观察其论证结构和语言风格\", \"练习使用具体的例子、数据或研究结果来支持抽象论点\", \"积累学术写作常用的过渡词和表达方式\", \"完成写作后多次修改,重点关注逻辑流畅性和语言地道性\", \"尝试在正反论证后加入综合分析的段落,展现更高层次的批判性思维\"]}}",
"ai_feedback": "{\"writing_analysis\": {\"strengths\": [\"能够识别AI对学习的潜在负面影响特别是批判性思维和基础技能方面显示出对主题的基本理解\", \"尝试从不同角度展开讨论,体现了初步的论证意识\", \"使用了一些学术写作的基本元素,如'On one hand'这样的过渡词\"], \"issues\": [\"缺乏明确的中心论点(thesis statement),文章方向不清晰\", \"段落缺乏有力的主题句(topic sentence),论证结构松散\", \"语法错误较多,特别是主谓一致问题(如'are'代替'is''doesn't'代替'don't')\", \"论证深度不足,缺乏具体例证和深入分析\", \"语言表达不够地道,有些表达显得生硬或不自然\"], \"suggestions\": [{\"讲解\": \"在开头段落加入清晰的中心论点\", \"示例\": \"While generative AI offers unprecedented convenience for students, its overreliance ultimately undermines the very cognitive skills essential for meaningful learning—critical analysis, original thought, and academic integrity.\"}, {\"讲解\": \"为每个主体段落添加有力的主题句\", \"示例\": \"Perhaps the most significant concern is how AI dependency stunts the growth of critical thinking abilities that form the bedrock of genuine education.\"}, {\"讲解\": \"使用更自然的过渡词和表达方式\", \"示例\": \"Moreover, the instant gratification provided by AI tools creates a dangerous disincentive for developing foundational writing competencies.\"}, {\"讲解\": \"添加具体例证增强说服力\", \"示例\": \"For instance, when a student uses AI to generate a history paper instead of wrestling with primary sources, they miss the opportunity to develop their own historical interpretation and analytical voice—skills that simply cannot be outsourced to an algorithm.\"}, {\"讲解\": \"修正语法错误,使用更地道的表达\", \"示例\": \"This reliance leads to superficial understanding and prevents students from developing their unique academic voice, ultimately creating a generation of passive consumers rather than active creators of knowledge.\"}], \"next_steps\": [\"阅读几篇优秀的美国大学生议论文范文,注意观察其论点陈述和段落结构\", \"练习写作清晰的主题句,确保每个段落都有明确的中心思想\", \"重点复习英语主谓一致和时态等基础语法规则\", \"在论证中添加具体事例、数据或引用,增强说服力\", \"多使用美国学术写作中常见的过渡词和表达方式,如'furthermore', 'conversely', 'in light of this'等\"]}}",
"final_score": 60,
"scores": "{\"brainstorm\": 0, \"outline\": 0, \"writing\": 3, \"highlight\": 3}",
"status": "writing",
"word_count": 558,
"created_at": "2025-10-14T19:14:23.761019",
"updated_at": "2025-10-23T11:42:04.538302",
"updated_at": "2025-11-02T16:19:18.601309",
"completed_at": null
},
{
"id": 2,
"user_id": 1,
"title": "写作项目 - 2025年11月02日 16:35",
"topic": "The Role of Failure in Personal Growth (2024 National)",
"article_type": "议论文",
"subject": "英语",
"grade": "高中",
"brainstorm_content": "",
"outline_content": "",
"writing_content": "",
"ai_feedback": "",
"final_score": 0,
"scores": "",
"status": "writing",
"word_count": 0,
"created_at": "2025-11-02T16:36:39.799848",
"updated_at": "2025-11-02T16:48:04.387646",
"completed_at": null
}
]

@ -3,13 +3,13 @@
"id": 1,
"username": "267278466@qq.com",
"password_hash": "07d0a715a160482331a556b514bee739$fe094c2d3e40fad4e83c6b06aaa95976c68e325bd899a003e7a2928edfe0fce8",
"grade": "大学",
"grade": "高中",
"subject": "英语",
"ai_provider": "DeepSeek",
"ai_model": "deepseek-chat",
"ai_api_key": "sk-94fadde224a44a89ab8d61e3172cdf52",
"ai_api_key": "sk-4fa62c38b3f44e1da5741c553ebe0344",
"ai_base_url": "https://api.deepseek.com",
"created_at": "2025-10-14T19:10:47.461150",
"updated_at": "2025-10-23T10:23:35.691328"
"updated_at": "2025-11-02T16:36:09.442564"
}
]
Loading…
Cancel
Save