V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
javahih
V2EX  ›  分享发现

Github 开源项目(企业信息化基础平台)

  •  1
     
  •   javahih · 2017-12-25 10:38:29 +08:00 · 5065 次点击
    这是一个创建于 2316 天前的主题,其中的信息可能已经有所发展或是发生改变。

    JEEPlatform

    一款企业信息化开发基础平台,可以用于快速构建企业后台管理系统,集成了 OA(办公自动化)、SCM(供应链系统)、ERP(企业资源管理系统)、CMS(内容管理系统)、CRM(客户关系管理系统)等企业系统的通用业务功能。Github 链接: https://github.com/u014427391/jeeplatform 欢迎下载或者 star(收藏)

    JeePlatform 项目是一款以 Activiti 为工作流引擎,以 Spring Framework 为核心框架,集 ORM 框架 Mybatis,Web 层框架 SpringMVC 和多种开源组件框架而成的一款通用基础平台,基于本平台可以实现快速开发,实现企业信息管理的高效、高性能开发。系统追求安全、性能方面的有效实现。

    系统设计

    系统管理(模块名称 jeeplatform-admin)

    管理系统登录页面,采用 Shiro 登录验证 Image text

    管理系统主页前端,可以适配移动端页面 Image text

    管理系统主页采用开源前端模板,具有换肤功能 Image text

    Image text

    管理系统主页,获取用户具有的权限,显示菜单 Image text

    角色进行授权,只有超级管理员才具有权限 Image text

    角色进行配置,可以学习一下 RBAC(基于角色的权限控制) Image text

    使用 JavaEmail 插件实现邮件发送,记得需要开启 SSl 验证 Image text

    OA 管理系统(待开发)

    CMS 管理系统(待开发)

    系统升级

    单点登录基础(模块名称 jeeplatform-sso)(开发中)

    项目采用 CAS 登录登录实现,单点登录集群搭建可以参考博客: http://blog.csdn.net/u014427391/article/details/78653482 项目单点登录:使用 nginx 作为负载均衡,使用 redis 存储 tomcat session,来实现集群中 tomcat session 的共享,使用 redis 作为 cas ticket 的仓库,来实现集群中 cas ticket 的一致性。

    单点登录集群如图 Image text

    SpringBoot 集成 Redis 缓存处理(Spring AOP 实现)

    先从 Redis 里获取缓存,查询不到,就查询 MySQL 数据库,然后再保存到 Redis 缓存里,下次查询时直接调用 Redis 缓存

    package org.muses.jeeplatform.cache;
    
    import org.aspectj.lang.ProceedingJoinPoint;
    import org.aspectj.lang.annotation.Around;
    import org.aspectj.lang.annotation.Aspect;
    import org.aspectj.lang.annotation.Pointcut;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.beans.factory.annotation.Qualifier;
    import org.springframework.stereotype.Component;
    
    /**
     * AOP 实现 Redis 缓存处理
     */
    @Component
    @Aspect
    public class RedisAspect {
    
    	private static final Logger LOGGER = LoggerFactory.getLogger(RedisAspect.class);
    
    	@Autowired
        @Qualifier("redisCache")
    	private RedisCache redisCache;
    
    	/**
    	 * 拦截所有元注解 RedisCache 注解的方法
    	 */
    	@Pointcut("@annotation(org.muses.jeeplatform.annotation.RedisCache)")
    	public void pointcutMethod(){
    
    	}
    
    	/**
    	 * 环绕处理,先从 Redis 里获取缓存,查询不到,就查询 MySQL 数据库,
    	 * 然后再保存到 Redis 缓存里
    	 * @param joinPoint
    	 * @return
    	 */
    	@Around("pointcutMethod()")
    	public Object around(ProceedingJoinPoint joinPoint){
    		//前置:从 Redis 里获取缓存
    		//先获取目标方法参数
    		long startTime = System.currentTimeMillis();
    		String applId = null;
    		Object[] args = joinPoint.getArgs();
    		if (args != null && args.length > 0) {
    			applId = String.valueOf(args[0]);
    		}
    
    		//获取目标方法所在类
    		String target = joinPoint.getTarget().toString();
    		String className = target.split("@")[0];
    
    		//获取目标方法的方法名称
    		String methodName = joinPoint.getSignature().getName();
    
    		//redis 中 key 格式:    applId:方法名称
    		String redisKey = applId + ":" + className + "." + methodName;
    
    		Object obj = redisCache.getDataFromRedis(redisKey);
    
    		if(obj!=null){
    			LOGGER.info("**********从 Redis 中查到了数据**********");
    			LOGGER.info("Redis 的 KEY 值:"+redisKey);
    			LOGGER.info("REDIS 的 VALUE 值:"+obj.toString());
    			return obj;
    		}
    		long endTime = System.currentTimeMillis();
    		LOGGER.info("Redis 缓存 AOP 处理所用时间:"+(endTime-startTime));
    		LOGGER.info("**********没有从 Redis 查到数据**********");
    		try{
    			obj = joinPoint.proceed();
    		}catch(Throwable e){
    			e.printStackTrace();
    		}
    		LOGGER.info("**********开始从 MySQL 查询数据**********");
    		//后置:将数据库查到的数据保存到 Redis
    		String code = redisCache.saveDataToRedis(redisKey,obj);
    		if(code.equals("OK")){
    			LOGGER.info("**********数据成功保存到 Redis 缓存!!!**********");
    			LOGGER.info("Redis 的 KEY 值:"+redisKey);
    			LOGGER.info("REDIS 的 VALUE 值:"+obj.toString());
    		}
    		return obj;
    	}
    
    
    }
    
    

    这里写图片描述

    可以看到 Redis 里保存到了缓存

    这里写图片描述

    业务方案

    系统管理通用功能

    • 用户管理: 系统用户 OK
    • 角色管理: 按照企业系统职能进行角色分配,每个角色具有不同的系统操作权限 OK
    • 权限管理: 权限管理细分到系统按钮权限,菜单权限,管理员可以对权限进行细分控制
    • 在线管理:管理在线用户,可以强制下线
    • 菜单管理:系统可以配置系统菜单,并分配不同的权限 OK
    • 报表统计:数据报表、用户分析
    • 系统监控:数据监控、系统日志(用户登录记录)
    • 通用接口:SMS(短信)、系统邮件、Excel 表导出导入操作...

    OA 系统通用功能(待开发)

    • 考勤管理:请假流程
    • 人事管理:机构管理、部门管理、员工管理

    CMS 系统通用功能(待开发)

    • 信息管理:文章管理、文章审核 ...

    技术方案

    后台技术

    • 工作流引擎:Activiti5
    • ORM 框架:Mybatis/Hibernate JPA
    • Web 框架:SpringMVC
    • 核心框架:Spring Framework4.0
    • 任务调度:Spring Task
    • 权限安全:Apache Shiro/Spring Security
    • 全文搜索引擎:Lucene/Solr
    • 页面静态化处理:Freemark/Velocity
    • 服务器页面包含技术:SSI
    • 网页即时通讯:long polling/websocket
    • 连接池:Druid (阿里开源)
    • 日志处理:SLF4J
    • 缓存处理:Redis、EhCache
    • Excel 表处理:POI

    前端技术

    • 文件上传:JQuery uploadify
    • 树形结构:EasyUI Tree
    • 日期插件:JQuery Date
    • 弹窗框架:zDialog
    • Cookie 保存:JQuery Cookie
    • 富文本编辑器:Baidu UEDitor
    • 前端框架:Twitter Bootstrap、ExtJS

    服务器

    • 负载均衡:Nginx
    • 分布式:alibaba Dubbo
    • 中间件:RocketMQ

    项目测试

    • DeBug:Junit、FindBugs、EclEmma
    • 程序质量:Jdepend4eclipse
    • 压力测试:JMeter

    工具软件

    • 服务器:SecureCRT
    • Java:IntelliJ IDEA/Eclipse
    • 远程控制:TeamViewer
    • 版本控制:Git
    • Jar 管理:Maven
    • UML 建模:ArgoUML
    • Eclipse 测试插件:EclEmma
    • 程序质量检查插件:Jdepend4eclipse(Eclipse 平台)

    Github 链接: https://github.com/u014427391/jeeplatform 欢迎下载或者 star(收藏)

    5 条回复    2017-12-25 11:27:20 +08:00
    firefox12
        1
    firefox12  
       2017-12-25 11:11:08 +08:00 via iPhone
    说实话 贴代码这种宣传方式真是 low 爆了,最关键的是谁会用,怎么样能用。那些平台可以一键部署 使用,那些平台可以直接使用。现在的人耐心越来越少,只有我还写这些东西,当然我知道你也根本不会看
    sobigfish
        2
    sobigfish  
       2017-12-25 11:14:49 +08:00
    开源就开源 和 GitHub 有一毛钱关系么?拿 GitHub 背书(还以为是 GitHub 官方的项目的)
    而且没有见到开源协议
    Choose a License: Choose an open source license
    https://choosealicense.com/
    mokeyjay
        3
    mokeyjay  
       2017-12-25 11:19:20 +08:00
    @sobigfish #2 LZ 大概只是想说托管在 github 上的意思吧……(善意揣测
    不过确实容易出现歧义

    另外这 UI 真的比较老了
    冲开源的份上点个赞
    sobigfish
        4
    sobigfish  
       2017-12-25 11:22:29 +08:00
    @mokeyjay #3 应该只是标题党而已(没有背书什么的),但没有协议的前提下不叫开源
    mokeyjay
        5
    mokeyjay  
       2017-12-25 11:27:20 +08:00
    @sobigfish #4 我对开源的理解是“开放源码”,在我的理解中 LZ 这叫开源;至于有没有协议只是开源者是否希望约束其他人而已
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3578 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 04:36 · PVG 12:36 · LAX 21:36 · JFK 00:36
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.