开发环境搭建
MySQL下载安装
成功如下:
再配置环境变量(和java环境变量配置一样)
IDEA下载安装
IDEA下载:https://www.jetbrains.com.cn/idea/download/#section=windows
java下载安装
Maven下载安装
创建springboot应用程序
Maven模板快速创建项目
配置Maven的settings文件
关于cong文件夹中的settings.xml文件(D:\maven\conf
):
- maven用来构建项目
- java需要外部的jar包,外网的中央仓库,下载本地仓库
setting.xml文件里面的盘符注意
<localRepository>D:/lib_repo/repository</localRepository>
用阿里的源站下载
<mirrors>
<!-- 这里使用的是阿里的远程maven镜像,目前国内大多数都使用它 -->
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
</mirrors>
添加src/main/java目录
pom.xml添加项目依赖jar包
打开pom.xml文件,改配置文件,添加依赖项,具体修改为如下:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.6.2</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.cn.shicun</groupId>
<artifactId>emis</artifactId>
<version>1.0-SNAPSHOT</version>
<name>emis</name>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
<build>
</build>
</project>
点击右上角蓝色更新按钮
然后idea会自动下载这些jar包(Maven优势之一,就是会自动下载jar包)
下载成功如下所示:
运行springboot应用程序
测试代码
如下位置写入如下代码:
```java package com.cn.shixun;
import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication public class App { public static void main( String[] args ) { SpringApplication.run(App.class); } }
<a name="fzUO5"></a>
### 静态资源
然后在resources新建文件夹static,在其中写入index.html文件,然后运行App代码<br />![image.png](https://cdn.nlark.com/yuque/0/2022/png/1484158/1645513209905-d82808a5-87e0-4d1d-a44f-7bd84bf14e48.png#clientId=ua382b8e2-dd80-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=431&id=u08e7d5a8&margin=%5Bobject%20Object%5D&name=image.png&originHeight=517&originWidth=828&originalType=binary&ratio=1&rotation=0&showTitle=false&size=59584&status=done&style=none&taskId=u16b3d731-8c18-41ee-b120-f0cccc86bc7&title=&width=689.9999725818645)<br />![image.png](https://cdn.nlark.com/yuque/0/2022/png/1484158/1645513163237-543a369b-f027-4a23-a54b-16d5396317e7.png#clientId=ua382b8e2-dd80-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=294&id=u649359b3&margin=%5Bobject%20Object%5D&name=image.png&originHeight=353&originWidth=889&originalType=binary&ratio=1&rotation=0&showTitle=false&size=32066&status=done&style=stroke&taskId=u5970fc7a-052a-4d40-a746-4f2f1d7b8c2&title=&width=740.8333038952627)
<a name="R4FjW"></a>
### idea实时刷新前端代码设置
![image.png](https://cdn.nlark.com/yuque/0/2022/png/1484158/1645513254386-91ff5733-2ee8-4bba-a306-3e0ae0a82189.png#clientId=ua382b8e2-dd80-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=384&id=u857aff52&margin=%5Bobject%20Object%5D&name=image.png&originHeight=461&originWidth=972&originalType=binary&ratio=1&rotation=0&showTitle=false&size=54248&status=done&style=none&taskId=ua8bcb601-40c3-48e4-9450-cccb6008698&title=&width=809.9999678134931)<br />![image.png](https://cdn.nlark.com/yuque/0/2022/png/1484158/1645513246554-dda6481d-a454-497b-a90f-66700b3df752.png#clientId=ua382b8e2-dd80-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=455&id=u8bb3fd04&margin=%5Bobject%20Object%5D&name=image.png&originHeight=546&originWidth=974&originalType=binary&ratio=1&rotation=0&showTitle=false&size=52171&status=done&style=none&taskId=uac19504c-e5e4-4fc5-befa-e0a9c371b6c&title=&width=811.6666344139323)
<a name="b0Yyp"></a>
## 前后端架构
![image.png](https://cdn.nlark.com/yuque/0/2022/png/1484158/1645602574923-49da96c6-764f-4141-af8b-b6d8fe8bc584.png#clientId=ud948cc8c-71cb-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=646&id=u65920461&margin=%5Bobject%20Object%5D&name=image.png&originHeight=775&originWidth=1009&originalType=binary&ratio=1&rotation=0&showTitle=false&size=235932&status=done&style=stroke&taskId=ua122433c-048f-4c3d-a78d-81f66aa200a&title=&width=840.8332999216199)
<a name="UzUhw"></a>
## 前端
<a name="LL54d"></a>
### jQuery的Ajax的使用
jQuery其他相关笔记之前已经学过,不做赘述,此文只做Ajax相关的笔记<br />![image.png](https://cdn.nlark.com/yuque/0/2021/png/1484158/1629125564200-d6272b27-ffcf-4f6d-b7f8-f1ccc7660b0c.png#crop=0&crop=0&crop=1&crop=1&height=315&id=pBacN&margin=%5Bobject%20Object%5D&name=image.png&originHeight=322&originWidth=623&originalType=binary&ratio=1&rotation=0&showTitle=false&size=13078&status=done&style=stroke&title=&width=609.4973754882812)
```javascript
// Ajax ===============================================================
let ajaxDemo = function(){
$.ajax({
type : "post",
url : "https://127.0.0.1:8080/test/demo2",
data : {
"name" : "李四",
"age" : 14
},
// dataType : "json",
success : function(data) {// 后端的返回值
alert(data);
}
});
}
<input type="button" value="ajax点击按钮" onclick="ajaxDemo();">
原生JavaScript的Ajax使用
function ajax (options) {
// 默认值
var defaults = {
type: 'get',
url: '',
data: {},
header: {
'Content-Type': 'application/x-www-form-urlencoded'
},
success: function () {},
error: function () {}
}
// 使用用户传递的参数替换默认值参数
Object.assign(defaults, options);
// 创建ajax对象
var xhr = new XMLHttpRequest();
// 参数拼接变量
var params = '';
// 循环参数
for (var attr in defaults.data) {
// 参数拼接
params += attr + '=' + defaults.data[attr] + '&';
// 去掉参数中最后一个&
params = params.substr(0, params.length-1)
}
// 如果请求方式为get
if (defaults.type == 'get') {
// 将参数拼接在url地址的后面
defaults.url += '?' + params;
}
// 配置ajax请求
xhr.open(defaults.type, defaults.url);
// 如果请求方式为post
if (defaults.type == 'post') {
// 设置请求头
xhr.setRequestHeader('Content-Type', defaults.header['Content-Type']);
// 如果想服务器端传递的参数类型为json
if (defaults.header['Content-Type'] == 'application/json') {
// 将json对象转换为json字符串
xhr.send(JSON.stringify(defaults.data))
}else {
// 发送请求
xhr.send(params);
}
} else {
xhr.send();
}
// 请求加载完成
xhr.onload = function () {
// 获取服务器端返回数据的类型
var contentType = xhr.getResponseHeader('content-type');
// 获取服务器端返回的响应数据
var responseText = xhr.responseText;
// 如果服务器端返回的数据是json数据类型
if (contentType.includes('application/json')) {
// 将json字符串转换为json对象
responseText = JSON.parse(responseText);
}
// 如果请求成功
if (xhr.status == 200) {
// 调用成功回调函数, 并且将服务器端返回的结果传递给成功回调函数
defaults.success(responseText, xhr);
} else {
// 调用失败回调函数并且将xhr对象传递给回调函数
defaults.error(responseText, xhr);
}
}
// 当网络中断时
xhr.onerror = function () {
// 调用失败回调函数并且将xhr对象传递给回调函数
defaults.error(xhr);
}
}
AdminLTE框架
文档:https://adminlte.io/
下载adminlte及其依赖放到静态文件夹
使用jsDelivr外链来构建
https://cdn.jsdelivr.net/npm/admin-lte@3.2/dist/css/adminlte.min.css
https://cdn.jsdelivr.net/npm/admin-lte@3.2/plugins/fontawesome-free/css/all.min.css
构建管理类系统的静态页模板
利用AdminLTE UI模板搭建出项目所需的目的页面(在static里面写出想要的各种效果)
管理类系统的页面类型大概有以下几类:
- 登录页(大多数的管理类系统都没有注册页,需要通过用户管理模块增加用户)。
http://127.0.0.1:8080/pages/login.html
- 欢迎页,登录成功后进入的首页。
http://127.0.0.1:8080/pages/index.html
- 列表页,展示数据集合的表格,一般带分页和查询功能,展示的每行数据的最后会有可以点击的“修改”和“删除”功能。
- 新增/修改页,一个form表单,同一个的功能模块的新增/修改页的表单元素是一致的,只是修改页需要回填数据。
- 其他特殊页,例如在线答题页、数据统计页、文件上传页等等,这些在管理类系统中的占比很小。
后端:Springboot 学习
记录一下框架的API使用参考资料
vscode运行springboot项目
SpringBoot编写接口
@SpringBootApplication
主要方法是通过调用run来委托Spring Boot的SpringApplication类。
SpringApplication引导我们的应用程序,从Spring开始,然后启动自动配置的Tomcat Web服务器。
我们需要将Example.class作为参数传递给run方法,以告诉SpringApplication哪个是主要的Spring组件。
还会传递args数组以公开任何命令行参数。
springboot的启动类是有作用范围的
@Controller
所创建的类是一个web @Controller
,所以Spring在处理传入的Web请求时会考虑它。
@RequestMapping(“test”)
@RequestMapping注释提供“路由”信息。它告诉Spring任何带有/test路径的HTTP请求都应该映射到所写的test方法。
@responseBody
@responseBody注解的作用是将controller的方法返回的对象通过适当的转换器转换为指定的格式之后,写入到response对象的body区,通常用来返回JSON数据回格式是text/json(或者是XML)数据,需要注意的呢,在使用此注解之后不会再走试图处理器,而是直接将数据写入到输入流中,他的效果等同于通过response对象输出指定格式的数据。
@RestController
类上写上注解 @RestController,那么此Controller返回格式就都是text/json
后端:数据库学习
表关系
权限控制:
RBAC,role based access control,基于角色的访问控制
用户,角色,功能(项目的粒度到二级菜单即可)
user,userrole,role,role_menu,menu
用户角色组,角色则,角色组_角色
数据表的初始化
连接本地数据库
按照教程初始化各个数据库
构建实体类—-如果手动构建,需要单独给每个表生成Getter Setter,所以使用下面讲的mybits逆向工程构建。
MyBatis逆向工程
添加数据库账户及授权
参考:navicat创建用户以及设置权限
账号密码都是:mybatis
创建成功后如下:
pom.xml添加依赖
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.2.1</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
<!--
1、如果你的数据库是mysql8,这段<version>5.1.32</version>不用管
2、如果你的数据库是mysql5.x,放开<version>5.1.32</version>这段注释
-->
<version>5.1.32</version>
</dependency>
<dependency>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-core</artifactId>
<version>1.4.0</version>
</dependency>
编写逆向工程的配置文件generatorConfig.xml和Generator.java
运行Generator类的main方法生成实体类、mapper接口和mapper的xml文件
每次生成逆向工程之前,要把之前生成的文件全部删除。
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.73</version>
</dependency>
报错
SpringBoot启动报错Failed to configure a DataSource: ‘url’ attribute is not specified and no embedded datasource could be configured
Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled.
2022-02-27 20:30:12.439 ERROR 12672 --- [ main] o.s.b.d.LoggingFailureAnalysisReporter :
***************************
APPLICATION FAILED TO START
***************************
Description:
Failed to configure a DataSource: 'url' attribute is not specified and no embedded datasource could be configured.
Reason: Failed to determine a suitable driver class
Action:
Consider the following:
If you want an embedded database (H2, HSQL or Derby), please put it on the classpath.
If you have database settings to be loaded from a particular profile you may need to activate it (no profiles are currently active).
Process finished with exit code 1
启动类添加如下:
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
参考:https://www.panziye.com/java/1873.html
Consider defining a bean of type ‘com.cn.shixun.mapper.UserMapper’ in your configuration.
参考:https://blog.csdn.net/zzldm/article/details/116534419
nio-8080-exec-1
属于正常情况
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v2.6.2)
2022-02-27 20:46:14.796 INFO 9608 --- [ main] com.App : Starting App using Java 1.8.0_151 on DESKTOP-QTVR7IE with PID 9608 (D:\projects\emis\target\classes started by wztli in D:\projects\emis)
2022-02-27 20:46:14.799 INFO 9608 --- [ main] com.App : No active profile set, falling back to default profiles: default
2022-02-27 20:46:16.451 INFO 9608 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8080 (http)
2022-02-27 20:46:16.464 INFO 9608 --- [ main] o.apache.catalina.core.StandardService : Starting service [Tomcat]
2022-02-27 20:46:16.464 INFO 9608 --- [ main] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.56]
2022-02-27 20:46:16.582 INFO 9608 --- [ main] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext
2022-02-27 20:46:16.582 INFO 9608 --- [ main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 1721 ms
2022-02-27 20:46:16.996 INFO 9608 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8080 (http) with context path ''
2022-02-27 20:46:17.010 INFO 9608 --- [ main] com.App : Started App in 2.708 seconds (JVM running for 3.193)
2022-02-27 20:46:17.075 INFO 9608 --- [nio-8080-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring DispatcherServlet 'dispatcherServlet'
2022-02-27 20:46:17.075 INFO 9608 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Initializing Servlet 'dispatcherServlet'
2022-02-27 20:46:17.076 INFO 9608 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Completed initialization in 1 ms