学习框架总结

我们小组即将进入代码编写阶段,以下内容是小组成员对系统实现所涉及的架构进行学习后的内容总结。

************************************************************************分割线************************************************************************************************

 

小组成员:严鑫

学习内容:

************************************************************************分割线************************************************************************************************

SpringBoot学习记录 

  SpringBoot是一种全新框架,其设计目的是用来简化Spring应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。通过这种方式,SpringBoot致力于在蓬勃发展的快速应用开发领域成为领导者。

  SpringBoot能够快速创建基于spring的程序,能够直接使用Java main方法启动内嵌的Tomcat服务器运行springboot程序,不需要部署war包,并且提供约定的starter POM来简化Maven配置,让Maven的配置变得简单,同时自动化配置,根据项目的Maven依赖配置,springboot自动配置spring、springmvc等,而且提供了程序的健康检查功能,基本可以完全不使用xml配合文件,采用注解配置。

 

springboot可以做的一些事情:

Microservices(微服务架构):将多个功能拆分成多个服务。

Reactive:响应式。

Cloud:云开发,分布式架构。

Web apps:Web开发,ssm设计。

Serverless:无服务开发(函数式服务)

Event Driven:事件驱动。

Batch:批处理。

 

搭建springboot:

在 Spring Tools 4 for Eclipse 中依次选择 File->New->Maven Project,然后在出现的界面中按图

              所示增加相关信息。

完了上述操作之后,在 pom.xml 中添加 Spring Boot 的依赖,代码如下所示。:

<parent>

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

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

    <version>2.0.6.RELEASE</version>

</parent>

 
<dependencies>

    <dependency>

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

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

    </dependency>

</dependencies>

然后编写启动类,代码如下所示:

@SpringBootApplication

public class App {

 

    public static void main(String[] args) {

        SpringApplication.run(App.class, args);

    }

}

启动类使用了 @SpringBootApplication 注解,这个注解表示该类是一个 Spring Boot 应用。直接运行 App 类即可启动,启动成功后在控制台输出信息,默认端口是 8080.

 

 

   可以看到,我们只在 pom.xml 中引入了一个 Web 的 Starter,然后创建一个普通的 Java 类,一个 Main 方法就可以启动一个 Web 项目。
  与之前的使用方式相比,这种方式简单很多。以前需要配置各种 Spring 相关的包,还需要配置 web.xml 文件,还需要将项目放入 Tomcat 中去执行,搭建项目的过程还特别容易出错,会出现各种 jar 包冲突。有了 Spring Boot 后这些问题都解决了。
  我们之所以能够通过一个 Main 方法启动一个 Web 服务,是因为 Sprig Boot 中内嵌了 Tomcat,然后通过内嵌的 Tomcat 来提供服务。当然,我们也可以使用别的容器来替换 Tomcat,比如 Undertow 或 Jetty。
  Spring Tools 4 for Eclipse 还为我们提供了更加便捷的项目创建方式,在 File->New 选项中有 Spring Starter Project,可以直接选择 Spring Boot 的版本以及需要依赖的第三方包,直接生成 Spring Boot 项目,不用再去手动配置 Maven 依赖。

 

我将创建一个控制器,编写第一个 REST 接口,访问地址使用 /hello,代码如下所示。

 

@RestController
public class HelloController {

    @GetMapping("/hello")
    public String hello() {
        return "hello";
    }
}

@RestController 是 @Controller 和 @ResponseBody 的组合注解,可以直接返回 Json 格式数据。

@GetMapping 其实就是 @RequestMapping(method=RequestMethod.GET),通过访问 http://localhost:8080/hello 可以看到输出的结果“hello”,如图所示。

 

在以前的项目中我们主要在 XML 文件中进行框架配置,业务的相关配置会放在属性文件中,然后通过一个属性读取的工具类来读取配置信息。

