摘 要
本研究开发了一个基于Web的医药连锁店管理系统,采用Python语言及Django框架进行后端开发,前端使用Vue.js框架,数据库选用MySQL,确保数据的安全与高效管理。系统分为会员用户功能区和管理员功能区。会员用户可访问首页、公告消息、新闻资讯、药品信息等内容,并通过个人中心管理账户、订单、用药提醒、收藏品和评论等。注册时,会员需提供过敏史和慢性病史,以便享受个性化服务。管理员功能包括后台统计分析、系统用户管理、供应商管理、药品分类与库存管理(特别设有库存低于10预警机制)、药品入库、订单处理、处方药管理、员工信息维护等功能模块,确保运营顺畅。此外,系统还支持轮播图展示、公告消息发布和资源管理,提高用户体验。该系统的实现提升了医药连锁店的工作效率和服务质量,为顾客提供了便捷安全的购药环境。
关键词:医药连锁店管理系统;Django;Python;MySQL;Vue.js.
Abstract
This study developed a web-based pharmaceutical chain store management system, using Python language and Django framework for backend development, Vue.js framework for frontend, and MySQL database to ensure data security and efficient management. The system is divided into a member user function area and an administrator function area. Member users can access the homepage, announcement messages, news and information, drug information, and other content, and manage accounts, orders, medication reminders, collectibles, and reviews through the personal center. When registering, members are required to provide a history of allergies and chronic illnesses in order to enjoy personalized services. The administrator functions include backend statistical analysis, system user management, supplier management, drug classification and inventory management (with a special warning mechanism for inventory below 10), drug warehousing, order processing, prescription drug management, employee information maintenance and other functional modules to ensure smooth operation. In addition, the system also supports carousel display, announcement message publishing, and resource management to improve user experience. The implementation of this system has improved the work efficiency and service quality of pharmaceutical chain stores, providing customers with a convenient and safe environment for purchasing drugs.
Keywords: pharmaceutical chain store management system; Django; Python; MySQL; Vue.js.
目 录
1绪 论
随着互联网技术的发展,传统医药连锁店在信息管理和顾客服务方面面临诸多挑战,如效率低下、个性化服务不足等。为了应对这些问题,提升运营效率和服务质量,本研究开发了一个基于Web的医药连锁店管理系统。该系统采用Python和Django框架进行后端开发,前端使用Vue.js,数据库选用MySQL,确保高效安全的数据管理。通过为会员用户提供药品信息查询、个人健康管理及用药提醒等功能,并为管理员提供库存预警、订单处理及供应商管理等工具,系统优化业务流程,提高服务质量。这一系统的实现不仅增强了企业的市场竞争力,也为顾客提供了更加便捷、安全的购药体验。
本研究的主要目的是设计并实现一个基于Web的医药连锁店管理系统,解决传统医药零售在信息管理、顾客服务和运营效率方面存在的问题。该系统致力于提升运营效率,通过集成药品库存管理、订单处理(包括自提与外送)、供应商管理和员工信息维护等功能模块,简化日常运营流程,减少人工操作错误,从而提高工作效率。其次,系统注重优化顾客体验,为会员用户提供个性化服务,如记录过敏史和慢性病信息、设置用药提醒以及便捷的订单管理等,这些功能有助于增强用户满意度和忠诚度。采用MySQL数据库确保了数据的安全性与可靠性,并通过系统的统计分析功能帮助管理者获取有价值的商业洞察,以便做出更加明智的决策。这一系统的建立不仅增强了企业的市场竞争力,也为顾客提供了更加便捷、安全的购药体验,对于促进整个医药行业的健康发展具有重要意义。
国内对于药店管理系统的研究起步相对较晚,但随着信息技术的快速发展,近年来取得了显著的进步。目前,国内市场上的药店管理系统功能日益完善,能够实现药品进销存管理、会员管理、销售分析、库存预警等多种功能。一些知名的软件供应商如金蝶、用友等不仅提供标准化的产品,还提供定制化服务以满足不同药店的需求。此外,新兴科技公司也开始利用人工智能和大数据技术开发更加智能化和便捷化的药店管理系统。然而,国内药店管理系统在系统集成、用户体验以及法规遵从方面仍有待进一步提升。
国外药店管理系统的发展较早,尤其是在欧美发达国家,这类系统已经非常成熟。国外的药店管理系统不仅功能全面,而且特别注重用户体验和系统的安全性。例如,美国的Walgreens和CVS等大型连锁药店拥有自主开发的先进管理系统,实现了高度自动化和集成化,并与医疗系统紧密整合,提供了更全面的医疗服务解决方案。国外的研究热点包括系统集成与优化、法规遵从与质量管理、顾客关系管理和绿色供应链管理等方面。这些系统通常采用先进的技术,如云计算、物联网等,且更强调数据安全和隐私保护。
国内外药店管理系统都在不断发展,但在技术水平、用户体验、法规遵从和成本等方面存在差异。国内系统虽然起步较晚,但发展迅速,性价比高,适应本地市场需求。国外系统则在技术应用上更为领先,特别是在智能化、数据分析方面,并且更加重视用户体验和法规遵从。未来,随着信息技术的进一步发展,药店管理系统将朝着更加智能化、高效化和绿色化的方向发展。
本文的结构按逻辑顺序分为以下几个章节:
第1章绪论,本章节介绍研究背景和意义,回顾当前研究现状,并阐明本文主要组织结构。
第2章系统关键技术,本章节将对医药连锁店管理系统的实现关键技术进行简要介绍。
第3章系统分析,本章节基于市场调研,分析医药连锁店管理系统的可行性、功能、角色、性能等需求,明确各模块的业务需求。
第4章系统设计,本章节详细阐述系统的整体架构设计,包括前后端结构、数据库设计及功能模块的设计思路。
第5章系统实现,本章节介绍系统各主要模块的具体实现,包括代码示例、业务逻辑及界面设计等。
第6章系统测试,本章节描述系统的测试方法及结果,分析系统的性能、稳定性及用户反馈。
第7章结论,本章节对主要对研究成果进行总结。
2关键技术介绍
B/S体系[1],即Browser/Server体系,是一种常见的网络应用程序架构。其工作原理基于客户端与服务器之间的请求-响应模型。用户通过浏览器向服务器发送请求,服务器接收到请求后进行处理,并生成相应的响应结果,最终将响应返回给客户端。浏览器接收到服务器返回的响应后,解析其中的标记语言(如HTML[2]),并根据CSS样式表和PythonScript脚本来渲染页面,呈现给用户。用户可以与页面进行交互,例如点击链接、填写表单等操作,这些操作会触发新的请求,循环执行上述过程。
2.2Django框架
Django是一个使用Python语言开发的Web应用程序框架[3]。它提供了一种简单而强大的方式来构建复杂的网站和应用程序。通过使用Django,开发人员可以更轻松地处理数据库、创建用户界面和处理用户请求。它还提供了一个自动生成管理界面的功能,使得管理后台数据变得更加简单。Django还具有强大的安全功能,可以保护网站免受常见的网络攻击[4]。总之,Django是一个非常实用和易于学习的框架,适用于各种规模的Web项目。无论你是初学者还是经验丰富的开发人员,都可以从Django的便利性和灵活性中受益。
Vue.js是一款用于构建用户界面的渐进式JavaScript框架,专注于视图层的应用,易于学习和集成。它通过简单的API实现响应式数据绑定和组件化开发,使得开发者可以快速创建高效的单页应用。Vue.js的核心特点包括易学易用、轻量级、高度可扩展以及出色的性能表现。其灵活性允许开发者逐步采用,并能与其他库或现有项目无缝集成。此外,Vue.js还拥有活跃的社区支持和丰富的插件生态,为项目的快速开发提供了便利。无论是初学者还是有经验的开发者,都能利用Vue.js高效地开发出功能强大且用户体验良好的前端应用
MySQL是一种广泛使用的开源关系型数据库管理系统[5](RDBMS),其稳定性、可靠性和卓越性能使其成为众多应用程序的首选数据库。MySQL支持标准SQL语法,并提供丰富的功能和特性,如事务处理、触发器和存储过程等,以满足开发者对数据管理和操作的需求。MySQL具有良好的可扩展性,支持主从复制、分布式架构和集群部署,适用于各种规模和负载的应用场景。作为一个开源项目,MySQL拥有庞大的用户社区和活跃的开发者社区,为用户提供了丰富的文档、教程和支持资源。总之,MySQL是一款可靠、强大且灵活的关系型数据库管理系统[6],通过其卓越性能和可扩展性,帮助开发者高效地管理和操作数据,并得到了广大用户的认可和应用。
2.5Python语言
Python是一种简洁易读、跨平台且功能强大的编程语言[7]。它拥有庞大而活跃的社区,提供了丰富的第三方库和框架,如NumPy、Pandas和Django,使开发人员能够快速构建各种应用程序。Python在数据处理和科学计算方面表现出色,通过相关库和工具,可以进行数据分析、机器学习和科学计算等任务。此外,Python广泛应用于Web开发[8]、自动化脚本、网络爬虫等领域,其多样性使其成为一个全能的编程语言。无论你是初学者还是有经验的开发者,Python的简单语法、跨平台性以及强大的社区支持都能为你提供高效、优雅和可靠的编程体验。总之,Python是一个强大而灵活的编程语言,深受开发人员喜爱,并在各个领域得到广泛应用。
3系统分析
在技术可行性方面,选择使用Python作为开发语言,结合相应的框架Django,以实现系统的功能需求。Python作为一种简洁而强大的编程语言,具有丰富的库支持和成熟的开发社区,可以满足医药连锁店管理系统的开发需求。Django作为Python的Web框架,提供了高度可扩展的开发环境,使得系统的设计和实现更加便捷和高效。
系统开发采用开源技术栈,降低了软件授权与工具采购成本。Django框架简化了开发流程,缩短了项目周期,减少了人力投入。此外,借助云计算资源部署系统,可根据实际需求灵活调整服务器配置,进一步降低硬件成本。总体而言,该方案在经济上具有较高性价比,适合中小型企业或初创团队实施。
在操作可行性方面,本系统设计注重用户体验,采用了直观易用的界面设计,并提供详细的帮助文档支持,确保用户可以轻松上手使用各项功能。无论是用户还是后台管理员,都能通过简洁明了的操作流程完成信息查询和管理等任务。因此,从用户操作的角度来看,本系统具备良好的操作可行性。
系统功能需求分析主要集中在为不同用户提供便捷、灵活的操作界面和高效的管理功能。对于会员用户,系统应支持药品信息查询、购药、设置用药提醒、收藏喜欢的商品以及管理评论等基本功能,同时提供药品推荐和查询服务,确保顾客能够根据自身健康状况合理选择药品。对于管理员用户,系统需要支持全面的药品信息管理(包括库存预警、药品入库、处方药管理)、供应商管理、订单处理、员工信息维护、公告消息发布及资源管理等功能,帮助管理人员高效地进行日常运营和决策制定。此外,管理员还需具备数据统计与分析的能力,以优化药品资源配置和服务质量。系统还应具备严格的权限管理机制,确保不同角色用户的操作权限得到合理分配,保障数据的安全性和一致性。通过这些功能的实现,医药连锁店管理系统不仅提升了内部工作效率,也为顾客提供了更加安全、便捷的服务体验。具体功能如下:
(一)会员用户功能分析
首页:展示医药连锁店的最新活动、推荐药品及服务,为会员用户提供便捷的一站式访问入口。
公告消息:发布重要通知和更新,确保会员用户及时获取药店的最新动态和服务信息。
新闻资讯:提供健康养生、疾病预防等相关的新闻和资讯,帮助会员用户提升健康意识和知识水平。
药品信息:详细列出各类药品的功能介绍、使用方法及价格,支持按条件筛选和搜索,方便会员查找所需药品。
我的账户:允许会员用户查看和编辑个人信息,包括过敏史和慢性病记录,管理账户安全设置。
个人中心:
个人首页:集中展示会员的基本信息、最近订单状态和个人偏好设置,便于快速访问常用功能。
自提订单:管理线上下单后选择到店自取的订单详情,包括确认收货和取消订单等功能。
外送订单:跟踪和管理通过线上平台购买并选择配送到家的订单,提供物流信息查询和售后服务。
用药提醒:设定和管理用药提醒,帮助会员按时服药,促进健康管理。
收藏:保存感兴趣的药品或内容,方便日后快速查找和购买。
评论管理:查看和编辑已发表的药品评价或服务反馈,与其他会员分享使用经验。
(二)管理员功能分析
后台首页:提供全面的数据统计分析,帮助管理员了解系统运营状况并作出数据驱动的决策。
系统用户:管理所有注册用户的账户信息。
供应商管理:维护供应商的基本信息和合作详情,优化采购流程和供应链管理。
药品分类管理:创建和维护药品分类体系,便于药品信息的组织和检索,提升管理效率。
药品信息管理:录入和更新药品详细信息,并设置库存预警机制,确保及时补货以满足客户需求。
药品入库管理:处理新购药品的入库操作,记录详细的入库信息,保障库存数据的准确性和实时性。
自提订单管理:监控和处理顾客选择到店自取的订单,支持订单确认、取消及状态更新等功能。
外送订单管理:跟踪配送至顾客地址的订单,提供物流信息查询和售后服务,保证订单按时送达。
用药提醒管理:为会员用户设定或调整用药提醒,协助顾客遵循治疗计划,提高健康管理效果。
处方药管理:专门针对处方药进行管理,包括验证处方的有效性、存储和销售限制等,确保合法合规销售。
员工信息管理:录入和维护员工个人信息、岗位职责及工作表现,支持绩效评估和团队建设。
系统管理:上传和管理网站首页展示的轮播图内容,吸引顾客关注重要活动和促销信息。
公告消息管理:发布和管理对内对外的重要通知和公告,确保信息传达的及时性和准确性。
资源管理:编辑和发布健康相关的信息和新闻,增强顾客的健康知识和自我保健能力。
会员用户角色用例图如下所示。

