50天精通Golang(第18天)

web开发介绍、iris框架安装、HTTP请求和返回、Iris路由处理

一 Web项目开发介绍及实战项目介绍

1.1 引言

本系列课程我们将学些Golang语言中的Web开发框架Iris的相关知识和用法。通过本系列视频课程,大家能够从零到一经历一个完整项目的开发,并在课程中了解实战项目开发的流程和项目设涉及的各个模块。

1.2 Web项目开发介绍

1.2.1项目架构

web项目从大的功能上可以分为前台和后台两个部分。前台主要是我们在浏览器中或者桌面应用、Android、iOS移动应用等直接面向用户的程序,直接接受用户的操作和使用,我们称之为前台,也称之为客户端;为前台应用提供数据和功能调用的部署运行在服务器上的程序,用于操作处理前端应用的数据,我们称之为后台,也称之为服务端。类似于上述这种客户端和服务端的架构,我们通常称之为CS模式,C为client的缩写,S为server的缩写。

1.2.2 开发流程
1.2.2.1 需求确定

在需求确定阶段,主要由产品经理进行确定系统的功能与性能。确认了具体需求后,产品经理会将产品功能进行设计,通常称该阶段为产品原型设计过程。在该阶段,核心目标是确定开发需求,完成产品原型设计。

1.2.2.2 分析与设计

在需求确定以后,接下来进入到分析与设计阶段。在该阶段中,又分为几个小阶段,分别为:架构分析与设计、业务逻辑分析、业务逻辑设计和界面设计等四个阶段。
架构分析与设计: 逻辑架构、物理架构(服务器配置、数据库配置)、技术选型等
业务逻辑分析:系统用户、使用目的、操作步骤、用户体验与反馈等
业务逻辑设计:数据库详细设计、对象关系字段映射等
界面设计:UI风格、用户体验等

1.2.2.3 开发环境搭建

当需求和设计阶段都确定以后,就正式进入开发阶段。首先就是开发环境的搭建,这里面包含硬件环境和软件环境两种。硬件环境是指的开发机器,服务器等硬件设施。软件环境包含开发工具,项目管理平台,软件支持等软件支持。开发环境的搭建一般情况下只有在项目刚刚开始和在项目进行大的架构调整时才需要进行,通常的情况下和日常的迭代开发,可以免去此步骤,直接使用已有的开发环境。

1.2.2.4 开发与测试

在实际的项目开发周期中,进行代码开发的周期往往较短。同时,在代码功能开发结束以后,还需要对系统功能进行测试,此时由项目测试人员进行专业的白盒测试、黑盒测试、性能测试、压力测试等全方位、多角度的系统测试。该阶段的开发与测试是交替进行,在实际的开发过程中会反复进行多轮,以此来保证开发人员开发的功能的正确性,保证系统的稳定性。
当系统开发测试阶段结束以后,会对代码进行封版进行最终测试。如果最终测试通过,则会进行部署上线。

1.2.2.5 文档编纂

在系统设计、项目开发与测试过程中,我们要遵循一套适用于团队使用和可执行可接受的标准化开发步骤。在项目开发过程中,我们需要将项目开发,操作说明,项目架构说明等文档性的内容进行编写并妥善保存,以便在后续项目维护和对接过程中,相关人员对项目能够正确快速的了解和熟悉。

1.3 实战项目功能介绍

在本系列课程中,我们将带大家进行一个后台管理平台项目的实战开发,以帮助大家学习Iris框架的相关用法和项目开发流程。

1.3.1 项目效果

首先我们来看一下项目整体运行后的效果:
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

1.2.2 项目架构
  • 前端:vue框架
  • 后端:Go语言Iris框架 + mysql数据库、redis缓存数据库
  • 接口文档工具:
    小幺鸡:http://www.xiaoyaoji.cn/doc/yvnmPtdKK
  • 接口调试工具:Postman
1.2.3 项目开发周期

一周

二 Iris框架

2.1 Golang介绍

