Week14手写笔记

本文详细介绍了Linux常用命令,包括目录操作、文件管理、防火墙设置等,并讲解了如何在CentOS8系统中配置和使用。此外,还阐述了支付宝支付的流程,从获取公钥私钥到创建API请求,以及支付完成后异步回调的控制器实现,展示了如何在Java环境中集成支付宝SDK进行支付操作。
摘要由CSDN通过智能技术生成

本周内容

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)在发送邮件的时候,可以将附件(文件.图片)以附件的形式发送到邮件中
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值