实验8 数据库完整性、安全设计

news2024/11/24 3:36:20

第1关 执行 CREATE USER 创建以2022100904为用户名的用户,同时设置其密码为root1234

任务描述
执行 CREATE USER 创建以2022100904为用户名的用户,同时设置其密码为root1234

相关知识
创建用户的语法为如下:

CREATE USER '用户名'@'localhost' IDENTIFIED WITH mysql_native_password BY  '密码';
SELECT mysql.user.Host, mysql.user.User FROM mysql.user WHERE USER = '2022100904';

第2关 给予创建的用户2022100904在mydata数据库中授予"J" 表 SELECT 权限

任务描述
给予创建的用户2022100904mydata数据库中授予"J"SELECT 权限(注意创建权限时的用户名为'用户名'@'localhost'),不允许转授此权限给其它用户。

相关知识
1、现已创建以2022100904为用户名的用户。
2、现在mydata数据库中已构建J表。
3、使用 GRANT 语句将对象权限授予用户和角色。
对象权限的授权语句语法为:

GRANT <特权> ON [<对象类型>] <对象> TO <用户或角色>{,<用户或角色>} [WITH GRANT OPTION]; 
<特权>::= ALL [PRIVILEGES] | <动作> {, <动作>} 
<动作>::= SELECT[<列清单>] | INSERT[<列清单>] | UPDATE[<列清单>] | DELETE | REFERENCES[<列清单>] | EXECUTE| READ| WRITE| USAGE 
<列清单>::= <列名> {,<列名>} 
<对象类型>::= TABLE | VIEW | PROCEDURE | PACKAGE | CLASS | TYPE | SEQUENCE | DIRECTORY | DOMAIN 
<对象> ::= [<模式名>.]<对象名> 
<对象名> ::= <表名> | <视图名> | <存储过程/函数名> |<包名> |<类名> |<类型名> |<序列名> | <目录名> | <域名> 
<用户或角色>::= <用户名> | <角色名>

使用说明
(1)授权者必须是具有对应对象权限以及其转授权的用户;
(2)如未指定对象的<模式名>,模式为授权者所在的模式。DIRECTORY 为非模式对象,没有模式;
(3)如设定了对象类型,则该类型必须与对象的实际类型一致,否则会报错;
(4)带 WITH GRANT OPTION 授予权限给用户时,则接受权限的用户可转授此权限;
(5)不带列清单授权时,如果对象上存在同类型的列权限,会全部自动合并;
(6)对于用户所在的模式的表,用户具有所有权限而不需特别指定。 当授权语句中使用了 ALL PRIVILEGES 时,会将指定的数据库对象上所有的对象权限都授予被授权者。

GRANT SELECT ON TABLE J TO '2022100904'@'localhost';

第3关 给予创建的用户2022100904、2022100908授予"J"表 的ALL PRIVILEGES权限

任务描述
给予创建的用户20221009042022100908mydata数据库中授予"J"ALL PRIVILEGES权限(注意创建权限时的用户名为'用户名'@'localhost'),不允许转授此权限给其它用户。

GRANT ALL ON TABLE J TO '2022100904'@'localhost','2022100908'@'localhost';

第4关 给予创建的用户2022100904在mydata数据库中授予“J”表的UPDATE和INSERT权限

任务描述
给予创建的用户2022100904mydata数据库中授予“J”表的UPDATEINSERT权限,允许转授此权限给其它用户。
相关知识
1、现已创建用户名为2022100904的用户。
2、工程项目表J由工程项目代码(JNO)、工程项目名(JNAME)、工程项目所在城市(CITY)组成。
J表如下图:
在这里插入图片描述
现已在mydata数据库中已构建J表,结构信息如下:在这里插入图片描述
3、使用 GRANT 语句将对象权限授予用户和角色。
对象权限的授权语句语法为:

