SSH2(后台管理页面+Vue+Element-UI+动态树+分页+正则表达)

1:加入maven項目

1.1创建如图中的工作流程包+配置文件

在这里插入图片描述

1.2导入Spring容器框架(业务逻辑处理)

在这里插入图片描述
pom.xml----》动态下载Spring+Struts2所需要的依赖

	<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
	  <modelVersion>4.0.0</modelVersion>
	  <groupId>com.zking</groupId>
	  <artifactId>vueSPA</artifactId>
	  <packaging>war</packaging>
	  <version>0.0.1-SNAPSHOT</version>
	  <name>vueSPA Maven Webapp</name>
	  <url>http://maven.apache.org</url>
		<properties>
			<hibernate.version>5.2.12.Final</hibernate.version>
			<mysql.driver.version>5.1.44</mysql.driver.version>
			<spring.version>5.0.1.RELEASE</spring.version>
			<struts2.version>2.5.13</struts2.version>
			<slf4j.version>1.7.7</slf4j.version>
			<log4j.version>2.9.1</log4j.version>
			<disruptor.version>3.2.0</disruptor.version>
			<junit.version>4.12</junit.version>
			<servlet.version>4.0.1</servlet.version>
			<jstl.version>1.2</jstl.version>
			<standard.version>1.1.2</standard.version>
			<tomcat-jsp-api.version>8.5.20</tomcat-jsp-api.version>
			<jackson.version>2.9.3</jackson.version>
		</properties>
		<dependencies>
			<!--1. hibernate相关依赖 -->
			<dependency>
				<groupId>org.hibernate</groupId>
				<artifactId>hibernate-core</artifactId>
				<version>${hibernate.version}</version>
			</dependency>
			<dependency>
				<groupId>org.hibernate</groupId>
				<artifactId>hibernate-c3p0</artifactId>
				<version>${hibernate.version}</version>
			</dependency>
			<dependency>
				<groupId>org.hibernate</groupId>
				<artifactId>hibernate-ehcache</artifactId>
				<version>${hibernate.version}</version>
			</dependency>
			<dependency>
				<groupId>mysql</groupId>
				<artifactId>mysql-connector-java</artifactId>
				<version>${mysql.driver.version}</version>
			</dependency>
			<!--2. spring相关(5.0.1.RELEASE) -->
			<dependency>
				<groupId>org.springframework</groupId>
				<artifactId>spring-context</artifactId>
				<version>${spring.version}</version>
			</dependency>
			<dependency>
				<groupId>org.springframework</groupId>
				<artifactId>spring-orm</artifactId>
				<version>${spring.version}</version>
			</dependency>
			<dependency>
				<groupId>org.springframework</groupId>
				<artifactId>spring-web</artifactId>
				<version>${spring.version}</version>
			</dependency>
	
			<!-- aop -->
			<dependency>
				<groupId>org.springframework</groupId>
				<artifactId>spring-aop</artifactId>
				<version>${spring.version}</version>
			</dependency>
	
			<dependency>
				<groupId>org.springframework</groupId>
				<artifactId>spring-aspects</artifactId>
				<version>${spring.version}</version>
			</dependency>
	
			<dependency>
				<groupId>org.aspectj</groupId>
				<artifactId>aspectjrt</artifactId>
				<version>1.7.2</version>
			</dependency>
			<dependency>
				<groupId>org.aspectj</groupId>
				<artifactId>aspectjweaver</artifactId>
				<version>1.7.2</version>
			</dependency>
			<dependency>
				<groupId>cglib</groupId>
				<artifactId>cglib</artifactId>
				<version>2.1_3</version>
			</dependency>
			<!-- end -->
			<!--3. struts2相关(2.5.13) -->
			<dependency>
				<groupId>org.apache.struts</groupId>
				<artifactId>struts2-core</artifactId>
				<version>${struts2.version}</version>
				<exclusions>
					<exclusion>
						<artifactId>commons-io</artifactId>
						<groupId>commons-io</groupId>
					</exclusion>
					<exclusion>
						<artifactId>log4j-api</artifactId>
						<groupId>org.apache.logging.log4j</groupId>
					</exclusion>
				</exclusions>
			</dependency>
			<dependency>
				<groupId>org.apache.struts</groupId>
				<artifactId>struts2-spring-plugin</artifactId>
				<version>${struts2.version}</version>
				<exclusions>
					<exclusion>
						<artifactId>spring-web</artifactId>
						<groupId>org.springframework</groupId>
					</exclusion>
					<exclusion>
						<artifactId>spring-beans</artifactId>
						<groupId>org.springframework</groupId>
					</exclusion>
					<exclusion>
						<artifactId>spring-context</artifactId>
						<groupId>org.springframework</groupId>
					</exclusion>
					<exclusion>
						<artifactId>spring-core</artifactId>
						<groupId>org.springframework</groupId>
					</exclusion>
				</exclusions>
			</dependency>
	
			<!--4. log配置:Log4j2 + Slf4j -->
			<!-- slf4j核心包 -->
			<dependency>
				<groupId>org.slf4j</groupId>
				<artifactId>slf4j-api</artifactId>
				<version>${slf4j.version}</version>
			</dependency>
			<dependency>
				<groupId>org.slf4j</groupId>
				<artifactId>jcl-over-slf4j</artifactId>
				<version>${slf4j.version}</version>
				<scope>runtime</scope>
			</dependency>
	
			<!--用于与slf4j保持桥接 -->
			<dependency>
				<groupId>org.apache.logging.log4j</groupId>
				<artifactId>log4j-slf4j-impl</artifactId>
				<version>${log4j.version}</version>
				<exclusions>
					<exclusion>
						<artifactId>slf4j-api</artifactId>
						<groupId>org.slf4j</groupId>
					</exclusion>
				</exclusions>
			</dependency>
	
			<!--核心log4j2jar包 -->
			<dependency>
				<groupId>org.apache.logging.log4j</groupId>
				<artifactId>log4j-api</artifactId>
				<version>${log4j.version}</version>
			</dependency>
			<dependency>
				<groupId>org.apache.logging.log4j</groupId>
				<artifactId>log4j-core</artifactId>
				<version>${log4j.version}</version>
			</dependency>
	
			<!--web工程需要包含log4j-web,非web工程不需要 -->
			<dependency>
				<groupId>org.apache.logging.log4j</groupId>
				<artifactId>log4j-web</artifactId>
				<version>${log4j.version}</version>
				<scope>runtime</scope>
			</dependency>
			<!--需要使用log4j2的AsyncLogger需要包含disruptor -->
			<dependency>
				<groupId>com.lmax</groupId>
				<artifactId>disruptor</artifactId>
				<version>${disruptor.version}</version>
			</dependency>
	
			<!--5. other -->
			<dependency>
				<groupId>junit</groupId>
				<artifactId>junit</artifactId>
				<version>${junit.version}</version>
				<scope>test</scope>
			</dependency>
			<dependency>
				<groupId>javax.servlet</groupId>
				<artifactId>javax.servlet-api</artifactId>
				<version>${servlet.version}</version>
				<scope>provided</scope>
			</dependency>
	
			<!--6. jstl -->
			<dependency>
				<groupId>javax.servlet.jsp.jstl</groupId>
				<artifactId>jstl</artifactId>
				<version>${jstl.version}</version>
			</dependency>
			<dependency>
				<groupId>taglibs</groupId>
				<artifactId>standard</artifactId>
				<version>${standard.version}</version>
			</dependency>
	
			<!-- 7. jsp自定义标签依赖 (必须与tomcat的版本一致) -->
			<dependency>
				<groupId>org.apache.tomcat</groupId>
				<artifactId>tomcat-jsp-api</artifactId>
				<version>${tomcat-jsp-api.version}</version>
				<scope>provided</scope>
			</dependency>
			<!--8)jackson相关依赖 -->
			<dependency>
				<groupId>com.fasterxml.jackson.core</groupId>
				<artifactId>jackson-databind</artifactId>
				<version>${jackson.version}</version>
				<exclusions>
					<exclusion>
						<artifactId>jackson-annotations</artifactId>
						<groupId>com.fasterxml.jackson.core</groupId>
					</exclusion>
				</exclusions>
			</dependency>
			<dependency>
				<groupId>com.fasterxml.jackson.core</groupId>
				<artifactId>jackson-core</artifactId>
				<version>${jackson.version}</version>
			</dependency>
			<dependency>
				<groupId>com.fasterxml.jackson.core</groupId>
				<artifactId>jackson-annotations</artifactId>
				<version>${jackson.version}</version>
			</dependency>
		</dependencies>
	  <build>
	    <finalName>vueSPA</finalName>
	    <plugins>
				<plugin>
					<groupId>org.apache.maven.plugins</groupId>
					<artifactId>maven-compiler-plugin</artifactId>
					<version>3.7.0</version>
					<configuration>
						<source>1.8</source>
						<target>1.8</target>
						<encoding>UTF-8</encoding>
					</configuration>
				</plugin>
			</plugins>
	  </build>
	</project>

