【数据库原理及安全实验】实验六 角色访问控制
指导书原文
- 安全性管理二
【实验目的】
1) 通过语句设置登录用户的权限,实现对不同用户的操作权限的限定。
【实验原理】
1) 定义数据库角色,授予该角色特定权限,建立不同的用户将其置入不同的角色之下,即等于分配了该用户不同的权限,使用这种角色管理办法可以提高数据库的管理安全性。
2)通过“use databasename;”语句或”展开数据库->右击 databasename->选择新建查询“,选择要操作的数据库,再执行查询、插入等操作命令,不选择数据库则会出现报错。
【实验环境】
windows7
SQL SERVER 2008
【实验步骤】
一、建立数据库及各表项
1.1 建立stumanage数据库。如图1所示
create database stumanage
图1
1.2 建表student,添加两组数据。如图2所示
create table student(
sno char(8) not null primary key,
sname Varchar(20) not null,
sex Char(2) not null,
dept Varchar(20) not null)
insert into student values('20050101','王飞','男','计算机系')
insert into student values('20050102','李丽','女','信息系')
图2
1.3 建表course,添加两组数据。如图3所示
create table course(
cno Char(6) primary key,
cname Varchar(20) not null)
insert into course values('01','数据结构')
insert into course values('02','数据库原理')
图3
1.4 建表sc,添加两组数据。如图4所示
create table sc(
sno Char(8),
cno Char(6),
grade int)
insert into sc values('20050101','01','70')
insert into sc values('20050102','02','90')
图4
二、建立数据库角色
2.1 在stumanage数据库中建立用户定义的角色:SelectRole,并授予该角色对 Student、Course和SC表具有查询权。如图5所示
create role SelectRole
grant select on student to SelectRole
grant select on course to SelectRole
grant select on sc to SelectRole
图5
2.2 亦可右键该角色—“属性”—“安全对象”,在下方勾选所赋予的权限。如图6所示
图6
三、建立用户pub_user
3.1 新建立一个SQL Server身份验证模式的登录名pub_user,并让该登录名成为数据库stumanage中的合法用户。如图7所示
create login pub_user with password = '1'
create user pub_user
图7
3.2 用pub_user登录。如图8所示
图8
3.3 建立一个新建查询,执行Select * from course;因为pub_user虽然是stumanage中的用户,却没有对于数据库stumanage的查询权限,所以查询失败。如图9所示
图9
四、改变用户成员身份
4.1 以Windows身份将pub_user 添加到SelectRole角色中。exec sp_addrolemember 'SelectRole' , 'pub_user'。如图10所示
图10
4.2 右键数据库角色SelectRole—“属性”—“常规”,可以查看到pub_user已经成为SelectRole角色下的成员了。如图11所示
图11
4.3 使用pub_user身份登录,新建并执行SQL语句select * from course。因为pub_user已经成为了SelectRole中的一员,而SelectRole具有对stumanage具有查询权限,所以pub_user可以对stumanage中的表进行查询。如图12所示
图12
【实验思考】
- 如何用T-SQL语句实现将WINDOWS登录名user2添加到stumanage数据库中的SelectRole角色中?
- 安全性管理1
【实验目的】
1) 通过语句设置登录用户的权限,实现对不同用户的操作权限的限定。
【实验原理】
1) 将用户置于目标数据库下,并对其设置相应的权限,以实现该用户对数据库的特定操作。
【实验环境】
windows7
SQL SERVER 2008
【实验步骤】
一、建立登录名及数据库
1.1 建立登录名log1,log2。如图1所示
create login log1 with password = '1'
create login log2 with password = '1'
图1
1.2 建立stumanage数据库。如图2所示
create database stumanage
图2
1.3 建表student,添加两组数据。如图3所示
create table student(
sno char(8) not null primary key,
sname Varchar(20) not null,
sex Char(2) not null,
dept Varchar(20) not null)
insert into student values('20050101','王飞','男','计算机系')
insert into student values('20050102','李丽','女','信息系')
图3
1.4 建表course,添加两组数据。如图4所示
create table course(
cno Char(6) primary key,
cname Varchar(20) not null)
insert into course values('01','数据结构')
insert into course values('02','数据库原理')
图4
1.5 建表sc,添加两组数据。如图5所示
create table sc(
sno Char(8),
cno Char(6),
grade int)
insert into sc values('20050101','01','70')
insert into sc values('20050102','02','90')
图5
二、登录log1,访问数据库
2.1 用log1身份登录,点击stumanage数据库。如图6所示
图6
2.2 因为log1登录名不是stumanage数据库中的用户,所以无法访问。如图7所示
图7
三、增加用户映射
3.1 以windows用户的身份登录数据库,打开“安全性”--“登录名”,右键“log1”选择“属性”,点击“用户映射”,勾选stumanage数据库进行log1与数据库stumanage的映射。如图8所示
图8
3.2 同理对log2进行此项操作。如图9所示
图9
3.3 用log1身份登录数据库,由于log1已经是students数据库中的用户了,所以可以正常选中stumanage。如图10所示
图10
四、增加权限
4.1 log1中在stumanage下执行语句Select * from Course,由于log1没有查询权限,查询没有成功。如图11所示
图11
4.2 以Windows身份登录,新建查询“grant select on course to log1”对log1授予Course查询权限。如图12所示
图12
4.3 此时再用log1身份对course进行查询select * from Course,发现可以查询。如图13所示
图13
4.4 同理对log2用户增加插入权限。如图14所示
grant insert on course to log2
图14
4.5 用log2建立一个新建查询,执行语句 Insert into course values('03','c语言程序设计')。如图15所示
图15
4.6 以Windows身份查询course内容:select * from Course,发现内容已成功插入。如图16所示
图16
【实验思考】
- 如何用T-SQL语句实现给予用户建表权限?
- 完成以上操作的同学可以完成mysql角色访问控制实验。
实验Warning
1.做实验二的时候,我一开始出现这个信息:
消息 15151,级别 16,状态 1,第 1 行 无法对 用户 'log1' 执行 查找,因为它不存在,或者您没有所需的权限。
我以为是什么权限设置的问题,但是实际上是创建的代码一个别省着复制粘贴,我就是漏掉了create table course。
2.无论是log1的Select * from Course,还是log2的Insert into course values('03','c语言程序设计'),都发现失败。
根据我摸爬滚打二十分钟的经验,设置用户映射,你还要勾中master!再执行授权,才有用。
实验报告
五、实验过程原始记录(数据、图表、计算等)
实验一:
以下是尝试用SQL Server身份验证登陆服务器
下图是建立一个新建查询,执行Select * from course,发现查询失败的情况。
下图是授权后再次查询,执行Select * from course,发现查询成功的情况。
实验二:
用log1身份登录,点击stumanage数据库。发现无法访问的情况。
增加用户映射的操作说明:
现在的数据库可查看了
但是没有查询权限
发现可以查询
发现可以插入
六、实验结果及分析
1. 利用backup1和backup2备份设备对students数据库的备份,恢复数据库。完全恢复后,在Course表中有新插入的记录吗?为什么?
答:恢复后的 Course 表中不会有新插入的记录,因为完全恢复(FULL RECOVERY)会还原数据库到备份时的状态,包括下面两种结果:如果 backup1 是完整备份,backup2 是差异或日志备份,恢复后数据库会回到 backup2 备份的时间点;备份之后的所有更改(包括新插入的记录)都会丢失,除非有后续的事务日志备份(LOG BACKUP)并应用到恢复过程。
如果没有后续日志备份,恢复后的数据库只会包含备份时的数据,不会有备份后新增的数据。
2.如何用T-SQL语句实现给予用户建表权限?
答:有以下3种方法:
方法 1:授予 CREATE TABLE 权限
USE YourDatabase; -- 替换成目标数据库
-- 授予用户建表权限(仅限当前数据库)
GRANT CREATE TABLE TO user_log1;
方法 2:授予 db_ddladmin 角色(允许所有 DDL 操作)
USE YourDatabase;
-- 授予用户 DDL 权限(建表、修改表、删除表等)
ALTER ROLE db_ddladmin ADD MEMBER user_log1;
方法 3:授予架构级 ALTER 权限(允许在特定架构下建表)
USE YourDatabase;
-- 授予用户在 dbo 架构下建表的权限
GRANT ALTER ON SCHEMA::dbo TO user_log1;
相关文章:
【数据库原理及安全实验】实验六 角色访问控制
指导书原文 安全性管理二 【实验目的】 1) 通过语句设置登录用户的权限,实现对不同用户的操作权限的限定。 【实验原理】 1) 定义数据库角色,授予该角色特定权限,建立不同的用户将其置入不同的角色之下,即等于分配了该用户不…...
windows安装micromamba
windows安装 winget install Mamba.Micromamba Set-ExecutionPolicy RemoteSigned micromamba activate 第一次运行会报错,把报错中间那一句init代码跑一下 创建环境什么的和conda一样 把conda换成micromamba就行 绑定快捷键,winget安装&#x…...
vue-quill-editor的失焦事件
vue-quill-editor的用法再此就不再赘述了,只记录我在使用过程中踩的坑。 版本:Vue2 vue-quill-editor3.0.6 封装组件: <vue-quill-editorclass"editor":class"dynamicClasses"ref"myTextEditor"v-model&quo…...
【工具变量】最新华证ESG评级得分数据-含xlsx及dta格式(2009-2024.12)
参考《经济研究》中方先明(2023)的做法,将华证ESG评级进行赋值,指标包含C、CC、CCC、B、BB、BBB、A、AA、AAA共9个等级,将上市公司ESG等级从低到高分别赋值为1至9。将华证ESG评级得分数据更新至2024年12月31日…...
【纯小白博客搭建】Hugo+Github博客部署及主题(stack)美化等界面优化记录
这里写目录标题 HugoGithub博客部署及主题(stack)美化等界面优化写在前面hugo博客搭建教程第一种方案第二种方案 添加浏览量和统计字数添加评论功能添加访客地图 HugoGithub博客部署及主题(stack)美化等界面优化 效果图如下 如果…...
题解:CF2107E Ain and Apple Tree
首先考虑无解的情况。 当这棵树为一条链时,答案取到最大值。证明很简单,假设存在一个节点 u u u 至少有 2 2 2 个孩子节点,任取两个 v 1 , v 2 v_1,v_2 v1,v2,则 dep ( LCA ( v 1 , v 2 ) ) dep ( u ) \text{dep}(\o…...
STM32的看门狗
独立看门狗(IWDG) IWDG简介 独立看门狗(Independent Watchdog,通常缩写为IWDG)主要作用是主要用于检测外界电磁干扰,或硬件异常导致的程序跑飞问题。 WDG本质上是一个12位的递减计数器(滴答定…...
小王包子铺的融资过程以及IPO上市过程
用包子铺来打个通俗易懂的比喻,一步步讲清楚从创业到融资上市的全过程。 🥟 故事背景:老王的包子铺 老王做的包子特别好吃,于是他决定不再只是摆摊,而是创办一家叫 “老王包子铺” 的连锁店。我们就以老王创业为线索&…...
WPF 触发器 Trigger
触发器 Trigger 触发器(Trigger)是 WPF 中的一种机制: 当某个条件满足时,自动改变控件的某些属性,比如颜色、大小、透明度等。 换句话说,就是"如果……那么就……" 的一种规则。 常见触发器类…...
CentOS算法部署
CentOS服务部署 第一章 启动两个算法服务第一步:上传算法文件第二步:安装 tmux第三步:启动服务(1) 启动第一个算法服务(2) 启动第二个算法服务 第四步:关闭防火墙 第一章 启动两个算…...
极狐GitLab 命名空间的类型有哪些?
极狐GitLab 是 GitLab 在中国的发行版,关于中文参考文档和资料有: 极狐GitLab 中文文档极狐GitLab 中文论坛极狐GitLab 官网 命名空间 命名空间在极狐GitLab 中组织项目。因为每一个命名空间都是单独的,您可以在多个命名空间中使用相同的项…...
使用 Apache POI 生成包含文本和图片的 Word 文档
一、概述 在实际开发场景中,我们经常需要自动生成包含文本和图片的 Word 文档。本示例借助 Apache POI 库,实现了向 Word 文档中插入文本和图片的功能。代码会循环插入多次文本和同一张图片,并且对图片进行等比缩放处理,以保证图片…...
Eclipse通过Tomcat启动web项目报错
错误内容:Caused by: java.lang.NoClassDefFoundError: org/springframework/context/ApplicationContext。 本来运行的好好的,执行了Maven->Update Porject后就报上面的错。 通过检查发现,执行上面的命令后会将下面截图中的maven depen…...
5.7线性动态规划1
P2285 [HNOI2004] 打鼹鼠 #include<bits/stdc.h> using namespace std; struct node{int x, y, t; }a[100010]; int dp[100010]; void solve(){int n, m; cin >> n >> m;for(int i 1; i < m; i){cin >> a[i].t >> a[i].x >> a[i].y;}…...
Word如何制作三线表格
1.需求 将像这样的表格整理成论文中需要的三线表格。 2.直观流程 选中表格 --> 表格属性中的边框与底纹B --> 在设置中选择无(重置表格)–> 确定 --> 选择第一行(其实是将第一行看成独立表格了,为了设置中线&…...
【Mybatis-plus常用语法】
MyBatis-Plus 是 MyBatis 的增强工具,提供了很多便捷的功能来简化开发。以下是一些 MyBatis-Plus 的常见语法: 实体类注解:使用 TableName 注解来指定实体类和数据库表的映射关系。 TableName("user") public class User {privat…...
16.Excel:数据收集
一 使用在线协作工具 简道云。 excel的在线表格协作在国内无法使用,而数据采集最需要在线协作。 二 使用 excel 1.制作表格 在使用excel进行数据采集的时候,会制作表头给填写人,最好还制作一个示例。 1.输入提示 当点击某个单元格的时候&am…...
基于Django框架开发的企业级IT资产管理系统
CMDB 资产管理系统 资产管理系统是一个基于Django框架开发的企业级IT资产管理平台,专注于数据中心和IT设备的全生命周期管理。该系统提供了完整的资产管理功能,包括设备管理、数据中心管理、用户权限管理等核心功能。 项目截图 技术栈 后端 Python 3…...
Redis 集群版本升级指南:从 Redis 7 升级到 Redis 8
Redis 集群升级主要有两种方案: 1、在线滚动升级(无需停机) 2、停机升级(需停止服务) 一、准备工作 1. 下载 Redis 8 安装包 # Redis 8.0.0 示例(请替换为实际版本) http://download.redis.io…...
使用 Couchbase Analytics Service 的典型步骤
下面是使用 Couchbase Analytics Service 的典型步骤,包括部署、配置、创建数据集、运行查询以及监控优化等环节。 首先,您需要安装并启用 Analytics 服务;然后将节点加入集群并重平衡;接着在 Analytics 中映射数据服务的集合&am…...
C++ stl中的vector的相关用法 迭代器失效问题
文章目录 vector的介绍及使用vector的定义 vector的空间相关问题vector的迭代器的使用vector的增删查改vector迭代器失效问题 vector的介绍及使用 1、vector是用于表示可变大小数组的序列容器。 2、vector就像数组一样,采用的是连续的空间来存储元素,也…...
【Redis】哨兵机制和集群
🔥个人主页: 中草药 🔥专栏:【中间件】企业级中间件剖析 一、哨兵机制 Redis的主从复制模式下,一旦主节点由于故障不能提供服务,需要人工的进行主从切换,同时需要大量的客户端需要被通知切换到…...
uni-app 引入vconsole web端正常,安卓端报错 Cannot read property ‘sendBeacon‘ of undefined
reportJSException >>>> exception function:createInstanceContext, exception:white screen cause create instanceContext failed,check js stack ->Uncaught TypeError: Cannot read property sendBeacon of undefined vconsole 只支持 web 端,…...
数据管道的解耦艺术:Dagster I/O管理器实现存储与逻辑分离
在现代数据工程中,高效管理数据的读写逻辑是构建可维护管道的关键。Dagster的**I/O管理器(I/O Managers)**通过分离数据处理与数据存储逻辑,显著提升了代码的可复用性和灵活性。本文将深入解析其核心概念、应用场景及实战示例。 一…...
shell脚本--2
1、实时监控cpu、内存的shell脚本 #!/bin/bash# 获取当前时间 DATE$(date "%Y-%m-%d %H:%M:%S")# 获取CPU使用情况 CPU_USAGE$(top -b -n1 | grep "Cpu(s)" | awk {print $2 $4})# 获取内存使用情况 MEMORY_USAGE$(free | grep Mem | awk {print $3/$2 *…...
jenkins配置多nexus仓库多maven版本
jenkins多环境多nexus仓库,多maven版本 使用优化,jenkins多环境多nexus仓库,多maven版本 1、多settings.xml设置构建 背景:jenkins本地安装一个maven版本,默认只有一个settings.xml文件指定本地和远端nexus仓库&#x…...
Linux理解文件fd
先来段代码回顾C文件接口 myfile.c写文件 #include <stdio.h>int main() {FILE *fp fopen("log.txt","a");if(NULL fp){perror("fopen");return 1;}fprintf(fp,"helloWorld,%d,%s,%lf\n",10,"lsf",3.14);fclose(fp)…...
【Python】os模块
os 模块是 Python 标准库中用于与操作系统交互的核心模块,提供了许多操作文件和目 录的函数。 1. 基本介绍 os 模块提供了以下主要功能: 文件和目录操作路径操作进程管理环境变量访问 import os2. 常用功能分类 2.1 文件和目录操作 函数/方法描述o…...
2025 Mac常用软件安装配置
1、homebrew 2、jdk 使用brew安装jdk: 配置环境变量: 3、maven 使用brew安装maven: 配置环境变量: 4、光标平滑移动 5、鼠标滚轮调整 mos 6、常用的终端工具 tabby 7、软件卸载 腾讯柠檬:https://lemon.qq.com/ 8、…...
PyQt5 实现自定义滑块,效果还不错
最近,黄老师闲来无事,需要做一个 播放器的滑块,但是Qt官方的长这个样子,不太好看 于是我自己写了一个,效果还不错,请看下面的效果图: 功能可以点击,可以拖拽改变进度,和播放器的进度条一样 源码如下: 需要的自取 import sys from PyQt5.QtWidgets import QApplicat…...
如何在ENVI Classic 和 ENVI中进行波段合成
示例使用Landsat的三个波段进行合成为示例,合成后展示为假彩色。 对应关系为: Red -- b4(近红外 near-infrared)NIR Green -- b3 (红光 Red) Blue -- b2 (绿光 Green) 一、ENVI…...
协方差与皮尔逊相关系数:从定义到应用的全面解析
目录 一、协方差与皮尔逊相关系数的定义1.1 协方差(Covariance)1.2 皮尔逊相关系数(Pearson Correlation Coefficient) 二、协方差的定义与推导逻辑2.1 核心目标:衡量变量的“协同变化”2.2 数学表达的直观性2.3 从线性…...
ICML 2025录取率公布,spotlight posters仅占2.6%
近日,ICML 2025公布了论文录用结果。本次大会共收到 12,107篇有效论文投稿,比去年增加了28%,今年录取论文3,260篇,录取率为 26.9%。其中仅有313篇被列为“焦点海报”(即所有投稿中排名前2.6%的论文)&#x…...
kotlin一个函数返回多个值
一、主要实现方式 1. Pair/Triple 元组 用途:临时快速返回 2 或 3 个简单值,适用于简单场景语法: fun getStatus(): Pair<Int, String> {return Pair(200, "Success") // 等价于 200 to "Success" }// 解构接收 …...
Clojure 学习笔记
Clojure哲学 1.又一种Lisp? 优美、灵活、代码即数据。 实现一门程序设计语言,代码同数据一般对待,这需要语言本身具有非常强的可塑性。当语言就是以这种本质的数据结构表现时,语言本身就可以操作自己的结构和行为了。 2.函数式编…...
5.7 react 路由
react 状态管理库 14:20 react 路由(补充) 数据路由 路由hooks 路由跳转 (方法 标签/内置方法) 获取路由地址栏信息 动态路由实现(多角色权限路由) redux redux-toolkit 状态管理 antd 组件使用 1.…...
8. HTML 表单基础
表单是网页开发中与用户交互的核心组件,用于收集、验证和提交用户输入的数据。本文将基于提供的代码素材,系统讲解 HTML 表单的核心概念、常用控件及最佳实践。 一、表单的基本结构 一个完整的 HTML 表单由以下部分组成: <form action&q…...
遥感数据处理、机器学习建模与空间预测的全流程指南——涵盖R语言(随机森林、XGBoost、SVM等)、特征提取、模型优化及生态学案例分析
随机森林是一种强大的集成学习方法,特别适用于复杂的遥感数据分析。它通过构建多棵决策树并引入随机性,有效降低模型的方差和过拟合风险。在训练过程中,随机森林利用Bootstrap抽样生成多样化的训练集,并在节点分裂时随机选择特征子…...
Android 数据持久化之数据库存储 Room 框架
一、简介 Room 是 Google 推出的 Android 持久层框架,建立在 SQLite 之上,提供了一个抽象层,简化了数据库操作。它通过注解和编译时检查来确保数据操作的正确性。 Room 主要由以下三个组件组成: Entity(实体&#x…...
空间数据分析新趋势:AI 与 ArcGIS Pro 的协同创新
技术点目录 AI(DeepSeek、ChatGPT)大模型介绍及应用AI(DeepSeek、ChatGPT)支持下空间数据处理及分析功能基础AI(DeepSeek、ChatGPT)支持下空间数据选择及读取AI(DeepSeek、ChatGPT)支…...
Oracle OCP认证考试考点详解083系列10
题记: 本系列主要讲解Oracle OCP认证考试考点(题目),适用于19C/21C,跟着学OCP考试必过。 46. 第46题: 题目 解析及答案: 查看以下配置: CDB1 和 CDB2 是两个容器数据库。 PDB1 是 CDB1 中的一…...
【linux常用指令】du命令
今天收到通知需要将服务器上的容量大的文件移动到大容量数据盘中。 du -sh */ | sort -h如果你想按大小排序显示文件夹,可以结合 sort 命令。这会按大小从小到大排序显示文件夹。如果想按大小从大到小排序,可以加上 -r 选项。 du -sh */ | sort -h -r...
统一返回JsonResult踩坑
定义了一个统一返回类,但是没有给Data 导致没有get/set方法,请求一直报错 public class JsonResult<T> {private int code;private String message;private T data;public JsonResult() {}public JsonResult(int code, String message, T data) {…...
MCP Client适配DeepSeek
本文是通过MCP官方的client例子进行修改,适配DeepSeek API. MCP client 先解析一下什么是MCP client。 MCP Client 是 Model Context Protocol(模型上下文协议)架构中的客户端组件,主要负责与 MCP 服务器建立和管理连接。它是一…...
物业设备管理的“多系统协同”模式:ERP、IoT与工单系统如何联动?
在智慧物业快速发展的今天,设备管理已从“被动维修”转向“主动预防”,但许多企业仍面临系统割裂、数据孤岛的困境。ERP系统记录设备台账却难实时监控,IoT设备采集数据却无法联动响应,工单系统处理流程却依赖人工流转——这些痛点…...
【PostgreSQL数据分析实战:从数据清洗到可视化全流程】6.4 时间序列分析(窗口函数处理时间数据)
👉 点击关注不迷路 👉 点击关注不迷路 👉 点击关注不迷路 文章大纲 PostgreSQL时间序列分析:窗口函数处理时间数据实战一、时间序列分析核心场景与窗口函数优势1.1 业务场景需求1.2 窗口函数核心优势 二、窗口函数基础:…...
数据可视化:艺术与科学的交汇点,如何让数据“开口说话”?
数据可视化:艺术与科学的交汇点,如何让数据“开口说话”? 数据可视化,是科技与艺术的结合,是让冰冷的数字变得生动有趣的桥梁。它既是科学——讲究准确性、逻辑性、数据处理的严谨性;又是艺术——强调美感…...
IP 风险画像如何实现对恶意 IP 的有效拦截?
IP 风险画像作为一种强大的技术手段,在识别和拦截恶意 IP 方面发挥着至关重要的作用。 IP风险画像技术简介 IP 风险画像技术通过收集和分析 IP 地址的多维度信息,为每个 IP 构建详细的风险评估模型。 这些维度包括但不限于 IP 的地理位置、历史访问行…...
B树如何用于磁盘 ,B+树为如何用于数据库
B树 M阶B树:每个节点最多M个子节点,每个节点最多存M-1个Key-Value值,key以升序排序。 构建五阶B树。 那么value是干什么的呢。 先让我们介绍一下cpu 内存 磁盘的关系 我们知道了页的概念。B树用于磁盘的读取。Key是对文件进行编号ÿ…...
image-classifier开源程序Elixir是使用电脑学习对图像进行分类并从中提取数据或描述其内容,非常不错的图片整理工具
一、软件介绍 文末提供程序和源码下载 Elixir 机器学习功能构建一个应用程序,该应用程序执行图像字幕和语义搜索,以使用您的语音查找上传的图像! 二、为什么做这个程序 在构建我们的应用程序时,我们认为 images 这是一种必不…...