购物商城shopping连载(11)

2023-05-16

订单模块类创建及配置

购物完成之后,提交订单,生成一个订单
订单表和商品的关系:
订单和商品的关系是多对多,一个订单可以有多个商品,一个商品可以属于多个订单。
如果是多对多的关系,那么建表的时候应该建第三张表(中间表),存订单表和商品表的id。
中间表:订单项表:

这里写图片描述

订单表和商品表是多对多关系,可以通过两个一对多的形式完成多对多的关联关系。即商品对订单项是一对多,订单对订单项也是一对多,两个表对中间表的一对多关系相当于商品和订单表的多对多关系。

这里写图片描述

说下这样处理的好处,如果你把商品表和订单表的关系创建成多对多的关系,中间表只会维护商品id和订单id,中间的订单表的其他字段是不会自动维护的,如果配成一对多,其他自动就可以自动维护。

订单表:

/***
 * 订单表
 * 
 */
@SuppressWarnings("serial")
public class Order implements Serializable {
    private long oid;// 订单id
    private Double total; // 总计
    private Date orderTime;// 订单下单时间
    private int state; // 订单状态
    private String name;// 用户名
    private String addr; // 地址
    private String phone;// 用户电话
    // 订单所属用户
    private User user;
    // 订单中包含多个订单项
    private Set<OrderItem> orderItems = new HashSet<OrderItem>();
    //省略setter getter方法

OrderItem订单项表:

@SuppressWarnings("serial")
public class OrderItem implements Serializable{
    private long itemid; //订单项id
    private int count; //订单数量
    private Double subtotal; //订单小计
    // 商品对象
    private Product product;
    // 订单对象
    private Order order;
    //省略setter getter方法

Order.hbm.xml:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
    <class name="com.shopping.order.entity.Order" table="orders">
        <id name="oid">
            <generator class="native"/>
        </id>

        <property name="total"/>
        <property name="orderTime"/>
        <property name="state"/>
        <property name="name"/>
        <property name="phone"/>
        <property name="addr"/>

        <!-- 订单与用户关联配置 -->
        <!-- 一个用户有多个订单 ,多个订单属于一个用户-->
        <many-to-one name="user" lazy="false" class="com.shopping.user.entity.User" column="uid"/>

        <!-- 订单与订单项关联配置 -->
        <!-- 一个订单包含多个订单项 -->
        <set name="orderItems" lazy="false" cascade="save-update">
            <key column="oid"/>
            <one-to-many class="com.shopping.order.entity.OrderItem"/>
        </set>
    </class>
</hibernate-mapping>

OrderItem.hbm.xml:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
    <class name="com.shopping.order.entity.OrderItem" table="orderitem">
        <id name="itemid">
            <generator class="native"/>
        </id>

        <property name="count"/>
        <property name="subtotal"/>

        <!-- 订单项是多方, product是一方-->
        <many-to-one name="product" lazy="false" class="com.shopping.product.entity.Product" column="pid"></many-to-one>

        <!-- 订单项是多方 ,order是一方-->
        <many-to-one name="order" class="com.shopping.order.entity.Order" column="oid"/>
    </class>
</hibernate-mapping>

这里写图片描述

这里说明一下,在Oder中用到了User对象,表示多个订单属于一个用户,如果你不需要在User中需要Order,则不用写以下代码:

Set<Order> orders = new HashSet<Order>();
//用到就写,不用就可以不用写,不会影响建表

订单模块跳转到订单页面

在购物车页面点击提交订单的时候:

这里写图片描述

应该跳转到订单页面,订单页面见上面第一张图。

                        <a href="${ pageContext.request.contextPath }/order_saveOrder.do" id="submit" class="submit">提交订单</a>

OrderAction:

package com.shopping.order.action;

import org.hibernate.criterion.Order;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;

import com.shopping.base.BaseAction;

@SuppressWarnings("serial")
@Controller
@Scope("prototype")
public class OrderAction extends BaseAction<Order> {


