Java Web开发实战与项目——开发一个简单的在线商城
开发一个简单的在线商城系统,涉及到许多关键的技术点和功能模块,包括用户管理、商品展示、购物车功能以及订单处理等。本章将详细讲解如何规划和开发这些功能模块,并提供具体的技术方案和代码示例。
1. 项目结构与功能规划
在开始开发之前,首先需要明确项目的结构和功能规划。一个典型的在线商城项目可以包含以下模块和功能:
- 用户模块:实现用户的注册、登录、身份验证等。
 - 商品模块:展示商品信息、商品分类、商品搜索等功能。
 - 购物车模块:让用户能够选择商品并添加到购物车。
 - 订单模块:管理用户下单、支付、订单状态等。
 
1.1 项目结构设计
根据上述功能需求,我们可以将项目分成以下几个主要模块:
- Controller层:处理HTTP请求,返回相应视图或数据。
 - Service层:封装业务逻辑,进行数据库操作。
 - DAO层:负责数据库的交互,包括数据的增、删、改、查操作。
 - Model层:定义项目中的实体类。
 - Web层:处理前端展示和模板渲染。
 
项目的基本目录结构可以如下所示:
/src/main/java/com/onlinestore
    ├── controller       // 控制器层,处理请求
    ├── model            // 实体类,数据库映射
    ├── service          // 服务层,封装业务逻辑
    ├── dao              // 数据访问层,执行SQL操作
    ├── config           // 配置类,配置Spring、数据库等
    └── Application.java // 主应用启动类
/src/main/resources
    ├── templates        // Thymeleaf模板文件
    ├── application.properties // 配置文件
    └── static           // 静态资源,如CSS、JS、图片等 
1.2 功能规划
-  
用户注册与登录:
- 用户可以注册一个新账户,输入邮箱、用户名、密码等信息。
 - 用户登录后可以进入商城首页并管理自己的账户信息。
 - 用户的密码存储采用加密存储,如使用Spring Security的
BCryptPasswordEncoder。 
 -  
购物车功能:
- 用户可以将商品添加到购物车,并能修改商品数量或删除商品。
 - 购物车可以显示商品总价、商品数量等信息。
 
 -  
商品管理与订单处理:
- 商城系统应当展示商品列表,支持商品的查看、搜索、分类。
 - 用户可以将商品添加到购物车并提交订单。
 - 订单提交后会生成订单号,并发送给用户确认。
 
 
2. 实现用户注册、登录与购物车功能
2.1 用户注册与登录
在Spring Boot中实现用户注册与登录,可以使用Spring Security进行用户认证与授权。
首先,添加必要的依赖:
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-core</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-web</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-config</artifactId>
</dependency> 
用户实体类 (User.java):
@Entity
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String username;
    private String email;
    private String password;
    // getters and setters
} 
用户注册Controller (UserController.java):
@Controller
@RequestMapping("/user")
public class UserController {
    