web.xml源码:(会报错因为Util工具类还没有进入进来

	<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
		xmlns="http://java.sun.com/xml/ns/javaee"
		xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
		id="WebApp_ID" version="3.0">
	  <display-name>Archetype Created Web Application</display-name>
	  <!-- 1. spring和web集成 -->
		<context-param>
			<param-name>contextConfigLocation</param-name>
			<param-value>classpath:spring.xml</param-value>
		</context-param>
		<listener>
			<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
		</listener>
		
		
	
		<!-- 5. 防止内存泄露、缓存清除监听器 -->
		<listener>
			<listener-class>
				org.springframework.web.util.IntrospectorCleanupListener
			</listener-class>
		</listener>
		
		<!-- 6.块区域处理 -->
		<filter>
			<filter-name>CorsFilter</filter-name>
			<filter-class>com.zking.login.sys.util.CorsFilter</filter-class>
		</filter>
		<filter-mapping>
			<filter-name>CorsFilter</filter-name>
			<url-pattern>/*</url-pattern>
		</filter-mapping>
		
	
		<!-- 4. 中文处理 -->
		<filter>
			<filter-name>EncodingFiter</filter-name>
			<filter-class>com.zking.login.sys.util.EncodingFiter</filter-class>
		</filter>
		<filter-mapping>
			<filter-name>EncodingFiter</filter-name>
			<url-pattern>/*</url-pattern>
		</filter-mapping>
	
		<!-- 3. 把session的关闭延迟到jsp页面显示之后,请配在struts2上面。 -->
		<filter>
			<filter-name>OpenSessionInView</filter-name>
			<filter-class>
				org.springframework.orm.hibernate5.support.OpenSessionInViewFilter
			</filter-class>
		</filter>
		<filter-mapping>
			<filter-name>OpenSessionInView</filter-name>
			<url-pattern>/*</url-pattern>
		</filter-mapping>
	
		<!-- 2. struts2中央控制器 -->
		<filter>
			<filter-name>struts2</filter-name>
			<filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter</filter-class>
		</filter>
		<filter-mapping>
			<filter-name>struts2</filter-name>
			<url-pattern>/*</url-pattern>
		</filter-mapping>
	</web-app>

1.3Spring+Struts2配置文件源码:
Spring.xml:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
	xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
		http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd
		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd
		http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.3.xsd">
	<import resource="spring-base.xml"/>
	<import resource="spring-sys.xml"/>
	<import resource="spring-bas.xml"/>
</beans>

Spring-sys.xml:

	<?xml version="1.0" encoding="UTF-8"?>
	<beans xmlns="http://www.springframework.org/schema/beans"
		xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
		xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx"
		xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
			http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd
			http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd
			http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.3.xsd">
			
		<!-- Dao -->
		<!-- 登陆 -->
		<bean id="userdao" class="com.zking.login.sys.dao.impl.UserDaoimpl" 
			parent="baseDAO">
		</bean>
		<!-- 树形菜单后台 -->
		<bean id="treenodedao" class="com.zking.login.sys.dao.impl.TreeNodeDAOimpl" 
			parent="baseDAO">
		</bean>
		
		
		<!-- Service -->
		<!-- 登陆 -->
		<bean id="userService" class="com.zking.login.sys.service.impl.UserService">
			<property name="userdao">
				<ref bean="userdao"/>
			</property>
		</bean>
		<!-- 树形菜单  -->
		<bean id="treenodeService" class="com.zking.login.sys.service.impl.TreeNodeServiceimpl">
			<property name="treenodedao">
				<ref bean="treenodedao"/>
			</property>
		</bean>
		
		<!-- Action -->
		<!-- 登陆 -->
		 <bean id="userAction" scope="prototype" class="com.zking.login.sys.action.UserAction">
			<property name="userService">
				<ref bean="userService" />
			</property>
		</bean>
		<!-- 树形菜单后台 -->
		<bean id="TreeNodeAction" scope="prototype" class="com.zking.login.sys.action.TreeNodeAction">
			<property name="treenodeService">
				<ref bean="treenodeService"/>
			</property>
		</bean> 
	</beans>

Spring-base.xml c3p0连接池:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
	xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
		http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd
		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd
		http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.3.xsd">
		
	<!-- 配置c3p0连接池 -->
	<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
		<property name="driverClass" value="com.mysql.jdbc.Driver" />
		<property name="jdbcUrl"
			value="jdbc:mysql://localhost:3306/hjj?useUnicode=true&amp;characterEncoding=UTF-8&amp;useSSL=false" />
		<property name="user" value="root" />
		<property name="password" value="123" />

		<!--连接池中保留的最小连接数。 -->
		<property name="minPoolSize" value="2" />

		<!--连接池中保留的最大连接数。Default: 15 -->
		<property name="maxPoolSize" value="10" />

		<!--初始化时获取的连接数,取值应在minPoolSize与maxPoolSize之间。Default: 3 -->
		<property name="initialPoolSize" value="3" />

		<!--最大空闲时间,60秒内未使用则连接被丢弃。若为0则永不丢弃。Default: 0 -->
		<property name="maxIdleTime" value="60" />

		<!--当连接池中的连接耗尽的时候c3p0一次同时获取的连接数。Default: 3 -->
		<property name="acquireIncrement" value="5" />

		<!--JDBC的标准参数,用以控制数据源内加载的PreparedStatements数量。但由于预缓存的statements 属于单个connection而不是整个连接池。 
			所以设置这个参数需要考虑到多方面的因素。如果maxStatements与maxStatementsPerConnection均为0,则缓存被关闭。Default: 
			0 -->
		<property name="maxStatements" value="0" />

		<!--每60秒检查所有连接池中的空闲连接。Default: 0 -->
		<property name="idleConnectionTestPeriod" value="60" />

		<!--定义在从数据库获取新连接失败后重复尝试的次数。Default: 30 -->
		<property name="acquireRetryAttempts" value="30" />

		<!--获取连接失败将会引起所有等待连接池来获取连接的线程抛出异常。但是数据源仍有效 保留,并在下次调用getConnection()的时候继续尝试获取连接。 
			如果设为true,那么在尝试 获取连接失败后该数据源将申明已断开并永久关闭。Default: false -->
		<property name="breakAfterAcquireFailure" value="true" />

		<!--因性能消耗大请只在需要的时候使用它。如果设为true那么在每个connection提交的 时候都将校验其有效性。建议使用idleConnectionTestPeriod 
			或automaticTestTable 等方法来提升连接测试的性能。Default: false -->
		<property name="testConnectionOnCheckout" value="false" />
	</bean>

	<!-- hibernate与spring集成 -->
	<bean id="sessionFactory"
		class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
		<!-- 指定数据源 -->
		<property name="dataSource">
			<ref bean="dataSource" />
		</property>
		<!-- 指定hibernate相关属性 -->
		<property name="hibernateProperties">
			<props>
				<prop key="dialect">org.hibernate.dialect.MySQLDialect</prop>
				<prop key="hibernate.show_sql">true</prop>
				<prop key="hibernate.format_sql">true</prop>
				<prop key="hibernate.use_sql_comments">true</prop>
				<prop key="hibernate.cache.use_second_level_cache">true</prop>
				<prop key="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory
				</prop>
				<prop key="hibernate.cache.use_query_cache">true</prop>
			</props>
		</property>
		<!-- 指定实体映射文件 -->
		<property name="mappingResources">
			<list>
				<value>mapping/LoginUser.hbm.xml</value>
				<value>mapping/TreeNode.hbm.xml</value>
				<value>mapping/DictModel.hbm.xml</value>
			</list>
		</property>
	</bean>

	<!-- hibernateTemplate -->
	<bean id="hibernateTemplate" class="org.springframework.orm.hibernate5.HibernateTemplate">
		<property name="sessionFactory">
			<ref bean="sessionFactory" />
		</property>
	</bean>

	<!--声明式事务配置开始 -->
	<!--1) 开启自动代理 -->
	<aop:aspectj-autoproxy />

	<!--2) 事务管理器 begin/commit/rollback -->
	<bean id="transactionManager"
		class="org.springframework.orm.hibernate5.HibernateTransactionManager">
		<property name="sessionFactory" ref="sessionFactory" />
	</bean>

	<!--3) 定义事务特性 -->
	<!-- 环绕通知 -->
	<tx:advice id="txAdvice" transaction-manager="transactionManager">
		<tx:attributes>
			<tx:method name="add*" propagation="REQUIRED" />
			<tx:method name="edit*" propagation="REQUIRED" />
			<tx:method name="del*" propagation="REQUIRED" />
			<tx:method name="load*" propagation="REQUIRED" read-only="true" />
			<tx:method name="list*" propagation="REQUIRED" read-only="true" />
			<tx:method name="do*" propagation="REQUIRED" />
		</tx:attributes>
	</tx:advice>

	<!-- 代理=目标+通知 -->
	<!--4) 定义切入点 -->
	<aop:config>
		<!-- pointcut属性用来定义一个切入点,分成四个部分理解 [* ][*..][*Service][.*(..)] -->
		<!-- A: 返回类型,*表示返回类型不限 -->
		<!-- B: 包名,*..表示包名不限 -->
		<!-- C: 类或接口名,*Service表示类或接口必须以Service结尾 -->
		<!-- D: 方法名和参数,*(..)表示方法名不限,参数类型和个数不限 -->
		<!-- 表达式用来查找目标对象 -->
		<aop:advisor advice-ref="txAdvice" pointcut="execution(* *..*Service.*(..))" />
	</aop:config>
	<!-- 声明式事务配置结束 -->
	
	<!-- base模块配置 -->
	<bean id="baseDAO" class="com.zking.login.base.dao.BaseDao">
		<property name="hibernateTemplate">
			<ref bean="hibernateTemplate" />
		</property>
	</bean>
</beans>

Spring-bas.xml数据类型:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
	xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
		http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd
		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd
		http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.3.xsd">
		
	<!-- Dao -->
	<!-- 字典类型 -->
	<bean id="dictdao" class="com.zking.login.bas.dao.impl.DictDaoimpl" 
		parent="baseDAO">
	</bean>
	
	<!-- Service -->
	<!-- 字典类型 -->
	<bean id="dictService" class="com.zking.login.bas.service.impl.DictServiceimpl">
		<property name="dictdao">
			<ref bean="dictdao"/>
		</property>
	</bean>
	
	<!-- Action -->
	<!-- 字典 -->
	 <bean id="dictAction" scope="prototype" class="com.zking.login.bas.action.DictAction">
		<property name="dictService">
			<ref bean="dictService" />
		</property>
	</bean>
</beans>

Struts.xml:

	<?xml version="1.0" encoding="UTF-8" ?>
	<!DOCTYPE struts PUBLIC
		"-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
		"http://struts.apache.org/dtds/struts-2.5.dtd">
	<struts>
		<include file="struts-base.xml" />
		<include file="struts-sys.xml" />
		<include file="struts-bas.xml" />
	</struts>

Struts-sys.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
	"-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
	"http://struts.apache.org/dtds/struts-2.5.dtd">
<struts>
	<package name="sys" namespace="/sys" extends="base">
		<action name="userAction_*" class="userAction" method="{1}" >
		</action>
		<action name="TreeNodeAction_*" class="TreeNodeAction" method="{1}" >
		</action>
	</package>
</struts>

Struts-base.xml:

	<?xml version="1.0" encoding="UTF-8" ?>
	<!DOCTYPE struts PUBLIC
		"-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
		"http://struts.apache.org/dtds/struts-2.5.dtd">
	<struts>
		<constant name="struts.i18n.encoding" value="UTF-8" />
		<constant name="struts.devMode" value="false" />
		<constant name="struts.configuration.xml.reload" value="true" />
		<constant name="struts.i18n.encoding" value="UTF-8" />
		<constant name="struts.i18n.reload" value="true" />
		
		 <include file="struts-default.xml" />
		<package name="base" extends="struts-default" abstract="true">
			<global-allowed-methods>regex:.*</global-allowed-methods>
		</package> 
	</struts>

Struts-bas.xml:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
	"-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
	"http://struts.apache.org/dtds/struts-2.5.dtd">
<struts>
	<package name="bas" namespace="/bas" extends="base">
		<action name="dictAction_*" class="dictAction" method="{1}" >
		</action>
	</package>
</struts>

log4j2.xml源码:

<?xml version="1.0" encoding="UTF-8"?>

<!-- status : 指定log4j本身的打印日志的级别.ALL< Trace < DEBUG < INFO < WARN < ERROR 
	< FATAL < OFF。 monitorInterval : 用于指定log4j自动重新配置的监测间隔时间,单位是s,最小是5s. -->
<Configuration status="WARN" monitorInterval="30">
	<Properties>
		<!-- 配置日志文件输出目录 ${sys:user.home} -->
		<Property name="LOG_HOME">/root/workspace/lucenedemo/logs</Property>
		<property name="ERROR_LOG_FILE_NAME">/root/workspace/lucenedemo/logs/error</property>
		<property name="WARN_LOG_FILE_NAME">/root/workspace/lucenedemo/logs/warn</property>
		<property name="PATTERN">%d{yyyy-MM-dd HH:mm:ss.SSS} [%t-%L] %-5level %logger{36} - %msg%n</property>
	</Properties>

	<Appenders>
		<!--这个输出控制台的配置 -->
		<Console name="Console" target="SYSTEM_OUT">
			<!-- 控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch) -->
			<ThresholdFilter level="trace" onMatch="ACCEPT"
				onMismatch="DENY" />
			<!-- 输出日志的格式 -->
			<!-- %d{yyyy-MM-dd HH:mm:ss, SSS} : 日志生产时间 %p : 日志输出格式 %c : logger的名称 
				%m : 日志内容,即 logger.info("message") %n : 换行符 %C : Java类名 %L : 日志输出所在行数 %M 
				: 日志输出所在方法名 hostName : 本地机器名 hostAddress : 本地ip地址 -->
			<PatternLayout pattern="${PATTERN}" />
		</Console>

		<!--文件会打印出所有信息,这个log每次运行程序会自动清空,由append属性决定,这个也挺有用的,适合临时测试用 -->
		<!--append为TRUE表示消息增加到指定文件中,false表示消息覆盖指定的文件内容,默认值是true -->
		<File name="log" fileName="logs/test.log" append="false">
			<PatternLayout
				pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
		</File>
		<!-- 这个会打印出所有的info及以下级别的信息,每次大小超过size, 则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,作为存档 -->
		<RollingFile name="RollingFileInfo" fileName="${LOG_HOME}/info.log"
			filePattern="${LOG_HOME}/$${date:yyyy-MM}/info-%d{yyyy-MM-dd}-%i.log">
			<!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch) -->
			<ThresholdFilter level="info" onMatch="ACCEPT"
				onMismatch="DENY" />
			<PatternLayout
				pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
			<Policies>
				<!-- 基于时间的滚动策略,interval属性用来指定多久滚动一次,默认是1 hour。 modulate=true用来调整时间:比如现在是早上3am,interval是4,那么第一次滚动是在4am,接着是8am,12am...而不是7am. -->
				<!-- 关键点在于 filePattern后的日期格式,以及TimeBasedTriggeringPolicy的interval, 日期格式精确到哪一位,interval也精确到哪一个单位 -->
				<!-- log4j2的按天分日志文件 : info-%d{yyyy-MM-dd}-%i.log -->
				<TimeBasedTriggeringPolicy interval="1"
					modulate="true" />
				<!-- SizeBasedTriggeringPolicy:Policies子节点, 基于指定文件大小的滚动策略,size属性用来定义每个日志文件的大小. -->
				<!-- <SizeBasedTriggeringPolicy size="2 kB" /> -->
			</Policies>
		</RollingFile>

		<RollingFile name="RollingFileWarn" fileName="${WARN_LOG_FILE_NAME}/warn.log"
			filePattern="${WARN_LOG_FILE_NAME}/$${date:yyyy-MM}/warn-%d{yyyy-MM-dd}-%i.log">
			<ThresholdFilter level="warn" onMatch="ACCEPT"
				onMismatch="DENY" />
			<PatternLayout
				pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
			<Policies>
				<TimeBasedTriggeringPolicy />
				<SizeBasedTriggeringPolicy size="2 kB" />
			</Policies>
			<!-- DefaultRolloverStrategy属性如不设置,则默认为最多同一文件夹下7个文件,这里设置了20 -->
			<DefaultRolloverStrategy max="20" />
		</RollingFile>

		<RollingFile name="RollingFileError" fileName="${ERROR_LOG_FILE_NAME}/error.log"
			filePattern="${ERROR_LOG_FILE_NAME}/$${date:yyyy-MM}/error-%d{yyyy-MM-dd-HH-mm}-%i.log">
			<ThresholdFilter level="error" onMatch="ACCEPT"
				onMismatch="DENY" />
			<PatternLayout
				pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
			<Policies>
				<!-- log4j2的按分钟 分日志文件 : warn-%d{yyyy-MM-dd-HH-mm}-%i.log -->
				<TimeBasedTriggeringPolicy interval="1"
					modulate="true" />
				<!-- <SizeBasedTriggeringPolicy size="10 MB" /> -->
			</Policies>
		</RollingFile>

	</Appenders>

	<!--然后定义logger,只有定义了logger并引入的appender,appender才会生效 -->
	<Loggers>
		<!--过滤掉spring和mybatis的一些无用的DEBUG信息 -->
		<logger name="org.springframework" level="INFO"></logger>
		<logger name="org.mybatis" level="INFO"></logger>

		<!-- 第三方日志系统 -->
		<logger name="org.springframework" level="ERROR" />
		<logger name="org.hibernate" level="ERROR" />
		<logger name="org.apache.struts2" level="ERROR" />
		<logger name="com.opensymphony.xwork2" level="ERROR" />
		<logger name="org.jboss" level="ERROR" />


		<!-- 配置日志的根节点 -->
		<root level="all">
			<appender-ref ref="Console" />
			<appender-ref ref="RollingFileInfo" />
			<appender-ref ref="RollingFileWarn" />
			<appender-ref ref="RollingFileError" />
		</root>

	</Loggers>

</Configuration>

2.Base(接口工具类):

在这里插入图片描述
BaseAction源码:

package com.zking.login.base.action;

import java.io.IOException;
import java.io.Serializable;

import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.struts2.interceptor.ServletRequestAware;
import org.apache.struts2.interceptor.ServletResponseAware;
import org.springframework.stereotype.Controller;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.opensymphony.xwork2.ActionSupport;
public abstract class BaseAction extends ActionSupport implements Serializable, ServletRequestAware, ServletResponseAware {

	private static final long serialVersionUID = -2182475216409413582L;
	protected HttpServletRequest request;
	protected HttpServletResponse response;
	protected HttpSession session;
	protected ServletContext application;
	
	@Override
	public void setServletResponse(HttpServletResponse response) {
		this.response=response;
	}

	@Override
	public void setServletRequest(HttpServletRequest request) {
		this.request=request;
		this.session=request.getSession();
		this.application=request.getServletContext();
	}
	
	public void writeJson(Object data) {
		ObjectMapper mapper = new ObjectMapper();
		try {
			mapper.writeValue(this.response.getOutputStream(), data);
		} catch (IOException e) {
			e.printStackTrace();
			throw new RuntimeException(e);
		}
	}

}

BaseDao源码:

package com.zking.login.base.dao;

import java.io.Serializable;
import java.util.Collection;
import java.util.List;
import java.util.Map;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.query.Query;
import org.springframework.orm.hibernate5.HibernateCallback;
import org.springframework.orm.hibernate5.support.HibernateDaoSupport;

import com.zking.login.base.util.PageBean;


public class BaseDao extends HibernateDaoSupport implements Serializable {

	private static final long serialVersionUID = 1619854797335382396L;

	private Logger log = LogManager.getLogger(BaseDao.class);

	public BaseDao() {
		super();
	}

	/**
	 * 通用赋值方法
	 * 
	 * @param query
	 * @param args
	 */
	@SuppressWarnings({ "unused", "rawtypes" })
	private void setParameters(Query query, Map<String, Object> args) {
		if (null == args || 0 == args.size()) {
			return;
		}
		log.info("hql查询参数为:" + args);

		String name = null;
		Object value = null;
		for (Map.Entry<String, Object> entry : args.entrySet()) {
			name = entry.getKey();// min,uname
			value = entry.getValue();// 1000f,'z%'
			// query.setFloat(name, value);
			// query.setString(name, value);
			// query.setParameter(param, value);//8+1
			if (value instanceof Collection) {// List和Set
				query.setParameterList(name, (Collection) value);
			} else if (value instanceof Object[]) {
				query.setParameterList(name, (Object[]) value);
			} else {
				query.setParameter(name, value);
			}
		}
	}

	@SuppressWarnings({ "rawtypes", "unchecked" })
	public List executeQuery(final String hql, final Map<String, Object> args, final PageBean pageBean) {
		// Session session =
		// this.getHibernateTemplate().getSessionFactory().openSession();

		return (List) this.getHibernateTemplate().execute(new HibernateCallback() {
			@Override
			public Object doInHibernate(Session session) throws HibernateException {
				// 1. 查满足条件的总记录数
				Query query = null;
				if (null != pageBean && pageBean.isPagination()) {
					String countHql = getCountHql(hql);
					log.info("countHql[" + countHql + "]");
					query = session.createQuery(countHql);
					setParameters(query, args);// 给占位符赋值
					Object total = query.uniqueResult();
					pageBean.setTotal(total.toString());
				}
				// 2. 查满足条件并指定页码 的记录
				log.info("countHql[" + hql + "]");
				query = session.createQuery(hql);
				if (null != pageBean && pageBean.isPagination()) {
					query.setFirstResult(pageBean.getStartIndex());
					query.setMaxResults(pageBean.getRows());
				}
				setParameters(query, args);// 给占位符赋值
				List list = query.list();
				return list;
			}
		});
	}
	// from Account a where 1=1 OrDer by a.balance desc
	// from Account a where 1=1
	// select a.userName from Account a where 1=1 OrDer by a.balance desc
	// select count(*) from Account a where 1=1

	/**
	 * 将普通的hql转换成查总记录数的hql
	 * 
	 * @param hql
	 * @return
	 */
	private static String getCountHql(String hql) {
		String newHql = new String(hql).toUpperCase();
		int start = newHql.indexOf("FROM ");
		int end = newHql.indexOf("ORDER BY");
		if (-1 == end) {
			newHql = "select count(*) " + hql.substring(start);
		} else {
			newHql = "select count(*) " + hql.substring(start, end);
		}
		return newHql;
	}

	// public static void main(String[] args) {
	// String hql2 = "from Order o where o.orderId in (1,2,3,5)";// (:orderIds)
	// String hql = "select a.userName from Account a where 1=1 and a.balance >=
	// :min order by a.balance";
	// System.out.println(getCountHql(hql));
	// }
}