    public String saveOrder(){
        System.out.println("order..");
        return "saveSuccess";
    }
}

跳转成功。
提交订单,1.把订单和订单项保存到数据库。2.把订单信息显示到页面上
补全saveOrder方法:

    public String saveOrder() {
        // System.out.println("order..");
        // 1.保存数据到数据库
        // 订单数据的补全
        model.setOrderTime(new Date());// 系统当前时间
        model.setState(1); // 1:未付款 2:付款未发货 3:发货,没有确认收获 4:确认收获
        // 总计是购物车中的总计
        Cart cart = (Cart) ServletActionContext.getRequest().getSession()
                .getAttribute("cart");
        if (cart == null) {
            addActionMessage("亲!您还没有购物,请前去购物");
            return "msg";
        }
        model.setTotal(cart.getTotal());
        // 设置订单中的订单项
        // 订单项在购物车中
        for (CartItem cartItem : cart.getCartItems()) {
            // 订单项的信息从购物项获得的.
            OrderItem orderItem = new OrderItem();
            orderItem.setCount(cartItem.getCount());
            orderItem.setSubtotal(cartItem.getSubtotal());
            orderItem.setProduct(cartItem.getProduct());
            orderItem.setOrder(model);

            model.getOrderItems().add(orderItem);
        }
        // 设置订单关联的客户:
        User user = (User) ServletActionContext.getRequest().getSession()
                .getAttribute("user");
        if(user==null){
            addActionMessage("亲,您还未登录,请前去登录");
            return "loginUI";
        }
        model.setUser(user);

        orderService.save(model);
        // 2.将订单数据显示在页面
        return "saveSuccess";
    }

1.补全订单表:
(1)补全下单时间:model.setOrderTime(new Date());// 系统当前时间
(2)补全订单状态(1:未付款 2:付款未发货 3:发货,没有确认收获 4:确认收获),初始状态都是1:model.setState(1);
(3)订单的总金额就是购物车的总金额:怎么获得购物车信息?因为之前购物车存入到session中 ,所以直接从session中获得购物车:

Cart cart = (Cart) ServletActionContext.getRequest().getSession()
                .getAttribute("cart");
        if (cart == null) {
            addActionMessage("亲!您还没有购物,请前去购物");
            return "msg";
        }
        //设置总计
        model.setTotal(cart.getTotal());

(4)补全订单中的订单项(该订单项就是购物项),所以遍历购物车中的订单项项集合

for (CartItem cartItem : cart.getCartItems()) {
            // 订单项的信息从购物项获得的.
            OrderItem orderItem = new OrderItem();
            orderItem.setCount(cartItem.getCount());
            orderItem.setSubtotal(cartItem.getSubtotal());
            orderItem.setProduct(cartItem.getProduct());
            orderItem.setOrder(model);

            //把订单项放入订单中
            model.getOrderItems().add(orderItem);
        }

(5)订单所属用户:要想购物必须登录

User user = (User) ServletActionContext.getRequest().getSession()
                .getAttribute("user");
        if(user==null){
            addActionMessage("亲,您还未登录,请前去登录");
            return "loginUI";
        }
        model.setUser(user);

未登录则先去登录
(6)保存订单到数据库

orderService.save(model);
return "saveSuccess";

这里重点提一下
我们一点保存订单,同时也要把订单项进行保存,这就涉及到一个级联,设置订单配置文件的时候应该设置好级联,否则在你save订单的时候还得save订单项

<set name="orderItems" lazy="false" cascade="save-update">

以前曾用过级联删除,删除一个部门的时候同时删除这个部门的下级部门。用的是cascade="delete"
测试:
未登录添加购物车提交时会直接转到登录页面!ok
登录状态,提交订单,保存成功
订单表:

这里写图片描述

订单项表:

这里写图片描述

订单模块订单数据的显示

把订单对象现在在页面上,通过值栈进行显示。
(Order显示的对象就是模型驱动的使用的对象,就在栈顶,所以也不用把它再次放入值栈中)

