基于SSM框架的中药药方在线管理系统 - 源码深度解析

JavaJavaScriptMavenHTMLCSSSSM框架MySQL
2026-03-213 浏览

文章摘要

本系统是基于SSM(Spring+SpringMVC+MyBatis)框架构建的中药药方在线管理平台,旨在解决传统中药行业中药方记录、查询和管理的低效与不规范问题。其核心业务价值在于将零散的纸质药方或Excel表格数据统一迁移到线上,实现药方信息的结构化存储、快速检索和权限化使用,有效避免因手写错误...

传统中医药领域长期面临着药方管理效率低下、信息标准化程度不足的挑战。纸质药方易损毁、手写记录易出错、历史数据检索困难等问题严重制约了中医药服务的质量与安全性。针对这些痛点,基于SSM框架的中药药方在线管理系统应运而生,该系统被命名为"智慧方剂数字化平台",实现了中医药方从采集、存储到应用的全流程数字化管理。

系统架构与技术栈

系统采用经典的三层架构模式,通过Spring、SpringMVC和MyBatis三大框架的有机整合,构建了高内聚、低耦合的现代化Web应用。

控制层设计基于SpringMVC框架,通过注解驱动的控制器简化了请求处理逻辑。以下代码展示了药方查询功能的控制器实现:

@Controller
@RequestMapping("/prescription")
public class PrescriptionController {
    
    @Autowired
    private PrescriptionService prescriptionService;
    
    @RequestMapping(value = "/search", method = RequestMethod.GET)
    @ResponseBody
    public ResultDTO searchPrescriptions(
            @RequestParam(value = "name", required = false) String name,
            @RequestParam(value = "category", required = false) String category,
            @RequestParam(value = "pageNum", defaultValue = "1") Integer pageNum) {
        
        PrescriptionQuery query = new PrescriptionQuery();
        query.setName(name);
        query.setCategory(category);
        query.setPageNum(pageNum);
        query.setPageSize(10);
        
        PageInfo<PrescriptionVO> pageInfo = prescriptionService.searchPrescriptions(query);
        return ResultDTO.success(pageInfo);
    }
}

服务层实现依托Spring的IoC容器进行依赖管理,通过声明式事务确保数据一致性:

@Service
@Transactional
public class PrescriptionServiceImpl implements PrescriptionService {
    
    @Autowired
    private PrescriptionMapper prescriptionMapper;
    
    @Override
    public PageInfo<PrescriptionVO> searchPrescriptions(PrescriptionQuery query) {
        PageHelper.startPage(query.getPageNum(), query.getPageSize());
        List<PrescriptionVO> list = prescriptionMapper.selectByCondition(query);
        return new PageInfo<>(list);
    }
}

数据持久层采用MyBatis框架,通过XML映射文件实现复杂的动态SQL查询:

<!-- 药方多条件查询映射 -->
<select id="selectByCondition" parameterType="PrescriptionQuery" resultMap="PrescriptionVOResultMap">
    SELECT p.*, d.name as doctor_name, c.name as category_name
    FROM prescription p
    LEFT JOIN doctor d ON p.doctor_id = d.id
    LEFT JOIN category c ON p.category_id = c.id
    <where>
        <if test="name != null and name != ''">
            AND p.name LIKE CONCAT('%', #{name}, '%')
        </if>
        <if test="category != null and category != ''">
            AND c.name = #{category}
        </if>
        <if test="status != null">
            AND p.status = #{status}
        </if>
    </where>
    ORDER BY p.create_time DESC
</select>

前端采用JSP结合jQuery的技术组合,通过Ajax实现异步数据交互:

// 药方搜索功能前端实现
function searchPrescriptions() {
    var formData = {
        name: $('#nameInput').val(),
        category: $('#categorySelect').val(),
        pageNum: currentPage
    };
    
    $.ajax({
        url: '/prescription/search',
        type: 'GET',
        data: formData,
        success: function(result) {
            if (result.success) {
                renderPrescriptionList(result.data.list);
                renderPagination(result.data);
            }
        }
    });
}

数据库设计亮点分析

系统数据库包含7张核心表,其中药方主表(prescription)和药材信息表(herb)的设计体现了专业化的数据建模思路。

药方主表设计采用模块化结构,将药方基本信息、组成配方、用法用量等关键信息进行规范化存储:

CREATE TABLE prescription (
    id BIGINT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(100) NOT NULL COMMENT '方剂名称',
    pinyin_name VARCHAR(150) COMMENT '拼音名称',
    composition TEXT NOT NULL COMMENT '组成药材JSON格式',
    dosage TEXT COMMENT '用法用量',
    indications TEXT COMMENT '主治功能',
    contraindications TEXT COMMENT '禁忌说明',
    category_id INT COMMENT '方剂分类',
    doctor_id BIGINT COMMENT '开方医师',
    status TINYINT DEFAULT 1 COMMENT '状态:0-停用 1-启用',
    create_time DATETIME DEFAULT CURRENT_TIMESTAMP,
    update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    KEY idx_name (name),
    KEY idx_category (category_id),
    KEY idx_doctor (doctor_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='药方主表';

药材信息表设计充分考虑中医药特性,包含性味、归经、功效等专业字段:

CREATE TABLE herb (
    id BIGINT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(50) NOT NULL COMMENT '药材名称',
    latin_name VARCHAR(100) COMMENT '拉丁学名',
    pinyin_name VARCHAR(100) COMMENT '拼音名称',
    property VARCHAR(20) COMMENT '药性:寒、凉、平、温、热',
    flavor VARCHAR(50) COMMENT '五味:辛、甘、酸、苦、咸',
    meridian_tropism VARCHAR(100) COMMENT '归经',
    efficacy TEXT COMMENT '功效说明',
    dosage_range VARCHAR(100) COMMENT '常用剂量范围',
    contraindication TEXT COMMENT '禁忌说明',
    storage_condition VARCHAR(200) COMMENT '存储条件',
    stock_quantity DECIMAL(10,2) DEFAULT 0 COMMENT '库存数量',
    unit VARCHAR(20) COMMENT '计量单位',
    status TINYINT DEFAULT 1 COMMENT '状态',
    create_time DATETIME DEFAULT CURRENT_TIMESTAMP,
    update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    UNIQUE KEY uk_name (name),
    KEY idx_property (property),
    KEY idx_flavor (flavor)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='药材信息表';

药方-药材关联表采用中间表设计,支持复杂的药材配伍关系管理:

CREATE TABLE prescription_herb (
    id BIGINT PRIMARY KEY AUTO_INCREMENT,
    prescription_id BIGINT NOT NULL COMMENT '药方ID',
    herb_id BIGINT NOT NULL COMMENT '药材ID',
    dosage DECIMAL(8,2) NOT NULL COMMENT '用量',
    unit VARCHAR(20) COMMENT '单位',
    processing_method VARCHAR(100) COMMENT '炮制方法',
    notes VARCHAR(200) COMMENT '备注说明',
    sort_order INT DEFAULT 0 COMMENT '排序序号',
    FOREIGN KEY (prescription_id) REFERENCES prescription(id),
    FOREIGN KEY (herb_id) REFERENCES herb(id),
    KEY idx_prescription (prescription_id),
    KEY idx_herb (herb_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='药方药材关联表';

核心功能深度解析

1. 智能药方检索系统

系统提供多维度药方检索功能,支持按方名、分类、药材组成等条件进行组合查询。检索算法采用倒排索引思想,通过数据库索引优化查询性能。

药方查询界面

查询服务层实现了复杂查询条件的动态构建:

public class PrescriptionQueryBuilder {
    
    public static String buildConditionSQL(PrescriptionQuery query) {
        StringBuilder sql = new StringBuilder();
        List<Object> params = new ArrayList<>();
        
        if (StringUtils.isNotBlank(query.getName())) {
            sql.append(" AND p.name LIKE ?");
            params.add("%" + query.getName() + "%");
        }
        
        if (StringUtils.isNotBlank(query.getCategory())) {
            sql.append(" AND c.name = ?");
            params.add(query.getCategory());
        }
        
        if (query.getHerbList() != null && !query.getHerbList().isEmpty()) {
            sql.append(" AND EXISTS (SELECT 1 FROM prescription_herb ph 
                      WHERE ph.prescription_id = p.id AND ph.herb_id IN (");
            // 动态生成IN语句参数占位符
            String placeholders = String.join(",", 
                Collections.nCopies(query.getHerbList().size(), "?"));
            sql.append(placeholders).append("))");
            params.addAll(query.getHerbList());
        }
        
        return sql.toString();
    }
}

2. 药材库存动态管理

系统实现实时库存监控和预警机制,通过事务控制确保库存数据的准确性。

药材信息管理

库存更新服务采用悲观锁机制防止超卖:

@Service
public class InventoryServiceImpl implements InventoryService {
    
    @Autowired
    private HerbMapper herbMapper;
    
    @Override
    @Transactional
    public boolean updateHerbStock(Long herbId, BigDecimal quantity, OperationType operation) {
        // 通过SELECT FOR UPDATE锁定记录
        Herb herb = herbMapper.selectForUpdate(herbId);
        if (herb == null) {
            throw new BusinessException("药材不存在");
        }
        
        BigDecimal newStock;
        if (operation == OperationType.IN) {
            newStock = herb.getStockQuantity().add(quantity);
        } else {
            if (herb.getStockQuantity().compareTo(quantity) < 0) {
                throw new BusinessException("库存不足");
            }
            newStock = herb.getStockQuantity().subtract(quantity);
        }
        
        herb.setStockQuantity(newStock);
        return herbMapper.updateStock(herb) > 0;
    }
}

3. 多角色权限管理体系

系统设计了三类用户角色:医师、药房人员和管理员,各角色具有不同的操作权限和数据视图。

管理员登录

权限控制通过自定义注解和拦截器实现:

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface RequireRole {
    UserRole[] value();
}

@Component
public class RoleInterceptor extends HandlerInterceptorAdapter {
    
    @Override
    public boolean preHandle(HttpServletRequest request, 
                           HttpServletResponse response, Object handler) throws Exception {
        
        HandlerMethod handlerMethod = (HandlerMethod) handler;
        RequireRole requireRole = handlerMethod.getMethodAnnotation(RequireRole.class);
        
        if (requireRole != null) {
            UserRole currentRole = getCurrentUserRole(request);
            if (!Arrays.asList(requireRole.value()).contains(currentRole)) {
                response.sendError(403, "权限不足");
                return false;
            }
        }
        
        return true;
    }
}

4. 药方配伍智能校验

系统集成中医药理论知识,实现药方配伍的智能校验功能:

@Service
public class CompatibilityCheckService {
    
    private static final Map<String, Set<String>> INCOMPATIBLE_HERBS = 
        loadIncompatibleHerbs();
    
    public CompatibilityResult checkCompatibility(List<Long> herbIds) {
        CompatibilityResult result = new CompatibilityResult();
        
        // 检查十八反、十九畏等禁忌配伍
        for (Long herbId : herbIds) {
            Herb herb = herbMapper.selectById(herbId);
            Set<String> incompatible = INCOMPATIBLE_HERBS.get(herb.getName());
            
            if (incompatible != null) {
                for (Long otherHerbId : herbIds) {
                    if (!herbId.equals(otherHerbId)) {
                        Herb otherHerb = herbMapper.selectById(otherHerbId);
                        if (incompatible.contains(otherHerb.getName())) {
                            result.addWarning(String.format(
                                "%s与%s存在配伍禁忌", herb.getName(), otherHerb.getName()));
                        }
                    }
                }
            }
        }
        
        return result;
    }
}

实体模型设计

系统核心实体模型采用领域驱动设计思想,确保业务逻辑的完整性和一致性:

// 药方聚合根实体
public class Prescription {
    private Long id;
    private String name;
    private String composition;
    private List<PrescriptionHerb> herbs;
    private PrescriptionCategory category;
    private Doctor doctor;
    private PrescriptionStatus status;
    
    // 业务方法
    public void addHerb(Herb herb, BigDecimal dosage, String unit) {
        PrescriptionHerb prescriptionHerb = new PrescriptionHerb(this, herb, dosage, unit);
        this.herbs.add(prescriptionHerb);
    }
    
    public BigDecimal calculateTotalCost() {
        return herbs.stream()
            .map(ph -> ph.getHerb().getPrice().multiply(ph.getDosage()))
            .reduce(BigDecimal.ZERO, BigDecimal::add);
    }
}

// 值对象:药材用量
public class HerbDosage {
    private final BigDecimal value;
    private final String unit;
    
    public HerbDosage(BigDecimal value, String unit) {
        if (value.compareTo(BigDecimal.ZERO) <= 0) {
            throw new IllegalArgumentException("用量必须大于0");
        }
        this.value = value;
        this.unit = unit;
    }
}

性能优化策略

系统在数据访问层实施了多重性能优化措施:

数据库连接池配置

<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
    <property name="url" value="${jdbc.url}"/>
    <property name="username" value="${jdbc.username}"/>
    <property name="password" value="${jdbc.password}"/>
    <property name="initialSize" value="5"/>
    <property name="minIdle" value="5"/>
    <property name="maxActive" value="20"/>
    <property name="maxWait" value="60000"/>
    <property name="timeBetweenEvictionRunsMillis" value="60000"/>
</bean>

MyBatis二级缓存配置

<settings>
    <setting name="cacheEnabled" value="true"/>
    <setting name="lazyLoadingEnabled" value="true"/>
    <setting name="aggressiveLazyLoading" value="false"/>
</settings>

<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>

未来优化方向

  1. 智能推荐引擎:基于机器学习算法分析历史药方数据,构建药材配伍推荐模型,为医师开方提供智能辅助。可采用协同过滤算法实现相似方剂推荐。

  2. 移动端适配:开发响应式前端或独立移动应用,支持医师通过移动设备随时查阅药方和药材信息。可采用Vue.js + Vant UI构建移动端界面。

  3. 知识图谱集成:构建中医药知识图谱,将药材、方剂、病症等实体关系可视化,支持更复杂的语义查询。可基于Neo4j图数据库实现。

  4. 大数据分析平台:集成Hadoop/Spark大数据处理框架,对海量药方数据进行深度挖掘,发现用药规律和疗效关联性。

  5. 区块链存证:利用区块链技术对重要药方进行数字存证,确保处方的不可篡改性和溯源能力。可采用Hyperledger Fabric框架实现。

智慧方剂数字化平台通过系统化的架构设计和专业化的功能实现,为中医药行业提供了完整的数字化解决方案。系统不仅提升了药方管理效率,更重要的是通过技术手段保障了中医药服务的规范性和安全性,为中医药的现代化发展奠定了坚实的技术基础。随着人工智能、大数据等新技术的持续集成,该系统将在智慧医疗领域发挥更加重要的作用。

本文关键词
SSM框架中药药方在线管理系统源码解析智慧方剂数字化平台

上下篇

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