BaseModel源码:

package com.zking.login.base.model;

import java.io.Serializable;

public abstract class BaseModel implements Serializable{
	private static final long serialVersionUID = 8624999326463657703L;

}

BaseService 源码:

package com.zking.login.base.service;

import java.io.Serializable;

public abstract class BaseService implements Serializable{

	private static final long serialVersionUID = 1L;

}

PageBean 源码:

package com.zking.login.base.util;

import java.util.Map;

import javax.servlet.http.HttpServletRequest;

public class PageBean {

	private int page = 1;// 页码
	private int rows = 10;// 行数/页大小
	private int total = 0;// 总记录数

	private boolean pagination = true;// 默认分页

	private String url;// 上一次请求的地址
	private Map<String, String[]> parameterMap;// 上一次请求的所有参数

	public PageBean() {
		super();
	}

	/**
	 * 对分页bean进行初始化
	 * 
	 * @param request
	 */
	public void setRequest(HttpServletRequest request) {
		// 公共参数
		this.setPage(request.getParameter("page"));
		this.setRows(request.getParameter("rows"));
		this.setPagination(request.getParameter("pagination"));

		// 请求地址和请求参数
		this.setUrl(request.getContextPath() + request.getServletPath());
		this.setParameterMap(request.getParameterMap());
	}

	public String getUrl() {
		return url;
	}

	public void setUrl(String url) {
		this.url = url;
	}

	public Map<String, String[]> getParameterMap() {
		return parameterMap;
	}

	public void setParameterMap(Map<String, String[]> parameterMap) {
		this.parameterMap = parameterMap;
	}

	public int getPage() {
		return page;
	}

	public void setPage(int page) {
		this.page = page;
	}

	public void setPage(String page) {
		if (null != page && !"".equals(page.trim())) {
			this.page = Integer.parseInt(page);
		}
	}

	public int getRows() {
		return rows;
	}

	public void setRows(int rows) {
		this.rows = rows;
	}

	public void setRows(String rows) {
		if (null != rows && !"".equals(rows.trim())) {
			this.rows = Integer.parseInt(rows);
		}
	}

	public int getTotal() {
		return total;
	}

	public void setTotal(int total) {
		this.total = total;
	}

	public void setTotal(String total) {
		this.total = Integer.parseInt(total);
	}

	public boolean isPagination() {
		return pagination;
	}

	public void setPagination(boolean pagination) {
		this.pagination = pagination;
	}

	public void setPagination(String pagination) {
		if ("false".equals(pagination)) {
			this.pagination = false;
		}
	}

	/**
	 * 下一页
	 * 
	 * @return
	 */
	public int getNextPage() {
		int nextPage = page + 1;
		if (nextPage > this.getMaxPage()) {
			nextPage = this.getMaxPage();
		}
		return nextPage;
	}

	/**
	 * 上一页
	 * 
	 * @return
	 */
	public int getPreviousPage() {
		int previousPage = page - 1;
		if (previousPage < 1) {
			previousPage = 1;
		}
		return previousPage;
	}

	/**
	 * 最大页码
	 * 
	 * @return
	 */
	public int getMaxPage() {
		return total % rows == 0 ? total / rows : total / rows + 1;
	}

	/**
	 * 起始记录的下标
	 * 
	 * @return
	 */
	public int getStartIndex() {
		return (page - 1) * rows;
	}

	@Override
	public String toString() {
		return "PageBean [page=" + page + ", rows=" + rows + ", total=" + total + ", pagination=" + pagination + "]";
	}

}

3.SYS模块包:

在这里插入图片描述

Util工具类源码

CorsFilter(配置tomcat允许跨域访问):

	package com.zking.login.sys.util;
	
	import java.io.IOException;
	
	import javax.servlet.Filter;
	import javax.servlet.FilterChain;
	import javax.servlet.FilterConfig;
	import javax.servlet.ServletException;
	import javax.servlet.ServletRequest;
	import javax.servlet.ServletResponse;
	import javax.servlet.http.HttpServletRequest;
	import javax.servlet.http.HttpServletResponse;
	
	/**
	 * 配置tomcat允许跨域访问
	 * 
	 * @author Administrator
	 *
	 */
	public class CorsFilter implements Filter {
	
		@Override
		public void init(FilterConfig filterConfig) throws ServletException {
		}
	
		// @Override
		// public void doFilter(ServletRequest servletRequest, ServletResponse
		// servletResponse, FilterChain filterChain)
		// throws IOException, ServletException {
		// HttpServletResponse httpResponse = (HttpServletResponse) servletResponse;
		//
		// // Access-Control-Allow-Origin就是我们需要设置的域名
		// // Access-Control-Allow-Headers跨域允许包含的头。
		// // Access-Control-Allow-Methods是允许的请求方式
		// httpResponse.addHeader("Access-Control-Allow-Origin", "*");// *,任何域名
		// httpResponse.setHeader("Access-Control-Allow-Methods", "POST, GET, PUT,
		// DELETE");
		// // httpResponse.setHeader("Access-Control-Allow-Headers", "Origin,
		// // X-Requested-With, Content-Type, Accept");
		//
		// // 允许请求头Token
		// httpResponse.setHeader("Access-Control-Allow-Headers",
		// "Origin,X-Requested-With, Content-Type, Accept, Token");
		// HttpServletRequest req = (HttpServletRequest) servletRequest;
		// System.out.println("Token=" + req.getHeader("Token"));
		// if("OPTIONS".equals(req.getMethod())) {
		// return;
		// }
		//
		//
		// filterChain.doFilter(servletRequest, servletResponse);
		// }
	
		@Override
		public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)
				throws IOException, ServletException {
			HttpServletResponse resp = (HttpServletResponse) servletResponse;
			HttpServletRequest req = (HttpServletRequest) servletRequest;
	
			// Access-Control-Allow-Origin就是我们需要设置的域名
			// Access-Control-Allow-Headers跨域允许包含的头。
			// Access-Control-Allow-Methods是允许的请求方式
			resp.setHeader("Access-Control-Allow-Origin", "*");// *,任何域名
			resp.setHeader("Access-Control-Allow-Methods", "POST, GET, PUT, DELETE");
			resp.setHeader("Access-Control-Allow-Headers", "Origin,X-Requested-With, Content-Type, Accept");
	
			// 允许请求头Token
			// httpResponse.setHeader("Access-Control-Allow-Headers","Origin,X-Requested-With,
			// Content-Type, Accept, Token");
			// System.out.println("Token=" + req.getHeader("Token"));
	
			if ("OPTIONS".equals(req.getMethod())) {// axios的ajax会发两次请求,第一次提交方式为:option,直接返回即可
				return;
			}
			filterChain.doFilter(servletRequest, servletResponse);
		}
	
		@Override
		public void destroy() {
	
		}
	}

EncodingFiter(中文乱码处理器):

package com.zking.login.sys.util;

import java.io.IOException;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * 中文乱码处理
 * 
 */
public class EncodingFiter implements Filter {

	private String encoding = "UTF-8";// 默认字符集

	public EncodingFiter() {
		super();
	}

	public void destroy() {
	}

	public void doFilter(ServletRequest request, ServletResponse response,
			FilterChain chain) throws IOException, ServletException {
		HttpServletRequest req = (HttpServletRequest) request;
		HttpServletResponse res = (HttpServletResponse) response;

		// 中文处理必须放到 chain.doFilter(request, response)方法前面
		res.setContentType("text/html;charset=" + this.encoding);
		if (req.getMethod().equalsIgnoreCase("post")) {
			req.setCharacterEncoding(this.encoding);
		} else {
			Map map = req.getParameterMap();// 保存所有参数名=参数值(数组)的Map集合
			Set set = map.keySet();// 取出所有参数名
			Iterator it = set.iterator();
			while (it.hasNext()) {
				String name = (String) it.next();
				String[] values = (String[]) map.get(name);// 取出参数值[注:参数值为一个数组]
				for (int i = 0; i < values.length; i++) {
					values[i] = new String(values[i].getBytes("ISO-8859-1"),
							this.encoding);
				}
			}
		}

		chain.doFilter(request, response);
	}

	public void init(FilterConfig filterConfig) throws ServletException {
		String s = filterConfig.getInitParameter("encoding");// 读取web.xml文件中配置的字符集
		if (null != s && !s.trim().equals("")) {
			this.encoding = s.trim();
		}
	}

}

JsonData(服务器返回给客户端的JSON格式的数据):

package com.zking.login.sys.util;

import java.io.Serializable;
import java.util.HashMap;

/**
 * 服务器返回给客户端的JSON格式的数据
 *
 */
public class JsonData extends HashMap<String, Object> implements Serializable {

	private static final long serialVersionUID = -8855960778711040221L;

	private static final String CODE_KEY = "code";// 操作代码 0 成功 非0 失败
	private static final String MESSAGE_KEY = "message";// 操作消息
	private static final String RESULT_KEY = "result";// 结果集
	private static final String PAGE_KEY = "page";// 页码
	private static final String ROWS_KEY = "rows";// 每页行数/页大小
	private static final String TOTAL_KEY = "total";// 总记录数

	public JsonData() {
		super();
		this.put(CODE_KEY, 0);// 默认操作成功
	}

	public void setCode(Integer code) {
		this.put(CODE_KEY, code);
	}

	public void setMessage(String message) {
		this.put(MESSAGE_KEY, message);
	}

	public void setResult(Object result) {
		this.put(RESULT_KEY, result);
	}

	public void setPage(Integer page) {
		this.put(PAGE_KEY, page);
	}

	public void setRows(Integer rows) {
		this.put(ROWS_KEY, rows);
	}

	public void setTotal(Integer total) {
		this.put(TOTAL_KEY, total);
	}

}

PageBean(分页工具类):

	package com.zking.login.sys.util;
	
	import java.util.Map;
	
	import javax.servlet.http.HttpServletRequest;
	
	public class PageBean {
	
		private int page = 1;// 页码
		private int rows = 10;// 行数/页大小
		private int total = 0;// 总记录数
	
		private boolean pagination = true;// 默认分页
	
		private String url;// 上一次请求的地址
		private Map<String, String[]> parameterMap;// 上一次请求的所有参数
	
		public PageBean() {
			super();
		}
	
		/**
		 * 对分页bean进行初始化
		 * 
		 * @param request
		 */
		public void setRequest(HttpServletRequest request) {
			// 公共参数
			this.setPage(request.getParameter("page"));
			this.setRows(request.getParameter("rows"));
			this.setPagination(request.getParameter("pagination"));
	
			// 请求地址和请求参数
			this.setUrl(request.getContextPath() + request.getServletPath());
			this.setParameterMap(request.getParameterMap());
		}
	
		public String getUrl() {
			return url;
		}
	
		public void setUrl(String url) {
			this.url = url;
		}
	
		public Map<String, String[]> getParameterMap() {
			return parameterMap;
		}
	
		public void setParameterMap(Map<String, String[]> parameterMap) {
			this.parameterMap = parameterMap;
		}
	
		public int getPage() {
			return page;
		}
	
		public void setPage(int page) {
			this.page = page;
		}
	
		public void setPage(String page) {
			if (null != page && !"".equals(page.trim())) {
				this.page = Integer.parseInt(page);
			}
		}
	
		public int getRows() {
			return rows;
		}
	
		public void setRows(int rows) {
			this.rows = rows;
		}
	
		public void setRows(String rows) {
			if (null != rows && !"".equals(rows.trim())) {
				this.rows = Integer.parseInt(rows);
			}
		}
	
		public int getTotal() {
			return total;
		}
	
		public void setTotal(int total) {
			this.total = total;
		}
	
		public void setTotal(String total) {
			this.total = Integer.parseInt(total);
		}
	
		public boolean isPagination() {
			return pagination;
		}
	
		public void setPagination(boolean pagination) {
			this.pagination = pagination;
		}
	
		public void setPagination(String pagination) {
			if ("false".equals(pagination)) {
				this.pagination = false;
			}
		}
	
		/**
		 * 下一页
		 * 
		 * @return
		 */
		public int getNextPage() {
			int nextPage = page + 1;
			if (nextPage > this.getMaxPage()) {
				nextPage = this.getMaxPage();
			}
			return nextPage;
		}
	
		/**
		 * 上一页
		 * 
		 * @return
		 */
		public int getPreviousPage() {
			int previousPage = page - 1;
			if (previousPage < 1) {
				previousPage = 1;
			}
			return previousPage;
		}
	
		/**
		 * 最大页码
		 * 
		 * @return
		 */
		public int getMaxPage() {
			return total % rows == 0 ? total / rows : total / rows + 1;
		}
	
		/**
		 * 起始记录的下标
		 * 
		 * @return
		 */
		public int getStartIndex() {
			return (page - 1) * rows;
		}
	
		@Override
		public String toString() {
			return "PageBean [page=" + page + ", rows=" + rows + ", total=" + total + ", pagination=" + pagination + "]";
		}
	
	}

StringUtils(私有的构造方法,保护此类不能在外部实例化):

	package com.zking.login.sys.util;
	
	public class StringUtils {
		// 私有的构造方法,保护此类不能在外部实例化
		private StringUtils() {
		}
	
		/**
		 * 如果字符串等于null或去空格后等于"",则返回true,否则返回false
		 * 
		 * @param s
		 * @return
		 */
		public static boolean isBlank(String s) {
			boolean b = false;
			if (null == s || s.trim().equals("")) {
				b = true;
			}
			return b;
		}
		
		/**
		 * 如果字符串不等于null或去空格后不等于"",则返回true,否则返回false
		 * 
		 * @param s
		 * @return
		 */
		public static boolean isNotBlank(String s) {
			return !isBlank(s);
		}
	
	}