在 Spring Boot 中我们不再需要使用这种方式去读取数据了。Spring Boot 中的配置通常放在 application.properties 中,读取配置信息非常方便,总共分为 3 种方式。

1)Environment

可以通过 Environment 的 getProperty 方法来获取想要的配置信息,代码如下所示。

@RestController
public class HelloController {

    // 注入对象
    @Autowired
    private Environment env;

    @GetMapping("/hello")
    public String hello() {
        // 读取配置
        String port = env.getProperty("server.port");
        return port;
    }
}

 

2)@Value

可以注入具体的配置信息,代码如下所示。
@RestController
public class HelloController {

    // 注入配置
    @Value("${server.port}")
    private String port;

    @GetMapping("/hello")
    public String hello() {
        return port;
    }
}

 

3)自定义配置类

prefix 定义配置的前缀,代码如下所示。
@ConfigurationProperties(prefix = "net.biancheng")
@Component
public class MyConfig {

    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

}

 

读取配置的方法代码如下所示。

@RestController
public class HelloController {

    @Autowired
    private MyConfig myConfig;

    @GetMapping("/hello")
    public String hello() {
        return myConfig.getName();
    }
}

 

定义配置 application.properties 的方法如下:net.biancheng.name=zhangsan

小组成员:于佳雯

学习内容:

2.1 Django环境搭建

使用如下命令安装:

pip install django==2.1.0 -i https://mirrors.aliyun.com/pypi/simple

【注意】为了很好的使各依赖之间兼容,所以django2.1.0版本对应python版本为3.5~3.7的版本。如要安装高版本的则可以参考官网安装。

2.2 Django项目创建

进入windows终端,cd到准备创建到哪的目录下,执行:

django-admin startproject xxxDjango

xxx则是你的项目名称。

2.3 Django各模块创建

pycharm打开我们的项目,等待环境导入,在终端输入:

python manage.py start xxxapp

xxx则是你项目中各模块的名称,例如:登录模块等等。 

2.4 Django常用命令

django-admin startproject 创建django项目

django-admin startapp 创建django的app模块

python manage.py makemigrations 基于settings中配置的DATABASE数据default方案生成迁移脚本

python manage.py migrate 开始迁移

python manage.py createsuperuser 创建admin站点的超级用户

python manage.py runserver 启动django服务,默认端口是8000, host127.0.0.1

2.5 Django项目结构

helloDjango

  |--- helloDjango   主工程目录

       |----  settings.py   # 设置文件, 数据库连接、app注册、中间件及模板配置

       |----  urls.py       # 总路由

       |----  wsgi.py       # Django实现wsgi的脚本

            |----  __init__.py

  |--- mainapp      应用模块(主)

      |----  __init__.py

      |---- admin.py      # 后台管理配置脚本

      |---- models.py     # 数据模型类声明所在脚本

      |---- views.py      # 声明当前应用的视图处理函数或类

      |---- urls.py       # 自已增加的当前应用模块的子路由

      |---- tests.py      # 当前应用模块的单元测试类

      |---- apps.py       # 声明当前应用的基本信息

  |--- manage.py     WEB应用的启动脚本, 项目工程的入口

2.6 Django请求流程

所有后端项目的请求流程都是雷同的,只是用到的组件不一样。

1.urls分发器 (urls.py -> 子路由)

2. urls分发器根据路由规则(正则)分发到views

3. views去调用Model,交互数据。

4. views将数据渲染到模板中。

5.模板呈现给用户。

2.7 URL路由配置

url分为主路由和子路由,路由放在我们的主项目下,子路由放在我们各个模块。主路由include子路即可连接子路由里对应的views函数。

主路由:

urlpatterns = [

  path('url',  视图函数, name=None),

  path('user/', include('userapp.urls',  namespace=None))  # 包含子路由

]

子路由:

urlpatterns = [

  path('login/',  views.login),

]

 这种配置是Django2.1.0的配置方法,主要是通过path函数进行配置。还有最新的配置路由方法re_path,那就是通过正则表达式配置,因为当我们发送网络请求之后,http协议会DNS解析我们的IP地址,从而找到对应的路由

re_path(r'^search/(?P<phone>1[3-57-9][\d]{9})$', views.search)

2.8 数据库连接

Django是一个MTV模型,其中的M即为model,也可以理解成我们的表,产生的数据交互都在model里面。django默认的数据库时sqlite3,大家会发现使用迁移命令的时候会自动生成sqlite3.db,即为我们的本地数据库。当我们在使用ORM模型之前,需要先生成迁移文件,再执行迁移文件。目的是将我们的model转化成表放入数据库中。

生成迁移文件和执行迁移文件:

python manage.py  makemigrations

python manage.py migrate

2.9 ORM应用

ORMObject Relational Mapping)用于实现面向对象编程语言里不同类型系统的数据之间的转换 。从效果上说,它其实是创建了一个可在编程语言里使用的--“虚拟对象数据库

ORM有以下字段类型:

CharField:字符类型,必须指定max_length属性

IntegerField:数值类型,可以指定chiose为元组,表示选择范围

BooleanField:布尔类型, 数据表中表现是01

NullBooleanField:可以为空的布尔值

AutoField:自增列 int类型。必须填入参数 primary_key=True;可选auto_create自增

FloatField:浮点类型

DecimalField:同PythonDecimal类型,参数有max_digits:最大总位数。decimal_places:小数点后的位数

TextField:文本类型

UUIDField:字符串类型,Django Admin以及ModelForm中提供对UUID格式的验证

对以上字段类型简单举例:

class Order(models.Model):

    no = models.UUIDField(verbose_name='订单编号')

    price = models.DecimalField(verbose_name='订单金额',max_digits=6, decimal_places=2)

    pay_state = models.BooleanField(default=False)

FileField:字符串,路径保存在数据库,文件上传到指定目录,参数内容如下:upload_to:上传文件的保存路径,storage=None:存储组件,默认django.core.files.storage.FileSystemStorage

ImageField:字符串,路径保存在数据库,文件上传到指定目录,参数内容如下:upload_to:上传文件的保存路径,storage = None:存储组件,默认django.core.files.storage.FileSystemStoragewidth_field=None:上传图片的高度保存的数据库字段名(字符串),height_field=None:上传图片的宽度保存的数据库字段名(字符串)。

DateField:日期类型格式:YYYY-MM-DD 参数有:auto_now:每次保存时,自动设置当前字段为当前时间,用于最后一次修改时间auto_now_add:对象每一次保存时,自动设置为当前时间用于创建时间。

DateTimeField:日期时间类型。datetime.datetime:日期+时间格式 YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ]

TimeField:时间类型,格式:HH:MM[:ss[.uuuuuu]]

2.10 模板文件templates

模板引擎是一种可以让开发者把服务端数据填充到html网页中完成渲染效果的技术。它实现了把前端代码和服务端代码分离的作用,让项目中的业务逻辑代码和数据表现代码分离,让前端开发者和服务端开发者可以更好的完成协同开发。

静态网页:页面上的数据都是写死的,万年不变。

动态网页:页面上的数据是从后端动态获取的(比如后端获取当前时间;后端获取数据库数据然后传递给前端页面)。

Django框架中内置了web开发领域非常出名的一个DjangoTemplate模板引擎(DTL)。要在django框架中使用模板引擎把视图中的数据更好的展示给客户端,需要完成3个步骤:

  1. 在项目配置文件中指定保存模板文件的模板目录。一般模板目录都是设置在项目根目录或者主应用目录下。
  2. 在视图中基于django提供的渲染函数绑定模板文件和需要展示的数据变量。
  3. 在模板目录下创建对应的模板文件,并根据模板引擎内置的模板语法,填写输出视图传递过来的数据。

************************************************************************分割线************************************************************************************************

