基于SSM框架的在线美甲商城销售系统 - 源码深度解析

JavaJavaScriptHTMLCSSSSM框架MySQL
2026-02-0813 浏览

文章摘要

基于SSM框架的在线美甲商城销售系统是一个整合了美甲产品展示、在线交易与后台管理的综合性电子商务平台。其核心业务价值在于解决了传统美甲产品零售渠道单一、信息不透明以及顾客选购不便的行业痛点。系统通过构建一个集中的线上商城,使美甲师、品牌方或零售商能够高效地管理商品库存、处理订单,并为终端消费者提供便...

在美妆行业数字化转型的浪潮中,专业美甲产品的线上销售与服务平台成为连接品牌商、美甲师与终端消费者的重要桥梁。该系统采用成熟的SSM(Spring + Spring MVC + MyBatis)技术架构,构建了一个集商品展示、在线交易、库存管理和订单处理于一体的综合性电商平台,为美甲行业提供专业化的数字解决方案。

系统架构与技术栈设计

该平台采用经典的三层架构模式,通过SSM框架实现各层之间的松耦合设计。Spring框架作为核心控制容器,管理着所有业务组件的生命周期和依赖关系,通过声明式事务管理确保数据操作的原子性。Spring MVC模块负责Web请求的调度与响应,采用前端控制器模式统一处理HTTP请求,通过注解驱动的控制器简化开发流程。持久层使用MyBatis框架,通过XML映射文件实现对象关系映射,提供灵活的SQL定制能力。

技术栈配置体现了企业级应用的标准规范:

<!-- Spring核心配置示例 -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
    <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
    <property name="url" value="jdbc:mysql://localhost:3306/nail_db"/>
    <property name="username" value="root"/>
    <property name="password" value="123456"/>
</bean>

<tx:advice id="txAdvice" transaction-manager="transactionManager">
    <tx:attributes>
        <tx:method name="save*" propagation="REQUIRED"/>
        <tx:method name="update*" propagation="REQUIRED"/>
        <tx:method name="delete*" propagation="REQUIRED"/>
    </tx:attributes>
</tx:advice>

前端采用JSP+JSTL技术组合,配合JavaScript实现动态交互效果,CSS确保界面风格统一美观。整个系统支持RESTful风格的API设计,为未来移动端扩展预留接口。

数据库架构深度解析

系统数据库设计充分考虑了美甲行业的业务特性,通过11张核心表构建完整的数据模型。以下重点分析几个关键表的设计亮点:

美甲商品表(meijia)采用纵向扩展设计