Model实体类

LoginUser (实体类):

package com.zking.login.sys.model;

import java.io.Serializable;
import java.sql.Timestamp;

import com.zking.login.base.model.BaseModel;

public class LoginUser extends BaseModel {
	
	private Long userid;
	private String username;
	private String password;
	
	private String salt;
	private Integer locked;
	private Timestamp createDatetime;
	
	public LoginUser() {
	}

	public Long getUserid() {
		return userid;
	}

	public void setUserid(Long userid) {
		this.userid = userid;
	}

	public String getUsername() {
		return username;
	}

	public void setUsername(String username) {
		this.username = username;
	}

	public String getPassword() {
		return password;
	}

	public void setPassword(String password) {
		this.password = password;
	}

	public String getSalt() {
		return salt;
	}

	public void setSalt(String salt) {
		this.salt = salt;
	}

	public Integer getLocked() {
		return locked;
	}

	public void setLocked(Integer locked) {
		this.locked = locked;
	}

	public Timestamp getCreateDatetime() {
		return createDatetime;
	}

	public void setCreateDatetime(Timestamp createDatetime) {
		this.createDatetime = createDatetime;
	}

	@Override
	public String toString() {
		return "LoginUser [userid=" + userid + ", username=" + username + ", password=" + password + ", salt=" + salt
				+ ", locked=" + locked + ", createDatetime=" + createDatetime + "]";
	}
}
Mapping包

LoginUser.hbm.xml(实体映射文件)

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
	<class name="com.zking.login.sys.model.LoginUser" table="t_sys_user">
		<id name="userid" type="java.lang.Long" column="user_id">
			<generator class="native"  /><!-- 由数据库管理自增长 -->
		</id>
		<property name="username" type="java.lang.String" column="username" />
		<property name="password" type="java.lang.String" column="password" />
		<property name="salt" type="java.lang.String" column="salt" />
		<property name="locked" type="java.lang.Integer" column="locked" insert="false" />
		<property name="createDatetime" type="java.sql.Timestamp" column="create_datetime" insert="false" update="false" />
	</class>
</hibernate-mapping>
Dao层

IUserDao :

package com.zking.login.sys.dao;

import java.util.List;

import com.zking.login.sys.model.LoginUser;
import com.zking.login.sys.util.PageBean;

public interface IUserDao {
	
	/**
	 * 注册
	 */
//	void add(LoginUser loginUser);
	
	/**
	 * 删除用户
	 */
//	void del(LoginUser loginUser);
	
	/**
	 * 修改用户
	 */
//	void upde(String loanaem,String loapwd,LoginUser loginUser);
	
	/**
	 * 登陆
	 */
	LoginUser load(LoginUser loginUser);
	
	
	/**
	 * 查询所有用户
	 */
	//List<LoginUser> list(LoginUser loginUser,PageBean pagebean);

}

UserDaoimpl :

	package com.zking.login.sys.dao.impl;
	
	import java.util.HashMap;
	import java.util.Map;
	
	import org.hibernate.HibernateException;
	import org.hibernate.Session;
	import org.hibernate.query.Query;
	import org.springframework.orm.hibernate5.HibernateCallback;
	
	import com.zking.login.base.dao.BaseDao;
	import com.zking.login.sys.dao.IUserDao;
	import com.zking.login.sys.model.LoginUser;
	
	public class UserDaoimpl extends BaseDao implements IUserDao {
	
		@Override
		public LoginUser load(LoginUser user) {
			return this.getHibernateTemplate().execute(new HibernateCallback<LoginUser>() {
				@Override
				public LoginUser doInHibernate(Session session) throws HibernateException {
					Query query = session.createQuery("from LoginUser u where u.username = :username");//查询出结果放进json中
					query.setString("username", user.getUsername());//把json转为string类型
					LoginUser u = (LoginUser) query.uniqueResult();//query内部一个方法
					return u;
				}
			});
		}
	
	}
Service

IUserService(登陆):

package com.zking.login.sys.service;

import java.util.List;

import com.zking.login.sys.model.LoginUser;
import com.zking.login.sys.util.PageBean;

public interface IUserService {
	

	/**
	 * 登陆
	 */
	LoginUser load(LoginUser loginUser);
	
	
	/**
	 * 查询所有用户
	 */
//	List<LoginUser> list(LoginUser loginUser,PageBean pagebean);

}

UserService(登陆):

package com.zking.login.sys.service.impl;

import java.util.List;

import com.zking.login.base.service.BaseService;
import com.zking.login.sys.dao.IUserDao;
import com.zking.login.sys.model.LoginUser;
import com.zking.login.sys.service.IUserService;
import com.zking.login.sys.util.PageBean;

public class UserService extends BaseService  implements IUserService{
	
	private IUserDao userdao;
	
	public UserService() {
	}
	public IUserDao getUserdao() {
		return userdao;
	}

	public void setUserdao(IUserDao userdao) {
		this.userdao = userdao;
	}


	@Override
	public LoginUser load(LoginUser loginUser) {
		return userdao.load(loginUser);
	}


}

UserAction:

package com.zking.login.sys.action;

import com.opensymphony.xwork2.ModelDriven;
import com.zking.login.base.action.BaseAction;
import com.zking.login.sys.model.LoginUser;
import com.zking.login.sys.service.IUserService;
import com.zking.login.sys.util.JsonData;

public class UserAction extends BaseAction implements ModelDriven<LoginUser>{
	
	private static final long serialVersionUID = 1L;

	private IUserService userService;
	
	private LoginUser user = new LoginUser();
	
	public UserAction() {
		
	}
	public IUserService getUserService() {
		return userService;
	}
	public void setUserService(IUserService userService) {
		this.userService = userService;
	}
	@Override
	public LoginUser getModel() {
		return user;
	}
	
	public String execute() {
		System.out.println(request.getMethod());
		System.out.println("后台Action"+this.user);
		JsonData jsonData = new JsonData();
		
		LoginUser u = userService.load(user);
		if(u != null && u.getPassword().equals(user.getPassword())) {
			jsonData.setCode(0);
			jsonData.setMessage("登陆成功");
		}else {
			jsonData.setCode(-1);
			jsonData.setMessage("账号或密码错误");
		}
		this.writeJson(jsonData);
		return null;
	}
	

}

SYS项目模块+动态树:
在这里插入图片描述
TreeNode 源码:

package com.zking.login.sys.model;

import java.util.ArrayList;
import java.util.List;

import com.zking.login.base.model.BaseModel;

public class TreeNode extends BaseModel {
	
	private static final long serialVersionUID = 1L;
	
	private Integer treeNodeId;
	private String treeNodeName;
	private Integer treeNodeType;
	
	private Integer parentNodeId;
	private String url;
	private Integer position;
	
	private String icon;
	private List<TreeNode> children = new ArrayList<TreeNode>();
	
	
	public TreeNode() {
	}


	public Integer getTreeNodeId() {
		return treeNodeId;
	}


	public void setTreeNodeId(Integer treeNodeId) {
		this.treeNodeId = treeNodeId;
	}


	public String getTreeNodeName() {
		return treeNodeName;
	}


	public void setTreeNodeName(String treeNodeName) {
		this.treeNodeName = treeNodeName;
	}


	public Integer getTreeNodeType() {
		return treeNodeType;
	}


	public void setTreeNodeType(Integer treeNodeType) {
		this.treeNodeType = treeNodeType;
	}


	public Integer getParentNodeId() {
		return parentNodeId;
	}


	public void setParentNodeId(Integer parentNodeId) {
		this.parentNodeId = parentNodeId;
	}


	public String getUrl() {
		return url;
	}


	public void setUrl(String url) {
		this.url = url;
	}


	public Integer getPosition() {
		return position;
	}


	public void setPosition(Integer position) {
		this.position = position;
	}


	public String getIcon() {
		return icon;
	}


	public void setIcon(String icon) {
		this.icon = icon;
	}


	public List<TreeNode> getChildren() {
		return children;
	}


	public void setChildren(List<TreeNode> children) {
		this.children = children;
	}


	@Override
	public String toString() {
		return "TreeNode [treeNodeId=" + treeNodeId + ", treeNodeName=" + treeNodeName + ", treeNodeType="
				+ treeNodeType + ", parentNodeId=" + parentNodeId + ", url=" + url + ", position=" + position
				+ ", icon=" + icon + ", children=" + children + "]";
	}
}

LoginUser.hbm.xml(实体映射文件):

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
	<class name="com.zking.login.sys.model.LoginUser" table="t_sys_user">
		<id name="userid" type="java.lang.Long" column="user_id">
			<generator class="native"  /><!-- 由数据库管理自增长 -->
		</id>
		<property name="username" type="java.lang.String" column="username" />
		<property name="password" type="java.lang.String" column="password" />
		<property name="salt" type="java.lang.String" column="salt" />
		<property name="locked" type="java.lang.Integer" column="locked" insert="false" />
		<property name="createDatetime" type="java.sql.Timestamp" column="create_datetime" insert="false" update="false" />
	</class>
</hibernate-mapping>

ITreeNodeDao :

package com.zking.login.sys.dao;

import java.util.List;

import com.zking.login.sys.model.TreeNode;

public interface ITreeNodeDao {
	
	/**
	 * 查询所有一级节点
	 * @return
	 */
	 List<TreeNode> listBoots();

}

TreeNodeDAOimpl :

package com.zking.login.sys.dao.impl;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.zking.login.base.dao.BaseDao;
import com.zking.login.sys.dao.ITreeNodeDao;
import com.zking.login.sys.dao.IUserDao;
import com.zking.login.sys.model.LoginUser;
import com.zking.login.sys.model.TreeNode;

public class TreeNodeDAOimpl extends BaseDao implements ITreeNodeDao {

	
	/**
	 * 查询一级父节点
	 */
	@Override
	public List<TreeNode> listBoots() {
			String hql="from TreeNode u where u.parentNodeId is null";
			
			List<TreeNode> list = this.executeQuery(hql, null, null);
			for (TreeNode n : list) {
				this.initchildren(n);
			}
			
			return list;
	}
	
	//递归方法
	/**
	 * 自己算自己是否有子节点
	 * @param treeNode
	 */
	public void initchildren(TreeNode treeNode) {
		String hql = "from TreeNode u where u.parentNodeId = :pid ";
		Map<String, Object>  args = new HashMap<String, Object>();
		args.put("pid", treeNode.getTreeNodeId());
		
		List<TreeNode> children = this.executeQuery(hql, args, null);
		treeNode.setChildren(children);
		
		for(TreeNode n : children) {
			this.initchildren(n);
		}
		
	}

}

ITreeNodeService 源码:

package com.zking.login.sys.service;

import java.util.List;

import com.zking.login.sys.dao.ITreeNodeDao;
import com.zking.login.sys.model.TreeNode;

public interface ITreeNodeService {
	
	/**
	 * 查询所有的一级节点,但是会递归算法查找父节点子节点
	 * @return
	 */
	List<TreeNode> listRoots();
	

}

TreeNodeServiceimpl 源码:

package com.zking.login.sys.service.impl;

import java.util.List;

import com.zking.login.base.service.BaseService;
import com.zking.login.sys.dao.ITreeNodeDao;
import com.zking.login.sys.model.TreeNode;
import com.zking.login.sys.service.ITreeNodeService;

public class TreeNodeServiceimpl extends BaseService implements ITreeNodeService {

	private static final long serialVersionUID = 1L;
	
	private ITreeNodeDao treenodedao;
	
	public TreeNodeServiceimpl() {
	}
	public ITreeNodeDao getTreenodedao() {
		return treenodedao;
	}
	public void setTreenodedao(ITreeNodeDao treenodedao) {
		this.treenodedao = treenodedao;
	}
	@Override
	public List<TreeNode> listRoots() {
		return treenodedao.listBoots();
	}

	

}

TreeNodeAction 源码:

package com.zking.login.sys.action;

import java.util.ArrayList;
import java.util.List;

import com.opensymphony.xwork2.ModelDriven;
import com.zking.login.base.action.BaseAction;
import com.zking.login.sys.model.TreeNode;
import com.zking.login.sys.service.ITreeNodeService;
import com.zking.login.sys.util.JsonData;

public class TreeNodeAction extends BaseAction{
	
	private static final long serialVersionUID = 1L;

	ITreeNodeService treenodeService;
	
	public TreeNodeAction() {
		
	}
	public ITreeNodeService getTreenodeService() {
		return treenodeService;
	}
	public void setTreenodeService(ITreeNodeService treenodeService) {
		this.treenodeService = treenodeService;
	}


	public String Boots() {
		JsonData jsonData = new JsonData();
		
		List<TreeNode> list = treenodeService.listRoots();
		
		jsonData.setCode(0);
		jsonData.setMessage("菜单查询成功");
		jsonData.setResult(list);
		
		this.writeJson(jsonData);
		return null;
	}
	

}
Bas項目包:

在这里插入图片描述
DictModel源码:

package com.zking.login.bas.model;

import com.zking.login.base.model.BaseModel;

public class DictModel extends BaseModel  {

	private static final long serialVersionUID = 1L;
	
	private Long dictId;
	private String dictType;
	private String dictItem;
	
	private String dictValue;
	private Integer dictIsEditable;
	
	public DictModel() {
	}

	public Long getDictId() {
		return dictId;
	}

	public void setDictId(Long dictId) {
		this.dictId = dictId;
	}

	public String getDictType() {
		return dictType;
	}

	public void setDictType(String dictType) {
		this.dictType = dictType;
	}

	public String getDictItem() {
		return dictItem;
	}

	public void setDictItem(String dictItem) {
		this.dictItem = dictItem;
	}

	public String getDictValue() {
		return dictValue;
	}

	public void setDictValue(String dictValue) {
		this.dictValue = dictValue;
	}

	public Integer getDictIsEditable() {
		return dictIsEditable;
	}

	public void setDictIsEditable(Integer dictIsEditable) {
		this.dictIsEditable = dictIsEditable;
	}

	@Override
	public String toString() {
		return "DictModel [dictId=" + dictId + ", dictType=" + dictType + ", dictItem=" + dictItem + ", dictValue="
				+ dictValue + ", dictIsEditable=" + dictIsEditable + "]";
	}
}

DictModel.hbm.xml:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
	<class name="com.zking.login.bas.model.DictModel" table="t_bas_dict">
		<id name="dictId" type="java.lang.Long" column="dict_id">
			<generator class="native"  /><!-- 由数据库管理自增长 -->
		</id>
		<property name="dictType" type="java.lang.String" column="dict_type" />
		<property name="dictItem" type="java.lang.String" column="dict_item" />
		<property name="dictValue" type="java.lang.String" column="dict_value" />
		<property insert="false" name="dictIsEditable" type="java.lang.Integer" column="dict_is_editable"/>
	</class>