小组成员:付文清

学习内容:

Spring Boot 提供了大量开箱即用(out-of-the-box)的依赖模块,例如 spring-boot-starter-redisspring-boot-starter-data-mongodb spring-boot-starter-data-elasticsearch 等。这些依赖模块为 Spring Boot 应用提供了大量的自动配置,使得 Spring Boot 应用只需要非常少量的配置甚至零配置,便可以运行起来,让开发人员从 Spring 的“配置地狱”中解放出来,有更多的精力专注于业务逻辑的开发。

 

开发环境配置完成后,我们就可以通过 Intellij IDEA 创建一个 Spring Boot 项目。

 

Intellij IDEA 一般可以通过两种方式创建 Spring Boot 项目:

使用 Maven 创建

使用 Spring Initializr 创建

使用 Maven 创建

1. 使用 IntelliJ IDEA 创建一个名称为 helloworld Maven 项目,创建过程请参考 IDEA 新建 Maven 项目。

2. 在该 Maven 项目的 pom.xml 中添加以下配置,导入 Spring Boot 相关的依赖。

<project>

    ...

  <parent>

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

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

        <version>2.4.5</version>

        <relativePath/> <!-- lookup parent from repository -->

    </parent>

  

    <dependencies>

        <dependency>

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

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

        </dependency>

        <dependency>

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

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

            <scope>test</scope>

        </dependency>

    </dependencies>

...

</project>

 

在暑假集训时,我曾经参与制作过一个springboot为框架的项目。部分代码截图如下:

 

 

 

 

 

在项目开发中,日志十分的重要,不管是记录运行情况还是定位线上问题,都离不开对日志的分析。在 Java 领域里存在着多种日志框架,如 JCLSLF4JJboss-loggingjULlog4jlog4j2logback 等等。

日志框架的选择

市面上常见的日志框架有很多,它们可以被分为两类:日志门面(日志抽象层)和日志实现,如下表。
 

日志分类

描述

举例

日志门面(日志抽象层)

Java 日志访问提供一套标准和规范的 API 框架,其主要意义在于提供接口。

JCLJakarta Commons Logging)、SLF4jSimple Logging Facade for Java)、jboss-logging

日志实现

日志门面的具体的实现

Log4jJULjava.util.logging)、Log4j2Logback


通常情况下,日志由一个日志门面与一个日志实现组合搭建而成,Spring Boot 选用 SLF4J + Logback 的组合来搭建日志系统。

git

 

 

 

git是开源的分布式版本控制系统。它可以帮助我们进行版本控制。几乎每一种版本控制系统都以某种形式支持分支,一个分支代表一条独立的开发线。使用分支意味着你可以从开发主线上分离开来,然后在不影响主线的同时继续工作。大家只需要将在自己本机上写的代码推到git仓库里,别人就可以拉取下来,进行进一步修改,然后再推上去。以这种方式,就可协同工作了。

以上是一些简短的springboot框架以及git的学习记录。随着我们项目的推进,我也会继续深入了解springboot框架的。

************************************************************************分割线************************************************************************************************

小组成员:叶文婷

学习内容:Vue是一款前端渐进式框架,可以提高前端开发效率。Vue能够实现视图与模型的双向绑定(数据变化的时候, 页面会自动刷新, 页面变化的时候,数据也会自动变化)。

v-text和v-html专门用来展示数据, 其作用和插值表达式类似。v-text和v-html可以避免插值闪烁问题。

​ 当网速比较慢时, 使用{{}}来展示数据, 有可能会产生插值闪烁问题。

​ 插值闪烁: 在数据未加载完成时,页面会显示出原始的{{}}, 过一会才会展示正常数据。

v-if与v-show可以根据条件的结果,来决定是否显示指定内容.

​ v-if: 条件不满足时, 元素不会存在.

​ v-show: 条件不满足时, 元素不会显示(但仍然存在)

