题外话:程序的架构依赖于系统的架构,系统运行的环境决定了程序设计的方式,单单以集群为例,在程序的开发上与集中化部署就有很大的不同,架构的意义就在
于发现这些不同,设计合理和容易扩展的结构以更小代价的适应未来的这种变化,分层的设计其实也是规避环境变化而造成系统整体的变动的一种方法。
Session应该是web开发独有的,必须要面对的。Session让web程序的会话保持变得如此的简单,但是也带来了很多问题,比如:有很多开发人
员享受了session的便利,把大部分东西往session中放,滥用session,造成服务器资源的浪费;跨域session丢失的问题等等。
今天就谈一下session在集群环境下的问题。
-
集群的各个节点无法共享同一个session。虽然现在可以通过Ngnix和apache将会话都路由到同一个应用服务器,但是随之而来带来下面一个问题。
-
在一个节点出现故障时,无法平滑的转移到另外一台应用服务器。虽然现在很多应用服务器都可以实现session复制,但是在集群节点非常多的时候,无疑对服务器的资源和效能都是一个极大的浪费。
为了解决这些问题,一些大型的互联网站点和应用系统,纷纷抛弃session机制,而采用cookie,cache,db等各种手段来替代
session,但是从复杂性和成本上来看,各种手段都需要重新考量。如果您的系统未来有可能成长为很庞大的规模,您不得不考虑这些问题。
OECP平台作为企业应用的业务平台,它是企业应用的核心,关联着组件和平台之间,组件和组件之间,用户和平台之间的交互,在具有一定规模的企业中,它将
承载着巨大的系统负荷,所以平台的开发之初就要设计相关的集群特征。HttpSession则是首要要考虑的。在设计的时候考虑了几种方案:
1、自己实现HttpSession以替换HttpServletRequest下的实现。这是一个比较好的方法,对调用者来说是隐藏的,但是难度比较大,同时requeset下的session依然可用,也不是很好的统一。
2、自己利用session和cache构建一个自己的session map,所有的开发者都需要调用这个session
map,session和cache同步是需要必须做到的,否则session存在,cache中却失效了。而且多加了一个东西,依然不能完全替代
session,开发人员需要按照规定的套路走,不是很灵活。
3、依然采用HttpServletRequest的httpsession,但是利用cache做同步,将session同步到分布式cache中。当
一个节点故障需要转移到另外一个节点时,利用全局的cache,依然保证session不会丢失。而且同步cache的操作应该是可插拔的,以适应集中式
部署和分布式部署的环境。
我们采用了第3个方案,利用cache同步缓存,已达到session复制的目的。选用什么作为cache的载体呢?其实方案还是挺多的,可以采用
EHCache/JbossCache等java系的Cache组件,也可以采用流行的memdcache,当然也可以适用类似于MongoDB这样的
NoSQL存储系统。我们暂且采用EHCache来实现,未来不排除增加基于MongoDB的实现。下面就直接上代码了:
1、首先要实现HttpSessionListener,在session创建的时候,创建cache;在session销毁的时候,销毁cache。
java 代码
-
@Override
-
public void sessionCreated(HttpSessionEvent event) {
-
HttpSession httpSession = event.getSession();
-
String sessionId = httpSession.getId();
-
SessionMap sessionMap = new SessionMap();
-
sessionMap.put("creationTime", httpSession.getCreationTime());
-
CacheManager.set(WebConstant.OECP_CACHE_SESSION, sessionId, sessionMap);
-
}
-
-
@Override
-
public void sessionDestroyed(HttpSessionEvent event) {
-
HttpSession httpSession = event.getSession();
-
String sessionId = httpSession.getId();
-
CacheManager.evict(WebConstant.OECP_CACHE_SESSION, sessionId);
-
httpSession = null;
-
}
-
2、其次要实现HttpSessionAttributeListener,用来监听session的变化,以保证将最新的session同步到cache中。
java 代码
-
@Override
-
public void attributeAdded(HttpSessionBindingEvent event) {
-
HttpSession httpSession = event.getSession();
-
String attrName = event.getName();
-
Object attrValue = event.getValue();
-
String sessionId = httpSession.getId();
-
SessionMap sessionMap = (SessionMap) CacheManager.get(
-
WebConstant.OECP_CACHE_SESSION, sessionId);
-
if (sessionMap == null) {
-
sessionMap = new SessionMap();
-
}
-
if (attrValue instanceof Serializable) {
-
sessionMap.put(attrName, (Serializable) attrValue);
-
}
-
CacheManager.set(WebConstant.OECP_CACHE_SESSION, sessionId, sessionMap);
-
-
}
-
-
@Override
-
public void attributeRemoved(HttpSessionBindingEvent event) {
-
HttpSession httpSession = event.getSession();
-
-
String attrName = event.getName();
-
String sessionId = httpSession.getId();
-
SessionMap sessionMap = (SessionMap) CacheManager.get(
-
WebConstant.OECP_CACHE_SESSION, sessionId);
-
if (sessionMap != null) {
-
sessionMap.remove(attrName);
-
CacheManager.set(WebConstant.OECP_CACHE_SESSION, sessionId,
-
sessionMap);
-
}
-
-
}
-
-
@Override
-
public void attributeReplaced(HttpSessionBindingEvent event) {
-
attributeAdded(event);
-
-
}
-
3、最后增加一个SnaFilter,用来做故障时,session的转移(即cache到session的转化)。通过session和cache的同步比较,可以保持cache和session的时效一致性。
java 代码
-
public class SnaFilter implements Filter {
-
-
private Log logger = LogFactory.getLog(SnaFilter.class);
-
-
private static boolean cluster = false;
-
-
@Override
-
public void destroy() {
-
-
}
-
-
@Override
-
public void doFilter(ServletRequest req, ServletResponse res,
-
FilterChain chain) throws IOException, ServletException {
-
final HttpServletRequest hrequest = (HttpServletRequest) req;
-
final HttpServletResponse hresponse = (HttpServletResponse) res;
-
String uri = hrequest.getRequestURI();
-
logger.debug("开始SNA拦截-----------------" + uri);
-
HttpSession httpSession = hrequest.getSession();
-
String sessionId = httpSession.getId();
-
long sessionTime = httpSession.getCreationTime();
-
SessionMap sessionMap = (SessionMap) CacheManager.get(
-
WebConstant.OECP_CACHE_SESSION, sessionId);
-
if (sessionMap != null
-
&& (Long.valueOf(sessionMap.get("creationTime").toString())) != sessionTime) {
-
-
initHttpSession(httpSession, sessionMap);
-
}
-
chain.doFilter(hrequest, hresponse);
-
-
}
-
-
private void initHttpSession(HttpSession session,
-
SessionMap sessionMap) {
-
Set<String> keySet = sessionMap.keySet();
-
Iterator<String> it = keySet.iterator();
-
while (it.hasNext()) {
-
String key = it.next();
-
session.setAttribute(key, sessionMap.get(key));
-
}
-
sessionMap.put("creationTime", session.getCreationTime());
-
CacheManager.set(WebConstant.OECP_CACHE_SESSION, session.getId(),
-
sessionMap);
-
}
-
-
@Override
-
public void init(FilterConfig chain) throws ServletException {
-
cluster = true;
-
}
-
-
public static boolean isCluster() {
-
return cluster;
-
}
-
-
}
-
以上三个步骤已经基本实现了集群化的session处理,但是还需要其他配置相配合。第一就是ehcache的集群化配置,这个有两种方式,一个是广播
式,将cache同步到各个节点;一个是分布集中式,将缓存都同步到一个节点上。同时以上实现都是基于插件思想的,在需要集群的时候只要配置到
web.xml中,即可。不用的时候可以卸载,一避免浪费资源。这两部分的配置我就省略了,有兴趣的朋友可以查一下。
关于OECP平台的最新进展请继续关注:http://prj.oecp.cn/projects/oecp-platform
原文:http://www.oecp.cn/hi/yongtree/blog/2461 (含附件)
分享到:
相关推荐
OECP工具聚焦openEuler内核和基础包,保障二次发行版生态核心特性不丢失,关键配置不更改 结合社区选包策略及软件包等级策略,检查L1、L2软件包版本、打包方式、接口一致性,KABI白名单,架构特性(如鲲鹏/X86特性)使...
OECP社区用户积分与动态部分是使用基于观察者模式的思路实现的。观察者模式的介绍网上有好多,在这就只简单提一下,一带而过吧(如果以后有时间和必要再写一篇初级的让初学的朋友们看的)。这里主要介绍一下我们社区中...
介电常数的平均值是使用开放式同轴探针(OECP)(85,070E; Agilent Technologies)在1-4 GHz范围内测量的。 然后,使用有限元方法(FEM)将获得的介电性能结果用作原始数据,用于数值计算和模拟青少年和成人牛脑...
基于SSM+JSP的企业人事管理信息系统毕业设计(源码+录像+说明).rar 【项目技术】 开发语言:Java 框架:ssm+jsp 架构:B/S 数据库:mysql 【演示视频-编号:420】 https://pan.quark.cn/s/b3a97032fae7 【实现功能】 实现了员工基础数据的管理,考勤管理,福利管理,薪资管理,奖惩管理,考核管理,培训管理,招聘管理,公告管理,基础数据管理等功能。
Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。
Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。
基于PaddleFL框架的联邦学习医疗影像识别系统源码+GUI界面+说明.zip该项目是个人毕设项目源码,评审分达到97分,都经过严格调试,确保可以运行!放心下载使用。该项目资源主要针对计算机相关专业的学生或从业者下载使用,也可作为期末课程设计、课程大作业、毕业设计等。 基于PaddleFL框架的联邦学习医疗影像识别系统源码+GUI界面+说明.zip该项目是个人毕设项目源码,评审分达到97分,都经过严格调试,确保可以运行!放心下载使用。该项目资源主要针对计算机相关专业的学生或从业者下载使用,也可作为期末课程设计、课程大作业、毕业设计等。 基于PaddleFL框架的联邦学习医疗影像识别系统源码+GUI界面+说明.zip该项目是个人毕设项目源码,评审分达到97分,都经过严格调试,确保可以运行!放心下载使用。该项目资源主要针对计算机相关专业的学生或从业者下载使用,也可作为期末课程设计、课程大作业、毕业设计等。 基于PaddleFL框架的联邦学习医疗影像识别系统源码+GUI界面+说明.zip该项目是个人毕设项目源码,评审分达到97分,都经过严格调试,确保可以运行!放心下载使用。该项目资源
Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。
Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。
Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。
Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。
Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。
Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。
Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。
.数据内容:全国及各省(不含西藏)不同类型农村劳动力转移数据。包括:根据转移时间长短划分为常年外出务工劳动力和季节性外出务工劳动力;根据转移地点范围划分为乡外县内务工劳动力、县外省内务工劳动力和省外务工劳动力。 指标解释:常年外出务工劳动力数:指在外出劳动力中,全年累计在外劳动时间超过6个月的劳动力数量;季节性外出务工劳动力数:指在外出劳动力中,全年累计在外劳动时间在3个月以上6个月以下的劳动力数量;乡外县内务工劳动力数,指在常年外出劳动力中,在本乡镇外、所属县内从业的劳动力数量;县外省内务工劳动力数,指在常年外出劳动力中,在本县外、所属省内从业的劳动力数量;省外务工劳动力数,指在常年外出劳动力中,在本省外从业的劳动力数量。 指标: 地区 汇总乡镇数 汇总村数 汇总农户数(万人) 汇总人口数(万人) 汇总劳动力数(万人) 从事家庭经营劳动力数(万人) 从事第一产业劳动力数(万人) 外出务工劳动力(万人) 常年外出务工劳动力(万人) 乡外县内(万人
基于MATLAB:simulink汽车整车模型工程源代码合集,6份。 1、CI发动机测功机参考应用.zip 2、Simulink中的混合动力汽车模型.zip 3、SI发动机测功机参考应用.zip 4、常规车辆参考应用.zip 5、电动汽车参考应用.zip 6、混合动力电动汽车参考应用.zip
Java毕业设计-基于SSM框架的农产品质量安全检测网站(源码+演示视频+说明).rar 【项目技术】 开发语言:Java 框架:ssm+vue 架构:B/S 数据库:mysql 【演示视频-编号:469】 https://pan.quark.cn/s/b3a97032fae7
PyTorch深度学习 —— 基于小土堆视频等资料.zip
Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。
基于SSM+Vue的敏捷工贸公司销售管理系统毕业设计(源码+录像+说明).rar 【项目技术】 开发语言:Java 框架:ssm+vue 架构:B/S 数据库:mysql 【演示视频-编号:480】 https://pan.quark.cn/s/b3a97032fae7 【实现功能】 本系统的使用者主要可以被分为管理员角色和用户角色两类。其中,管理员角色主要的功能需求有用户信息管理、物资信息管理、订单信息管理等模块,用户角色主要的功能需求有系统登录、查询物资信息、查询订单信息等模块。