Giter VIP home page Giter VIP logo

production_ssm's Introduction

欢迎报bug或pull request ~

若图片不能正常显示,请点击博客地址:制造装备物联及生产管理系统

production_ssm

这是一个生产管理ERP系统。依托科技计划重点项目“制造装备物联及生产管理系统研发”,主要包括:计划进度、设备管理、工艺监控、物料监控、人员监控、质量监控、系统管理7大模块。

项目技术架构(Spring+SpringMVC+Mybatis)

  • Maven
  • Spring(IOC DI AOP 声明式事务处理)
  • SpringMVC(支持Restful风格)
  • Hibernate Validator(参数校验)
  • Mybatis(最少配置方案)
  • shiro权限控制,结合ajax实现了异步认证与异步授权,同时实现了细粒度的权限动态分配(到按钮级别);添加了shiro session过期的登录跳转
  • jQuery EasyUI开发前端页面,利用jQuery文件上传插件实现拖拽上传的效果并对文件类型、大小、数量进行控制;利用search-box实现查找功能
  • Druid(数据源配置 sql防注入 sql性能监控)
  • 统一的异常处理
  • JSP JSTL JavaScript
  • kindeditor富文本编辑器,处理图片上传和富文本编辑

系统架构

系统架构图

数据库设计(详见sql文件)

数据库设计

软件运行截图

  • 登录界面

登录可使用账号:22,密码:22的超级管理员登录,若密码输错,下次登录需输入验证码。

登录界面

  • 运行界面

超级管理员可显示系统管理模块进行系统权限分配与管理,其他角色可查看除系统管理外的剩余模块的信息(包括下载附件、查看图片等),但是只能维护该角色对应权限内的信息。
左边功能搜索栏可进行功能模糊查找。

运行界面

  • 图片上传

图片上传的配置请查看文档尾部的注释,图片大小要求不能超过1M,支持jpg、png等多种格式的图片,上传成功后可在相应的展示栏进行回显。

图片上传

  • 文件上传

文件上传使用了一个开源的jQuery文件上传插件,可以在common.js里面修改上传文件的参数,包括上传个数,支持的文件类型等,配置信息如下:

url:"file/upload",
maxFileCount: 5,                //上传文件个数(多个时修改此处
returnType: 'json',              //服务返回数据
allowedTypes: 'doc,docx,excel,sql,txt,ppt,pdf',  //允许上传的文件式
showDone: false,                     //是否显示"Done"(完成)按钮
showDelete: true,                  //是否显示"Delete"(删除)按钮

文件上传

  • 富文本编辑

本系统采用了开源的KindEditor富文本编辑器,它是一套在线HTML编辑器,主要用于让用户在网站上获得所见即所得编辑效果。KindEditor把传统的多行文本输入框(textarea)替换为可视化的富文本输入框。

KindEditor主要特点

  • 快速:体积小,加载速度快

  • 开源:开放源代码,高水平,高品质

  • 底层:内置自定义 DOM 类库,精确操作 DOM

  • 扩展:基于插件的设计,所有功能都是插件,可根据需求增减功能

  • 风格:修改编辑器风格非常容易,只需修改一个 CSS 文件

  • 兼容:支持大部分主流浏览器,比如 IE、Firefox、Safari、Chrome、Opera

富文本编辑

  • 关联信息

关联对象的信息,点击以弹窗的形式显示,若具有该模块对应的修改权限,则也可在此进行信息维护。

关联信息

  • search-box查找

可以在右上角的search-box选择查询条件,输入关键字进行对应信息的模糊查找。

search-box查找

  • session过期跳转登录

用户登录后,会建立相应的session,系统默认过期时间为10分钟,若需更改,可在applicationContext-shiro.xml配置文件中,更改如下配置。

<!-- 会话管理器 -->
<bean id="sessionManager" class="org.apache.shiro.web.session.mgt.DefaultWebSessionManager">
    <!-- session的失效时长,单位毫秒 ,这里设置为10分钟-->
    <property name="globalSessionTimeout" value="600000"/>
    <!-- 删除失效的session -->
    <property name="deleteInvalidSessions" value="true"/>
    <!-- 指定本系统sessionId, 默认为: JSESSIONID 问题: 与Servlet容器名冲突, 如Jetty, Tomcat等默认JSESSIONID,
    	当跳出shiro Servlet时如Error-page容器会为JSESSIONID重新分配值导致登录会话丢失! -->
    <property name="sessionIdCookie" ref="sessionIdCookie"/>
</bean>