    <s:iterator value="model.orderItems" var="item">
    <tr>
                            <td width="60"><input type="hidden" name="id" value="22" />
                                <img src="${ pageContext.request.contextPath }/<s:property value="#item.product.image" />" />
                            </td>
                            <td><a target="_blank"><s:property value="#item.product.pname" />
                            </a>
                            </td>
                            <td><s:property value="#item.product.shop_price" /></td>
                            <td class="quantity" width="60">
                            <input type="text"
                                name="count" value="1" maxlength="4" />
                                <div>
                                    <span class="increase">&nbsp;</span> <span class="decrease">&nbsp;</span>
                                </div>
                            </td>
                            <td width="140"><span class="subtotal">
                                <s:property value="#item.subtotal" />
                            </span>
                            </td>
                            <td><a href="./cart_removeCart.action?pid=1" class="delete">删除</a>
                            </td>
                        </tr>
                    </s:iterator>

用户信息:

<p>
                        收货地址:<input name="addr" type="text" value="<s:property value="model.user.addr" />" style="width:350px" />
                        <br /> 收货人&nbsp;&nbsp;&nbsp;:<input name="username" type="text"
                            value="<s:property value="model.user.name" />" style="width:150px" /> <br /> 联系方式:<input name="phone"
                            type="text" value="<s:property value="model.user.phone" />" style="width:150px" />

                    </p>

这里写图片描述

订单模块显示:
通过模型驱动的对象将数据传递到页面(值栈)

我的订单

这里写图片描述

根据用户id查询我的所有订单

<a href="${ pageContext.request.contextPath }/order_findMyOrders.do?
                myid=<s:property value="#session.user.uid"/>&page=1">我的订单</a>

属性驱动获得uid

