在医药电商领域,单纯的商品交易平台已难以满足用户日益增长的深度健康服务需求。一款集在线购药与健康互动于一体的综合性服务平台应运而生,它基于成熟的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构建用户行为分析系统,深度挖掘销售趋势和用户需求,为业务决策提供数据支持。
该平台通过严谨的技术实现和创新的业务模式,为医药电商领域提供了可复用的解决方案架构。其模块化设计和扩展性保障了未来业务演进的技术可行性,具有良好的行业示范价值。