</hibernate-mapping>

IDictDao源码 :

package com.zking.login.bas.dao;

import java.util.List;

import com.zking.login.bas.model.DictModel;
import com.zking.login.base.util.PageBean;

public interface IDictDao {
	
	void add(DictModel dictModel);//增加
	
	void edit(DictModel dictModel);//修改
	
	void delete(DictModel dictModel);//删除
	
	void editdictIsEditable(DictModel dictModel);//修改状态
	
	DictModel load(DictModel dictModel);//查询单个
	
	List<DictModel> listToDictType(DictModel dictModel);//根据类型查询单个
	
	List<DictModel> list(DictModel dictModel,PageBean pageBean);//查询所有+模糊查询+分页
	

}

DictDaoimpl 源码:

package com.zking.login.bas.dao.impl;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.zking.login.bas.dao.IDictDao;
import com.zking.login.bas.model.DictModel;
import com.zking.login.base.dao.BaseDao;
import com.zking.login.base.util.PageBean;
import com.zking.login.sys.util.StringUtils;

import freemarker.template.utility.StringUtil;

public class DictDaoimpl extends BaseDao implements IDictDao {
	private static final long serialVersionUID = 1L;
	
	/**
	 * 添加字典
	 * 
	 */
	@Override
	public void add(DictModel dictModel) {
		this.getHibernateTemplate().save(dictModel);
	}
	/**
	 * 修改书本信息
	 */
	@Override
	public void edit(DictModel dictModel) {
		DictModel d = load(dictModel);
		if(d!=null) {
			d.setDictType(dictModel.getDictType());
			d.setDictItem(dictModel.getDictItem());
			d.setDictValue(dictModel.getDictValue());
		}
	}

	
	/**
	 * 修改状态,1可操作,0不可操作
	 */
	@Override
	public void editdictIsEditable(DictModel dictModel) {
		DictModel d = load(dictModel);
		System.out.println(d);
		if(null != d) {
			if(new Integer(0).equals(d.getDictIsEditable())) {
				d.setDictIsEditable(1);
			}else {
				d.setDictIsEditable(0);
			}
		}
		
	}
	/**
	 * 根据id删除数据
	 */
	@Override
	public void delete(DictModel dictModel) {
		DictModel d =load(dictModel);
		if(null != d) {
			this.getHibernateTemplate().delete(d);
		}
	}
	
	/**
	 * 单条数据查询字典
	 */
	@Override
	public DictModel load(DictModel dictModel) {
		DictModel d = this.getHibernateTemplate().get(DictModel.class, dictModel.getDictId());
		return d;
	}
	
	/**
	 * 查询所有数据
	 */
	@Override
	public List<DictModel> listToDictType(DictModel dictModel) {
		String hql="from DictModel d where d.dictType = :dictType";
		
		Map<String, Object> args = new HashMap<String, Object>();
		args.put("dictType", dictModel.getDictType());
		
		return this.executeQuery(hql, args, null);
	}

	@Override
	public List<DictModel> list(DictModel dictModel,PageBean pageBean) {
		String hql="from DictModel d where 1=1";
		Map<String, Object> args = new HashMap<String,Object>();
		if(StringUtils.isNotBlank(dictModel.getDictType())) {
			hql+=" and d.dictType like :dictType";
			args.put("dictType", "%"+dictModel.getDictType().trim()+"%");
		}
		return this.executeQuery(hql, args, pageBean);
	}
}

IDictService 源码:

package com.zking.login.bas.service;

import java.util.List;

import com.zking.login.bas.model.DictModel;
import com.zking.login.base.util.PageBean;

public interface IDictService {
	
	void add(DictModel dictModel);//增加
	
	void edit(DictModel dictModel);//修改
	
	void delete(DictModel dictModel);//删除
	
	void editdictIsEditable(DictModel dictModel);//修改状态
	
	DictModel load(DictModel dictModel);//查询单个
	
	List<DictModel> listToDictType(DictModel dictModel);//根据类型查询单个
	
	List<DictModel> list(DictModel dictModel,PageBean pageBean);//查询所有+模糊查询+分页
}

DictServiceimpl 源码:

package com.zking.login.bas.service.impl;

import java.util.List;

import com.zking.login.bas.dao.IDictDao;
import com.zking.login.bas.model.DictModel;
import com.zking.login.bas.service.IDictService;
import com.zking.login.base.service.BaseService;
import com.zking.login.base.util.PageBean;

public class DictServiceimpl extends BaseService implements IDictService{
	
	private IDictDao dictDao;
	
	public DictServiceimpl() {
	}
	public IDictDao getDictdao() {
		return dictDao;
	}
	public void setDictdao(IDictDao dictdao) {
		this.dictDao = dictdao;
	}

	@Override
	public void add(DictModel dictModel) {
		this.dictDao.add(dictModel);
	}
	@Override
	public void edit(DictModel dictModel) {
		this.dictDao.edit(dictModel);
	}

	@Override
	public void delete(DictModel dictModel) {
		this.dictDao.delete(dictModel);
	}

	@Override
	public DictModel load(DictModel dictModel) {
		return this.dictDao.load(dictModel);
	}

	@Override
	public List<DictModel> listToDictType(DictModel dictModel) {
		return this.dictDao.listToDictType(dictModel);
	}

	@Override
	public List<DictModel> list(DictModel dictModel, PageBean pageBean) {
		return this.dictDao.list(dictModel, pageBean);
	}
	
	@Override
	public void editdictIsEditable(DictModel dictModel) {
		this.dictDao.editdictIsEditable(dictModel);
	}
}

DictAction 源码:

package com.zking.login.bas.action;

import java.util.List;

import com.opensymphony.xwork2.ModelDriven;
import com.zking.login.bas.model.DictModel;
import com.zking.login.bas.service.IDictService;
import com.zking.login.base.action.BaseAction;
import com.zking.login.base.util.PageBean;
import com.zking.login.sys.model.LoginUser;
import com.zking.login.sys.util.JsonData;

public class DictAction extends BaseAction implements ModelDriven<DictModel>{
	
	private static final long serialVersionUID = 1L;
	
	private IDictService dictService;
	private DictModel dictModel = new DictModel();
	
	@Override
	public DictModel getModel() {
		return dictModel;
	}
	
	public DictAction() {
	}
	public IDictService getDictService() {
		return dictService;
	}
	public void setDictService(IDictService dictService) {
		this.dictService = dictService;
	}
	public String list() {
		JsonData jsondata = new JsonData();
		PageBean pageBean = new PageBean();
		pageBean.setRequest(this.request);//把分页发送到前端
		List<DictModel> list = dictService.list(dictModel, pageBean);
		if(null!=list) {
			jsondata.setCode(0);
			jsondata.setMessage("查询成功");
			jsondata.setResult(list);
			
			//jsondata是以Map存储方式来存放值的(key,value)
			jsondata.put("page", pageBean.getPage());
			jsondata.put("rows", pageBean.getRows());
			jsondata.put("total", pageBean.getTotal());
		}
		this.writeJson(jsondata);
		return null;
		
	}
	
	public String editdictIsEditable() {
		dictService.editdictIsEditable(dictModel);
		JsonData jsondata = new JsonData();
		jsondata.setCode(0);
		jsondata.setMessage("字典状态改变成功");
		this.writeJson(jsondata);
		
		return null;
		
	}
	
	public String del() {
		dictService.delete(dictModel);
		JsonData jsondata = new JsonData();
			jsondata.setCode(0);
			jsondata.setMessage("删除成功");
		this.writeJson(jsondata);
		
		return null;
		
	}
	
	
	public String merge() {
		JsonData jsondata = new JsonData();
		if(null == dictModel.getDictId()) {
			this.dictService.add(dictModel);
			jsondata.setCode(0);
			jsondata.setMessage("增加成功");
		}else {
			this.dictService.edit(dictModel);
			jsondata.setCode(0);
			jsondata.setMessage("修改成功");
		}
		this.writeJson(jsondata);
		
		return null;
		
	}
}

4.前端Vue+Element-UI源代码:

main.js:

// The Vue build version to load with the `import` command
// (runtime-only or standalone) has been set in webpack.base.conf with an alias.
import Vue from 'vue'

//开发环境下才会引入mockjs
//process.env.MOCK && require('@/mock')

import ElementUI from 'element-ui' //新添加1
import 'element-ui/lib/theme-chalk/index.css' //新添加2,避免后期打包样式不同,要放在import App from './App';之前
import App from './App'
import router from './router'


import axios  from '@/api/http'
import VueAxios from 'vue-axios'
Vue.use(VueAxios,axios)


Vue.use(ElementUI)   //新添加3
Vue.config.productionTip = false

/* eslint-disable no-new */
new Vue({
  el: '#app',
  router,
  data:{
      //自定义的事件总线对象,用于父子组件的通信
      		Bus: new Vue()
  },
  components: {
    App
  },
  template: '<App/>'
})


export default axios;

App.vue:

<template>
  <div id="app">
    <router-view/>
  </div>
</template>

<script>
export default {
  name:'App'
}
</script>

<style>
#app {
  font-family: 'Avenir', Helvetica, Arial, sans-serif;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
/*  text-align: center;
  color: #2c3e50;
  margin-top: 60px; */
}
</style>

index.js:

import Vue from 'vue'
import Router from 'vue-router'
import Login from '@/views/Login'
import Main from '@/views/Main'
import AppMain from '@/sys/AppMain'//动态树页面
import User from '@/sys/User'//动态树子用户页面
import Uilr from '@/bas/Uilr'//动态树子字典页面
import Role from '@/sys/Role'//动态树子会员页面



Vue.use(Router)

export default new Router({
  routes: [
		{
			path: '/',
			name: 'Main',
			component: Main
		},
		{
			path: '/Login',
			name: 'Login',
			component: Login
		},
		{
			path: '/AppMain',
			name: 'AppMain',
			component: AppMain,
      children:[
        {
          path: 'Uilr',
          name: 'Uilr',
          component: Uilr
      },{
          path: 'User',
          name: 'User',
          component: User
      },{
          path: 'Role',
          name: 'Role',
          component: Role
      }]
		}]
})

登陆页面Login.vue:

<template>
	<div>
		<el-form class="demo-ruleForm login-container">
      <el-form-item style="text-align: center;"><h1>后台登陆</h1></el-form-item >
		  <el-form-item >
		    <el-input type="text" v-model="user.username"  placeholder="账号"></el-input>
		  </el-form-item>
		  <el-form-item >
		    <el-input type="password" v-model="user.password"  placeholder="密码"></el-input>
		  </el-form-item>
		    <el-button type="primary" style="position: absolute;" @click="dofh()">返回上一及</el-button>
        <el-button type="warning" style="display:block;margin:0 auto"  @click="douser()">登陸</el-button>
        <router-link class="register"  to="">快速注册</router-link>
		</el-form>
	</div>
</template>

<script>
	import axios from 'axios'
	import qs from 'qs'

	export default {
    name:'Login',
		data:function(){
			return {
			  user:{
				  username:null,
				  password:null
			  }
		}
	},
	methods:{
		douser:function(){
			let url = this.axios.urls.SYS_USER_LOGIN;
			console.log("url=%s"+url);
			//let params = this.user;
		/* axios.get(url, {//注意数据是保存到json对象的params属性
				params: params//属性
				  }).then((response)=> {//符号函数
					console.log(response);  this.$message('这是一条消息提示');
				  }).catch((error)=>  {
					console.log(error);
				  });
		}, */
		 this.axios.post(url, this.user).then((response)=> {//注意数据是保存到json对象
						if(response.data.code == 0){
							 this.$message(response.data.message),
              /* this.$message('恭喜你,这是一条成功消息') */
							 this.$router.push('/AppMain')
						}else{
							this.$message.error('错了哦,这是一条错误消息')
						}
				  }).catch((error)=>  {
					console.log(error);
				  });
		},
		dofh:function(){
			this.$router.go(-1);
		}
	}
}
</script>

