JS屏蔽鼠标右键审查元素,禁用键盘F12功能,或者其他键盘功能(详情如下)
屏蔽鼠标右键点击审查元素HTML方法:body标签上面加属性<body ondragstart="window.event.returnValue=false" oncontextmenu="window.event.returnValue=false" onselectstart="event.returnValue=false"> </body>JS方法:document.onkeydown = function(){ if(window.event && window.event.keyCode == 123) { event.keyCode=0; event.returnValue=false; } if(window.event && window.event.keyCode == 13) { window.event.keyCode = 505; } if(window.event && window.event.keyCode == 8) { window.event.returnValue=false; } }禁用键盘F12事件,及其其他键盘事件(F1-F12,Ctrl+s,Ctrl+P)等:document.onkeydown = function () { if (window.event && window.event.keyCode == 123) { event.keyCode = 0; event.returnValue = false; } if (window.event && window.event.keyCode == 13) { window.event.keyCode = 505; } // 禁止通过F12打开控制台 let e = event || window.event || arguments.callee.caller.arguments[0]; //禁用F1-F12 if (event.keyCode === 112) { event.preventDefault() event.returnValue = false } if (event.keyCode === 113) { event.preventDefault() event.returnValue = false } if (event.keyCode === 114) { event.preventDefault() event.returnValue = false } if (event.keyCode === 115) { event.preventDefault() event.returnValue = false } if (event.keyCode === 116) { // event.preventDefault() // event.returnValue = false } if (event.keyCode === 117) { event.preventDefault() event.returnValue = false } if (event.keyCode === 118) { event.preventDefault() event.returnValue = false } if (event.keyCode === 119) { event.preventDefault() event.returnValue = false } if (event.keyCode === 120) { event.preventDefault() event.returnValue = false } if (event.keyCode === 121) { event.preventDefault() event.returnValue = false } if (event.keyCode === 122) { // event.preventDefault() // event.returnValue = false } if (event.keyCode === 123) { event.preventDefault() event.returnValue = false } }
查看详情点赞1评论收藏浏览1302024-02-29 14:27:41JS 实现网页复内容复制,携带作者信息
有时候我们站长想用户复制我们的页面内容,携带作者信息。下面是我们的JS实现代码:// 内容复制功能取消 $(function () { var Sys = {}; var ua = navigator.userAgent.toLowerCase(); if (window.ActiveXObject) { document.body.oncopy = function () { event.returnValue = false; var t = document.selection.createRange().text; var s = "-----------------------尊重作者,转载请标明出处:(alingfeng.cn),原文链接:" + location.href; clipboardData.setData("Text", t + "" + s); }; } else { function addLink() { var body_element = document.getElementsByTagName("body")[0]; var selection; selection = window.getSelection(); var pagelink = "-----------------------尊重作者,转载请标明出处:(alingfeng.cn),原文链接:" + location.href; var copytext = selection + pagelink; var newdiv = document.createElement("div"); newdiv.style.position = "absolute"; newdiv.style.left = "-99999px"; body_element.appendChild(newdiv); newdiv.innerHTML = copytext; selection.selectAllChildren(newdiv); window.setTimeout(function () { body_element.removeChild(newdiv); }, 0); } document.oncopy = addLink; } });这样我们复制内容的时候就会携带设置的内容了。
查看详情点赞评论收藏浏览1172024-02-29 13:51:41Gin框架系列教程(7)- Gin集成JWT权限认证
不管是我们什么后台,系统,都会接触了用户登录Token认证,今天我们需要gin集成jwt功能。如今有很多将身份验证内置到API中的方法 -JSON Web令牌只是其中之一。JSON Web令牌(JWT)作为令牌系统而不是在每次请求时都发送用户名和密码,因此比其他方法(如基本身份验证)具有固有的优势。要了解更多信息,请直接进入jwt.io上的介绍,然后再直接学习。通过JSON形式作为Web应用中的令牌,用于在各方之间安全地将信息作为JSON对象传输,可以避免被别人篡改,以及在用户认证授权方面相对于传统Session减小了开销。接下来我们使用jwt:直接上代码package utils import ( "errors" "fmt" "time" "github.com/dgrijalva/jwt-go/v4" ) var JwtSecret string = "xxxxxxxxxxxxxx" type Users struct { Account string `json:"account"` Password string `json:"password"` } type CustomClaims struct { Users jwt.StandardClaims } var MySecret = []byte(JwtSecret) // 创建 Token func GenToken(user Users) (string, error) { claim := CustomClaims{ user, jwt.StandardClaims{ ExpiresAt: jwt.At(time.Now().Add(time.Minute * 120)), //2小时后过期 Issuer: "xxxxxxxx", //签发人 }, } token := jwt.NewWithClaims(jwt.SigningMethodHS256, claim) return token.SignedString(MySecret) } // 解析 token func ParseToken(tokenStr string) (*CustomClaims, error) { token, err := jwt.ParseWithClaims(tokenStr, &CustomClaims{}, func(token *jwt.Token) (interface{}, error) { return MySecret, nil }) if err != nil { fmt.Println(" token parse err:", err) return nil, err } if claims, ok := token.Claims.(*CustomClaims); ok && token.Valid { return claims, nil } return nil, errors.New("invalid token") } // 刷新 Token func RefreshToken(tokenStr string) (string, error) { jwt.TimeFunc = func() time.Time { return time.Unix(0, 0) } token, err := jwt.ParseWithClaims(tokenStr, &CustomClaims{}, func(token *jwt.Token) (interface{}, error) { return MySecret, nil }) if err != nil { return "", err } if claims, ok := token.Claims.(*CustomClaims); ok && token.Valid { jwt.TimeFunc = time.Now claims.StandardClaims.ExpiresAt = jwt.At(time.Now().Add(time.Minute * 120)) return GenToken(claims.Users) } return "", errors.New("Cloudn't handle this token") } 上面这段是我们用户登录成功创建token。然后我们需要用一个jwt中间件来验证用户权限:func Jwt() gin.HandlerFunc { return func(c *gin.Context) { // var users utils.Users // users.Account = "admin" // users.Password = "12346" // str, err1 := utils.GenToken(users) // fmt.Println("str", str) // fmt.Println("err1", err1) tokenString := c.GetHeader("Authorization") fmt.Println("getHeaderToken", tokenString) if tokenString == "" { c.JSON(http.StatusUnauthorized, gin.H{"code": http.StatusUnauthorized, "msg": "权限不足"}) c.Abort() return } claims, err := utils.ParseToken(tokenString) if err != nil { c.JSON(http.StatusUnauthorized, gin.H{"code": http.StatusUnauthorized, "err": err, "msg": "权限不足"}) c.Abort() return } fmt.Println(claims) c.Next() } }好了,我们来测试一下,结果是没问题的。
查看详情点赞1评论收藏1浏览3562024-02-24 11:12:44Gin框架系列教程(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浏览3672024-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评论收藏浏览922024-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浏览3282024-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评论收藏浏览1832023-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浏览14682023-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评论收藏浏览2412023-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浏览1622023-09-18 10:08:45