springboot博客系统带后台管理权限系统源码

  前言:本文将向您展示了如何结合Spring Boot和Kotlin的强大功能,高效地构建一个博客系统。如果您从Kotlin开始,您可以通过阅读参考文档、遵循Kotlin Koans在线教程或者仅仅使用Spring Framework参考文档(现在提供了Kotlin的代码示例)来学习这门语言。

  源码:s.ymzan.top

  Spring Framework和Spring Boot参考文档中记录了Spring Kotlin支持。如果您需要帮助,可以在StackOverflow上搜索spring和kotlin标签,或者在kotlin Slack的#spring频道进行讨论。

  一、创建新项目

  首先,我们需要创建Spring Boot应用程序,这可以通过多种方式实现。

  使用Initializr网站

  选择Kotlin语言。Gradle是Kotlin中最常用的构建工具,它提供了一个Kotlin DSL,在生成Kotlin项目时默认使用,所以这是推荐的选择。但是,如果您对Maven比较熟悉,也可以使用它。注意,您可以使用Gradle -project默认选择Kotlin和Gradle。

  1、选择“Gradle Project”或者让默认的“Maven Project”,这取决于你想要使用的构建工具;

  2、输入以下工件坐标:blog;

  3、添加以下依赖项:Spring Web、Mustache、Spring Data JPA、H2 Database和Spring Boot DevTools;

  4、单击“生成项目”。

  zip文件在根目录中包含一个标准项目,因此您可能希望在解包之前创建一个空目录。

  二、使用命令行

  你可以在命令行中使用Initializr HTTP API,例如,在UN*X之类的系统上使用curl:如果你想使用Gradle,添加-d type= Gradle -project。

  $ mkdir blog && cd blog

  $ curl start.spring.io/starter.zip -d language=kotlin -d dependencies=web,mustache,jpa,h2,devtools -d packageName=com.example.blog -d name=Blog -o blog.zip

  三、使用IntelliJ IDEA

  Spring Initializr也集成在IntelliJ IDEA Ultimate版中,允许你创建和导入一个新项目,而不需要离开IDE使用命令行或web UI。

  要访问向导,转到文件|新建|项目,并选择Spring Initializr。

  按照向导的步骤使用以下参数:工件:“博客”,类型:Maven项目或Gradle项目,语言:芬兰湾的科特林,名称:“博客”和依赖项:“Spring Web Starter”,“Mustache”,“Spring Data JPA”,“H2 Database”和“Spring Boot DevTools”。

  四、理解Gradle构建

  如果您正在使用Maven Build,您可以跳到专门的部分。

  import org.jetbrains.kotlin.gradle.tasks.KotlinCompile

  plugins {

  kotlin("plugin.jpa") version "1.4.32"

  id("org.springframework.boot") version "2.4.4"

  id("io.spring.dependency-management") version "1.0.11.RELEASE"

  kotlin("jvm") version "1.4.32"

  kotlin("plugin.spring") version "1.4.32"

  }

  插件

  除了明显的Kotlin Gradle插件,默认配置声明了Kotlin - Spring插件,它会自动打开带有Spring注释的类和方法(与Java不同,Kotlin的默认限定符是final)或元注释的。这对于创建@Configuration或@Transactional bean非常有用,而不需要添加开放限定符(例如CGLIB代理所需)。

  为了能够在JPA中使用Kotlin的非空属性,Kotlin JPA插件也被启用了。它为任何带有@Entity, @MappedSuperclass或@ embed注解的类生成无参数构造函数。

  五、编译器选项

  Kotlin的关键特性之一是空值安全——它在编译时干净地处理空值,而不是在运行时遇到著名的NullPointerException。通过声明可空性和表达“值或无值”语义,这使得应用程序更安全,而无需支付像Optional这样的包装器的成本。注意,Kotlin允许使用带有空值的函数结构;查看Kotlin零安全的全面指南。

  tasks.withType<KotlinCompile> {

  kotlinOptions {

  freeCompilerArgs = listOf("-Xjsr305=strict")

  jvmTarget = "1.8"

  }

  }

  尽管Java不允许在它的类型系统中表达空安全,Spring框架通过在org.springframework.lang包中声明的工具友好的注释,为整个Spring框架API提供了空安全。默认情况下,Kotlin中使用的Java api的类型被识别为放松空检查的平台类型。Kotlin对JSR 305注解+ Spring空值性注解的支持,为Kotlin开发者提供了整个Spring框架API的空值安全性,并在编译时处理与空值相关的问题。

  可以通过添加带有strict选项的-Xjsr305编译器标志来启用该特性。

  还请注意,Kotlin编译器被配置为生成Java 8字节码(默认情况下是Java 6)。

  六、依赖关系

  三类Spring Boot web应用程序需要Kotlin特定库,并默认配置:Kotlin -stdlib-jdk8是Kotlin标准库的Java 8变体、Kotlin -reflect是Kotlin反射库和jackson-module-kotlin增加了对Kotlin类和数据类的序列化/反序列化的支持(可以自动使用单个构造函数类,也支持那些具有二级构造函数或静态工厂的类)。

  dependencies {

  implementation("org.springframework.boot:spring-boot-starter-data-jpa")

  implementation("org.springframework.boot:spring-boot-starter-mustache")

  implementation("org.springframework.boot:spring-boot-starter-web")

  implementation("com.fasterxml.jackson.module:jackson-module-kotlin")

  implementation("org.jetbrains.kotlin:kotlin-reflect")

  implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8")

  runtimeOnly("com.h2database:h2")

  runtimeOnly("org.springframework.boot:spring-boot-devtools")

  testImplementation("org.springframework.boot:spring-boot-starter-test")

  }

  Spring Boot Gradle插件会自动使用通过Kotlin Gradle插件声明的Kotlin版本。

  现在可以更深入地了解生成的应用程序。

  七、理解Maven构建

  除了明显的Kotlin Maven插件外,默认配置声明了Kotlin - Spring插件,该插件自动打开带有Spring注释的类和方法(与Java不同,Kotlin的默认限定符是final)或元注释。这对于创建@Configuration或@Transactional bean非常有用,而不需要添加开放限定符(例如CGLIB代理所需)。

  为了能够在JPA中使用Kotlin的非空属性,Kotlin JPA插件也被启用了。它为任何带有@Entity, @MappedSuperclass或@ embed注解的类生成无参数构造函数。

  <build>

  <sourceDirectory>${project.basedir}/src/main/kotlin</sourceDirectory>

  <testSourceDirectory>${project.basedir}/src/test/kotlin</testSourceDirectory>

  <plugins>

  <plugin>

  <groupId>org.springframework.boot</groupId>

  <artifactId>spring-boot-maven-plugin</artifactId>

  </plugin>

  <plugin>

  <groupId>org.jetbrains.kotlin</groupId>

  <artifactId>kotlin-maven-plugin</artifactId>

  <configuration>

  <compilerPlugins>

  <plugin>jpa</plugin>

  <plugin>spring</plugin>

  </compilerPlugins>

  <args>

  <arg>-Xjsr305=strict</arg>

  </args>

  </configuration>

  <dependencies>

  <dependency>

  <groupId>org.jetbrains.kotlin</groupId>

  <artifactId>kotlin-maven-noarg</artifactId>

  <version>${kotlin.version}</version>

  </dependency>

  <dependency>

  <groupId>org.jetbrains.kotlin</groupId>

  <artifactId>kotlin-maven-allopen</artifactId>

  <version>${kotlin.version}</version>

  </dependency>

  </dependencies>

  </plugin>

  </plugins>

  </build>

  Kotlin的关键特性之一是空值安全——它在编译时干净地处理空值,而不是在运行时遇到著名的NullPointerException。通过声明可空性和表达“值或无值”语义,这使得应用程序更安全,而无需支付像Optional这样的包装器的成本。注意,Kotlin允许使用带有空值的函数结构;查看Kotlin零安全的全面指南。

  尽管Java不允许在它的类型系统中表达空安全,Spring框架通过在org.springframework.lang包中声明的工具友好的注释,为整个Spring框架API提供了空安全。默认情况下,Kotlin中使用的Java api的类型被识别为放松空检查的平台类型。Kotlin对JSR 305注解+ Spring空值性注解的支持,为Kotlin开发者提供了整个Spring框架API的空值安全性,并在编译时处理与空值相关的问题。

  可以通过添加带有strict选项的-Xjsr305编译器标志来启用该特性。

  还请注意,Kotlin编译器被配置为生成Java 8字节码(默认情况下是Java 6)。

  八、依赖关系

  3 .此类Spring Boot web应用程序需要Kotlin特定库,并默认配置:Kotlin -stdlib-jdk8是Kotlin标准库的Java 8变体、Kotlin -reflect是Kotlin反射库(从Spring Framework 5开始是强制性的)和jackson-module-kotlin增加了对Kotlin类和数据类的序列化/反序列化的支持(可以自动使用单个构造函数类,也支持那些具有二级构造函数或静态工厂的类)

  <dependencies>

  <dependency>

  <groupId>org.springframework.boot</groupId>

  <artifactId>spring-boot-starter-data-jpa</artifactId>

  </dependency>

  <dependency>

  <groupId>org.springframework.boot</groupId>

  <artifactId>spring-boot-starter-mustache</artifactId>

  </dependency>

  <dependency>

  <groupId>org.springframework.boot</groupId>

  <artifactId>spring-boot-starter-web</artifactId>

  </dependency>

  <dependency>

  <groupId>com.fasterxml.jackson.module</groupId>

  <artifactId>jackson-module-kotlin</artifactId>

  </dependency>

  <dependency>

  <groupId>org.jetbrains.kotlin</groupId>

  <artifactId>kotlin-reflect</artifactId>

  </dependency>

  <dependency>

  <groupId>org.jetbrains.kotlin</groupId>

  <artifactId>kotlin-stdlib-jdk8</artifactId>

  </dependency>

  <dependency>

  <groupId>org.springframework.boot</groupId>

  <artifactId>spring-boot-devtools</artifactId>

  <scope>runtime</scope>

  </dependency>

  <dependency>

  <groupId>com.h2database</groupId>

  <artifactId>h2</artifactId>

  <scope>runtime</scope>

  </dependency>

  <dependency>

  <groupId>org.springframework.boot</groupId>

  <artifactId>spring-boot-starter-test</artifactId>

  <scope>test</scope>

  </dependency>

  </dependencies>

  九、理解生成的应用程序

  与Java相比,您可以注意到缺少分号,空类上缺少括号(如果需要通过@Bean注释声明bean,可以添加一些括号),以及使用runApplication顶级函数。runApplication (*args)是SpringApplication.run(BlogApplication::class.java, *args)的Kotlin习惯替代品,可以用以下语法来定制应用程序。

  package com.example.blog

  import org.springframework.boot.autoconfigure.SpringBootApplication

  import org.springframework.boot.runApplication

  @SpringBootApplication

  class BlogApplication

  fun main(args: Array<String>) {

  runApplication<BlogApplication>(*args)

  }

  十、编写您的第一个Kotlin控制器

  让我们创建一个简单的控制器来显示一个简单的web页面。

  package com.example.blog

  import org.springframework.stereotype.Controller

  import org.springframework.ui.Model

  import org.springframework.ui.set

  import org.springframework.web.bind.annotation.GetMapping

  @Controller

  class HtmlController {

  @GetMapping("/")

  fun blog(model: Model): String {

  model["title"] = "Blog"

  return "blog"

  }

  }

  注意,我们在这里使用的是一个Kotlin扩展,它允许向现有的Spring类型添加Kotlin函数或操作符。这里我们导入了org.springframework.ui.set扩展函数,以便能够编写model["title"] = "Blog"而不是model。addAttribute(“标题”、“博客”)。Spring Framework KDoc API列出了所有为丰富Java API而提供的Kotlin扩展。

  我们还需要创建相关的Mustache模板。

  通过运行BlogApplication的主函数来启动web应用。kt,登陆http://localhost:8080/,你会看到一个严肃的网页,标题是"博客"

  结论

  我们现在已经完成了这个springboot博客系统的构建

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,163评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,301评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,089评论 0 352
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,093评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,110评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,079评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,005评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,840评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,278评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,497评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,667评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,394评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,980评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,628评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,796评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,649评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,548评论 2 352

推荐阅读更多精彩内容