    //接收page参数
    private int page ;
    //省略setter getter方法

findMyOrders方法:

// 通过用户id查询我的所有订单
    public String findMyOrders() {
        // 此用户id也可用从session中获取
        User user = (User) ServletActionContext.getRequest().getSession().getAttribute("user");
        long myid = user.getUid();
        PageBean<Order> pageBean = orderService.queryAllOrdersByMyId(myid,page);
        //保存到值栈
        ActionContext.getContext().getValueStack().set("pageBean", pageBean);
        return "findMyOrders";
    }

service层:queryAllOrdersByMyId

/***
     * 通过id
     * 
     * @param myid
     * @return
     */
    PageBean<Order> queryAllOrdersByMyId(long myid, int page);

实现类:

package com.shopping.order.service.impl;

import java.util.List;

import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.shopping.base.BaseDaoImpl;
import com.shopping.order.entity.Order;
import com.shopping.order.service.OrderService;
import com.shopping.utils.PageBean;

@Transactional
@Service
public class OrderServiceImpl extends BaseDaoImpl<Order> implements
        OrderService {

    @Override
    public PageBean<Order> queryAllOrdersByMyId(long myid, int page) {
        PageBean<Order> pageBean = new PageBean<Order>();
        // 每页显示的个数
        int limit = 5;
        pageBean.setLimit(limit);
        // 当前页
        pageBean.setPage(page);

        // 查询的总个数
        int totalCount = 0;
        totalCount = findCounts(myid);
        pageBean.setTotalCount(totalCount);

        // 设置总页数
        int totalPage = 0;
        if (totalCount % limit == 0) {
            totalPage = totalCount / limit;
        } else {
            totalPage = totalCount / limit + 1;
        }
        pageBean.setTotalPage(totalPage);

        // 设置返回的商品集合
        int begin = (page - 1) * limit;
        List<Order> list = queryAllOrders(myid, begin, limit);
        pageBean.setList(list);

        return pageBean;

    }

    @SuppressWarnings("unchecked")
    private List<Order> queryAllOrders(long myid, int begin, int limit) {
        List<Order> oList = sessionFactory.getCurrentSession()
                //按时间倒序排序
        .createQuery("from Order o where o.user.uid=? order by orderTime desc")
        .setParameter(0, myid)
        .setFirstResult(begin)
        .setMaxResults(limit)
        .list();
        if(oList!=null&&oList.size()>0){
            return oList; 
        }
        return null;
    }

    private int findCounts(long myid) {
        int count = sessionFactory.getCurrentSession()
        .createQuery("from Order o where o.user.uid=?")
        .setParameter(0, myid)
        .list().size();
        if(count>0){
            return count;
        }
        return 0;
    }

}

JSP:

<tbody>
                    <s:iterator var="order" value="pageBean.list">
                        <tr>
                            <th colspan="5">订单编号:<s:property value="#order.oid" />&nbsp;&nbsp;&nbsp;&nbsp;订单金额:<font
                                color="red"><s:property value="#order.total" />
                            </font>
                            &nbsp;&nbsp;&nbsp;&nbsp;<font color="red">
                                <s:if test="#order.state == 1">
                                    <a href="${ pageContext.request.contextPath }/order_findByOid.do?oid=<s:property value="#order.oid" />">付款</a>
                                </s:if>
                                <s:if test="#order.state == 2">
                                    已付款
                                </s:if>
                                <s:if test="#order.state == 3">
                                    <a href="${ pageContext.request.contextPath }/order_updateState.do?oid=<s:property value="#order.oid" />">确认收货</a>
                                </s:if>
                                <s:if test="#order.state == 4">
                                    交易成功
                                </s:if>
                            </font>
                            </th>
                        </tr>
                        <tr>
                            <th>图片</th>
                            <th>商品</th>
                            <th>价格</th>
                            <th>数量</th>
                            <th>小计</th>
                        </tr>
                        <s:iterator var="orderItem" value="#order.orderItems">
                            <tr>
                                <td width="60"><img
                                    src="${ pageContext.request.contextPath }/<s:property value="#orderItem.product.image"/>" />
                                </td>
                                <td><s:property value="#orderItem.product.pname" /></td>
                                <td><s:property value="#orderItem.product.shop_price" /></td>
                                <td class="quantity" width="60"><s:property
                                        value="#orderItem.count" /></td>
                                <td width="140"><span class="subtotal"><s:property
                                            value="#orderItem.subtotal" />
                                </span></td>
                            </tr>
                        </s:iterator>
                    </s:iterator>
                    <tr>
                        <th colspan="5">
                        <div class="pagination">
                            <span><s:property value="pageBean.page" />/<s:property
                                value="pageBean.totalPage" /></span>
                                <s:if test="pageBean.page != 1">
                                <a
                                    href="${ pageContext.request.contextPath }/order_findMyOrders.do?page=1"
                                    class="firstPage">&nbsp;</a>
                                <a
                                    href="${ pageContext.request.contextPath }/order_findMyOrders.do?page=<s:property value="pageBean.page-1"/>"
                                    class="previousPage">&nbsp;</a>
                            </s:if> <s:iterator var="i" begin="1" end="pageBean.totalPage">
                                <s:if test="pageBean.page != #i">
                                    <a
                                        href="${ pageContext.request.contextPath }/order_findMyOrders.do?page=<s:property value="#i"/>"><s:property
                                            value="#i" />
                                    </a>
                                </s:if>
                                <s:else>
                                    <span class="currentPage"><s:property value="#i" />
                                    </span>
                                </s:else>
                            </s:iterator> <s:if test="pageBean.page != pageBean.totalPage">
                                <a class="nextPage"
                                    href="${ pageContext.request.contextPath }/order_findByUid.action?page=<s:property value="pageBean.page+1"/>">&nbsp;</a>
                                <a class="lastPage"
                                    href="${ pageContext.request.contextPath }/order_findByUid.action?page=<s:property value="pageBean.totalPage"/>">&nbsp;</a>
                            </s:if>
                            </div>
                            </th>
                    </tr>
                </tbody>

订单模块根据订单编号查询订单

什么意思类?就是点击上面的付款,通过订单id查询此订单。
1.点击“付款”跳转到付款界面
2.通过订单id查询此订单

// 根据订单的ID查询订单
    public String findByOid() {
        //model在模型驱动中,在栈顶
        model = orderService.getById(model.getOid());
        return "findByOidSuccess";
    }
<!-- 订单模块 -->
        <action name="order_*" method="{1}" class="orderAction">
            <result name="saveSuccess">/WEB-INF/jsp/order.jsp</result>
            <result name="loginUI" type="redirectAction">
                <param name="actionName">user_loginUI</param>
            </result>
            <result name="msg" type="redirectAction">
                <param name="actionName">index_shopping</param>
            </result>
            <result name="findMyOrders">/WEB-INF/jsp/myOrderList.jsp</result>
            <result name="findByOidSuccess">/WEB-INF/jsp/order.jsp</result>
            <result name="deleteMyOrderSuccess" type="redirectAction">order_findMyOrders</result>
        </action>`这里写代码片`

OrderAction:

package com.shopping.order.action;

import java.util.Date;

import org.apache.struts2.ServletActionContext;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;

import com.opensymphony.xwork2.ActionContext;
import com.shopping.base.BaseAction;
import com.shopping.cart.entity.Cart;
import com.shopping.cart.entity.CartItem;
import com.shopping.order.entity.Order;
import com.shopping.order.entity.OrderItem;
import com.shopping.user.entity.User;
import com.shopping.utils.PageBean;

@SuppressWarnings("serial")
@Controller
@Scope("prototype")
public class OrderAction extends BaseAction<Order> {