若session过期,则应跳转登录界面重新登录。系统采用的方式是设置一个sessionfilter,如下:

public class SessionFilter implements Filter {

    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException,
            ServletException {

        HttpServletRequest request = (HttpServletRequest) servletRequest;
        HttpServletResponse response = (HttpServletResponse) servletResponse;
        if (!SecurityUtils.getSubject().isAuthenticated()) {
            //判断session里是否有用户信息,且是否为ajax请求,如果是ajax请求响应头会有,x-requested-with
            if (request.getHeader("x-requested-with") != null
                    && request.getHeader("x-requested-with").equalsIgnoreCase("XMLHttpRequest")) {
                response.setHeader("session-status", "timeout");//在响应头设置session状态
            }
        }
        filterChain.doFilter(request, servletResponse);
    }

    @Override
    public void destroy() {
        // TODO Auto-generated method stub
    }

    @Override
    public void init(FilterConfig arg0) throws ServletException {
        // TODO Auto-generated method stub
    }
}

并在web.xml中配置该filter。当session过期时, 在响应头设置session状态为timeout,然后采用全局的ajax事件对session状态进行判断,跳转到登录页面。该事件定义在common.js中,如下:

//全局ajax事件,处理session过期跳转登录
$.ajaxSetup({
	complete:function(XMLHttpRequest,sessionStatus){
		var sessionstatus = XMLHttpRequest.getResponseHeader("session-status");
		if(sessionstatus=="timeout"){
		     $.messager.alert('提示信息', "登录超时!请重新登录!", 'info',function(){
		         window.location.href = 'login';
		     });
		} 
    }
});

关于这部分的详细内容请参考我的一篇博客:利用filter和全局ajax事件实现shiro session过期登录跳转

https://coding.net/u/megagao/p/ziyuan/git/raw/master/pm_image/session%25E8%25BF%2587%25E6%259C%259F%25E8%25B7%25B3%25E8%25BD%25AC%25E7%2599%25BB%25E5%25BD%2595.png

  • 动态权限控制

本系统采用经典的权限模型,即RBAC(Role-Based Access Control )基于角色的访问控制,即用户通过角色与权限进行关联。模型用到5张表:用户表、角色表、权限表、用户角色表、角色权限表。简单地说,一个用户拥有若干角色,每一个角色拥有若干权限。这样,就构造成“用户-角色-权限”的授权模型。在这种模型中,用户与角色之间,角色与权限之间,一般者是多对多的关系。

该模型可简化表示为下图:

https://coding.net/u/megagao/p/ziyuan/git/raw/master/pm_image/RBAC%25E6%259D%2583%25E9%2599%2590%25E6%25A8%25A1%25E5%259E%258B.png

本系统基于RBAC权限模型,采用shiro框架进行权限控制。只有角色为超级管理员的用户才能进行系统的权限管理,权限级别细化到菜单选项。

动态权限控制

注:

导入项目到STS

感谢一位韩国道友给我发的邮件,介绍了将production_ssm导入到STS中,并将详细过程与注意事项完整记录了下来。非常感谢他的文档,也为STS的使用提供了参考。 参见:导入production_ssm到STS

文件上传配置

在本地建立上传图片和文件的文件夹,如我的存放路径是在D:\upload\temp\img,D:\upload\temp\file文件夹下,然后修改tomcat的配置文件server.xml,添加虚拟路径,将对图片和文件的请求url映射到本机硬盘的相应路径,如下:

<Host name="localhost"  appBase="webapps"
        unpackWARs="true" autoDeploy="true">
    <!-- SingleSignOn valve, share authentication between web applications
         Documentation at: /docs/config/valve.html -->
    <!--
    <Valve className="org.apache.catalina.authenticator.SingleSignOn" />
    -->

    <!-- Access log processes all example.
         Documentation at: /docs/config/valve.html
         Note: The pattern used is equivalent to using pattern="common" -->
    <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
           prefix="localhost_access_log" suffix=".txt"
           pattern="%h %l %u %t &quot;%r&quot; %s %b" />

    <!-- 在Host标签下添加下面两行,配置虚拟路径到你本机的文件夹 -->
    <Context path="/pic" docBase="D:\upload\temp\img" crossContext="true" trusted="true" reloadable="true"/>
    <Context path="/file" docBase="D:\upload\temp\file" crossContext="true" trusted="true" reloadable="true"/>
</Host>

idea classpath配置

idea引入项目后,resources目录在eclipse中是在classpath下的,而在idea中变成在classpath外,导致项目无法识别配置文件。解决办法是把resources文件夹加入到classpath中,请参照此博文操作:eclipse与idea中classpath配置路径不同导致迁移项目时的FileNotFoundException问题

