国家图书馆10万部/件古籍资源无需登录即可网上阅览?
11月30日,国家图书馆发布公告,已通过“中华古籍资源库”累计发布各类古籍资源总量达10万部/件,包括馆藏善本古籍、普通古籍、甲骨、敦煌文献、碑帖拓片、西夏文献、赵城金藏、地方志、家谱、年画、老照片等,以及馆外、海外征集古籍资源,读者无需登录即可访问阅览。
其中,“数字古籍”数据库通过全彩影像数字化和缩微胶卷转化影像方式建设,发布国家图书馆藏善本古籍和普通古籍,从2016年9月28日起陆续上线,目前已发布馆藏古籍2万余部;“数字方志”数据库中的地方志文献为我国所特有,也是国家图书馆独具特色的馆藏之一,所存文献数量与品质很高,该数据库以国家图书馆藏地方志文献建设,目前发布馆藏方志资源6528种。
在“中华古籍资源库”主页面,读者可使用高级检索,各子库组合检索,还可选择书名、著者、索书号等精确和组合检索。通过点击检索结果中的题名,可进入全文阅览界面;点击需要阅读的册次,可阅览整册全文影像。同时,使用页面各种阅览工具,可实现页面切换、放大阅览等功能。
教务老师了解到,读者可通过多种形式进入“中华古籍资源库”,包括登录国家图书馆主页,点击“中华古籍资源库”进入主检索界面,或在“特色资源”栏目中点击“数字古籍”等各子库;或在国家图书馆主页面,选择“资源”选项,点击“古籍”, 进入古籍资源列表,点击“中华古籍资源库”,进入检索主页面。
文/北青-北京头条教务老师 张知依
自考/成考有疑问、不知道自考/成考考点内容、不清楚当地自考/成考政策,点击底部咨询官网老师,免费领取复习资料:https://www87dhcom/xl/
古籍的数字化最早是从计算机技术发达的美国开始的。20 世纪 70 年代末,OCLC 和RLIN 先后推出了《朱熹大学章句索引》、 《王阳明传习录索引》、《戴震原善索引》等数据库,到 20 世纪 80 年代以后,中国的台湾、香港和大陆才相继开始了中文古籍数字化项目。 从 20 世纪 80 年代起,大陆地区开始出现了古籍数字化的工作,但是研究和成果少。直至进入 90 年代以后,随着我国计算机的普及网络技术的介入,才有了古籍数字化的雏形。90 年代中期以后,国家图书馆制订了一个庞大的古籍特藏文献数字化计划 ,如碑砧菁华、西夏碎金、敦煌遗珍、数字方志以及甲骨文、永乐大典等。北京大学《中国基本古籍光盘库》,计划收录古籍1万种 。迪志文化出版有限公司、上海人民出版社推出了文渊阁《四库全书》全文检索版。书同文数字化技术有限公司推出了《四部丛刊》的全文检索版。国学公司推出了《国学宝典》等系列产品。截止 2004 年底,网上可见的中文古籍数据库约 70 多个。北京大学主持的 CALIS 项目及南京大学图书馆 CANAL项目古籍子项目已取得阶段性成果。
Connectorphp负责与数据库通信,增删改读(CRUD)
首先, 建一个Connector类, 并且设置属性
<php
class Connector {
// 数据库地址前缀,常见的有mysql,slqlsrv,odbc等等等
private $driver = 'mysql';
// 数据库地址
private $host = 'localhost';
// 数据库默认名称, 设置为静态是因为有切换数据库的需求
private static $db = 'sakila';
// 数据库用户名
private $username = 'root';
// 数据库密码
private $password = '';
// 当前数据库连接
protected $connection;
// 数据库连接箱,切换已存在的数据库连接不需要重新通信,从这里取即可
protected static $container = [];
// PDO默认属性配置,具体请自行查看文档
protected $options = [
PDO::ATTR_CASE => PDO::CASE_NATURAL,
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_ORACLE_NULLS => PDO::NULL_NATURAL,
PDO::ATTR_STRINGIFY_FETCHES => false,
];
}以上代码配合注释应该可以理解了所以不多解释了,直接进入函数
buildConnectString - 就是生成DSN连接串, 非常直白
protected function buildConnectString() {
return "$this->driver:host=$this->host;dbname="self::$db;
}
// "mysql:host=localhost;dbname=sakila;"connect - 连接数据库
public function connect() {
try {
// 连接数据库,生成pdo实例, 将之赋予$connection,并存入$container之中
self::$container[self::$db] = $this->connection = new PDO($this->buildConnectString(), $this->username, $this->password, $this->options);
// 返回数据库连接
return $this->connection;
} catch (Exception $e) {
// 若是失败, 返回原因
// 还记得dd()吗这个辅助函数还会一直用上
dd($e->getMessage());
}
}setDatabase - 切换数据库
public function setDatabase($db) {
self::$db = $db;
return $this;
}_construct - 生成实例后第一步要干嘛
function construct() {
// 如果从未连接过该数据库, 那就新建连接
if(empty(self::$container[self::$db])) $this->connect();
// 反之, 从$container中提取, 无需再次通信
$this->connection = self::$container[self::$db];
}接下来两个函数式配合着用的,单看可能会懵逼, 配合例子单步调试
$a = new Connector();
$bindValues = [
'PENELOPE',
'GUINESS'
];
dd($a->read('select from actor where first_name = and last_name = ', $bindValues));返回值
array (size=1)
0 =>
object(stdClass)[4]
public 'actor_id' => string '1' (length=1)
public 'first_name' => string 'PENELOPE' (length=8)
public 'last_name' => string 'GUINESS' (length=7)
public 'last_update' => string '2006-02-15 04:34:33' (length=19)read - 读取数据
public function read($sql, $bindings) {
// 将sql语句放入预处理函数
// $sql = select from actor where first_name = and last_name =
$statement = $this->connection->prepare($sql);
// 将附带参数带入pdo实例
// $bindings = ['PENELOPE', 'GUINESS']
$this->bindValues($statement, $bindings);
// 执行
$statement->execute();
// 返回所有合法数据, 以Object对象为数据类型
return $statement->fetchAll(PDO::FETCH_OBJ);
}bindValues - 将附带参数带入pdo实例
// 从例子中可以看出, 我用在预处理的变量为, 这是因为pdo的局限性, 有兴趣可以在评论区讨论这个问题
public function bindValues($statement, $bindings) {
// $bindings = ['PENELOPE', 'GUINESS']
// 依次循环每一个参数
foreach ($bindings as $key => $value) {
// $key = 0/1
// $value = 'PENELOPE'/'GUINESS'
$statement->bindValue(
// 如果是字符串类型, 那就直接使用, 反之是数字, 将其+1
// 这里是数值, 因此返回1/2
is_string($key) $key : $key + 1,
// 直接放入值
// 'PENELOPE'/'GUINESS'
$value,
// 这里直白不多说
// PDO::PARAM_STR/PDO::PARAM_STR
is_int($value) PDO::PARAM_INT : PDO::PARAM_STR
);
}
}所以懂了吗_( :3」∠)
update - 改写数据
// 与read不同的地方在于, read返回数据, update返回boolean(true/false)
public function update($sql, $bindings) {
$statement = $this->connection->prepare($sql);
$this->bindValues($statement, $bindings);
return $statement->execute();
}delete - 删除数据
// 与update一样, 分开是因为方便日后维护制定
public function delete($sql, $bindings) {
$statement = $this->connection->prepare($sql);
$this->bindValues($statement, $bindings);
return $statement->execute();
}create - 增加数据
// 返回最新的自增ID, 如果有
public function create($sql, $bindings) {
$statement = $this->connection->prepare($sql);
$this->bindValues($statement, $bindings);
$statement->execute();
return $this->lastInsertId();
}lastInsertId - 返回新增id, 如果有
// pdo自带,只是稍微封装
public function lastInsertId() {
$id = $this->connection->lastInsertId();
return empty($id) null : $id;
}过于高级复杂的SQL语句可能无法封装, 因此准备了可直接用RAW query通信数据库的两个函数
exec - 适用于增删改
public function exec($sql) {
return $this->connection->exec($sql);
}query - 适用于读
public function query($sql) {
$q = $this->connection->query($sql);
return $q->fetchAll(PDO::FETCH_OBJ);
}将数据库事务相关的函数封装起来, 直白所以没有注释
public function beginTransaction() {
$this->connection->beginTransaction();
return $this;
}
public function rollBack() {
$this->connection->rollBack();
return $this;
}
public function commit() {
$this->connection->commit();
return $this;
}
public function inTransaction() {
return $this->connection->inTransaction();
}完整代码<php
class Connector {
// 数据库地址前缀,常见的有mysql,slqlsrv,odbc等等等
private $driver = 'mysql';
// 数据库地址
private $host = 'localhost';
// 数据库默认名称, 设置为静态是因为有切换数据库的需求
private static $db = 'sakila';
// 数据库用户名
private $username = 'root';
// 数据库密码
private $password = '';
// 当前数据库连接
protected $connection;
// 数据库连接箱,切换已存在的数据库连接不需要重新通信,从这里取即可
protected static $container = [];
// PDO默认属性配置,具体请自行查看文档
protected $options = [
PDO::ATTR_CASE => PDO::CASE_NATURAL,
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_ORACLE_NULLS => PDO::NULL_NATURAL,
PDO::ATTR_STRINGIFY_FETCHES => false,
];
function construct() {
// 如果从未连接过该数据库, 那就新建连接
if(empty(self::$container[self::$db])) $this->connect();
// 反之, 从$container中提取, 无需再次通信
$this->connection = self::$container[self::$db];
}
// 生成DSN连接串
protected function buildConnectString() {
return "$this->driver:host=$this->host;dbname="self::$db;
}
// 连接数据库
public function connect() {
try {
// 连接数据库,生成pdo实例, 将之赋予$connection,并存入$container之中
self::$container[self::$db] = $this->connection = new PDO($this->buildConnectString(), $this->username, $this->password, $this->options);
// 返回数据库连接
return $this->connection;
} catch (Exception $e) {
// 若是失败, 返回原因
dd($e->getMessage());
}
}
// 切换数据库
public function setDatabase($db) {
self::$db = $db;
return $this;
}
// 读取数据
public function read($sql, $bindings) {
// 将sql语句放入预处理函数
$statement = $this->connection->prepare($sql);
// 将附带参数带入pdo实例
$this->bindValues($statement, $bindings);
// 执行
$statement->execute();
// 返回所有合法数据, 以Object对象为数据类型
return $statement->fetchAll(PDO::FETCH_OBJ);
}
// 将附带参数带入pdo实例
public function bindValues($statement, $bindings) {
// 依次循环每一个参数
foreach ($bindings as $key => $value) {
$statement->bindValue(
// 如果是字符串类型, 那就直接使用, 反之是数字, 将其+1
is_string($key) $key : $key + 1,
// 直接放入值
$value,
// 这里直白不多说
is_int($value) PDO::PARAM_INT : PDO::PARAM_STR
);
}
}
// 改写数据
public function update($sql, $bindings) {
// 与read不同的地方在于, read返回数据, update返回boolean(true/false)
$statement = $this->connection->prepare($sql);
$this->bindValues($statement, $bindings);
return $statement->execute();
}
// 删除数据
public function delete($sql, $bindings) {
$statement = $this->connection->prepare($sql);
$this->bindValues($statement, $bindings);
return $statement->execute();
}
// 增加数据
public function create($sql, $bindings) {
$statement = $this->connection->prepare($sql);
$this->bindValues($statement, $bindings);
$statement->execute();
return $this->lastInsertId();
}
// 返回新增id, 如果有
public function lastInsertId() {
$id = $this->connection->lastInsertId();
return empty($id) null : $id;
}
// 适用于增删改
public function exec($sql) {
return $this->connection->exec($sql);
}
// 适用于读
public function query($sql) {
$q = $this->connection->query($sql);
return $q->fetchAll(PDO::FETCH_OBJ);
}
public function beginTransaction() {
$this->connection->beginTransaction();
return $this;
}
public function rollBack() {
$this->connection->rollBack();
return $this;
}
public function commit() {
$this->connection->commit();
return $this;
}
public function inTransaction() {
return $this->connection->inTransaction();
}
}本期疑问1) 因为php本身的特性, 默认情况下运行完所有代码类会自行析构,pdo自动断联, 所以我没有disconnect(),让pdo断开连接, 不知这样是不是一种 bad practice
2) 增加和改写数据的两个函数并不支持多组数据一次性加入,只能单次增该, 原因是我之前写了嫌太繁琐所以删了, 有心的童鞋可以提供方案
论文数据库设计需要按照以下数据内容按顺序排列即可。
1、学院数据实体:学院名称、负责人、办公电话、学院编号。
2、学生数据实体:学号、密码、姓名、性别、民族、籍贯、出生日期、身份证号、联系电话、Email、备注、学院编号、所在班级、角色名称、论文编号。
3、教师数据实体:教师编号、密码、学院编号、所在科室、发布选题、教育程度、职称、姓名、性别、政治面貌、联系电话、Email、角色名称、备注。
4、角色数据实体:角色名称、权限名称。权限数据实体:权限名称、角色名称。以上的实体都是基本的数据实体。
由于操作模块的名称对应该权限,在程序初始化时这些数据都应该添加,教师论文管理系统的目的进行论文管理,因此还要包括如下的几个数据实体:
1、论文数据实体:论文编号、学院、作者、刊物名称、论文题目、收录情况、教师编号、学号、影响力、影响因子、引用次数、备注。
2、评审数据实体:教师编号、学号、论文编号、论文题目、评审意见、总分。
将数据概念结构设计转化为SQLSERVER2005数据库系统所支持的实际数据库模型,就是数据库的逻辑结构。在实体以及实体之间的关系基础上,形成数据库中的表格以及各个表格之间的关系。
扩展资料:
论文数据库设计注意事项:
1、标题。标题应鲜明、准确、精练地直接概括所进行的研究实践的主要内容和结果,正标题一般不超过20个字,如需有副标题,副标题一般不超过28个字。
2、内容提要。在主体内容前用200-500字扼要介绍论文的主要内容、采用的方法和得出的主要结论。
3、关键词。按照与论文内容紧密程度,另行依次列出3-5个关键词。
4、英文翻译内容。中文的标题、作者姓名、指导教师姓名、内容提要、关键词应翻译成英文。
参考资料:
数字化是古籍再生性保护的重要手段;古籍数字化属于古籍整理的范畴,代表着古籍整理的未来方向。
“古籍数字化” 是指利用现代信息技术对古籍文献进行加工处理,使其转化为电子数据形式,通过光盘、网络等介质保存和传播。
我国古籍数字化经历了数据库版、光盘版、网络版三个建设阶段。数据库版古籍包括书目数据库和全文数据库两种形式。光盘版古籍一般有图像版、全文版和图文版三种类型。网络版古籍主要是将数字化的古籍资源在网络上有偿或无偿发布,供互联网用户使用,这是目前古籍数字化的主要目标。
古籍数字化是对古籍或古籍内容的再现和加工,属于古籍整理的范畴,是古籍整理的一部分。
再生性保护>=古籍整理>古籍数字化
个人认为,数字方志馆的建设可从四个方面进行:
1、方志信息资源建设
2、网络建设
3、地情信息法制环境建设
4、人才和队伍建设
其中,最重要的是,首先应该有个资料比较齐全的 数字方志库,尤其是古籍方志,资料越全、使用越 方便越好。现在找古籍书真是太费劲了。
这个只是用于备案而已,不要注重太多的实质性内容,好看即可。如:XX网站建设方案书一、网站建设目的及功能定位XX有限公司网站的建设目标是:建成优秀的设计业内专业网站,展示公司形象,服务于公司日常运营。通过公司网站展示公司服务范围和优秀案例,让客户能够了解本公司,能够对感兴趣的服务作详细了解,并通过网站提交反馈信息。二、网站整体框架规划网站整体为标题型框架设有:关于XX设计服务设计案例最新动态人才招聘联系我们三、网站技术解决方案根据网站的功能确定网站技术解决方案:服务器采用租用XX主机,选用XX操作系统,单月流量8GB,并发连接数150个,能支持PHPv43/v52/v53,HTML,WAP,PERL5,CGI-bin等开发语言:数据库采用:MySQL5148(20M)、SQLitev2814,本参数能够满足本公司的网站正常运行。
写在前头依然在前进的菜鸟一只,错误什么的请轻喷指出
对于数据库连接由于较浅的工作经验所以无法完全覆盖,较复杂的query可能会有意想不到的bug
所以本系列只提供思路,成熟稳定的数据库封装有请自行搜索
编写该系列的初衷就是为了抛砖引玉, 在每一节的后端,我都会提出一些个人疑问(或无),希望能引出大神为我解答迷惑
使用的php版本为70+,该系列并不向下兼容,还在56版本的童鞋们快过来玩呀
数据库封装参考了laravel的源代码, 如有雷同, 不是巧合
最终效果假设我们有一个表,名'Actor', 经过简单设置, 可以直接如下调用
$a = Actor::select('first_name', 'last_name')
->where('first_name', 'NICK')
->where('last_name', 'WAHLBERG')
->first()
var_dump($a);返回格式
object(Actor)[11]
public 'first_name' => string 'NICK' (length=4)
public 'last_name' => string 'WAHLBERG' (length=8)返回的数据依然可操作(update/delete)
$a->update();
$a->delete();常见的数据库连接写法对php有一定了解的人都知道,相比已被淘汰的mysql或取而代之的mysqli, pdo 可以避免SQL注入式攻击, 更安全, 而且面向对象, 所以以下以pdo作为例子
<php
$driver='mysql'; //数据库类型
$host='localhost'; //数据库主机名
$db = 'sakila'; //数据库名称
$username='root'; //数据库连接用户名
$password=''; //数据库密码
$dsn="$driver:host=$host;dbname=$db";
try {
$pdo= new PDO($dsn, $username, $password); //初始化一个PDO对象
$sql = "select from actor";
$res = $pdo->query($sql); // 从actor中获取所有数据
foreach($res as $row) echo $row['first_name']"<br>";
} catch (PDOException $e) {
die($e->getMessage());
}以上例子非常简洁, 当一个项目逐渐成长,日渐复繁的时候,那么我们需要一个封装类来减少代码的重复性, 就像平时自行写的一些辅助函数, 不过封装类略微进阶而已。
基本思路那么,应该怎么写呢?
首先, 平时我们要简略一些代码, 都会自行编写一些辅助函数,比如我个人有个不好的习惯,不喜欢用编辑器的调试功能(画外音:我用的是sublime text 3),那么debug的时候一开始都是这么写的
$a = "is bug";
die(var_dump($a)); // 输出变量并且停止运行之后的代码
/从xdebug得知bug出现在这一行,所以查看上一行的逻辑与数据 /die(var_dump())的出场率略高, 因此我将它们写成了一个辅助函数
function dd($var) {
die(var_dump($var));
}同样道理,在数据库读取的时候,select的出场率极高, 所以简单的包裹一下
function select($pdo, $table, $require, $where = []) {
$w = [];
// 将搜索条件转化为数据库命令能接受的格式
foreach ($where as $key => &$val)
$w[] = "$key = '$val'";
// 有时候并不需要条件,仅仅将所有数据取出,因此$where默认为空
if(!empty($w)) $w = "where "implode(', ', $w);
else $w = "";
// 生成sql query
$sql = "select $require from $table $w";
// 将已生成的query带入pdo实例
$res = $pdo->query($sql);
// 返回结果
return $res->fetchAll();
}例子
select($pdo, 'actor', '', ['first_name'=>'PENELOPE'])
/
生成sql query => select from actor where first_name = 'PENELOPE'
/总结一下, 数据库封装浅显的形容就是将参数带入辅助函数,让其自动生成SQL命令。
数据库封装的架构主要分成四个文件
Connectorphp - 负责与数据库的通信, 请求与返回数据库数据
Modelphp - 入口文件,负责表的设置, 并接受请求, 返回回应
Grammarphp - 将Builder存储的请求转化为SQL语句
Builderphp - 核心文件, 存储Model的请求,调用Grammar以返回SQL语句, 与参数变量一并送往Connector以获取数据库数据,再返还给Model
架构可能解释得不太好,但没关系, 接下来会慢慢一个个的深入解释
大致如此, 如果可以的话点个赞,或在下方评论区讨论, 只有反馈才能推动一个懒癌晚期病患继续前行。
本文2023-08-05 19:51:09发表“古籍资讯”栏目。
本文链接:https://www.yizhai.net/article/24561.html