学习了模板语法

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>vue模板语法</title>
<script src="../js/vue.js"></script>
</head>
<body>
<div id="root">
<h1>插值语法</h1>
<h3>你好,{{name}}!</h3>
<hr>
<h1>指令语法</h1>
<a v-bind:href="url">快去写报告!</a><br>
<a :href="url">快去写报告!</a>
</div>

<script>
Vue.config.productionTip = false
new Vue({
el:'#root',
data:{
name:'YYY',
url:'https://www.baidu.com/'
}
})
</script>
</body>
</html>

学习了数据绑定

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>数据绑定</title>
    <script src="../js/vue.js"></script>
</head>
<body>
    <div id="root">
        单向数据绑定:<input type="text" v-bind:value="name"><br>
        双向数据绑定:<input type="text" v-model:value="name">
    </div>

    <script>
        Vue.config.productionTip = false 
        new Vue({
            el:'#root', 
            data:{
                name:'YYY'
            }
        })
    </script>
</body>
</html>

学习了事件处理

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>事件的基本用法</title>
    <script src="../js/vue.js"></script>
</head>
<body>
    <div id="root">
        <h2>hello,{{name}}</h2>
        <button v-on:click="showInfo1">点我提示信息1</button>
        <button @click="showInfo2($event,66)">点我提示信息2</button>
    </div>

    <script>
        Vue.config.productionTip = false 
        new Vue({
            el:'#root', 
            data:{
                name:'YYY'
            },
            methods:{
                showInfo1(event){
                    console.log(event)
                },
                showInfo2(evnet,num){
                    console.log(event,num)
                }
            }
        })
    </script>
</body>
</html>

************************************************************************分割线************************************************************************************************

小组成员:周广通

学习内容:

学习了mybatis的基础操作

<mapper namespace="Dao.StudentDao">
    <!--查-->
    <select id="selectStudent" resultType="pojo.Student">
    select * from student where id = #{id}
  </select>
    
    <!--增-->
    <insert id="add" parameterType="pojo.Student">
        insert into student values(#{Id},#{Name})
    </insert>
    
    <!--删-->
    <delete id="delete" parameterType="int">
        delete from student
        <where>
            id =#{id}
        </where>
    </delete>
    
    <!--改-->
    <update id="update" parameterType="pojo.Student">
        update student set name = '${Name}'
        <where>
            id =${Id}
        </where>
    </update>
</mapper>

学习了动态sql的使用

<select id="getAllSchoolStudent" resultMap="SchoolStudent" parameterType="map">
      SELECT * FROM student JOIN student_school ON student.id=student_school.studentId JOIN school ON school.schoolId=student_school.schoolId
        <where>
            <if test="sid!=null">
                school.schoolId=#{sid}
            </if>
            <if test="studentName!=null">
                and name=#{studentName}
            </if>
        </where>
  </select>

    <select id="getAllSchoolStudent" resultMap="SchoolStudent" parameterType="map">
    SELECT * FROM student JOIN student_school ON student.id=student_school.studentId JOIN school ON school.schoolId=student_school.schoolId
    <where>
    <choose>
        <when test="sid!=null">
           and school.schoolId=#{sid}
        </when>
        <when test="studentName!=null">
            and name=#{studentName}
        </when>
        <otherwise>
            and 1==1
        </otherwise>
    </choose>
    </where>
  </select>

<update id="update" parameterType="map">
    update school
    <set>
        <if test="schoolName!=null">
            schoolName=#{schoolName},
        </if>
    </set>
</update>

<select id="selectStudentByList" parameterType="list" resultType="Student">
    select * from student where id in
    <foreach collection="list" index="index" item="item" open="(" separator="," close=")">
        #{item}
    </foreach>
</select>

 

************************************************************************分割线************************************************************************************************

 以上是我们小组的全部学习内容!

 

posted on 2022-11-06 19:13  Eliaukihziy  阅读(108)  评论(0)    收藏  举报