<style>
  .register{
      display: block;
      text-align: center;
      text-decoration: none;
  }
	.login-wrap {
		box-sizing: border-box;
		width: 100%;
		height: 100%;
		padding-top: 10%;
		background-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+Cjxzdmcgd2lkdGg9IjEzNjFweCIgaGVpZ2h0PSI2MDlweCIgdmlld0JveD0iMCAwIDEzNjEgNjA5IiB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPgogICAgPCEtLSBHZW5lcmF0b3I6IFNrZXRjaCA0Ni4yICg0NDQ5NikgLSBodHRwOi8vd3d3LmJvaGVtaWFuY29kaW5nLmNvbS9za2V0Y2ggLS0+CiAgICA8dGl0bGU+R3JvdXAgMjE8L3RpdGxlPgogICAgPGRlc2M+Q3JlYXRlZCB3aXRoIFNrZXRjaC48L2Rlc2M+CiAgICA8ZGVmcz48L2RlZnM+CiAgICA8ZyBpZD0iQW50LURlc2lnbi1Qcm8tMy4wIiBzdHJva2U9Im5vbmUiIHN0cm9rZS13aWR0aD0iMSIgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIj4KICAgICAgICA8ZyBpZD0i6LSm5oi35a+G56CB55m75b2VLeagoemqjCIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTc5LjAwMDAwMCwgLTgyLjAwMDAwMCkiPgogICAgICAgICAgICA8ZyBpZD0iR3JvdXAtMjEiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDc3LjAwMDAwMCwgNzMuMDAwMDAwKSI+CiAgICAgICAgICAgICAgICA8ZyBpZD0iR3JvdXAtMTgiIG9wYWNpdHk9IjAuOCIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoNzQuOTAxNDE2LCA1NjkuNjk5MTU4KSByb3RhdGUoLTcuMDAwMDAwKSB0cmFuc2xhdGUoLTc0LjkwMTQxNiwgLTU2OS42OTkxNTgpIHRyYW5zbGF0ZSg0LjkwMTQxNiwgNTI1LjE5OTE1OCkiPgogICAgICAgICAgICAgICAgICAgIDxlbGxpcHNlIGlkPSJPdmFsLTExIiBmaWxsPSIjQ0ZEQUU2IiBvcGFjaXR5PSIwLjI1IiBjeD0iNjMuNTc0ODc5MiIgY3k9IjMyLjQ2ODM2NyIgcng9IjIxLjc4MzA0NzkiIHJ5PSIyMS43NjYwMDgiPjwvZWxsaXBzZT4KICAgICAgICAgICAgICAgICAgICA8ZWxsaXBzZSBpZD0iT3ZhbC0zIiBmaWxsPSIjQ0ZEQUU2IiBvcGFjaXR5PSIwLjU5OTk5OTk2NCIgY3g9IjUuOTg3NDY0NzkiIGN5PSIxMy44NjY4NjAxIiByeD0iNS4yMTczOTEzIiByeT0iNS4yMTMzMDk5NyI+PC9lbGxpcHNlPgogICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik0zOC4xMzU0NTE0LDg4LjM1MjAyMTUgQzQzLjg5ODQyMjcsODguMzUyMDIxNSA0OC41NzAyMzQsODMuNjgzODY0NyA0OC41NzAyMzQsNzcuOTI1NDAxNSBDNDguNTcwMjM0LDcyLjE2NjkzODMgNDMuODk4NDIyNyw2Ny40OTg3ODE2IDM4LjEzNTQ1MTQsNjcuNDk4NzgxNiBDMzIuMzcyNDgwMSw2Ny40OTg3ODE2IDI3LjcwMDY2ODgsNzIuMTY2OTM4MyAyNy43MDA2Njg4LDc3LjkyNTQwMTUgQzI3LjcwMDY2ODgsODMuNjgzODY0NyAzMi4zNzI0ODAxLDg4LjM1MjAyMTUgMzguMTM1NDUxNCw4OC4zNTIwMjE1IFoiIGlkPSJPdmFsLTMtQ29weSIgZmlsbD0iI0NGREFFNiIgb3BhY2l0eT0iMC40NSI+PC9wYXRoPgogICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik02NC4yNzc1NTgyLDMzLjE3MDQ5NjMgTDExOS4xODU4MzYsMTYuNTY1NDkxNSIgaWQ9IlBhdGgtMTIiIHN0cm9rZT0iI0NGREFFNiIgc3Ryb2tlLXdpZHRoPSIxLjczOTEzMDQzIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiPjwvcGF0aD4KICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNNDIuMTQzMTcwOCwyNi41MDAyNjgxIEw3LjcxMTkwMTYyLDE0LjU2NDA3MDIiIGlkPSJQYXRoLTE2IiBzdHJva2U9IiNFMEI0QjciIHN0cm9rZS13aWR0aD0iMC43MDI2Nzg5NjQiIG9wYWNpdHk9IjAuNyIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiBzdHJva2UtZGFzaGFycmF5PSIxLjQwNTM1Nzg5OTg3MzE1MywyLjEwODAzNjk1MzQ2OTk4MSI+PC9wYXRoPgogICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik02My45MjYyMTg3LDMzLjUyMTU2MSBMNDMuNjcyMTMyNiw2OS4zMjUwOTUxIiBpZD0iUGF0aC0xNSIgc3Ryb2tlPSIjQkFDQUQ5IiBzdHJva2Utd2lkdGg9IjAuNzAyNjc4OTY0IiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIHN0cm9rZS1kYXNoYXJyYXk9IjEuNDA1MzU3ODk5ODczMTUzLDIuMTA4MDM2OTUzNDY5OTgxIj48L3BhdGg+CiAgICAgICAgICAgICAgICAgICAgPGcgaWQ9Ikdyb3VwLTE3IiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxMjYuODUwOTIyLCAxMy41NDM2NTQpIHJvdGF0ZSgzMC4wMDAwMDApIHRyYW5zbGF0ZSgtMTI2Ljg1MDkyMiwgLTEzLjU0MzY1NCkgdHJhbnNsYXRlKDExNy4yODU3MDUsIDQuMzgxODg5KSIgZmlsbD0iI0NGREFFNiI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxlbGxpcHNlIGlkPSJPdmFsLTQiIG9wYWNpdHk9IjAuNDUiIGN4PSI5LjEzNDgyNjUzIiBjeT0iOS4xMjc2ODA3NiIgcng9IjkuMTM0ODI2NTMiIHJ5PSI5LjEyNzY4MDc2Ij48L2VsbGlwc2U+CiAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik0xOC4yNjk2NTMxLDE4LjI1NTM2MTUgQzE4LjI2OTY1MzEsMTMuMjE0MjgyNiAxNC4xNzk4NTE5LDkuMTI3NjgwNzYgOS4xMzQ4MjY1Myw5LjEyNzY4MDc2IEM0LjA4OTgwMTE0LDkuMTI3NjgwNzYgMCwxMy4yMTQyODI2IDAsMTguMjU1MzYxNSBMMTguMjY5NjUzMSwxOC4yNTUzNjE1IFoiIGlkPSJPdmFsLTQiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDkuMTM0ODI3LCAxMy42OTE1MjEpIHNjYWxlKC0xLCAtMSkgdHJhbnNsYXRlKC05LjEzNDgyNywgLTEzLjY5MTUyMSkgIj48L3BhdGg+CiAgICAgICAgICAgICAgICAgICAgPC9nPgogICAgICAgICAgICAgICAgPC9nPgogICAgICAgICAgICAgICAgPGcgaWQ9Ikdyb3VwLTE0IiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgyMTYuMjk0NzAwLCAxMjMuNzI1NjAwKSByb3RhdGUoLTUuMDAwMDAwKSB0cmFuc2xhdGUoLTIxNi4yOTQ3MDAsIC0xMjMuNzI1NjAwKSB0cmFuc2xhdGUoMTA2LjI5NDcwMCwgMzUuMjI1NjAwKSI+CiAgICAgICAgICAgICAgICAgICAgPGVsbGlwc2UgaWQ9Ik92YWwtMiIgZmlsbD0iI0NGREFFNiIgb3BhY2l0eT0iMC4yNSIgY3g9IjI5LjExNzY0NzEiIGN5PSIyOS4xNDAyNDM5IiByeD0iMjkuMTE3NjQ3MSIgcnk9IjI5LjE0MDI0MzkiPjwvZWxsaXBzZT4KICAgICAgICAgICAgICAgICAgICA8ZWxsaXBzZSBpZD0iT3ZhbC0yIiBmaWxsPSIjQ0ZEQUU2IiBvcGFjaXR5PSIwLjMiIGN4PSIyOS4xMTc2NDcxIiBjeT0iMjkuMTQwMjQzOSIgcng9IjIxLjU2ODYyNzUiIHJ5PSIyMS41ODUzNjU5Ij48L2VsbGlwc2U+CiAgICAgICAgICAgICAgICAgICAgPGVsbGlwc2UgaWQ9Ik92YWwtMi1Db3B5IiBzdHJva2U9IiNDRkRBRTYiIG9wYWNpdHk9IjAuNCIgY3g9IjE3OS4wMTk2MDgiIGN5PSIxMzguMTQ2MzQxIiByeD0iMjMuNzI1NDkwMiIgcnk9IjIzLjc0MzkwMjQiPjwvZWxsaXBzZT4KICAgICAgICAgICAgICAgICAgICA8ZWxsaXBzZSBpZD0iT3ZhbC0yIiBmaWxsPSIjQkFDQUQ5IiBvcGFjaXR5PSIwLjUiIGN4PSIyOS4xMTc2NDcxIiBjeT0iMjkuMTQwMjQzOSIgcng9IjEwLjc4NDMxMzciIHJ5PSIxMC43OTI2ODI5Ij48L2VsbGlwc2U+CiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTTI5LjExNzY0NzEsMzkuOTMyOTI2OCBMMjkuMTE3NjQ3MSwxOC4zNDc1NjEgQzIzLjE2MTYzNTEsMTguMzQ3NTYxIDE4LjMzMzMzMzMsMjMuMTc5NjA5NyAxOC4zMzMzMzMzLDI5LjE0MDI0MzkgQzE4LjMzMzMzMzMsMzUuMTAwODc4MSAyMy4xNjE2MzUxLDM5LjkzMjkyNjggMjkuMTE3NjQ3MSwzOS45MzI5MjY4IFoiIGlkPSJPdmFsLTIiIGZpbGw9IiNCQUNBRDkiPjwvcGF0aD4KICAgICAgICAgICAgICAgICAgICA8ZyBpZD0iR3JvdXAtOSIgb3BhY2l0eT0iMC40NSIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMTcyLjAwMDAwMCwgMTMxLjAwMDAwMCkiIGZpbGw9IiNFNkExQTYiPgogICAgICAgICAgICAgICAgICAgICAgICA8ZWxsaXBzZSBpZD0iT3ZhbC0yLUNvcHktMiIgY3g9IjcuMDE5NjA3ODQiIGN5PSI3LjE0NjM0MTQ2IiByeD0iNi40NzA1ODgyNCIgcnk9IjYuNDc1NjA5NzYiPjwvZWxsaXBzZT4KICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTTAuNTQ5MDE5NjA4LDEzLjYyMTk1MTIgQzQuMTIyNjI2ODEsMTMuNjIxOTUxMiA3LjAxOTYwNzg0LDEwLjcyMjcyMiA3LjAxOTYwNzg0LDcuMTQ2MzQxNDYgQzcuMDE5NjA3ODQsMy41Njk5NjA5NSA0LjEyMjYyNjgxLDAuNjcwNzMxNzA3IDAuNTQ5MDE5NjA4LDAuNjcwNzMxNzA3IEwwLjU0OTAxOTYwOCwxMy42MjE5NTEyIFoiIGlkPSJPdmFsLTItQ29weS0yIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgzLjc4NDMxNCwgNy4xNDYzNDEpIHNjYWxlKC0xLCAxKSB0cmFuc2xhdGUoLTMuNzg0MzE0LCAtNy4xNDYzNDEpICI+PC9wYXRoPgogICAgICAgICAgICAgICAgICAgIDwvZz4KICAgICAgICAgICAgICAgICAgICA8ZWxsaXBzZSBpZD0iT3ZhbC0xMCIgZmlsbD0iI0NGREFFNiIgY3g9IjIxOC4zODIzNTMiIGN5PSIxMzguNjg1OTc2IiByeD0iMS42MTc2NDcwNiIgcnk9IjEuNjE4OTAyNDQiPjwvZWxsaXBzZT4KICAgICAgICAgICAgICAgICAgICA8ZWxsaXBzZSBpZD0iT3ZhbC0xMC1Db3B5LTIiIGZpbGw9IiNFMEI0QjciIG9wYWNpdHk9IjAuMzUiIGN4PSIxNzkuNTU4ODI0IiBjeT0iMTc1LjM4MTA5OCIgcng9IjEuNjE3NjQ3MDYiIHJ5PSIxLjYxODkwMjQ0Ij48L2VsbGlwc2U+CiAgICAgICAgICAgICAgICAgICAgPGVsbGlwc2UgaWQ9Ik92YWwtMTAtQ29weSIgZmlsbD0iI0UwQjRCNyIgb3BhY2l0eT0iMC4zNSIgY3g9IjE4MC4wOTgwMzkiIGN5PSIxMDIuNTMwNDg4IiByeD0iMi4xNTY4NjI3NSIgcnk9IjIuMTU4NTM2NTkiPjwvZWxsaXBzZT4KICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNMjguOTk4NTM4MSwyOS45NjcxNTk4IEwxNzEuMTUxMDE4LDEzMi44NzYwMjQiIGlkPSJQYXRoLTExIiBzdHJva2U9IiNDRkRBRTYiIG9wYWNpdHk9IjAuOCI+PC9wYXRoPgogICAgICAgICAgICAgICAgPC9nPgogICAgICAgICAgICAgICAgPGcgaWQ9Ikdyb3VwLTEwIiBvcGFjaXR5PSIwLjc5OTk5OTk1MiIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMTA1NC4xMDA2MzUsIDM2LjY1OTMxNykgcm90YXRlKC0xMS4wMDAwMDApIHRyYW5zbGF0ZSgtMTA1NC4xMDA2MzUsIC0zNi42NTkzMTcpIHRyYW5zbGF0ZSgxMDI2LjYwMDYzNSwgNC42NTkzMTcpIj4KICAgICAgICAgICAgICAgICAgICA8ZWxsaXBzZSBpZD0iT3ZhbC03IiBzdHJva2U9IiNDRkRBRTYiIHN0cm9rZS13aWR0aD0iMC45NDExNzY0NzEiIGN4PSI0My44MTM1NTkzIiBjeT0iMzIiIHJ4PSIxMS4xODY0NDA3IiByeT0iMTEuMjk0MTE3NiI+PC9lbGxpcHNlPgogICAgICAgICAgICAgICAgICAgIDxnIGlkPSJHcm91cC0xMiIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMzQuNTk2Nzc0LCAyMy4xMTExMTEpIiBmaWxsPSIjQkFDQUQ5Ij4KICAgICAgICAgICAgICAgICAgICAgICAgPGVsbGlwc2UgaWQ9Ik92YWwtNyIgb3BhY2l0eT0iMC40NSIgY3g9IjkuMTg1MzQ3MTgiIGN5PSI4Ljg4ODg4ODg5IiByeD0iOC40NzQ1NzYyNyIgcnk9IjguNTU2MTQ5NzMiPjwvZWxsaXBzZT4KICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTTkuMTg1MzQ3MTgsMTcuNDQ1MDM4NiBDMTMuODY1NzI2NCwxNy40NDUwMzg2IDE3LjY1OTkyMzUsMTMuNjE0MzE5OSAxNy42NTk5MjM1LDguODg4ODg4ODkgQzE3LjY1OTkyMzUsNC4xNjM0NTc4NyAxMy44NjU3MjY0LDAuMzMyNzM5MTU2IDkuMTg1MzQ3MTgsMC4zMzI3MzkxNTYgTDkuMTg1MzQ3MTgsMTcuNDQ1MDM4NiBaIiBpZD0iT3ZhbC03Ij48L3BhdGg+CiAgICAgICAgICAgICAgICAgICAgPC9nPgogICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik0zNC42NTk3Mzg1LDI0LjgwOTY5NCBMNS43MTY2NjA4NCw0Ljc2ODc4OTQ1IiBpZD0iUGF0aC0yIiBzdHJva2U9IiNDRkRBRTYiIHN0cm9rZS13aWR0aD0iMC45NDExNzY0NzEiPjwvcGF0aD4KICAgICAgICAgICAgICAgICAgICA8ZWxsaXBzZSBpZD0iT3ZhbCIgc3Ryb2tlPSIjQ0ZEQUU2IiBzdHJva2Utd2lkdGg9IjAuOTQxMTc2NDcxIiBjeD0iMy4yNjI3MTE4NiIgY3k9IjMuMjk0MTE3NjUiIHJ4PSIzLjI2MjcxMTg2IiByeT0iMy4yOTQxMTc2NSI+PC9lbGxpcHNlPgogICAgICAgICAgICAgICAgICAgIDxlbGxpcHNlIGlkPSJPdmFsLUNvcHkiIGZpbGw9IiNGN0UxQUQiIGN4PSIyLjc5NjYxMDE3IiBjeT0iNjEuMTc2NDcwNiIgcng9IjIuNzk2NjEwMTciIHJ5PSIyLjgyMzUyOTQxIj48L2VsbGlwc2U+CiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTTM0LjYzMTI0NDMsMzkuMjkyMjcxMiBMNS4wNjM2NjY2Myw1OS43ODUwODIiIGlkPSJQYXRoLTEwIiBzdHJva2U9IiNDRkRBRTYiIHN0cm9rZS13aWR0aD0iMC45NDExNzY0NzEiPjwvcGF0aD4KICAgICAgICAgICAgICAgIDwvZz4KICAgICAgICAgICAgICAgIDxnIGlkPSJHcm91cC0xOSIgb3BhY2l0eT0iMC4zMyIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMTI4Mi41MzcyMTksIDQ0Ni41MDI4NjcpIHJvdGF0ZSgtMTAuMDAwMDAwKSB0cmFuc2xhdGUoLTEyODIuNTM3MjE5LCAtNDQ2LjUwMjg2NykgdHJhbnNsYXRlKDExNDIuNTM3MjE5LCAzMjcuNTAyODY3KSI+CiAgICAgICAgICAgICAgICAgICAgPGcgaWQ9Ikdyb3VwLTE3IiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxNDEuMzMzNTM5LCAxMDQuNTAyNzQyKSByb3RhdGUoMjc1LjAwMDAwMCkgdHJhbnNsYXRlKC0xNDEuMzMzNTM5LCAtMTA0LjUwMjc0MikgdHJhbnNsYXRlKDEyOS4zMzM1MzksIDkyLjUwMjc0MikiIGZpbGw9IiNCQUNBRDkiPgogICAgICAgICAgICAgICAgICAgICAgICA8Y2lyY2xlIGlkPSJPdmFsLTQiIG9wYWNpdHk9IjAuNDUiIGN4PSIxMS42NjY2NjY3IiBjeT0iMTEuNjY2NjY2NyIgcj0iMTEuNjY2NjY2NyI+PC9jaXJjbGU+CiAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik0yMy4zMzMzMzMzLDIzLjMzMzMzMzMgQzIzLjMzMzMzMzMsMTYuODkwMDExMyAxOC4xMDk5ODg3LDExLjY2NjY2NjcgMTEuNjY2NjY2NywxMS42NjY2NjY3IEM1LjIyMzM0NDU5LDExLjY2NjY2NjcgMCwxNi44OTAwMTEzIDAsMjMuMzMzMzMzMyBMMjMuMzMzMzMzMywyMy4zMzMzMzMzIFoiIGlkPSJPdmFsLTQiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDExLjY2NjY2NywgMTcuNTAwMDAwKSBzY2FsZSgtMSwgLTEpIHRyYW5zbGF0ZSgtMTEuNjY2NjY3LCAtMTcuNTAwMDAwKSAiPjwvcGF0aD4KICAgICAgICAgICAgICAgICAgICA8L2c+CiAgICAgICAgICAgICAgICAgICAgPGNpcmNsZSBpZD0iT3ZhbC01LUNvcHktNiIgZmlsbD0iI0NGREFFNiIgY3g9IjIwMS44MzMzMzMiIGN5PSI4Ny41IiByPSI1LjgzMzMzMzMzIj48L2NpcmNsZT4KICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNMTQzLjUsODguODEyNjY4NSBMMTU1LjA3MDUwMSwxNy42MDM4NTQ0IiBpZD0iUGF0aC0xNyIgc3Ryb2tlPSIjQkFDQUQ5IiBzdHJva2Utd2lkdGg9IjEuMTY2NjY2NjciPjwvcGF0aD4KICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNMTcuNSwzNy4zMzMzMzMzIEwxMjcuNDY2MjUyLDk3LjY0NDk3MzUiIGlkPSJQYXRoLTE4IiBzdHJva2U9IiNCQUNBRDkiIHN0cm9rZS13aWR0aD0iMS4xNjY2NjY2NyI+PC9wYXRoPgogICAgICAgICAgICAgICAgICAgIDxwb2x5bGluZSBpZD0iUGF0aC0xOSIgc3Ryb2tlPSIjQ0ZEQUU2IiBzdHJva2Utd2lkdGg9IjEuMTY2NjY2NjciIHBvaW50cz0iMTQzLjkwMjU5NyAxMjAuMzAyMjgxIDE3NC45MzU0NTUgMjMxLjU3MTM0MiAzOC41IDE0Ny41MTA4NDcgMTI2LjM2Njk0MSAxMTAuODMzMzMzIj48L3BvbHlsaW5lPgogICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik0xNTkuODMzMzMzLDk5Ljc0NTM4NDIgTDE5NS40MTY2NjcsODkuMjUiIGlkPSJQYXRoLTIwIiBzdHJva2U9IiNFMEI0QjciIHN0cm9rZS13aWR0aD0iMS4xNjY2NjY2NyIgb3BhY2l0eT0iMC42Ij48L3BhdGg+CiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTTIwNS4zMzMzMzMsODIuMTM3MjEwNSBMMjM4LjcxOTQwNiwzNi4xNjY2NjY3IiBpZD0iUGF0aC0yNCIgc3Ryb2tlPSIjQkFDQUQ5IiBzdHJva2Utd2lkdGg9IjEuMTY2NjY2NjciPjwvcGF0aD4KICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNMjY2LjcyMzQyNCwxMzIuMjMxOTg4IEwyMDcuMDgzMzMzLDkwLjQxNjY2NjciIGlkPSJQYXRoLTI1IiBzdHJva2U9IiNDRkRBRTYiIHN0cm9rZS13aWR0aD0iMS4xNjY2NjY2NyI+PC9wYXRoPgogICAgICAgICAgICAgICAgICAgIDxjaXJjbGUgaWQ9Ik92YWwtNSIgZmlsbD0iI0MxRDFFMCIgY3g9IjE1Ni45MTY2NjciIGN5PSI4Ljc1IiByPSI4Ljc1Ij48L2NpcmNsZT4KICAgICAgICAgICAgICAgICAgICA8Y2lyY2xlIGlkPSJPdmFsLTUtQ29weS0zIiBmaWxsPSIjQzFEMUUwIiBjeD0iMzkuMDgzMzMzMyIgY3k9IjE0OC43NSIgcj0iNS4yNSI+PC9jaXJjbGU+CiAgICAgICAgICAgICAgICAgICAgPGNpcmNsZSBpZD0iT3ZhbC01LUNvcHktMiIgZmlsbC1vcGFjaXR5PSIwLjYiIGZpbGw9IiNEMURFRUQiIGN4PSI4Ljc1IiBjeT0iMzMuMjUiIHI9IjguNzUiPjwvY2lyY2xlPgogICAgICAgICAgICAgICAgICAgIDxjaXJjbGUgaWQ9Ik92YWwtNS1Db3B5LTQiIGZpbGwtb3BhY2l0eT0iMC42IiBmaWxsPSIjRDFERUVEIiBjeD0iMjQzLjgzMzMzMyIgY3k9IjMwLjMzMzMzMzMiIHI9IjUuODMzMzMzMzMiPjwvY2lyY2xlPgogICAgICAgICAgICAgICAgICAgIDxjaXJjbGUgaWQ9Ik92YWwtNS1Db3B5LTUiIGZpbGw9IiNFMEI0QjciIGN4PSIxNzUuNTgzMzMzIiBjeT0iMjMyLjc1IiByPSI1LjI1Ij48L2NpcmNsZT4KICAgICAgICAgICAgICAgIDwvZz4KICAgICAgICAgICAgPC9nPgogICAgICAgIDwvZz4KICAgIDwvZz4KPC9zdmc+);
		/* background-color: #112346; */
		background-repeat: no-repeat;
		background-position: center right;
		background-size: 100%;
	}

	.login-container {
		border-radius: 10px;
		margin: 0px auto;
		width: 350px;
		padding: 30px 35px 15px 35px;
		background: #fff;
		border: 1px solid #eaeaea;
		text-align: left;
		box-shadow: 0 0 20px 2px rgba(0, 0, 0, 0.1);
	}

	.title {
		margin: 0px auto 40px auto;
		text-align: center;
		color: #505458;
	}
	.hhh{
		margin-bottom: center;
	}