Go语言是谷歌推出的一种全新的编程语言,可以在不损失应用程序性能的情况下降低代码的复杂性。谷歌首席软件工程师罗布派克(Rob Pike)说:我们之所以开发Go,是因为过去10多年间软件开发的难度令人沮丧。
谷歌资深软件工程师罗布·派克(Rob Pike)表示,“Go让我体验到了从未有过的开发效率。”派克表示,和今天的C++或C一样,Go是一种系统语言。他解释道,“使用它可以进行快速开发,同时它还是一个真正的编译语言,我们之所以现在将其开源,原因是我们认为它已经非常有用和强大。”
Golang语言的一些的功能:

  • 具有现代的程序语言特色,如垃圾回收,帮助程序设计师处理琐碎和重要的内存管理等问题。Go的速度也非常快,几乎和C或C++程序一样快,且能够快速制作程序。
  • 该软件是专为构建服务器软件所设计(如Google的Gmail),Google认为Go还可应用到其他领域,包括在浏览器内执行软件,取代JavaScript的角色。
  • Go也可解决现今的一大挑战:多核心处理器。一般电脑程序通常依序执行,一次进行一项工作,但多核心处理器更适合并行处理许多工作。
    相较于其他语言,Golang之所以发展迅速,与该语言特有的特色密不可分:
  • 简洁 快速 安全
  • 并行 有趣 开源
  • 内存管理,数组安全,编译迅速

2.2 Iris简介

Iris是一款Go语言中用来开发web应用的框架,该框架支持编写一次并在任何地方以最小的机器功率运行,如Android、ios、Linux和Windows等。该框架只需要一个可执行的服务就可以在平台上运行了。
Iris框架以简单而强大的api而被开发者所熟悉。iris除了为开发者提供非常简单的访问方式外,还同样支持MVC。另外,用iris构建微服务也很容易。
在iris框架的官方网站上,被称为速度最快的Go后端开发框架。在Iris的网站文档上,列出了该框架具备的一些特点和框架特性,列举如下:
1)聚焦高性能
2)健壮的静态路由支持和通配符子域名支持
3)视图系统支持超过5以上模板
4)支持定制事件的高可扩展性Websocket API
5)带有GC, 内存 & redis 提供支持的会话
6)方便的中间件和插件
7)完整REST API
8)能定制HTTP错误
9)源码改变后自动加载
等等还有很多特性,大家可以参考Iris官方文档。在GoWeb开发的诸多框架中,各个维度的性能比较如下:
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

2.3 Iris框架学习渠道

在学习Iris框架过程时,我们需要有相应的配套资料才能够完成我们的学习。下面是学习Iris框架过程中可能会用到的资料。

2.3.1 官方网站

Iris官网:https://iris-go.com/

2.3.2 框架源码

Iris框架源码地址:https://github.com/kataras/iris

2.3.3 框架学习文档

Iris框架中文学习文档: https://studyiris.com/doc/
当然,还有其他相关资料,比如说xorm框架等,这些我们在后面的课程文档中学习到以后再做解释和说明。

2.4 Iris框架安装

2.4.1 Go版本限制

**环境要求:**iris框架要求golang版本至少为1.8。各位同学可以通过打开终端,执行:go version 命令来查看自己机器的go环境版本。

2.4.2 命令安装

安装Iris框架非常简单,使用go语言的全局安装第三方代码的命令get即可。安装Iris框架的命令如下:

go get -u github.com/kataras/iris

在本地终端中执行如上的安装命令,等待命令执行成功,即表示Iris源码下载安装完成。安装完成Iris框架以后,能够在本地机器的GoPath环境目录中的src/github.com/目录下找到iris框架对应的包名,如下图所示:
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
如图所示的kataras/iris所在的目录就是iris框架的源码,如上图所示即是安装成功。

2.5 源码案例

在iris源码安装完成以后,iris框架为开发者提供了自己学习的实战案例,供开发者自行学习。iris提供的案例在iris框架目录中的_example目录下,在学习时可以进行参考。
接下来我们就可以开始学习iris的相关内容,进行代码开发了。

2.6 Iris构造服务实例

在安装完成Iris的源码后,我们就开始来编写最简单的一个Iris的服务。在Iris中,构建并运行一个服务实例需要两步:

  • 1、通过iris.New()方法可以实例化一个应用服务对象app
  • 2、通过Run方法开启端口监听服务,运行服务实例

如下是一个最简单的服务案例Demo

package main
import "github.com/kataras/iris"
func main() {
	//1.创建app结构体对象
	app := iris.New()
	//2.端口监听
	app.Run(iris.Addr(":7999"), iris.WithoutServerError(iris.ErrServerClosed))
	application.Run(iris.Addr(":8080"))//第一种
	//application.Run(iris.Addr(":8080"), iris.WithoutServerError(iris.ErrServerClosed)) //第二种
}

