.result_img {
width: 226px;
height: 195px;
background: #d8d8d8;
}
#app {
width: 500px;
border: 1px solid;
text-align: center;
margin: auto;
}
点击上方「江西环境」可以关注爱游戏官网登录入口
国庆节出游,住酒店一般都会用到身份证,但你知道如何安全使用身份证吗?哪些情况下你的身份证会被扣押?身份证复印件需不需标注?快跟小编往下看。
△资料图
坚决抵制擅自复印和扣留身份证
国家机关或者有关单位及其工作人员不得擅自复印、扫描居民身份证,不得扣留或者抵押公民的居民身份证。公民应当坚决抵制擅自复印、扫描居民身份证或者扣押居民身份证的行为。
只有以下情况,公安可扣身份证
《中华人民共和国居民身份证法》第十五条规定:“人民警察依法执行职务,遇有下列情形之一的,经出示执法证件,可以查验居民身份证:
对有违法犯罪嫌疑的人员,需要查明身份的;依法实施现场管制时,需要查明有关人员身份的;发生严重危害社会治安突发事件时,需要查明现场有关人员身份的;法律规定需要查明身份的其他情形。有前款所列情形之一,拒绝人民警察查验居民身份证的,依照有关法律规定,分别不同情形,采取措施予以处理。
除以上规定公安机关的查验权外,没有其他可以扣押身份证的机关和事由,也没有扣押的时间。
用人单位不得扣押劳动者身份证
用人单位不得扣押劳动者身份证和其他证件,不得要求提供担保或以其他名义向劳动者收财务。
复印身份证应注意哪些事项?
身份证复印件用完不要随意丢弃,而是要对其进行标注,防止不法分子冒用,给你的财产造成损失。
使用复印件办事时要做标注,最好使用蓝色或黑色的笔书写。标注要注明身份证的用途,仅可使用一次,再复印无效等语句,一般办理时可写“本复印件仅用于办理xx使用,再复印无效。”标注分三行写,末尾画横线。标注要压住身份证部分内容。
△标注可分三行,每行最后画一条横线,防止别人加上其他内容。(如:仅供某银行——;申请办理xx——;其他使用无效——。)
网络上传身份证需谨慎
如今,一些网站、app在用户实名认证时,要求上传身份证照片,那么我们怎样在照片上加上标注呢?
可以把透明胶带贴在需要写字的地方,在胶带上做好标注;可以直接在身份证上做水印,用图片处理工具给身份证正反面加好标注再上传。
来源:人民日报
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
一、前端二、后端总结
提示:以下是本篇文章正文内容,下面案例可供参考
一、前端
1、首先进入页面打开摄像头 2、点击手动拍照进行拍摄照片,实时显示拍照效果 3、拿到拍摄的照片(base64格式)转换为 file 格式,上传后台 4、上传后台获取该图片的url链接
id="videocamera" :width="videowidth" :height="videoheight" :x5-video-player-fullscreen="true" autoplay > style="display: none" id="canvascamera" :width="videowidth" :height="videoheight" > // 给外面盒子设置宽高,可以限制拍照图片的大小位置范围 效果展示
.result_img {
width: 226px;
height: 195px;
background: #d8d8d8;
}
#app {
width: 500px;
border: 1px solid;
text-align: center;
margin: auto;
}
注意 这个地方还有两个地方对于了封装:
//使用axios对应的后台上传图片接口
let result = await getphoto(formdata);
该处使用的两个地方
//user.js
import request from '../utils/request'
export function getphoto(formdata) {
return request({
url: '/getphoto',
method: 'post',
data: formdata
,
headers: { //设置上传请求头
'content-type': 'multipart/form-data'
},
})
}
//request.js
import axios from 'axios'
import store from '../store'
//import { gettoken } from '@/utils/auth'
// 创建一个axios的实例
const service = axios.create({
// 根路径 url = base url request url http://localhost:8888/menu/tree
baseurl: "http://localhost:8088",
// 超时时间 5s
timeout: 5000,
headers: {
'content-type': 'multipart/form-data'
}
})
// request interceptor
service.interceptors.request.use(
config => {
// 在请求头提供token
const token = store.getters.token || window.sessionstorage.getitem('token')
if (token) {
//每次请求都会携带token
config.headers.authorization = token
}
return config
},
error => {
console.log(error) // for debug
return promise.reject(error)
}
)
// 请求的拦截器
service.interceptors.response.use(
// response请求的响应数据
response => {
const res = response.data
// 如果返回码不是200,则表示我们请求的后台有bug
if (res.code !== 200) {
message({
message: res.message || '未知的异常',
type: 'error',
duration: 2 * 1000
})
return promise.reject(new error(res.message || '未知的异常'))
} else {
//否则则返回我们响应的数据
return res
}
},
error => {
// 打印错误的消息
console.log('err' error)
message({
message: error.message,
type: 'error',
duration: 2 * 1000
})
return promise.reject(error)
}
)
export default service
调用摄像头拍照效果
二、后端
使用百度身份证识别前要先申请百度的账号以及申请相对应用 https://cloud.baidu.com/
再选择管理应用 点击身份证识别添加应用 得到等会需要用到的api key 和 secret key 准备工作已经完成了 现在直接上代码 pom.xml
import org.springframework.boot.configurationprocessor.json.jsonobject;
import java.io.bufferedreader;
import java.io.inputstream;
import java.io.inputstreamreader;
import java.net.httpurlconnection;
import java.net.url;
import java.util.hashmap;
import java.util.iterator;
import java.util.list;
import java.util.map;
public class baiduocr {
public static string getauth() {
// 爱游戏平台官网获取的 api key
string clientid = "gzaw2ggrpwv4**********";
// 爱游戏平台官网获取的 secret key
string clientsecret = "sboehzgshfgc*************";
return getauth(clientid, clientsecret);
}
/**
* 获取token
* @param ak
* @param sk
* @return
*/
public static string getauth(string ak, string sk) {
// 获取token地址
string authhost = "https://aip.baidubce.com/oauth/2.0/token?";
string getaccesstokenurl = authhost
// 1. grant_type为固定参数
"grant_type=client_credentials"
// 2. 爱游戏平台官网获取的 api key
"&client_id=" ak
// 3. 爱游戏平台官网获取的 secret key
"&client_secret=" sk;
try {
url realurl = new ;
// 打开和url之间的连接
httpurlconnection connection = (httpurlconnection) realurl.openconnection();
//百度推荐使用post请求
connection.setrequestmethod("post");
connection.connect();
// 获取所有响应头字段
map
// 定义 bufferedreader输入流来读取url的响应
bufferedreader in = new bufferedreader(new inputstreamreader(connection.getinputstream()));
string result = "";
string line;
while ((line = in.readline()) != null) {
result = line;
}
//system.out.println("result:" result);
jsonobject jsonobject = new jsonobject(result);
string access_token = jsonobject.getstring("access_token");
return access_token;
} catch (exception e) {
system.err.printf("获取token失败!");
e.printstacktrace(system.err);
}
return null;
}
/**
* 调用ocr
* @param httpurl
* @param httparg
* @return
*/
public static string request(string httpurl, string httparg) {
bufferedreader reader = null;
string result = null;
stringbuffer sbf = new stringbuffer();
try {
//用java jdk自带的url去请求
url url = new ;
httpurlconnection connection = (httpurlconnection) url
.openconnection();
//设置该请求的消息头
//设置http方法:post
connection.setrequestmethod("post");
//设置其header的content-type参数为application/x-www-form-urlencoded
connection.setrequestproperty("content-type","application/x-www-form-urlencoded");
// 填入apikey到http header
connection.setrequestproperty("apikey", "uml8hfzu2hfd8ieg2lkqgmxm");
//将第二步获取到的token填入到http header
connection.setrequestproperty("access_token", baiduocr.getauth());
connection.setdooutput(true);
connection.getoutputstream().write(httparg.getbytes("utf-8"));
connection.connect();
inputstream is = connection.getinputstream();
reader = new bufferedreader(new inputstreamreader(is, "utf-8"));
string strread = null;
while ((strread = reader.readline()) != null) {
sbf.append(strread);
sbf.append("\r\n");
}
reader.close();
result = sbf.tostring();
} catch (exception e) {
e.printstacktrace();
}
return result;
}
/**
*身份证参数转换
* @param jsonresult
* @return
*/
public static hashmap
hashmap map = new hashmap
try {
jsonobject jsonobject = new jsonobject(jsonresult);
jsonobject words_result = jsonobject.getjsonobject("words_result");
iterator
while (it.hasnext()) {
string key = it.next();
jsonobject result = words_result.getjsonobject(key);
string value = result.getstring("words");
switch (key) {
case "姓名":
map.put("姓名", value);
break;
case "民族":
map.put("民族", value);
break;
case "住址":
map.put("住址", value);
break;
case "公民身份号码":
map.put("公民身份号码", value);
break;
case "出生":
map.put("出生日期", value);
break;
case "性别":
map.put("性别", value);
break;
case "失效日期":
map.put("失效日期", value);
break;
case "签发日期":
map.put("签发日期", value);
break;
case "签发机关":
map.put("签发机关", value);
break;
}
}
} catch (exception e) {
e.printstacktrace();
}
return map;
}
}
base64 本地文件转换
import sun.misc.base64encoder;
import java.io.file;
import java.io.fileinputstream;
import java.io.inputstream;
public class base64 {
/**
* 将本地图片进行base64位编码
*
* imgurl 图片的url路径,如e:\\123.png
*
* @return
*/
public static string encodeimgagetobase64(file imagefile) {
// 将图片文件转化为字节数组字符串,并对其进行base64编码处理
// 其进行base64编码处理
byte[] data = null;
// 读取图片字节数组
try {
inputstream in = new fileinputstream(imagefile);
data = new byte[in.available()];
in.read(data);
in.close();
} catch (exception e) {
e.printstacktrace();
}
// 对字节数组base64编码
base64encoder encoder = new base64encoder();
// 返回base64编码过的字节数组字符串
return encoder.encode(data);
}
}
接下来 先写一个本地图片识别测试
public static void main(string[] args) {
//获取本地的绝对路径图片
file file = new file("f:\\timg2.jpg");
//进行base64位编码
string imagebase = base64.encodeimgagetobase64(file);
imagebase = imagebase.replaceall("\r\n", "");
imagebase = imagebase.replaceall("\\ ", "+");
//百度云的文字识别接口,后面参数为获取到的token
string httpurl = "https://aip.baidubce.com/rest/2.0/ocr/v1/idcard?access_token=" baiduocr.getauth();
//id_card_side=front 识别正面 id_card_side=back 识别背面
string httparg = "detect_direction=true&id_card_side=front&image=" imagebase;
string jsonresult = baiduocr.request(httpurl, httparg);
//system.out.println("返回的结果--------->" jsonresult);
hashmap
for (string key : map.keyset()) {
system.out.println(key ": " map.get(key));
}
}
然后再给一个是前端 传过来的时进行识别,其实和本地识别区别在于 base64的转换一样,其他都是一样的,所以顺便也给你们贴出来 ,因为测试我把前端传过来的照片顺便存到了本地,如不需要你们删除即可
/**
* @description 身份证图片识别
* @date 2022/5/9 16:36
* @param [file, request]
* @return void
**/
@postmapping("/getphoto")
@responsebody
public void getphoto(@requestparam("file") multipartfile file, httpservletrequest request) throws ioexception {
multiparthttpservletrequest multipartrequest=(multiparthttpservletrequest) request;
multipartfile headerimage = multipartrequest.getfile("file");
if (headerimage == null) {
system.out.println("您还没有选择图片");
}
string filename= headerimage.getoriginalfilename();
//根据当前时间生成文件名
filename = new simpledateformat("yyyy-mm-dd-hh-mm-ss").format(new date()) "." filename;
system.out.println(filename);
// 确定文件存放的路径
file dest = new file("f:\\ocr-images" "/" filename);
try {
// 存储文件
headerimage.transferto(dest);
} catch (ioexception e) {
throw new runtimeexception("上传文件失败,服务器发生异常!", e);
}
string imagebase = base64.encodeimgagetobase64(dest);
imagebase = imagebase.replaceall("\r\n", "");
imagebase = imagebase.replaceall("\\ ", "+");
//百度云的文字识别接口,后面参数为获取到的token
string httpurl = "https://aip.baidubce.com/rest/2.0/ocr/v1/idcard?access_token=" baiduocr.getauth();
//id_card_side=front 识别正面 id_card_side=back 识别背面
string httparg = "detect_direction=true&id_card_side=front&image=" imagebase;
string jsonresult = baiduocr.request(httpurl, httparg);
//system.out.println("返回的结果--------->" jsonresult);
hashmap
for (string key : map.keyset()) {
system.out.println(key ": " map.get(key));
}
//system.out.println(base64code);
//@requestpart("file")
}
正面识别结果: 背面识别结果:
总结
到此就收工了,这里借鉴了两位大佬的博客 前端 后端
前言:
老师要我们下载sql server 2008r2做的实验,因为某些特殊原因我在linux上用mysql做了。
我的知识有限,并不能完成所有实验。
之前老师给了一个叫“pubs”的库让我们做查询语句的练习,后来才自己建库,前面实验的表已经建好并插入数据了,否则下面的部分内容就不能做,因为太简单繁琐了就没有记录。
不知道是操作系统的原因还是语句的原因,虽然感觉sql server和mysql两个都差不多但其实还是有细微的差别的。
关于数据库安全性管理那块我在查找了资料以后还是不能做到实验要求的,所以用了sql server做,嗯图形界面确实比较方便操作。
里面的操作我都尽量截图了,有什么不对的请指正。
下面的实验分别是:
实验五 视图的定义与操作 1. 对应 hrm 数据库,参照前面实验中完成的查询,按如下要求自行设计视图:
(1)基于单个表按投影操作定义视图。 举例:定义一个视图用以查看所有员工的编号、姓名和出生日期。
(2)基于单个表按选择操作定义视图。 举例:定义一个满足 sex=?true?的员工的所有信息的视图。
(3)基于单个表按选择和投影操作定义视图。 举例:定义一个视图用以查看部门号码为?2?的所有员工的姓名、电话和邮件地址。
(4)基于多个表根据连接操作定义视图。 举例:定义一个视图用以查看所有员工的姓名、部门名及工资。
(5)基于多个表根据嵌套查询定义视图。 举例:定义一个比所有财务部的雇员工资都高的雇员的信息的视图
(6)定义含有虚字段(即基本表中原本不存在的字段)的视图。 举例:定义一个视图用以查看所有雇员的编号、姓名、年龄。 2. 分别在定义的视图上进行查询、插入、更新和删除操作,分情况(查询、更新)讨 论哪些操作可以成功完成,哪些不能成功完成,并分析原因。
实验六 数据库完整性的管理
1. 建立课程的实体完整性, 和课程号 cno 的参照完整性;
2. 对 hrm 数据库,练习建立三个表的主外键约束、唯一约束、取空值约束、用户自定 义的约束(参考 hrm 数据库表定义图中说明);
3. 建立 salary 表的 income 字段限定在 0-9999 之间。
实验八 存储过程实验 .
对应于“s 学号”数据库
(1) 创建一个无参存储过程 stuscoreinfo,查询以下信息:班级,学号,姓名,性别, 课程名称,考试成绩。
(2) 创建一个带参数的存储过程 stu_info,该存储过程根据传入的学生编号在 student 表中查询此学生的信息。
(3) 创建一个带参数的存储过程 stuscoreinfo2,该存储过程根据传入的学生编号和课 程名称查询以下信息:班级,学号,姓名,性别,课程名称,考试成绩。
(4) 编写存储过程,统计离散数学的成绩分布情况,即按照各分数段统计人数。
(5) 编写带参数的存储过程,根据传入的课程名称统计该课程的平均成绩。
?
?
实验5
1. 对应 hrm 数据库,参照前面实验中完成的查询,按如下要求自行设计视图:
(1)基于单个表按投影操作定义视图。
举例:定义一个视图用以查看所有员工的编号、姓名和出生日期。
(2)基于单个表按选择操作定义视图。
举例:定义一个满足 sex=?true?的员工的所有信息的视图。
(3)基于单个表按选择和投影操作定义视图。
举例:定义一个视图用以查看部门号码为”2?的所有员工的姓名、电话和邮件地址。
(4)基于多个表根据连接操作定义视图。
举例:定义一个视图用以查看所有员工的姓名、部门名及工资。
(5)基于多个表根据嵌套查询定义视图。
举例:定义一个比所有财务部的雇员工资都高的雇员的信息的视图
(6)定义含有虚字段(即基本表中原本不存在的字段)的视图。
举例:定义一个视图用以查看所有雇员的编号、姓名、年龄。
2. 分别在定义的视图上进行查询、插入、更新和删除操作,分情况(查询、更新)讨
论哪些操作可以成功完成,哪些不能成功完成,并分析原因。
如上视图为例,做查询、插入、更新和删除的操作
查询视图v4中的name
在视图v4中插入数据
显示已操作成功
在后来查看视图v4中所有数据的时候没有显示之前插入的数据
但是在employee中可以查看到之前插入的数据
?
更新
在employee表中插入数据
在视图v4可以看到已经将数据employee的录入视图v4
删除
在视图v4中删除name=”王冰”的操作
在后来查看视图v4时显示已删除
?
实验6
一、可视化界面的操作方法:
1. 实体完整性
(1)将 student 表的“sno”字段设为主键:在表设计界面中,单击左边的行选定块,选
定“sno”字段,单击工具按钮 设置主键。如图 9- 1 所示:
已定义过主键,命令如上图所示,error表示不可定义多个主键
(2)将“sc”表的“sno”和“cno”设置为主键:在表设计界面中,单击并按住 ctrl 键拖动
左边的行选定块,选定 sno 和 cno 字段,单击工具按钮 设置主键。
2. 域完整性
(1)将“ssex”字段设置为只能取“男”,“女”两值:在表设计界面,点击鼠标右键—check
约束,—添加约束,添加 ck_student_sex 名称,然后在约束表达式框中输入“ ssex in ('男','女
') ”。如图 9- 2 所示。
38
图 9- 2 check 设置
3. 参照完整性
(1)“student”表和“sc”表中的“sno”字段设为参照: 打开“sc”表的设计界面, 点击工具
栏按钮 , 在弹出的属性(properties)对话框中点击“新建”按钮,在“主键表(primary key
table)”下拉框中选择“student”表,在其下的字段选择框中选择“sno”,在“外键表(foreign key
table)”下拉框中选择“sc”表,在其下的字段选择框中选择“sno”,单击关闭即可,如图 9- 3
所示。
图 9- 3 参照完整性
命令方式操作方法:
实体完整性
1.将“student”表的“sno”字段设为主键:
当“student”表已存在则执行:
alter table student add constraint pk_sno primary key (sno)
39
当“student”表不存在则执行:
create table student(sno char(5) primary key ,
sname char(10) not null,
ssex char(2),
sage int,
sdept char(4))
注:可用命令“drop table student”删除“student”表
2. 添加一身份证号字段,设置其惟一性.(注: 操作前应删除表中的所有记录)
alter table student add id char(18) unique (id)
3. 将“sc”表的“sno”和“cno”设置为主键:
当“sc”表已存在则执行:
alter table sc add constraint pk_snocno primary key (sno,cno)
当“sc”表不存在则执行:
create table sc(sno char(5),
cno char(2),
grade int null,
constraint pk_snocno primary key (sno,cno))
域完整性
4. 将“ssex”字段设置为只能取“男”,“女”两值:
当“student”表已存在则执行:
alter table student add constraint ck_sex check (ssex in ('男' ,'女'))
当“student”表不存在则执行:
create table student(sno char(5) primary key ,
sname char(10),
ssex char(2) check (ssex in ('男' ,'女')) ,
sage int, sdept char(4))
5. 设置学号字段只能输入数字:
?alter table student add constraint ck_sno_format check (sno like
'[0-9][0-9][0-9][0-9][0-9]')
6. 设置身份证号的输入格式:
alter table student add constraint ck_id_format check ((id like
'[0-9][0-9][0-9][0-9][0-9][0-9][1-2][0-9][0-9][0-9][0-1][0-9][0-3][0-9][0-9][0-9][0-9]_') or (id
like '[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-1][0-9][0-3][0-9][0-9][0-9][0-9]'))
7. 设置 18 位身份证号的第 7 位到第 10 位为合法的年份(1900-2050)
40
alter table student add constraint ck_id_format2 check (len(id)=18 and
( (convert(smallint,substring(id,7,4) )>=1900) and(convert(smallint,substring(id,7,4) )<=2050)) )
红色表示没做出来
8. 设置男生的年龄必须大于 22, 女生的年龄必须大于 20.
alter table student add constraint ck_age check (ssex='男' and sage>=22 or ssex='女' and
sage>=20 )
参照完整性
9. 将“student”表和“sc”表中的“sno”字段设为参照:
当“sc”表已存在则执行:
alter table sc add constraint fp_sno foreign key (sno) references student(sno )
当“sc”表不存在则执行:
create table sc(sno char(5) constraint fp_sno
foreign key references student(sno),
cno char(2),grade int null,
constraint pk_snocno primary key (sno,cno) )
完整性验证
1.实体完整性:在“student”表数据浏览可视化界面中输入学号相同的两条记录将会出
现错误如图 5 所示:
图 5
或者在命令窗口输入下面两条命令也会出现错误提示:
insert into student values('95003','张三','男',24,'cs','42222919901012903x')
insertinto student values('95001','李四','女',21,'cs','422229199510129031')
41
图 6
下面的语句用来验证“sc”表中的实体完整性:alter
insert into sc values('95002', '10',65)
insert into sc values('95002', '10',90)
2. 域完整性:
使用下面的语句验证“ssex”字段的域完整性:
insert into student values('95009','张匀','大',20,'cs', ?42222919901012904x?)
3.参照完整性:
使用下面的语句“验证”sc 表中的“sno”字段的域完整性(假设 student 表中没有学号为“95998”的学生记录):
insert into sc values('98998', '10',98)
建立课程的实体完整性, 和课程号 cno 的参照完整性;
2. 对 hrm 数据库,练习建立三个表的主外键约束、唯一约束、取空值约束、用户自定义的约束(参考 hrm 数据库表定义图中说明);
主键约束:alter table tbname add primary key(age);
外键约束:alter table tbname add foreign key(classno) references t_class(cno);
唯一约束: create table tbname(id varchar(20) unique;
取空值约束:null
用户自定义的约束: alter table student add constraint ck_age check (ssex='男' and sage>=22 or ssex='女' and sage>=20 );
3. 建立 salary 表的 income 字段限定在 0-9999 之间。
?
?
实验七
1. 创建角色 programerrole,拥有创建表,存储过程,视图权限,拥有对 salary 表的
查询、修改、插入权限
图1 创建角色,赋予限权
实验八
对应于“s 学号”数据库
(1) 创建一个无参存储过程 stuscoreinfo,查询以下信息:班级,学号,姓名,性别,
课程名称,考试成绩。
图1 创建无参存储
图2 创建结果
(2) 创建一个带参数的存储过程 stu_info,该存储过程根据传入的学生编号在 student
表中查询此学生的信息。
图3 创建带参存储
图4 创建结果
(3) 创建一个带参数的存储过程 stuscoreinfo2,该存储过程根据传入的学生编号和课
程名称查询以下信息:班级,学号,姓名,性别,课程名称,考试成绩。
图5 创建带多参存储
图6 创建结果
(4) 编写存储过程,统计离散数学的成绩分布情况,即按照各分数段统计人数。
图7 创建带参存储的成绩分布情况
(5) 编写带参数的存储过程,根据传入的课程名称统计该课程的平均成绩。
图8 创建带参存储的统计平均成绩
图9 创建结果
?
还没有评论,来说两句吧...