Mybatis逆向工程

系统使用了Mybatis的逆向工程,依据数据库表自动生成domain和mapper(注:自动生成的代码都是针对单表,若需多表整合,则要手动修改实现),其中,针对每个数据库表,都会生成两个封装对象,可以认为example对象是对其相应的ORM映射对象查询条件的封装。逆向工程的实现--Mybatis Generator的代码托管在https://github.com/mybatis/generator,代码down下来后,配置generatorConfig.xml文件,如下:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration
  PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
  "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">

<generatorConfiguration>
	<context id="testTables" targetRuntime="MyBatis3">

		<commentGenerator>
			<!-- 是否去除自动生成的注释 true:是 : false:否 -->
			<property name="suppressAllComments" value="true" />
		</commentGenerator>

		<!--数据库连接的信息:驱动类、连接地址、用户名、密码 -->
		<jdbcConnection driverClass="com.mysql.jdbc.Driver"
			connectionURL="jdbc:mysql://localhost:3306/production_ms" userId="root"
			password="root">
		</jdbcConnection>

		<!-- 默认false,把JDBC DECIMAL 和 NUMERIC 类型解析为 Integer,为 true时把JDBC DECIMAL 和 
			NUMERIC 类型解析为java.math.BigDecimal -->
		<javaTypeResolver>
			<property name="forceBigDecimals" value="false" />
		</javaTypeResolver>

		<!-- targetProject:生成PO类的位置 -->
		<javaModelGenerator targetPackage="org.hqu.production_ms.domain"
			targetProject=".\src">
			<!-- enableSubPackages:是否让schema作为包的后缀 -->
			<property name="enableSubPackages" value="false" />
			<!-- 从数据库返回的值被清理前后的空格 -->
			<property name="trimStrings" value="true" />
		</javaModelGenerator>

        <!-- targetProject:mapper映射文件生成的位置 -->
		<sqlMapGenerator targetPackage="org.hqu.production_ms.mapper" 
			targetProject=".\src">
			<!-- enableSubPackages:是否让schema作为包的后缀 -->
			<property name="enableSubPackages" value="false" />
		</sqlMapGenerator>

		<!-- targetPackage:mapper接口生成的位置 -->
		<javaClientGenerator type="XMLMAPPER"
			targetPackage="org.hqu.production_ms.mapper" 
			targetProject=".\src">
			<!-- enableSubPackages:是否让schema作为包的后缀 -->
			<property name="enableSubPackages" value="false" />
		</javaClientGenerator>

		<!-- 指定数据库表 -->
		<table schema="" tableName="unqualify_apply"></table>

	</context>
</generatorConfiguration>

修改完成后,执行main方法即可。需要注意的是,若要重新生成,则需把已经生成的文件删除,因为它不会自己覆盖,导致文件混乱。关于Mybatis逆向工程的更多详细信息,读者可以自行上网查阅。

production_ssm's People

Contributors

a550449227 avatar megagao avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

production_ssm's Issues

项目不能运行

你好,我下载了你这个项目代码。但是发现项目不能运行,例如mapper文件和bean对象属性不一致(当然,此时,和数据库表中字段也无法对应)。例如COrderMapper.xml中state、managerTel、drawing部分,就有问题

<association property="custom" javaType="custom">
                         其他内容。。。
    <result column="c_state" property="state" jdbcType="INTEGER" />
 	<result column="manager_tel" property="managerTel" jdbcType="VARCHAR" />
 	<result column="c_note" property="note" jdbcType="VARCHAR" />
 </association>
 <association property="product" javaType="product">
 	<id column="product_id" property="productId" jdbcType="VARCHAR" />
     <result column="product_name" property="productName" jdbcType="VARCHAR" />
     <result column="product_type" property="productType" jdbcType="VARCHAR" />
     <result column="drawing" property="drawing" jdbcType="VARCHAR" /> 
</association>

是不是你github上的代码更新时出了问题呀。 我把mapper根据数据库表中字段进行了修改,然后能使用了。但是不知道其他代码部分会不会有由于没有更新造成的潜在错误

部署错误,并且登录时候提示用户名不存在

1:在部署过程中有错误:org.springframework.core.convert.ConversionFailedException: Failed to convert from type java.util.ArrayList to type java.util.List for value '[/WEB-INF/css/]'; nested exception is org.springframework.core.convert.ConverterNotFoundException: No converter found capable of converting from type java.util.ArrayList to type org.springframework.core.io.Resource
2:登录过程中:提示用户名不存在。使用的是数据表sys_user中的用户名和密码