图3-1 会员用户用例图
管理员用例图如下所示。
图3-2 管理员用例图
系统非功能需求指的是性能需求,即对一个系统的性能需求进行分析和定义的过程。在进行性能需求分析时,因此医药连锁店管理系统的设计与实现主要需要考虑以下几个方面的性能需求:
响应时间:响应时间是指系统在接收到请求后,作出响应的时间。根据具体的业务需求和用户体验要求,可以确定系统在不同场景下的响应时间要求。
吞吐量:吞吐量是指系统在一定时间内处理的事务或请求的数量。根据业务需求和用户量的估计,可以确定系统需要支持的最大吞吐量。
并发用户数:并发用户数是指系统在同时使用的用户数量。根据预期的用户量和并发访问需求,可以确定系统需要支持的最大并发用户数。
可扩展性:可扩展性是指系统在面对用户量增加或并发访问需求增加时,能否通过增加硬件资源或调整系统架构来满足需求。根据预期的用户增长和扩展计划,可以确定系统需要具备的可扩展性要求。
故障处理能力:系统对故障的处理能力是指在出现错误或故障时,系统能够快速、准确地识别、定位并处理故障的能力。根据业务的重要性和对故障处理的要求,可以确定系统需要具备的故障处理能力。
安全性:系统在性能需求分析中,也需考虑安全方面的需求,如数据的保密性、完整性和可用性等。根据具体的安全需求和合规要求,可以确定系统需要满足的安全性需求。
通过对这些性能需求进行详细分析和定义,可以为医药连锁店管理系统的设计和开发提供指导,确保系统在满足预期的性能需求的同时,具备良好的性能和可靠性。
3.5.1程序操作流程
用户访问平台网站,可以选择进行注册或登录操作。注册成功后,用户可以使用注册的账号登录平台。登录后的用户可以进入系统功能界面,使用自己权限内的功能操作。程序操作流程图如下图所示。