三 Get、Post、Put等请求及数据返回格式

3.1 数据请求方式的分类

所有的项目中使用的请求都遵循HTTP协议标准,HTTP协议经过了1.0和1.1两个版本的发展。

3.1.1 HTTP1.0

HTTP1.0定义了三种请求方法: GET, POST 和 HEAD方法。

3.1.2 HTTP1.1

HTTP1.1新增了五种请求方法:OPTIONS, PUT, DELETE, TRACE 和 CONNECT 方法。

因此,我们可以说,HTTP协议一共定义了八种方法用来对Request-URI网络资源的不同操作方式,这些操作具体为:GET、POST、PUT、DELETE、HEAD、OPTIONS、TRACE、CONNECT等八种操作方式。

3.2 Iris框架的请求处理方式

3.2.1 默认请求处理

Iris框架中服务实例app中包含多个方法,用来支持对上述HTTP多种请求类型的直接处理,直接定义为get方法、post方法、put方法等,app中包含的自动处理路由请求的方法与http请求类型的分类一致。

app := iris.New()
//url: http://localhost:8000/getRequest
//type:GET请求
app.Get("/getRequest", func(context context.Context) {
		path := context.Path()
		app.Logger().Info(path)
})
3.2.2 Handle自定义处理

除了上述1中自动处理各类别的请求外,框架还支持使用通用的Handle方法来自定义编写自己的请求处理类型及对应的方法。

//url: http://localhost:/user/info
//type:POST请求
app.Handle("POST", "/user/info", func(context context.Context) {
		context.WriteString(" User Info is Post Request , Deal is in handle func ")
})
//启动端口监听服务
app.Run(iris.Addr(":8000"))
3.2.3 GET请求

向特定的网络资源数据发起请求。GET请求可以携带请求数据,携带的请求数据会以?分割URL和传输数据,参数之间以&相连,比如http://localhost:3000?name=davie&pwd=123。
如下是一个http的get类型的请求:

http://localhost:8000/userpath

服务端的路由处理方式如下:

//url:http://localhost:8000/userpath
//type:GET请求、用GET方法处理
app.Get("/userpath", func(context context.Context) {
		//获取Path
		path := context.Path()
		//日志输出
		app.Logger().Info(path)
		//写入返回数据:string类型
		context.WriteString("请求路径:" + path)
})

上述为使用已经封装的默认的app.Get方式来处理请求,使用Handle方法来进行处理,如下所示:

//url:http://localhost:8000/hello
//type:GET请求、Handle方法第一个参数为GET,表明是GET请求方式
app.Handle("GET", "/hello", func(context context.Context) {
		context.HTML("<h1> Hello world. </h1>")
})
3.2.4 POST请求

POST请求在进行请求时会将请求数据放在请求body中进行请求,请求数据大小没有限制。在开发过程中,我们使用postman工具来进行POST请求的调试。
POST请求的示例如下所示:

http://localhost:8000/postLogin

服务端的路由处理方式如下:

//type:POST请求
//携带数据:name、pwd命名的请求数据
app.Post("/postLogin", func(context context.Context) {
		//获取请求path
		path := context.Path()
		//日志
		app.Logger().Info(path)
		//获取请求数据字段
		name := context.PostValue("name")
		pwd, err := context.PostValueInt("pwd")
		if err != nil {
			panic(err.Error())
		}
		app.Logger().Info(name, "  ", pwd)
		//返回
		context.HTML(name)
})

上述为使用默认路由请求方法Post方法来进行处理,同时,还可以使用Handle方法来进行处理,如下图:

//url:http://localhost:8000/user/info
//type:POST请求,Handle方法第一个参数为POST,表明是Post请求
app.Handle("POST", "/user/info", func(context context.Context) {
		context.WriteString(" User Info is Post Request , Deal is in handle func ")
})
3.2.5 PUT、DELETE、OPTIONS、HEAD等其他类型请求

除了上述GET、POST最为常见的两种请求方式以外,还有PUT、DELETE、OPTIONS、HEAD等其他类型请求,对于其他类型的请求,如同GET和POST请求一样,都是可以通过两种方式来进行处理:

  • 1、iris框架提供的自动识别请求类型的处理请求方法,如put方法、head方法、options方法、delete方法等
  • 2、使用通用的Handle方法对路由请求进行处理,开发者自己选择具体的请求类型以、对应url和要进行处理的func。

