diff --git a/WebRoot/ai.html b/WebRoot/ai.html
index f7ebef63..c126dbd4 100644
--- a/WebRoot/ai.html
+++ b/WebRoot/ai.html
@@ -104,9 +104,10 @@
background-color: #f8f9fa;
font-family: 'Courier New', monospace;
font-size: 14px;
- line-height: 1.4;
- white-space: pre-wrap;
+ line-height: 1.6;
+ white-space: pre-line;
word-wrap: break-word;
+ overflow-wrap: break-word;
}
.download-section {
@@ -502,41 +503,91 @@
function processTextBuffer() {
const dataArea = document.getElementById('dataArea');
- // 检查缓冲区中是否包含完整的句子或段落
- const sentences = textBuffer.match(/[^。!?\n]*[。!?\n]/g);
-
- if (sentences) {
- // 显示完整的句子
- sentences.forEach(sentence => {
- if (sentence.trim()) {
- dataArea.textContent += sentence.trim() + '\n';
+ // 首先处理明确的换行符
+ if (textBuffer.includes('\n')) {
+ const lines = textBuffer.split('\n');
+ const completedLines = lines.slice(0, -1);
+ const remainingText = lines[lines.length - 1];
+
+ completedLines.forEach(line => {
+ if (line.trim()) {
+ dataArea.innerHTML += line + '
';
+ } else {
+ dataArea.innerHTML += '
';
}
});
- // 从缓冲区中移除已显示的句子
- const processedText = sentences.join('');
- textBuffer = textBuffer.substring(processedText.length);
- } else {
- // 如果缓冲区太长但没有句号,按长度分割显示
- if (textBuffer.length > 100) {
- // 寻找合适的分割点(空格、逗号等)
- let splitIndex = textBuffer.lastIndexOf(' ', 80);
- if (splitIndex === -1) {
- splitIndex = textBuffer.lastIndexOf(',', 80);
- }
- if (splitIndex === -1) {
- splitIndex = textBuffer.lastIndexOf('、', 80);
- }
- if (splitIndex === -1) {
- splitIndex = 80; // 强制分割
+ textBuffer = remainingText;
+ }
+
+ // 简化表格处理:只处理完整的表格行
+ if (textBuffer.includes('|')) {
+ // 检测并处理完整的表格行(至少包含两个|符号)
+ const tableRowRegex = /\|[^|]*\|[^|]*\|/;
+ if (tableRowRegex.test(textBuffer)) {
+ // 查找表格行的起始位置
+ const match = textBuffer.match(tableRowRegex);
+ if (match) {
+ const beforeTable = textBuffer.substring(0, match.index);
+ const tableRow = match[0];
+ const afterTable = textBuffer.substring(match.index + match[0].length);
+
+ // 输出表格前的内容
+ if (beforeTable.trim()) {
+ dataArea.innerHTML += beforeTable.trim() + '
';
+ }
+
+ // 输出表格行
+ const cleanTableRow = tableRow.replace(/\|/g, ' | ').replace(/\s+/g, ' ').trim();
+ dataArea.innerHTML += cleanTableRow + '
';
+
+ // 更新缓冲区
+ textBuffer = afterTable;
}
-
- const textToShow = textBuffer.substring(0, splitIndex + 1);
- if (textToShow.trim()) {
- dataArea.textContent += textToShow.trim() + '\n';
+ }
+ }
+
+ // 处理标题(只在标题前添加换行)
+ if (textBuffer.includes('#')) {
+ textBuffer = textBuffer.replace(/(#{1,6}\s*[^#\n]+)/g, '
$1');
+ }
+
+ // 处理列表项(简化处理)
+ if (textBuffer.includes('- ')) {
+ textBuffer = textBuffer.replace(/([^\n])(-\s+)/g, '$1
$2');
+ }
+
+ // 如果缓冲区有内容且包含
标签,立即输出
+ if (textBuffer.includes('
')) {
+ const parts = textBuffer.split('
');
+ for (let i = 0; i < parts.length - 1; i++) {
+ if (parts[i].trim()) {
+ dataArea.innerHTML += parts[i].trim() + '
';
+ } else {
+ dataArea.innerHTML += '
';
}
- textBuffer = textBuffer.substring(splitIndex + 1);
}
+ textBuffer = parts[parts.length - 1];
+ }
+
+ // 处理过长的普通文本
+ if (textBuffer.length > 200) {
+ let splitIndex = textBuffer.lastIndexOf(' ', 150);
+ if (splitIndex === -1) {
+ splitIndex = textBuffer.lastIndexOf(',', 150);
+ }
+ if (splitIndex === -1) {
+ splitIndex = textBuffer.lastIndexOf('、', 150);
+ }
+ if (splitIndex === -1) {
+ splitIndex = 150;
+ }
+
+ const textToShow = textBuffer.substring(0, splitIndex + 1);
+ if (textToShow.trim()) {
+ dataArea.innerHTML += textToShow + '
';
+ }
+ textBuffer = textBuffer.substring(splitIndex + 1);
}
}
@@ -581,7 +632,7 @@
function clearData() {
const dataArea = document.getElementById('dataArea');
- dataArea.textContent = '等待数据...';
+ dataArea.innerHTML = '等待数据...';
textBuffer = ''; // 清空文本缓冲区
downloadUrls = [];
updateDownloadLinks();
diff --git a/WebRoot/upload/怒江州与昆明市_教育分析报告_20250615_115808.docx b/WebRoot/upload/怒江州与昆明市_教育分析报告_20250615_115808.docx
new file mode 100644
index 00000000..1f3fb429
Binary files /dev/null and b/WebRoot/upload/怒江州与昆明市_教育分析报告_20250615_115808.docx differ
diff --git a/WebRoot/upload/怒江州与昭通市_教育分析报告_20250615_114831.html b/WebRoot/upload/怒江州与昭通市_教育分析报告_20250615_114831.html
new file mode 100644
index 00000000..5a9e973c
--- /dev/null
+++ b/WebRoot/upload/怒江州与昭通市_教育分析报告_20250615_114831.html
@@ -0,0 +1,758 @@
+
+
+
云南省教育资源配置发展预测数据对比分析
+本报告基于怒江州与昭通市2012-2035年的人口变化趋势数据,分析了两地城乡人口结构变化、学生数量变化以及教职工需求变化对基础教育资源配置的影响。报告显示,两地人口均呈现下降趋势,但城乡人口结构变化存在差异,这对基础教育资源配置提出了新的挑战和要求。
+怒江州总人口在2012-2019年呈平稳增长趋势,2019年达到顶峰55.7万人后开始下降,预计2035年将下降至48.4万人。昭通市总人口在2012-2019年持续大幅增长,2020年后迅速下降,预计2035年将减少至393.6万人。
+ +怒江州城镇人口数量呈缓慢增长趋势,乡村人口数量显著减少。昭通市乡村人口明显下降,城镇人口呈现稳步增长趋势,但2026年后城乡人口均呈现下降趋势。
+ +怒江州各学段学生数量总体呈下降趋势,城区学生数量略有增长,镇区和乡村学生数量明显减少。昭通市各学段学生数量也呈现明显下降趋势,城区相对稳定,乡村下降显著。
+ +怒江州基础教育教职工数总体需求保持平缓,但存在区域性、结构性、学科性短缺。昭通市基础教育教职工数总体需求呈现减少趋势,各学段教职工需求均有不同程度减少。
+ +怒江州基础教育学校占地面积总量需求略有下降,各学段占地面积总体满足需求。昭通市基础教育学校占地面积总量需求逐步减少,各学段占地面积需求均有不同程度减少。
+ +1. 两地人口均呈现下降趋势,但城乡结构变化不同,怒江州城镇化进程相对缓慢,昭通市城镇化进程较快。
+2. 学生数量总体下降,但城区学生数量相对稳定或略有增长,乡村学生数量明显减少,需调整教育资源城乡配置。
+3. 教职工需求怒江州保持平稳,昭通市明显减少,但两地均存在结构性短缺问题,需优化教师队伍结构。
+4. 学校占地面积需求总体减少,为教育资源整合提供了空间,可考虑合并乡村小型学校,提高城区学校资源利用效率。
+