    // 接收page参数
    private int page;

    public String saveOrder() {
        // System.out.println("order..");
        // 1.保存数据到数据库
        // 订单数据的补全
        model.setOrderTime(new Date());// 系统当前时间
        model.setState(1); // 1:未付款 2:付款未发货 3:发货,没有确认收获 4:确认收获
        // 总计是购物车中的总计
        Cart cart = (Cart) ServletActionContext.getRequest().getSession()
                .getAttribute("cart");
        if (cart == null) {
            addActionMessage("亲!您还没有购物,请前去购物");
            return "msg";
        }
        model.setTotal(cart.getTotal());
        // 设置订单中的订单项
        // 订单项在购物车中
        for (CartItem cartItem : cart.getCartItems()) {
            // 订单项的信息从购物项获得的.
            OrderItem orderItem = new OrderItem();
            orderItem.setCount(cartItem.getCount());
            orderItem.setSubtotal(cartItem.getSubtotal());
            orderItem.setProduct(cartItem.getProduct());
            orderItem.setOrder(model);
            // 把订单项放入订单中
            model.getOrderItems().add(orderItem);
        }
        // 设置订单关联的客户:
        User user = (User) ServletActionContext.getRequest().getSession()
                .getAttribute("user");
        if (user == null) {
            this.addActionMessage("亲,您还未登录,请前去登录");
            return "loginUI";
        }
        model.setUser(user);

        orderService.save(model);
        // 2.将订单数据显示在页面

        return "saveSuccess";
    }

    // 通过用户id查询我的所有订单
    public String findMyOrders() {
        // 此用户id也可用从session中获取
        User user = (User) ServletActionContext.getRequest().getSession()
                .getAttribute("user");
        long myid = user.getUid();
        PageBean<Order> pageBean = orderService
                .queryAllOrdersByMyId(myid, page);
        // 保存到值栈
        ActionContext.getContext().getValueStack().set("pageBean", pageBean);
        return "findMyOrders";
    }

    // 根据订单的ID查询订单
    public String findByOid() {
        //model在模型驱动中,在栈顶
        model = orderService.getById(model.getOid());
        return "findByOidSuccess";
    }

