本周内容
1.linux的基本命令
所处目录结构位置:pwd
清屏命令:clear
cd 目录名称 进入指定目录
cd .. :回退上一级目录
cd / :回退根目录了
罗列当前目录下的所有文件以及目录的名称 ls
详情罗列当前目录下的所有文件以及目录的名称/权限/时间 ll
创建目录:
mkdir 目录名称
rm -rf 目录名称 :递归删除目录并且将当前目录删除(暴力删除)
创建文件 vim 文件名称 并且进行编辑
进入到命令行模式 --- 按 i 进入编辑模式
编辑完成:
按esc 输入:进入底行模式
wq:保存并退出
q!:不保存退出
cat 文件名称 :查看文件所有内容(推荐)
more 文件名称:查看文件(相对比less 文件名称查看的内容多一些)
less 文件名称:查看文件:少量内容 通过上下键进行翻页
mv 文件名称 /路径 :将文件移动并剪切到指定路径下
cp 文件名称 /路径 :将文件进行复制到某个指定目录下
mv 以前具体的文件名称 新的文件名称 改名
mv 路径 文件名称: 剪切
加压缩命令:将xx.tar.gz进行解压
tar -zxvf 文件名称 -C /usr/local :将解压文件夹移动到指定的位置
rpm -qa | grep 关键字(java):在Linux服务器上全局搜索是否存在java相关软件工具包
1.1 重启网卡
nmcli c reload 网卡号
在centos8中的网卡号为 ens33
sudo firewall-cmd --add-service=http --permanent (允许http服务)
sudo firewall-cmd --add-port=3306/tcp --permanent 对3306端口开发
sudo firewall-cmd --add-port=8080/tcp --permanent
查看网卡:
地址:cd /etc/sysconfig/network-scripts/
查看:cat ifconfig-ens33
1.2 linux系统命令–防火墙
Centos8
systemctl status firewalld.service查看防火墙状态
systemctl stop firewalld.service执行停止运行防火墙命令
systemctl start firewalld.service执行运行防火墙命令
systemctl disable firewalld.service禁止防火墙自启动
systemctl enable firewalld.service 开机自启
1.3 比较重要的目录
etc:linux系统上安装软件:里面有些软件的配置文件,还有网络配置文件
usr:资源共享文件
1.4 支付宝支付流程
导入支付宝支付的jar包,alipay,版本sdk-java-20170324180803.jar
进入支付宝界面,进入沙箱环境,点击沙箱应用,获取公钥和私钥-api-电脑网站支付-导入支付宝的sdk的jar包-在控制层创建一个支付宝调用接口 pay(代码在基础功能中,无返回值)-配置支付宝客户端--创建API对应的request-设置同步回调路径-设置异步回调路径(支付是否成功,以异步回调为准)--填充业务参数,声明一个字符串form,需要通过支付宝将表单数据全部拼接进去--设置异步回调地址returnUrl
客户端配置信息:(1)参数一:支付宝网关
(2)APP_ID
(3)APP_PRIVATE_KEY:应用私钥
(4)格式化--使用json
(5)CHAREST:页面编码格式--utf-8
(6)支付宝公钥
(7)加密方式:RSA2
异步回调的实体内容
(1)在公共参数中国设置回调和通知地址
(2)订单编号
(3)商品编码
(4)订单金额
(5)订单主题
(6)商品的具体名称
支付宝的核心配置类
支付宝的核心配置类
/**
* @author Kuke
* @date 2021/9/11
* 支付宝的核心配置类 里面设置支付宝账户的基本信息 必填的(自己的支付宝信息)
*
*/
public class AlipayConfig {
// 页面跳转同步通知页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数
public static String return_url = "http://m8eju4.natappfree.cc/aliPayReturnUrlServlet"; // 此处使用外网ip(使用免费的花生壳或者netapp产生的外网域名)
// 服务器异步通知页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问
public static String notify_url = "http://m8eju4.natappfree.cc/notify";
// 应用ID,您的APPID,收款账号既是您的APPID对应支付宝账号
public static String app_id = "2016110100783811";
// 支付宝公钥,查看地址:https://openhome.alipay.com/platform/keyManage.htm 对应APPID下的支付宝公钥。
public static String alipay_public_key ="支付宝公钥";
// 商户私钥,您的PKCS8格式RSA2私钥
public static String merchant_private_key="支付宝私钥" ;
public static String sign_type = "RSA2";
// 字符编码格式
public static String charset = "utf-8";
// 支付宝网关
public static String gatewayUrl = "https://openapi.alipaydev.com/gateway.do" ;
}
支付宝支付完成后的异步回调的控制器
支付宝支付完成之后的回调的控制器
* */
@WebServlet("/aliPayReturnUrlServlet")
public class AliPayReturnUrlServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//支付宝回调 : 外网必须访问:
//支付宝响应get请求
PrintWriter out = response.getWriter();
//获取支付宝GET过来反馈信息
Map<String,String> params = new HashMap<String,String>();
Map<String,String[]> requestParams = request.getParameterMap();
for (Iterator<String> iter = requestParams.keySet().iterator(); iter.hasNext();) {
String name = (String) iter.next();
String[] values = (String[]) requestParams.get(name);
String valueStr = "";
for (int i = 0; i < values.length; i++) {
valueStr = (i == values.length - 1) ? valueStr + values[i]
: valueStr + values[i] + ",";
}
//乱码解决,这段代码在出现乱码时使用
System.out.println("转码前:"+valueStr);
// valueStr = new String(valueStr.getBytes("ISO-8859-1"), "utf-8");
// System.out.println("转码后:"+valueStr);
params.put(name, valueStr);
}
try {
//调用SDK验证签名
boolean signVerified = AlipaySignature.rsaCheckV1(params, AlipayConfig.alipay_public_key, AlipayConfig.charset, AlipayConfig.sign_type);
//——请在这里编写您的程序(以下代码仅作参考)——
if(signVerified) {
//商户订单号
String out_trade_no = new String(request.getParameter("out_trade_no").getBytes("ISO-8859-1"),"UTF-8");
//支付宝交易号
String trade_no = new String(request.getParameter("trade_no").getBytes("ISO-8859-1"),"UTF-8");
//付款金额
String total_amount = new String(request.getParameter("total_amount").getBytes("ISO-8859-1"),"UTF-8");
//此处需要自己编写自己的代码,修改数据库中的订单状态
//修改订单状态为 已支付
//调用业务接口,将支付的状态变成1
OrderService orderService = new OrderServiceImpl() ;
Order order = orderService.getOrderById(out_trade_no);
order.setState(1);
orderService.update(order);
//重定向到支付成功的提示
response.sendRedirect(request.getContextPath()+"/jsp/success.jsp?orderNO="+out_trade_no);
}else {
out.println("验签失败");
}
//——请在这里编写您的程序(以上代码仅作参考)——
} catch (AlipayApiException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request,response);
}
}
支付宝支付的控制器
@WebServlet("/order")
public class OrderServlet extends BaseServlet {
/**
* 生成订单
* @param request 请求对象
* @param response 响应对象
*/
public void addOrder(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {
System.out.println("进入生成订单的方法中了...");
//这个用户如果没有登录过,应该让他先登录
User user = (User) request.getSession().getAttribute("user");
if(user==null){
//没有登录过,请求转发到jsp/login.jsp
request.getRequestDispatcher("/jsp/login.jsp").forward(request,response);
return; //结束了
}
//用户登录过
//封装订单Order
Order order = new Order() ;
//UUID生成
order.setOid(UUIDUtils.getId()) ;
//下订单时间
//创建当前日期对象---->java.util.Date
// 里面有个成员方法:public Instant toInstant() 转换成当前系统时间线
// --->LocalDateTime
//public static LocalDateTime ofInstant(Instant instant, ZoneId zone)
//参数1:系统日期时间
//参数2:时区 ---使用ZoneId(时区ID)获取当前系统默认时区public static ZoneId systemDefault()
Date date = new Date() ;
LocalDateTime localDateTime = LocalDateTime.ofInstant(date.toInstant(), ZoneId.systemDefault());
order.setOrdertime(localDateTime);
//从sesison获取购物车---->Cart----->获取购物车项
Cart cart = (Cart) request.getSession().getAttribute("cart");
//封装订单的总金额
order.setTotal(cart.getTotalMoney());
//,addres,name,telephone (先写死)
//获取所有的购物车项的数据
for(CartItem cartItem: cart.getItems()){
//封装订单项OrderItem实体 ---->里面商品的数量/商品实体/小计金额---->来自购物车项
OrderItem orderItem = new OrderItem() ;
orderItem.setItemid(UUIDUtils.getId());
orderItem.setCount(cartItem.getCount());
orderItem.setProduct(cartItem.getProduct()) ;
orderItem.setSubtotal(cartItem.getSubTotal()) ;
//这个订单项属于哪个订单的
orderItem.setOrder(order);
//订单项封装多个订单项
order.getItems().add(orderItem) ;
}
//订单属于哪个用户的
order.setUser(user);
//调用OrderService
OrderService orderService = new OrderServiceImpl() ;
orderService.addOrder(order);//插入订单数据
//将订单实体存储在Request域中
request.setAttribute("bean",order) ;
//请求转发到订单详情页面中之前,应该session域中存储到cart删除掉
request.getSession().removeAttribute("cart");
request.getRequestDispatcher("/jsp/order_info.jsp").forward(request,response);
}
//我的订单列表---分页查询
//支付订单
public void pay(HttpServletRequest request,HttpServletResponse response){
System.out.println("订单支付进来了...");
//获取订单编号
//收货人
//电话...
String oid = request.getParameter("oid");
String address = request.getParameter("address");
String name = request.getParameter("name");
String telephone = request.getParameter("telephone");
//封装订单
Order order = new Order() ;
order.setName(name);
order.setAddress(address);
order.setTelephone(telephone);
//调用业务接口更新订单中的用户信息
OrderService orderService = new OrderServiceImpl() ;
orderService.updateOrder(order) ;
//支付宝的客户端的配置
try {
//获得初始化的AlipayClient
//获取当前config包下的AlipayConfig的参数
AlipayClient alipayClient = new DefaultAlipayClient(
AlipayConfig.gatewayUrl,
AlipayConfig.app_id,
AlipayConfig.merchant_private_key,
"json",
AlipayConfig.charset, AlipayConfig.alipay_public_key,
AlipayConfig.sign_type);
//设置请求参数
AlipayTradePagePayRequest alipayRequest = new AlipayTradePagePayRequest();
alipayRequest.setReturnUrl(AlipayConfig.return_url);
alipayRequest.setNotifyUrl(AlipayConfig.notify_url);
// String orderNO = request.getParameter("oid");
//调用业务层接口
//通过订单编号获取订单
Order orderObj = orderService.getOrderById(oid);
// 商户订单号,商户网站订单系统中唯一订单号,必填
String out_trade_no = orderObj.getOid() ;
// //付款金额,必填
Double total = orderObj.getTotal();
String total_amount = String.valueOf(total) ;
// //订单名称,必填
String subject = "商品支付";
//商品描述,可空
String body = "欢迎使用支付宝支付";
alipayRequest.setBizContent("{\"out_trade_no\":\"" + out_trade_no + "\"," + "\"total_amount\":\""
+ total_amount + "\"," + "\"subject\":\"" + subject + "\"," + "\"body\":\"" + body + "\","
+ "\"product_code\":\"FAST_INSTANT_TRADE_PAY\"}");
//若想给BizContent增加其他可选请求参数,以增加自定义超时时间参数timeout_express来举例说明
//alipayRequest.setBizContent("{\"out_trade_no\":\""+ out_trade_no +"\","
// + "\"total_amount\":\""+ total_amount +"\","
// + "\"subject\":\""+ subject +"\","
// + "\"body\":\""+ body +"\","
// + "\"timeout_express\":\"10m\","
// + "\"product_code\":\"FAST_INSTANT_TRADE_PAY\"}");
//请求参数可查阅【电脑网站支付的API文档-alipay.trade.page.pay-请求参数】章节
AlipayTradePagePayResponse alipayResponse = null;
try {
alipayResponse=alipayClient.pageExecute(alipayRequest);
System.out.println(alipayResponse.getBody());//后台打印一下 支付宝支付的参数数据
System.out.println(alipayResponse.getMsg());
} catch (AlipayApiException e) {
e.printStackTrace();
}
response.setContentType("text/html;charset=UTF-8"); //设置编码
response.getWriter().write(alipayResponse.getBody()); //将支付宝支付的首页显示给浏览器
return ;
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
2.架构演进的过程(理论)
单体架构
单体架构构建集群
垂直架构
插入中间件
分布式架构
3.springBoot入门–约定大于配置
Nginx:解决用户请求平均分发
Redis - 解决数据共享并实现缓存功能
ElasticSearch - 解决搜索数据的功能
注意事项:
(1)启动类和其他的包路径相同,为同级目录,会自动扫描,不是同级目录,需要指定包扫描路径scanBasePacket:"路径"
(2)控制层注解应该使用resultFul风格@RestController
(3)外部资源文件
(4将jar包org.springframework.boot的spring-boot-starter-parent的版本改为2.0.3.release
(5配置文件必须是固定格式**application.yml/ymal/properties
key1: 空格 value1;
server:
port: 8082
3.1 自动配置的原理
不需要xml文件,打包方式是jar包,只需要导入springboot启动器,他会自动加载包下面的文件spring.factories资源文件,他包含了很多常用的一些类,都是webmvc中的常用类的全限定名称:,通过反射的方式去创建对象:解析对应的内容,底层依赖于spring,创建bean工厂,加载springIOC容器,也就是底层工厂类AbstractApplicationContext(子类:ClassPathXmlApplicationContext),然后注入数据
/**
* SpringBoot启动类
* 建议:启动类和其他的包路径同级目录,会自动扫描包
* ,否则不是同级目录:指定包扫描的路径scanBasePackages={"包名路径"}
*/
//@SpringBootApplication(scanBasePackages = {"com.qf.controller"}) //@SpringBootApplication标记当前这个类是启动类
@SpringBootApplication //@SpringBootApplication标记当前这个类是启动类
/**
* Springboot自动配置原理 (面试中肯定文)
* (约定大于配置:需要繁杂的xml文件)
*
* 只需要导入springboot启动器,它会自动加载 包下面的文件spring.factories
* 包含了很多常用的一些类:webmvc 自动加载 (全限定名称:包名.类名)
*
* org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration
*
*
* 通过反射的方式创建对象 : 解析对应的内容
*
* 底层依赖于Spring ,创建Bean工厂,加载springIOC容器 AbstractApplicationContext
* 子类:ClassPathXmlApplicationContext
* 注入数据(set注入/构造器注入/注解注入)...
*/
public class SpringbootFirstApplication {
public static void main(String[] args) {
SpringApplication.run(SpringbootFirstApplication.class, args);
}
}
4.springBoot+mybatis整合+html+layUI进行CRUD
(1)导入mybatis的启动类,版本2.1.4
(2)导入mysql
(3)配置文件中配置数据
配置mybatis的映射文件的加载
(4)在持久层接口加上注解@Mapper-->rang springboot扫描
#配置端口
server.port=8081
#配置数据源
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/qf_live?characterEncoding=utf8&useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true
spring.datasource.username=root
spring.datasource.password=root
#配置mybatis的映射路径和别名包扫描
mybatis.mapper-locations=/com/qf/mapper/*Mapper.xml
mybatis.type-aliases-package=com.qf.pojo
4.1 针对课程管理
5.Swagger2(接口测试的工具–接口API文档)–>swagger.ui.html
(1)导包
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.8.0</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>2.8.0</version>
</dependency>
(2)准备一个配置类,加上两个注解
@Configration:标记这是个配置类
@EnaleSwagger2:开启swagger2的使用,文档解析/生成api文档
(3)在配置类方法上加入注解@Bean相当于之前的xml中bean标签 id ="" class=""
(4)在控制层中,@RequestMapping必须带上提交方式,否则swagger2会默认把get和post都执行一遍
@RequestMapping(value = "/findStudentById",method = RequestMethod.POST)
在@RequerstMapping下面带上,swaggger注解:针对方法解释说明
@ApiOperation(value="根据学生的编号查询学生", notes="学生编号")
@Conguration
@EnableSwagger2
public class Swagger2Cong {
@Bean
public Docket api() {
return new Docket(DocumentationType.SWAGGER_2)
.apiInfo(apiInfo())
.select()
// 自行修改为自己的包路径 .apis(RequestHandlerSelectors.basePackage("com.qf.controller")) .paths(PathSelectors.any())
.build();
}
private ApiInfo apiInfo() {
return new ApiInfoBuilder()
.title("swagger-api文档")
.description("swagger接入教程")
//服务条款网址
.version("1.0")
.build();
} }
6.springBoot和springjpa(可以代替mybatis)整合
JPA:Java 非常强大的mybatis,可以在声明实体的时候,就可以创建实体对应的表,底层是habernate-->不需要写sql语句,
实体类的属性hi默认和表中字段可以对应上,随着列名的变化,表中的字段会自动更新
弊端:一般情况下,只能进行单表操作
优点:只需要在实体类上标识出他是一个jpa实体,指定字段以及主键,会自动生成表,只需要编写一个接口,继承JPAResponsitory接口
使用步骤:
(1)导包
(2)配置JPA相关
spring.jpa.database-mysql//配置数据库的类型
spring.jpa.generate-ddl-true//是否启用通过jpa的方式创建表-->CRUD
spring.jpa.show-sql=true//是否展示sql语句,
(3)在实体类上加入注解@Table(name="表的名称"),如果不写表的的名称,那么就是当前类名第一个字母小写的表的名称
(4)在实体类上加入注解@Entity-->告知jpa通过操作这个实体类创建表
(5)字段的注解,如果不加注解,默认表的字段名就是属性名称
@Id //声明主键字段
@GeneratedValue(strategy = GenerationType.IDENTITY):在主键字段启用自增长策略
@Column(name="表字段名称")//字段名称
7.Springboot整合mail邮件技术
三种方式:
(1)简单方式
(2)给邮件加上"高亮显示"
(3)在发送邮件的时候,可以将附件(文件.图片)以附件的形式发送到邮件中