GRANT <特权> ON [<对象类型>] <对象> TO <用户或角色>{,<用户或角色>} [WITH GRANT OPTION]; 
<特权>::= ALL [PRIVILEGES] | <动作> {, <动作>} 
<动作>::= SELECT[<列清单>] | INSERT[<列清单>] | UPDATE[<列清单>] | DELETE | REFERENCES[<列清单>] | EXECUTE| READ| WRITE| USAGE 
<列清单>::= <列名> {,<列名>} 
<对象类型>::= TABLE | VIEW | PROCEDURE | PACKAGE | CLASS | TYPE | SEQUENCE | DIRECTORY | DOMAIN 
<对象> ::= [<模式名>.]<对象名> 
<对象名> ::= <表名> | <视图名> | <存储过程/函数名> |<包名> |<类名> |<类型名> |<序列名> | <目录名> | <域名> 
<用户或角色>::= <用户名> | <角色名>
GRANT UPDATE,INSERT 
ON TABLE J 
TO '2022100904'@'localhost'
WITH GRANT OPTION;

第5关 回收用户2022100904在mydata数据库中授予的 “J” 表 SELECT权限

任务描述
回收用户2022100904mydata数据库中授予的 "J"SELECT权限(回收权限时的用户名为'用户名'@'localhost')。
相关知识
1、现已创建以2022100904为用户名的用户。
2、现在mydata数据库中已构建J表。
3、已授予用户2022100904mydata数据库中的 "J"SELECT 权限
4、使用 REVOKE 语句回收已授予的数据库对象的权限
对象权限的回收语句语法为:

REVOKE [GRANT OPTION FOR] <特权> ON [<对象类型>]<对象> FROM <用户或角色> {,<用户或角色>} [<回收选项>];
<特权>::= ALL [PRIVILEGES] | <动作> {, <动作>}
<动作>::= SELECT | INSERT | UPDATE | DELETE | REFERENCES | EXECUTE | READ | WRITE | USAGE
<对象类型>::= TABLE | VIEW | PROCEDURE | PACKAGE | CLASS | TYPE | SEQUENCE | DIRECTORY | DOMAIN
<对象> ::= [<模式名>.]<对象名>
<对象名> ::= <表名> | <视图名> | <存储过程/函数名> |<包名> |<类名> |<类型名> | <序列名> | <目录名> | <域名>
<用户或角色>::= <用户名> | <角色名>
<回收选项> ::= RESTRICT | CASCADE

使用说明
(1)权限回收者必须是具有回收相应对象权限以及转授权的用户;
(2)回收时不能带列清单,若对象上存在同类型的列权限,则一并被回收;
(3)使用 GRANT OPTION FOR 选项的目的是收回用户或角色权限转授的权利,而不回收用户或角色的权限;并且 GRANT OPTION FOR 选项不能和 RESTRICT 一起使用,否则会报错;
(4)在回收权限时,设定不同的回收选项,其意义不同。 若不设定回收选项,无法回收授予时带 WITH GRANT OPTION 的权限,但也不会检查要回收的权限是否存在限制; 若设定为 RESTRICT,无法回收授予时带 WITH GRANT OPTION 的权限,也无法回收存在限制的权限,如角色上的某权限被别的用户用于创建视图等; 若设定为 CASCADE,可回收授予时带或不带 WITH GRANT OPTION 的权限,若带 WITH GRANT OPTION 还会引起级联回收。利用此选项时也不会检查权限是否存在限制。另外,利用此选项进行级联回收时,若被回收对象上存在另一条路径授予同样权限给该对象时,则仅需回收当前权限。
用户A给用户B授权且允许其转授,用户 B 将权限转授给用户 C。当用户 A 回收用户 B 的权限的时候必须加 CASCADE 回收选项。

REVOKE SELECT 
ON TABLE J 
FROM '2022100904'@'localhost';

第6关 回收用户2022100904、2022100908在mydata数据库的中授予 的J表ALL PRIVILEGES权限

