11 iframe
11.1 App.vue
内容
高亮关键词一直没有实现
<template>
<div id="app">
<!-- 引入ConfigProvider并设置为简体中文 -->
<ConfigProvider :locale="zhCN">
<!-- 使用Ant Design Vue的Table组件 -->
<a-table :columns="columns" :data-source="items" :pagination="pagination" @change="handleTableChange"/>
<!-- 添加输入框组件与按钮组合,并使用Space布局 -->
<a-space>
<!-- <a-input
-model:value="searchKeyword"
v="请输入搜索关键词"
placeholder="width: 300px;"
style/>
<a-button type="primary" @click="refreshTableData">刷新</a-button> -->
<a-input-search
-model:value="searchKeyword"
v="请输入搜索关键词"
placeholder-button
enter="width: 300px;"
style="refreshTableData"
@search/>
</a-space>
<!-- 其他组件... -->
</ConfigProvider>
</div>
</template>
<script>
import { Table, Button, Input, InputSearch, Space, ConfigProvider } from 'ant-design-vue';
import zhCN from 'ant-design-vue/lib/locale/zh_CN';
import axios from 'axios';
export default {
name: 'App',
components: {
.name]: Table,
[Table.name]: Button,
[Button.name]: Input,
[Input.name]: InputSearch,
[InputSearch.name]: Space,
[Space,
ConfigProvider,
}data() {
return {
,
zhCNapiUrl: 'https://www.mmphcrc.com/vue/SQLiteHandler.php?table=pdf_pages', // 替换为你的PHP API地址
columns: [
title: '文件名称', dataIndex: 'file_name', sorter: true} , // 添加 defaultSortOrder
{ title: '页码', dataIndex: 'page_number', sorter: true },
{
{title: '内容',
dataIndex: 'page_content',
filters: [
text: '附件', value: 'appendix' },
{ text: '模型', value: 'model' },
{ ,
]onFilter: (value, record) => {
if (value === 'appendix') {
return record.page_content.includes('summplementary');
else if (value === 'model') {
} // 这里可以根据实际需求编写个人邮箱的过滤逻辑
// 以下仅为示例
return record.page_content.includes('RF');
}return true; // 如果没有匹配到任何值,返回true则不进行过滤
,
},
},
]items: [],
pagination: {
pageSize: 1, // 每页显示条数
showSizeChanger: true, // 是否可以修改每页显示条数
pageSizeOptions: ['1', '5', '10', '20'], // 每页显示条数选项
showTotal: (total) => `共 ${total} 条`, // 显示总条数
,
}searchKeyword: '', // 新增用于存储搜索关键词的变量
;
},
}methods: {
async refreshTableData() {
try {
const searchParam = this.searchKeyword;
const url = `${this.apiUrl}&search=${encodeURIComponent(searchParam)}`;
console.log(url)
const response = await axios.get(url);
this.items = response.data;
catch (error) {
} console.error('Error fetching table data:', error);
},
}handleTableChange(pagination, filters, sorter) {
if (sorter.order && sorter.column.dataIndex) {
this.items.sort((a, b) => {
let sortFn;
switch (sorter.column.dataIndex) {
case 'file_name':
= (a, b) => a[sorter.column.dataIndex].localeCompare(b[sorter.column.dataIndex]);
sortFn break;
case 'page_number':
= (a, b) => a[sorter.column.dataIndex] - b[sorter.column.dataIndex];
sortFn break;
default:
console.warn('未知列排序:', sorter.column.dataIndex);
return 0;
}return sorter.order === 'ascend' ? sortFn(a, b) : -sortFn(a, b);
;
})
},
},
}mounted() {
// this.refreshTableData(); // 如果需要在页面加载时自动刷新数据,请取消注释这行
,
};
}</script>
<style>
.highlight {
-color: yellow;
background-weight: bold;
font
}</style>
11.2 创建模拟数据库的createdb.php
文件
<?php
// 创建或打开一个SQLite数据库文件(如果不存在则会创建)
$db = new PDO('sqlite:database.db');
// 如果需要创建表
$db->exec("CREATE TABLE IF NOT EXISTS your_table (
id INTEGER PRIMARY KEY,
name TEXT,
age INTEGER,
email TEXT
)");
// 插入几行数据
$insertData = [
'John Doe', 30, 'john.doe@example.com'],
['Jane Smith', 25, 'jane.smith@example.com'],
[;
]
foreach ($insertData as $row) {
$stmt = $db->prepare("INSERT INTO your_table (name, age, email) VALUES (?, ?, ?)");
$stmt->execute($row);
}
echo "Data inserted successfully.";
// 关闭数据库连接(不是必需的,但推荐在操作完成后关闭)
$db = null;
?>
11.3 api文件SQLiteHandler.php
<?php
class SQLiteHandler {
private $db;
public function __construct($databasePath) {
$this->db = new PDO("sqlite:$databasePath");
$this->db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
}
public function getItems($query, $params = []) {
$stmt = $this->db->prepare($query);
$stmt->execute($params);
return $stmt->fetchAll(PDO::FETCH_ASSOC);
}
}
// api.php
require_once 'SQLiteHandler.php';
$handler = new SQLiteHandler('pdf_content.db');
header('Content-Type: application/json');
header('Access-Control-Allow-Origin: *'); // 允许跨域访问(仅开发环境)
if ($_SERVER['REQUEST_METHOD'] === 'GET') {
$table = isset($_GET['table']) ? $_GET['table'] : '';
$search = isset($_GET['search']) ? urldecode($_GET['search']) : '';
if (!empty($table)) {
try {
if (!empty($search)) {
// $search = preg_replace('/\s+/', ' ', $search); // 将连续空格替换为一个空格
// $keywords = explode(' ', $search);
$search = preg_replace_callback('/"([^"]+)"/', function($matches) {
return str_replace(' ', '___SPACE___', $matches[0]);
, $search);
}
$search = preg_replace('/\s+/', ' ', $search); // 将连续空格替换为一个空格
$keywords = explode(' ', $search);
$keywords = array_map(function($keyword) {
return trim(str_replace('___SPACE___', ' ', $keyword), '"');
, $keywords);
}
$placeholders = implode(' AND ', array_fill(0, count($keywords), 'page_content LIKE ?'));
$params = array_map(function($keyword) {
return "%$keyword%";
, $keywords);
}$query = "SELECT * FROM {$table} WHERE {$placeholders}";
// debug用
// $params = array_values($params); // 重新索引参数数组
// $finalQuery = $query;
// foreach ($params as $param) {
// $finalQuery = preg_replace('/\?/', $param, $finalQuery, 1);
// }
// echo $finalQuery;
$items = $handler->getItems($query, $params);
// 高亮关键词
// foreach ($items as &$item) {
// foreach ($keywords as $keyword) {
// $item['page_content'] = str_ireplace($keyword, "<mark>$keyword</mark>", $item['page_content']);
// }
// }
unset($item);
else {
} $items = $handler->getItems("SELECT * FROM {$table} LIMIT 20");
}echo json_encode($items);
// echo json_encode($items, JSON_UNESCAPED_SLASHES); // 保证html标签的反斜杠不被转义
catch (PDOException $e) {
} http_response_code(500);
echo json_encode(['error' => $e->getMessage()]);
}else {
} http_response_code(400);
echo json_encode(['error' => 'Missing table name in the request']);
}else {
} http_response_code(405);
echo json_encode(['error' => 'Method not allowed']);
}?>
11.4 创建数据库的python脚本
pdf2sqlite.py
import os
import sqlite3
from argparse import ArgumentParser
import fitz # PyMuPDF库
def process_pdf_to_sqlite(pdf_dir, db_filename):
= sqlite3.connect(db_filename)
conn = conn.cursor()
c
# 创建表结构(如果不存在)
'''-- 先检查并删除表(如果存在)
c.execute( DROP TABLE IF EXISTS pdf_pages;''')
'''
c.execute( CREATE TABLE pdf_pages (
file_name TEXT,
page_number INTEGER,
page_content TEXT)''')
= 0
page_count for filename in os.listdir(pdf_dir):
if filename.endswith(".pdf"):
= os.path.join(pdf_dir, filename)
full_path
try:
with fitz.open(full_path) as doc:
for i in range(doc.page_count):
= doc.load_page(i)
page = page.get_text("text") # 获取页面文本内容
text # print(i)
# 将文件名、页码和内容插入数据库
"INSERT INTO pdf_pages VALUES (?, ?, ?)", (filename, i+1, text))
c.execute(+= 1
page_count
except Exception as e:
print(f"处理文件 {filename} 时出错: {e}")
conn.commit()
conn.close()print(f'导入{page_count}页内容')
if __name__ == "__main__":
= ArgumentParser(description="将指定目录下的所有PDF文件转换为TXT并存储到SQLite数据库中")
parser "db_filename", help="目标SQLite数据库文件名")
parser.add_argument("pdf_dir", help="包含PDF文件的目录路径")
parser.add_argument(
= parser.parse_args()
args
process_pdf_to_sqlite(args.pdf_dir, args.db_filename)
使用方法:
python pdf2sqlite.py pdf_content.db pdf_files
# 假设pdf文件放在同目录下的pdf_files文件夹