精华内容
下载资源
问答
  • 一个完整推荐系统设计实现

    万次阅读 2018-08-14 15:34:55
    工业界完整推荐系统设计。结论是: 没有某种算法能够完全解决问题, 多重算法+交互设计, 才能解决特定场景的需求。下文也对之前的一些博文进行梳理,构成一个完整工业界推荐系统所具有的方方面面(主要以百度...

    工业界完整推荐系统的设计。结论是: 没有某种算法能够完全解决问题, 多重算法+交互设计, 才能解决特定场景的需求。下文也对之前的一些博文进行梳理,构成一个完整工业界推荐系统所具有的方方面面(主要以百度关键词搜索推荐系统为例)

    完整的推荐系统肯定不会只用一种推荐算法

    在学术界, 一般说到推荐引擎, 我们都是围绕着某一种单独的算法的效果优化进行的, 例如按内容推荐, 协同过滤(包括item-based, user-based, SVD分解等),上下文推荐,Constraint-based推荐,图关系挖掘等。 很多比较牛的单个算法, 就能在某个指标上取得较好效果, 例如MAE,RMSE。。。不过有自己的优点, 每种算法也有自己的缺点, 例如按内容推荐主要推荐和用户历史结果相似的item,一般的item-based容易推荐热门item(被更多人投票过)。。。。   所以在工业界,例如各互联网公司, 都会使用多种算法进行互相配合, 取长补短, 配合产品提升效果。而且在完整的推荐系统中,不仅有传统的Rating推荐, 还需要辅以非常多的挖掘, Ranking来达到预期效果

     

    推荐系统3大件:User Profile、基础挖掘推荐、Ranking

    在实践中, 一个完整的推荐系统会主要由3部分组成:

    1. User Profile
    2. 基础推荐挖掘算法
    3. Ranking

    User Profile

    A user profile is a representation of information about an individual user that is essential for the (intelligent) application we are considering user profile主要是用户(注册)信息,以及对用户反馈的信息进行处理,聚合,用于描述用户的特征; 是后续推荐和排序的基石。 一般情况下,user profile会包含以下具体内容:

    1. 用户兴趣数据
    2. 用户的基础注册信息,背景信息:例如用户出生地,年龄,性别,星座,职业等。这些信息一般从用户注册信息中获取;例如高德,百度地图注册用户,淘宝注册用户等
    3. 用户行为反馈:包括显示的反馈(explicit)和隐藏(implicit)的反馈,显示的反馈包括用户的评分,点赞等操作,百度关键词搜索推荐工具上的点赞(正向显示反馈)和垃圾桶(负向显示反馈),淘宝上的评分;隐式反馈包括用户的浏览行为,例如在百度关键词搜索推荐上搜过那些词,淘宝上点击了那些页面,在高德上点击了那些POI等
    4. 用户交互偏好例如用户喜欢使用哪些入口,喜欢哪些操作,以及从这些操作中分析出来的偏好,比如在高德地图上根据用户行为反馈分析出来的用户对美食的偏好:更喜欢火锅,粤菜,还是快餐
    5. 用户上下文信息:这些信息有些是分析出来的,例如在LBS中分析出来的用户的家在哪儿,公司在哪儿,经常活动的商圈,经常使用的路线等

    user profile经常是一份维护好的数据,在使用的时候,会直接使用该数据,或是将该数据存储在KV系统中,供Online系统实时使用。 在搜索或是推荐的场景下,每次请求一般只会涉及到一次user profile的KV请求,所以online使用的时候,主要的实现困难是存储,以及快速KV的快速响应。

    基础挖掘推荐算法

    基础挖掘推荐算法, 主要使用传统推荐算法, 结合分析的item profile和user profile, 建立user和item的关系,此时并不会过多考虑其他因素,例如是否冷门/热门,最主要的就是建立user和item的关系。 在各种论文中狭义的推荐,主要就是指该部分内容。 主要围绕着Rating,以及Top N进行该处的Top N(更像是直接Rating值最高的Top N) 传统的推荐算法研究主要围着这块工作进行,现在已经有很多比较成熟的算法,这些算法相关的研究可参见博文:《推荐系统经典论文文献及资料》;其中也能找到到业界较多成功推荐系统的实践分享 主要包含以下几类:

    1. Content Based推荐: 按内容推荐,主要的工作是user profile, item profile的提取和维护,然后研究各种相似度度量方法(具体相似度度量参见博文:《推荐系统中的相似度度量》)
    2. 协同过滤:相当于应用了用户的行为进行推荐(区别于Content based算法),比较经典的算法包括传统的item-based/user-based算法(参见博文:《协同过滤中item-based与user-based选择依据》,《collaborative-filtering根据近邻推荐时需要考虑的3要素》),SVD,SVD++(具体原理及源码参见博文:《SVD因式分解实现协同过滤-及源码实现》)
    3. 上下文相关推荐:和传统推荐相比, 考虑更多上下文因素,LBS, 移动场景下使用比较多(具体参见博文:《context-aware-recommendation》)
    4. 基于图的关系挖掘推荐:主要是利用图论原理,根据item,user之间的数据,反馈关联关系,挖掘更深层次的关系进行推荐,该类方法一般效果都不错,当然资源要求也较高。具体参见博文:《级联二步图关系挖掘关键词推荐系统》,《频繁二项集合的hadoop实现》《itemrankrandom-walk-based-scoring-algorithm-for-recommener-system
    5. Constrainted-based推荐:根据限制性条件进行演绎推荐

    在实际应用时,我们经常使用按内容推荐,item-based寻找从感知的角度比较靠谱的结果,使用SVD,SVD++,图关系寻找更深层次的联系结果。同时在推荐时,会结合很多因素来进行综合排序,例如关键词, 或是LBS中POI的热度等。具体可参见下文ranking部分。

    算法效果衡量

    以上这些算法, 我们在离线的时候,使用Cross-Validation方式,就可以分析出其效果,而且离线分析的时候,代价比较小,比较容易操作。当然,对于不同的问题会使用对应的指标进行衡量。 对于预测Rating准确性主要是用RMSE,或是MAE;具体可参见博文:《关键词搜索推荐系统中的推荐准确性度量》 如果是排序, 则更多使用NDCG,MAP,  MRR等指标;具体可参见博文:《使用ndcg评估关键词推荐系统的相关性》 在具体应用场景中,对于特定推荐问题,会涉及到选用哪种算法的问题。推荐不像CTR预估这样的问题,目标比较单一,经常我们需要考虑多个指标,而且这些指标可能此消彼长,需要做权衡,例如需要考虑算法的准确性(accuracy),同时也需要考虑算法的覆盖(coverage),置信度(confidence),新鲜度(novelty)和惊喜度(Serendipity),同时还需要考虑推荐为系统带来的收益和效用(utility)。 这些指标经常需要权衡,而且经常提升某一个的时候会导致其它下降,所以有时候存在一定的主观性:我们到底看中哪一个指标?  而且这个问题可能随着系统,平台所处的阶段而不同。 例如在建立口碑的时候,我们可能不太关注coverage,而更关注accuracy,因为要让用户建立一种:该系统很准的认知;如果在系统已经比较成熟了,此时可能需要考虑novelty, serendipity的同时,还需要考虑utility:该推荐能为系统带来什么收益,例如对百度的变现有多大收益? 对淘宝的销售有多少收益等 具体这些指标的选择可参见博文:《选择推荐算法时需要考虑得因素

    Ranking

    此部分是成熟的搜索、推荐系统具有的核心逻辑

    比较简单的实现方法, 是直接对各种特征拍阈值进行线性加权,比较成熟的系统一般会使用机器学习的方式和综合个维特征, 学习出模型后进行排序, 例如使用Learning to rank技术。 该部分需要考虑的因素较多较为复杂。 和传统的推荐相比, 此处单独将Ranking拿出来。 基础推荐挖掘, 和传统的推荐部分比较类似,主要结合user profile, 挖掘哪些item适合推给哪些user。 但仅根据这些挖掘就直接进行推荐是不够的。 真实online推荐场景中, 需要考虑更多其他因素, 例如:相关性,推荐的上下文,CTR预估,以及商业业务规则。

    1. 相关性: item与用户的相关性,这是大多数搜索和推荐任务的基石,例如在搜索中判定一个query和一个document的相关性,或是一个query 和 另一个query的相关性,或是在特征比较多的情况下, 一个user 和一个item 记录的相关性;实现方式可以很简单,例如传统的相似度度量方式(参见博文:《推荐系统中的相似度度量》),对于文本,业界使用简单的TF*IDF,或是BM25; 不过很多时候我们需要增加更多维度特征,包括推荐item本身的重要性,例如IDF,Pagerank(具体参见博文:《pagerank的经济学效用解释》),同时使用模型来提升相关性判断的准确性。使用模型的方式会更加复杂,但效果提升也非常明显。具体可参见博文:《集成树类模型及其在搜索推荐系统中的应用》,《分类模型在关键词推荐系统中的应用》,《adaboost
    2. 推荐的上下文:例如推荐产品的入口,交互方式, 不同的入口,甚至同一入口的不同交互方式, 推荐的结果有可能都需要不一样; 在LBS生活服务中, 请求发生的时间, 地点也是推荐需要重点考虑的上下文因素,例如饭点对餐饮item的提权; 异地情况下对酒店等结果的加权等
    3. CTR预估:成熟的商业系统都会使用模型来完成CTR预估,或是转化预估
    4. 以及商业业务规则:例如黑白名单,或者强制调权。例如在百度关键词搜索推荐中,某些有比较高变现潜力的词, 就应该加权往前排; 比如在高德LBS服务中,有些海底捞的店点评评分较低, 但我们也应该往前排;或是在搜索引擎中,搜国家领导人的名字, 有些最相关的结果可能因为法律因素是需要屏蔽的

     

    本文转自http://semocean.com

    展开全文
  • 互联网+药店推荐系统设计与实现

    万次阅读 多人点赞 2018-08-06 09:35:46
    1.1 研究背景意义 6 1.1.1 研究背景 6 1.1.2 研究目的意义 6 1.2 研究现状 7 1.2.1 管理信息系统研究现状 7 1.2.1.1 管理信息系统发展历程 7 1.2.1.2 管理信息系统应用综述 11 1.2.2 Web GIS应用现状 12 ...

    论文word版下载地址

    目录

    中文摘要 3

    Abstract 4

    1  绪论 6

    1.1 研究背景与意义 6

    1.1.1 研究背景 6

    1.1.2 研究目的与意义 6

    1.2 研究现状 7

    1.2.1 管理信息系统研究现状 7

    1.2.1.1 管理信息系统发展历程 7

    1.2.1.2 管理信息系统应用综述 11

    1.2.2 Web GIS应用现状 12

    1.2.3 网络文本评论挖掘与分析研究现状 14

    1.2.4 推荐算法研究现状 15

    1.3 研究内容 16

    1.4 本论文的结构安排 17

    2  相关技术与算法 17

    2.1 开发语言及基础框架 17

    2.2 数据存储技术 18

    2.2.1 为何选择MySQL 18

    2.2.2 Elasticsearch技术简介 19

    2.3 地理信息技术 20

    2.4 评论文本情感极性分析技术 21

    2.5 推荐算法 24

    2.6 权限及安全验证技术 28

    3  互联网+药店推荐系统需求分析 32

    3.1 可行性分析 32

    3.1.1 经济可行性分析 32

    3.1.2 技术可行性分析 32

    3.1.3 操作可行性分析 32

    3.2 需求分析 33

    3.2.1 业务需求分析 33

    3.2.2 系统软件需求分析 33

    3.2.3 系统运行环境需求分析 34

    3.3 系统功能需求分析 34

    3.4 用户使用需求分析 34

    4  系统设计 35

    4.1 总体设计 35

    4.1.1 系统设计原则 35

    4.1.2 系统设计总体目标 35

    4.1.3 系统设计总体架构 36

    4.2 概要设计 36

    4.2.1 模块划分 36

    4.2.2 业务流程分析 37

    4.2.2.1 普通用户 37

    4.2.2.2 药店管理员 38

    4.2.2.3 系统管理员 39

    4.3 数据库设计 40

    4.3.1 数据库命名规则 40

    4.3.2 数据库逻辑结构设计 41

    4.3.2.1 权限模块逻辑结构设计 41

    4.3.2.1 业务模块逻辑结构设计 42

    4.3.3 主要数据表设计 42

    4.4 详细设计 46

    4.4.1 系统程序代码设计 46

    4.4.2 系统结构设计及子系统划分 48

    4.4.3 系统功能模块详细设计 49

    4.4.3.1 用户登录子系统S001 49

    4.4.3.2 后台管理子系统S010 50

    4.4.3.3 药店管理子系统S011 54

    4.4.3.4 地理信息子系统S100 56

    4.4.3.5 评论管理子系统S101 58

    4.4.3.6 药店推荐子系统S110 59

    4.4.3.7 客户使用子系统S111 60

    5  主要功能展示 62

    5.1 用户登录展示 62

    5.2 普通用户功能展示 63

    5.3 系统管理员功能展示 66

    5.4 药店管理员功能展示 70

    6  结论与展望 71

    6.1 结论 71

    6.2 展望 72

    参考文献 73

     


    中文摘要

    随着社会的进步与发展、社会基础设施建设和服务也越来越完善。药店深入到了城市的各个社区,为我们买药治小病带来了方便。同时,由于药店越来越多、药店等级、服务水平参吃不齐、药品种类繁多等,消费者容易患上选择困惑症。为使消费者挑选到合适的药店和满意药品,也为使药店管理者将本药店和药店药品更好的呈现给消费者,本文设计和实现了互联网+药店推荐系统。

    本系统的实现主要用Java语言开发,采用了当前流行的开源框架和技术,并融合了Web GIS技术、情感分析算法和推荐算法;数据存储采用MySQL和Elasticsearch,Elasticsearch用于存储用户行为和用户评价等数据量较大的数据,便于查询、检索和分析,其他系统数据存储在MySQL数据库。该系统包括用户登录子系统、后台管理子系统、药店管理子系统、地理信息子系统、评论管理子系统、药店推荐子系统和客户使用子系统。

    本系统分为前端和管理后台。前端包括浏览附近的药店、关键词查找推荐药店、查看推荐药店的药品信息和历史用户评论、导航至推荐药店、对推荐方案中的药店药品进行评价等功能,可用于移动端设备,主要服务于普通用户;管理后台主要在PC端使用,包括系统管理如资源、角色、用户等管理以及药店、药品管理等功能,服务于系统管理员和药店管理员。

    本系统满足了消费者个性化买药需求,解决了消费者药店、药品选择的困难,为消费者在最短的时间推荐最合适的购药方案,节约了时间成本,同时也营造了一个更好的购药氛围和环境,药店和药店的药品也能更好的展现给消费者,为消费者和药店带来了双赢。

     

    关键词: 药店,药品,推荐系统,Web GIS,情感分析,互联网+

     

     

     

     

     

    Abstract

    With the progress and development of society, social infrastructure construction and services are also becoming more and more perfect. The pharmacy went deep into the various communities in the city and brought convenience for us to buy medicines to cure minor ailments. At the same time, due to the increasing number of pharmacies, pharmacy levels, poor access to quality and service, and wide variety of medicines, consumers are prone to choice confusion. In order to enable consumers to select suitable pharmacies and satisfactory medicines, and in order to enable pharmacy managers to better present this pharmacy and medicine to consumers, this paper designed and implemented an Internet plus pharmacy management system.

    The implementation of this system is mainly developed in the Java language, using the currently popular open source frameworks and technologies, and integrating Web GIS technology, sentiment analysis algorithms and recommendation algorithms;   The system uses MySQL and Elasticsearch to storage data, Elasticsearch for storing user behavior data and user evaluation data with a large amount of data is easy to query, retrieve, and analyze. Other system data is stored in the MySQL database. The system includes a user login subsystem, a background management subsystem, a pharmacy management subsystem, a geographic information subsystem, a comment management subsystem, a pharmacy recommendation subsystem, and a customer use subsystem.

    The system is divided into front-end and management background. The front end includes functions such as browsing a nearby pharmacy, finding keywords to find a recommendation pharmacy, viewing medicine information and historical user reviews of a recommended pharmacy, navigating to a recommended pharmacy, and evaluating pharmacy medicines in a recommended plan, which can be used in a mobile device and mainly face to customers; The management background is mainly used on the PC side, including system management such as resources, roles, users and other functions as well as pharmacy, medicine management and other functions. It’s faces to system administrators and pharmacy administrators.

    The system meets the needs of consumers for personalized medicine purchases, solves the difficulties of consumer pharmacies and medicine selection, recommends the most suitable medicine purchasing plan for consumers in the shortest time. it saves time cost, and also creates a better medicine purchasing environment, pharmacies and medicines can also be better demonstrated to consumers, this bringing a win-win situation for consumers and pharmacies.

     

    Key Words: pharmacies, medicines, recommendation system, Web GIS, sentiment analysis, internet plus

     

    1  绪论

      1.  研究背景与意义
        1. 研究背景

    随着社会经济的发展,城市化进程的加快,越来越多的药店慢慢进入人们的视线。在“大病进医院,小病上药店”的医药消费模式下,近些年来药店数量猛增。相对于日益增长的药店来说,传统小诊所的数量却在慢慢减少。调查发现,产生该现象的原因主要包括以下几个方面:

    • 相对于开设诊所,经营药店门槛较低,费用较低;
    • 经营药店风险低,只要按规定经营,不会出现什么重大问题
    • 看病贵,很多人小病选择在药店买药;
    • 药店买药方便,去医院或诊所麻烦且看病流程复杂,费时费力;
    • 药店需求旺盛,利润高。

    药店给人们看病带来了极大的方便的同时,也带来了很大的困扰,消费者在需要买药时,时常有如下困惑:

    • 药店太多,药店等级参差不齐,该怎么选择?
    • 地理环境不熟悉,不清楚药店的具体位置,要怎么快速到达想去的药店?
    • 面对种类繁多的药目,琳琅满目的药品,该如何选择?
    • 药剂师推荐的药实惠吗?怎么才不会被宰?

    本论文的研究即是希望通过互联网+药店推荐系统解决消费者去药店买药的困惑。

        1. 研究目的与意义

    随着互联网技术的飞速发展,我们逐渐从信息匮乏的时代很快步入了信息过载的时代。我们将药店定义为信息的生产者,将买药的患者定义为信息的消费者。

    目前,无论是信息的生产者还是信息的消费者都遭遇到了非常大的挑战。作为信息消费者,如何从大量的药店中挑选出自己满意的药店,如何从海量的药品中挑选出对症的药品是一件很困难的事;作为信息的生产者,如何让药店和药店的药品信息脱颖而出,受到消费者的广泛关注,同样是一件十分困难的事。

    本论文研究的主要目的就是为了解决药店与消费者的这一矛盾,通过联系消费者和药店信息,一方面帮助消费者发现对自己有价值的药店、药品信息,另一方面让药店和药店信息能够更有效的展现在对它感兴趣的消费者面前,从而实现药店和消费者的双赢。

    为满足消费者个性化的购买药品需求,我们将GIS(Geographic Information Systems,地理信息系统)技术、评论挖掘与分析算法、推荐算法整合到药店管理系统中,形成互联网+药店推荐系统。用户使用该系统输入个性化查找需求,系统通过整合用户需求、药店药目信息、药店位置信息、药店评论信息、历史用户记录等,为用户推荐最为合适的1-3个药店,并罗列出推荐药品列表。客户选中推荐的药店后,可以通过本系统导航至该药店进行药品购买。互联网+药店推荐系统为消费者提供了便捷且更可靠的购药解决方案。

      1.  研究现状
        1.  管理信息系统研究现状

    1.2.1.1 管理信息系统发展历程

    随着管理理论和计算机技术的发展,管理信息系统的发展经历了6个时期,如图1-1所示。

    图1-1 管理信息系统发展的6个时期

    • 订货点法

    订货点法(Order Point Method,OPM)开始于20世纪30年代。其原理是:由于生产或者销售,某一类物料或者产品的库存将会慢慢减少。我们为该物料或产品的库存设置最低库存量,即库存阈值,当库存下降至库存阈值时,为补充库存,我们发出采购订货单或加工订货单,当所定的物料或者商品到达仓库时恰好能够补充前一时期的降低量,将其库存降低至安全库存,该订货的数量值,称为订货点。如图1-2所示。

    图1-2 订货点法

    在大批量的生产组织方式下,需求或消费量相对稳定的物料或产品适用订货点法。

    • 物料需求计划

    物料需求计划(Material Requirements Planning,MRP),该理论由美国的Jo-seph A.Orlicky于1960s中期提出。他将原材料、辅料、中间产品、产品等这些企业生产过程中所涉及的材料在逻辑上看做同种物料,然后将企业生产过程中所需的各类物料划分为独立与相关两种需求类型。

    图1-3 物料需求计划

    MRP一般适用在订购业务方面,其没有深入到企业生产和管理的核心之中,而只是涉及到企业与市场的界面。

    • 闭环MRP(Closed Material Requirements Planning)

    闭环MRP(Closed Material Requirements Planning)将能力需求计划和执行及控制计划的功能也加入进来,形成一个闭环,如图1-4所示,即为“计划-实施-评价-反馈-计划”的一个循环工作流程。

     

    图1-4 闭环MRP

    闭环MRP既适用订购业务,又深入企业生产管理的核心,实现了人力、机器、材料等各类生产资料的计划和控制,进而使得在生产管理方面对市场的应变能力显著增强。

    • 制造资源计划

    制造资源计划(Manufacturing Resource Planning,MRPⅡ),将MRP作为核心,生产计划的制定依赖于企业经营目标,扩展信息共享的范围,将生产-销售-财务-采购-工程融合在一起,如图1-5所示,实现了数据集成与共享,形成全面的生产管理集成与优化模式。

    图1-5 制造资源计划MRPⅡ

    MRPⅡ适用于企业对制造资源的管理,企业内部各部门之间的信息交流单一的企业的管理。  

    • 企业资源计划

    企业资源计划(Enterprise Resource planning,ERP),它通常被称为一类商业管理软件,通常是一套集成应用程序,企业可通过它收集、存储、管理和解释来自商业活动的数据。ERP系统是一个实时(或接近)运行的集成系统,它支持所有应用程序的通用数据库,无缝连接各模块,用户的感觉即为统一的整体。ERP系统一般涵盖的功能区域包括:财务和会计、管理会计、人力资源、制造、订单处理、供应链管理、项目管理、客户关系管理。数据服务等。ERP最根本的优势在于将企业的各类业务流程进行整合,节省了时间和成本,管理层可以更快速的做出决策并减少错误;最大的难点在于统一ERP系统可能是一项艰巨的任务(特别是对于大公司),需要大量的时间、规划以及资金。

    • 计算机集成制造系统

    计算机集成制造系统(Computer Integrated Manufacturing System,CIMS),是一种使用计算机来集成控制整个生产过程的生产制造方法,它允许各个进程之间相互交换信息并协同工作。其主要优势在于能够创建自动化制造流程,可以加快制造速度且不易出错。与传统的“熄灯工厂”不同,它完全独立于人为干预,系统涉及灵活的制造,工厂可以快速修改以生产不同的产品,或者可以借助计算机快速更改产品数量。

    图1-6 计算机集成制造系统CIMS

    顺利运作的计算机集成制造系统的发展面临三大挑战:

    • 集成来自不同供应商的组件:当不同的机器(如传送带、机器人等)使用不同的通信协议可能会导致系统集成面临较大困境。
    • 数据完整性:自动化程度越高,用于控制机器的数据的完整性就越关键。虽然CIMS节省了操作机器的劳动力,但需要额外的人力来确保对用于控制机器的数据信号有适当的保护。
    • 过程控制:计算机可用于协助制造工厂的操作人员,但必须有一位能胜任的工程师来处理控制软件设计人员无法预见的情况。

    1.2.1.2 管理信息系统应用综述

    为了优化产业结构,减少管理成本,提高生产效率,企业越来越多重视自身的信息化建设。管理信息系统的建设和使用已深入社会的各行各业之中,如企业管理[1-5]、工程建设管理[6-8]、教育[9-12]、科研[13-14]、金融[15-17]、社保[18-19]、电力[20]、物流[21]、医疗[22]、旅游[23]、农业生产[24-26]等,并随着互联网技术的发展向智能化[27]、物联网化[28]方向发展。

    在企业与工程管理方面,乐伟平[1]在现代企业人力资源管理要求的基础上,根据企业人力资源管理的需求,设计出符合WEB应用的企业人力资源管理信息系统。针对目前仓库信息管理系统在通用性、多样化、有效性等方面的不足与缺陷,彭红利[2]在仓库高效管理工作流程的各个环节基础上,提出通用物资仓库管理信息系统的设计与实现的方案。谢鹏[5]通过分析管理系统研究和实现过程中存在的问题,采用B/S架构,运用.Net等Web技术等开发和实现一个功能完善的建筑企业管理信息系统。张宇栋[8]在深入研究企业安全生产管理中事故隐患排查治理及预警的主要功能需求和业务逻辑的基础上,构建以隐患排查治理为核心的生产事故隐患排查治理及预警信息系统的基本架构,设计了生产事故隐患排查治理及预警管理信息系统。

    在教育与科研方面,骆鹏傲等[9]将管理信息系统应用于研究生招生与培养管理,提高了研究生管理的工作效率。宋甜[10]为提升高校学生管理的工作效率,减少各级教育管理部门和高校都在学生信息的管理方面的人工资源、物资资源和财产资源,推动信息化的高校学生管理实现信息化管理平台,实现了学生信息管理系统设计与实现。管伟元[13]等以自主研发的科研设计管理信息系统为基础,采用数据库优化等技术,总结出了适用于一般信息管理系统的指导性方法。杨扬等[14]开发了包括立项管理、人力资源管理、科技成果管理、经费管理、考核管理及统计分析等模块的科研项目管理信息系统,提高了科研项目管理效率。

    在金融与社保方面,杨彦璐[16]设计了民生银行信贷管理信息系统,该系统实现办公自动化平台的升级,其主要思想是将信贷管理业务流程信息化、规范化,有效的提高信贷审批的效率、提高信贷管理的质量,同时为信贷管理、信贷服务、信贷咨询人员提供统一的办公平台。苏樱[17]开发了资金管理信息系统平台,实现了“管理上信息化、界面上个性化、操作上自动化”。刘耘礽[18]对我国社保基金一体化管理信息系统进行了研究和设计,为社保基金管理信息化建设提供了思路和参考。刘毅新[19]开发了社会保险管理信息系统,实现了信息查询、结算与财务管理以及分析预测等功能。

    在其他生活领域方面,李维雅[22]为提高医院管理信息系统日常维护和管理能力,促进医院工作的顺利开展,归纳总结了医院管理信息系统的日常管理与维护的重要性,并对其日常管理与维护的主要内容和相关策略进行分析。针对我国旅游业的信息管理水平依然处于滞后的状态,传统的信息管理方法无法满足现阶段旅游业发展的需要,张曼玲[23]等对旅游管理信息系统系统的可行性、设计和实现进行了进一步设计。吴健[26]以种猪养殖业现状、信息管理需求等为理论基础,分析了种猪养殖管理工艺。在种猪场生产管理阶段将先进、科学的信息、数字化技术运用其中,对种猪数字化管理信息系统进行建构。此外,管理信息系统已应用到智慧城市建设[27]和智能物联网平台建设[28]。

    在药店和药品管理方面,管理信息系统的设计方案也十分成熟[29-32]。本系统在前人基础上设计和实现药店及药品基础信息的管理、药店和药品评价管理等,其基础数据即是用于给消费者推荐药店药品数据的直接或间接来源。

        1.  Web GIS应用现状

    地理信息系统(Geographic Information Science,GIS)综合了地理学、制图学、测量学、测地学、计算科学和远程传感技术等诸多学科与技术而形成的一个复杂的计算管理机系统,该系统为采集、传输、存取和回显现实世界中的空间信息实现了一系列功能完善且强大的工具。Web GIS可理解为基于Web环境的GIS。

    目前,国内优秀的GIS平台有很多,商业化的如SuperMap,MapGIS等。SuperMap是北京超图软件股份有限公司研发的大型GIS平台,它包括云GIS平台软件、桌面GIS平台、移动GIS开发平台、网络客户端GIS开发平台、组件GIS开发平台以及相关的空间数据生产、加工和管理工具。MapGIS是武汉中地信息工程有限公司研发的大型基础地理信息系统管理平台,该平台结合了图形、图像、地质、地理遥感、测绘、人工智能、计算机科学等知识的大型智能GIS平台。这些GIS平台功能强大,定位十分精确,应用范围广泛,并且可提供定制开发或支持二次开发。免费的Web GIS服务则更广泛的应用于Web应用中,如百度地图API、高德地图API、谷歌地图API等。

    百度地图方面,程彬等[33]利用BaiduMapAPI实现生成房源周边地物动态的评价功能,采用PHP语言和MYSQL数据库开发了小型GIS平台。张欣欣[34]使用百度地图实现驾车导航功能,选定起点与终点,可查询出最少时间,最短距离,避开高速三种驾车方案。郑诗嘉等[35]剖析现有O2O餐饮系统存在的不足,将百度地图的定位功能应用于O2O餐饮系统中。孙迪等[36]则研究了百度地图API在WebGIS中的应用方法和过程,分析了百度地图API与WebGIS结合的优势,实现了交通流量的查询。姜珊等[37]认为传统GIS平台开发过程繁琐、运维成本较高,因此利用百度地图API技术开发水库信息显示系统。

    高德地图方面,鲁萱萱[38]设计了一个专注于发现与分享运动的APP,该APP的实现运用了高德地图API与投放自定义POI点的算法,方便骑行范围内的骑友进行交流。马超等[39]设计一款基于高德地图的生活服务平台,该平台可实现对周边医院、超市、派出所等查询导航功能,以及数字地图的基本功能。李庭威等[40]通过服务端读取rtklib传来的位置信息,提取出经纬度传给客户端,将高精度差分位置信息显示在高德地图上,可实时更新测量点的位置。吴国华[41]开发了基于高德地图 API的公交查询系统项目,并以该项目为教学案例,教授学生。

    谷歌地图方面,吴肖等[42]使用谷歌地图提供的可添加各种个性化功能的API进行二次开发,开发了校园电子地图。李垠等[43]通过使用谷歌地图API,快速、有效的将将已发生的地震相关信息和实时地震信息已地图、影像的形式展示出来,为公众提供了一个十分友好、方便的地震信息管理平台。霍胜春等[44]将谷歌地图API用于系统中来解决流动机械的远程监控,提高了港口机械的效率,实现港口的经济效益。

    本系统Web GIS采用基于百度地图的API,因为百度地图在兴趣点(Point of Interest,POI)的展示功能上更为强大,且网页版地图上百度地图API的平台性更好。

        1.  网络文本评论挖掘与分析研究现状

    网络文本评论挖掘,或称意见挖掘,即是面向网络文本,分析出有用的意见信息或知识。主要应用包括:①产品(电商商品)评论挖掘;②舆情分析等。

    产品评论挖掘方面,通过分析用户评价,可进行商品推荐或作为产品(服务)改进的参考依据。许祥军等[45]认为挖掘网络评论能够为产品开发提供有用的信息,他们结合了几个经典的文本挖掘方法包括词频统计、点互信息算法、词频-逆文档频率作为特诊提取的方法,并通过情感分析和情感强度分析提出了面向产品开发的评论挖掘方案。程惠华等[46]通过挖掘产品评论,并进行情感倾向性分析,得出用户对产品的满意度。李涵昱等[47]认为挖掘商品评论,对分析商品口碑、进行商品推荐有十分重要的价值。黄秋义等[48]运用网络爬虫技术爬取商品评论信息,采用语义分析和数学统计方法进行情感倾向性分析,实现了面向电商平台的意见挖掘模型。刘紫玉等[49]研究了基于消费者评论挖掘的B2C网购物流服务因素类型和作用机制,设计了物流服务质量的作用方案,该方案对改善电商企业物流服务质量、提高竞争力能够发挥重大作用。郑玉桂[50]则针对电商评论,加入了句子级的细颗粒度的情感倾向性分析,不仅可以分析整篇评论的情感极性,也可以分析出评价实体的情感极性。郗亚辉[51]研究了产品评论中的特征同义词识别方法,选取了must-link和can-not-link两类约束,并采用了层次聚类算法。陈义[52]通过分析天猫商城和京东商城用户对手机的评论发现,天猫商城的用户更在意手机的性价比和购物体验,而京东商城的用于则更在意手机的整体性能。

    舆情分析方面,我们将其分为社会舆情分析和企业舆情分析。

    社会舆情分析,通过挖掘分析突发事件、热门话题等网络评论文本,了解网民所持的态度,有助于民心,也有利于舆情预警和导向,有利于国家安全和社会稳定。傅黎犁等[53]以“毒胶囊”事件为案例进行了舆情检测和分析,探讨了医学情报机构如何在突发事件中进行舆情分析。张瑜等[54]以微博热议话题“背景单双号限行常态化”为例,研究了社交媒体舆情分析方法,并将主体分类模型引入舆情分析之中,以时间为脉络进行面向主题的情感分析,为舆情分析提供了对象和时点选择的建议。宋铁等[55]通过监测几件突发公共卫生事件的网络舆情,认为舆情监测系统是现代疾病控制工作的一个重要手段,是疫情监测的有效的辅助手段。李斅葳[56]采用数据挖掘、关联分析、聚类分析等技术和算法,设计了基于敏感信息的意见挖掘方案。姜胜洪[57]研究了网络谣言的形成、传导与舆论导向机制,为降低网络谣言的危害,建议政府加强网络舆情分析判研,加快培养意见领袖等意见。

    企业舆情分析,通过挖掘分析用户对企业或竞争对手评论,为企业提供危机负面监测,有利于市场数据调研、品牌营销分析、品牌形象维护等。陈元等[58]构建企业竞争情报挖掘模型,从用户评论中获取产品竞争情报,并应用于企业产品的分析。石进等[59]认为随着互联网的发展,舆情对企业影响越来越大,舆情监控系统是企业竞争情报必不可少的一部分。叶水茂[60]针对企业如何提升危机管理和舆情应对能力,如何在舆论导向中转“危”为“机”等问题提出了应对的方案。

    本系统主要通过挖掘用户病因与药品选择关联关系和挖掘对药店、药品的评论,分析出病因、药店、药品选择的最佳组合方式,作为药店推荐的主要参考数据之一。

        1.  推荐算法研究现状

    目前,学者对于推荐算法的研究主要分为以下四个方面:①基于内容的推荐算法;②协同过滤推荐算法;③基于知识的推荐算法;④混合推荐算法。

    基于内容的推荐算法,例如个性化新闻推荐、给用户打上个性化标签、依据用户喜好等。刘世杰等[61]分析了网络新闻推荐的策略,研究了推荐系统模型,总结了基于个性化新闻推荐的方法。黄志强[62]提出了一种层次化标签推荐算法,使用余弦相似度计算标签的相似性,从而为物品添加精确度更高的标签。张东伟[63]研究了面向用户偏好的包推荐算法,为准确区分用户的相似度,提出了一种基于灰色关联的相似度计算方法,为降低推荐算法复杂度,提出了基于效用的包推荐算法,提高了推荐结果的质量。

    协同过滤推荐算法,简单理解即是“物以类聚、人以群分”,具有相似属性的人或物具有相似的需求。协同过滤算法分为两种,一种为基于用户的协同过滤算法,一种为基于物品的协同过滤算法。

    基于用户的协同过滤算法方面,贺桂和[64]设计了一种基于用户偏好挖掘的电子商务协同过滤推荐算法。该算法利用用户偏好挖掘技术进行用户显性偏好知识和隐性偏好知识的挖掘分析,实现基于用户偏好知识的最近邻居社区构建和智能推荐。韩亚楠等[65]通过用户属性偏好和项目流行度计算用户对项目的偏好度,并将基于时间的兴趣度权重函数和偏好度引入到项目相似度计算和推荐过程中,确定项目最近邻集合,从而实现最优推荐。杨大鑫等[66]认识到传统协同过滤算法在处理的数据时存在数据稀疏性和扩展性不佳等问题,提出利用Weighted Slope One算法缓解其数据稀疏性,利用基于最小方差的K-means算法提高其扩展性。

    基于物品的协同过滤算法方面,卜旭松[67]面对海量的视频资源,对视频相似度和用户偏好进行计算,提出了改进的基于物品协同过滤推荐算法。吴玺煜等[68]使用知识图谱表示学习方法通过计算物品之间的语义相似性,将物品自身的语义信息融入协同过滤推荐。算法弥补了协同过滤算法没有考虑物品本身内涵知识的缺陷,在语义层面上增强了协同过滤推荐的效果。李琳娜等[69]认为物品之间的相似关系具传递性,提出基于启发式的物品相似度传播的协同过滤推荐方法。

    基于知识的推荐算法,这种方法比较典型的是构建领域本体,或者是建立一定的规则,进行推荐。曾维明[70]通过引入语义网和本体的技术,构建基于本体的语义检索系统,并基于电影语义检索系统的需求,提出基于本体的个性化推荐算法。何明等[71]为了提高个性化推荐效率和推荐质量,平衡冷门与热门数据推荐权重,改进了基于关联规则的Apriori算法,设计了基于k前项频繁项集的剪枝方法,该方案提高了频繁项集的提取效率,拥有较高的推荐非空率、调和平均值和推荐准确率,有效地平衡了冷、热门数据的推荐权重。

    混合推荐算法,顾名思义该方法会以加权或者串联、并联等方式融合以上方法。金紫嫣等[72]将标签推荐技术与协同过滤算法融合,提出一种新的混合式广告推荐算法,将广告关键词作为标签引入到Query页的相似性计算中,建立一种基于广告关键词的搜索广告兴趣模型。使用Top-N策略以减少最近邻候选集的大小,并基于预测CTR筛选出广告推荐结果。陈平华等[73]提出一种结合关联规则的协同过滤改进算法,首先挖掘项目之间的强关联规则,接着,将强关联规则过滤和拆分;最后将拆分后的强关联规则集成到相似度矩阵中,该算法提高了推荐系统准确性、有效性和适用性。

    本系统采用混合推荐算法,该算法将症状关键词、用户评价、药店地理位置等因素,融入协同过滤推荐算法之中,形成互联网+药店推荐算法。

      1.  研究内容

    药店及药品信息管理:将药店抽象为对象,一个对象具有很多属性,本论文需要研究用户关心哪些属性,我们需要采集哪些属性。同理,药品信息的属性也非常多,需要对这些属性进行筛选。

    权限管理:一个应用系统的权限的管理非常重要,用户角色不同,权限不同,对应的功能也就不同。

    数据存储技术:目前主要的关系型数据库有MYSQL、SQL SEVER、ORACLE三种。本论文需要研究关系型数据库是否能满足本系统所有数据存储要求。其中,药品评论数据量级可能较大,选择何种存储方式能提高查询和分析效率。

    地图上兴趣点的标注展示与导航:药店即为本系统地图上的兴趣点,我们需要研究如何将兴趣点更友好的展示给用户,如何从用户所在位置导航至其选择的药店位置。

    评论文本情感极性分析:本系统的评论文本来至用户对药店、药品的评论。如何分析评论的情感极性以及如何展示给用户是本论文需要研究的内容。

    推荐算法:当用户输入关键词后,如何将最合适的药店和药品推荐给用户是本论文需要研究的内容。

      1.  本论文的结构安排

    本论文各章节内容安排如下:

    第1章:绪论。主要介绍本文的研究背景与意义;分析管理信息系统、Web GIS、网络文本评论挖掘与分析、推荐算法的研究现状,并分别引出本文的方法的思想;介绍本文的研究内容和论文的结构安排。

    第2章:相关技术与算法。主要介绍系统的开发语言及基础框架、数据存储技术、地理信息技术、评论文本情感极性分析技术、推荐算法和权限及安全验证技术。

    第3章:互联网+药店推荐系统需求分析。主要进行可行性分析、需求分析、系统组织架构分析、系统功能需求分析、用户使用需求分析、业务流程分析。

    第4章:系统设计。包括总体设计、概要设计、数据库设计、详细设计。

    第5章:主要功能展示。包括用户登录功能展示、普通用户功能展示、系统管理员功能展示和药店管理员功能展示。

    第6章:结论与展望。总结了本文工作,并指出了系统存在的不足和后续的改进方向。

    2  相关技术与算法

    2.1 开发语言及基础框架

    系统主要采用Java语言开发,情感极性分析模块使用了一个开源工具,是用Python语言开发的。主要基础技术及框架、版本及说明如表2-1所示。

    表2-1 基础技术及框架、版本及说明

     

    名称

    版本

    说明

    服务端技术

    JDK

    1.7

    Java虚拟机版本

    Tomcat

    8.5.6

    Web服务器中间件

    Python

    3.6.1

    情感极性分析模块开发语言

    Spring

    4.1.6.RELEASE

    轻量级的Java 开发框架

    SpringMVC

    4.1.6.RELEASE

    Spring 框架提供了构建 Web 应用程序的全功能 MVC 模块

    Mybatis

    3.3.0

    Java的持久层框架

    Shiro

    1.2.4

    权限及安全框架

    druid

    1.0.14

    数据库连连接池

    ehcache

    2.6.11

    纯Java的进程内缓存框架

    前端技术

    Jquery

    2.1.4

    快速、简洁的JavaScript框架

    Amaze UI

    2.7.2

    前端UI框架,支持H5

    Layer

    2.3

    漂亮的弹出层框架

    DTGrid

    1.2.1

    表格插件

    JQuery validation

    1.14.0

    数据合法性验证插件

    百度地图API

    3.0

    JavaScript API

    数据存储技术

    MySQL

    5.5

    数据库

    Elasticsearch

    5.0

    基于Lucene的搜索服务器,千万级量数据量查询与分析可到毫秒级

    2.2 数据存储技术

    本系统数据存储主要用MySQL数据库,用户评论信息数据量较大,采用分布式文档存储技术Elasticsearch。

    2.2.1 为何选择MySQL

    MySQL是一个开源的关系型数据库管理系统,使用SQL进行数据库管理,与Oracle、SQLServer、DB2等大型关系型数据库,其功能相对较弱。其主要特点包括:

    • 开源,几乎免费,使用成本和维护成本较低;
    • 可处理千万级大型数据;
    • 跨平台,可移植性好,支持Windows、Linux、MAC等多种操作系统;
    • 支持多种语言,为C、C++、Python、Java、Perl、PHP、Ruby等多种编程语言提供了API;
    • 支持SQL语法规范。

    MySQL应用十分广泛,大多数互联网公司数据库都是用的MySQL或者有用MySQL,如淘宝、京东、腾讯、百度等,特别是采用PHP开发的应用几乎都是用MySQL。

    2.2.2 Elasticsearch技术简介

    Elasticsearch简称ES,它基于Lucene,是一种开源的实时分布式搜索和分析引擎,可提供数据存储服务、搜索服务和实时数据分析服务。其主要特点是:

    • 它是分布式的文档存储引擎,分也是布式的搜索引擎和分析引擎;
    • 可以作为一个大型分布式集群技术,处理PB级数据,服务大型应用系统;也可以运行在单机上,服务中小型应用;
    • 对用户而言,是开箱即用的,非常简单,作为中小型的应用,直接3分钟部署一下ES,就可以作为生产环境的系统来使用了,数据量不大,操作不是太复杂。

    主要应用场景有:

    • 维基百科,实现了全文检索,高亮检索,搜索推荐;
    • 数据分析,如用户行为日志(点击,浏览,收藏,评论)+社交网络数据(对某某新闻的相关看法),分析每篇新闻的公众反馈(好,坏,热门,垃圾,鄙视,崇拜);
    • 日志数据分析,logstash采集日志,ES进行复杂的数据分析(ELK技术,elasticsearch+logstash+kibana);
    • BI系统,商业智能,ES执行数据分析和挖掘,Kibana进行数据可视化;
    • 电商网站,检索商品;
    • 商品价格监控网站,用户设定某商品的价格阈值,当低于该阈值的时候,发送通知消息给用户;
    • GitHub(开源代码管理),搜索上千亿行代码。

    本系统属于ES的简单应用,搭建单节点的ES服务器,用于存储用户的行为和对药店、药品的评论,进行分析,并提供查询检索功能,展示给用户。

    2.3 地理信息技术

    百度地图API是一套为开发者免费提供的基于百度地图的应用程序接口,包括JavaScript、IOS、Android、静态地图、Web服务等多种版本,提供基本地图、位置搜索、周边搜索、公交驾车导航、定位服务、地理编码及逆地理编码等丰富功能。

    本系统采用百度地图JavaScript API,它是一套由JavaScript语言编写的应用程序接口,可帮助您在网站中构建功能丰富、交互性强的地图应用,支持PC端和移动端基于浏览器的地图应用开发,且支持HTML5特性的地图开发。

    百度地图快速开发步骤如下:

    1. 申请百度账号和ak;
    2. 根据HTML标准,创建一份基于HTML5的页面,使用最新的符合HTML5规范的文档声明

    <!DOCTYPE html>

    1. 添加一个meta标签,以便页面更好的在移动平台上展示

    <meta name="viewport" content="initial-scale=1.0,

    user-scalable=no" />

    1. 设置容器大小,使地图充满整个浏览器窗口

    <style type="text/css">  

        html{height:100%}    

        body{height:100%;margin:0px;padding:0px}    

    #container{height:100%}    

    </style>

    1. 引用百度地图API文件

    <script type="text/javascript"

    src="http://api.map.baidu.com/api?v=3.0&ak=您的密钥">

    </script>

    1. 创建一个div元素作为百度地图容器元素

    <div id="container"></div>

    1. 通过new操作符可以创建一个地图实例,参数可以是元素id也可以是元素对象

    var map = new BMap.Map("container");

    1. 设置中心点坐标

    //其中117.175215表示经度,39.109359表示纬度。(为南开大学坐标)

    var point = new BMap.Point(117.175215,39.109359);

    1. 地图初始化,同时设置地图展示级别

    map.centerAndZoom(point, 15);  

    至此,我们就快速创建了一张以南开大学为中心的地图,如图2-1所示。

    图2-1 以南开大学为中心地图(百度API开发)

    本系统后续的地图开发,均基于此地图。

    2.4 评论文本情感极性分析技术

    本系统采用一款开源、免费的情感分析工具[74],进行用户对药店、药品评论的情感极性分析。该工具采用Python语言开发,实现了使用一种基本算法来预测文章的情感。经过测试,基本满足对本系统情感极性分析的需求,且准确度可以信赖。其具体功能如下:

    • 基于python-jieba中文分词包,对文章和句子进行分词;
    • 使用大连理工大学情感分析词库,对文章分词结果进行词语的情感预测;
    • 使用bsa_agorithm作为基本情感极性分析算法,基于词语的情感预测来聚合整条评论的情感倾向和情感强度。

    bsa_agorithm算法核心代码片段如下:

    #!/usr/bin/python

    #encoding=utf-8

    from algorithm import Algorithm

     

    class BsaAlgorithm(Algorithm):

       //载入情感词典,我们使用大连理工大学情感分析词库

        def __init__(self, negative_word_file):

            negative_word_file = file(negative_word_file, "r")

            lines = negative_word_file.readlines()

            self.negative_word_set = set()

            for line in lines:

                line = line.encode("UTF-8").strip()

                if line.isspace():

                    continue

                self.negative_word_set.add(line)

            negative_word_file.close()

        

    //计算情感值

        def cal_semantic_value(self, article_semantic_result):

            segment_value_list = list()

            for seg_result in article_semantic_result:

                seg_value = list()

                for setence_result in seg_result:

                   setence_value = 0

                   word_counter = 0

                   for word_result in setence_result:

                     if word_result.has_key("meaning") is False:

                            word_counter += 1

                            continue

                      value=int(word_result["semantic_strength"])

                        # TODO check the polarity use the self

        # negative word set,

        # and change the polarity

                        last_word_pos = word_counter - 1

                        is_reverted = False

                        if last_word_pos >= 0:

                            last_word_result =

    setence_result[last_word_pos]

                          last_word = last_word_result["word"]

                        if last_word in self.negative_word_set:

                                is_reverted = True

                      if word_result["semantic_polagiry"] == "2":

                            value = value * (-1)

                        if is_reverted:

                            value = value * (-1)

                        setence_value += value

                        word_counter += 1

                    seg_value.append(setence_value)

                segment_value_list.append(seg_value)

            segment_value = list()

            for item in segment_value_list:

                sum = 0

                counter = 0

                for value in item:

                    sum += value

                    counter += 1

                if counter == 0:

                    average = 0

                else:

                    average = sum /counter

                segment_value.append(average)

            article_sum = 0

            seg_counter = 0

            for seg in segment_value:

                article_sum += seg

                seg_counter += 1

            if seg_counter == 0:

                article_average = 0

            else:

                article_average = float(article_sum)/seg_counter

            # TODO add more result

            return article_average

    评论情感极性分析方法调用string_semantic_analysis方法:

    # 调用string_semantic_analysis方法

    @staticmethod

    def string_semantic_analysis(input_string,library,algorithm):

    //分词

    segment_list=ArticleAnalysis.get_segment_list(input_string)

    segment_partition_list=ArticleAnalysis.partition(segment_list)

    //计算情感极性值

    article_result = ArticleAnalysis.semantic_analysis(segment_partition_list, library, algorithm)

    return article_result

    分析返回的结果为json字符串,格式如下:

    {

       'score' : 1;

    'score_comment' :

    '正:正向情感;负:负向情感。情感值越大,情感越强。';

        'details' : [

                     {'meaning' : '赞美', 'strength' : 5},

                     {'meaning' : '佩服', 'strength' : 3}

                     ]

     }

    返回值字段说明:

    • score字段,是整体的情感得分;
    • score_comment字段,是对score含义的注释,正:正向情感;负:负向情感。情感值越大,情感越强;
    • details字段,详细的介绍了文本体现出的每个子情感分类的情感度,meaning字段表示子分类,strength表示这个子分类的情感度。

    本系统只处理score字段,处理整体的情感得分,获取整体情感极性及极性强度,暂不处理details字段,不处理子情感分类。

    2.5 推荐算法

    采用基于地理位置和评价的协同过滤推荐算法,实现药品和药店的推荐。主要步骤如下:

    步骤1:计算基于协同过于的推荐值,采用词频-逆文件频率(Term Frequency-Inverse Document Frequency, TD-IDF)算法,药品、药店的关键词组和用户输入的关键词组为维度,建立向量空间模型,计算用户维度与各药店、药品维度的余弦相似度,该值即作为基于协同过于的推荐值,的取值范围为[-1,1];

    步骤2:计算基于地理位置的推荐值,计算方法如公式(1)所示。其中x表示用户位置与药店位置之间的距离,a表示阈值距离,当x<a时推荐值为正,当x>a时推荐值为负,本系统a值取5,即阈值距离为5公里。的取值范围为[-1,1]。

    步骤3:计算基于用户评论的推荐值,计算方法如公式(2)所示。其中x为情感极性计算值,按照第2.4小结情感极性算法计算所得,b为极性强度分为几个等级,本系统取b=5。的取值范围为[-1,1]。

     

    步骤4:计算最终推荐值y,计算方法如公式(3)所示。y的取值范围为[-3,3]。最终推荐值y越大,推荐越靠前;反之越靠后。

    另附计算的核心代码如下:

    //声明必要的模型变量

    private static int len = 0; //总文档数

    private static ArrayList< String[] > doc

    = new ArrayList<String[]>(); //文档内容

    private static HashMap<String, Float> []tdidf;   //TDIDF值

    private static int leng[]; //文档词数

    private static float film[]; //词向量的模

     

    //获取所有文档,即获取用户查找关键词和所有药品、药店关键词记录

    doc=getAllDoc();

     

    //计算TDIDF值

    public static void calTdidf(){

    long a = System.currentTimeMillis();

     

    HashMap<String, Float> []tmp_tdidf = new HashMap[len];

     

    int size;

    int n = 0;

    String str;

    HashMap<String,Integer> idf = new HashMap<String, Integer>();

    for(String d[]:doc){

    size = d.length;

    leng[n] = size; //文档词数

    HashMap<String, Float> td = new HashMap<String, Float>();

    for(int i = 0; i < size; ++i){

    str = d[i];

    if(!td.containsKey(str)){

    td.put(str, (float) 1.0);

    if(idf.containsKey(str))

    idf.put(str, idf.get(str)+1);

    else

    idf.put(str, (int) 1);

    }

    else

    td.put(str, td.get(str)+1);

    }

    tmp_tdidf[n++] = td;

    }

     

    String del = "";

    float ft,sum_tdidf[] = new float[len];

    for(int i = 0; i < len; ++i){

    for(String st:tmp_tdidf[i].keySet()){

    ft = (float) (Math.log(tmp_tdidf[i].get(st)/leng[i] + 1)*Math.log(len/idf.get(st)));

    sum_tdidf[i] += ft;

    tmp_tdidf[i].put(st, ft);

    }

    }

     

    //过滤

    float ftmp;

    for(int i = 0; i < len; ++i){

    HashMap<String, Float> td = new HashMap<String, Float>();

     

    ValueComparator bvc =  new ValueComparator(tmp_tdidf[i]);  

    TreeMap<String,Float> sorted_map = new TreeMap<String,Float>(bvc);  

    sorted_map.putAll(tmp_tdidf[i]);

    ft = 0;

     

    for(String key:sorted_map.keySet()){

    ftmp = tmp_tdidf[i].get(key);

    ft += ftmp;

    if(ft/sum_tdidf[i] > 0.8)//保留前80%的Tdidf值

    break;

    td.put(key, ftmp);

    }

    tdidf[i] = td;

    }

     

    long b = System.currentTimeMillis();

    System.out.println("计算td-idf+去除噪音时间:"+(b-a)+" ms");

    }

     

    //预处理向量的模

    public static void calFilm(){

    long a = System.currentTimeMillis();

    for(int i = 0; i < len; ++i){

    film[i] = (float) 0.0;

    for(String str:tdidf[i].keySet()){

    film[i] += tdidf[i].get(str)*tdidf[i].get(str);

    }

    film[i] = (float) Math.sqrt(film[i]);

    }

    long b = System.currentTimeMillis();

    System.out.println("处理向量模时间:"+(b-a)+" ms");

    }

     

    //计算余弦距离

    public static float cosine(int i,int j){

    int x = i, y = j;

    float ans = 0;

    if(tdidf[i].size() > tdidf[j].size()){

    x = j;

    y = i;

    }

     

    for(String str:tdidf[x].keySet()){

    if(tdidf[y].containsKey(str))

    ans += tdidf[x].get(str)*tdidf[y].get(str);

    }

    return ans/(film[x]*film[y]);

    }

     

    public static void calSimilarity() throws IOException{

    long a = System.currentTimeMillis();

    FileWriter fw = new FileWriter("DocSimilarityMatrix.csv");

    for(int i = 0; i < len; ++i){

    for(int j = 0; j < i; ++j ){

    fw.write(cosine(i, j)+",");

    }

    fw.write("1.0,");

    fw.write("\n");

    }

    fw.close();

    long b = System.currentTimeMillis();

    System.out.println("计算相似度并写入时间:"+(b-a)+" ms");

    }

     

    //values比较

    class ValueComparator implements Comparator<String> {  

      

    Map<String, Float> base;  

    public ValueComparator(Map<String, Float> base) {  

    this.base = base;  

    }  

     

    //按values降序

    public int compare(String a, String b) {  

    if (base.get(a) >= base.get(b)) {  

    return -1;  

    } else {  

    return 1;  

    }

    }  

    }  

    2.6 权限及安全验证技术

    Shiro是Apache旗下的一款优秀开源、免费的安全(权限)框架,可实现认证、授权、加密、会话管理、与Web集成、缓存等功能。

    用户登录认证过程SpringMVC控制层核心代码:

    /**

     * 用户登录

     * 认证过程:

     * 1、想要得到Subject对象,访问地址必须在shiro的拦截地址内,不然会报空指针

     * 2、用户输入的账号和密码,存到UsernamePasswordToken对象中,然后由shiro内部认证对比

     * 3、认证执行者交由ShiroDbRealm中doGetAuthenticationInfo处理

     * 4、当以上认证成功后会向下执行,认证失败会抛出异常

     *

     * @param accountName 账户名称

     * @param password 密码

     * @return

     */

    @RequestMapping(value = "login.html", method = RequestMethod.POST, produces = "text/html; charset=utf-8")

    public String userLogin(UserEntity userEntity, String captcha, Boolean rememberMe, HttpServletRequest request) {

    UsernamePasswordToken token = null;

    try {

            String expected = ShiroAuthenticationManager.getKaptcha(Constants.KAPTCHA_SESSION_KEY);

            //获取用户页面输入的验证码

            if(!StringUtils.equalsIgnoreCase(expected, captcha))

            {

             request.setAttribute("error", "验证码错误!");

    return "/login";

            }else

            {

    // 想要得到Subject对象,访问地址必须在shiro的拦截地址内,不然会报空指针

    Subject subject = SecurityUtils.getSubject();

    token = new UsernamePasswordToken(userEntity.getAccountName(), userEntity.getPassword());

    //记住用户登录状态

    token.setRememberMe(rememberMe);

    subject.login(token);

    if (subject.isAuthenticated()) {

    /*//start

    HttpSession loginedSession=userService.checkUserWhereLogined(userEntity);

    if(loginedSession!=null){

    //message=username+"账号已在其它地方登录,现将其下线并在此登录,请注意保护账户安全!";

    //log.info(username+"账号已在其它地方登录,现将其下线并在此登录,请注意保护账户安全!");

    loginedSession.invalidate();//使失效

    }

    //end

    */ userEntity = (UserEntity)subject.getPrincipal();

    LoginInfoEntity loginInfo = new LoginInfoEntity();

    loginInfo.setUserId(userEntity.getId().intValue());

    loginInfo.setAccountName(userEntity.getAccountName());

    loginInfo.setLoginIp(SecurityUtils.getSubject().getSession().getHost());

    loginInfoService.log(loginInfo);

    request.removeAttribute("error");

    } else {

    token.clear();

    request.setAttribute("error", "用户名或密码不正确!");

    return "/login";

    }

            }

    }catch (UnknownAccountException uae)

    {

    if(null != token)

    {

    token.clear();

    }

    request.setAttribute("error", "账户不存在!");

    return "/login";

    }

    catch (IncorrectCredentialsException ice)

    {

    if(null != token)

    {

    token.clear();

    }

    request.setAttribute("error", "密码错误!");

    return "/login";

    }catch (LockedAccountException e) {

    if(null != token)

    {

    token.clear();

    }

    request.setAttribute("error", "您的账户已被锁定,请与管理员联系或10分钟后重试!");

    return "/login";

    } catch (ExcessiveAttemptsException e) {

    if(null != token)

    {

    token.clear();

    }

    request.setAttribute("error", "您连续输错5次,帐号将被锁定10分钟!");

    return "/login";

    }catch(ExpiredCredentialsException eca)

    {

    if(null != token)

    {

    token.clear();

    }

    request.setAttribute("error", "账户凭证过期!");

    return "/login";

    }catch (AuthenticationException e) {

    if(null != token)

    {

    token.clear();

    }

    request.setAttribute("error", "账户验证失败!");

    return "/login";

    }catch (Exception e)

    {

    e.printStackTrace();

    if(null != token)

    {

    token.clear();

    }

    request.setAttribute("error", "登录异常,请联系管理员!");

    return "/login";

    }

    return "redirect:/index.html";

    }

    权限控制精确到按钮级(功能级),前端采用jsp 标签形式进行权限控制。在使用Shiro标签库前,首先需要在JSP引入shiro标签: 

    <%@ taglib prefix="shiro" uri="http://shiro.apache.org/tags"%>

    role.jsp页面权限控制实例:

    <div class="page-header">

    <shiro:hasPermission name="role:add">

    <button id="btnAdd" type="button" οnclick="addModel('/role/addUI.html')" class="btn btn-primary btn-sm">

       <i class="fa fa-plus"></i> 添加

    </button>

    </shiro:hasPermission>

    <shiro:hasPermission name="role:edit">

    <button id="btnEdit" type="button" οnclick="editModel('/role/editUI.html')" class="btn btn-success btn-sm">

     <i class="fa fa-pencil-square-o"></i> 编辑

    </button>

    </shiro:hasPermission>

    <shiro:hasPermission name="role:deleteBatch">

    <button id="btnDel" type="button" οnclick="delModel('/role/deleteBatch.html', customSearch)" class="btn btn-danger btn-sm">

    <i class="fa fa-trash-o"></i> 删除

    </button>

    </shiro:hasPermission>

    <shiro:hasPermission name="role:permission">

    <button id="btnSetResource" type="button" οnclick="editModel('/role/permissionUI.html')" class="btn btn-info btn-sm">

    <i class="fa fa-gears"></i> 分配权限

    </button>

    </shiro:hasPermission>

    </div>

    3  互联网+药店推荐系统需求分析

    3.1 可行性分析

    3.1.1 经济可行性分析

    本系统成本主要来自于技术学习成本、系统开发成本以及运行和维护成本。作为毕业设计,主要成本开销在于运行和维护的开销。本系统搭建在阿里云,一方面,阿里云对于学生购买服务有较大的优惠;另一方面,阿里云团队接管了绝大多数运维工作。因此,总体成本开销可以控制在可承受范围之内。

     效益方面,本系统作为药店推荐系统,用户通过使用本系统可在很大程度上提高其药店选择和药品购买的效率,且可以买到更加合适的药品,节省了用户的时间成本。

     因此,本系统在经济上是可行的。

    3.1.2 技术可行性分析

    根据系统功能和设计,本系统采用基于Java语言开发,前后端采用当前流行的开源框架,数据库以MySQL为主,情感极性分析采用了一个开源的基础算法,推荐算法思想和实现步骤均已设计完备,可基于Java开发实现。

     综上,本系统的框架均采用成熟的开源框架,核心技术和算法的技术储备也已完备,可基于这些技术开发出完整的”互联网+药店推荐系统“,因此,本系统在技术层面上是完全可行的。

    3.1.3 操作可行性分析

    系统采用B/S架构,服务端部署在阿里云,阿里云强大的技术团队可为本系统提供有力的技术支撑。客户端前端采用H5技术,能够便捷的在手机等移动设备上使用,且系统界面友好、操作简单、布局合理,用户很容易掌握操作要领。因此,从操作层面分析本系统是可行的。

    3.2 需求分析

    3.2.1 业务需求分析

     将本系统主要的业务场景划分为用户模块、管理员模块和定时分析模块,业务需求如图3-1所示。

    图3-1 业务需求分析

    普通用户主要业务操作包括可以通过客户端查询药店、药品信息,系统通过用户查询,在地图上展示药店,并推荐最合适的药店,可进行路程规划和导航至推荐药店,用户可对药品、药店进行评价。

    药店管理员主要业务操作包括维护本药店信息和本药店的药品信息。

    系统管理员主要业务操作包括可对整个系统进行管理,包括基础信息、角色权限等,管理员可通过系统管理药店和药品信息,可管理用户和用户的评价等。

    定时分析即是对用户评论进行采集和极性分析。

    3.2.2 系统软件需求分析

    互联网+药店推荐系统的需求分析在具体操作过程中涉及到功能性需求与非功能性需求两大主要的内容,如表 3-1 所示。

    表 3-1 功能性需求和非功能性需求表

    功能性需求

    非功能性需求

    (1)用户可通过系统查询药店、药品信息; (2)系统可通过用户输入症状,推荐药品、药店;(3)用户可以通过系统导航至推荐药店;(4) 用户可对药店、药品进行评价;(5)管理员可以管理药店药品信息;(6)管理员可对系统进行基础管理,如系统权限管理等;(7)管理员可对用户评价进行管理;(8)系统可对用户评价进行分析和展示。

    (1)优化系统和数据结构,将系统的响应时间控制在毫秒级;(2)确保系统的可靠性,保证系统7*24小时可提供服务;(3)界面友好,适用于手机等移动设备,易操作。

    3.2.3 系统运行环境需求分析

    系统主要运行在PC端和移动端。管理员后台管理主要在PC端,用户使用主要在移动端。系统采用的是B/S架构,客户端只需要安装浏览器并连通网络即可以使用本系统,其中用户端要还需适应Android、IOS等操作系统,前端需适配不同屏幕规格的手机、平板等移动设备。

    3.3 系统功能需求分析

    随着互联网时代的到来,互联网技术已深入到社会生活的各个领域。本系统将互联网技术、地理信息技术、情感极性分析技术、智能推荐技术与药店管理相结合,形成互联网+药店推荐系统。本系统旨在为购药者快速提供最适合的购药方案,减少消费者挑选的时间开销和成本开销。本系统一方面帮助消费者发现对自己有价值的药店、药品信息,并能提供最优路线方案到达推荐的药店购药;另一方面让药店和药店信息能够更有效的展现在对它感兴趣的消费者面前,从而实现药店和消费者的双赢。

    3.4 用户使用需求分析

    将系统的用户分为3类角色:普通用户、药店管理者、系统管理者。

    普通用户作为系统的直接受益者,主要可通过系统可查询附近药店的分布情况、药店等级、药店药品情况、开关门时间、是否支持医保等;可通过输入症状关键词推荐最合适的药品和药店;可根据选中的药店规划路径并导航至该药店;可查看历史用户对目标药店、药品的评价;可根据评价分析药店、药品的整体好评率等。

    药店管理者可申请入驻本系统,入驻后可进行药店管理,包括药店信息维护,药店药品信息的维护等。

    系统管理者可对系统进行基础管理,如基础信息维护、权限分配等;可审核药店入驻申请;可直接添加新的药店和所添加药店的药品;可管理用户及用户的评论;可查看各类统计分析报表等。

    4  系统设计

    4.1 总体设计

    本系统结合了互联网行业先进理念,将数据分析、人工智能、GIS等先进技术引入管理信息系统,形成了一套完整的互联网+药店推荐系统解决方案。在系统设计中,需要具有前瞻性,充分考虑系统的可扩展性,注重用户体验,不断优化改进,使用该系统能够真正给用户带来方便和实惠。

    4.1.1 系统设计原则

    互联网+药店推荐系统属于互联网产品,因此在设计时遵循一般互联网产品设计的原则:

    • 免费性原则。免费是互联网产品的一大特性,本系统对所有普通用户完全免费,只针对入驻的药店收取入驻费和推广费,产品升级后增加广告模块可收取广告费。
    • 注重用户体验。以用户为中心,注重人性化设计,方便用户使用,同同时保证产品的实用性,切实能为用户提供有价值的服务,保证系统的稳定性。
    • 先进性原则。使用先进的技术和理念,开拓创新性思维,持续为用户提供高科技感的体验,让用户享受科技带来的便利。
    • 可扩展性和可维护性原则。为了方便系统的升级和维护,注重代码规范和标准。
    • 可靠性和安全性原则。保护用户的隐私,加强安全性管理,能够抵御不法分子采用不正当手段对系统的攻击。

    4.1.2 系统设计总体目标

    本系统的最终目标是为需要买药的消费者提供最合适的购药方案,节省消费者因选择性困难造成的时间浪费,为消费者带来方便和实惠。

    4.1.3 系统设计总体架构

    系统设计的总体架构如图4-1所示。

    图4-1 系统设计总体架构图

    4.2 概要设计

    4.2.1 模块划分

    为使系统架构更加清晰,将互联网+药店推荐系统划分为用户登录模块、后台管理模块、药店管理模块、地理信息模块、评论管理模块、药店推荐模块、客户使用模块。系统组织架构图如图4-2所示。

     

    图4-2 互联网+药店管理系统组织架构图

    4.2.2 业务流程分析

    使用UML活动图描述3类角色:普通用户、药店管理者、系统管理者的业务工作流程。

    4.2.2.1 普通用户

    普通用户业务服务主要涉及的模块包括用户登录模块、地理信息模块、评论管理模块、药店推荐模块、客户使用模块,其系统活动图如图4-3所示。

    图4-3 普通用户活动图

    普通用户通过系统可了解附近药店分布情况,当需要买药时,可通过输入关键字进行搜索,系统将推荐最适合的1-3个药店给用户,用户选择目标药店后,若不熟悉路向,可使用本系统提供的导航,系统将根据用户的出行方式,推荐最佳路径。用户在药店买药后,可就药效、服务等情况进行评价,这些评价可供其他用户参考。

    4.2.2.2 药店管理员

    药店管理员业务服务主要涉及用户登录模块、药店管理模块,其系统活动图如图4-4所示。

    图4-4 药店管理员活动图

     

    药店经营者可以以药店管理员的身份,通过向系统提供相关资质证明,申请入驻本系统。入驻成功后,可以装饰自己的药店,发布和管理药品等。入驻成功后,药店即可在系统上展示出来;发布药品成功后,若用户搜索匹配该药品,该药店和药品即可能被推荐给用户。

    4.2.2.3 系统管理员

    系统管理员业务服务主要涉及的模块包括用户登录模块、后台管理模块、药店管理模块、地理信息模块、评论管理模块,其系统活动图如图4-5所示。

    图4-5 系统管理员活动图

    系统管理员是系统正常运行的保障,负责系统基础信息的维护,根据不同的用户分配不同的角色和权限,审核申请入驻的药店,也可直接增加药店和药店的药品,管理用户对药店和药品的评论,通过统计分析模块,监控系统的整体运行状况。

    4.3 数据库设计

    4.3.1 数据库命名规则

    本系统数据库命名按照一定的标准规范,命名规则如:

    • 采用26个英文字母(区分大小写)和0-9这十个自然数,加上下划线'_'组成,共63个字符,不能出现其他字符(注释除外);
    • 表命名规则:表名只能包含小写英文字母及下划线,一律使用前缀命名法,单词采用名词单数形式,单词之间用下划线分割,如管理模块前缀admin_,用户表admin_user;
    • 字段名命名规则:字段名只能包含小写英文字母及下划线,一律使用前缀命名法,单词采用名词单数形式,单词之间用下划线分割,如用户表前缀u_,用户姓名u_name;
    • 字段名和数据类型一致性原则,即同一个属性在各表中的名称和数据类型要保持一致;
    • 表、字段都必须有完备的注释;
    • 常用表第一个字段id设为主键且自动增长;
    • 布尔字段命名规则为*_is_,如,用户表用户是否锁定字段u_is_lock,布尔字段都必须设置默认值,且默认值设为0;
    • 字符类型设置为varchar,必须设置长度,长度按需一般设置为2的n次方;
    • 时间类型一般设置为date或datetime类型,并设置默认时间为系统当前时间;
    • 统一使用innodb引擎建表。

    4.3.2 数据库逻辑结构设计

    数据库逻辑结构设计划分为两块,权限设计模块与业务设计模块。

    4.3.2.1 权限模块逻辑结构设计

    权限主要包括用户、用户信息、角色、资源。其中,用户与用户信息为一对一的关系,用户与角色是多对多的关系,资源与角色是多对多的关系。权限模块的逻辑结构设计模型如图4-6所示。

    图4-6 权限模块逻辑结构设计模型

    4.3.2.1 业务模块逻辑结构设计

    业务模块主要包括药店、药店关键词、药店图片、药品、药品关键词、药品图片、用户、用户评价、用户行为。其中,药店与药店关联词、药店图片、用户评价均为一对多的关系,药店与药品为多对多的关系,药品与药品关键词、药品图片、用户评价均为一对多的关系,用户与用户行为、用户评价均为一对多的关系。业务模块逻辑结构设计模型如图4-7所示。

    图4-7 业务模块逻辑结构设计模型

    4.3.3 主要数据表设计

    表4-1 用户表(sys_user)

    列名

    字段类型

    长度

    是否可为空

    默认值

    备注

    u_id

    int

    32

    NO

     

    用户id

    u_name

    varchar

    32

    NO

     

    真实姓名

    u_account_name

    varchar

    32

    NO

     

    账户名称

    u_password

    varchar

    64

    NO

     

    用户密码

    u_is_delete

    boolean

     

    NO

    0

    逻辑删除状态

    u_is_locked

    boolean

     

    NO

    0

    是否锁定

    u_describe

    varchar

    64

    YES

     

    用户描述

    u_credentials_salt

    varchar

    128

    NO

     

    加密盐

    u_creator_id

    int

     

    NO

     

    创建者

    u_create_time

    datetime

     

    NO

    now()

    创建时间

    u_update_time

    datetime

     

    NO

     

    更新时间

     

    表4-2 用户信息表(sys_user_info)

    列名

    字段类型

    长度

    是否可为空

    默认值

    备注

    u_id

    int

    32

    NO

     

    用户id

    u_sex

    char

    1

    NO

    0

    性别

    u_birthday

    date

     

    NO

     

    出生日期

    u_telephone

    varchar

    16

    NO

     

    电话

    u_email

    varchar

    32

    NO

     

    邮箱

    u_address

    varchar

    64

    NO

     

    住址

    u_create_time

    datetime

     

    NO

    now()

    创建时间

     

    表4-3 角色表(sys_role)

    列名

    字段类型

    长度

    是否可为空

    默认值

    备注

    r_id

    int

    32

    NO

     

    角色id

    r_name

    varchar

    32

    NO

     

    角色名称

    r_key

    varchar

    32

    NO

     

    角色key

    r_is_delete

    boolean

     

    NO

    0

    角色状态,0:正常;1:删除

    r_describe

    varchar

    64

    YES

     

    角色描述

    r_create_time

    datetime

     

    NO

    now()

    创建时间

    r_update_time

    datetime

     

    NO

     

    更新时间

     

    表4-4 用户-角色关系表(sys_user_role)

    列名

    字段类型

    长度

    是否可为空

    默认值

    备注

    ur_id

    int

    32

    NO

     

    关系id

    r_id

    int

    32

    NO

     

    角色id

    u_id

    int

    32

    NO

     

    用户id

    ur_create_time

    datetime

     

    NO

    now()

    创建时间

     

    表4-5 资源表(sys_resource)

    列名

    字段类型

    长度

    是否可为空

    默认值

    备注

    s_id

    int

    32

    NO

     

    资源id

    s_parent_id

    int

    32

    YES

     

    资源父id

    s_name

    varchar

    16

    NO

     

    资源名称

    s_source_key

    varchar

    64

    NO

     

    资源唯一标识

    s_type

    int

     

    NO

     

    资源类型,0:目录;1:菜单;2:按钮

    s_source_url

    varchar

    64

    YES

     

    资源url

    s_level

    int

     

    YES

     

    层级

    s_icon

    varchar

    64

    YES

     

    图标

    s_is_hide

    boolean

     

    NO

    0

    是否隐藏

    s_describe

    varchar

    64

    YES

     

    描述

    s_create_time

    datetime

     

    NO

    now()

    创建时间

    s_update_time

    datetime

     

    NO

     

    更新时间

    s_order

    int

     

    NO

    0

    菜单排序

     

    表4-6 资源-角色关系表(sys_resources_role)

    列名

    字段类型

    长度

    是否可为空

    默认值

    备注

    sr_id

    int

    32

    NO

     

    关系id

    s_id

    int

    32

    NO

     

    资源id

    r_id

    int

    32

    NO

     

    角色id

    sr_create_time

    datetime

     

    NO

    now()

    创建时间

     

    表4-7 药店表(biz_pharmacy)

    列名

    字段类型

    长度

    是否可为空

    默认值

    备注

    p_id

    int

     

    NO

     

    药店id

    p_name

    varchar

    32

    NO

     

    名称

    p_business_license

    varchar

    64

    NO

     

    营业执照号

    p_business_license_url

    varchar

    128

    NO

     

    营业执照扫描件url

    p_property

    char

    1

    NO

     

    药店性质

    p_open_time

    time

     

    NO

     

    开门时间

    p_close_time

    time

     

    NO

     

    关门时间

    p_level

    smallint

     

    NO

     

    等级

    p_addr

    varchar

    64

    NO

     

    地址

    p_phone

    varchar

    16

    NO

     

    联系电话

    p_is_medical_insurance

    boolean

     

    NO

    0

    是否医保报销

    p_longitude

    decimal

     

    NO

     

    经度

    p_latitude

    decimal

     

    NO

     

    纬度

    p_is_verify

    boolean

     

    NO

     

    是否通过审核

    p_enter_date

    date

     

    NO

     

    入驻时间

    p_describe

    varchar

    128

    YES

     

    描述

     

    表4-8 药店图片表(biz_pharmacy_pic)

    列名

    字段类型

    长度

    是否可为空

    默认值

    备注

    pp_id

    int

     

    NO

     

    图片id

    pp_url

    varchar

    64

    NO

     

    图片url

    p_id

    int

     

    NO

     

    所属药店id

     

    表4-9 药店关键词表(biz_pharmacy_keyword)

    列名

    字段类型

    长度

    是否可为空

    默认值

    备注

    pk_id

    int

     

    NO

     

    关键词id

    pk_name

    varchar

    16

    NO

     

    关键词

    p_id

    int

     

    NO

     

    所属药店id

     

    表4-10 药品表(biz_medicine)

    列名

    字段类型

    长度

    是否可为空

    默认值

    备注

    m_id

    int

     

    NO

     

    药品id

    m_name

    varchar

    32

    NO

     

    名称

    m_brand_id

    int

     

    NO

     

    所属品牌

    m_function

    varchar

    64

    NO

     

    主要功能

    m_consumption

    varchar

    64

    NO

     

    用量

    m_is_prescription

    boolean

     

    NO

    0

    是否处方药

    m_is_chinese_patent

    boolean

     

    NO

    0

    是否中成药

    m_describe

    varchar

    128

    YES

     

    描述

     

    表4-11 药品图片表(biz_medicine_pic)

    列名

    字段类型

    长度

    是否可为空

    默认值

    备注

    mp_id

    int

     

    NO

     

    图片id

    mp_url

    varchar

    64

    NO

     

    图片url

    m_id

    int

     

    NO

     

    所属药品id

     

    表4-12 药品关键词表(biz_medicine_keyword)

    列名

    字段类型

    长度

    是否可为空

    默认值

    备注

    mk_id

    int

     

    NO

     

    关键词id

    mk_name

    varchar

    16

    NO

     

    关键词

    m_id

    int

     

    NO

     

    所属药品id

     

    表4-13 药店-药品关系表(biz_pharmacy_medicine)

    列名

    字段类型

    长度

    是否可为空

    默认值

    备注

    pm_id

    int

     

    NO

     

    关系id

    m_id

    int

     

    NO

     

    药品id

    p_id

    int

     

    NO

     

    所属药店id

    pm_price

    decimal

     

    NO

     

    价格

    pm_is_shelfed

    boolean

     

    NO

     

    是否上架

    pm_shelf_no

    varchar

    16

    NO

     

    所在货架号

     

    表4-14 用户评价表(biz_user_evaluate)

    列名

    字段类型

    长度

    是否可为空

    默认值

    备注

    e_id

    int

     

    NO

     

    评价id

    u_id

    int

     

    NO

     

    评价者id

    u_name

    varchar

    32

    NO

     

    评价者

    e_evaluate_time

    datetime

     

    NO

    now()

    评价时间

    p_id

    int

     

    NO

     

    评价的药店id

    p_name

    varchar

    32

    NO

     

    评价的药店

    m_id

    int

     

    NO

     

    评价的药品id

    m_name

    varchar

    32

    NO

     

    评价的药品

    e_type

    char

    1

    NO

     

    评价类型

    e_detail

    varchar

    256

    NO

     

    评价详情

     

    表4-15 用户行为表(biz_user_behavior)

    列名

    字段类型

    长度

    是否可为空

    默认值

    备注

    b_id

    int

     

    NO

     

    行为id

    u_id

    int

     

    NO

     

    用户id

    b_occurrence_time

    datetime

     

    NO

    now()

    发生时间

    b_topic

    varchar

    32

    NO

     

    行为主题

    b_describe

    varchar

    128

    YES

     

    行为描述

    4.4 详细设计

    4.4.1 系统程序代码设计

    本系统的开发采用经典的分层架构:表示层(web层),业务逻辑层(service层),数据访问层(dao层),业务实体层(entity层),其处理逻辑如图4-8所示。

    图4-8 分层架构业务处理逻辑

    表示层负责与用户进行交互,接受用户请求、数据,进行简单的数据处理,如:数据有效性判断、异常显示灯,反馈用户请求。它只与业务逻辑层、业务实体层(VO)发生关系。

    业务逻辑层是整个系统的核心,承担了所有逻辑处理,实现了系统的功能。它只与数据访问层和业务实体层(BO)关联。

    数据访问层只提供数据访问接口,不实现任何逻辑。它是数据库的管理者,但不是直接访问者,不直接与数据库发生关联。它只关联业务实体层(PO)。

    业务实体类实现对数据的封装,数据库中每一张表都有对应的实体类,表字段对应类的属性。表示层、业务逻辑层、数据访问层的交互主要就是通过业务实体层中的各种实体类作为参数,实现访问请求,并返回数据的。

    各层之间的关系如图4-9所示。

    图4-9 分层架构之各层之间的关系

     

    系统项目的包结构如下:

    com.nankai.pharecom

    |-.dao-------------------dao层接口

    |---|-.impl--------------mappings文件(dao层实现)

                        |-.entity----------------javabean

                        |-.service---------------service层接口

    |----|-.impl--------------service层实现     

                        |-.web-------------------web层

                        |-.util------------------工具类

    |-.common------------------通用工具包

     

    4.4.2 系统结构设计及子系统划分

    根据系统的业务与功能,将其逻辑结构划分为用户登录子系统、后台管理子系统、药店管理子系统、地理信息子系统、评论管理子系统、药店推荐子系统、客户使用子系统如图4-10所示。

    图4-10 系统子系统划分

    各个子系统按照功能角度分解,划分出若干不同的功能模块,如4-11各图所示。

    图4-11 各子系统功能划分

    4.4.3 系统功能模块详细设计

    4.4.3.1 用户登录子系统S001

    表4-16 用户登录模块详细设计

    模块编号

    S001-001

    模块名称

    用户登录

    模块描述

    管理用户登录、退出系统,包括普通用户、药店管理员和系统管理员

    主要功能

    登录系统:获取登录验证码、登录验证、登录

    退出系统:退出系统,返回登录页面

    算法描述

    web层处理全类名:com.nankai.pharecom.web.IndexController

     

    //处理方法

    kaptcha(HttpServletRequest req, HttpServletResponse rsp);//获取验证码

    userLogin(User user,String captcha,Boolean remember, HttpServletRequest request)//登录验证

    index(Model model)//登录成功并跳转至主页

    logout();//退出系统

     

    表4-17 用户注册模块详细设计

    模块编号

    S001-002

    模块名称

    用户注册

    模块描述

    用户注册模块,主要用于普通用户和药店管理员注册

    主要功能

    包括用户唯一性验证、短信验证、检验注册信息的合法性与注册

    算法描述

    web层处理全类名:com.nankai.pharecom.web.indexController

     

    //处理方法

    checkUserUniqueByPhone(String phone);//通过手机号码检验用户唯一性

    checkPhoneCode(String code);//检验手机验证码是否正确

    checkUserLegal(User user,Model model);//用户信息合法性检验,若存在不合法信息,从model返回给页面

    add(User user);//注册成功,保存用户

     

    4.4.3.2 后台管理子系统S010

    表4-18 资源管理模块详细设计

    模块编号

    S010-001

    模块名称

    资源管理

    模块描述

    管理系统资源(单与按钮等),包括添加资源、修改资源、删除资源、查询资源。

    主要功能

    添加资源:检验数据的合法性、保存资源

    修改资源:修改并保存

    删除资源:逻辑删除

    查询资源:单一查询、分页查询、全量查询

    算法描述

    web层处理全类名:com.nankai.pharecom.web.ResourceController

    service层接口全类名:com.nankai.pharecom.service.IResourceService

    service层接口实现全类名:com.nankai.pharecom.service.ResourceService

    dao层接口全类名:com.nankai.pharecom.dao.IResourceDao

    dao层接口实现mapper:com.nankai.pharecom.dao.ResourceMapper

     

    //处理方法

    checkResourceLegal(Resource resource,Model model);//资源信息合法性检验,若存在不合法信息,从model返回给页面

    add(Resource resource);//添加保存

    update(Resource resource);//更新并保存

    del(int resourceId);删除,逻辑删除,根据resourceId删除

    findById(int resourceId);//通过resourceId查询

    findByType(int type);//通过资源类型查询

    findByName(String name);//通过资源名称查询

    findByPage(Resource resource,Model model,Page<Resource> page);//分页查询

    findAll();//查询所有资源

     

    表4-19 角色权限管理模块详细设计

    模块编号

    S010-010

    模块名称

    角色权限管理

    模块描述

    管理系统角色与角色权限,包括添加角色并为角色赋权、修改角色和角色权限、删除角色和查询角色

    主要功能

    添加角色:检验角色信息的合法性、角色权限设置、新增保存用户

    修改角色:角色权限修改、角色信息修改并保存

    删除角色:逻辑删除

    查询角色:单一查询、分页查询、全量查询

    算法描述

    web层处理全类名:com.nankai.pharecom.web.RoleController

    service层接口全类名:com.nankai.pharecom.service.IRoleService

    service层接口实现全类名:com.nankai.pharecom.service.RoleService

    dao层接口全类名:com.nankai.pharecom.dao.IRoleDao

    dao层接口实现mapper:com.nankai.pharecom.dao.RoleMapper

     

    //处理方法

    permission(int rId, String resourceIds);//为角色设置/修改权限

    checkRoleLegal(Role role,Model model);//角色信息合法性检验,若存在不合法信息,从model返回给页面

    add(Role role);//添加保存角色

    update(Role role);//更新并保存

    del(int rId);删除角色,逻辑删除,根据rId删除

    findById(int rId);//通过rId查询

    findByName(String name);//通过角色名称查询

    findByPage(Role role,Model model,Page<Role> page);//分页查询

    findAll();//查询所有角色

    表4-20 用户管理模块详细设计

    模块编号

    S010-011

    模块名称

    用户管理

    模块描述

    管理系统用户,包括添加用户并赋予角色、修改用户资料和角色、删除用户、查询用户。

    主要功能

    添加用户:检验用户的唯一性、检验数据的合法性、保存用户

    修改用户:修改并保存

    删除用户:逻辑删除

    查询用户:单一查询、分页查询、全量查询

    算法描述

    web层处理全类名:com.nankai.pharecom.web.UserController

    service层接口全类名:com.nankai.pharecom.service.IUserService

    service层接口实现全类名:com.nankai.pharecom.service.UserService

    dao层接口全类名:com.nankai.pharecom.dao.IUserDao

    dao层接口实现mapper:com.nankai.pharecom.dao.UserMapper

     

    //处理方法

    checkUserUniqueByPhone(String phone);//通过手机号码检验用户唯一性

    checkUserLegal(User user,Model model);//用户信息合法性检验,若存在不合法信息,从model返回给页面

    add(User user);//添加保存用户

    update(User user);//更新并保存

    del(int uId);删除用户,逻辑删除,根据uId删除

    findById(int uId);//通过uId查询

    findByPhone(String phone);//通过电话号码查询

    findByName(String name);//通过姓名查询

    findByPage(User user,Model model,Page<User> page);//分页查询

    findAll();//查询所有用户

    表4-21 药店审核模块详细设计

    模块编号

    S010-100

    模块名称

    药店审核

    模块描述

    系统管理员用于审核药店管理员申请药店入驻请求

    主要功能

    查看审核记录

    审核处理、短信通知

    算法描述

    web层处理全类名:com.nankai.pharecom.web.PharmacyController

    service层接口全类名:com.nankai.pharecom.service.IPharmacyService

    service层接口实现全类名:com.nankai.pharecom.service.PharmacyService

    dao层接口全类名:com.nankai.pharecom.dao.IPharmacyDao

    dao层接口实现mapper:com.nankai.pharecom.dao.PharmacyMapper

     

    //处理方法

    findAuditList(Pharmacy pharmacy);//查看审核记录

    AuditPharmacy (Pharmacy pharmacy);//审核药店

    sendMsg(String phone, String result);//短信通知审核结果

     

    4.4.3.3 药店管理子系统S011

    表4-22 药店管理模块详细设计

    模块编号

    S011-001

    模块名称

    药店管理

    模块描述

    管理药店,包括添加药店、上传药店图片、修改药店资料、删除药店、查询药店。

    主要功能

    添加药店:检验药店的唯一性、检验数据的合法性、保存药店

    上传图片:上传药店展示图片、营业执照扫描件

    修改药店:修改并保存

    删除药店:逻辑删除

    查询药店:单一查询、分页查询、全量查询

    算法描述

    web层处理全类名:com.nankai.pharecom.web.PharmacyController

    service层接口全类名:com.nankai.pharecom.service.IPharmacyService

    service层接口实现全类名:com.nankai.pharecom.service.PharmacyService

    dao层接口全类名:com.nankai.pharecom.dao.IPharmacyDao

    dao层接口实现mapper:com.nankai.pharecom.dao.PharmacyMapper

     

    //处理方法

    checkPharmacyUniqueByBLNo(String blno);//通过营业执照号检验药店唯一性

    checkPharmacyLegal(Pharmacy pharmacy,Model model);//药店信息合法性检验,若存在不合法信息,从model返回给页面

    add(Pharmacy pharmacy);//添加保存

    uploadPic(MultipartFile file,HttpServletRequest request);//上传图片

    update(Pharmacy pharmacy);//更新并保存

    del(int pId);删除药店,逻辑删除,根据pId删除

    findById(int pId);//通过pId查询

    findByBlNo(String blno);//通过营业执照号查询

    findByName(String name);//通过药店名称查询

    findByPage(Pharmacy pharmacy,Model model,Page<Pharmacy> page);//分页查询

    findAll();//查询所有药店

    表4-23 药品管理模块详细设计

    模块编号

    S011-010

    模块名称

    药品管理

    模块描述

    管理药品,包括添加药品、上传药品图片、修改药品资料、删除药品、查询药品。

    主要功能

    添加药品:检验数据的合法性、保存药品

    上传图片:上传药品展示图片

    修改药品:修改并保存

    删除药品:逻辑删除

    查询药品:单一查询、分页查询、全量查询

    算法描述

    web层处理全类名:com.nankai.pharecom.web.MedicineController

    service层接口全类名:com.nankai.pharecom.service.IMedicineService

    service层接口实现全类名:com.nankai.pharecom.service.MedicineService

    dao层接口全类名:com.nankai.pharecom.dao.IMedicineDao

    dao层接口实现mapper:com.nankai.pharecom.dao.MedicineMapper

     

    //处理方法

    checkPharmacyLegal(Medicine medicine,Model model);//药品信息合法性检验,若存在不合法信息,从model返回给页面

    add(Medicine medicine);//添加保存

    uploadPic(MultipartFile file,HttpServletRequest request);//上传图片

    update(Medicine medicine);//更新并保存

    del(int mId);删除药品,逻辑删除,根据mId删除

    findById(int mId);//通过mId查询

    findByPharmacy(String pId);//通过药店查询

    findByName(String name);//通过药品名称查询

    findByPage(Medicine medicine,Model model,Page<Medicine> page);//分页查询

    findAll();//查询所有药店

    表4-24 药店药品管理模块详细设计

    模块编号

    S011-011

    模块名称

    药店药品管理

    模块描述

    管理药店药品,包括上架药品、下架药品、查询药店药品。

    主要功能

    药品上下架管理

    药店药品查询

    算法描述

    web层处理全类名:com.nankai.pharecom.web.PharmacyController

    service层接口全类名:com.nankai.pharecom.service.IPharmacyService

    service层接口实现全类名:com.nankai.pharecom.service.PharmacyService

    dao层接口全类名:com.nankai.pharecom.dao.IPharmacyDao

    dao层接口实现mapper:com.nankai.pharecom.dao.PharmacyMapper

     

    //处理方法

    //修改药店pharmacy中药品medicine的上架状态为shelfStatus

    updateShelf(Pharmacy pharmacy,Medicine medicine,boolean shelfStatus);

    findMedicineListByPharmacy(Pharmacy pharmacy);//查询药店的药品列表

    表4-25 入驻申请模块详细设计

    模块编号

    S011-100

    模块名称

    入驻申请

    模块描述

    药店管理员向系统管理员提出药店入驻系统的申请

    主要功能

    入驻申请

    短信提醒

    算法描述

    web层处理全类名:com.nankai.pharecom.web.PharmacyController

    service层接口全类名:com.nankai.pharecom.service.IPharmacyService

    service层接口实现全类名:com.nankai.pharecom.service.PharmacyService

    dao层接口全类名:com.nankai.pharecom.dao.IPharmacyDao

    dao层接口实现mapper:com.nankai.pharecom.dao.PharmacyMapper

     

    //处理方法

    submission(Pharmacy pharmacy);//提交入职申请

    sendMsg(String phone, String msg);//短信提醒系统管理员审核

     

    4.4.3.4 地理信息子系统S100

    表4-26 药店展示模块详细设计

    模块编号

    S100-001

    模块名称

    药店展示

    模块描述

    在百度地图上展示附近的药店

    主要功能

    获取附近药店的经纬度

    在百度地图上展示附近药店

    点击某药店可查看该药店和药店的药品信息

    算法描述

    web层处理全类名:com.nankai.pharecom.web.GISController

    service层接口全类名:com.nankai.pharecom.service.IGISService

    service层接口实现全类名:com.nankai.pharecom.service.GISService

    dao层接口全类名:com.nankai.pharecom.dao.IGISDao

    dao层接口实现mapper:com.nankai.pharecom.dao.GISMapper

     

    //处理方法

    findPharmacyList(String scope);//查找附近的药店列表,获取药店的经纬度

    callBaiduMapUsePOI(List<Pharmacy> pList);//调用百度地图POI展示方法

    findPharmacyById(int pId);//通过药店id查询药店信息

    findMedicineListByPId(int pId);//通过药店id查询该药店的药品列表信息

    表4-27 距离计算模块详细设计

    模块编号

    S100-010

    模块名称

    距离计算

    模块描述

    计算客户当前位置与药店之间的距离

    主要功能

    获取药店经纬度坐标

    计算客户当前位置与药店之间的距离

    算法描述

    web层处理全类名:com.nankai.pharecom.web.GISController

    service层接口全类名:com.nankai.pharecom.service.IGISService

    service层接口实现全类名:com.nankai.pharecom.service.GISService

    dao层接口全类名:com.nankai.pharecom.dao.IGISDao

    dao层接口实现mapper:com.nankai.pharecom.dao.GISMapper

     

    //处理方法

    findPharmacyById(int pId);//通过药店id查询药店信息,获取经纬度坐标

    callBaiduMapUseGetDistance(Point pointA, Point pointB);//调用百度地图距离计算方法

     

    表4-28 路径规划模块详细设计

    模块编号

    S100-011

    模块名称

    路径规划

    模块描述

    规划客户当前位置与药店之间的路径

    主要功能

    获取药店经纬度坐标

    规划客户当前位置与药店之间的路径:步行路径、公交路径、驾车路径

    算法描述

    web层处理全类名:com.nankai.pharecom.web.GISController

    service层接口全类名:com.nankai.pharecom.service.IGISService

    service层接口实现全类名:com.nankai.pharecom.service.GISService

    dao层接口全类名:com.nankai.pharecom.dao.IGISDao

    dao层接口实现mapper:com.nankai.pharecom.dao.GISMapper

     

    //处理方法

    findPharmacyById(int pId);//通过药店id查询药店信息,获取经纬度坐标

    callBaiduMapUseWalkingRoute(Point pointA, Point pointB);//调用百度地图步行路径规划方法

    callBaiduMapUseTransitRoute(Point pointA, Point pointB);//调用百度地图公交路径规划方法

    callBaiduMapUseDrivingRoute(Point pointA, Point pointB);//调用百度地图驾车路径规划方法

     

    4.4.3.5 评论管理子系统S101

    表4-29 评论采集模块详细设计

    模块编号

    S101-001

    模块名称

    评论采集

    模块描述

    采集与统计分析用户评论

    主要功能

    采集评论:将用户的评论打到ES服务上

    统计分析:对用户评论进行统计分析,如好、中、差评率,药店、药品评价量topN等

    算法描述

    web层处理全类名:com.nankai.pharecom.web.EvaluateController

    service层接口全类名:com.nankai.pharecom.service.IEvaluateService

    service层接口实现全类名:com.nankai.pharecom.service.EvaluateService

    dao层接口全类名:com.nankai.pharecom.dao.IEvaluateDao

    dao层接口实现mapper:com.nankai.pharecom.dao.EvaluateMapper

     

    //处理方法

    addToES(Evaluate evaluate);//将一条评论打到ES上

    addBatchToES(List<Evaluate> eList);//将评论批量打到ES上

    calPharmacyEvaluateRatioFromES(int pId, String tag);//计算某个药店的好、中、差评率,其中pId为该药店id,tag表示好、中、差评传参

    calMedicineEvaluateRatioFromES(int mId, String tag);//计算某个药店的好、中、差评率,其中mId为药品id,tag表示好、中、差评传参

    pharmacyEvaluateTopN(int n);//药店评价量topN排名

    medicineEvaluateTopN(int n);//药品评价量topN排名

    表4-30 情感极性分析模块详细设计

    模块编号

    S101-010

    模块名称

    情感极性分析

    模块描述

    分析用户评论的情感极性

    主要功能

    通过情感极性分析算法分析评论文本的情感极性及极性强度

    算法描述

    bsa_agorithm算法,算法详见论文2.4小节

     

    4.4.3.6 药店推荐子系统S110

    表4-31 药店推荐模块详细设计

    模块编号

    S110-001

    模块名称

    药店推荐

    模块描述

    为用户推荐适合的药店

    主要功能

    计算基于协同过于的推荐值

    计算基于地理位置的推荐值

    计算基于用户评论的推荐值

    计算最终推荐值

    算法描述

    推荐算法,算法设计详见论文2.5小节

     

    4.4.3.7 客户使用子系统S111

    表4-32 药店查询模块详细设计

    模块编号

    S111-001

    模块名称

    药店查询

    模块描述

    用户通过系统查询推荐药店

    主要功能

    关键词查询调用推荐算法推荐药店

    点击查询结果查看药店详情,包括药店、药品详情和对应的历史用户评论详情和统计

    算法描述

    web层处理全类名:com.nankai.pharecom.web.FrontController

    service层接口全类名:com.nankai.pharecom.service.IFrontService

    service层接口实现全类名:com.nankai.pharecom.service.FrontService

    dao层接口全类名:com.nankai.pharecom.dao.IFrontDao

    dao层接口实现mapper:com.nankai.pharecom.dao.FrontMapper

     

    //处理方法

    findPharmacyByKeyWords(List<String> kwList, Point currentPoint);//通过用户输入的关键词集合,结合当前位置,调用推荐算法获取推荐的药店排序列表

    findPharmacyById(int pId);//通过药店id查询获取药店信息

    findMedicineListByPharmacy(int pId);//通过药店id查询获取药店上架的药品信息

    findEvaluateListByPharmacyAndMedicine(int pId, int mId);//获取推荐的药店和药品组合的历史用户评论列表

    calEvaluateRatio(int pId,int mId, String tag);//计算推荐药店与药品的好、中、差评率,其中pId为该药店id,mId为药品id,tag表示好、中、差评传参

     

    表4-33 药店导航模块详细设计

    模块编号

    S111-010

    模块名称

    药店导航

    模块描述

    为用户从当前位置导航至推荐药店

    主要功能

    调用百度地图API,按照步行、公交、驾车三种方案进行导航

    算法描述

    web层处理全类名:com.nankai.pharecom.web.FrontController

    service层接口全类名:com.nankai.pharecom.service.IFrontService

    service层接口实现全类名:com.nankai.pharecom.service.FrontService

    dao层接口全类名:com.nankai.pharecom.dao.IFrontDao

    dao层接口实现mapper:com.nankai.pharecom.dao.FrontMapper

     

    //处理方法

    findPharmacyById(int pId);//通过药店id查询药店信息,获取经纬度坐标

    callBaiduMapUseWalkingRoute(Point pointA, Point pointB);//调用百度地图步行导航方法

    callBaiduMapUseTransitRoute(Point pointA, Point pointB);//调用百度地图公交导航方法

    callBaiduMapUseDrivingRoute(Point pointA, Point pointB);//调用百度地图驾车导航方法

    表4-34 用户评论模块详细设计

    模块编号

    S111-011

    模块名称

    用户评论

    模块描述

    用户评论推荐的药店和药品

    主要功能

    用户评论与保存

    算法描述

    web层处理全类名:com.nankai.pharecom.web.FrontController

    service层接口全类名:com.nankai.pharecom.service.IFrontService

    service层接口实现全类名:com.nankai.pharecom.service.FrontService

    dao层接口全类名:com.nankai.pharecom.dao.IFrontDao

    dao层接口实现mapper:com.nankai.pharecom.dao.FrontMapper

     

    //处理方法

    addEvaluate(Evaluate evaluate,int pId,int mId);//添加药店、药品的评论

     

     

    5  主要功能展示

    系统分为客户前端和管理后台,客户前端主主要为用户提供服务,以移动端页面为主,管理后台主要为管理员(包括系统管理员与药店管理员)提供系统管理服务和药店药品管理服务等。

    5.1 用户登录展示

    用户登录分管理员登录和普通用户登录,管理员登录组要通过PC端登录,普通用于主要从移动端登录,其登录界面分别如图5-1和图5-1所示。

    图5-1 PC端管理员登录界面

    图5-2 移动端普通用户登录界面

     

    用户登录系统后,根据不同的角色,展现出对应的功能界面,提供相应的服务。

    5.2 普通用户功能展示

    普通用户登录成功后会,将跳转至客户端首页,如图5-3所示。首页包括系统logo,附近的药店幻灯片切换以及主要的功能菜单,包括附近药店、药店推荐、用户评论以及个人中心。

                

    图5-3 普通用户系统首页                 图5-4 附近的药店

    点击进入【附近药店】,系统将根据用户所在的定位,展示附近已入驻本系统的药店,如图5-4所示界面。图中即展示南开大学附近入驻的和平药店、敬一堂、正天药店等。点击界面上方“<”图标可返回上一级页面,本处即返回首页。

    返回首页后,点击【药店推荐】,进入药店推荐功能页面,可根据症状需求,输入关键词,如感冒、风热,点击【搜索】按钮,系统将推荐1-3个适合用户需求的药店(推荐算法详见2.5小结。),并按照推荐指数降序排列,排名越靠前,推荐指数越高,如图5-5所示。

                

    图5-5 药店推荐页面                 图5-6 药店推荐药品详情

    点击查某个推荐药店项上的【详情】按钮,可查看推荐的具体药品,如点击【正天药店】项右下角的【详情】按钮,即跳转至药品推荐详情页,如图5-6所示,可以看到推荐了复方穿心莲片、抗病毒口服液等用于治疗风热感冒的药品,并显示有药品的价格和主要功能等,用户可根据需求进行参考选择。

    若用户不熟悉当地地理环境,不知道如何到达推荐的药店,可点击对应想去的推荐药店右下方的【导航】按钮,系统将会为用户规划路线,并可提供导航服务,如图5-7所示,用户可选择驾车、步行、公交三种不同方案,图中显示的为驾车导航方案。

                

    图5-7 药店推荐页面                  图5-8 药店评价列表

    用户可通过查看历史用户评论,为选择更为合适和优质的药店。返回首页后,点击【用户评论】,系统将跳转至药店评价列表,采用分页展示,排列顺序按照距离降序排列,如图5-8所示。可通过点击列表中某一项查看某个药店的具体评价详情,如图5-9所示,查看老百姓大药房各药品的评价详情。评论列表可按照最新、人气、最早三种模式展示,默认最新模式。

                

    图5-9 药店药品评价详                    图5-10 个人中心

    【个人中心】可设置上传自己的图像,昵称等信息,也可查看我的浏览足迹,通过系统关键词搜索后推荐的方案,以及方案的评价等,如图5-10所示。点击【推荐的药店】,进入我的方案页面,即当前使用系统关键词搜索推荐过的方案。

                

    图5-9 药店药品评价详请                   图5-10 评价页面

    用户可以对未评价推荐的方案进行评价,点击【评价】按钮,已评价过的方案的按钮则会变为灰色的【已评】。如点击图5-9第一项的评价按钮,即跳转至该方案的评价页面,选择好评、中评或差评,并填写详细评价后点击【提交评价】按钮即可提交本次评价,之后也可在【用户评论】模块中对应药店下查看到该评论。

    5.3 系统管理员功能展示

    系统管理员拥有系统后台管理的最高权限,负责系统业务方面的主要运维工作,包括系统管理和药店药品管理两个方面,其中系统管理包括资源管理、角色及角色权限管理、用户管理、系统日志查看,药店药品管理包括药店管理和药品管理。

    系统管理员成功登录系统后,将跳转至如图5-11展示系统运营相关数据和服务器相关性能指标的系统首页。

    图5-11 系统管理员首页

    首页左侧主要是系统菜单栏,此外展示了系统logo以及用户头像等信息。菜单栏右边为系统数据面板,包括系统实时在线人数、今日方案推荐数、已入驻系统的药店数、近一周系统访问量走势、评价等级统计、系统运行状况以及服务器基本信息。用户通过点击左侧菜单栏的各个菜单切换系统功能,系统管理员的功能菜单如图5-12所示。

    图5-12 系统管理员功能菜单

    【资源管理】功能主要管理系统的菜单、按钮等系统资源,便于之后的权限管理。资源管理包括资源的查看、新增、修改和删除,以资源树和资源列表的形式进行展示,资源树上的每个节点对应一个菜单,节点的层级代表菜单的层级,资源列表中为对应菜单(节点)上的子菜单或按钮资源。点击资源树的某一节点(菜单资源),资源列表展示该节点下对应的子菜单或按钮等资源,如图5-13所示。

    图5-13 资源管理

    【角色管理】功能主要关系系统角色和角色权限管理,具体包括角色的增删改查操作以及角色权限的分配。角色管理界面如图5-14所示。

    图5-14 角色管理

    角色权限管理,即为角色分配资源,在角色新增时即要为该角色分配相应的权限,若需修改角色的权限则通过角色修改功能可以实现,角色权限资源分配如图5-15所示。

    图5-15 角色权限管理

    本系统暂未提供系统注册功能,主要通过【用户管理】功能管理系统用户,该功能可对用户进行常规的增删改查操作,也可锁定和解锁用户。如图5-16所示。

    图5-16 用户管理

    系统管理员可通过查看系统日志,监控用户操作系统行为。点击【系统日志】菜单,即可进入日志查看页面,可查看和删除日志,如图5-17所示。

    图5-17 系统日志

    药店管理方面,点击【药店药品管理】菜单下的【药店管理】菜单,进入药店管理界面。系统管理员可新增、编辑、删除、查看药店,还可选中需要审核的药店点击【审核入驻】按钮,审核申请入驻本系统的药店,药店管理列表如图5-18所示。

    图5-18 系统管理员药店管理列表

    新增/编辑药店界面类似,如图5-19所示。区别在于若是新增药店,该界面的药店信息字段均为空,需要填必要字段后才能提交保存;若是编辑药店,则系统会自动带出该药店的信息,只需修改需要修改的信息提交保存即可。其中,药店图片属性可上传1-5张关于药店的图片。

    图5-19 药店新增/编辑

    系统管理员的【药品管理】功能,即是管理可供药店上架出售的药品,维护药品信息,可对药品信息进行增删改查操作,如图5-20所示。

    图5-20 系统管理员药品管理列表

    药品新增/编辑与药店新增/编辑功能操作相似,其中药品图片属性可上传1-3张关于该药品的图片,如图5-21所示。

    图5-21 药品新增/编辑

    5.4 药店管理员功能展示

    药点管理员主要工作是管理本单位的药店和药品。

    药店管理方面,药店管理员可对本单位的药店进行增删改查操作,也可对未入驻本系统的药店提出入驻申请,如图5-22所示。

    图5-22 药店管理员药店管理

    药品管理方面,主要是上下架本店的药品,可上下架的药品清单来至于系统管理员的药品管理,管理界面如图5-23所示。

    图5-23 药店管理员药品上下架管理

    药店管理员可通过查找需上下架的药品,进行相应的上下架操作。其中,药品上架需要指定该药品在本药店的单价和所在货位号,如图5-24所示。

    图5-24 药品上架

    6  结论与展望

    6.1 结论

    本文首先分析了当前社会环境下药店现状及遇到的问题,特别是互联网的到来对药店的冲击与影响;提出了为满足消费者个性化的购买药品需求,将GIS技术、评论挖掘与分析算法、推荐算法整合到药店管理系统中,形成互联网+药店推荐系统;研究了管理信息系统、Web GIS技术、网络文本评论挖掘与分析算法、推荐算法的研究现状;设计并实现了互联网+药店推荐系统。

    本系统的实现主要用Java语言开发,采用了当前流行的开源框架和技术,并融合Web GIS技术、情感分析算法(bsa_agorithm)和本文提供的推荐算法;数据存储采用MySQL和Elasticsearch,Elasticsearch用于存储用户行为和用户评价等数据量较大的数据,便于查询、检索和分析,其他系统数据存储在MySQL数据库。该系统包括用户登录子系统、后台管理子系统、药店管理子系统、地理信息子系统、评论管理子系统、药店推荐子系统和客户使用子系统。

    本系统以目前先进的互联网技术为支撑,设计与实现了一套完整了互联网+药店推荐系统流程。系统的主要优点如下:

    • 系统实现了一套完整的药店推荐流程,包括浏览附近的药店、关键词查找推荐药店、查看推荐药店的药品信息和历史用户评论、导航至推荐药店、对推荐方案中的药店药品进行评价等功能。
    • 系统先进、用户体验较好。本系统采用了目前先进和流行的技术进行开发,并融合了人工智能算法,注重用户体验,客户可直接在移动设备上使用,操作方便简单。
    • 系统运维成本低。系统功能运维系统管理员可以十分便利的通过后台管理子系统进行管理;技术运维方面,应用服务器和数据库服务器都部署在阿里云,阿里云强大的技术团队可为我们有力的技术支持,确保系统的稳定运行。

    6.2 展望

    随着互联网技术的更深入发展以及互联网+时代的到来,更多的互联网先进技术,如物联网、人工智能、大数据、云计算、区块链等,将会应用于生活的方方面面,为人们的生活带来方便。同样,我们的互联网+药店系统还有许多值得完善的地方,主要总结一下为3个方面:

    • 情感分析算法、推荐算法有待进一步的优化。通过分析更多的内在和外在因素,优化算法模型,为用户推荐更加合适的药品购选方案。
    • 为提升用户对系统推荐的药店和药品的信任度和满意度。引入区块链等技术,实现对入驻的药店以及药品品牌信誉度评级,确保系统推荐的内容真实可靠,避免“莆田系”药店出现。
    • 完善系统监控管理功能。系统监控接口与微信、短信等接口对接,实时将系统出现的问题以微信、短信的形式通知管理员。

     


    参考文献

    1. 乐伟平.公司人事管理信息系统的开发[J].财经问题研究,2016(S1):6-10.
    2. 彭红利. 通用物资仓库管理信息系统设计与实现[D].西安建筑科技大学,2015.
    3. 杜宇. 服装生产管理信息系统设计与实现[D].吉林大学,2016.
    4. 沈捷. 快消品企业仓储管理系统的设计与实施[D].江西财经大学,2018.
    5. 谢鹏. 建筑企业管理信息系统设计与实现[D].天津大学,2016.
    6. 舒昌俊. 建设工程造价信息管理系统集成研究[D].武汉理工大学,2013.
    7. 李健.铁路审计管理信息系统分析与设计[J].铁路计算机应用,2015,24(12):28-31.
    8. 张宇栋,吕淑然,李玉杰.生产事故隐患排查治理及预警管理信息系统研究[J].安全与环境工程,2017,24(02):148-152+158.
    9. 骆鹏傲,朱红,刘奕君,刘菁.研究生招生与培养管理信息系统的设计[J].湖南工程学院学报(自然科学版),2013,23(04):38-40.
    10. 宋甜. 学生信息管理系统设计与实现[D].湖北工业大学,2017.
    11. 王栎浩. 高校培训管理信息系统的设计与开发[D].华北电力大学(北京),2017.
    12. 滕婕.社区图书馆管理信息系统[J].中国集体经济,2018(12):97-101.
    13. 管伟元,金海丰.科研设计管理信息系统数据库性能优化研究[J].船舶与海洋工程,2013(04):69-72.
    14. 杨扬,贾君君,李研.科研项目管理信息系统开发及应用研究[J].信息系统工程,2017(12):112-113.
    15. 张蕾. 某证券公司客户关系管理信息系统的设计与实现[D].江西财经大学,2016.
    16. 杨彦璐. 民生银行信贷管理信息系统设计与实现[D].电子科技大学,2015.
    17. 苏樱.浅谈资金管理信息系统平台的设计与实践[J].中国商贸,2014(36):72-74.
    18. 刘耘礽. 我国社保基金一体化管理信息系统研究与架构设计[D].西南财经大学,2014.
    19. 刘毅新.社会保险管理信息系统的设计与开发[J].电子技术与软件工程,2018(01):47.
    20. 周江龙.电力营销管理信息系统的设计与应用[J].中国战略新兴产业,2018(20):137+139.
    21. 米子秋.物流运输管理信息系统研究[J].中国新通信,2018,20(07):80.
    22. 李维雅.医院管理信息系统(HMIS)的日常维护与管理[J].中外女性健康研究,2017(24):181-182.
    23. 张曼玲,付冰.旅游管理信息系统设计与实现[J].品牌(下半月),2015(11):229-230.
    24. 孙小丽.茶业企业财务管理信息系统设计与实现[J].福建茶叶,2018,40(01):448-449.
    25. 林高印.浙江省农田水利项目管理信息系统开发与研究[J].农村经济与科技,2014,25(12):70-71.
    26. 吴健. 种猪数字化管理信息系统开发与应用研究[D].华中师范大学,2017.
    27. 郑磊. 临沂市智慧城市管理信息系统构建研究[D].山东大学,2015.
    28. 张岚.智能物联网平台的船舶交通管理信息系统框架设计[J].舰船科学技术,2018,40(02):58-60.
    29. 丁汀.浅谈连锁药店管理信息系统的设计与实现[J].科技经济导刊,2017(04):52.
    30. 李亚丽.药店管理信息系统的设计与实现[J].信息技术,2015(07):125-127.
    31. 杨登.药品管理信息系统的分析与设计[J].北方经贸,2014(05):212-213.
    32. 毕含峰. 医院药品管理信息系统的设计与实现[D].电子科技大学,2012.
    33. 程彬,段浩宇,董炜华.基于百度地图API的购房平台系统开发[J].长春师范大学学报,2014,33(08):86-90.
    34. 张欣欣.HTML及百度地图API在WebGIS中的应用实例研究[J].江苏科技信息,2017(07):63-65.
    35. 郑诗嘉,李建,代斌.百度地图API在O2O餐饮系统中的应用[J].电脑知识与技术,2017,13(11):89-90.
    36. 孙迪,李沛鸿.百度地图API在WebGIS中的应用[J].河南科技,2013(22):165-166.
    37. 姜珊,张海旭,于璐,杨黎黎,王新秀.百度地图API在水库信息显示中的应用[J].信息技术与信息化,2016(09):33-35.
    38. 鲁萱萱.基于高德地图的骑行发现与分享功能的设计[J].电脑知识与技术,2018,14(04):258-259+264.
    39. 马超,李苗.基于高德地图的生活服务平台的设计与实现[J].科教文汇(下旬刊),2017(11):182-184.
    40. 李庭威,王峰,汪进,夏佩,邱文添,龙保任,李学易.高精度差分在高德地图上的多点实时定位[J].电脑知识与技术,2017,13(23):200-201.
    41. 吴国华.基于高德地图开发公交查询系统项目在JavaScript课程教学中的应用[J].电脑知识与技术,2018,14(05):162-163+170.
    42. 吴肖,彭璇,朱明磊.基于Google Map API的校园电子地图开发[J].测绘工程,2010,19(03):35-38.
    43. 李垠,特木其勒,刘可,张亦梅.Google地图在地震信息发布中的应用[J].地震地磁观测与研究,2011,32(05):166-171.
    44. 霍胜春,阚金明.基于Google地图接口的流动机械远程监控系统设计[J].物流工程与管理,2012,34(05):89-90+82.
    45. 许祥军,魏红芹.面向产品开发的评论挖掘方法研究[J].现代计算机(专业版),2018(01):30-34.
    46. 程惠华,黄发良,潘传迪.基于产品评论情感分析的用户满意度挖掘[J].福建师范大学学报(自然科学版),2017,33(01):14-21.
    47. 李涵昱,钱力,周鹏飞.面向商品评论文本的情感分析与挖掘[J].情报科学,2017,35(01):51-55+61.
    48. 黄秋义,丁婷婷,杨帆.基于商品评论信息的情感倾向性分析模型[J].电子制作,2016(08):36-37.
    49. 刘紫玉,尹丽娟,王青,王玉恒,杨明欣.基于消费者评论挖掘的B2C网购物流服务因素类型及其作用机制研究[J].河北科技大学学报,2017,38(06):600-608.
    50. 郑玉桂. 面向电商评论细粒度观点挖掘的拓展主题模型研究[D].浙江工商大学,2017.
    51. 郗亚辉.产品评论挖掘中特征同义词的识别[J].中文信息学报,2016,30(04):150-158.
    52. 陈义. 文本挖掘在网购用户评论中的应用研究[D].浙江工商大学,2018.
    53. 傅黎犁,刘岩.“毒胶囊”事件舆情分析及其对医学情报工作创新的启示[J].医学信息学杂志,2013,34(01):51-54.
    54. 张瑜,李兵,刘晨玥.面向主题的微博热门话题舆情监测研究——以“北京单双号限行常态化”舆情分析为例[J].中文信息学报,2015,29(05):143-151+159.
    55. 宋铁,叶永隆,刘国恒,郭汝宁,李灵辉.突发公共卫生事件网络舆情监测平台的建立与应用[J].华南预防医学,2013,39(03):53-55+58.
    56. 李斅葳. 基于敏感信息挖掘的网络舆情监测系统研究[D].复旦大学,2013.
    57. 姜胜洪.网络谣言的形成、传导与舆情引导机制[J].重庆社会科学,2012(06):12-20.
    58. 陈元,赵静.基于WEB用户产品评论的企业竞争情报挖掘实证研究[J].情报科学,2016,34(04):80-85.
    59. 石进,胡广伟.企业竞争情报系统建设中的舆情监控研究[J].图书情报工作,2012,56(24):44-48.
    60. 叶水茂.网络环境下的企业危机管理与舆情应对[J].新闻世界,2011(12):13-15.
    61. 刘世杰,程齐凯.网络新闻个性化推荐系统策略研究[J].软件导刊,2017,16(08):146-148+152.
    62. 黄志强. 基于标签的个性化推荐系统研究[D].西安电子科技大学,2017.
    63. 张东伟. 面向用户偏好的包推荐算法研究[D].南京邮电大学,2017.
    64. 贺桂和.基于用户偏好挖掘的电子商务协同过滤推荐算法研究[J].情报科学,2013,31(12):38-42.
    65. 韩亚楠,曹菡,刘亮亮.基于评分矩阵填充与用户兴趣的协同过滤推荐算法[J].计算机工程,2016,42(01):36-40.
    66. 杨大鑫,王荣波,黄孝喜,谌志群.基于最小方差的K-means用户聚类推荐算法[J].计算机技术与发展,2018,28(01):104-107.
    67. 卜旭松. 基于物品协同过滤的个性化视频推荐算法改进研究[D].宁夏大学,2015.
    68. 吴玺煜,陈启买,刘海,贺超波.基于知识图谱表示学习的协同过滤推荐算法[J].计算机工程,2018,44(02):226-232+263.
    69. 李琳娜,李建春,张志平.启发式的物品相似度传播的协同过滤算法研究[J].现代图书情报技术,2013(01):30-35.
    70. 曾维明. 基于领域本体的语义检索及个性化推荐算法研究[D].南京理工大学,2010.
    71. 何明,刘伟世,张江.支持推荐非空率的关联规则推荐算法[J].通信学报,2017,38(10):18-25.
    72. 金紫嫣,张娟,李向军,温海平,张华薇.一种带标签的协同过滤广告推荐算法[J].计算机工程,2018,44(04):236-242+247.
    73. 陈平华,陈传瑜,洪英汉.一种结合关联规则的协同过滤推荐算法[J].小型微型计算机系统,2016,37(02):287-292.
    74. https://bitbucket.org/shichaoqu/semantic-analysis-tool/overview.

     

     

     

    展开全文
  • 毕业生就业信息管理系统设计与实现(毕业设计 完整)毕业生就业信息管理系统设计与实现(毕业设计 完整)
  • 消息系统设计与实现

    万次阅读 2016-07-18 17:05:50
    欢迎关注公众号: ----------------------------------------------正文-------------...消息系统设计与实现 文/JC_Huang(简书作者) 原文链接:http://www.jianshu.com/p/f4d7827821f1 著作权归作者所有,转...

    欢迎关注公众号:

    ----------------------------------------------正文----------------------------------------------------

     

    消息系统设计与实现

    文/JC_Huang(简书作者)
    原文链接:http://www.jianshu.com/p/f4d7827821f1
    著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。

    产品分析

    首先我们来看一下市场上关于消息的实现是怎么样的。

    简书

    简书的消息系统主要分了两种

    • 简信
    • 提醒

    简信
    简信的性质其实跟私信是一样的,是用户发送给用户的一则消息,有具体的信息内容。

    消息系统设计与实现

    简书简信

    提醒
    而提醒,则是系统发送的一则消息,其文案格式是固定的,并且对特殊对象一般拥有超链接。

    消息系统设计与实现

    简书提醒

    知乎

    知乎跟简书一样,主要分了两种:

    • 私信
    • 消息

    私信
    跟简书一样,使用户发送给用户的一则消息,也可以是管理员发送给用户的消息。

    消息系统设计与实现

    知乎私信

    消息
    知乎的消息比简书的提醒有过之而无不及,知乎会对多条相似的消息进行聚会,以达到减轻用户阅读压力的体验。

    消息系统设计与实现

    知乎消息

    消息的三种分类

    通过两种产品的简单分析,得出他们的消息有两种分类,在这基础上,我们再加上一种:公告。
    公告的主要性质是系统发送一则含有具体内容的消息,站内所有用户都能读取到这条消息。
    所以,消息有三种分类:

    1. 公告 Announce
    2. 提醒 Remind
    3. 私信 Message

    提醒的语言分析

    我们从简书取一组提醒样本:

    • 3dbe1bd90774 关注了你
    • magicdawn 喜欢了你的文章 《单点登录的三种实现方式》
    • 无良程序 喜欢了你的文章 《基于RESTful API 怎么设计用户权限控制?》
    • alexcc4 喜欢了你的文章 《在Nodejs中贯彻单元测试》
    • 你在《基于RESTful API 怎么设计用户权限控制?》中收到一条 cnlinjie 的评论
    • 你的文章《Session原理》已被加入专题 《ios开发》

    分析句子结构,提醒的内容无非就是

    「谁对一样属于谁的事物做了什么操作」
    「someone do something in someone's something」

    someone = 提醒的触发者,或者发送者,标记为sender
    do something = 提醒的动作,评论、喜欢、关注都属于一个动作,标记为action
    something = 提醒的动作作用对象,这就具体到是哪一篇文章,标记为target
    someone's = 提醒的动作作用对象的所有者,标记为targetOwner

    这就清楚了,sender和targetOwner就是网站的用户,而target是具体到哪一篇文章,如果提醒的对象不仅仅局限于文章,还有其他的话,就需要增加一项targetType,来标记目标是文章还是其他的什么。而action,则是固定的,整个网站会触发提醒的动作可能就只有那几样:评论、喜欢、关注.....(或者其他业务需要提醒的动作)

    消息的两种获取方式

    • 推 Push
    • 拉 Pull

    以知乎为例
    推的比较常见,需要针对某一个问题维护着一张关注者的列表,每当触发这个问题推送的条件时(例如有人回答问题),就把这个通知发送给每个关注者。

    拉的相对麻烦一点,就是推的反向,例如每个用户都有一张关注问题的列表,每当用户上线的时候,对每个问题进行轮询,当问题的事件列表出现了比我原本时间戳大的信息就进行拉取。

    而我们则根据消息的不同分类采用不同的获取方式:
    通告和提醒,适合使用拉取的方式,消息产生之后,会存在消息表中,用户在某一特定的时间根据自己关注问题的表进行消息的拉取,然后添加到自己的消息队列中,

    信息,适合使用推的方式,在发送者建立一条信息之后,同时指定接收者,把消息添加到接收者的消息队列中。

    订阅

    根据提醒使用拉取的方式,需要维护一个关注某一事物的列表。
    这种行为,我们称之为:「订阅」Subscribe

    一则订阅有以下三个核心属性:

    • 订阅的目标 target
    • 订阅的目标类型 targetType
    • 订阅的动作 action

    比如我发布了一篇文章,那么我会订阅文章《XXX》的评论动作,所以文章《XXX》每被人评论了,就需要发送一则提醒告知我。

    订阅的规则还可以扩展
    我喜欢了一篇文章,和我发布了一篇文章,订阅的动作可能不一样。
    喜欢了一篇文章,我希望我订阅这篇文章更新、评论的动作。
    而发布了一篇文章,我希望我只是订阅这篇文章的评论动作。

    这时候就需要多一个参数:subscribReason
    不同的subscribReason,对应着一个动作数组,
    subscribReason = 喜欢,对应着 actions = [更新,评论]
    subscribReason = 发布,对应着 actions = [评论]

    订阅的规则还还可以扩展
    用户可能会有一个自己的订阅设置,比如对于所有的喜欢的动作,我都不希望接收。
    比如Knewone的提醒设置

    消息系统设计与实现

    Knewone提醒设置

    所以我们需要再维护一个表:SubscriptionConfig,来存放用户的提醒设置。
    并且,当用户没有提醒设置的时候,可以使用系统提供的一套默认设置:defaultSubscriptionConfig

    聚合

    如果我发布了一篇文章《XXX》,在我不在线的时候,被评论了10遍,当我一上线的时候,应该是收到十条信息类似于:「谁谁谁评论了你的文章《XXX》」?
    还是应该收到一条信息:「甲、乙、丙、丁...评论了你的文章《XXX》」?

    知乎在聚合上做的很优秀,要知道他们要实现这个还是挺有技术的:
    知乎的消息机制,在技术上如何设计与规划?
    网站的消息(通知)系统一般是如何实现的?

    关于这部分功能,我们还没有具体的实现方法,暂时也无法讲得更加详细。⊙﹏⊙

    五个实体

    通过上面的分析,大概知道做这个消息系统,需要哪些实体类:

    1. 用户消息队列 UserNotify
    2. 用户 User
    3. 订阅 Subscription
    4. 订阅设置 SubscriptionConfig
    5. 消息 Notify
      • 通告 Announce
      • 提醒 Remind
      • 信息 Message

    行为分解

    说了这么多,整理一下整个消息流程的一些行为:

    • 系统或者管理员,创建消息
      • createNotify (make announce | remind | message)
    • 用户,订阅消息,取消订阅
      • subscribe, cancelSubscription
    • 用户管理订阅设置
      • getSubscriptionConfig, updateSubscriptionConfig
    • 用户,拉取消息
      • pullNotify (pull announce | remind | message | all)
    • 用户,查询消息队列
      • getUserNotify(get announce | remind | message | all)
    • 用户阅读消息
      • read

    >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

    模型设计

    Notify

    id            : {type: 'integer', primaryKey: true},        // 主键
    content     : {type: 'text'},    // 消息的内容
    type        : {type: 'integer', required: true, enum: [1, 2, 3]},  // 消息的类型,1: 公告 Announce,2: 提醒 Remind,3:信息 Message
    target      : {type: 'integer'},    // 目标的ID
    targetType  : {type: 'string'},    // 目标的类型
    action      : {type: 'string'},    // 提醒信息的动作类型
    sender      : {type: 'integer'},    // 发送者的ID
    createdAt    : {type: 'datetime', required: true}

    Save Remind
    消息表,我们需要targettargetType字段,来记录该条提醒所关联的对象。而action字段,则记录该条提醒所关联的动作。
    比如消息:「小明喜欢了文章」
    则:

    target = 123,  // 文章ID
    targetType = 'post',  // 指明target所属类型是文章
    sender = 123456  // 小明ID

    Save Announce and Message
    当然,Notify还支持存储公告和信息。它们会用到content字段,而不会用到targettargetTypeaction字段。

    UserNotify

    id            : {type: 'integer', primaryKey: true},        // 主键
    isRead      : {type: 'boolean', required: true},   
    user        : {type: 'integer', required: true},  // 用户消息所属者
    notify      : {type: 'integer', required: true}   // 关联的Notify
    createdAt    : {type: 'datetime', required: true}

    我们用UserNotify来存储用户的消息队列,它关联一则提醒(Notify)的具体内容。
    UserNotify的创建,主要通过两个途径:

    1. 遍历订阅(Subscription)表拉取公告(Announce)和提醒(Remind)的时候创建
    2. 新建信息(Message)之后,立刻创建。

    Subscription

    target      : {type: 'integer', required: true},    // 目标的ID
    targetType  : {type: 'string', required: true},    // 目标的类型
    action      : {type: 'string'},   // 订阅动作,如: comment/like/post/update etc.
    user        : {type: 'integer'},
    createdAt    : {type: 'datetime', required: true}

    订阅,是从Notify表拉取消息到UserNotify的前提,用户首先订阅了某一个目标的某一个动作,在此之后产生这个目标的这个动作的消息,才会被通知到该用户。
    如:「小明关注了产品A的评论」,数据表现为:

    target: 123,  // 产品A的ID
    targetType: 'product',
    action: 'comment',
    user: 123  // 小明的ID

    这样,产品A下产生的每一条评论,都会产生通知给小明了。

    SubscriptionConfig

    action: {type: 'json', required: true},   // 用户的设置
    user: {type: 'integer'}

    不同用户可能会有不一样的订阅习惯,在这个表中,用户可以统一针对某种动作进行是否订阅的设置。而默认是使用系统提供的默认配置:

    defaultSubscriptionConfig: {
      'comment'   : true,    // 评论
      'like'      : true,    // 喜欢
    }

    在这套模型中,targetTypeaction是可以根据需求来扩展的,例如我们还可以增加多几个动作的提醒:hate被踩、update被更新....诸如此类。

    配置文件 NotifyConfig

    // 提醒关联的目标类型
    targetType: {
      PRODUCT : 'product',    // 产品
      POST    : 'post'    // 文章
    },
    
    // 提醒关联的动作
    action: {
      COMMENT   : 'comment',  // 评论
      LIKE      : 'like',     // 喜欢
    },
    
    // 订阅原因对应订阅事件
    reasonAction: {
      'create_product'  : ['comment', 'like']
      'like_product'    : ['comment'],
      'like_post'       : ['comment'],
    },
    
    // 默认订阅配置
    defaultSubscriptionConfig: {
      'comment'   : true,    // 评论
      'like'      : true,    // 喜欢
    }

    服务层 NotifyService

    NotifyService拥有以下方法:

    • createAnnounce(content, sender)
    • createRemind(target, targetType, action, sender, content)
    • createMessage(content, sender, receiver)
    • pullAnnounce(user)
    • pullRemind(user)
    • subscribe(user, target, targetType, reason)
    • cancelSubscription(user, target ,targetType)
    • getSubscriptionConfig(userID)
    • updateSubscriptionConfig(userID)
    • getUserNotify(userID)
    • read(user, notifyIDs)

    各方法的处理逻辑如下:

    createAnnounce(content, sender)

    1. 往Notify表中插入一条公告记录

    createRemind(target, targetType, action, sender, content)

    1. 往Notify表中插入一条提醒记录

    createMessage(content, sender, receiver)

    1. 往Notify表中插入一条信息记录
    2. 往UserNotify表中插入一条记录,并关联新建的Notify

    pullAnnounce(user)

    1. 从UserNotify中获取最近的一条公告信息的创建时间: lastTime
    2. lastTime作为过滤条件,查询Notify的公告信息
    3. 新建UserNotify并关联查询出来的公告信息

    pullRemind(user)

    1. 查询用户的订阅表,得到用户的一系列订阅记录
    2. 通过每一条的订阅记录的targettargetTypeactioncreatedAt去查询Notify表,获取订阅的Notify记录。(注意订阅时间必须早于提醒创建时间)
    3. 查询用户的配置文件SubscriptionConfig,如果没有则使用默认的配置DefaultSubscriptionConfig
    4. 使用订阅配置,过滤查询出来的Notify
    5. 使用过滤好的Notify作为关联新建UserNotify

    subscribe(user, target, targetType, reason)

    1. 通过reason,查询NotifyConfig,获取对应的动作组:actions
    2. 遍历动作组,每一个动作新建一则Subscription记录

    cancelSubscription(user, target ,targetType)

    1. 删除usertargettargetType对应的一则或多则记录

    getSubscriptionConfig(userID)

    1. 查询SubscriptionConfig表,获取用户的订阅配置

    updateSubscriptionConfig(userID)

    1. 更新用户的SubscriptionConfig记录

    getUserNotify(userID)

    1. 获取用户的消息列表

    read(user, notifyIDs)

    1. 更新指定的notify,把isRead属性设置为true

    时序图

    提醒的订阅、创建、拉取

    消息系统设计与实现

    提醒的订阅、创建、拉取


    我们可以在产品创建之后,调用NotifyService.subscribe方法,
    然后在产品被评论之后调用NotifyService.createRemind方法,
    再就是用户登录系统或者其他的某一个时刻调用NotifyService.pullRemind方法,
    最后在用户查询消息队列的时候调用NotifyService.getUserNotify方法。

    公告的创建、拉取

    消息系统设计与实现

    公告的创建、拉取


    在管理员发送了一则公告的时候,调用NotifyService.createAnnounce方法,
    然后在用户登录系统或者其他的某一个时刻调用NotifyService.pullAnnounce方法,
    最后在用户查询消息队列的时候调用NotifyService.getUserNotify方法。

    信息的创建

    消息系统设计与实现

    信息的创建


    信息的创建,只需要直接调用NotifyService.createMessage方法就可以了,
    在下一次用户查询消息队列的时候,就会查询这条信息。



    > 本站内容系网友提交或本网编辑转载,其目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及作品内容、版权和其它问题,请及时与本网联系,我们将在第一时间删除内容!

    相关文章

    •  一个通用的C++消息总线框架

      应用开发过程中经常会处理对象间通信的问题,一般都是对象或接口的依赖和引用去实现对象间的通信,这在一般情况下是没问题的,但是如果相互通信的对象很多,可能会造成对象间的引用关系像蜘蛛网一样,这样会导致对象关系很复杂,难以维护的问题,解决这个问题的一个好方法是通过消息总线去解耦对象间大量相互引用的紧耦合的关系. 设计思路:被通信对象向消息总线发布一个主题,这个主题 ...

    •  关于消息队列

      消息队列就是一个消息的链表. 可以把消息看作一个记录,具有特定的格式以及特定的优先级.对消息队列有写权限的进程可以向消息队列中按照一定的规则添加新消息:对消息队列有读权限的进程则可以从消息队列中读走消息.消息队列是随内核持续的. 消息队列的类型: POSIX消息队列以及系统V消息队列,系统V消息队列目前被大量使用.考虑到程序的可移植性,新开发的应用程序应尽量 ...

    •  高吞吐量的分布式发布订阅消息系统Kafka--安装及测试

      一.Kafka概述      Kafka是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者规模的网站中的所有动作流数据. 这种动作(网页浏览,搜索和其他用户的行动)是在现代网络上的许多社会功能的一个关键因素. 这些数据通常是由于吞吐量的要求而通过处理日志和日志聚合来解决. 对于像Hadoop的一样的日志数据和离线分析系统,但又要求实时处理的限制,这是一 ...

    •  我心中的核心组件可插拔的AOP~第五回消息组件

      回到目录 之所以把发消息拿出来,完全是因为微软的orchard项目,在这个项目里,将公用的与领域无关的功能模块进行抽象,形成了一个个的组件,这些组件通过引用和注入的方式进行工作,感觉对于应用程序的扩展性上有很大的提高,消息组件的提出是因为它的不固定性,从小方面说,项目模块的发消息的方式可能是不同的,有过模块是email,有的是数据库,有的是短信:而从大的方面 ...

    •  我心中的核心组件可插拔的AOP~第六回消息组件~续

      回到目录 上一回写消息组件已经是很久之前的事了,这一次准备把消息组件后续的东西说一下,事实上,第一篇文章主要讲的是发消息,而这一讲最要讲的是收消息,简单的说,就是消息到了服务器之后,如何从服务器实时的发到指定客户端,当然,你可以使用JS的轮询,但由于种种原因,它并不被我推荐,呵呵. 准备知识: SignalR实现服务器与客户端的实时通信 WebSocket的 ...

     

    展开全文
  • 基于java springboot的图书管理系统设计实现

    万次阅读 多人点赞 2021-08-13 13:47:50
    前言 背景意义 数据库设计 功能截图 ...系统介绍了图书系统的开发过程,设计中遇到的问题及解决方法以及提高当前应用程序或系统开发进度和改善工作性能。利用其提供的各种面向对象的开发工具...

     🍅 作者主页:Java李杨勇 

    🍅 简介:Java领域优质创作者🏆、Java李杨勇公号作者✌  简历模板、学习资料、面试题库、技术互助【关注我,都给你】

    🍅 欢迎点赞 👍 收藏 ⭐留言 📝   

    🍅  文末获取源码联系方式 📝   

    前言

             随着网络技术的发展、计算机应用水平广泛提高,原来系统的时效性、数据的正确性、操作的方便性上都存在不足,已影响到系统的正常使用。经过考察比较,决定自己对图书管理系统重新设计,使系统能利用软件开发技术的成果,方便图书的管理。图书管理系统是典型的信息管理系统。系统介绍了图书系统的开发过程,设计中遇到的问题及解决方法以及提高当前应用程序或系统开发进度和改善工作性能。利用其提供的各种面向对象的开发工具首先在短时间内建立系统应用原型然后对初始原型系统进行需求迭代,不断修正和改进,直到形成用户满意的可行系统。
          本次课程设计利用JAVA开发工具和Mysql数据库来开发这个图书管理系统。该系统要解决图书管理所要解决的问题,可以满足图书管理基本要求,包括添加、管理等功能。该系统能根据用户的需求,快捷方便的为读者提供借阅服务。

    背景意义


            随着计算机的广泛应用,其逐步成为现代化的标志。图书馆或者一些企业内部,甚至是书店,在正常运行过程中总是面对大量的读者信息,书籍信息以及两者相互作用产生的借书信息、还书信息。因此需要对读者资源、书籍资源、借书信息、还书信息进行管理,及时了解各个环节中信息的变更,要对因此而产生的单据进行及时的处理,为了提高图书馆或者企业内部对图书存销的自动化的管理,能够更快速的满足读者的要求,提高各种工作的效率,现对其设计相应的系统。图书管理系统的主要功能是实现图书馆图书借阅和归还的管理的自动化。围绕这一主要功能,本系统涉及到以下核心功能:借阅管理,归还管理。除了这些核心功能外,还包括一些基本和辅助功能,它们是:用户管理、图书管理、图书查询。

     

     数据库设计

    用户表

    CREATE TABLE `NewTable` (
    `admin_id`  int(11) NOT NULL AUTO_INCREMENT ,
    `admin_name`  varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL ,
    `admin_pwd`  varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL ,
    `admin_email`  varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL ,
    PRIMARY KEY (`admin_id`)
    )
    ENGINE=InnoDB
    DEFAULT CHARACTER SET=utf8 COLLATE=utf8_general_ci
    AUTO_INCREMENT=2
    ROW_FORMAT=DYNAMIC
    ;
    

    图书表

    CREATE TABLE `NewTable` (
    `book_id`  int(11) NOT NULL AUTO_INCREMENT ,
    `book_name`  varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL ,
    `book_author`  varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL ,
    `book_publish`  varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL ,
    `book_category`  int(11) NULL DEFAULT NULL ,
    `book_price`  double NULL DEFAULT NULL ,
    `book_introduction`  varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL ,
    PRIMARY KEY (`book_id`),
    FOREIGN KEY (`book_category`) REFERENCES `book_category` (`category_id`) ON DELETE RESTRICT ON UPDATE RESTRICT,
    INDEX `book_category` (`book_category`) USING BTREE 
    )
    ENGINE=InnoDB
    DEFAULT CHARACTER SET=utf8 COLLATE=utf8_general_ci
    AUTO_INCREMENT=72
    ROW_FORMAT=DYNAMIC
    ;
    
    

    图书类型

    CREATE TABLE `NewTable` (
    `category_id`  int(11) NOT NULL AUTO_INCREMENT ,
    `category_name`  varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL ,
    PRIMARY KEY (`category_id`)
    )
    ENGINE=InnoDB
    DEFAULT CHARACTER SET=utf8 COLLATE=utf8_general_ci
    AUTO_INCREMENT=51
    ROW_FORMAT=DYNAMIC
    ;
    
    

    图书借阅

    CREATE TABLE `NewTable` (
    `id`  int(11) NOT NULL AUTO_INCREMENT ,
    `user_id`  int(11) NULL DEFAULT NULL ,
    `book_id`  int(11) NULL DEFAULT NULL ,
    `date`  date NULL DEFAULT NULL ,
    PRIMARY KEY (`id`),
    FOREIGN KEY (`book_id`) REFERENCES `book` (`book_id`) ON DELETE RESTRICT ON UPDATE RESTRICT,
    FOREIGN KEY (`user_id`) REFERENCES `user` (`user_id`) ON DELETE RESTRICT ON UPDATE RESTRICT,
    INDEX `user_id` (`user_id`) USING BTREE ,
    INDEX `book_id` (`book_id`) USING BTREE 
    )
    ENGINE=InnoDB
    DEFAULT CHARACTER SET=utf8 COLLATE=utf8_general_ci
    AUTO_INCREMENT=67
    ROW_FORMAT=DYNAMIC
    ;
    
    

    功能截图

    登录:

    用户选择角色输入账号密码进行登录 

    首页:

    登录后的主要模块有

    书籍管理《录入新书、类型管理、查询数据 》

    用户管理《添加用户、查询用户》

    借阅管理《借阅记录》

    个人信息查看以及修改退出等

    书籍管理:

     

    用户管理:


    借阅管理:

    个人信息:

    用户端

     用户登录后可以查看自己的借阅记录、以及去借书和归还书籍等操

    代码实现

           这个项目功能比较简单、用的技术也是大家非常熟悉的技术、主要是springboot、springmvc、mybatis以前端的jquery、layui、html和css等基本样式。就拿登录来举一个完整例子吧、首先是前端静态页面的编写以及发送登录请求

    <!DOCTYPE html>
    <html lang="zh-CN" xmlns:th="http://www.thymeleaf.org">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    
    
        <link rel="stylesheet" th:href="@{/layui/css/layui.css}">
        <style>
    
            body {
                /*width: 100%;*/
                /*height: 100%;*/
                background: url("/images/background.png") no-repeat;
                /*background: url("static/images/a.png") no-repeat;*/
                background-size: cover;
            }
    
            #login_form {
                width: 400px;
                height: 300px;
                margin: 80px auto;
                padding: 30px;
                background-color: #f2f2f2;
                opacity: 0.9;
            }
    
        </style>
    </head>
    <body>
    
    <div id="wrapper" style="margin-top: 260px">
        <div class="layui-container" id="login_form">
    
            <div>
                <h1 style="color: red;text-align: center">图书管理系统</h1>
                <br>
            </div>
    
            <form class="layui-form" id="my_form" method="post" action="/userLogin">
    
                <div class="layui-form-item">
                    <label class="layui-form-label">用户名:</label>
                    <div class="layui-input-block">
                        <input type="text" name="userName" id="username" autofocus
                               placeholder="请输入用户名" autocomplete="off" class="layui-input">
                    </div>
                </div>
    
                <div class="layui-form-item">
                    <label class="layui-form-label">密 码:</label>
                    <div class="layui-input-block">
                        <input type="password" name="password" id="password"
                               placeholder="请输入密码" autocomplete="off" class="layui-input">
                    </div>
                </div>
    
    
                <div class="layui-form-item">
                    <label class="layui-form-label">用户身份</label>
                    <div class="layui-input-block">
                        <input class="form-check-input" type="radio" name="role" value="1" title="学生" checked>
                        <input class="form-check-input" type="radio" name="role" value="0" title="管理员">
                    </div>
                </div>
    
                <div class="layui-form-item layui-col-md4 layui-col-md-offset4">
                    <button id="sub_btn" class="layui-btn layui-btn-normal">登录</button>
                </div>
    
            </form>
    
        </div>
    </div>
    
    
    <script th:src="@{/scripts/jquery.min.js}"></script>
    <script th:src="@{/layui/layui.js}"></script>
    
    
    <script th:inline="javascript">
        layui.use(['layer', 'form'], function () {
            let layer = layui.layer;
            let form = layui.form;
            form.render();
    
            $(function () {
                let flag = [[${session.flag}]];
                if (flag) {
                    layer.msg("用户名或密码错误", {
                        icon: 2,
                        time: 2000 //2秒关闭(如果不配置,默认是3秒)
                    });
                }
            });
        });
    
    
        $("#sub_btn").click(function () {
            let username = $("#username").val();
            let user_judge = check(username);
    
            // 首先判断用户名是否为空
            if (user_judge) {
                let password = $("#password").val();
                let pwd_judge = check(password);
    
                // 用户名不为空  , 判断密码是否为空
                if (pwd_judge) {
                    let role_id = $('input[name="role"]:checked').val();
    
                    // 如果role_id ==1 ,则是普通用户 , 直接提交表单
                    if (role_id == 1) {
                        $("#my_form").submit();
                    } else {
    
                        //如果是管理员 , 则将action 进行更改
                        $("#my_form").attr("action", "/adminLogin")
                        $("#my_form").submit();
                    }
    
                } else {
                    layer.alert("密码不能为空", {icon: 5});
                    return false;
                }
            } else {
    
                layer.alert("用户名不能为空", {icon: 5});
                return false;
            }
        });
    
        // 校验表单中用户名 与 密码是否输入,  如果有值 -> 返回 true , 如果未输入 返回 false;
        function check(val) {
            val = val.toString().trim();
            return !(val == '');
        }
    
    </script>
    </body>
    </html>

        后台Controller接收到前端的登录请求之后执行参数校验、将前端传递过来的用户名密码以及用户角色进行判断验证、调用userService.userLogin方法执行用户登录验证、查询数据库当前账号密码是否正确、返回状态码给前端、前端根据状态码进行相对的页面跳转以及数据效应。

    /**
         * 用户登录
         *
         * @param userName
         * @return
         */
        @PostMapping("/userLogin")
        public String userLogin(@Param("userName") String userName,
                                @Param("password") String password, HttpServletRequest request) {
            User user = userService.userLogin(userName, password);
            if (null != user) {
                // flag = 0 表示用户名密码校验成功  【用于前端校验】
                request.getSession().setAttribute("flag", 0);
    
                request.getSession().setAttribute("user", user);
                return "user/index";
            }
    
            // flag 为 1 表示 登录失败 【用于前端校验】
            request.getSession().setAttribute("flag", 1);
            return "index";
        }

    获取源码:

    总体来说这个项目功能相对还是比较简单优秀的、适合初学者作为课程设计和毕业设计参考 

    查看下方微信公众号获取联系方式~

    精彩系列推荐

    Java毕设项目精品实战案例《100套》

    HTML5大作业实战案例《100套》

    展开全文
  • 系统通过微信开发者工具开发,主要基于vue语法及ES6实现,使用的技术有MySQL数据库、mybatis驱动框架以及tomcat服务端部署,用到的集成开发工具主要是IDEA和jdk1.8。 该微信小程序公交查询系统分为前台和后
  • 基于Java在线学习系统设计与实现

    万次阅读 多人点赞 2018-04-21 17:10:35
    基于Java在线学习系统设计与实现emmmm本系统带程序说明书 有需要的可以去我上传的资源里面找,找不到的话,评论我,或者站内私信留下邮箱,我看到机会给你发,也可以主动联系我博客名。因为最近太忙一直没有上传完。...
  • 图书管理系统设计与实现—看这篇就够了

    万次阅读 多人点赞 2020-06-15 13:32:44
    图书管理系统设计与实现 图书馆人员结构复杂,人员数量有限,涉及方面很广,如果还使用手工操作处理图书借阅问题,工作将非常繁琐,需要大量的人力、物理、财力,极大的浪费了资源,对于图书管理人员来说,图书馆...
  • 正好最近正在做技术规划, 于是写偏文章说下工业界完整推荐系统设计。结论是: 没有某种算法能够完全解决问题, 多重算法+交互设计, 才能解决特定场景的需求。下文也对之前的一些博文进行梳理,构成一个完整工业...
  • 抽奖系统设计与实现

    千次阅读 2019-08-26 16:54:32
    抽奖系统的设计与实现 数据结构设计: 1.奖品表(涉及到的奖品配置) 2.抽奖配置表(涉及到的...在开发的过程中抽奖系统设计了期整个概念,即抽奖按照期来进行,支持同时进行多期的抽奖活动。 在奖品表中设计字...
  • 留言管理系统设计与实现

    万次阅读 热门讨论 2018-03-24 13:55:58
    通过综合运用JSP、Servlet、JavaBean、JDBC、MySQL和MVC + DAO等技术方法,设计与实现一个留言管理系统,进一步理解和掌握Java Web编程开发的基本技术和方法,熟练使用开发工具。二、课程设计内容设计留言管理...
  • 网上教学管理系统设计与实现

    万次阅读 多人点赞 2019-04-14 18:54:54
    网上教学管理系统设计与实现 第1章 绪 论 1.1 背景 为了促进计算机专业学生工程实践能力的提升,使老师能够更好的管理学生,帮助学生提高学习成绩掌握更多的专业知识,增强师生之间的交流;解决老师...
  • 日志监控告警系统设计与实现

    万次阅读 多人点赞 2017-06-13 17:02:23
    日志监控告警系统 基于的日志进行监控,监控需要一定规则,对触发监控规则的日志信息进行告警,告警的方式,是短信和邮件。 log4j---->error,info,debug 应用程序程序的日志 error级别 TimeOutException 角标...
  • ARM Cortex-M3系统设计与实现

    千次阅读 2019-03-01 14:11:53
    ARM Cortex-M3系统设计与实现——STM32基础篇 目录 0. 嵌入式入门学习路线 1. STM32 MCU简介 1.1 stm32 mcu结构 1.2 STM32 MCU存储器映像 1.3 STM32 MCU系统时钟树 1.4 Cortex-M3简介 2. 通用并行GPIO...
  • 高校选课系统设计与实现

    千次阅读 2019-03-30 19:53:13
    高校选课系统设计与实现 本科毕业设计(论文) 题    目:      高校选课系统设计与实现 英文题目:The Design and Implementation of The Elective Course System...
  • 秒杀系统设计架构与实现

    万次阅读 多人点赞 2018-06-11 21:55:28
    最近做了一个点餐的平台,其中涉及到一个很重要的问题,活动期间的秒杀系统实现。抢购/秒杀是如今很常见的一个应用场景,是高并发编程的一个挑战,在网上也找了一些资料,大部分都是理论,关于java的实现也是很少...
  • 基于java Springboot实现课程评分系统设计实现

    千次阅读 多人点赞 2021-08-27 15:30:43
    目录 前言: 功能设计: 功能截图: 关键代码: 订阅专栏下载源码 ...Java项目实战推荐: ...借助于教师教学评价系统,可以实现评价的网络化管理和实施。通过使用该系统获得大量的统计数据,将为深...
  • 本文主要讲述图书管理系统设计,附带完成源码,可以作为毕业设计,课程设计,使用:Java+Jsp+Servlet+mysql等技术 图书管理:根据图书编号、图书名称查询图书基本信息,添加、修改、删除图书。 图书分类管理:根据...
  • 智能家居系统设计与实现

    万次阅读 2018-07-15 23:17:20
    一、设计目的1、根据酷痞Coolpy数据库,相当于一个云平台和Web服务,理解网页控制电源开关的方法和过程,掌握HTML5页面访问控制的具体协议和通信命令。学会在Coolpy中建立数值型传感器和开关型传感器,并熟悉使用...
  • 系统使用Eclipse开发工具,使用Redis、MySQL数据库,采用MVC三层架构的方式,结合当前最流行的SSM框架以及支付宝沙箱支付环境来实现各个功能。系统分为用户端和管理员端。用户端实现了用户注册登录、用户评论、...
  • 问卷调查系统设计与实现【源码:文档:教程】

    万次阅读 多人点赞 2019-06-03 12:00:25
    程序下载链接: https://download.csdn.net/download/qq_30615201/11223278 河北农业大学 本科毕业设计说明书 题 目: 问卷调查系统设计与实现 学 院: ...
  • 基于Web在线考试系统设计与实现

    万次阅读 多人点赞 2015-12-16 17:39:29
    这是一个课程设计的文档,源码及文档数据库我都修改过了,貌似这里复制过来的时候图片不能贴出 ...提取码:erzt 数据库原理课程设计说明书 ...1课题背景意义.3 1.1课题开发背景.3 1.2课题开发意义.3 2系...
  • 你好我是辰兮,很高兴你能来阅读,本篇文章来和你谈谈家庭财务管理系统设计与实现。项目基于Springboot开发,利用了Layui的前端框架和Echarts图表。很好的实现了家庭收入和开支的记录,及家庭一段时间内财务的展示...
  • Java+MySQL版本的站内通知系统设计与实现 一、概述: 在B/S系统的设计与实现中,通知系统的开发是必不可少的一部分。在很多情况下,我们都需要使用通知这个提醒功能,比如,我们写了一篇文章,发了一个动态,这...
  • 这是一套完整的计算机毕设,包含有教程、文档、系统,探讨超市管理信息系统设计与实现,做毕业设计的朋友可以下载参考。
  • 旅游信息管理系统设计与实现

    万次阅读 多人点赞 2020-01-21 11:14:06
    开发环境: Eclipse/MyEclipse、Tomcat8、Jdk1.8 数据库: MySQL 适用于: 课程设计,毕业设计,学习等等 系统介绍
  • 总体任务是实现学生信息关系的系统化、科学化、规范化和自动化,其主要任务是用计算机对学生各种信息进行日常管理,如查询、修改、增加、删除,另外还考虑到学生选课,针对这些要求设计了学生信息管理系统。...
  • 火车售票系统设计与实现

    千次阅读 热门讨论 2018-01-22 10:02:24
    题目:火车售票系统设计与实现 任务:通过此系统可以实现售票、退票、车票剩余情况查询等功能。每张车票包含 车次、座位信息。 要求:在售票、退票、查询剩余票等环节中,都必须显示出车票的信息,即车次、座位...
  • 图书管理系统设计与实现

    千次阅读 2019-11-18 23:00:38
    那么如果有一套具体的完善的图书管理系统就显得尤为重要,图书馆如果采用人工来管理书籍和借阅管理,由于资料繁多,手工处理的方式不仅工作量大,管理效率低下,也很容易因为疲劳而产生出错,更不方便读者对图书资料...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,185,621
精华内容 874,248
关键字:

推荐系统的设计与实现