图3-3程序操作流程图
3.5.2登录流程
用户访问平台的网站,进入登录页面页面,入其用户名和密码,后端服务接收登录请求,验证用户提供的用户名和密码是否匹配数据库中存储的信息,验证通过即可登录成功。登录流程图如下图所示。

图3-4登录流程图
3.5.3注册流程
未有账号的用户可进入注册界面进行注册操作,填写注册表格,包括用户名、密码、电子邮件等必要信息。后台系统验证并保存用户提交的信息。分配唯一用户标识符。注册成功后,用户可以使用账号密码进行登录。用户注册流程图如下图所示。

图3-5注册流程图
4系统设计
从技术角度来看,医药连锁店管理系统的架构设计至关重要。我们将采用MVC架构,包括表现层、业务逻辑层和数据访问层。表现层负责用户界面展示,业务逻辑层处理核心功能逻辑,数据访问层负责数据库交互。通过三层架构模式,确保系统的可靠性和可扩展性。
系统架构图如图4-1所示。

图4-1 系统架构图
通过整体功能模块设计,我们将根据需求分析的结果,将系统的功能划分为不同的模块。每个模块负责实现特定的功能,并与其他模块进行协作。我们将详细定义每个模块的输入、输出、处理逻辑和相互依赖关系。系统总体功能模块图如下图所示。
图4-2 系统功能模块图
借助先进的系统,E-R图使其他用户可以快速轻松地了解系统的功能以及他们之间的关系。根据医药连锁店管理系统分析结果,系统总体E-R图如下图所示。
图4-3 系统总体E-R图
所有系统的应用数据相互区分。一旦在相应的系统中实现,它们将与自己相应的网络和服务器通信。所以这个系统可以连接这些数据。当我们选择桥梁截面时,以下将简要介绍如何建立系统。在单击上一个按键的时候,就会自动在对话框中弹出数据源的名字,之后再单击下一个按键时,就在填写相对应的身份验证和登录信息。按照系统功能设计的特点与职能模块的分类,医药连锁店管理系统的总体设计和实施过程一共涉及到了几个资料表格。
根据E-R图,建立各个实体的数据表。由于本系统数据库数据表数量较多,所以只选取部分表单作为案列,如下所示:
表 4-1-access_token(登陆访问时长)
| 编号 | 字段名 | 类型 | 长度 | 是否非空 | 是否主键 | 注释 |
| 1 | token_id | int | 是 | 是 | 临时访问牌ID | |
| 2 | token | varchar | 64 | 否 | 否 | 临时访问牌 |
| 3 | info | text | 65535 | 否 | 否 | 信息 |
| 4 | maxage | int | 是 | 否 | 最大寿命:默认2小时 | |
| 5 | create_time | timestamp | 是 | 否 | 创建时间 | |
| 6 | update_time | timestamp | 是 | 否 | 更新时间 | |
| 7 | user_id | int | 是 | 否 | 用户编号 |
表 4-2-article(文章)
| 编号 | 字段名 | 类型 | 长度 | 是否非空 | 是否主键 | 注释 |
| 1 | article_id | mediumint | 是 | 是 | 文章id | |
| 2 | title | varchar | 125 | 是 | 是 | 标题 |
| 3 | type | varchar | 64 | 是 | 否 | 文章分类 |
| 4 | hits | int | 是 | 否 | 点击数 | |
| 5 | praise_len | int | 是 | 否 | 点赞数 | |
| 6 | create_time | timestamp | 是 | 否 | 创建时间 | |
| 7 | update_time | timestamp | 是 | 否 | 更新时间 | |
| 8 | source | varchar | 255 | 否 | 否 | 来源 |
| 9 | url | varchar | 255 | 否 | 否 | 来源地址 |
| 10 | tag | varchar | 255 | 否 | 否 | 标签 |
| 11 | content | longtext | 4294967295 | 否 | 否 | 正文 |
| 12 | img | varchar | 255 | 否 | 否 | 封面图 |
| 13 | description | text | 65535 | 否 | 否 | 文章描述 |
表 4-3-article_type(文章分类)
| 编号 | 字段名 | 类型 | 长度 | 是否非空 | 是否主键 | 注释 |
| 1 | type_id | smallint | 是 | 是 | 分类ID | |
| 2 | display | smallint | 是 | 否 | 显示顺序 | |
| 3 | name | varchar | 16 | 是 | 否 | 分类名称 |
| 4 | father_id | smallint | 是 | 否 | 上级分类ID | |
| 5 | description | varchar | 255 | 否 | 否 | 描述 |
| 6 | icon | text | 65535 | 否 | 否 | 分类图标 |
| 7 | url | varchar | 255 | 否 | 否 | 外链地址 |
| 8 | create_time | timestamp | 是 | 否 | 创建时间 | |
| 9 | update_time | timestamp | 是 | 否 | 更新时间 |
表 4-4-auth(用户权限管理)
| 编号 | 字段名 | 类型 | 长度 | 是否非空 | 是否主键 | 注释 |
| 1 | auth_id | int | 是 | 是 | 授权ID | |
| 2 | user_group | varchar | 64 | 否 | 否 | 用户组 |
| 3 | mod_name | varchar | 64 | 否 | 否 | 模块名 |
| 4 | table_name | varchar | 64 | 否 | 否 | 表名 |
| 5 | page_title | varchar | 255 | 否 | 否 | 页面标题 |
| 6 | path | varchar | 255 | 否 | 否 | 路由路径 |
| 7 | parent | varchar | 64 | 否 | 否 | 父级菜单 |
| 8 | parent_sort | int | 是 | 否 | 父级菜单排序 | |
| 9 | position | varchar | 32 | 否 | 否 | 位置 |
| 10 | mode | varchar | 32 | 是 | 否 | 跳转方式 |
| 11 | add | tinyint | 是 | 否 | 是否可增加 | |
| 12 | del | tinyint | 是 | 否 | 是否可删除 | |
| 13 | set | tinyint | 是 | 否 | 是否可修改 | |
| 14 | get | tinyint | 是 | 否 | 是否可查看 | |
| 15 | field_add | text | 65535 | 否 | 否 | 添加字段 |
| 16 | field_set | text | 65535 | 否 | 否 | 修改字段 |
| 17 | field_get | text | 65535 | 否 | 否 | 查询字段 |
| 18 | table_nav_name | varchar | 500 | 否 | 否 | 跨表导航名称 |
| 19 | table_nav | varchar | 500 | 否 | 否 | 跨表导航 |
| 20 | option | text | 65535 | 否 | 否 | 配置 |
| 21 | create_time | timestamp | 是 | 否 | 创建时间 | |
| 22 | update_time | timestamp | 是 | 否 | 更新时间 |
表 4-5-classification_of_drugs(药品分类)
| 编号 | 字段名 | 类型 | 长度 | 是否非空 | 是否主键 | 注释 |
| 1 | classification_of_drugs_id | int | 是 | 是 | 药品分类ID | |
| 2 | classification_of_drugs | varchar | 64 | 否 | 否 | 药品分类 |
| 3 | create_time | datetime | 是 | 否 | 创建时间 | |
| 4 | update_time | timestamp | 是 | 否 | 更新时间 |
表 4-6-code_token(验证码)
| 编号 | 字段名 | 类型 | 长度 | 是否非空 | 是否主键 | 注释 |
| 1 | code_token_id | int | 是 | 是 | 验证码ID | |
| 2 | token | varchar | 255 | 否 | 否 | 令牌 |
| 3 | code | varchar | 255 | 否 | 否 | 验证码 |
| 4 | expire_time | timestamp | 是 | 否 | 失效时间 | |
| 5 | create_time | timestamp | 是 | 否 | 创建时间 | |
| 6 | update_time | timestamp | 是 | 否 | 更新时间 |
表 4-7-collect(收藏)
| 编号 | 字段名 | 类型 | 长度 | 是否非空 | 是否主键 | 注释 |
| 1 | collect_id | int | 是 | 是 | 收藏ID | |
| 2 | user_id | int | 是 | 是 | 收藏人ID | |
| 3 | source_table | varchar | 255 | 否 | 否 | 来源表 |
| 4 | source_field | varchar | 255 | 否 | 否 | 来源字段 |
| 5 | source_id | int | 是 | 否 | 来源ID | |
| 6 | title | varchar | 255 | 否 | 否 | 标题 |
| 7 | img | varchar | 255 | 否 | 否 | 封面 |
| 8 | create_time | timestamp | 是 | 否 | 创建时间 | |
| 9 | update_time | timestamp | 是 | 否 | 更新时间 |
表 4-8-comment(评论)
| 编号 | 字段名 | 类型 | 长度 | 是否非空 | 是否主键 | 注释 |
| 1 | comment_id | int | 是 | 是 | 评论ID | |
| 2 | user_id | int | 是 | 是 | 评论人ID | |
| 3 | reply_to_id | int | 是 | 否 | 回复评论ID | |
| 4 | content | longtext | 4294967295 | 否 | 否 | 内容 |
| 5 | nickname | varchar | 255 | 否 | 否 | 昵称 |
| 6 | avatar | varchar | 255 | 否 | 否 | 头像地址 |
| 7 | create_time | timestamp | 是 | 否 | 创建时间 | |
| 8 | update_time | timestamp | 是 | 否 | 更新时间 | |
| 9 | source_table | varchar | 255 | 否 | 否 | 来源表 |
| 10 | source_field | varchar | 255 | 否 | 否 | 来源字段 |
| 11 | source_id | int | 是 | 否 | 来源ID |
表 4-9-delivery_order(外送订单)
| 编号 | 字段名 | 类型 | 长度 | 是否非空 | 是否主键 | 注释 |
| 1 | delivery_order_id | int | 是 | 是 | 外送订单ID | |
| 2 | shop_name | varchar | 64 | 否 | 否 | 店铺名称 |
| 3 | store_address | varchar | 64 | 否 | 否 | 店铺地址 |
| 4 | drug_no | varchar | 64 | 否 | 否 | 药品编号 |
| 5 | drug_name | varchar | 64 | 否 | 否 | 药品名称 |
| 6 | classification_of_drugs | varchar | 64 | 否 | 否 | 药品分类 |
| 7 | drug_price | double | 否 | 否 | 药品价格 | |
| 8 | drug_efficacy | varchar | 64 | 否 | 否 | 药品功效 |
| 9 | expiration_time | date | 否 | 否 | 过期时间 | |
| 10 | member_user | int | 否 | 否 | 会员用户 | |
| 11 | member_name | varchar | 64 | 否 | 否 | 会员姓名 |
| 12 | user_phone | varchar | 64 | 否 | 否 | 用户电话 |
| 13 | user_address | varchar | 64 | 否 | 否 | 用户地址 |
| 14 | allergy_history | varchar | 64 | 否 | 否 | 过敏史 |
| 15 | chronic_diseases | varchar | 64 | 否 | 否 | 慢性病 |
| 16 | purchase_time | date | 否 | 否 | 购买时间 | |
| 17 | purchase_quantity | double | 否 | 否 | 购买数量 | |
| 18 | purchase_amount | varchar | 64 | 否 | 否 | 购买金额 |
| 19 | order_status | varchar | 64 | 否 | 否 | 订单状态 |
| 20 | pay_state | varchar | 16 | 是 | 否 | 支付状态 |
| 21 | pay_type | varchar | 16 | 否 | 否 | 支付类型: 微信、支付宝、网银 |
| 22 | medication_reminder_limit_times | int | 是 | 否 | 用药提醒限制次数 | |
| 23 | create_time | datetime | 是 | 否 | 创建时间 | |
| 24 | update_time | timestamp | 是 | 否 | 更新时间 | |
| 25 | source_table | varchar | 255 | 否 | 否 | 来源表 |
| 26 | source_id | int | 否 | 否 | 来源ID | |
| 27 | source_user_id | int | 否 | 否 | 来源用户 |
表 4-10-drug_information(药品信息)
| 编号 | 字段名 | 类型 | 长度 | 是否非空 | 是否主键 | 注释 |
| 1 | drug_information_id | int | 是 | 是 | 药品信息ID | |
| 2 | shop_name | varchar | 64 | 是 | 是 | 店铺名称 |
| 3 | store_address | varchar | 64 | 否 | 否 | 店铺地址 |
| 4 | drug_no | varchar | 64 | 否 | 否 | 药品编号 |
| 5 | drug_name | varchar | 64 | 否 | 否 | 药品名称 |
| 6 | classification_of_drugs | varchar | 64 | 否 | 否 | 药品分类 |
| 7 | drug_price | double | 否 | 否 | 药品价格 | |
| 8 | drug_inventory | double | 否 | 否 | 药品库存 | |
| 9 | drug_efficacy | varchar | 64 | 否 | 否 | 药品功效 |
| 10 | expiration_time | date | 否 | 否 | 过期时间 | |
| 11 | precautions | varchar | 64 | 否 | 否 | 注意事项 |
| 12 | pictures_of_medicines | varchar | 255 | 否 | 否 | 药品图片 |
| 13 | drug_introduction | longtext | 4294967295 | 否 | 否 | 药品简介 |
| 14 | hits | int | 是 | 否 | 点击数 | |
| 15 | collect_len | int | 是 | 否 | 收藏数 | |
| 16 | recommend | int | 是 | 否 | 智能推荐 | |
| 17 | drug_storage_limit_times | int | 是 | 否 | 入库限制次数 | |
| 18 | self_order_limit_times | int | 是 | 否 | 自提限制次数 | |
| 19 | delivery_order_limit_times | int | 是 | 否 | 外送限制次数 | |
| 20 | create_time | datetime | 是 | 否 | 创建时间 | |
| 21 | update_time | timestamp | 是 | 否 | 更新时间 |
表 4-11-drug_storage(药品入库)
| 编号 | 字段名 | 类型 | 长度 | 是否非空 | 是否主键 | 注释 |
| 1 | drug_storage_id | int | 是 | 是 | 药品入库ID | |
| 2 | shop_name | varchar | 64 | 否 | 否 | 店铺名称 |
| 3 | store_address | varchar | 64 | 否 | 否 | 店铺地址 |
| 4 | drug_no | varchar | 64 | 否 | 否 | 药品编号 |
| 5 | drug_name | varchar | 64 | 否 | 否 | 药品名称 |
| 6 | classification_of_drugs | varchar | 64 | 否 | 否 | 药品分类 |
| 7 | receipt_time | date | 否 | 否 | 入库时间 | |
| 8 | receipt_quantity | double | 否 | 否 | 入库数量 | |
| 9 | receipt_remarks | varchar | 64 | 否 | 否 | 入库备注 |
| 10 | supplier_name | varchar | 64 | 否 | 否 | 供应商名称 |
| 11 | vendor_type | varchar | 64 | 否 | 否 | 供应商类型 |
| 12 | contact | varchar | 64 | 否 | 否 | 联系人 |
| 13 | contact_phone | varchar | 64 | 否 | 否 | 联系电话 |
| 14 | credit_rating | varchar | 64 | 否 | 否 | 信用等级 |
| 15 | create_time | datetime | 是 | 否 | 创建时间 | |
| 16 | update_time | timestamp | 是 | 否 | 更新时间 | |
| 17 | source_table | varchar | 255 | 否 | 否 | 来源表 |
| 18 | source_id | int | 否 | 否 | 来源ID | |
| 19 | source_user_id | int | 否 | 否 | 来源用户 |
表 4-12-employee_information(员工信息)
| 编号 | 字段名 | 类型 | 长度 | 是否非空 | 是否主键 | 注释 |
| 1 | employee_information_id | int | 是 | 是 | 员工信息ID | |
| 2 | shop | varchar | 64 | 否 | 否 | 所在店铺 |
| 3 | employee_name | varchar | 64 | 否 | 否 | 员工姓名 |
| 4 | employee_telephone | varchar | 64 | 否 | 否 | 员工电话 |
| 5 | employee_title | varchar | 64 | 否 | 否 | 员工职称 |
| 6 | employee_salary | double | 否 | 否 | 员工薪资 | |
| 7 | create_time | datetime | 是 | 否 | 创建时间 | |
| 8 | update_time | timestamp | 是 | 否 | 更新时间 |
表 4-13-hits(用户点击)
| 编号 | 字段名 | 类型 | 长度 | 是否非空 | 是否主键 | 注释 |
| 1 | hits_id | int | 是 | 是 | 点赞ID | |
| 2 | user_id | int | 是 | 否 | 点赞人 | |
| 3 | create_time | timestamp | 是 | 否 | 创建时间 | |
| 4 | update_time | timestamp | 是 | 否 | 更新时间 | |
| 5 | source_table | varchar | 255 | 否 | 否 | 来源表 |
| 6 | source_field | varchar | 255 | 否 | 否 | 来源字段 |
| 7 | source_id | int | 是 | 否 | 来源ID |
表 4-14-medication_reminder(用药提醒)
| 编号 | 字段名 | 类型 | 长度 | 是否非空 | 是否主键 | 注释 |
| 1 | medication_reminder_id | int | 是 | 是 | 用药提醒ID | |
| 2 | shop_name | varchar | 64 | 否 | 否 | 店铺名称 |
| 3 | store_address | varchar | 64 | 否 | 否 | 店铺地址 |
| 4 | drug_no | varchar | 64 | 否 | 否 | 药品编号 |
| 5 | drug_name | varchar | 64 | 否 | 否 | 药品名称 |
| 6 | classification_of_drugs | varchar | 64 | 否 | 否 | 药品分类 |
| 7 | drug_efficacy | varchar | 64 | 否 | 否 | 药品功效 |
| 8 | member_user | int | 否 | 否 | 会员用户 | |
| 9 | member_name | varchar | 64 | 否 | 否 | 会员姓名 |
| 10 | reminder_time | datetime | 否 | 否 | 提醒时间 | |
| 11 | reminder_content | varchar | 64 | 否 | 否 | 提醒内容 |
| 12 | create_time | datetime | 是 | 否 | 创建时间 | |
| 13 | update_time | timestamp | 是 | 否 | 更新时间 | |
| 14 | source_table | varchar | 255 | 否 | 否 | 来源表 |
| 15 | source_id | int | 否 | 否 | 来源ID | |
| 16 | source_user_id | int | 否 | 否 | 来源用户 |
表 4-15-member_user(会员用户)
| 编号 | 字段名 | 类型 | 长度 | 是否非空 | 是否主键 | 注释 |
| 1 | member_user_id | int | 是 | 是 | 会员用户ID | |
| 2 | member_name | varchar | 64 | 是 | 是 | 会员姓名 |
| 3 | member_gender | varchar | 64 | 否 | 否 | 会员性别 |
| 4 | membership_age | varchar | 64 | 否 | 否 | 会员年龄 |
| 5 | member_points | double | 否 | 否 | 会员积分 | |
| 6 | allergy_history | varchar | 64 | 否 | 否 | 过敏史 |
| 7 | chronic_diseases | varchar | 64 | 否 | 否 | 慢性病 |
| 8 | examine_state | varchar | 16 | 是 | 否 | 审核状态 |
| 9 | user_id | int | 是 | 否 | 用户ID | |
| 10 | create_time | datetime | 是 | 否 | 创建时间 | |
| 11 | update_time | timestamp | 是 | 否 | 更新时间 |
表 4-16-notice(公告)
| 编号 | 字段名 | 类型 | 长度 | 是否非空 | 是否主键 | 注释 |
| 1 | notice_id | mediumint | 是 | 是 | 公告ID | |
| 2 | title | varchar | 125 | 是 | 否 | 标题 |
| 3 | content | longtext | 4294967295 | 否 | 否 | 正文 |
| 4 | create_time | timestamp | 是 | 否 | 创建时间 | |
| 5 | update_time | timestamp | 是 | 否 | 更新时间 |
表 4-17-praise(点赞)
| 编号 | 字段名 | 类型 | 长度 | 是否非空 | 是否主键 | 注释 |
| 1 | praise_id | int | 是 | 是 | 点赞ID | |
| 2 | user_id | int | 是 | 是 | 点赞人 | |
| 3 | create_time | timestamp | 是 | 否 | 创建时间 | |
| 4 | update_time | timestamp | 是 | 否 | 更新时间 | |
| 5 | source_table | varchar | 255 | 否 | 否 | 来源表 |
| 6 | source_field | varchar | 255 | 否 | 否 | 来源字段 |
| 7 | source_id | int | 是 | 否 | 来源ID | |
| 8 | status | tinyint | 是 | 否 | 点赞状态:1为点赞,0已取消 |
表 4-18-prescription_drugs(处方药)
| 编号 | 字段名 | 类型 | 长度 | 是否非空 | 是否主键 | 注释 |
| 1 | prescription_drugs_id | int | 是 | 是 | 处方药ID | |
| 2 | prescription_name | varchar | 64 | 否 | 否 | 处方名称 |
| 3 | prescription_type | varchar | 64 | 否 | 否 | 处方类型 |
| 4 | electronic_prescription | varchar | 255 | 否 | 否 | 电子处方 |
| 5 | prescription_effect | varchar | 64 | 否 | 否 | 处方作用 |
| 6 | prescription_details | text | 65535 | 否 | 否 | 处方详情 |
| 7 | physician_review | text | 65535 | 否 | 否 | 医生审核 |
| 8 | create_time | datetime | 是 | 否 | 创建时间 | |
| 9 | update_time | timestamp | 是 | 否 | 更新时间 |
表 4-19-self_order(自提订单)
| 编号 | 字段名 | 类型 | 长度 | 是否非空 | 是否主键 | 注释 |
| 1 | self_order_id | int | 是 | 是 | 自提订单ID | |
| 2 | shop_name | varchar | 64 | 否 | 否 | 店铺名称 |
| 3 | store_address | varchar | 64 | 否 | 否 | 店铺地址 |
| 4 | drug_no | varchar | 64 | 否 | 否 | 药品编号 |
| 5 | drug_name | varchar | 64 | 否 | 否 | 药品名称 |
| 6 | classification_of_drugs | varchar | 64 | 否 | 否 | 药品分类 |
| 7 | drug_price | double | 否 | 否 | 药品价格 | |
| 8 | drug_efficacy | varchar | 64 | 否 | 否 | 药品功效 |
| 9 | expiration_time | date | 否 | 否 | 过期时间 | |
| 10 | member_user | int | 否 | 否 | 会员用户 | |
| 11 | member_name | varchar | 64 | 是 | 是 | 会员姓名 |
| 12 | allergy_history | varchar | 64 | 否 | 否 | 过敏史 |
| 13 | chronic_diseases | varchar | 64 | 否 | 否 | 慢性病 |
| 14 | purchase_time | date | 否 | 否 | 购买时间 | |
| 15 | purchase_quantity | double | 否 | 否 | 购买数量 | |
| 16 | purchase_amount | varchar | 64 | 否 | 否 | 购买金额 |
| 17 | pay_state | varchar | 16 | 是 | 否 | 支付状态 |
| 18 | pay_type | varchar | 16 | 否 | 否 | 支付类型: 微信、支付宝、网银 |
| 19 | medication_reminder_limit_times | int | 是 | 否 | 用药提醒限制次数 | |
| 20 | create_time | datetime | 是 | 否 | 创建时间 | |
| 21 | update_time | timestamp | 是 | 否 | 更新时间 | |
| 22 | source_table | varchar | 255 | 否 | 否 | 来源表 |
| 23 | source_id | int | 否 | 否 | 来源ID | |
| 24 | source_user_id | int | 否 | 否 | 来源用户 |
表 4-20-slides(轮播图)
| 编号 | 字段名 | 类型 | 长度 | 是否非空 | 是否主键 | 注释 |
| 1 | slides_id | int | 是 | 是 | 轮播图ID | |
| 2 | title | varchar | 64 | 否 | 否 | 标题 |
| 3 | content | varchar | 255 | 否 | 否 | 内容 |
| 4 | url | varchar | 255 | 否 | 否 | 链接 |
| 5 | img | varchar | 255 | 否 | 否 | 轮播图 |
| 6 | hits | int | 是 | 否 | 点击量 | |
| 7 | create_time | timestamp | 是 | 否 | 创建时间 | |
| 8 | update_time | timestamp | 是 | 否 | 更新时间 |
表 4-21-supplier(供应商)
| 编号 | 字段名 | 类型 | 长度 | 是否非空 | 是否主键 | 注释 |
| 1 | supplier_id | int | 是 | 是 | 供应商ID | |
| 2 | supplier_name | varchar | 64 | 否 | 否 | 供应商名称 |
| 3 | vendor_type | varchar | 64 | 否 | 否 | 供应商类型 |
| 4 | contact | varchar | 64 | 否 | 否 | 联系人 |
| 5 | contact_phone | varchar | 64 | 否 | 否 | 联系电话 |
| 6 | credit_rating | varchar | 64 | 否 | 否 | 信用等级 |
| 7 | note_information | varchar | 64 | 否 | 否 | 备注信息 |
| 8 | create_time | datetime | 是 | 否 | 创建时间 | |
| 9 | update_time | timestamp | 是 | 否 | 更新时间 |
表 4-22-upload(文件上传)
| 编号 | 字段名 | 类型 | 长度 | 是否非空 | 是否主键 | 注释 |
| 1 | upload_id | int | 是 | 是 | 上传ID | |
| 2 | name | varchar | 64 | 否 | 否 | 文件名 |
| 3 | path | varchar | 255 | 否 | 否 | 访问路径 |
| 4 | file | varchar | 255 | 否 | 否 | 文件路径 |
| 5 | display | varchar | 255 | 否 | 否 | 显示顺序 |
| 6 | father_id | int | 否 | 否 | 父级ID | |
| 7 | dir | varchar | 255 | 否 | 否 | 文件夹 |
| 8 | type | varchar | 32 | 否 | 否 | 文件类型 |
表 4-23-user(用户账户)
| 编号 | 字段名 | 类型 | 长度 | 是否非空 | 是否主键 | 注释 |
| 1 | user_id | int | 是 | 是 | 用户ID | |
| 2 | state | smallint | 是 | 否 | 账户状态:(1可用|2异常|3已冻结|4已注销) | |
| 3 | user_group | varchar | 32 | 否 | 否 | 所在用户组 |
| 4 | login_time | timestamp | 是 | 否 | 上次登录时间 | |
| 5 | phone | varchar | 11 | 否 | 否 | 手机号码 |
| 6 | phone_state | smallint | 是 | 否 | 手机认证:(0未认证|1审核中|2已认证) | |
| 7 | username | varchar | 16 | 是 | 否 | 用户名 |
| 8 | nickname | varchar | 16 | 否 | 否 | 昵称 |
| 9 | password | varchar | 64 | 是 | 否 | 密码 |
| 10 | | varchar | 64 | 否 | 否 | 邮箱 |
| 11 | email_state | smallint | 是 | 否 | 邮箱认证:(0未认证|1审核中|2已认证) | |
| 12 | avatar | varchar | 255 | 否 | 否 | 头像地址 |
| 13 | open_id | varchar | 255 | 否 | 否 | 针对获取用户信息字段 |
| 14 | create_time | timestamp | 是 | 否 | 创建时间 |
表 4-24-user_group(用户组)
| 编号 | 字段名 | 类型 | 长度 | 是否非空 | 是否主键 | 注释 |
| 1 | group_id | mediumint | 是 | 是 | 用户组ID | |
| 2 | display | smallint | 是 | 否 | 显示顺序 | |
| 3 | name | varchar | 16 | 是 | 否 | 名称 |
| 4 | description | varchar | 255 | 否 | 否 | 描述 |
| 5 | source_table | varchar | 255 | 否 | 否 | 来源表 |
| 6 | source_field | varchar | 255 | 否 | 否 | 来源字段 |
| 7 | source_id | int | 是 | 否 | 来源ID | |
| 8 | register | smallint | 否 | 否 | 注册位置 | |
| 9 | create_time | timestamp | 是 | 否 | 创建时间 | |
| 10 | update_time | timestamp | 是 | 否 | 更新时间 |
5 系统实现
会员注册时,除了填写基本的个人信息外,还需提供是否有过敏史及慢性病的信息,以便系统提供更加个性化的健康管理建议和服务。会员注册界面如下图所示。
图5-1 会员注册界面
展示医药连锁店的最新活动、推荐药品和服务,为会员用户提供便捷的一站式访问入口,方便快速了解和访问所需信息。首页界面如下图所示。
图5-2 首页界面
提供最新的药品研发进展、安全警示及医药行业动态等信息,帮助会员用户获取专业的药品知识,增强用药的安全性和有效性。新闻资讯界面如下图所示。
图5-3新闻资讯界面
详细列出各类药品的功能介绍、使用方法及价格,并支持按条件筛选和搜索功能,使会员能够轻松找到所需的药品信息。药品信息界面如下图所示。
图5-4药品信息界面
提供个人首页、自提订单、外送订单、用药提醒、收藏和评论管理等功能,便于会员一站式管理个人信息、订单状态、用药提醒、喜爱的商品及发表的评论。个人中心界面如下图所示。
图5-5 个人中心界面
提供全面的数据统计分析,帮助管理员了解系统运营状况并作出数据驱动的决策。后台首页界面如下图所示。
图5-6 后台首页界面
维护供应商的基本信息和合作详情,优化采购流程和供应链管理。供应商管理界面如下图所示。
图5-7供应商管理界面
创建和维护药品分类体系,便于药品信息的组织和检索,提升管理效率。药品分类管理界面如下图所示。
图5-8药品分类管理界面
录入和更新药品详细信息,并设置库存预警机制,确保及时补货以满足客户需求。药品信息管理界面如下图所示。
图5-9药品信息管理界面
5.2.5自提订单管理界面
监控和处理顾客选择到店自取的订单,支持订单确认、取消及状态更新等功能。自提订单管理界面如下图所示。
图5-10 自提订单管理界面
专门针对处方药进行管理,包括验证处方的类型、作用、详情等,确保合法合规销售。处方药管理界面如下图所示。
图5-11处方药管理界面
录入和维护员工个人信息,包括所在店铺、员工姓名、职称、薪资等。员工信息管理界面如下图所示。
图5-12员工信息管理界面
6.1测试目的
测试是为了验证系统在功能、性能、安全性和用户体验等方面的表现。通过测试,可以发现并修复潜在的问题和缺陷,确保系统的正常运行和稳定性。功能验证确保各项功能按设计要求运行;性能评估评估系统的响应时间和并发处理能力;安全检测确保系统的身份认证和数据传输安全;用户体验评估提升界面友好性和操作流程;兼容性测试确保系统在不同设备和浏览器上的兼容性。通过全面的测试,系统将更可靠地支持用户需求,并提供优质的用户体验。
6.2测试用例
对以下功能进行测试,包括包括用户注册、用户登录、药品信息管理、药品分类管理、自提订单管理,具体测试用例如下表所示。
表6-1 用户注册测试用例表
| 用例编号 | 用例名称 | 测试步骤 | 测试结果 |
| TC01 | 用户注册 | 1. 打开注册页面<br>2. 输入有效的用户名、密码、邮箱等信息<br>3. 点击注册按钮 | 注册成功,跳转至登录页面 |
| TC02 | 用户注册(用户名已存在) | 1. 打开注册页面<br>2. 输入已存在的用户名、密码、邮箱等信息<br>3. 点击注册按钮 | 提示“用户名已存在” |
| TC03 | 用户注册(邮箱格式错误) | 1. 打开注册页面<br>2. 输入有效的用户名、错误的邮箱格式<br>3. 点击注册按钮 | 提示“邮箱格式不正确” |
表6-2 用户登录测试用例表
| 用例编号 | 用例名称 | 测试步骤 | 测试结果 |
| TC01 | 用户登录 | 1. 打开登录页面<br>2. 输入已注册的用户名和密码<br>3. 点击登录按钮 | 登录成功,进入首页 |
| TC02 | 用户登录(用户名错误) | 1. 打开登录页面<br>2. 输入不存在的用户名和密码<br>3. 点击登录按钮 | 提示“用户名或密码错误” |
| TC03 | 用户登录(密码错误) | 1. 打开登录页面<br>2. 输入正确的用户名和错误的密码<br>3. 点击登录按钮 | 提示“用户名或密码错误” |
表6-3药品信息管理测试用例表
| 用例编号 | 用例名称 | 测试步骤 | 测试结果 |
| TC01 | 药品信息管理(添加信息) | 1. 登录为管理员<br>2. 进入药品信息管理页面<br>3. 填写药品信息并点击“添加”按钮 | 药品信息添加成功 |
| TC02 | 药品信息管理(修改信息) | 1. 登录为管理员<br>2. 进入药品信息管理页面<br>3. 选择现有药品并修改信息<br>4. 点击“保存”按钮 | 药品信息修改成功 |
| TC03 | 药品信息管理(删除信息) | 1. 登录为管理员<br>2. 进入药品信息管理页面<br>3. 选择药品并点击“删除”按钮 | 药品信息删除成功 |
表6-4 药品分类管理测试用例表
| 用例编号 | 用例名称 | 测试步骤 | 测试结果 |
| TC01 | 药品分类管理(查看分类) | 1. 登录为管理员/教师<br>2. 进入药品分类管理页面<br>3. 查看药品分类信息 | 分类显示正确 |
| TC03 | 药品分类管理(删除分类) | 1. 登录为管理员<br>2. 进入药品分类管理页面<br>3. 选择药品并点击“删除”按钮 | 分类删除成功 |
表6-5 自提订单管理测试用例表
| 用例编号 | 用例名称 | 测试步骤 | 测试结果 |
| TC01 | 自提订单管理(查看列表) | 1. 登录为管理员/<br>2. 进入自提订单管理页面<br>3. 查看自提订单 | 自提订单显示正确 |
| TC03 | 自提订单管理(删除列表) | 1. 登录为管理员/<br>2. 进入自提订单管理页面<br>3. 删除自提订单 | 提示“删除成功” |
6.3测试结果
所有功能均按照预期进行了验证,并且测试结果符合预期要求。用户注册功能通过了有效信息的注册测试,且系统能正确识别用户名重复和邮箱格式错误的情况。用户登录功能也成功验证了正确登录、错误用户名和密码的处理逻辑。药品信息管理方面,管理员可以顺利添加和删除药品信息,且操作成功后,数据能够即时更新。药品分类管理和自提订单管理功能同样测试通过,管理员能够正确查看管理药品分类和会员的自提订单。总的来说,系统在这几个功能模块中的表现稳定,所有测试用例都达到了预期结果,确保了功能的正常运行和数据的准确性。
结 论
本研究成功设计并实现了一个基于Web的医药连锁店管理系统,该系统利用Python语言及Django框架进行后端开发,前端采用Vue.js框架,数据库选用MySQL,确保数据的安全性与高效管理。通过为会员用户提供药品信息查询、个人健康管理、用药提醒等个性化服务,并为管理员提供全面的药品信息管理、订单处理、供应商管理和数据分析等功能,系统显著提升了医药连锁店的运营效率和服务质量。
研究表明,此系统不仅能够有效简化日常运营流程,减少人工操作错误,还能通过个性化的健康管理和用药提醒功能增强用户体验和满意度。对于管理员而言,系统的统计分析和预警机制有助于优化资源配置,提高决策效率。严格的权限管理机制保证了不同角色用户的操作权限合理分配,确保了数据的安全性和一致性。本研究所开发的医药连锁店管理系统为医药零售行业提供了一种新的管理模式和服务理念,极大地提高了工作效率和服务水平。未来的工作可以进一步探索如何集成更多先进技术,如人工智能和大数据分析,以进一步提升系统的智能化程度和用户体验。同时,随着医药行业法规的不断完善,系统还需持续更新以满足更高的合规要求,促进医药行业的健康发展。
参考文献
- 黄维.基于B/S模式的虚拟网络实验室安全管理体系分析[J].信息系统工程,2024,(05):4-7.
- 张宇薇.HTML5在Web前端开发中的应用[J].集成电路应用,2024,41(04):274-276.
- 邱红丽,张舒雅.基于Django框架的web项目开发研究[J].科学技术创新,2021,(27):97-98.
- 段艺,涂伟忠.Django开发从入门到实践[M].机械工业出版社:202211.635.
- 李艳杰.MySQL数据库下存储过程的综合运用研究[J].现代信息科技,2023,7(11):80-82+88.
- 肖睿,李鲲程,范效亮,等.MySQL数据库应用技术及实践[M].人民邮电出版社:202206.228.
- 明日科技.快速上手Python[M].化学工业出版社:202211.337.
- 明日科技.Python Web开发手册[M].化学工业出版社:202201.411.
- 宋金玉,王斌,郑雨.数据库课程的思政实施方法探索[J].计算机教育,2024,(11):87-90.DOI:10.16512/j.cnki.jsjjy.2024.11.024.
- 马健,张丽岩,曹可意.基于MVC架构的课程达成度管理系统设计研究[J].高教学刊,2024,10(16):17-20.DOI:10.19980/j.CN23-1593/G4.2024.16.004.
[11]刘珈毓.医药零售连锁企业运用财务控制措施分析[J].现代营销(上旬刊),2025,(04):109-111.DOI:10.19921/j.cnki.1009-2994.2025-04-0109-037.
[12]杨抒燕,刘霞.健之佳医药连锁集团股份有限公司推进医药零售行业转型升级[N].云南政协报,2025-02-27(005). DOI:10.38262/n.cnki.nynzx.2025.000552.
[13]闫硕.六大连锁药店仅一家实现双增医药零售短暂调整还是颓势已现?[N].21世纪经济报道,2024-09-04(012). DOI:10.28723/n.cnki.nsjbd.2024.003553.
[14]马蓉,祁童,张义帆.青海省A医药连锁物流配送中心优化设计[J].物流工程与管理,2024,46(06):21-24.
[15]郎海庆.JK医药连锁有限公司服务营销策略研究[D].河北大学,2024.DOI:10.27103/d.cnki.ghebu.2024.001977.
[16]邓冬梅,柯小梅.连锁药店运营管理[M].化学工业出版社:202310.265.
[17]Alkaline88 Reports Partnership with America's Largest Drugstore Chain[J].Food and Beverage Close - Up,2021,
[18]ResearchAndMarkets.com Offers Success Case Study: Welcia - Multifunctional Drugstore Chain Threatening Japan's Convenience Store Channel[J].Manufacturing Close - Up,2019,
[19]李力东.医药连锁店管理系统的设计[J].山东工业技术,2015,(22):222.DOI:10.16640/j.cnki.37-1222/t.2015.22.199.
[20]杨玲.医药连锁店药品管理系统的设计与实现[D].电子科技大学,2014.
致 谢
在本研究的完成过程中,我得到了许多来自各方的支持与帮助,在此表达我最诚挚的感谢。
首先,我要感谢我的导师,感谢您在整个研究过程中给予的悉心指导和宝贵建议。您的专业知识、严谨态度以及对科研的热情深深影响了我,并激励我不断追求卓越。
我也要感谢为本次研究提供支持和帮助的朋友和同学们。感谢你们在技术难题解决、资料收集等方面提供的帮助和支持,这些都为本研究的成功奠定了坚实的基础。
最后,我要感谢我的家人,感谢你们在我研究期间给予的理解、鼓励和支持。没有你们的默默付出和坚定支持,我不可能顺利完成这项研究。
衷心希望本研究能够为医药零售行业的信息化管理贡献一份力量,并期待未来能有更多机会与各界人士合作,共同推动医药健康领域的发展。再次感谢所有支持和帮助过我的人!
附 录
登录代码如下:
def Login(self, ctx):
print("===================登录=====================")
ret = {
"error": {
"code": 70000,
"message": "账户不存在",
}
}
body = ctx.body
password = md5hash(body["password"]) or ""
obj = service_select("user").Get_obj(
{"username": body["username"]}, {"like": False}
)
if obj:
user_group = service_select("user_group").Get_obj({'name': obj['user_group']}, {"like": False})
if user_group and user_group['source_table'] != '':
user_obj = service_select(user_group['source_table']).Get_obj({"user_id": obj['user_id']}, {"like": False})
if user_obj['examine_state'] == '未通过':
ret = {
"error": {
"code": 70000,
"message": "账户未通过审核",
}
}
return ret
if user_obj['examine_state'] == '未审核':
ret = {
"error": {
"code": 70000,
"message": "账户未审核",
}
}
return ret
if obj["state"] == 1:
if obj["password"] == password:
timeout = timezone.now()
timestamp = int(time.mktime(timeout.timetuple())) * 1000
token = md5hash(str(obj["user_id"]) + "_" + str(timestamp))
ctx.request.session[token] = obj["user_id"]
service_select("access_token").Add(
{"token": token, "user_id": obj["user_id"]}
)
obj["token"] = token
ret = {
"result": {"obj": obj}
}
else:
ret = {
"error": {
"code": 70000,
"message": "密码错误",
}
}
else:
ret = {
"error": {
"code": 70000,
"message": "用户账户不可用,请联系管理员",
}
}
return ctx.response(json.dumps(ret, ensure_ascii=False))
注册代码如下:
def Register(self, ctx):
print("===================注册=====================")
userService = service_select("user")
body = ctx.body
if "username" not in body and body["username"] == '':
return ctx.response(json.dumps({
"error": {
"code": 70000,
"message": "用户名不能为空",
}
}, ensure_ascii=False))
if "user_group" not in body and body["user_group"] == '':
return ctx.response(json.dumps({
"error": {
"code": 70000,
"message": "用户组不能为空",
}
}, ensure_ascii=False))
if "password" not in body and body["password"] == '':
return ctx.response(json.dumps({
"error": {
"code": 70000,
"message": "密码不能为空",
}
}, ensure_ascii=False))
post_param = body
post_param['nickname'] = body["nickname"] or ""
post_param['password'] = md5hash(body["password"])
obj = userService.Get_obj({"username": post_param['username']}, {"like": False})
if obj:
return ctx.response(json.dumps({
"error": {
"code": 70000,
"message": "用户名已存在",
}
}, ensure_ascii=False))
ret = {
"error": {
"code": 70000,
"message": "注册失败",
}
}
bl = userService.Add(post_param)
if bl:
ret = {
"result": {
"bl": True,
"message": "注册成功"
}
}
return ctx.response(json.dumps(ret, ensure_ascii=False))
找回密码代码如下:
def Forget_password(self, ctx):
print("===================修改密码=====================")
ret = {
"error": {
"code": 70000,
"message": "用户信息不能没有"
}
}
body = ctx.body
if not body["code"]:
return {
"error": {
"code": 70000,
"message": "验证码不存在或者错误"
}
}
obj = service_select("user").Get_obj(
{"username": body["username"]}, {"like": False}
)
if not obj:
return {
"error": {
"code": 70000,
"message": "用户名不存在或者错误"
}
}
password = md5hash(body["password"])
if not password:
return {
"error": {
"code": 70000,
"message": "密码不存在或者错误"
}
}
bl = service_select("user").Set({"user_id": obj["user_id"]}, {"password": password})
if bl:
ret = {"result": {"bl": True, "message": "修改成功"}}
else:
ret = {
"error": {
"code": 70000,
"message": "修改失败",
}
}
return ctx.response(json.dumps(ret, ensure_ascii=False))
修改密码代码如下:
def Change_password(self, ctx):
print("===================修改密码=====================")
ret = {
"error": {
"code": 70000,
"message": "账号未登录",
}
}
request = ctx.request
headers = request.headers
if ("x-auth-token" in headers) and headers["x-auth-token"]:
token = headers["x-auth-token"]
user_id = tokenGetUserId(token, request)
userService = service_select("user")
body = ctx.body
password = md5hash(body["o_password"])
obj = userService.Get_obj({"user_id": user_id, "password": password}, {"like": False})
if obj:
password = md5hash(body["password"])
bl = userService.Set({"user_id": user_id}, {"password": password})
if bl:
ret = {"result": {"bl": True, "message": "修改成功"}}
else:
ret = {
"error": {
"code": 70000,
"message": "修改失败",
}
}
else:
ret = {
"error": {
"code": 70000,
"message": "密码错误",
}
}
else:
ret = {
"error": {
"code": 70000,
"message": "账户未登录",
}
}
return ctx.response(json.dumps(ret, ensure_ascii=False))
增删查改代码如下:
增
def Add(self, ctx):
body = ctx.body
unique = self.config.get("unique")
obj = None
if unique:
qy = {}
for i in range(len(unique)):
key = unique[i]
qy[key] = body.get(key)
obj = self.service.Get_obj(qy)
if not obj:
error = self.Add_before(ctx)
if error["code"]:
return {"error": error}
error = self.Events("add_before", ctx, None)
if error["code"]:
return {"error": error}
result = self.service.Add(body, self.config)
if self.service.error:
return {"error": self.service.error}
res = self.Add_after(ctx, result)
if res:
result = res
res = self.Events("add_after", ctx, result)
if res:
result = res
return {"result": result}
else:
return {"error": {"code": 10000, "message": "已存在"}}
删
def Del(self, ctx):
if len(ctx.query) == 0:
errorMsg = {"code": 30000, "message": "删除条件不能为空!"}
return errorMsg
result = self.service.Del(ctx.query, self.config)
if self.service.error:
return {"error": self.service.error}
return {"result": result}
改
def Set(self, ctx):
error = self.Set_before(ctx)
if error["code"]:
return {"error": error}
error = self.Events("set_before", ctx, None)
if error["code"]:
return {"error": error}
query = ctx.query
if 'page' in query.keys():
del ctx.query['page']
if 'size' in query.keys():
del ctx.query['size']
if 'orderby' in query.keys():
del ctx.query['orderby']
result = self.service.Set(ctx.query, ctx.body, self.config)
if self.service.error:
return {"error": self.service.error}
res = self.Set_after(ctx, result)
if res:
result = res
res = self.Events("set_after", ctx, result)
if res:
result = res
return {"result": result}
查多条数据:
def Get_list(self, ctx):
query = dict(ctx.query)
config_plus = {}
if "field" in query:
field = query.pop("field")
config_plus["field"] = field
if "page" in query:
config_plus["page"] = query.pop("page")
if "size" in query:
config_plus["size"] = query.pop("size")
if "orderby" in query:
config_plus["orderby"] = query.pop("orderby")
if "like" in query:
config_plus["like"] = query.pop("like")
if "groupby" in query:
config_plus["groupby"] = query.pop("groupby")
count = self.service.Count(query)
lst = []
if self.service.error:
return {"error": self.service.error}
elif count:
lst = self.service.Get_list(query,
obj_update(self.config, config_plus))
if self.service.error:
return {"error": self.service.error}
self.interact_list(ctx, lst)
return {"result": {"list": lst, "count": count}}
查一条数据:
def Get_obj(self, ctx):
query = dict(ctx.query)
config_plus = {}
if "field" in query:
field = query.pop("field")
config_plus["field"] = field
obj = self.service.Get_obj(query, obj_update(self.config, config_plus))
if self.service.error:
return {"error": self.service.error}
if obj:
self.interact_obj(ctx, obj)
return {"result": {"obj": obj}}
免费领取项目源码,请关注❥点赞收藏并私信博主,谢谢~

被折叠的 条评论
为什么被折叠?



