Gin框架系列教程(6)- 连接Mysql,集成Gorm库
本文主要是了解一下Gin框架如何链接MySQL并集成Gorm库的。当然ORM库有很多,虽然gorm库被很多人吐槽,但是并不能否认它很强大,很完善,用的人最多。当然你也可以用其他的库。介绍:Object-Relationl Mapping,即对象关系映射,这里的Relationl指的是关系型数据库,它的作用是在关系型数据库和对象之间作一个映射,这样,我们在具体的操作数据库的时候,就不需要再去和复杂的SQL语句打交道,只要像平时操作对象一样操作它就可以了,Golang写的,GitHub上活跃度很高的orm库。特点:全功能ORM(几乎)关联(包含一个,包含多个,属于,多对多,多种包含)Callbacks(创建/保存/更新/删除/查找之前/之后)预加载(急加载)事务复合主键SQL Builder自动迁移日志可扩展,编写基于GORM回调的插件每个功能都有测试开发人员友好安装:go get gorm.io/driver/mysql go get gorm.io/gorm链接MySQL,迁移数据库,我这里用的是viper解析yaml文档,配置数据库的信息(就直接展示代码):链接并配置:config.yamlmysql: db_username: "root" db_password: "root" db_database: "demo_database" db_host: "127.0.0.1" db_port: "3306" logs: log_level: "debug"base.gopackage models import ( "time" "github.com/spf13/viper" "gorm.io/driver/mysql" "gorm.io/gorm" ) var DB *gorm.DB var err error func Init() { //读取配置 viper.SetConfigFile("config/config.yaml") errConfi := viper.ReadInConfig() if errConfi != nil { panic(errConfi) } db_username := viper.GetString("mysql.db_username") db_password := viper.GetString("mysql.db_password") db_database := viper.GetString("mysql.db_database") db_host := viper.GetString("mysql.db_host") db_port := viper.GetString("mysql.db_port") DB, err = gorm.Open(mysql.New(mysql.Config{ DSN: db_username + ":" + db_password + "@tcp(" + db_host + ":" + db_port + ")/" + db_database + "?charset=utf8mb4&parseTime=True&loc=Local", // DSN data source name DefaultStringSize: 256, // string 类型字段的默认长度 DisableDatetimePrecision: true, // 禁用 datetime 精度,MySQL 5.6 之前的数据库不支持 DontSupportRenameIndex: true, // 重命名索引时采用删除并新建的方式,MySQL 5.7 之前的数据库和 MariaDB 不支持重命名索引 DontSupportRenameColumn: true, // 用 `change` 重命名列,MySQL 8 之前的数据库和 MariaDB 不支持重命名列 SkipInitializeWithVersion: false, // 根据当前 MySQL 版本自动配置 }), &gorm.Config{}) if err != nil { panic(err) } //迁移数据库,上线之后去掉 DB.Set("gorm:table_options", "ENGINE=InnoDB").AutoMigrate(&User{}, &Article{}, &ArticleCategory{}, &Role{}, &Menus{}) sqlDB, _ := DB.DB() // SetMaxIdleConns 设置空闲连接池中连接的最大数量 sqlDB.SetMaxIdleConns(100) // SetMaxOpenConns 设置打开数据库连接的最大数量。 sqlDB.SetMaxOpenConns(50) // SetConnMaxLifetime 设置了连接可复用的最大时间。 sqlDB.SetConnMaxLifetime(time.Hour) }模型下的一个User结构体,用于迁移数据库等:package models import ( "gorm.io/gorm" ) type User struct { gorm.Model Mame string `json:"name" form:"name" gorm:"column:name;comment:姓名;type:varchar(10);"` //姓名 Account string `json:"account" form:"account" gorm:"column:account;comment:账号;type:varchar(10);"` //账号 Password string `json:"password" form:"password" gorm:"column:password;comment:密码;type:varchar(32);"` //密码 Email string `json:"email" form:"email" gorm:"column:email;comment:邮箱;type:varchar(300);"` //邮箱 Image string `json:"image" form:"image" gorm:"column:image;comment:头像;type:varchar(300);"` //头像 IsEnabled int64 `json:"is_enabled" form:"is_enabled" gorm:"column:is_enabled;comment:是否启用;type:smallint;default:1"` //是否启用 } func (User) TableName() string { return "users" }最后注册进程序主入口中:// 数据库初始化 models.Init()结构如下:
查看详情点赞1评论收藏1浏览2842024-02-07 14:37:18Gin框架系列教程(5)- 项目集成swagger及注解简单应用
Swagger介绍:Swagger 是一个规范且完整的框架,用于生成、描述、调用和可视化 RESTful 风格的 Web 服务。Swagger 的目标是对 REST API 定义一个标准且和语言无关的接口,可以让人和计算机拥有无须访问源码、文档或网络流量监测就可以发现和理解服务的能力。当通过 Swagger 进行正确定义,用户可以理解远程服务并使用最少实现逻辑与远程服务进行交互。与为底层编程所实现的接口类似,Swagger 消除了调用服务时可能会有的猜测。支持 API 自动生成同步的在线文档:使用 Swagger 后可以直接通过代码生成文档,不再需要自己手动编写接口文档了,对程序员来说非常方便,可以节约写文档的时间去学习新技术。提供 Web 页面在线测试 API:光有文档还不够,Swagger 生成的文档还支持在线测试。参数和格式都定好了,直接在界面上输入参数对应的值即可在线测试接口。安装Swagger:从 Go 1.17 开始,go get不推荐使用安装可执行文件。go install可以改用:go install github.com/swaggo/swag/cmd/swag@latest swag init //是否安装成功 swag -v项目使用:导入import ( _ "gin_alingfeng/docs" swaggerfiles "github.com/swaggo/files" ginSwagger "github.com/swaggo/gin-swagger" )主程序入口,以及swagger路由:// @host 127.0.0.1:9000 // @schemes http // @Title 接口文档 // @version v1.0 // @description 所有接口的方法,描述,参数,响应,文档,测试,仅供参考,有问题请及时联系管理员。 func main() { r := gin.Default() // 路由初始化 routers.Routers(r) r.GET("/swagger/*any", ginSwagger.WrapHandler(swaggerfiles.Handler)) // 数据库初始化 models.Init() //启动 r.Run(":9000") }api方法注解:(参数,可以单独写,也可以用结构体一起放进去)// @Summary 新增用户 // @Description 新增用户 // @Tags User // @Accept json // @Param name body string true "姓名" example(不超过50字) // @Param email body string false "邮箱" example(不超过50字) // @Param account body string true "账号" example(不超过50字) // @Param data query modules.User true "这里是介绍" // @Produce json // @Success 200 {string} string "{"success":200,"msg":"新增成功"}" // @Failure 500 {string} Add 失败后返回值 // @Router /api/v1/user/add [post] func Add(c *gin.Context) { c.String(200, "user add") }注意:每次修改了注释都需要重新init一下:swag init //其他用法 swag init -dir ./cmd/ -output docs/api/ --pd true --dir main.go文件所在目录 --output 输出目录 --pd 从依赖关系中解析文件 默认false用法描述:// @Tags 每个API操作的标签列表,以逗号分隔,如分组 // @Summary 该操作的简短摘要,如api名称 // @Router 以空格分隔的路径定义。 格式:path,[httpMethod] // @Accept 请求体接收的格式,值为Mime类型 // @param 请求参数用空格分隔的参数。 param name,param type,data type,is mandatory?,comment,attribute(optional) 1.参数名,2.参数类型,3.参数数据类型,4.是否必须,5.参数描述,6.其他属性 其他属性详解: 最大最小值 minimum(0.01),maximum(100) 最大最小长度 minLength(1),maxLength(200) 枚举值 Enums(A, B),Enums(1, 2),Enums(1.1, 2.2) 示例 example(A) 默认值 default(A)-选填 // @Produce 返回体返回的格式,值为Mime类型 // @Success 以空格分隔的成功响应。 return code,{param type},data type,comment 1.返回状态码,2.返回参数类型,3.返回数据,4.参数描述 // @failure 以空格分隔的故障响应。 return code,{param type},data type,comment 1. 返回状态码,2.返回参数类型,3.返回数据,4.参数描述 // Response 定义业务处理响应类型 type Success_Response struct { Code RespCode `json:"code" example:"0"` Msg string `json:"msg" example:"操作成功"` Data RespData `json:"data" example:""` } // Response 定义业务处理响应类型 type failure_Response struct { Code RespCode `json:"code" example:"1"` Msg string `json:"msg" example:"操作失败"` Data RespData `json:"data example:""` } type类型:json: application/json, x-www-form-urlencoded: application/x-www-form-urlencoded, xml: text/xml, plain: text/plain, html: text/html, mpfd: multipart/form-data, json-api: application/vnd.api+json, json-stream: application/x-json-stream, octet-stream: application/octet-stream, png: image/png, jpeg: image/jpeg, gif: image/gif,数据类型:● string (string)● integer (int, uint, uint32, uint64)● number (float32)● boolean (bool)● user defined struct参数类型:● query● path● header● body● formData最后:访问地址:构建您的应用程序,然后访问http://localhost:8080/swagger/index.html,您将看到您的 Swagger UI。
查看详情点赞1评论收藏浏览872024-02-06 15:50:59Gin框架系列教程(4)- Router 路由封装
今天我们研究一下gin中的路由应该怎么配置:首先我们先测试一个简单的路由,也就是默认路由:package main import ( "github.com/gin-gonic/gin" ) func main(c *gin.Context) { r := gin.Default() r.GET("/", func(c *gin.Context) { c.String(200, "hello world") }) r.run('9000') 这个就是首页路由,很简短。那么gin框架中怎么封装路由呢,就是把多个路由按照一定规则进行拆分封装。下面代码展示:一、主入口文件初始化路由r := gin.Default() // 路由初始化 routers.Routers(r)二、新建routers文件夹,以及user,member路由文件夹,路由分组,三个示例文件(routers.go,member.go,user.go)routers.go//router.go package routers import ( "gin_alingfeng/routes/memberRouter" "gin_alingfeng/routes/userRouter" "github.com/gin-gonic/gin" ) func Routers(r *gin.Engine) { //api分组路由 api := r.Group("/api") memberRouter.MemberApiRouter(api) userRouter.UserApiRouter(api) //直接路由 memberRouter.MemberRouter(r) userRouter.UserRouter(r) }member.gopackage memberRouter import ( "gin_alingfeng/controllers/userController" "gin_alingfeng/middleware" "github.com/gin-gonic/gin" ) func MemberApiRouter(api *gin.RouterGroup) { api.GET("/member", func(c *gin.Context) { c.String(200, "hello world member") }) } func MemberRouter(r *gin.Engine) { r.GET("/member2", middleware.Cors(), middleware.Logs, userController.User) } user.gopackage memberRouter import ( "gin_alingfeng/controllers/userController" "gin_alingfeng/middleware" "github.com/gin-gonic/gin" ) func MemberApiRouter(api *gin.RouterGroup) { api.GET("/member", func(c *gin.Context) { c.String(200, "hello world member") }) } func MemberRouter(r *gin.Engine) { r.GET("/member2", middleware.Cors(), middleware.Logs, userController.User) } 结构如下:
查看详情点赞1评论收藏1浏览2582024-02-06 09:43:03PHP Laravel框架blade模板无限级处理
我们在工作研发中,不论哪一门语言,前端还是后端,经常都会处理无限级数据或者模板的时候,例如菜单,分类数据无限级,模板无限极,Vue组件无限极等等。今天用到的是Laravel框架无限级blade模板处理。blade模板中引用一个无限级blade模板:<ul class="side-nav" data-module="6" data-unable="demo1-sidenav"> @if(!empty($nav)) @include('side_nav.product_side_nav', ['nav' => $nav]) @endif </ul>无限级blade模板product_side_nav.blade.php,这里需要注意的事,在这个模板里需要引入模板自己。@foreach($nav as $item) <li data-page="{{$item->route}}"><a href="/{{$item->route == 'index' ? '/' : $item->route}}">{{$item->title}}</a> @if(isset($item->_child) && !empty($item->_child)) <ul> @include('side_nav.product_side_nav', ['nav' => $item->_child]) </ul> @endif </li> @endforeach 现在就可以了。我们看一下实际效果:这里只建了三级菜单分类。
查看详情点赞1评论收藏浏览1762023-10-27 16:08:54Golang 开发SSE流接口,实现ChatGpt逐字打印效果
一直来没时间优化一下我这个gpt,因为最开始弄这个设计成所有数据请求完之后一次性返给前端,这样就需要等gpt处理完所有数据,消耗的时间比较多。所以造成的结果就是请求一次对话需要等待5-15秒不等。实在是影响体验性。这两天稍微有点时间,就琢磨把gpt接口改成一个字一个字或者一段话一段话输出,在网上查找了一些资料,发现有很多处理方式,比如Websocket,SSE之类的,最常见的还是SSE,因为它没有消耗太多资源,对于这样低配置服务器来说是最好的处理方式了。好,接下里我直接上代码,查找资料过程略过。后端:我这里拉Gin服务,其他也行。SSE流接口处理:(流接口主要是三个地方调整)Content-Type":"text/event-stream"Cache-Control":"no-cache"Connection":"keep-alive"package main import ( "time" "github.com/gin-gonic/gin" ) func main() { // 创建路由 router := gin.Default() router.Any("/stream", func(c *gin.Context) { c.Header("Content-Type", "text/event-stream") c.Header("Cache-Control", "no-cache") c.Header("Connection", "keep-alive") c.SSEvent("start", "start") for i := 0; i < 10; i++ { c.Writer.WriteString("data: SSE data\n\n") if i == 9 { c.SSEvent("end", "end") } c.Writer.Flush() time.Sleep(10 * time.Millisecond) } }) // 启动服务 router.Run(":8080") } 前端:(我是在nuxt3框架中处理的,你也可以直接在html页面处理一样的方法,直接copy)<div> <ul> <li> {{ messageStr }} </li> </ul> <div @click="clickHandle">点我</div> </div> </template> <script setup> import { reactive, onMounted, onBeforeUnmount } from "vue"; let messageStr = ref(""); let getData = ()=>{ const sseSource = new window.EventSource('/ccc/stream'); sseSource.addEventListener('message', (event) => { console.log(event.data); messageStr.value = messageStr.value+event.data; }); sseSource.addEventListener('end', (event) => { sseSource.close(); }); } let clickHandle = ()=>{ getData(); }好了,前后端已完成,是不是很简单。现在我们来看下测试效果。
查看详情点赞23评论收藏4浏览13622023-10-20 10:13:27918为什么要拉防空警报防空警报响是什么意思?
918为什么要拉防空警报?9月18日是“九一八”事变爆发纪念日。九一八事变发生时是1931年9月18日晚上10点半,日军炸断柳条湖铁路,然后进攻沈阳,是日本帝国主义侵华的开端。为了铭记历史,为了警醒广大市民勿忘国耻、居安思危。也是为了增强人们的国防观念和人民防空意识。因此,这天就会拉响防空警报。什么时间拉防空警报呢?9月18日这天虽然很多城市会拉响防空警报,但是试鸣时间并未统一,大部分城市,如:北京、南京等时间是9月18日上午10时开始响起警报声,而新疆会在中午12点开始。什么是防空警报?人民防空警报是战时报知敌空袭的信号,可分为预先警报、空袭警报和解除警报。预先警报信号:鸣36秒,停24秒,反复3遍为一个周期,时长3分钟。空袭警报信号:鸣6秒,停6秒,反复15遍为一个周期,时长3分钟。解除警报信号:连续鸣响3分钟防空警报响了怎么办?依法开展防空警报试鸣,是《中华人民共和国人民防空法》赋予的重要职责,是和平环境下提高公民国防意识的重要手段,更是一种行之有效的人防宣传教育形式。因此,试鸣防空警报期间,除参加疏散掩蔽演练的部分社区居民和在校学生外,不需要采取任何措施,继续保持正常的工作和生活秩序。听到“预先警报”后如何行动?通常在发现敌机有空袭征候时,发放预先警报。听到预先警报后,应立即拉断电闸,关闭燃气,熄灭炉火,盖严储存饮水,转移易燃物品,关闭门窗,帮助老幼病残,携带好个人防护器材和必须的生活用品(食物、水、证件),迅速有序地就近进入人防工程或指定的安全隐蔽地域。听到“空袭警报”后如何行动?在敌机即将空袭时,发放空袭警报。听到空袭警报后,应迅速进入人防工程隐蔽。如情况紧急无法进入人防工程时,要利用地形地物就近隐蔽。在室内:可在跨度较小的卫生间,靠墙角的桌下、床下卧倒,避开门窗和易燃易爆物。在室外:在开阔地、低洼地、草地迅速卧倒隐蔽,不要在高压线、油库等危险处停留。卧倒时双手交叉,放到胸前,脸部夹于两臂之间,嘴巴微张,防止爆炸带来的冲击波损伤。在公共场所:不要惊慌、拥挤、乱跑,就近进入防空地下室、地铁车站等地隐蔽。听到“解除警报”后如何行动?解除警报是判明敌人一个波次的空袭已经结束时的警报信号。听到解除警报,应清点携带好自己的物品,有组织地撤出危险区域,进入安全地带。并配合人防专业队伍开展抢险抢修工作,如就近救护伤员、找寻被困人员、扑灭初起火灾、消除沾染、消除潜在危险等。警报解除后,仍要注意收听广播,了解行动注意事项,如哪些道路不能走,哪类食物、饮水不能食用;关注疫情通报、放射性沾染、染毒或带菌情况通报;了解敌空袭规模、方式及城市破坏情况通报,以及下一次敌空袭的预测等,以便有效地做好再次防空行动的准备。
查看详情点赞3评论收藏浏览2242023-09-18 10:12:45918事变具体指哪件事?发生在哪里?意味着什么?
九一八事变,发生在20世纪初的中国东北,至今已有近一个世纪的历史,但其影响仍然深远而持久。这一事件的发生背景包括中国政治动荡和外国列强的干涉,而事变的经过则昭示着中国近代史的重大转折点。本文将详细阐述九一八事变的背景、经过以及对中国和国际政治格局的深远影响一、背景九一八事变发生之际,中国正饱受政治动荡和外国列强干涉的双重压力。中国政治动荡:自19世纪末以来,中国经历了一系列政治动荡和社会变革。辛亥革命于1911年爆发,结束了长达两千多年的封建帝制,建立了中华民国。然而,随后的几十年里,中国政局仍然不稳定,各地涌现出各种军阀割据,导致国家分裂和混乱。外国列强的干涉:19世纪末以来,外国列强对中国进行了各种形式的干涉,包括割地赔款和不平等条约。这些干涉使中国沦为列强的半殖民地,国家主权受到侵犯,经济遭受掠夺。二、事变经过九一八事变发生在中国东北,具体地点是今天的沈阳市。以下是事变的详细经过:事变发生地点:1931年9月18日,日本军队声称在沈阳南满洲铁路线上的柳条湖(今属辉南市)遭到炸弹袭击,导致多名日本士兵死亡。日本政府宣称这是中国军队所为,但后来的调查表明这次袭击可能是由日本自己策划的,以借口入侵中国东北。日本入侵:事变爆发后不久,日本军队开始在中国东北扩展其势力范围。他们占领了沈阳等城市,并很快控制了整个东北地区。这一地区是中国的重要工业基地和资源丰富之地。“伪满洲国”建立:日本占领后,他们宣布成立“伪满洲国”,实际上是一个由日本控制的傀儡政权。伪满洲国的建立旨在掩盖日本的侵略行为,并试图合法化他们在东北的统治。国际社会的反应:九一八事变引起了国际社会的广泛关注和谴责。然而,由于当时正值全球大萧条时期,西方国家的注意力主要集中在自身的经济问题上,因此他们未能采取有效的行动来制止日本的侵略行为。三、事变的影响九一八事变对中国和国际政治产生了深远的影响,以下是其中一些重要影响:日本侵略扩张:九一八事变标志着日本对中国的侵略扩张的开始。随后的几年里,日本继续占领中国的其他地区,导致了更广泛的抵抗和冲突,最终引发了第二次世界大战。中日战争:九一八事变后,中国内部的抵抗逐渐组织起来,最终爆发了抗日战争,这是中国与日本之间的长期冲突,持续了八年之久。这场战争对中国产生了深远的影响,同时也对国际政治格局产生了重大影响。国际关系:九一八事变揭示了国际社会对侵略的反应薄弱,尤其是西方国家的反应。这一事件加剧了对国际联盟的不信任,并为后来的侵略行为铺平了道路。事变也促使中国积极参与国际政治,争取国际支持。民族意识觉醒:九一八事变激发了中国人的民族意识和抵抗精神。在长期的抗战中,中国人民展现出了坚韧不拔的意志,为国家的独立和尊严而奋斗。这一时期的经历对中国的国家认同和社会变革产生了深远影响。冷战局势:九一八事变也影响了冷战时期的国际局势。中国成为冷战时期的重要角色之一,与苏联结成了亲密的同盟关系,对抗西方国家和日本。这一局势持续了几十年,直到冷战结束。文章出自: https://baijiahao.baidu.com/s?id=1777337651392496940&wfr=spider&for=pc
查看详情点赞1评论收藏1浏览1552023-09-18 10:08:45日本核废水24日排海,未来恐蔓延至中国海域,如何应对!
文: CC情报局1. 据日媒报道,日本政府最早将于24日开始排放核废水。据德国科学海洋机构计算显示,57天内,辐射将扩散至太平洋大半区域;3年后,美国和加拿大将遭到污染;10年后,将蔓延至全球海域。其中韩国、中国两地将成为受核污水影响最严重的国家。2. 2011年3月11日,东日本大地震造成福岛核泄漏。至今为止,核泄漏已经造成福岛周围生物基因变异,发育畸形;海洋中鱼群辐射物质大幅超标;日本当地儿童群体中患甲状腺结节、囊肿占比过高。部分机构预测,核污染将在长期一段时间内造成癌症和重大疾病患者增加。3. 自福岛核泄漏事故以来,受损核电站的拆除工作一直在持续进行。尽管日本政府以及东京电力公司对外声称一直在开展核污水处理,但是却多次暗自排放核污水、虚报核污水处理效果、对日本内部和国际上提出的废水处理方案置之不理。核污水中大量放射性元素难以被处理,但日本政府及东电一直试图争取正式核污水排放。4. 福岛核泄漏事故不亚于上世纪苏联发生的切尔诺贝利核泄漏事故。当时,苏联短期内开展挖通地道、围堤水域、建立防护堤等有效措施,成功保护当地水资源免受核泄漏污染。日本内部也提出了很多的核废水处理方案,可是日本政府更愿意“一排了之”,从而减少人力、物力、财力等方面的支出。5. 中国政府已经多次明确反对日本政府强推排放核污水的计划。今年7月,中国海关明确下令禁止从日本福岛等受核污染影响地区进口食品;同时加大对于日本其他地区的食品,尤其对是水产品的查验,并声明持续加强对放射性物质的检测监测力度。据日本广播协会最新报道,在22日的内阁会议上,岸田政府决定,如果准备工作中没有出现问题,将在8月24日启动福岛第一核电站核污染水排海计划。▎8月20日,岸田文雄视察福岛第一核电站。争议12年后,福岛核核废水将被排入太平洋,十年间数次“故意”泄露,谁是主要受害国与地区?福岛核废水在蓄积12年后,历经多轮争议,在受到多国反对之后,仍将被排入太平洋!8月22日,据NHK报道,日本政府决定最早将于8月24日,将第一批稀释过后的核废水排入太平洋。值得注意的是,日本此次确定排放日期的决定,是在和美、韩领导人会谈后做出的。据CNN披露,虽然日本政府早有宣布敲定排放日期的计划,但为了避免激怒韩国,一直隐忍不发。而正是这次三方会面,韩国总统尹锡悦不顾国内反对仍然默许,坚定了日本排放的决心。▎8月18日,在戴维营峰会上,拜登、岸田文雄和尹锡悦在戴维营举行完新闻发布会后离开。此后,岸田首相于8月20日、21日连续两天赴福岛第一核电站视察。并与东京电力公司、日本全国渔业联合会(全渔联)和福岛县渔业联合会(福岛渔联)的干部会面,并就福岛核污染水的安全问题进行说明。但岸田首相访问当日,媒体曝出福岛第一核电站核污染水已发生大面积外泄。而早在今年5月,福岛核电站所属的日本东京电力公司就已经在事故地点附近的港湾,捕获到辐射超标的海鱼。东电表示,捕获到的许氏平鲉体内放射性铯的含量达到每千克18000贝克勒尔,达到日本食品卫生法所规定的标准值(每千克100贝克勒尔)180倍。今年4月,在同一地点还捕获了一条青鱼,其体内的放射性元素铯含量达到每千克1200贝克勒尔,是安全标准值的12倍。媒体曾质疑,福岛的核废水怀疑已经被人为偷偷排放,或者失控流入了大海。而日本做出的这一排放决定,可能将引发一场祸及全世界的生态灾难!2011年3月,9级强震以及伴随而来的海啸使福岛第一核电站严重受损,三个反应堆融毁。为冷却反应堆,必须持续用冷水降温。至今已经几乎将整个福岛核电站变成了核废水的水墓。它们被放置在密闭的1061个铁制罐子里。东京电力公司认为储罐将于2021年秋季以后达到极限。2021年4月13日,日本政府正式决定将福岛核污水经过滤并稀释后排放入太平洋。根据东京电力公司计划,将在2023年夏天正式开启福岛核污水排放。日本有关如何处理冷却产生的含氚核废水的讨论已维持数年。但这一决定再次遭到国际社会广泛质疑和反对,在日本国内也引发强烈担忧。▎福岛核电站的数千个装满核污水的铁罐。目前日本的计划是,福岛第一核电站储存的核废水先通过先进液体处理系统进行处理,去除放射性元素氚以外的几乎所有放射性物质。而氚是一种氢同位素,由于难以过滤,所以日本方面会将废水进一步稀释,使氚的含量低于影响环境的标准。这一标准经过了美国的背书,并认为没有核安全问题。据美国国家核管理委员会的一位发言人证实,美国几乎所有核电站,都向其所在的水域排放放射性水平较低的水。东电、日本政府和国际原子能机构共同认为,氚自然存在于环境中,从雨水到海水再到自来水,甚至在人体内,因此少量释放到海洋中应该是安全的。但这份报告随即遭到了日本国内的反对。日本龙谷大学教授大岛坚一就曾表示:东京电力公司只选取了第一核电站内很少部分的污染水进行测试,并且没有第三方核实,很难相信其数据的真实性。▎据德国科学海洋机构计算显示,从核废水排放的那天起:57天内,辐射将扩散至太平洋大半区域;3年后,美国和加拿大将遭到污染;10年后,将蔓延至全球海域。据法国核安全研究所(Institut de radioprotection et de sûreté nucléaire)于2011年10月发表的报告称,大约有27“PBq”铯-137释入大海。这是有史以来,观察到的最大量人造放射性物质释入大海。福岛海岸附近涌流着全世界最强劲的海流,传输污水远布太平洋,造成放射性物质大量流散。专门跟踪日本核废水排放的专家指出,废核水中的氚等放射性物质一旦排放到海洋中,就会伴随洋流而污染世界许多地方。一个月之内,整个太平洋地区都发现了放射性物质。核废水中的放射性物质对人体的危害无疑是巨大的。此外,废水中还存在其他致命的放射性物质,日本一直在隐瞒这些物质。但在2018年,当一些核专家对这些核废水进行检测时,他们发现处理后的废水中残留了许多放射性物质,例如碳14,钴60和锶90。显然,东京电力公司在撒谎。其后东电曾在2013年造成过多起向太平洋排放核污水事故。核专家肖恩·伯尼(Shaun Burnie)在《经济学人》上发文称,日本之前多次排放的核污水,以及这次存储的超过100万公升的污水,结果将使邻国暴露于辐射之中,尤其是韩国将遭受最大的影响,其间中国台湾地区也首当其冲。他声称,如果将100万吨的放射性水排放到海洋中,将需要17年的时间和7.7亿吨的水来稀释它,这些核污水会污染海洋,而且太平洋地区的国家会暴露在辐射下。在2011年毁灭性的地震和海啸造成的福岛核泄露之后,有15个国家和地区仍在限制日本农产品和渔业产品的进口超过10年。2015年,虽然日本政府声称福岛周边水产品已达到安全标准,但周边国家民众仍有疑虑。韩国和中国都予以进口限制。2019年4月,世界贸易组织仍支持韩国在福岛核电站辐射泄漏事故后对日本水产品施加的进口禁令和检测要求。日本将受核污染的水倾倒入太平洋引发了普遍的担忧与愤怒。日本的邻国,包括中国和韩国,将是第一批遭受严重污染的国家,而西方国家也很难与世隔绝。随着世界海洋的连通,迟早会有更多的国家受到核废水的伤害。 日本当地渔民担忧这给日本的渔业带来灭顶之灾,几乎所有的国家都可能会停止进口日本海鲜。这对日本将是巨大的打击。而中韩的海鲜市场也将会立即遭受波及。2011年福岛核灾期间,国内的海鲜市场遭受到重大打击,商家担忧再次受到波及。另外还造成了碘盐的脱销与恐慌。▎日本渔民在日本东京首相办公室外抗议,反对日本政府计划将福岛核电站核污水排入海中。据中国科学院电工研究所副研究员张子立对媒体称,按正常情况运行的核电机组,其中排出的废水经过一系列处理后,可达到现行排放标准。但是福岛第一核电站是发生过核泄漏事故的反应堆,其堆芯被熔毁后产生的核废水与正常运行状态下产生的核废水有本质区别。亚洲的海洋大部分是连通的,许多海洋是半封闭的,因此福岛水中的污染物可能消散然后上升,这将严重影响当地的海洋和沿海环境以及附近人们的健康。中国沿海与台湾地区、韩国,将不可避免遭受到这些核废水的污染,严重程度,仍需进行监测。据核专家肖恩·伯尔尼(Shaun Burnie)的调查,此前人们认为,东海在2011年福岛核灾难期间并未受到严重的铯污染,但南京大学在2018年的模型显示从2011年到太平洋的铯排放量到2013年已广泛传播到东海,并在2019年达到峰值。水中将排放的许多放射性核素有可能对人类和非人类DNA造成损害。福岛核电站的水处理方法不能去除tri或碳14,也不能去除所有其他放射性同位素,例如90锶,129碘,16钴。世卫专家警告说,如果这些放射性核素在环境中长期存在,它们将逐渐进入食物链。▎东京电力公司的一名工作人员在测量福岛核电站的辐射水平。福岛核灾难未公布的几个数据:受核辐射的遗传基因已出现,35%的儿童患有甲状腺疾病,年增近十万癌症病人?2011年3月11日,一场大地震袭来,引发了毁灭性的海啸。这又引发了自切尔诺贝利以来最严重的核事故。这次地震震级为9.0级,是全球有记录以来最强的地震之一。▎2011年3月16日,福岛核电站事故现场。地震使日本本州主岛向东移动了2.40米。 据说连地球地轴都因地震而偏移了十多厘米。德国之声曾刊发了关于福岛核电站泄露的几个关键数据,这场海啸造成了18426人死亡和失踪,位于海边的福岛第一核电站被近15米高的水墙袭击。该厂的发电设备被淹,并导致冷却系统失灵。六个反应堆中的三个发生了熔毁。 在随后的几天里,1号和3号反应堆发生了几次氢气爆炸。▎2017年6月30日,在东京东京地方法院对前三名东京电力公司高管进行首次审判之前,人们集会抗议这家公司。灾难发生后,政府立即宣布福岛核电站方圆20公里范围内为疏散区。住在这个 "禁区 "的人被命令离开这个地区。方圆20公里外的许多人也决定逃离。至今仍有面积约为337平方公里地方被画为核禁区。日本处于放射性物质辐射的笼罩中,尽管日本政府认为这些放射性物质对于人们的影响微乎其微。但科学家们并不赞同他们的看法。▎2011年福岛核事故后,身穿防护衣的工作人员为儿童检查辐射迹象。国际医生防止核战争联盟(IPPNW)的辐射专家艾森贝格发表了一份关于受核辐射致残的遗传基因的报告,他认为福岛核难泄露的核辐射致使当地许多蝴蝶的基因突变,发育畸形。一旦哪里的灰蝶患病,就意味着当地的整个生态环境系统出了什么问题,因为切尔诺贝利核事故之后,那里也出现了类似情况。联合国原子辐射效应科学委员会(UNSCEAR)的一项研究报告表明,对日本4万名儿童所做的甲状腺超声波检查结果表明,其中35%的儿童的甲状腺都有结节和囊肿。"一般来说,儿童是不会有的。"身为儿科医生的艾森贝格认为这个现象令人警觉。艾森贝格和几名同行一起向日本政府申请查阅福岛核难后有关新生儿的统计数据,但他们迄今没有得到许可。▎2011年3月,进入事故现场参与日本福岛核电站维修的一名焊工在患有白血病后,将核电站的总公司东京电力告上法庭讨说法。日本有隐瞒灾难以及不利数据的传统。这个机构认为,日本目前公布的患癌人数并不是一个公平透明的数据,他估计,放射造成的癌症及其他的疾病的爆发,是一个长期的过程。预测将会增加近二十多万名癌症与重大疾病患者。这位科学家担心,核辐射污染也会导致人类畸胎和患病数量的增多。尽管至今日本政府因保密的理由,没有给他提供任何数据。福岛的核污水从那里来的?东京电力公司:每天喝两升都没事?核事故发生十年后,受损核电站的拆除工作仍在缓慢进行,至少还需要三四十年。另一项核灾难带来的重大问题是,为了冷却已经损毁的福岛第一核电站的核反应堆堆芯,东京电力公司(TEPCO)这些年来已经使用了数以万吨计的处理水,而这些流经已损毁反应堆的废水,都被储存起来。福岛第一核电站已蓄积123万吨核污水,其中放射性同位素碳-14和其他放射性物质的含量之高已经相当“危险”。然而日积月累下来,储存这些废水的空间已经告急。但东电则一直采取各种措施,私自向太平洋排放核污水。有据可查的是,在2013年7月,8月核电厂内的放射性污水被人为泄漏流入太平洋,当地渔民与核监督机构的专家早就怀疑会发生这些问题。但东电却坚决否认这问题的存在。8月20日,核电厂又发生一起事件,多达300吨的高放射线浓度污水从污水储存槽外泄。这些污水足以危害附近员工的健康。这次污水外泄事故被评为国际核事件分级表中的第三级。其后东电声称,导致福岛第一核电厂蓄水罐大量泄漏放射性污水的原因是由于蓄水罐变形。东电的推诿以及日本政府的默允,遭到了国际社会的强烈批评。经过2013年的多次外泄后,日本政府投入470亿日元的阻止污水外泄方案。东电推出一套“多核素除污设备(ALPS)”,声称能够将放射性物质含量“降至低于容许排放的水平”。然而,这家声名不佳的公司在2020年9月承认,用于处理含有核污水的1,000个储水罐,未能将放射性物质去除至低于法定标准值,至今那些污水仍有高达80%的放射性物质浓度,其中包括锶-90这种被认为可致癌的亲骨性放射核素也超标,而且出水管每星期都会新增2吨至4000吨核污水,也就是基本上这问题是无法完全解决的。据日媒称,东电至少在5年前就发现这个技术不如预期,却一直隐瞒到去年9月才公布,而他们当初采用ALPS是基于成本考虑,而并未采用针对辐射污染物最有效的方式。日本有关如何处理冷却产生的含氚核废水的讨论已维持数年。日本经济产业大臣梶山弘志提到,“为避免福岛第一核电站退役进程遭到延迟,需要就如何处理日益增多的核废水的问题做出决策”。但日媒认为,东电处理核废水并不“真诚”,“一部分被抽到了特质储水罐,剩下的就全在反应堆里泡着。”提出这一议题是东电游说政府,核电站内储存空间不足,再发生2013年的所谓泄露事件,他们无法负责。“日本经济产业省一直在进行技术评估,以排放或管理被污染的水。该部专责小组提出了五种处理废水的方法,并建议将其排放进海洋”,韩国环保专家张在四曾在韩国时报采访时称。“我们一直在向日本政府发出警告,警告可能会导致污染物排放,但这些后果都被忽略了。” 多年来,韩国政府一直在要求日本政府分享福岛的放射性水平信息,但后者拒绝这样做。自2015年以来,这里沿海地区的辐射水平迄今未显示太大变化。面对公众的质疑,福岛核电站的运营方东京电力公司则表示,相关核废水不会对人类健康造成威胁。该公司一名发言人在接受CNN采访时表示,福岛核废水测量得出的碳-14浓度在每升2到220贝克勒尔之间,“这些水即使每天喝下去2升,每年接受的放射性物质也不过是0.001到0.11毫西弗之间,这个剂量是不会对身体健康造成损害的。”这位发言人还表示,东京电力公司会对这些废水进行二次处理,使其“符合含氚废水排放的标准”,也会尽可能降低废水中的碳-14等其它放射性物质含量。氘(dāo)与氚(chuān),都属于氢的同位素。其中氘的获取十分容易,海水中平均每6420个氢中就能找到一个氘原子。这也是核聚变的燃料。但氚不易被分解,且辐射较小,所以只能排放到海里。与福岛核事故同级别的切尔诺贝利核电站事故,苏联人是如何处理的?为何日本不肯借鉴?核专家其实早在数年前,就提出日本应借鉴切尔诺贝利核电站事故,苏联人处理的模式,来处理同级别的福岛核事故的相关问题,包括核污水。1986年4月26日,切尔诺贝利核电站发生严重泄露事故。在救灾现场,苏联科院院士韦利霍夫判断,熔融的核材料会渗入到地下水,后果不堪设想,必须提早处置,他建议:在反应堆机房下设置冷氮注入系统,把地基下的水抽干,建造一个大型混凝土隔板,同时修建人工散热管道,在隔板上安装平板式交换器。苏联矿工中的一万多志愿者,用45天时间,挖通了地道。同时数万名部部队官兵对事故地区水域进行围堤,在1500平方公里土地上,建起了130个防护堤。直到今天,普里比亚河、第聂伯河水质依然达标,也保护了乌克兰,保护了整个欧洲。但日本几乎没有看过这个事故处理的模版。著名的核专家布尔尼称,日本如果使用类似的模式,至少可以将百分之八十的核污水处理好,而不使其渗露,造成不可逆的核灾难。日本并非没有专家提出过这个类似的议案。日本FoE Japan等多个环保团体曾在数年前向经济产业省提交签名联署,要求采取不同处理方式,例如保管在储存罐中或者用水泥固化,总计提交了6.4万份签名。但这个建议日本政府一开始就置之不理,因为这比一排了之,要花费更多的资金与人力,相比为这个错误的决策,内阁出来一鞠躬、再鞠躬,这根本就不是一个事。FoE Japan事务局长满田夏花抨击日本政府,“这是未经充分讨论粗暴的决定方式。将会给人类带来不可挽回的灾难。”对于日本强推核污染水排入大海计划,中方已多次明确反对。今年8月9日,中国外交部发言人表示,中方一贯反对日本强行向海洋排放福岛核污染水,向全世界转嫁核污染风险。日本政府应履行应尽的道义责任和国际法义务,停止强推排海计划,以真正负责任的态度和安全有效的方式处置福岛核污染水,并接受严格国际监督,避免给全球海洋生态和人类健康造成无法挽回的伤害。今年7月,为防范受到放射性污染的日本食品输华,中国海关下令禁止进口日本福岛等10个县(都)食品,对来自日本其他地区的食品特别是水产品(含食用水生动物)严格审核随附证明文件,严格实施100%查验,持续加强对放射性物质的检测监测力度。日本放水,邻国殃及。史上最难预测的一场生态灾难,恐已酿成!转载:https://baijiahao.baidu.com/s?id=1774903775186200080&wfr=spider&for=pc
查看详情点赞1评论收藏1浏览1292023-08-25 12:49:15起底日本核污染水排海计划 ,全球海洋环境危机已现
当地时间2023年8月24日,航拍日本福岛第一核电站。东京电力公司宣布,已于当天下午1点开始将储存在核电站内的处理过的水排入海洋。福岛核污染水于8月24日开始排入海洋。这一排污进程将持续数十年。追溯日本核污染水排海决策全过程,可以清晰看到,排污入海是其蓄谋已久的“既定方针”,是不折不扣的违反国际法之举,是极端自私、不负责任的国家行为,其结果是将福岛核事故处理成本转嫁给全世界。当地时间2011年3月14日,日本经济产业省原子能安全和保安院宣布,福岛第一核电站3号机组当地时间11时01分发生爆炸,反应堆所在建筑遭到损坏,但放置反应堆的容器没有损坏。(视频截屏组合图)福岛第一核电站自2011年3月发生严重事故以来,因用水冷却熔毁堆芯以及雨水和地下水等流过,每天产生大量高浓度核污染水。2011年4月,核电站运营方东京电力公司故意将核污染水排入大海,引发社会高度关注和担忧。同年12月,东电表示已制定一份“低浓度污染水”排海计划。2011年3月20日,日本,爆炸后的福岛第一核电站3、4号机组航拍图。2013年3月,东电处理核污染水的关键设施“多核素处理系统”(ALPS)投入试运行,但此后不断出现问题:频繁漏水,2018年被曝经过处理后的水中锶等放射性物质仍超标,2021年被发现用于吸附放射性物质的排气口滤网近半数损坏……当地时间2013年11月7日,日本福岛县,日本东电公司公布即将取出核燃料的福岛一号核电站4号反应堆内部照片。当地时间2013年11月7日,日本福岛县,日本东电公司公布有关福岛核泄漏的处理画面。自从ALPS投入运行后,日方就把经过处理的核污染水称为“处理水”。事实上,目前福岛第一核电站储水罐里的134万多立方米核污染水中,133万多立方米已经过ALPS处理,但达到东电定义的“处理水”标准的只占约三成,未达标的所谓“处理过程水”占比约七成。另有近9000立方米核污染水尚未经过ALPS处理。 而这些“处理水”的最终去向又该如何解决?早在2013年12月,日本核能主管部门经济产业省就设立工作小组就“处理水”排放问题进行技术探讨。当地时间2014年5月21日,日本东京电力公司按照“地下水迂回排放计划”开始将此前抽取的560吨地下水排入大海,全程预计耗时2个小时左右。2016年6月,该工作小组发布报告称,经过对海洋排放、地下掩埋(加入水泥等固化后埋入地下)、地层注入(用管道注入地层深处)、蒸汽释放(气化为水蒸气排入大气)、氢气释放(电解为氢气排入大气)等5种方法的评估,将“处理水”稀释后排海是“成本最低”的方法。这份报告为后来的排海方案定了调,但公布后遭到日本农林渔业等团体的强烈反对。据日本媒体披露的消息显示,福岛第一核电站反应堆附近的辐射量超过每小时100微西弗,显示出尽管事故已经过去5年,但核电站内部的辐射量依然很高。东京电力公司的员工穿防辐射服作业。当地时间2016年2月22日,日本福岛第一核电站,东京电力公司的员工穿防辐射服作业。2017年7月,经产省在福岛市举行“废炉与污染水对策当地协调会议”,摆出要与当地协商的姿态。但时任东电会长川村隆在会前对媒体声称东电已就排海“做出判断”,引发社会广泛不满。为说服公众,日本政府成立了一个有相关领域专家参加的委员会。2018年8月,该委员会在福岛和东京举行听证会,名义上是听取民众意见,但实际上是要为排海方案背书。听证会上,日本原子能规制委员会时任委员长更田丰志有关“排海是唯一可行选项”的说法遭到各方质疑。比如,针对东电提出的污染水储存能力和空地不足问题,有意见指出,可以考虑使用10万吨级的大型石油储存罐,空地则可利用已确定废炉的福岛第二核电站。针对核污染水处理的技术难度问题,有意见提到,可以采用1979年美国三里岛核事故曾经用过的水蒸气排放方式。还有意见指出,ALPS无法去除的放射性元素氚的分离技术正在研究中,应在该技术成熟并应用后再排放。当地时间2021年4月12日,日本,航拍福岛第一核电站核污水仓。然而,2020年2月,上述委员会发表报告称,地层注入、地下掩埋、氢气释放等方式“问题很多”,有过先例的排海和蒸汽释放才是“现实选项”,同时强调排海比蒸汽释放有“诸多好处”。2021年4月,日本政府无视国内外反对意见,单方面宣布将在2023年实施核污染水排海。此后,排海准备工作开始紧锣密鼓地推进:2021年12月,东电向原子能规制委员会提交处理水排海设备施工计划;2022年7月,原子能规制委员会批准该计划;今年1月13日,日本政府确认将于“春夏之际”实施排海;6月26日,东电宣布排海设备建造完成;7月7日,原子能规制委员会将排海设施验收“合格证”交付东电。当地时间2022年3月3日,日本福岛,身穿防护服的工人正在安装从受污染的水中清除放射性物质的设备。当地时间8月24日下午,日本启动福岛第一核电站核污水排海,核污水经由1公里的海底隧道流向太平洋。当地时间2023年8月24日,日本福岛第一核电站开始将核污染水排入海洋。图文来源:新华社、央视新闻客户端、视觉中国、澎湃影像来源: https://www.thepaper.cn/newsDetail_forward_24348753
查看详情点赞1评论收藏浏览1292023-08-25 11:26:37PHP 处理无限极分类数据通用方法
在工作中,我们经常会遇到处理多级分类的问题,我们常见的是三级,定义一个字段pid,查询的时候一级一级查询数据数据,这样也是可以解决问题。只是不够灵活,所以就有了无限极,不管有多少级菜单都能很好的快速处理。下面是PHP中无限极分类的处理方法:/** * 处理无限极分类通用方法 */ public function tree($list=[], $pk='id', $pid = 'pid', $child = '_child', $root = 0): array { // 创建Tree $tree = array(); if(is_array($list)) { // 创建基于主键的数组引用 $refer = array(); foreach ($list as $key => $data) { $refer[$data[$pk]] =& $list[$key]; } foreach ($list as $key => $data) { // 判断是否存在parent $parentId = $data[$pid]; if ($root == $parentId) { $tree[] =& $list[$key]; }else{ if (isset($refer[$parentId])) { $parent =& $refer[$parentId]; $parent[$child][] =& $list[$key]; } } } } return $tree; }$list:是直接读取数据库数据。给这个方法处理
查看详情点赞1评论收藏浏览1222023-08-11 10:01:52