</style>

前后端接口文件:
在这里插入图片描述

action.js

/**
 * 对后台请求的地址的封装,URL格式如下:
 * 模块名_实体名_操作
 */
export default {
	//服务器
	'SERVER': 'http://localhost:8080/vueSPA',

	//用户管理
	'SYS_USER_LOGIN': '/sys/userAction.action', //登陆
	/* 'SYS_USER_DOREG': '/sys/userAction_doReg.action', //注册
	'SYS_USER_LIST': '/sys/userAction_list.action', //用户查询
	'SYS_USER_DORESETPWD': '/sys/userAction_doResetPwd.action', //重置密码 */

	//文章管理
	'SYS_ARTICLES_ADD': '/sys/articlesAction_add.action',
	'SYS_ARTICLES_EDIT': '/sys/articlesAction_edit.action',
	'SYS_ARTICLES_DEL': '/sys/articlesAction_del.action',
	'SYS_ARTICLES_LOAD': '/sys/articlesAction_load.action',
	'SYS_ARTICLES_LIST': '/sys/articlesAction_list.action',

	//菜单管理
	'SYS_TREENODE_BOOTS': '/sys/TreeNodeAction_Boots.action',//动态树action
  //文章管理
  'BAS_UILR_LIST': '/bas/dictAction_list.action',
  //字典状态
  'BAS_UILR_UPDICTISEDITABLE': '/bas/dictAction_editdictIsEditable.action',
  //修改状态
  'BAS_UILR_MERGE': '/bas/dictAction_merge.action',
  //删除状态
  'BAS_UILR_DEL': '/bas/dictAction_del.action',

	//获得请求的完整地址,用于mockjs测试时使用
	'getFullPath': k => {
		return this.SERVER + this[k];
	}
}

http.js

/**
 * vue项目对axios的全局配置
 */
import axios from 'axios'
import qs from 'qs'

//引入action模块,并添加至axios的类属性urls上
import action from '@/api/action'
axios.urls = action

// axios默认配置
axios.defaults.timeout = 10000; // 超时时间
// axios.defaults.baseURL = 'http://localhost:8080/j2ee15'; // 默认地址
axios.defaults.baseURL = action.SERVER;

//整理数据
// 只适用于 POST,PUT,PATCH,transformRequest` 允许在向服务器发送前,修改请求数据
axios.defaults.transformRequest = function(data) {
	data = qs.stringify(data);
	return data;
};


// 请求拦截器
axios.interceptors.request.use(function(config) {
	return config;
}, function(error) {
	return Promise.reject(error);
});

// 响应拦截器
axios.interceptors.response.use(function(response) {
	return response;
}, function(error) {
	return Promise.reject(error);
});

// // 路由请求拦截
// // http request 拦截器
// axios.interceptors.request.use(
// 	config => {
// 		//config.data = JSON.stringify(config.data);  
// 		//config.headers['Content-Type'] = 'application/json;charset=UTF-8';
// 		//config.headers['Token'] = 'abcxyz';
// 		//判断是否存在ticket,如果存在的话,则每个http header都加上ticket
// 		// if (cookie.get("token")) {
// 		// 	//用户每次操作,都将cookie设置成2小时
// 		// 	cookie.set("token", cookie.get("token"), 1 / 12)
// 		// 	cookie.set("name", cookie.get("name"), 1 / 12)
// 		// 	config.headers.token = cookie.get("token");
// 		// 	config.headers.name = cookie.get("name");
// 		// }
// 		return config;
// 	},
// 	error => {
// 		return Promise.reject(error.response);
// 	});

// // 路由响应拦截
// // http response 拦截器
// axios.interceptors.response.use(
// 	response => {
// 		if (response.data.resultCode == "404") {
// 			console.log("response.data.resultCode是404")
// 			// 返回 错误代码-1 清除ticket信息并跳转到登录页面
// 			//      cookie.del("ticket")
// 			//      window.location.href='http://login.com'
// 			return
// 		} else {
// 			return response;
// 		}
// 	},
// 	error => {
// 		return Promise.reject(error.response) // 返回接口返回的错误信息
// 	});



export default axios;

后台模块主页面AppMain.vue:

<template>
	<el-container class="main-container">
		<el-aside :class="asideClass">
			<LeftNav></LeftNav>
		</el-aside>
		<el-container>
			<el-header class="main-header">
				<TopNav></TopNav>
			</el-header>
			<el-main class="main-center">
          <router-view></router-view><!-- 显示左菜单点击后的指定内容 -->
      </el-main>
		</el-container>
	</el-container>
</template>

<script>
	// 导入组件
	import TopNav from '@/sys/TopNav.vue'
	import LeftNav from '@/sys/LeftNav.vue'

	// 导出模块
	export default {
        name:'AppMain',
        data:function(){
          return{
            ts:new Date().getTime(),
            asideClass:'main-aside'//左菜单样式
          }
         },
         methods:{},
         components:{
              TopNav,
              LeftNav
         },
         created:function(){//加入页面加载函数
            this.$root.Bus.$on("aside-toggle",(collapsed) => {//点击上菜单按钮触发左菜单样式
                if(collapsed){
                     setTimeout(() => {
                       this.asideClass='main-aside-collapsed';
                     },300)
                }else{
                    this.asideClass = 'main-aside';
                }
            });
         }
	};
</script>
<style >
	.main-container {
			height: 1300px;
			width: 100%;
			box-sizing: border-box;
		}

		.main-aside-collapsed { /* 左菜单收缩样式 */
			/* 在CSS中,通过对某一样式声明! important ,可以更改默认的CSS样式优先级规则,使该条样式属性声明具有最高优先级 */
			width: 64px !important;
			height: 100%;
			background-color: #334157;
			margin: 0px;
		}

		.main-aside { /* 左菜单展开样式 */
			width: 240px !important;
			height: 100%;
			background-color: #334157;
			margin: 0px;
		}

		.main-header{ /* 上菜单样式 */
			padding: 0px;
			border-left: 2px solid #333;
		}

		.main-center { /* 显示内容菜单样式 */
			padding: 20px;
			border-left: 2px solid #333;
		}
</style>

顶部菜单TopNav.vue:

<template>
	<!-- <el-menu :default-active="activeIndex2" class="el-menu-demo" mode="horizontal" @select="handleSelect" background-color="#545c64"
	 text-color="#fff" active-text-color="#ffd04b">
		<el-menu-item index="1">处理中心</el-menu-item>
		<el-submenu index="2">
			<template slot="title">我的工作台</template>
			<el-menu-item index="2-1">选项1</el-menu-item>
			<el-menu-item index="2-2">选项2</el-menu-item>
			<el-menu-item index="2-3">选项3</el-menu-item>
			<el-submenu index="2-4">
				<template slot="title">选项4</template>
				<el-menu-item index="2-4-1">选项1</el-menu-item>
				<el-menu-item index="2-4-2">选项2</el-menu-item>
				<el-menu-item index="2-4-3">选项3</el-menu-item>
			</el-submenu>
		</el-submenu>

		<el-menu-item index="3" disabled>消息中心</el-menu-item>
		<el-menu-item index="4"><a href="https://www.ele.me" target="_blank">订单管理</a></el-menu-item>
	</el-menu> -->
	<el-menu class="el-menu-demo" mode="horizontal" background-color="#334157" text-color="#fff" active-text-color="#fff">
		<el-button class="buttonimg">
			<img class="showimg" :src="collapsed?imgshow:imgsq" @click="doToggle()">
		</el-button>
		<el-submenu index="2" class="submenu">
			<template slot="title">超级管理员</template>
			<el-menu-item index="2-1">设置</el-menu-item>
			<el-menu-item index="2-2">个人中心</el-menu-item>
			<el-menu-item @click="exit()" index="2-3">退出</el-menu-item>
		</el-submenu>
	</el-menu>