    //删除订单
    public String deleteMyOrder(){
        orderService.delete(model.getOid());
        return "deleteMyOrderSuccess";
    }


    public int getPage() {
        return page;
    }

    public void setPage(int page) {
        this.page = page;
    }

}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

购物商城shopping连载(11) 的相关文章

  • Spring Data Jpa之nativeQuery(仅案例

    Spring Data Jpa 默认实现是hibernate xff0c 我们都知道hibernate使用HQL查询 xff08 Hibernate是JPA的实现之一 xff09 xff0c 而不推荐使用sql查询 xff0c 因为这样子就
  • 消息代理RabbitMQ——介绍篇

    1消息队列概述 我们现在生活的是一个信息高质量高可用并且持久的一个时代 xff0c 作为技术开发人员 xff0c 我们造就的代码程序需要有能力以简单并且高效可靠的方式将信息传送给需要的接受者 更为重要的是我们要优化消息传递的方式 xff0c
  • Spring Cloud Stream中文翻译

    Ditmars RELEASE 1 Spring Cloud Stream 介绍 Spring Cloud Stream是一个用于构建消息驱动应用的微服务框架 Spring Cloud Stream基于Spring Boot来构建独立生产级
  • Spring Security Architecture翻译

    Spring Security 架构 本指南是Spring Security的入门 xff0c 致力于深入了解框架设计和基本构建块 虽然仅设计应用程序安全性的基础知识 xff0c 但是这样做可以清除开发人员使用Spring Security
  • Spring Boot and OAuth2翻译

    Spring Boot and OAuth2 本指南将向您展示如何使用OAuth2和Spring Boot构建一个使用 社交登录 功能做各种事情的应用程序示例 它从一个简单的单一提供者单点登录开始 xff0c 并运行一个带有身份验证提供程序
  • 实现线程安全的常见手段

    Thread safety 线程安全是我们设计一个类是必须考虑的问题 xff0c 在一些常用的工具类库上 xff0c 是否线程安全也会作为一个很重要的标注告诉使用者 常见的实现线程安全的手段有哪些呢 xff1f 无状态 即 xff0c 将接
  • 【ROM定制】Android 12 制作『MIUI官改』那点事④修改

    作者 xff1a 小谢 内容 xff1a MIUI官改 的修改 时间 xff1a 2022 10 14 机型 xff1a 小米10 安卓 xff1a Android 12 版本 xff1a V13 0 7 0稳定版 制作 MIUI官改 工具
  • ubuntu(17):ubuntu循环登录/无法进入图形化界面解决方法--因为系统内核版本冲突/不合适

    1 问题排查 2 查找合适内核 3 删除多余内核版本 删除启动项 3 1 删除内核 3 2 删除启动项 这一步没起作用 3 3 修改默认启动内核 参考链接 xff1a 1 问题排查 昨天重装了nvidia显卡驱动 开机后一直循环登录 xff
  • Android Studio targetApi=33 android 13 setAppCacheEnabled/setAppCachePath/setAppCacheMaxSize 报红问题探究

    报红如下 可以看到即使加了Api版本判断依然是报红的 编译后有如下类似错误提示 Launching lib main dart on sdk gphone64 arm64 in debug mode Users dararii Dev fl
  • MATLAB自适应中值滤波代码

    最近数字图像处理课程课后作业 xff0c 要求自己用代码实现自适应中值滤波器 xff0c 虽然很简单 xff0c 但是在网上找了一圈也没有可以直接拿来用的 xff0c 所以就在网上找了一段代码 xff0c 并且自己改了一下 xff0c 能够
  • VNC连接超时

    一 bug截图 二 原因分析 远程连接 远程连接是要提供地址的 xff0c 这里的地址是IP 43 桌面号 xff0c 比如 xff1a 192 168 1 23 2 随后提示你输入密码 xff0c 此密码就是刚才第1个步骤这是的密码 一般
  • WebApi 异常处理解决方案

    C 进阶系列 WebApi 异常处理解决方案 前端开发 waitig 1年前 2017 04 14 238 百度已收录 0评论 阅读目录 一 使用异常筛选器捕获所有异常 二 HttpResponseException自定义异常信息 三 返回
  • springboot applicaton.properties配置多种数据源

    html view plain copy print DB Connection Config DB Type the database of the application mysql sqlserver oracle databaseT
  • SpringBoot项目在IntelliJ IDEA中实现热部署

    spring boot devtools是一个为开发者服务的一个模块 xff0c 其中最重要的功能就是自动应用代码更改到最新的App上面去 原理是在发现代码有更改之后 xff0c 重新启动应用 xff0c 但是速度比手动停止后再启动更快 其
  • Spring Boot集成webService

    服务端 使用idea创建spring boot工程 xff1a File New Project Spring Initializr 在pom添加依赖 span class hljs tag span class hljs tag lt s
  • spring boot整合OAuth2保证api接口安全

    1 OAuth 概念 OAuth 是一个开放标准 xff0c 允许用户让第三方应用访问该用户在某一网站上存储的私密的资源 xff08 如照片 xff0c 视频 xff0c 联系人列表 xff09 xff0c 而不需要将用户名和密码提供给第三
  • 软件项目的开发流程

    一个软件开发项目过程 xff1a 1 项目启动 1 项目组成立 公司成员 客户成员 2 制定项目预期目标 3 制定项目计划周期 4 建立好项目组成员沟通机制 2 需求调研 1 创建调研计划 协调调研时间 2 收集客户资料 xff0c 获取客

随机推荐

  • asp、jsp与html+ajax优缺比较

    我对jsp和ajax 一直比较困惑 xff0c jsp动态网页技术 xff0c 在服务器端执行 xff0c 能在网页中显示数据这是一种方式 另一种方式是 我打开一个网页 xff08 html xff09 xff0c 加载完成之后 xff0c
  • < Linux > 多线程(生产者消费者模型)

    目录 1 生产者消费者模型 生产者消费者模型的例子 生产者消费者模型的特点 生产者消费者模型的优点 2 基于BlockingQueue的生产者消费者模型 概念 模拟实现基于阻塞队列的生产消费模型 基于计算任务的生产者消费者模型 xff08
  • 分布式秒杀系统限流

    前言 俗话说的好 xff0c 冰冻三尺非一日之寒 xff0c 滴水穿石非一日之功 xff0c 罗马也不是一天就建成的 两周前秒杀案例初步成型 xff0c 分享到了中国最大的同性交友网站 码云 同时也收到了不少小伙伴的建议和投诉 我从不认为分
  • centos下使用docker安装tomcat部署Javaweb项目

    主要步骤 安装docker 卸载旧版本docker 如果centos系统中存在老版本的docker xff0c 可以先卸载掉旧版本的docker xff0c 再安装新版本docker yum remove docker docker com
  • Dockerfile指令介绍

    Docker通过对于在Dockerfile中的一系列指令的顺序解析实现自动的image的构建 通过使用build命令 xff0c 根据Dockerfiel的描述来构建镜像 通过源代码路径的方式 通过标准输入流的方式 通过源代码路径 Dock
  • redis面试知识点

    Redis在互联网技术存储方面使用如此广泛 xff0c 几乎所有的后端技术面试官都要在Redis的使用和原理方面对小伙伴们进行各种刁难 作为一名在互联网技术行业打击过成百上千名 请允许我夸张一下 的资深技术面试官 xff0c 看过了无数落寞
  • Redis分布式锁

    前言 分布式锁一般有三种实现方式 xff1a 1 数据库乐观锁 xff1b 2 基于Redis的分布式锁 xff1b 3 基于ZooKeeper的分布式锁 本篇博客将介绍第二种方式 xff0c 基于Redis实现分布式锁 虽然网上已经有各种
  • SpringCloud全套教程

    https gitee com didispace SpringCloud Learning
  • docker远程连接配置

    在开发的时候 xff0c 我们进程需要用到docker 但很多时候我们用的是window作为开发平台 xff0c 虽然Docker也有window版本的 但window的DockerToolbox是一款不是很成熟的产品 xff0c 有很多小
  • 单相逆变器及基于STM32 SPWM生成代码

    2022 4 26更新 若需商业合作可私聊留VX号 xff0c 博主看到后会添加的 最近在做单相逆变器 xff0c 用篇文章来记录 主电路采用H桥 xff0c 使用IR2104半桥驱动内置630ns死区 xff0c 上管采用自举电容浮地驱动
  • 20200329 百度 测试开发实习 笔试题

    20200329 百度 测试开发实习 笔试题 第一题题目描述 xff1a 输入输出样例输入样例输出提示 第二题题目描述 xff1a 输入输出样例输入样例输出 第一题 题目描述 xff1a 桌子上放着N枚硬币 xff0c 将其从1到N编号 x
  • 《Linux就该这么学》第1章 部署虚拟环境安装Linux系统

    Linux就该这么学 第1章 部署虚拟环境安装Linux系统 目录 常见的Linux系统版本 安装配置VM虚拟机 安装Linux系统 RPM xff08 红帽软件包管理器 xff09 Yum软件仓库 systemd初始化进程 需要长期稳定运
  • 辛勤劳作

    本文只有在12月27日可以学习到 我对敬业的体会是 xff1a 正在从事的工作就是自己的生命 xff0c 它意味着每周7天 xff0c 每年52周一心扑在上面 写下上面这句话 xff0c 我的泪水差一点儿就涌了出来 14年的寿险生涯 xff
  • RocketMQ

    1 主题中存在多个队列 xff0c 生产者向主题中指定的队列发送消息 2 在集群模式下 xff0c 一个消费者集群共同消费一个主题中的多个队列 xff0c 但一个队列只会被一个消费者消费 在广播模式下 xff0c 会被订阅主题的所有消费者消
  • 记一次Gradle搭建多模块项目遇到的问题

    前言 最开始 xff0c 我创建了一个空的项目 xff0c 并在该项目下依次创建了3个模块 但是我发现 xff0c 这几个模块引入的依赖绝大多数都是相同的 于是 xff0c 我灵光一闪 xff08 其实是在最初构建项目时的没想到 xff09
  • springboot 项目访问controller没有进入拦截器

    在项目中新写了一个校验token是否存在的拦截器之后 xff0c 编译和启动都没有问题 直到访问方法的时候发现并没有进入这个拦截器 后来发现是因为springboot在启动之后 xff0c 启动类只会扫描启动类所在的包下的方法 解决方法就是
  • leetcode 1170. 比较字符串最小字母出现频次(C++)

    我们来定义一个函数 f s xff0c 其中传入参数 s 是一个非空字符串 xff1b 该函数的功能是统计 s 中 xff08 按字典序比较 xff09 最小字母的出现频次 例如 xff0c 若 s 61 34 dcce 34 xff0c
  • maven私库nexus2.11.4迁移升级到nexus3.12.0

    https www cnblogs com liangyou666 p 9439755 html nexus简介 nexus是一个强大的maven仓库管理器 它极大的简化了本地内部仓库的维护和外部仓库的访问 nexus是一套开箱即用的系统不
  • Linux安装JDK8详细图文教程

    第一步 获取JDK文件 JDK下载包 xff1a 直接进入 如果跳转登录页面 xff0c 注册一个账号登录即可 登录过后文件就下载完成 第二步 上传JDK到服务器 1 创建JDK目录 span class token function mk
  • 购物商城shopping连载(11)

    订单模块类创建及配置 购物完成之后 xff0c 提交订单 xff0c 生成一个订单 订单表和商品的关系 xff1a 订单和商品的关系是多对多 xff0c 一个订单可以有多个商品 xff0c 一个商品可以属于多个订单 如果是多对多的关系 xf