CREATE TABLE `meijia` (
  `meijiaid` varchar(255) NOT NULL COMMENT '美甲ID',
  `meijianame` varchar(255) DEFAULT NULL COMMENT '美甲名称',
  `image` varchar(255) DEFAULT NULL COMMENT '图片',
  `cateid` varchar(255) DEFAULT NULL COMMENT '分类ID',
  `price` varchar(255) DEFAULT NULL COMMENT '价格',
  `recommend` varchar(255) DEFAULT NULL COMMENT '推荐',
  `thestart` varchar(255) DEFAULT NULL COMMENT '开始时间',
  `theend` varchar(255) DEFAULT NULL COMMENT '结束时间',
  `hits` varchar(255) DEFAULT NULL COMMENT '点击量',
  `sellnum` varchar(255) DEFAULT NULL COMMENT '销售数量',
  `contents` varchar(6000) DEFAULT NULL COMMENT '内容',
  PRIMARY KEY (`meijiaid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='美甲表'

该表设计具有以下技术特色:

  • 使用varchar(255)作为主键类型,采用"A"+时间戳的定制化ID生成策略,确保分布式环境下的唯一性
  • contents字段设置为varchar(6000),满足商品详细描述和HTML富文本内容的存储需求
  • 设置recommend字段实现商品推荐功能,通过布尔值标记热门商品
  • 通过hits和sellnum字段实现商品热度统计,为推荐算法提供数据支持

配货点表(peihuo)体现O2O业务模式

CREATE TABLE `peihuo` (
  `peihuoid` varchar(255) NOT NULL COMMENT '配货点ID',
  `peihuoname` varchar(255) DEFAULT NULL COMMENT '配货点名称',
  `cityid` varchar(255) DEFAULT NULL COMMENT '城市ID',
  `address` varchar(255) DEFAULT NULL COMMENT '地址',
  `contact` varchar(255) DEFAULT NULL COMMENT '联系方式',
  `memo` varchar(255) DEFAULT NULL COMMENT '备注',
  PRIMARY KEY (`peihuoid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='配货点表'

该表支持多城市配送体系,通过cityid与城市表关联,实现基于地理位置的库存管理和配送路线优化。memo字段为运营人员提供灵活的备注空间,记录特殊配送要求或营业时间等信息。

分类表(cate)采用树形结构设计

CREATE TABLE `cate` (
  `cateid` varchar(255) NOT NULL COMMENT '分类ID',
  `catename` varchar(255) DEFAULT NULL COMMENT '分类名称',
  `memo` varchar(255) DEFAULT NULL COMMENT '备注',
  `addtime` varchar(255) DEFAULT NULL COMMENT '添加时间',
  PRIMARY KEY (`cateid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='分类表'

通过简单的平面结构实现分类管理,支持美甲产品按功能、款式、品牌等多维度分类。addtime字段记录分类创建时间,便于分析商品品类的发展趋势。

数据库结构

核心业务功能实现

商品管理与展示模块

商品管理模块采用MVC模式实现,控制器层处理前端请求,服务层实现业务逻辑,数据访问层操作数据库。

商品实体类设计体现业务对象完整性

@Entity
@Table(name = "meijia")
public class Meijia {
    private String meijiaid;
    private String meijianame;
    private String image;
    private String cateid;
    private String price;
    private String recommend;
    private String thestart;
    private String theend;
    private String hits;
    private String sellnum;
    private String contents;
    
    // Getter和Setter方法
    @Id
    public String getMeijiaid() {
        return meijiaid;
    }
    
    public void setMeijiaid(String meijiaid) {
        this.meijiaid = meijiaid;
    }
    
    // 其他属性的Getter和Setter...
}

商品服务层实现复杂的业务逻辑

@Service
public class MeijiaService {
    
    @Autowired
    private MeijiaMapper meijiaMapper;
    
    public List<Meijia> getRecommendedProducts(int limit) {
        Map<String, Object> params = new HashMap<>();
        params.put("recommend", "1"); // 推荐商品
        params.put("limit", limit);
        return meijiaMapper.selectByCondition(params);
    }
    
    public PageInfo<Meijia> getProductsByCategory(String cateid, int pageNum, int pageSize) {
        PageHelper.startPage(pageNum, pageSize);
        List<Meijia> products = meijiaMapper.selectByCateId(cateid);
        return new PageInfo<>(products);
    }
    
    public void updateProductHits(String meijiaid) {
        Meijia product = meijiaMapper.selectById(meijiaid);
        if (product != null) {
            int hits = Integer.parseInt(product.getHits()) + 1;
            product.setHits(String.valueOf(hits));
            meijiaMapper.update(product);
        }
    }
}

美甲产品管理

购物车与订单处理系统

购物车模块采用Session与数据库结合的方式,实现用户登录状态的购物车持久化。

购物车控制器处理复杂的业务交互

@Controller
@RequestMapping("/cart")
public class CartController {
    
    @Autowired
    private CartService cartService;
    
    @Autowired
    private ProductService productService;
    
    @PostMapping("/add")
    @ResponseBody
    public ResponseEntity<?> addToCart(@RequestParam String productId, 
                                      @RequestParam Integer quantity,
                                      HttpSession session) {
        try {
            User user = (User) session.getAttribute("currentUser");
            if (user == null) {
                return ResponseEntity.status(HttpStatus.UNAUTHORIZED).body("请先登录");
            }
            
            Product product = productService.getProductById(productId);
            if (product == null) {
                return ResponseEntity.badRequest().body("商品不存在");
            }
            
            CartItem cartItem = new CartItem();
            cartItem.setUserId(user.getUserid());
            cartItem.setProductId(productId);
            cartItem.setQuantity(quantity);
            cartItem.setUnitPrice(new BigDecimal(product.getPrice()));
            cartItem.setTotalPrice(cartItem.getUnitPrice().multiply(new BigDecimal(quantity)));
            
            cartService.addToCart(cartItem);
            
            return ResponseEntity.ok("添加成功");
        } catch (Exception e) {
            return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("系统错误");
        }
    }
    
    @GetMapping("/items")
    public String viewCart(Model model, HttpSession session) {
        User user = (User) session.getAttribute("currentUser");
        if (user != null) {
            List<CartItem> cartItems = cartService.getCartItemsByUser(user.getUserid());
            model.addAttribute("cartItems", cartItems);
            
            BigDecimal totalAmount = cartItems.stream()
                .map(CartItem::getTotalPrice)
                .reduce(BigDecimal.ZERO, BigDecimal::add);
            model.addAttribute("totalAmount", totalAmount);
        }
        return "cart/view";
    }
}

添加到购物车

用户管理与权限控制

系统采用基于角色的访问控制(RBAC)模型,区分管理员和普通用户权限。

管理员实体类设计

public class Admin {
    private String adminid = "A" + VeDate.getStringId();
    private String username;
    private String password;
    private String realname;
    private String contact;
    private String addtime;

    public String getAdminid() {
        return adminid;
    }

    public void setAdminid(String adminid) {
        this.adminid = adminid;
    }

    public String getUsername() {
        return this.username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    // 其他Getter和Setter方法...
    
    /**
     * 密码加密方法
     */
    public void encryptPassword() {
        this.password = DigestUtils.md5DigestAsHex(this.password.getBytes());
    }
    
    /**
     * 验证密码
     */
    public boolean validatePassword(String inputPassword) {
        String encryptedInput = DigestUtils.md5DigestAsHex(inputPassword.getBytes());
        return this.password.equals(encryptedInput);
    }
}

Spring Security配置实现安全控制

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    
    @Autowired
    private AdminDetailsService adminDetailsService;
    
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
            .antMatchers("/admin/**").hasRole("ADMIN")
            .antMatchers("/user/**").hasAnyRole("USER", "ADMIN")
            .antMatchers("/public/**").permitAll()
            .anyRequest().authenticated()
            .and()
            .formLogin()
            .loginPage("/login")
            .defaultSuccessUrl("/dashboard")
            .permitAll()
            .and()
            .logout()
            .logoutSuccessUrl("/login")
            .permitAll();
    }
    
    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.userDetailsService(adminDetailsService)
            .passwordEncoder(passwordEncoder());
    }
    
    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }
}

管理员登录

订单管理与配送系统

订单处理模块实现从下单到配送的完整业务流程,支持多配货点库存管理。

订单服务类实现复杂的业务规则

@Service
public class OrderService {
    
    @Autowired
    private OrderMapper orderMapper;
    
    @Autowired
    private InventoryService inventoryService;
    
    @Transactional
    public Order createOrder(Order order, List<OrderItem> items) {
        // 验证库存
        for (OrderItem item : items) {
            boolean available = inventoryService.checkInventory(
                item.getProductId(), item.getQuantity(), order.getPeihuoid());
            if (!available) {
                throw new InventoryException("商品库存不足");
            }
        }
        
        // 生成订单号
        order.setOrderId(generateOrderId());
        order.setCreateTime(new Date());
        order.setStatus("待付款");
        
        // 保存订单
        orderMapper.insert(order);
        
        // 保存订单项
        for (OrderItem item : items) {
            item.setOrderId(order.getOrderId());
            orderMapper.insertItem(item);
            
            // 预占库存
            inventoryService.reserveInventory(
                item.getProductId(), item.getQuantity(), order.getPeihuoid());
        }
        
        return order;
    }
    
    private String generateOrderId() {
        return "ORD" + System.currentTimeMillis() + 
               String.format("%04d", new Random().nextInt(10000));
    }
}

订单管理

实体模型设计与数据持久化

系统采用领域驱动设计(DDD)思想,通过实体类准确反映业务概念。MyBatis的映射文件实现对象与关系的精确映射。

MyBatis映射文件配置示例

<!-- MeijiaMapper.xml -->
<mapper namespace="com.mapper.MeijiaMapper">
    
    <resultMap id="MeijiaResultMap" type="com.entity.Meijia">
        <id property="meijiaid" column="meijiaid"/>
        <result property="meijianame" column="meijianame"/>
        <result property="image" column="image"/>
        <result property="cateid" column="cateid"/>
        <result property="price" column="price"/>
        <result property="recommend" column="recommend"/>
        <result property="thestart" column="thestart"/>
        <result property="theend" column="theend"/>
        <result property="hits" column="hits"/>
        <result property="sellnum" column="sellnum"/>
        <result property="contents" column="contents"/>
    </resultMap>
    
    <select id="selectByCondition" parameterType="map" resultMap="MeijiaResultMap">
        SELECT * FROM meijia 
        <where>
            <if test="cateid != null">AND cateid = #{cateid}</if>
            <if test="recommend != null">AND recommend = #{recommend}</if>
            <if test="keyword != null">AND meijianame LIKE CONCAT('%', #{keyword}, '%')</if>
        </where>
        ORDER BY 
        <choose>
            <when test="sort == 'price_asc'">price ASC</when>
            <when test="sort == 'price_desc'">price DESC</when>
            <when test="sort == 'hits'">hits DESC</when>
            <when test="sort == 'sellnum'">sellnum DESC</when>
            <otherwise>addtime DESC</otherwise>
        </choose>
        <if test="limit != null">LIMIT #{limit}</if>
    </select>
    
    <update id="updateHits" parameterType="string">
        UPDATE meijia SET hits = hits + 1 WHERE meijiaid = #{meijiaid}
    </update>
    
</mapper>

系统优化与功能拓展方向

基于当前系统架构,以下优化方向可进一步提升平台性能和用户体验:

1. 缓存策略优化

引入Redis作为分布式缓存,减轻数据库压力:

@Service
public class ProductServiceWithCache {
    
    @Autowired
    private RedisTemplate<String, Object> redisTemplate;
    
    @Autowired
    private MeijiaMapper meijiaMapper;
    
    private static final String PRODUCT_CACHE_KEY = "product:";
    private static final long CACHE_EXPIRE_TIME = 3600; // 1小时
    
    public Meijia getProductByIdWithCache(String productId) {
        String cacheKey = PRODUCT_CACHE_KEY + productId;
        Meijia product = (Meijia) redisTemplate.opsForValue().get(cacheKey);
        
        if (product == null) {
            product = meijiaMapper.selectById(productId);
            if (product != null) {
                redisTemplate.opsForValue().set(cacheKey, product, CACHE_EXPIRE_TIME, TimeUnit.SECONDS);
            }
        }
        return product;
    }
}

2. 异步处理与消息队列

使用RabbitMQ处理高并发订单和消息通知:

@Component
public class OrderMessageProducer {
    
    @Autowired
    private RabbitTemplate rabbitTemplate;
    
    public void sendOrderCreatedMessage(Order order) {
        OrderMessage message = new OrderMessage();
        message.setOrderId(order.getOrderId());
        message.setUserId(order.getUserId());
        message.setTotalAmount(order.getTotalAmount());
        message.setTimestamp(new Date());
        
        rabbitTemplate.convertAndSend("order.exchange", "order.created", message);
    }
}

@Component
public class OrderMessageConsumer {
    
    @RabbitListener(queues = "order.created.queue")
    public void handleOrderCreated(OrderMessage message) {
        // 发送邮件通知
        emailService.sendOrderConfirmation(message);
        // 更新库存
        inventoryService.updateInventory(message);
        // 记录日志
        logService.logOrderEvent(message);
    }
}

3. 微服务架构改造

将单体应用拆分为微服务集群:

# docker-compose.yml 微服务配置示例
version: '3.8'
services:
  user-service:
    image: nailmall/user-service:1.0
    ports:
      - "8081:8080"
    environment:
      - SPRING_PROFILES_ACTIVE=prod
      - EUREKA_SERVER=http://discovery:
本文关键词
SSM框架在线美甲商城销售系统源码解析MyBatis

上下篇

上一篇
没有更多文章
下一篇
没有更多文章