</template>

<script>
	export default {
		data:function(){
      return{
          collapsed: false,
          imgshow: require('../assets/img/show.png'),
          imgsq: require('../assets/img/sq.png')
      }
		},
      methods:{
          doToggle:function(){
            this.collapsed = !this.collapsed;
            this.$root.Bus.$emit("aside-toggle", this.collapsed);
          }
      }
	}
</script>

<style scoped>
	.el-menu-vertical-demo:not(.el-menu--collapse) {
		border: none;
	}

	.submenu {
		float: right;
	}

	.buttonimg {
		height: 60px;
		background-color: transparent;
		border: none;
	}

	.showimg {
		width: 26px;
		height: 26px;
		position: absolute;
		top: 17px;
		left: 17px;
	}

	.showimg:active {
		border: none;
	}
</style>

左侧菜单LeftNav.vue:

<template>
	<el-menu router default-active="2" class="el-menu-vertical-demo" @open="handleOpen" @close="handleClose" background-color="#334157"
	 text-color="#fff" active-text-color="#ffd04b" :collapse="collapsed" :collapse-transition="collapsetransition">
		<!-- <el-menu default-active="2" :collapse="collapsed" collapse-transition router :default-active="$route.path" unique-opened class="el-menu-vertical-demo" background-color="#334157" text-color="#fff" active-text-color="#ffd04b"> -->
		<div class="logobox">
			<img class="logoimg" src="../assets/img/logo.png" alt="">
		</div>

     <el-submenu  v-for="root in rootlist" :index="'ind-'+root.treeNodeId" :key="'ind-'+root.treeNodeId">
            <template slot="title">
                    <i :class="root.icon"></i>
                    <span>{{root.treeNodeName}}</span>
            </template>
             <el-menu-item v-for="r in root.children" :index="r.url?r.url:'ind-'+r.treeNodeId" :key="'ind-'+r.treeNodeId">
                    <i :class="r.icon"></i>
                    <span>{{r.treeNodeName}}</span>
             </el-menu-item>
    </el-submenu>
	</el-menu>
</template>


<script>
	export default {
		data:function(){
      return{
        rootlist : [],
          collapsed : false,
           collapsetransition : true
      }
    },methods:{

    },
    created:function(){
      this.$root.Bus.$on("aside-toggle",(collapsed) => {
         this.collapsed = collapsed;
      });

      let url=this.axios.urls.SYS_TREENODE_BOOTS;
      this.axios.post(url, this.user).then((response)=> {//注意数据是保存到json对象
                this.rootlist = response.data.result;
      		  }).catch((error)=>  {
              console.log(error);
      		  });
    }
	}
</script>



<style>
	.el-menu-vertical-demo:not(.el-menu--collapse) {
		width: 240px;
		min-height: 400px;
	}

	.el-menu-vertical-demo:not(.el-menu--collapse) {
		border: none;
		text-align: left;
	}

	.el-menu-item-group__title {
		padding: 0px;
	}

	.el-menu-bg {
		background-color: #1f2d3d !important;
	}

	.el-menu {
		border: none;
	}

	.logobox {
		height: 40px;
		line-height: 40px;
		color: #9d9d9d;
		font-size: 20px;
		text-align: center;
		padding: 20px 0px;
	}

	.logoimg {
		height: 40px;
	}
</style>

子菜单Role.vue:

<template>
	<div id="aa">
      <h1>会员管理</h1>{{ts}}
	</div>
</template>

<script>
	export default {
    name:'Role',
	  data () {
	    return {
        ts:new Date().getTime()
	    }
	  }
	}
</script>

<style>
  #aa{
    text-align: center;
  }
</style>

子菜单User.vue:

<template>
	<div id="aa">
      <h1>用户管理</h1>{{ts}}
	</div>
</template>

<script>
	export default {
    name:'User',
	  data () {
	    return {
        ts:new Date().getTime()
	    }
	  }
	}
</script>

<style>
  #aa{
    text-align: center;
  }
</style>

子菜单Uilr.vue (CRUD造作页面+分页+动态数据+搜索栏+UD状态修改):

<template>
  <div>
    <!-- 面包屑导航 -->
    <el-breadcrumb separator-class="el-icon-arrow-right">
      <el-breadcrumb-item :to="{ path: '/Login' }">首页</el-breadcrumb-item>
      <el-breadcrumb-item>字典管理{{ts}}</el-breadcrumb-item>
    </el-breadcrumb>
    <!-- 搜索筛选 -->
    <el-form :inline="true" class="user-search">
      <el-form-item label="搜索:">
        <el-input size="small" v-model="queryForm.dictType" placeholder="字典类型"></el-input>
      </el-form-item>
      <el-form-item>
        <el-button size="small" type="primary" icon="el-icon-search" @click="doQuery">搜索</el-button>
        <el-button size="small" type="primary" icon="el-icon-plus" @click="handleAdd">添加</el-button>
      </el-form-item>
    </el-form>

    <el-table :data="tableData" style="width: 100%;height= 600px" :border="true" >
      <el-table-column label="ID" prop="dictId"></el-table-column>
      <el-table-column label="字典类型" prop="dictType"></el-table-column>
      <el-table-column label="字典取值" prop="dictValue"></el-table-column>
      <el-table-column label="字典文本" prop="dictItem"></el-table-column>
      <el-table-column label="能否编辑" prop="dictIsEditable">
        <template slot-scope="scope">
          <el-switch @change="doSwitchChange(scope.row.dictId)" v-model="scope.row.dictIsEditable" active-color="#13ce66"
            inactive-color="#ff4949" :active-value="1" :inactive-value="0">
          </el-switch>
        </template>
      </el-table-column>

      <el-table-column label="操作" align="center">
        <template slot-scope="scope">
          <el-button :disabled="0==scope.row.dictIsEditable" size="mini" @click="handleEdit(scope.$index, scope.row)">修改</el-button>
          <el-button :disabled="0==scope.row.dictIsEditable" size="mini" type="danger" @click="handleDel(scope.$index, scope.row)">删除</el-button>
        </template>
      </el-table-column>
    </el-table>

    <div class="block">
      <el-pagination @size-change="handleSizeChange" @current-change="handleCurrentChange" :current-page="queryForm.page"
        :page-sizes="[10, 20, 30, 50,100]" :page-size="queryForm.rows" layout="total, sizes, prev, pager, next, jumper"
        :total="queryForm.total">
      </el-pagination>
    </div>

    <el-dialog @close="handColer" style="text-align: center;" :title="dialogFormTitle" :visible.sync="dialogFormVisible">
      <el-form ref="methform" :model="methform" :rules="methFormdict">
        <el-form-item prop="dictType" label="字典类型" :label-width="formLabelWidth">
          <el-input v-model="methform.dictType" autocomplete="off"></el-input>
        </el-form-item>
        <el-form-item prop="dictItem" label="字典文本内容" :label-width="formLabelWidth">
          <el-input v-model="methform.dictItem" autocomplete="off"></el-input>
        </el-form-item>
        <el-form-item prop="dictValue" label="字典文本名" :label-width="formLabelWidth">
          <el-input v-model="methform.dictValue" autocomplete="off"></el-input>
        </el-form-item>
        <el-form-item  prop="dictId" :label-width="formLabelWidth"><!-- 字典ID -->
          <el-input type="hidden" v-model="methform.dictId" autocomplete="off"></el-input>
        </el-form-item>
      </el-form>
      <div style="text-align: center;" slot="footer" class="dialog-footer">
        <el-button @click="dialogFormVisible = false">取 消</el-button>
        <el-button type="primary" @click="Quedin">{{quedxiug}}</el-button>
      </div>
    </el-dialog>
  </div>
</template>

<script>
  export default {
    name: 'Uilr',
    data: function() {
      return {
        ts: new Date().getTime(),
        queryForm: { //字典属性+分页页码
          dictType: null,
          page: 1,
          rows: 10,
          total: null
        },
        quedxiug:'确定',
        formLabelWidth: '120px', //添加按钮输入框大小
        tableData: [], //数据数组
        visible: false, //监听 dialogFormVisible 的 open 和 close 事件
        dialogFormVisible: false, //添加状态是否打开
        methform: { //添加表单属性
          dictId: null,
          dictType: null,
          dictItem: null,
          dictValue: null
        },
        methFormdict: { //输入框正则验证
          dictType: [{
            required: true,
            message: '请填写字典类型',
            trigger: 'blur'
          }, {
            min: 2,
            max: 10,
            message: '长度在 2 到 10 个字符',
            trigger: 'blur'
          }],
          dictItem: [{
              required: true,
              message: '请填写字典内容',
              trigger: 'blur'
            },
            {
              min: 2,
              max: 25,
              message: '长度在 2 到 25 个字符',
              trigger: 'blur'
            }
          ],
          dictValue: [{
              required: true,
              message: '请输入字典名字',
              trigger: 'blur'
            },
            {
              min: 2,
              max: 15,
              message: '长度在 2 到 15 个字符',
              trigger: 'blur'
            }
          ]
        }, //表单验证规则
        dialogFormTitle: '字典增加' //添加按钮容器标题
      }
    },
    methods: {
      handColer: function() {
        this.$refs['methform'].resetFields();//@close="handColer"是否可以通过点击 modal 关闭 Dialog
        this.methform.dictType = null;
        this.methform.dictItem = null;
        this.methform.dictValue = null;
      },
      //确认增加
      Quedin: function() {
        this.$refs['methform'].validate((valid) => {
          let url = this.axios.urls.BAS_UILR_MERGE;
          this.axios.post(url, this.methform).then((response) => { //注意数据是保存到json对象
            if (0 == response.data.code) {
              this.$message({
                message: response.data.message,
              });
              this.dialogFormVisible = false;
              if (null == this.methform.dictId) {
                this.methform.dictType = null;
                this.methform.dictItem = null;
                this.methform.dictValue = null;
              }
              this.dolist();
            }
          });
        });
      },
      //提交按钮
      handleAdd: function() {
        this.dialogFormTitle = '字典增加';
        this.dialogFormVisible = true;
      },
       //修改按钮
      handleEdit: function(index,row) {
        this.methform.dictId = row.dictId;
        this.methform.dictType = row.dictType;
        this.methform.dictItem = row.dictItem;
        this.methform.dictValue = row.dictValue;

        this.quedxiug='修改';
        this.dialogFormVisible = true;
        this.dialogFormTitle = '字典修改';
      },
      //删除按钮
      handleDel: function(row) {
        this.$confirm('此操作将永久删除该文件, 是否继续?', '提示', {
          confirmButtonText: '确定',
          cancelButtonText: '取消',
          type: 'warning'
        }).then(() => {
          let url = this.axios.urls.BAS_UILR_DEL;
          this.axios.post(url, {
            dictId: row.dictId
          }).then((response) => { //注意数据是保存到json对象
            if (response.data.code == 0) {
              this.$message({
                message: response.data.message
              });
            }
          });
        }).catch(() => {
          this.$message({
            type: 'info',
            message: '已取消删除'
          });
        });
      },
       //搜索触发事件
      doQuery: function() {
        this.dolist();
      },
      //查询所有数据+搜索栏模糊查询
      dolist: function() {
        let url = this.axios.urls.BAS_UILR_LIST;
        this.axios.post(url, this.queryForm).then((response) => { //注意数据是保存到json对象
          this.tableData = response.data.result;
          this.queryForm.page = response.data.page;
          this.queryForm.rows = response.data.rows;
          this.queryForm.total = response.data.total;
        }).catch((error) => {
          console.log(error);
        });
      },
      //下拉框多少页数
      handleSizeChange: function(qrows) {
        this.queryForm.rows = qrows;
        this.dolist();
      },
      //上一页,下一页
      handleCurrentChange: function(qpage) {
        this.queryForm.page = qpage;
        this.dolist();
      },
      //获取字典row.id修改状态
      doSwitchChange: function(did) {
        let url = this.axios.urls.BAS_UILR_UPDICTISEDITABLE;
        this.axios.post(url, {
          dictId: did
        }).then((response) => { //注意数据是保存到json对象
          if (0 == response.data.code) {
            this.$message({
              message: response.data.message
            });
          }
        });
      }
    },
    created: function() { //加入页面就加载created方法
      this.dolist();
    }
  }
</script>

<style>
  #aa {
    text-align: center;
  }
</style>

前端VUE+Element-UI+Axios+Node.js版本依赖:

在这里插入图片描述

package.json源码:

{
  "name": "test1",
  "version": "1.0.0",
  "description": "A Vue.js project",
  "author": "hjj",
  "private": true,
  "scripts": {
    "dev": "webpack-dev-server --inline --progress --config build/webpack.dev.conf.js",
    "start": "npm run dev",
    "build": "node build/build.js"
  },
  "dependencies": {//生产
    "axios": "^0.19.2",
    "element-ui": "^2.13.1",
    "qs": "^6.9.4",
    "vue": "^2.5.2",
    "vue-axios": "^2.1.5",
    "vue-router": "^3.0.1"
  },
  "devDependencies": {//开发
    "autoprefixer": "^7.1.2",
    "babel-core": "^6.22.1",
    "babel-helper-vue-jsx-merge-props": "^2.0.3",
    "babel-loader": "^7.1.1",
    "babel-plugin-syntax-jsx": "^6.18.0",
    "babel-plugin-transform-runtime": "^6.22.0",
    "babel-plugin-transform-vue-jsx": "^3.5.0",
    "babel-preset-env": "^1.3.2",
    "babel-preset-stage-2": "^6.22.0",
    "chalk": "^2.0.1",
    "copy-webpack-plugin": "^4.0.1",
    "css-loader": "^0.28.0",
    "extract-text-webpack-plugin": "^3.0.0",
    "file-loader": "^1.1.4",
    "friendly-errors-webpack-plugin": "^1.6.1",
    "html-webpack-plugin": "^2.30.1",
    "mockjs": "^1.1.0",
    "node-notifier": "^5.1.2",
    "optimize-css-assets-webpack-plugin": "^3.2.0",
    "ora": "^1.2.0",
    "portfinder": "^1.0.13",
    "postcss-import": "^11.0.0",
    "postcss-loader": "^2.0.8",
    "postcss-url": "^7.2.1",
    "rimraf": "^2.6.0",
    "semver": "^5.3.0",
    "shelljs": "^0.7.6",
    "uglifyjs-webpack-plugin": "^1.1.1",
    "url-loader": "^0.5.8",
    "vue-loader": "^13.3.0",
    "vue-style-loader": "^3.0.1",
    "vue-template-compiler": "^2.5.2",
    "webpack": "^3.6.0",
    "webpack-bundle-analyzer": "^2.9.0",
    "webpack-dev-server": "^2.9.1",
    "webpack-merge": "^4.1.0"
  },
  "engines": {
    "node": ">= 6.0.0",
    "npm": ">= 3.0.0"
  },
  "browserslist": [
    "> 1%",
    "last 2 versions",
    "not ie <= 8"
  ]
}

项目发布(前后端分离)
在这里插入图片描述

!!!!!!!!有报错无法解决----》作死@博主

  • 5
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值