部署之后如何访问

IDEA倒入项目 部署到tomcat中控制台错误如下
22-Sep-2017 11:45:57.759 信息 [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory Deployment of web application directory [C:\apache-tomcat-8.5.20\webapps\examples] has finished in [621] ms
22-Sep-2017 11:45:57.760 信息 [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory Deploying web application directory [C:\apache-tomcat-8.5.20\webapps\host-manager]
22-Sep-2017 11:45:57.804 信息 [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory Deployment of web application directory [C:\apache-tomcat-8.5.20\webapps\host-manager] has finished in [44] ms
22-Sep-2017 11:45:57.805 信息 [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory Deploying web application directory [C:\apache-tomcat-8.5.20\webapps\manager]
22-Sep-2017 11:45:57.844 信息 [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory Deployment of web application directory [C:\apache-tomcat-8.5.20\webapps\manager] has finished in [40] ms
22-Sep-2017 11:45:57.865 严重 [RMI TCP Connection(7)-127.0.0.1] org.apache.catalina.core.StandardContext.startInternal One or more listeners failed to start. Full details will be found in the appropriate container log file
22-Sep-2017 11:45:57.866 严重 [RMI TCP Connection(7)-127.0.0.1] org.apache.catalina.core.StandardContext.startInternal Context [] startup failed due to previous errors
[2017-09-22 11:45:57,958] Artifact production_ms:war: Error during artifact deployment. See server log for details.

请问这是什么错
请我我如何访问 http://localhost:8080/ 这样访问不行

关于session超时问题

想请教下您是怎么处理那个session超时登录的,sessionFilter如果放在shiroFilter后面,请求会被shiro转发到登录页面
如果放在shiroFilter前面就取不到SecurityUtils.getSubject(),这么明显的问题您一定也发现了,看半天也没想到好办法处理,该怎么处理呢?

未授权任意文件上传漏洞

由于系统中未对上传文件的后缀做限制,导致攻击者可以直接通过接口"/pic/upload"或者"/file/upload"直接上传恶意的jsp脚本文件到服务器上,从而控制服务器。

/pic/upload 接口:
漏洞复现:
image
image
代码分析:
image
image

/file/upload 接口:
漏洞复现:
image
image
代码分析:
image
image

修复建议:建议dui'x对系统做白名单过滤,zhi'yu只允许上传: .txt,.png,.zip等常见的文件格式

登录界面突然变灰什么原因

第一次部署运行的时候登录界面正常,后来再运行就变灰了只能看见文本框,所有图片都没法看见,怎么解决

没有对应的方法却能被访问到。

work_list.jsp中有一个add_judge方法,但是对应的workController里面并没有这个方法,但是这个add_judge方法却又被访问了,是怎么回事呢?求解答,谢谢。

启动tomcat报错

Could not resolve bean definition resource pattern [classpath:spring/applicationContext-*.xml]; nested exception is java.io.FileNotFoundException: class path resource [spring/] cannot be resolved to URL because it does not exist

no projects are found to import

感觉文档缺少了项目的导入流程,新手需要一定时间去上手,PS:我就是新手 :)
看了一下项目应该是Maven项目吧,eclipse导入的话应该以Maven项目导入吧?

访问报错是为啥

javax.servlet.ServletException: java.lang.ExceptionInInitializerError
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:339)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:742)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:728)
at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:470)
at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:395)
at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:316)
at org.springframework.web.servlet.view.InternalResourceView.renderMergedOutputModel(InternalResourceView.java:168)
at org.springframework.web.servlet.view.AbstractView.render(AbstractView.java:303)
at org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1228)
at org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1011)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:955)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:877)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:966)
at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:857)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:635)
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:842)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:742)

在tomcat运行报错

报了很多这种错误:
Related cause: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sqlSessionFactory' defined in file [D:\Program Files\Tomcat\apache-tomcat-8.0.35\webapps\production_ssm\WEB-INF\classes\spring\applicationContext-dao.xml]: Cannot resolve reference to bean 'dataSource' while setting bean property 'dataSource'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataSource' defined in file [D:\Program Files\Tomcat\apache-tomcat-8.0.35\webapps\production_ssm\WEB-INF\classes\spring\applicationContext-dao.xml]: Invocation of init method failed; nested exception is java.sql.SQLException: Could not retrieve transation read-only status server

请问是哪里出现问题了呀?期待大佬的回复,谢谢啦~

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.