    @Autowired
    private UserService userService;
    @PostMapping("/register")
    public String registerUser(@RequestParam String username, @RequestParam String email, @RequestParam String password) {
        userService.register(username, email, password);
        return "redirect:/login";
    }
} 
用户Service层 (UserService.java):
@Service
public class UserService {
    @Autowired
    private UserRepository userRepository;
    @Autowired
    private BCryptPasswordEncoder passwordEncoder;
    public void register(String username, String email, String password) {
        User user = new User();
        user.setUsername(username);
        user.setEmail(email);
        user.setPassword(passwordEncoder.encode(password)); // 密码加密存储
        userRepository.save(user);
    }
    public User findByUsername(String username) {
        return userRepository.findByUsername(username);
    }
} 
Spring Security配置 (SecurityConfig.java):
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    @Autowired
    private UserService userService;
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .authorizeRequests()
                .antMatchers("/login", "/register").permitAll()
                .anyRequest().authenticated()
            .and()
            .formLogin()
                .loginPage("/login")
                .permitAll()
            .and()
            .logout().permitAll();
    }
    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.userDetailsService(username -> new UserPrincipal(userService.findByUsername(username)));
    }
} 
2.2 购物车功能
购物车可以作为一个Cart实体类来实现。购物车可以存储商品信息、商品数量和小计。
购物车实体类 (Cart.java):
public class Cart {
    private List<CartItem> items = new ArrayList<>();
    public void addItem(Product product, int quantity) {
        CartItem item = new CartItem(product, quantity);
        items.add(item);
    }
    // 计算总价
    public double getTotalPrice() {
        return items.stream()
            .mapToDouble(item -> item.getProduct().getPrice() * item.getQuantity())
            .sum();
    }
}
public class CartItem {
    private Product product;
    private int quantity;
    public CartItem(Product product, int quantity) {
        this.product = product;
        this.quantity = quantity;
    }
    // getters and setters
} 
购物车Controller (CartController.java):
@Controller
@RequestMapping("/cart")
public class CartController {
    @Autowired
    private ProductService productService;
    @ModelAttribute("cart")
    public Cart getCart() {
        return new Cart();
    }
    @PostMapping("/add")
    public String addToCart(@RequestParam Long productId, @RequestParam int quantity, @ModelAttribute("cart") Cart cart) {
        Product product = productService.findById(productId);
        cart.addItem(product, quantity);
        return "redirect:/cart";
    }
    @GetMapping
    public String viewCart() {
        return "cart";
    }
} 
2.3 前端显示购物车
在Thymeleaf模板中,可以通过以下方式展示购物车内容:
<h1>购物车</h1>
<table>
    <thead>
        <tr>
            <th>商品名称</th>
            <th>数量</th>
            <th>单价</th>
            <th>小计</th>
        </tr>
    </thead>
    <tbody>
        <tr th:each="item : ${cart.items}">
            <td th:text="${item.product.name}"></td>
            <td th:text="${item.quantity}"></td>
            <td th:text="${item.product.price}"></td>
            <td th:text="${item.product.price * item.quantity}"></td>
        </tr>
    </tbody>
</table> 
3. 商品管理与订单处理
3.1 商品管理
商品可以由后台管理员进行管理,管理员能够增、删、改、查商品。商品管理界面可以通过Spring Boot与Thymeleaf结合实现。
商品实体类 (Product.java):
@Entity
public class Product {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;
    private double price;
    private String description;
    private String imageUrl;
    // getters and setters
} 
商品Controller (ProductController.java):
@Controller
@RequestMapping("/product")
public class ProductController {
    @Autowired
    private ProductService productService;
    @GetMapping("/list")
    public String listProducts(Model model) {
        List<Product> products = productService.findAll();
        model.addAttribute("products", products);
        return "product-list";
    }
} 
3.2 订单处理
订单的创建涉及到购物车的结算、生成订单、更新库存等操作。订单创建后应生成唯一的订单号,并存储在数据库中。
订单实体类 (Order.java):
@Entity
public class Order {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String orderNumber;
    private double totalAmount;
    private OrderStatus status;
    @OneToMany(mappedBy = "order")
    private List<OrderItem> items;
    // getters and setters
} 
订单Service (OrderService.java):
@Service
public class OrderService {
    @Autowired
    private OrderRepository orderRepository;
    @Autowired
    private ProductService productService;
    public Order createOrder(Cart cart) {
        Order order = new Order();
        order.setOrderNumber(generateOrderNumber());
        order.setTotalAmount(cart.getTotalPrice());
        for (CartItem cartItem : cart.getItems()) {
            OrderItem orderItem = new OrderItem();
            orderItem.setProduct(cartItem.getProduct());
            orderItem.setQuantity(cartItem.getQuantity());
            orderItem.setOrder(order);
            order.getItems().add(orderItem);
        }
        return orderRepository.save(order);
    }
    private String generateOrderNumber() {
        return "ORD" + System.currentTimeMillis();
    }
} 
这些代码和设计是商城开发的基础,你可以根据实际需求对项目进行扩展,加入更多的功能如支付系统、商品评论、库存管理等。
关于作者:
15年互联网开发、带过10-20人的团队,多次帮助公司从0到1完成项目开发,在TX等大厂都工作过。当下为退役状态,写此篇文章属个人爱好。本人开发期间收集了很多开发课程等资料,需要可联系我