任务描述
回收账号20221009042022100908mydata数据库的中授予 的JALL PRIVILEGES权限(注意回收权限时的用户名为'用户名'@'localhost'

REVOKE ALL
ON TABLE J 
FROM '2022100904'@'localhost','2022100908'@'localhost';

第7关 回收用户2022100904在mydata数据中授予的“J”表UPDATE和INSERT的权限

任务描述
回收用户2022100904mydata数据中授予的“J”UPDATEINSERT的权限。(注意回收权限时的用户名为'用户名'@'localhost'

REVOKE UPDATE,INSERT 
ON TABLE J 
FROM '2022100904'@'localhost';

第8关 创建角色名为 R1的角色

任务描述
创建角色 'R1'
相关知识
创建用户的语法为如下:

CREATE ROLE '角色名';
CREATE ROLE 'R1';

第9关 给予创建的角色R1在mydata数据库中授予"J" 表 的SELECT 、UPDATE、INSERT权限

任务描述
给予创建的角色R1mydata数据库中授予"J" 表 的SELECTUPDATEINSERT权限。
相关知识
1、现已创建角色R1
2、现在mydata数据库中已构建J表。
3、使用 GRANT 语句将对象权限授予用户和角色。
对象权限的授权语句语法为:

GRANT <特权> ON [<对象类型>] <对象> TO <用户或角色>{,<用户或角色>} [WITH GRANT OPTION]; 
<特权>::= ALL [PRIVILEGES] | <动作> {, <动作>} 
<动作>::= SELECT[<列清单>] | INSERT[<列清单>] | UPDATE[<列清单>] | DELETE | REFERENCES[<列清单>] | EXECUTE| READ| WRITE| USAGE 
<列清单>::= <列名> {,<列名>} 
<对象类型>::= TABLE | VIEW | PROCEDURE | PACKAGE | CLASS | TYPE | SEQUENCE | DIRECTORY | DOMAIN 
<对象> ::= [<模式名>.]<对象名> 
<对象名> ::= <表名> | <视图名> | <存储过程/函数名> |<包名> |<类名> |<类型名> |<序列名> | <目录名> | <域名> 
<用户或角色>::= <用户名> | <角色名>

使用说明
(1)授权者必须是具有对应对象权限以及其转授权的用户;
(2)如未指定对象的<模式名>,模式为授权者所在的模式。DIRECTORY 为非模式对象,没有模式;
(3)如设定了对象类型,则该类型必须与对象的实际类型一致,否则会报错;
(4)带 WITH GRANT OPTION 授予权限给用户时,则接受权限的用户可转授此权限;
(5)不带列清单授权时,如果对象上存在同类型的列权限,会全部自动合并;
(6)对于用户所在的模式的表,用户具有所有权限而不需特别指定。 当授权语句中使用了 ALL PRIVILEGES 时,会将指定的数据库对象上所有的对象权限都授予被授权者。

GRANT SELECT,UPDATE,INSERT 
ON TABLE J 
TO R1 ; 

第10关 给予创建的用户2022100904授予角色R1权限

任务描述
给予创建的用户2022100904授予角色R1权限。

相关知识
1、现已创建用户2022100904
2、现已创建角色R1,角色R1mydata数据库中被授予"J" 表 的SELECTUPDATEINSERT权限。
3、现在mydata数据库中已构建J表。
4、授予用户角色权限语法:

GRANT'角色名' TO '用户名'@'localhost';
GRANT 'R1' TO '2022100904'@'localhost';

第11关 给予已授权限的角色R1在mydata数据库中再次授予"J" 表 的DELETE权限

任务描述
给予已授权限的角色R1mydata数据库中再次授予"J" 表 的DELETE权限。

相关知识
1、角色R1在mydata数据库中被授予"J" 表 的SELECTUPDATEINSERT权限。。
2、现在mydata数据库中已构建J表。
3、使用 GRANT 语句将对象权限授予用户和角色。

GRANT DELETE
ON TABLE J 
TO R1 ; 

第12关 回收角色R1 对 J 表的 INSERT 权限

任务描述
回收角色R1J表的 INSERT 权限。

相关知识
1、角色R1mydata数据库中被授予"J" 表 的SELECTUPDATEINSERTDELETE权限。
2、现在mydata数据库中已构建J表。
3、使用 REVOKE 语句回收已授予的数据库对象的权限
对象权限的回收语句语法为:

REVOKE [GRANT OPTION FOR] <特权> ON [<对象类型>]<对象> FROM <用户或角色> {,<用户或角色>} [<回收选项>];
<特权>::= ALL [PRIVILEGES] | <动作> {, <动作>}
<动作>::= SELECT | INSERT | UPDATE | DELETE | REFERENCES | EXECUTE | READ | WRITE | USAGE
<对象类型>::= TABLE | VIEW | PROCEDURE | PACKAGE | CLASS | TYPE | SEQUENCE | DIRECTORY | DOMAIN
<对象> ::= [<模式名>.]<对象名>
<对象名> ::= <表名> | <视图名> | <存储过程/函数名> |<包名> |<类名> |<类型名> | <序列名> | <目录名> | <域名>
<用户或角色>::= <用户名> | <角色名>
<回收选项> ::= RESTRICT | CASCADE

使用说明
(1)权限回收者必须是具有回收相应对象权限以及转授权的用户;
(2)回收时不能带列清单,若对象上存在同类型的列权限,则一并被回收;
(3)使用 GRANT OPTION FOR 选项的目的是收回用户或角色权限转授的权利,而不回收用户或角色的权限;并且 GRANT OPTION FOR 选项不能和 RESTRICT 一起使用,否则会报错;
(4)在回收权限时,设定不同的回收选项,其意义不同。 若不设定回收选项,无法回收授予时带 WITH GRANT OPTION 的权限,但也不会检查要回收的权限是否存在限制; 若设定为RESTRICT,无法回收授予时带 WITH GRANT OPTION 的权限,也无法回收存在限制的权限,如角色上的某权限被别的用户用于创建视图等; 若设定为 CASCADE,可回收授予时带或不带
WITH GRANT OPTION 的权限,若带 WITH GRANT OPTION 还会引起级联回收。利用此选项时也不会检查权限是否存在限制。另外,利用此选项进行级联回收时,若被回收对象上存在另一条路径授予同样权限给该对象时,则仅需回收当前权限。
用户A给用户B授权且允许其转授,用户 B 将权限转授给用户 C。当用户 A 回收用户 B 的权限的时候必须加 CASCADE 回收选项。

REVOKE INSERT 
ON TABLE J 
FROM R1 ; 

第13关 通过角色R1回收用户2022100904的被授予J表的SELECT 、UPDATE、INSERT权限

任务描述
通过角色R1回收用户2022100904的被授予J表的SELECTUPDATEINSERT权限。

相关知识
1、现已创建用户2022100904
2、现已创建角色R1,角色R1mydata数据库中被授予J表 的SELECTUPDATEINSERT权限。
3、用户2022100904已被授予角色R1权限。
4、现在mydata数据库中已构建J表。
5、回收用户角色权限语法:

REVOKE '角色名' FROM '用户名'@'localhost';
REVOKE 'R1' FROM '2022100904'@'localhost';

第14关 编写一个名为INSERT_S的触发器,在S表执行 INSERT 语句后被激发

任务描述
编写一个名为INSERT_S的触发器,在S表执行 INSERT 语句后被激发,此触发器将新供应商的SNOSNAMESTATUSCITY及执行此操作的用户(USER)插入N_S表,N_S表比S表增添操作用户一列。
相关知识
1、供应商表S由供应商代码(SNO)、供应商姓名(SNAME)、供应商状态(STATUS)、供应商所在城市(CITY)组成.
S表如下图:
在这里插入图片描述
现已构建S表,结构信息如下:
在这里插入图片描述
2、N_S表由供应商的SNOSNAMESTATUSCITY及执行此操作的用户USER组成,现已构建该表,结构信息如下:
在这里插入图片描述
3、Mysql触发器语法:
在这里插入图片描述
创建触发器样例:删除tab1表记录后自动将tab2表中对应的记录删去。
在这里插入图片描述
注意:
1、获取用户名称的函数为USER();
在这里插入图片描述

DELIMITER $$
CREATE TRIGGER INSERT_S
AFTER INSERT ON S
FOR EACH ROW
BEGIN
INSERT INTO N_S (SNO,SNAME,STATUS,CITY,USER)VALUES(NEW.SNO,NEW.SNAME,NEW.STATUS,NEW.CITY,USER());
END $$
DELIMITER ;

第15关 编写一个名为UPDATE_S的触发器,检查S表的STATUS,只允许0-100之间,如果超过100后,改为100。

任务描述
编写一个名为UPDATE_S的触发器,检查S表的STATUS,只允许0-100之间,超过100后,改为100

DELIMITER $
CREATE TRIGGER UPDATE_S BEFORE                        
UPDATE ON S
FOR EACH ROW
BEGIN
    IF NEW.STATUS>100 
    THEN SET NEW.STATUS=100;
    END IF;
END$
DELIMITER ;

第16关 编写一个名为UPDATE_SPJ的触发器,当SPJ表中有更新某条记录时,自动更新表SPJ_SUMQTY表

任务描述
编写一个名为UPDATE_SPJ的触发器,当SPJ表中有更新某条记录时,自动更新表SPJ_SUMQTY表。
相关知识
1、供应情况表SPJ由供应商代码(SNO)、零件代码(PNO)、工程项目代码(JNO)、供应数量(QTY)组成,标识某供应商 供应某种零件 给某工程项目的数量为QTY
SPJ表如下图:
在这里插入图片描述
现已构建SPJ表,结构信息如下:
在这里插入图片描述
2、SPJ_SUMQTY表为工程零件数量统计表,由工程项目代码(JNO)、零件代码(PNO)、统计供应数量SUMQTY组成,其中SUMQTYSPJ表中的工程项目代码(JNO)、零件代码(PNO)、供应数量(QTY),根据JNOPNO汇总得到。
SPJ_SUMQTY表如下图:
在这里插入图片描述
现已构建SPJ_SUMQTY表,结构信息如下:
在这里插入图片描述

DELIMITER $$
CREATE TRIGGER UPDATE_SPJ
AFTER UPDATE ON SPJ
FOR EACH ROW
BEGIN
    UPDATE SPJ_SUMQTY SET SUMQTY = SUMQTY + NEW.QTY - OLD.QTY 
    WHERE PNO = NEW.PNO AND JNO = NEW.JNO;
END $$
DELIMITER;

第17关 编写一个名为DELETE_SPJ的触发器,当SPJ表中有删除某条记录时,自动更新表SPJ_SUMQTY表

任务描述
编写一个名为DELETE_SPJ的触发器,当SPJ表中有删除某条记录时,自动更新表SPJ_SUMQTY表。

DELIMITER $$
CREATE TRIGGER DELETE_SPJ
AFTER DELETE ON SPJ
FOR EACH ROW
BEGIN
    UPDATE SPJ_SUMQTY SET SUMQTY = SUMQTY - OLD.QTY 
    WHERE SPJ_SUMQTY.PNO = OLD.PNO AND SPJ_SUMQTY.JNO = OLD.JNO;
    DELETE FROM SPJ_SUMQTY WHERE SPJ_SUMQTY.SUMQTY <=0;
END $$
DELIMITER ;

第18关 编写一个名为INSERT_SPJ的触发器,当SPJ表中有插入某条记录时,自动更新表SPJ_SUMQTY表

任务描述
编写一个名为INSERT_SPJ的触发器,当SPJ表中有插入某条记录时,自动更新表SPJ_SUMQTY表。

DELIMITER $$
CREATE TRIGGER INSERT_SPJ
AFTER INSERT ON SPJ
FOR EACH ROW
BEGIN
    UPDATE SPJ_SUMQTY SET SUMQTY = SUMQTY + NEW.QTY 
    WHERE SPJ_SUMQTY.PNO = NEW.PNO AND SPJ_SUMQTY.JNO =NEW.JNO;
    IF NEW.JNO NOT IN (SELECT JNO FROM SPJ_SUMQTY)
    OR NEW.PNO NOT IN (SELECT PNO FROM SPJ_SUMQTY)
        THEN INSERT INTO SPJ_SUMQTY VALUES (NEW.JNO,NEW.PNO,NEW.QTY);
    END IF;
END $$
DELIMITER ;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/101468.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

记一次 .NET 某安全生产信息系统 CPU爆高分析

一&#xff1a;背景 1.讲故事 今天是&#x1f40f;的第四天&#xff0c;头终于不巨疼了&#xff0c;写文章已经没什么问题&#xff0c;赶紧爬起来写。 这个月初有位朋友找到我&#xff0c;说他的程序出现了CPU爆高&#xff0c;让我帮忙看下怎么回事&#xff0c;简单分析了下…

JaveWeb框架(三):JavaWeb项目实战 基于Servlet 实现系统登录注册功能

MVC实战项目 仓储管理系统需求&#xff1a;实现基本的登录和注册功能MVC实战项目&#xff1a;登录和注册登录功能实现注册功能实现总结Redis章节复习已经过去&#xff0c;新的章节JavaWeb开始了&#xff0c;这个章节中将会回顾JavaWeb实战项目 公司管理系统部分功能 代码会同步…

软件测试线上故障规范及模板,希望能帮到大家

目录 前言 线上故障规范及模板 [NOF-32] 全平台所有业务下单后支付异常&#xff0c;无法调起支付 创建: XX年/XX月/XX日 更新: XX年/XX月/XX日 解决: XX年/XX月/XX日 总结 前言 对于每一个测试人员来说&#xff0c;软件测试过程中有一个四字成语&#xff0c;真的是如噩梦一…

通用springboot框架

前言 到现在已经学习并工作了许久&#xff0c;于是打算弄一个通用的springboot框架。 这个框架&#xff0c;哪怕是你到正式工作的时候&#xff0c;也是能用上的&#xff0c;也不会给人感觉特别的low 那么&#xff0c;本项目的git我会放在结尾 接下来我来具体说一下该通用的spr…

谷粒商城技术栈总结

文章目录谷粒商城ElasticSearch一、基本概念1、Index&#xff08;索引&#xff09;2、Type&#xff08;类型&#xff09;3、Document&#xff08;文档&#xff09;4、倒排索引机制二、Docker 安装 Es1、下载镜像文件2、创建实例三、初步检索1、_cat2、索引一个文档&#xff08;…

vue - vue中的process.env.NODE_ENV讲解

vue中process.env讲解&#xff1a; 1&#xff0c;什么是process.env process.env 是 Node.js 中的一个环境对象。其中保存着系统的环境的变量信息。可使用 Node.js 命令行工具直接进行查看。如下&#xff1a; 而 NODE_ENV 就是其中的一个环境变量。这个变量主要用于标识当前的环…

【微服务】Nacos 如何做到⼀致性协议下沉的与自研 Distro 协议

目录 一、⼀致性协议下沉 1、⼀致性协议抽象 2、数据存储抽象 二、Nacos 自研 Distro 协议 1、背景 2、设计思想 2.1、数据初始化 2.2、数据校验 2.3、写操作 2.4、读操作 3、小结 一、⼀致性协议下沉 既然 Nacos 已经做到了将 AP、CP 协议下沉到了内核模块&#xff…

Hasoop实训2:实现课件分发

目录 1、准备工作 2、创建工作目录 3、上传课件压缩包 4、创建IP地址列表文件 5、创建脚本完成课件分发任务 6、总结 1、准备工作 在实训1&#xff1a;Hadoop实训1&#xff1a;Linux基本搭建和操作_open_test01的博客-CSDN博客​​​​​​ 中已经配置好了三台虚拟主机…

架构师必读 —— 逻辑模型(6)

横向思考与纵向思考 为了不陷入歪理之中&#xff0c;养成从宏观到微观的思考习惯极其重要。换句话说&#xff0c;就是“先横向思考&#xff0c;再纵向思考”。 横向思考是指&#xff0c;“广而浅地把握整体”。纵向思考是指&#xff0c; “针对某部分深入分析“。有了广泛而基本…

微服务框架 SpringCloud微服务架构 服务异步通讯 51 死信交换机 51.2 TTL

微服务框架 【SpringCloudRabbitMQDockerRedis搜索分布式&#xff0c;系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】 服务异步通讯 文章目录微服务框架服务异步通讯51 死信交换机51.2 TTL51.2.1 TTL51.2.2 总结51 死信交换机 51.2 TTL 51.2.1 TTL TTL&…

如何使用vs code远程连接服务器?如何免密登录?VSCode SSH

依旧是写在前面的废话环节 背景&#xff1a; 计算机专业。实验室电脑情况&#xff1a;两台服务器&#xff0c;一台配置3029ti&#xff0c;一台配置2080ti。深度学习训练跑代码用自己的电脑远程连接服务器&#xff0c;进行代码运行。 用到的软件&#xff1a; visual studio c…

vue3+vite+ts项目集成科大讯飞语音识别(项目搭建过程以及踩坑记录)

&#x1f431;个人主页&#xff1a;不叫猫先生 &#x1f64b;‍♂️作者简介&#xff1a;前端领域新星创作者、华为云享专家、阿里云专家博主&#xff0c;专注于前端各领域技术&#xff0c;共同学习共同进步&#xff0c;一起加油呀&#xff01; &#x1f4ab;系列专栏&#xff…

Web前端105天-day48-jQuery

jQuery01 目录 前言 一、复习 二、jQuery 三、css操作 四、点击事件 五、class 六、show_hide 七、标签栏切换 八、自定有动画 九、属性操作 十、大小图切换 总结 前言 jQuery01学习开始 一、复习 DOM: 文档 对象 模型 HTML代码 转换成 document 对象, 然后再渲染…

ospf,三层交换机,热备,以太网通道练习实验(含命令)

♥️作者&#xff1a;小刘在这里 ♥️每天分享云计算网络运维课堂笔记&#xff0c;疫情之下&#xff0c;你我素未谋面&#xff0c;但你一定要平平安安&#xff0c;一 起努力&#xff0c;共赴美好人生&#xff01; ♥️夕阳下&#xff0c;是最美的&#xff0c;绽放&#xff0c;…

Sikuli循环执行点击图标的脚本

首先需要sikulix jar包 新建java项目 导入sikulix jar包 编写代码如下 这样电脑每隔一段时间就会去点击一下c.png这个图标 package one; import org.sikuli.script.Screen; public class clickMouse { public static void main(String[] args) throws Exception { …

人力资本管理(HCM)软件的主要好处是什么?

人力资本管理&#xff08;HCM&#xff09;包括企业在招聘、雇用和培训期间为优化生产力采取的所有流程。为了最大限度地发挥团队的作用&#xff0c;留住顶尖人才&#xff0c;管理者和领导者需要投资于适当的实践和资源。实现这一目标的方法之一是通过人力资本管理。 作为一套…

js中数组是如何在内存中存储的?

数组不是以一组连续的区域存储在内存中&#xff0c;而是一种哈希映射的形式。它可以通过多种数据结构来实现&#xff0c;其中一种是链表。 js分为基本类型和引用类型&#xff1a; 基本类型是保存在栈内存中的简单数据段&#xff0c;它们的值都有固定的大小&#xff0c;保存在…

【FFmpeg+Qt】视频进度条控制——点击跳转和拖动跳转

首先进度条采用Qslider&#xff0c;设置进度条主要有两点&#xff0c;一是当前视频总时长&#xff0c;二是当前播放时长&#xff0c;需要通过FFmpeg转码成mp4文件才能获取相应的时长数据&#xff1b; 往期回顾&#xff1a; 【QtFFmpeg】视频转码详细流程_logani的博客-CSDN博…

从用户测试中学到的知识

从客户那里获得良好的反馈是个挑战。用户测试有的时候看起来是一个艰巨而且昂贵的任务。但是用户测试可以带来良好的经验&#xff0c;从而帮助设计更好的产品。 那么&#xff0c;从哪里开始呢?我测试了几种方法&#xff0c;有些失败&#xff0c;有些成功。下面我将讲述我所学到…

基于JAVA的教学进度在线管理系统/教学大纲在线管理系统源代码+数据库,含详细项目需求分析、概要设计、详细设计及项目总结文档

项目启动步骤 使用 SQL_Scripts/tms.sql 中的 sql 语句创建数据库与数据库表(数据库建立中&#xff0c;暂无) 修改 src/a_little_config.txt 文件&#xff0c;填入正确的数据库连接用户名、密码 将项目导入 IntelliJ IDEA 或 eclipse。 打开 cn.findix.tms.bin 包下的 WWW 文…