基于SSM框架的社区化药品销售平台 - 源码深度解析

JavaJavaScriptMavenHTMLCSSSSM框架MySQL
2026-02-244 浏览

文章摘要

本项目是一款基于SSM(Spring+SpringMVC+MyBatis)框架构建的社区化药品销售平台,旨在为消费者提供一个集药品在线购买与健康交流于一体的综合性服务空间。 在核心业务价值层面,平台精准解决了传统线上药房功能单一、缺乏用户互动与信任构建的痛点。它不仅提供了标准化的药品搜索、详情展示...

在医药电商领域,单纯的商品交易平台已难以满足用户日益增长的深度健康服务需求。一款集在线购药与健康互动于一体的综合性服务平台应运而生,它基于成熟的SSM技术栈构建,实现了药品销售与社区交流的无缝融合。

技术架构深度解析

该平台采用经典的三层架构模式,每一层都承担着明确的职责。表现层由SpringMVC框架主导,通过@Controller注解优雅地处理HTTP请求,并利用拦截器实现统一的权限验证。以下是一个典型的药品查询控制器实现:

@Controller
@RequestMapping("/drug")
public class DrugController {
    
    @Autowired
    private DrugService drugService;
    
    @RequestMapping("/list")
    public String listDrugs(@RequestParam Map<String, Object> params, 
                           Model model) {
        PageInfo<Drug> pageInfo = drugService.findByPage(params);
        model.addAttribute("pageInfo", pageInfo);
        model.addAttribute("params", params);
        return "drug/list";
    }
    
    @RequestMapping("/detail/{id}")
    public String drugDetail(@PathVariable("id") Integer id, Model model) {
        Drug drug = drugService.findById(id);
        model.addAttribute("drug", drug);
        return "drug/detail";
    }
}

业务逻辑层基于Spring框架的IoC容器管理各种Service组件,通过声明式事务管理确保数据一致性。核心的药品服务实现如下:

@Service
@Transactional
public class DrugServiceImpl implements DrugService {
    
    @Autowired
    private DrugMapper drugMapper;
    
    @Override
    public PageInfo<Drug> findByPage(Map<String, Object> params) {
        PageHelper.startPage(Integer.parseInt(params.get("pageNum").toString()), 
                           Integer.parseInt(params.get("pageSize").toString()));
        List<Drug> drugs = drugMapper.selectByConditions(params);
        return new PageInfo<>(drugs);
    }
    
    @Override
    public Drug findById(Integer id) {
        return drugMapper.selectByPrimaryKey(id);
    }
}

数据持久层采用MyBatis框架,通过XML映射文件实现灵活的数据库操作。以下是药品多条件查询的SQL映射配置:

<mapper namespace="com.pharmacy.mapper.DrugMapper">
    
    <select id="selectByConditions" parameterType="map" resultMap="BaseResultMap">
        SELECT * FROM t_drug
        <where>
            <if test="categoryId != null">
                AND category_id = #{categoryId}
            </if>
            <if test="keyword != null and keyword != ''">
                AND (name LIKE CONCAT('%', #{keyword}, '%') 
                     OR description LIKE CONCAT('%', #{keyword}, '%'))
            </if>
            <if test="minPrice != null">
                AND price >= #{minPrice}
            </if>
            <if test="maxPrice != null">
                AND price <= #{maxPrice}
            </if>
            <if test="status != null">
                AND status = #{status}
            </if>
        </where>
        ORDER BY create_time DESC
    </select>
</mapper>

数据库设计精要分析

平台数据库包含10个核心表,设计体现了高度的规范性和业务贴合度。用户表的设计不仅包含基本身份信息,还集成了社区互动所需的扩展字段:

CREATE TABLE t_user (
    id INT PRIMARY KEY AUTO_INCREMENT,
    username VARCHAR(50) UNIQUE NOT NULL,
    password VARCHAR(100) NOT NULL,
    email VARCHAR(100),
    phone VARCHAR(20),
    avatar VARCHAR(200),
    level TINYINT DEFAULT 1 COMMENT '用户等级',
    experience INT DEFAULT 0 COMMENT '社区经验值',
    status TINYINT DEFAULT 1,
    create_time DATETIME DEFAULT CURRENT_TIMESTAMP,
    update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);

订单表的设计巧妙处理了医药电商特有的业务逻辑,包括处方药验证、库存预留等复杂场景:

CREATE TABLE t_order (
    id INT PRIMARY KEY AUTO_INCREMENT,
    order_no VARCHAR(32) UNIQUE NOT NULL,
    user_id INT NOT NULL,
    total_amount DECIMAL(10,2) NOT NULL,
    status TINYINT NOT NULL COMMENT '1待支付 2待发货 3已发货 4已完成 5已取消',
    payment_type TINYINT COMMENT '支付方式',
    prescription_verified TINYINT DEFAULT 0 COMMENT '处方审核状态',
    shipping_address TEXT,
    create_time DATETIME DEFAULT CURRENT_TIMESTAMP,
    pay_time DATETIME,
    FOREIGN KEY (user_id) REFERENCES t_user(id)
);

社区帖子表的设计支持富文本内容和多种互动指标,为健康知识分享提供了坚实基础:

CREATE TABLE t_post (
    id INT PRIMARY KEY AUTO_INCREMENT,
    title VARCHAR(200) NOT NULL,
    content TEXT NOT NULL,
    user_id INT NOT NULL,
    drug_id INT COMMENT '关联药品',
    view_count INT DEFAULT 0,
    like_count INT DEFAULT 0,
    comment_count INT DEFAULT 0,
    category TINYINT COMMENT '帖子分类',
    status TINYINT DEFAULT 1,
    create_time DATETIME DEFAULT CURRENT_TIMESTAMP,
    update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    FOREIGN KEY (user_id) REFERENCES t_user(id),
    FOREIGN KEY (drug_id) REFERENCES t_drug(id)
);

核心功能模块深度实现

智能药品搜索与分类浏览

平台实现了多维度药品检索系统,用户可通过关键词、药品分类、价格区间等条件精准定位所需商品。分类浏览界面清晰展示了各类药品的概要信息。

药品分类浏览

前端通过AJAX实现动态加载,提升用户体验:

function loadDrugs(categoryId, pageNum) {
    $.ajax({
        url: '/drug/list',
        data: {
            categoryId: categoryId,
            pageNum: pageNum || 1,
            pageSize: 12
        },
        success: function(data) {
            $('#drug-list').html(data);
            initDrugItemEvents();
        }
    });
}

function initDrugItemEvents() {
    $('.drug-item').hover(function() {
        $(this).addClass('hover');
    }, function() {
        $(this).removeClass('hover');
    });
    
    $('.add-cart-btn').click(function() {
        var drugId = $(this).data('drug-id');
        addToCart(drugId, 1);
    });
}

购物车与订单管理

购物车功能支持药品的灵活增删改查,实时计算总金额。订单生成过程包含完整的业务验证:

@Service
public class OrderServiceImpl implements OrderService {
    
    @Autowired
    private CartService cartService;
    
    @Autowired
    private DrugService drugService;
    
    @Override
    @Transactional
    public Order createOrder(Integer userId, OrderDTO orderDTO) {
        // 验证库存
        for (OrderItemDTO item : orderDTO.getItems()) {
            Drug drug = drugService.findById(item.getDrugId());
            if (drug.getStock() < item.getQuantity()) {
                throw new BusinessException("药品库存不足: " + drug.getName());
            }
        }
        
        // 生成订单号
        String orderNo = generateOrderNo();
        
        // 创建订单主记录
        Order order = new Order();
        order.setOrderNo(orderNo);
        order.setUserId(userId);
        order.setTotalAmount(calculateTotalAmount(orderDTO.getItems()));
        order.setStatus(OrderStatus.PENDING_PAYMENT);
        
        orderMapper.insert(order);
        
        // 创建订单明细
        for (OrderItemDTO item : orderDTO.getItems()) {
            OrderItem orderItem = new OrderItem();
            orderItem.setOrderId(order.getId());
            orderItem.setDrugId(item.getDrugId());
            orderItem.setQuantity(item.getQuantity());
            orderItem.setUnitPrice(drugService.findById(item.getDrugId()).getPrice());
            orderItemMapper.insert(orderItem);
            
            // 扣减库存
            drugService.decreaseStock(item.getDrugId(), item.getQuantity());
        }
        
        // 清空购物车
        cartService.clearCart(userId);
        
        return order;
    }
}

提交订单界面

社区互动系统

社区模块实现了完整的发帖、评论、点赞功能,用户可分享用药经验或咨询健康问题:

@Service
public class PostServiceImpl implements PostService {
    
    @Autowired
    private PostMapper postMapper;
    
    @Autowired
    private CommentMapper commentMapper;
    
    @Override
    public void createPost(Post post) {
        post.setCreateTime(new Date());
        post.setUpdateTime(new Date());
        postMapper.insert(post);
        
        // 更新用户经验值
        userService.addExperience(post.getUserId(), 10);
    }
    
    @Override
    public void addComment(Comment comment) {
        comment.setCreateTime(new Date());
        commentMapper.insert(comment);
        
        // 更新帖子评论数
        postMapper.increaseCommentCount(comment.getPostId());
    }
    
    @Override
    public PageInfo<Post> getHotPosts(int pageNum, int pageSize) {
        PageHelper.startPage(pageNum, pageSize);
        List<Post> posts = postMapper.selectHotPosts();
        return new PageInfo<>(posts);
    }
}

实体模型与业务逻辑封装

系统通过精细的实体类设计封装了复杂的业务规则。药品实体不仅包含基本属性,还定义了库存管理相关业务方法:

public class Drug {
    private Integer id;
    private String name;
    private String description;
    private BigDecimal price;
    private Integer stock;
    private String imageUrl;
    private Integer categoryId;
    private Integer status;
    private Date createTime;
    
    // 业务方法
    public boolean isAvailable() {
        return status == 1 && stock > 0;
    }
    
    public boolean canPurchase(int quantity) {
        return isAvailable() && stock >= quantity;
    }
    
    public void decreaseStock(int quantity) {
        if (stock < quantity) {
            throw new BusinessException("库存不足");
        }
        this.stock -= quantity;
    }
}

订单实体通过状态模式管理订单生命周期:

public class Order {
    private Integer id;
    private String orderNo;
    private Integer userId;
    private BigDecimal totalAmount;
    private Integer status;
    private Date createTime;
    private Date payTime;
    private Date deliverTime;
    private Date completeTime;
    
    private List<OrderItem> items;
    
    public enum OrderStatus {
        PENDING_PAYMENT(1, "待支付"),
        PENDING_DELIVERY(2, "待发货"),
        DELIVERED(3, "已发货"),
        COMPLETED(4, "已完成"),
        CANCELLED(5, "已取消");
        
        private final int code;
        private final String desc;
        
        OrderStatus(int code, String desc) {
            this.code = code;
            this.desc = desc;
        }
    }
    
    public boolean canCancel() {
        return status == OrderStatus.PENDING_PAYMENT.code 
               || status == OrderStatus.PENDING_DELIVERY.code;
    }
}

管理后台功能实现

管理员后台提供了完整的业务管理功能,包括用户管理、药品上下架、订单处理等。用户管理界面支持多条件查询和批量操作:

用户管理界面

订单管理模块实现了智能筛选和状态跟踪:

订单管理界面

管理员控制器通过权限验证确保系统安全:

@Controller
@RequestMapping("/admin")
public class AdminController {
    
    @Autowired
    private OrderService orderService;
    
    @RequestMapping("/orders")
    public String orderManagement(@RequestParam Map<String, Object> params, 
                                 Model model) {
        PageInfo<Order> pageInfo = orderService.findOrdersByPage(params);
        model.addAttribute("pageInfo", pageInfo);
        return "admin/order/list";
    }
    
    @PostMapping("/order/updateStatus")
    @ResponseBody
    public Result updateOrderStatus(@RequestParam Integer orderId, 
                                   @RequestParam Integer status) {
        orderService.updateStatus(orderId, status);
        return Result.success();
    }
}

性能优化与安全考量

系统在性能优化方面采取了多项措施。数据库层面通过合理的索引设计提升查询效率:

CREATE INDEX idx_drug_category ON t_drug(category_id, status);
CREATE INDEX idx_order_user_status ON t_order(user_id, status);
CREATE INDEX idx_post_category_time ON t_post(category, create_time);

缓存策略方面,使用Redis缓存热点药品数据和社区热帖:

@Service
public class DrugCacheService {
    
    @Autowired
    private RedisTemplate<String, Object> redisTemplate;
    
    private static final String DRUG_KEY_PREFIX = "drug:";
    private static final long EXPIRE_TIME = 3600; // 1小时
    
    public Drug getDrugById(Integer id) {
        String key = DRUG_KEY_PREFIX + id;
        Drug drug = (Drug) redisTemplate.opsForValue().get(key);
        if (drug == null) {
            drug = drugMapper.selectByPrimaryKey(id);
            if (drug != null) {
                redisTemplate.opsForValue().set(key, drug, EXPIRE_TIME, TimeUnit.SECONDS);
            }
        }
        return drug;
    }
}

安全方面,通过Spring Security实现密码加密和会话管理:

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

未来演进方向

基于当前架构和业务实现,平台可在以下方面进行深度扩展:

智能推荐系统集成:引入机器学习算法分析用户浏览和购买行为,实现个性化药品推荐。可采用协同过滤和内容推荐混合模型,通过用户-药品交互矩阵生成精准推荐列表。

移动端原生应用开发:基于React Native或Flutter技术栈开发跨平台移动应用,充分利用设备硬件特性实现扫码购药、用药提醒等增强功能。

在线问诊与电子处方:集成第三方医疗资源,提供在线问诊服务并生成合规的电子处方。需要解决医生资质验证、处方流转、审核流程等合规性问题。

供应链管理系统扩展:构建供应商管理、库存预警、智能补货等供应链功能,通过数据预测优化库存结构,降低运营成本。

大数据分析平台:基于Hadoop或Spark构建用户行为分析系统,深度挖掘销售趋势和用户需求,为业务决策提供数据支持。

该平台通过严谨的技术实现和创新的业务模式,为医药电商领域提供了可复用的解决方案架构。其模块化设计和扩展性保障了未来业务演进的技术可行性,具有良好的行业示范价值。

本文关键词
SSM框架药品销售平台源码解析社区化技术架构

上下篇

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