如下是put和delete的请求处理:
PUT请求

//type:PUT类型请求
app.Put("/putinfo", func(context context.Context) {
		path := context.Path()
		app.Logger().Info("请求url:", path)
})

DELETE请求

//type:DELETE类型请求  
app.Delete("/deleteuser", func(context context.Context) {
		path := context.Path()
		app.Logger().Info("Delete请求url:", path)
})

3.3 请求处理的数据格式返回

在本节课程中,我们已经学习了如何对不同类型的请求进行处理以及如何获取请求所携带的数据,当后台接收到请求后,将会对请求进行处理,处理完毕后将数据返回给请求的客户端。接下来,我们看一看如何将数据进行返回,以及都有哪些形式。
在进行请求处理时,处理方法func有一个参数context。Context是用于处理请求的上下文环境变量,用于处理http请求及相关数据返回。iris框架支持多种数据格式的返回,此处我们学习掌握返回string、json、xml以及html格式的数据。

3.3.1 返回string类型数据
context.WriteString("hello world")
3.3.2 返回json格式的数据
context.JSON(iris.Map{"message": "hello word", "requestCode": 200})
3.3.3 返回xml格式的数据
context.XML(Person{Name: "Davie", Age: 18})
3.3.4 返回html格式数据
context.HTML("<h1> Davie, 12 </h1>")

通过本节课的内容,我们学习了iris框架中的不同类型的数据请求以及返回不同的数据格式。

四 路由功能处理方式

4.1 Context概念

Context是iris框架中的一个路由上下文对象,在iris框架中的源码路径定义为:{$goPath}\github.com\kataras\iris\context\context.go。以下是Context的声明和定义:

package context
type Context interface {
	BeginRequest(http.ResponseWriter, *http.Request)
	EndRequest()
	ResponseWriter() ResponseWriter
	ResetResponseWriter(ResponseWriter)
	Request() *http.Request
	SetCurrentRouteName(currentRouteName string)
	GetCurrentRoute() RouteReadOnly
	Do(Handlers)
	AddHandler(...Handler)
	SetHandlers(Handlers)
	Handlers() Handlers
	HandlerIndex(n int) (currentIndex int)
	Proceed(Handler) bool
	HandlerName() string
	Next()
	NextOr(handlers ...Handler) bool
	NextOrNotFound() bool
	NextHandler() Handler
	Skip()
	StopExecution()
	IsStopped() bool
	Params() *RequestParams
	Values() *memstore.Store
	Translate(format string, args ...interface{}) string
	Method() string
	Path() string
	RequestPath(escape bool) string
	Host() string
	Subdomain() (subdomain string)
	IsWWW() bool
	RemoteAddr() string
	GetHeader(name string) string
	IsAjax() bool
	IsMobile() bool
	Header(name string, value string)
	ContentType(cType string)
	GetContentType() string
	GetContentLength() int64
	StatusCode(statusCode int)
	GetStatusCode() int
	Redirect(urlToRedirect string, statusHeader ...int)
	URLParamExists(name string) bool
	URLParamDefault(name string, def string) string
	URLParam(name string) string
	URLParamTrim(name string) string
	URLParamEscape(name string) string
	View(filename string, optionalViewModel ...interface{}) error
	Text(text string) (int, error)
	HTML(htmlContents string) (int, error)
	JSON(v interface{}, options ...JSON) (int, error)
	JSONP(v interface{}, options ...JSONP) (int, error)
	XML(v interface{}, options ...XML) (int, error)
	Markdown(markdownB []byte, options ...Markdown) (int, error)
	......

在该Context的接口定义中,我们可以发现,包含很多处理请求及数据返回的操作。在iris框架内,提供给开发者一个ContextPool,即存储上下文变量Context的管理池,该变量池中有多个context实例,可以进行复用。每次有新请求,就会获取一个新的context变量实例,来进行请求的路由处理。我们在实际的案例学习中,会向大家展示关于Context的相关用法。

4.2 正则表达式路由

Iris框架在进行处理http请求时,支持请求url中包含正则表达式。
正则表达式的具体规则为:

  • 1、使用{}对增则表达式进行包裹,url中出现类似{}样式的格式,即识别为正则表达式
  • 2、支持自定义增则表达式的变量的命名,变量名用字母表示。比如:{name}
  • 3、支持对自定义正则表达式变量的数据类型限制,变量名和对应的数据类型之间用“:”分隔开。比如:{name:string}表示增则表达式为name,类型限定为string类型
  • 4、通过context.Params()的Get()和GetXxx()系列方法来获取对应的请求url中的增则表达式的变量
  • 5、增则表达式支持变量的数据类型包括:string、int、uint、bool等。

如下是正则表达式的请求示例:

app.Get("/api/users/{isLogin:bool}", func(context context.Context) {
	isLogin, err := context.Params().GetBool("isLogin")
	if err != nil {
		context.StatusCode(iris.StatusNonAuthoritativeInfo)
		return
	}
	if isLogin {
		context.WriteString(" 已登录 ")
	} else {
		context.WriteString(" 未登录 ")
	}
})

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

壹基金“安全家园”项目瑞金市城北社区志愿者救援队成立

项目介绍&#xff1a;阿里巴巴公益&壹基金安全家园项目 -社区志愿者救援队专项行动是一个以社区为本的防灾减灾公益项目。据介绍&#xff0c;该项目通过推动社区建立自己的志愿者救援队伍&#xff0c;为队伍“配物资”“办培训”&#xff0c;并协助他们动员居民参与“家庭—…

宝宝洗衣机买几公斤?婴儿专用洗衣机测评

由于幼龄时期的宝宝的皮肤比较娇嫩&#xff0c;很容易受到伤害。所以小宝宝的衣服一般都是棉质的&#xff0c;很柔软&#xff0c;很亲肤的&#xff0c;为的就是保护宝贝们娇嫩的肌肤。而宝宝们在日常中更换衣物会相对频繁&#xff0c;换的衣物也必须及时清洗晾晒&#xff0c;以…

1-数组-有效的数独

这是数组的第一题&#xff0c;从现在开始开启数组篇章。力扣链接。 请你判断一个 9 x 9 的数独是否有效。只需要 根据以下规则 &#xff0c;验证已经填入的数字是否有效即可。 数字 1-9 在每一行只能出现一次。数字 1-9 在每一列只能出现一次。数字 1-9 在每一个以粗实线分隔的…

锐意进取,蓬勃发展|爱基百客2023全景图

岁序更迭&#xff0c;2023年已悄然离去。对我们来说&#xff0c;这是充满挑战与机遇的一年。爱基百客作为一家专注于测序服务的公司&#xff0c;我们在这一年里经历了许多挑战&#xff0c;也取得了令人鼓舞的成绩。前面我们盘点了表观产品和单细胞产品&#xff0c;今天再邀您回…

.Net 8.0 Web API Controllers 添加到 windows 服务

示例源码下载&#xff1a;https://download.csdn.net/download/hefeng_aspnet/88747022 创建 Windows 服务的方法之一是从工作线程服务模板开始。 但是&#xff0c;如果您希望能够让它托管 API 控制器&#xff08;也许是为了查看它正在运行的进程的状态&#xff09;&#xff0…

企业知识库搭建全流程,中小型企业必看

知识库是企业知识管理和信息查询的重要平台&#xff0c;对企业效率提升&#xff0c;业务流程规范和企业文化建设有着重要的影响。那么&#xff0c;如何为企业搭建一个合适&#xff0c;高效&#xff0c;易用的知识库呢&#xff1f;接下来就为中小型企业详解企业知识库搭建全流程…

什么是二维码?带你快速了解二维码的原理

二维条码是指在一维条码的基础上扩展出另一维具有可读性的条码&#xff0c;使用黑白矩形图案表示二进制数据&#xff0c;被设备扫描后可获取其中所包含的信息。与一维条码不同的是&#xff0c;二维条码的长度和宽度都可以记载数据&#xff0c;而一维条码仅宽度记载数据。二维条…

yolo使用tensorboard查看训练过程

在终端打开并将此处的路径替换成绝对路径即可。 # tensorboard --logdir "绝对路径" tensorboard --logdir"D:\Learning\PycharmProjects\yolov8\ultralytics-main\runs\detect\train4" 参考&#xff1a;查看训练过程

Samtec工程师分享ADS Design Guide Developer Studio | Keysight EDA创新论坛上的思维碰撞

【摘要/前言】 "Samtec 始终为客户提供卓越的信号完整性支持。有时&#xff0c;我们协助客户通过模拟来评估通道。不同的参数设置会导致不同的模拟结果&#xff0c;为了避免这一情况发生&#xff0c;我们利用 ADS Design Guide Developer Studio统一了通道配置。" …

C++——STL标准模板库——容器详解——list

一、基本概念 &#xff08;一&#xff09;定义 list&#xff1a;双向链表。list是一种分布式存储的线性表&#xff0c;每个节点分为数据域和指针域&#xff0c;其中指针域中包含一个指向前驱节点的指针和一个指向后续节点的指针&#xff0c;基本模型如下&#xff1a; &#…

PHP+MySQL组合开发:微信小程序万能建站源码系统 附带完整的搭建教程

随着移动互联网的快速发展&#xff0c;微信小程序已成为企业进行移动营销的重要工具。然而&#xff0c;对于许多中小企业和个人开发者来说&#xff0c;开发一个功能完善、用户体验良好的小程序是一项复杂的任务。罗峰给大家分享一款微信小程序万能建站源码系统。该系统采用PHPM…

AI工具推荐:开源TTS(文本生成语音)模型集合

XTTS TTS是一个语音生成模型&#xff0c;可以通过一个简短的6秒音频片段将声音克隆到不同的语言。它不需要大量的训练数据&#xff0c;也不需要耗费大量时间。TTS支持17种语言&#xff0c;可以进行声音克隆、情感和风格转移、跨语言声音克隆以及多语言语音生成等功能。XTTS-v2…

Oracle-java下载、开源/商业许可证(收费、免费说明)、版本发布日志

Oracle-java下载、开源/商业许可证&#xff08;收费、免费说明&#xff09;、版本发布日志 下载开源/商业许可证&#xff08;收费、免费说明&#xff09;java8版本发布日志以上是一般情况&#xff0c;具体的以官网发布信息为准 下载 下载地址&#xff1a;https://www.oracle.c…

经纬恒润首个国产化4G T-BOX已获客户定点

近日&#xff0c;经纬恒润首个国产化4G T-BOX产品获得某头部整车厂定点&#xff0c;预计2024年开始量产。 经纬恒润自主研发的首个国产化4G T-BOX, 基于4G蜂窝通讯、GNSS卫星定位和车辆总线通信等核心技术&#xff0c;可以为整车客户提供包括行车数据采集、高精度位置信息、车…

openpose环境搭建

编程如画&#xff0c;我是panda&#xff01; 最近学习要用要openpose&#xff0c;配了三天的环境&#xff0c;快疯了&#xff0c;踩了很多坑&#xff0c;在这里和大家分享一下 目录 前言 一、安装openpose 二、运行openpose 三、常见的两个错误 1. No module named pyopen…

RANSAC(Random sample consensus)随机抽样一致性

文章目录 算法介绍实现过程以直线拟合为例直线的描述源码参考连接 算法介绍 RANSAC&#xff08;Random Sample Consensus&#xff09;是一种迭代的参数估计算法&#xff0c;用于从包含噪声和异常值的数据中拟合数学模型。它最初由Fischler和Bolles于1981年提出&#xff0c;被广…

soso移动营业大厅(纯后端+MySQL数据库+JDBC)

一、项目需求 中国移动,中国联通,中国电信是国内3大通信运营商,每个运营商都提供了不同的品牌套餐来应对不同的用户群,比如北京移动主要有全球通,神州行,动感地带等3大品牌套餐,每种套餐的内容和费用不同,嗖嗖移动是一个假定的通信运营商,提供了话痨套餐,网虫套餐,超人套餐,各…

[HNCTF 2022 Week1]What is Web

flag 在源码里 <! 是 HTML 文档的注释格式&#xff0c;在源码里按 Ctrl F 搜索 <! 能帮你更快地找到提示。 将这个字符串 base64 解码得到 flag &#xff1a;

React Native 环境安装

Notion – The all-in-one workspace for your notes, tasks, wikis, and databases. 搭建开发环境 React Native 中文网 Homebrew&#xff08;包管理器&#xff09; → rvm&#xff08;ruby版本管理&#xff09; → ruby → cocoapods 安装 Homebrew Homebrew /bin/ba…

shell 循环 判断

for 循环 Shell 脚本里最简单的循环当属 for 循环。最简单的 for 循环如下所示&#xff0c;你只需将变量值依次写在 in 后面即可&#xff1a; #!/bin/bashfor num in 1 2 3 4 doecho $num done 如果要循环的内容是字母表里的连续字母或连续数字&#xff0c;那么就可以按以下语…