1
0
xiongzhu 7 лет назад
Родитель
Сommit
a4dd069e8a

+ 70 - 0
src/main/java/com/izouma/awesomeadmin/activiti/CustomAuthenticationProvider.java

@@ -0,0 +1,70 @@
+package com.izouma.awesomeadmin.activiti;
+
+import com.izouma.awesomeadmin.model.UserInfo;
+import org.activiti.engine.IdentityService;
+import org.activiti.engine.identity.Group;
+import org.apache.shiro.SecurityUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.authentication.AuthenticationProvider;
+import org.springframework.security.authentication.BadCredentialsException;
+import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
+import org.springframework.security.core.Authentication;
+import org.springframework.security.core.AuthenticationException;
+import org.springframework.security.core.GrantedAuthority;
+import org.springframework.security.core.authority.SimpleGrantedAuthority;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.List;
+
+public class CustomAuthenticationProvider implements AuthenticationProvider {
+    @Autowired
+    private IdentityService identityService;
+
+    public CustomAuthenticationProvider() {
+    }
+
+    public Authentication authenticate(Authentication authentication) throws AuthenticationException {
+        String name = authentication.getName();
+        String password = authentication.getCredentials().toString();
+        boolean authenticated = this.identityService.checkPassword(name, password);
+
+        UserInfo userInfo = null;
+        try {
+            userInfo = (UserInfo) SecurityUtils.getSubject().getPrincipal();
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        if (userInfo == null) {
+
+        }
+
+        if (userInfo == null) {
+            throw new BadCredentialsException("Authentication failed for this username and password");
+        } else {
+            this.identityService.setAuthenticatedUserId(userInfo.getId().toString());
+        }
+
+
+        if (!authenticated) {
+            throw new BadCredentialsException("Authentication failed for this username and password");
+        } else {
+            List<Group> groups = this.identityService.createGroupQuery().groupMember(name).list();
+            Collection<GrantedAuthority> grantedAuthorities = new ArrayList();
+            Iterator var7 = groups.iterator();
+
+            while (var7.hasNext()) {
+                Group group = (Group) var7.next();
+                grantedAuthorities.add(new SimpleGrantedAuthority(group.getId()));
+            }
+
+            this.identityService.setAuthenticatedUserId(name);
+            return new UsernamePasswordAuthenticationToken(name, password, grantedAuthorities);
+        }
+    }
+
+    public boolean supports(Class<?> authentication) {
+        return authentication.equals(UsernamePasswordAuthenticationToken.class);
+    }
+}

+ 32 - 0
src/main/java/com/izouma/awesomeadmin/activiti/RestFilter.java

@@ -0,0 +1,32 @@
+package com.izouma.awesomeadmin.activiti;
+
+import com.izouma.awesomeadmin.model.UserInfo;
+import org.activiti.engine.IdentityService;
+import org.apache.shiro.SecurityUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.ApplicationContext;
+import org.springframework.stereotype.Component;
+import org.springframework.web.context.support.WebApplicationContextUtils;
+import org.springframework.web.filter.GenericFilterBean;
+
+import javax.servlet.*;
+import javax.servlet.annotation.WebFilter;
+import java.io.IOException;
+
+@WebFilter
+public class RestFilter extends GenericFilterBean {
+
+    @Override
+    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
+        try {
+            UserInfo userInfo = (UserInfo) SecurityUtils.getSubject().getPrincipal();
+            ServletContext context = servletRequest.getServletContext();
+            ApplicationContext ctx = WebApplicationContextUtils.getWebApplicationContext(context);
+            IdentityService identityService = ctx.getBean(IdentityService.class);
+            identityService.setAuthenticatedUserId(userInfo.getId().toString());
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        filterChain.doFilter(servletRequest, servletResponse);
+    }
+}

+ 3 - 0
src/main/java/com/izouma/awesomeadmin/dao/SysRoleMapper.java

@@ -1,6 +1,7 @@
 package com.izouma.awesomeadmin.dao;
 
 import com.izouma.awesomeadmin.model.SysRole;
+import org.apache.ibatis.annotations.Param;
 import org.springframework.stereotype.Repository;
 
 import java.util.List;
@@ -19,6 +20,8 @@ public interface SysRoleMapper {
 
 	SysRole selectByPrimaryKey(Integer id);
 
+	List<SysRole> selectByPrimaryKeys(@Param("ids") String ids);
+
 	int updateByPrimaryKeySelective(SysRole record);
 
 	List<SysRole> queryAllSysRole(SysRole record);

+ 8 - 1
src/main/java/com/izouma/awesomeadmin/dao/SysRoleMapper.xml

@@ -329,7 +329,14 @@
 		</where>
 		LIMIT 1
 	</select>
-	<update id="delete">
+    <select id="selectByPrimaryKeys" resultType="com.izouma.awesomeadmin.model.SysRole">
+		select
+		<include refid="Base_Column_List" />
+		from sys_role
+		where id in (${ids})
+		and del_flag = 'N'
+	</select>
+    <update id="delete">
 		UPDATE sys_role SET del_flag = 'Y'
 		<where>
 			AND id = #{id}

+ 2 - 0
src/main/java/com/izouma/awesomeadmin/service/SysRoleService.java

@@ -19,6 +19,8 @@ public interface SysRoleService {
 
 	SysRole getSysRoleById(String id);
 
+	List<SysRole> getSysRoleByIds(String ids);
+
 	SysRole getSysRole(SysRole record);
 
 	boolean createSysRole(SysRole record);

+ 99 - 86
src/main/java/com/izouma/awesomeadmin/service/impl/SysRoleServiceImpl.java

@@ -17,128 +17,141 @@ import java.util.Map;
 /**
  * sys_role service接口实现类
  * Tue Apr 10 18:09:56 CST 2018  Suo Chen Cheng
- */ 
+ */
 @Service
 public class SysRoleServiceImpl implements SysRoleService {
 
-	private static Logger logger = Logger.getLogger(SysRoleServiceImpl.class);
+    private static Logger logger = Logger.getLogger(SysRoleServiceImpl.class);
 
-	@Autowired
-	private SysRoleMapper sysRoleMapper;
+    @Autowired
+    private SysRoleMapper sysRoleMapper;
 
-	@Override
-	public List<SysRole> getSysRoleList(SysRole record) {
+    @Override
+    public List<SysRole> getSysRoleList(SysRole record) {
 
-		logger.info("getSysRoleList");
-		try {
+        logger.info("getSysRoleList");
+        try {
 
-			return sysRoleMapper.queryAllSysRole(record);
-		} catch (Exception e) {
-			logger.error("getSysRoleList", e);
-		}
+            return sysRoleMapper.queryAllSysRole(record);
+        } catch (Exception e) {
+            logger.error("getSysRoleList", e);
+        }
 
-		return null;
-	}
+        return null;
+    }
 
-	@Override
-	public List<SysRole> getSysRoleByPage(Page page, SysRole record) {
+    @Override
+    public List<SysRole> getSysRoleByPage(Page page, SysRole record) {
 
-		logger.info("getSysRoleByPage");
-		try {
+        logger.info("getSysRoleByPage");
+        try {
 
-			Map<String, Object> parameter = new HashMap<String, Object>();
-			parameter.put("record", record);
-			parameter.put(AppConstant.PAGE, page);
+            Map<String, Object> parameter = new HashMap<String, Object>();
+            parameter.put("record", record);
+            parameter.put(AppConstant.PAGE, page);
 
-			return sysRoleMapper.querySysRolesByPage(parameter);
-		} catch (Exception e) {
-			logger.error("getSysRoleByPage", e);
-		}
+            return sysRoleMapper.querySysRolesByPage(parameter);
+        } catch (Exception e) {
+            logger.error("getSysRoleByPage", e);
+        }
 
-		return null;
-	}
+        return null;
+    }
 
-	@Override
-	public SysRole getSysRoleById(String id) {
+    @Override
+    public SysRole getSysRoleById(String id) {
 
-		logger.info("getSysRoleById");
-		try {
+        logger.info("getSysRoleById");
+        try {
 
-			return sysRoleMapper.selectByPrimaryKey(Integer.valueOf(id));
-		} catch (Exception e) {
-			logger.error("getSysRoleById", e);
-		}
+            return sysRoleMapper.selectByPrimaryKey(Integer.valueOf(id));
+        } catch (Exception e) {
+            logger.error("getSysRoleById", e);
+        }
 
-		return null;
-	}
+        return null;
+    }
 
-	@Override
-	public SysRole getSysRole(SysRole record) {
+    @Override
+    public List<SysRole> getSysRoleByIds(String ids) {
+        logger.info("getSysRoleByIds");
+        try {
 
-		logger.info("getSysRole");
-		try {
+            return sysRoleMapper.selectByPrimaryKeys(ids);
+        } catch (Exception e) {
+            logger.error("getSysRoleByIds", e);
+        }
 
-			return sysRoleMapper.querySysRole(record);
-		} catch (Exception e) {
-			logger.error("getSysRole", e);
-		}
+        return null;
+    }
 
-		return null;
-	}
+    @Override
+    public SysRole getSysRole(SysRole record) {
 
-	@Override
-	public boolean createSysRole(SysRole record) {
+        logger.info("getSysRole");
+        try {
 
-		logger.info("createSysRole");
-		try {
+            return sysRoleMapper.querySysRole(record);
+        } catch (Exception e) {
+            logger.error("getSysRole", e);
+        }
 
-			int updates = sysRoleMapper.insertSelective(record);
+        return null;
+    }
 
-			if (updates > 0) {
-				return true;
-			}
-		} catch (Exception e) {
-			logger.error("createSysRole", e);
-		}
+    @Override
+    public boolean createSysRole(SysRole record) {
 
-		return false;
-	}
+        logger.info("createSysRole");
+        try {
 
-	@Override
-	public boolean deleteSysRole(String id) {
+            int updates = sysRoleMapper.insertSelective(record);
 
-		logger.info("deleteSysRole");
-		try {
+            if (updates > 0) {
+                return true;
+            }
+        } catch (Exception e) {
+            logger.error("createSysRole", e);
+        }
 
-			int updates = sysRoleMapper.delete(id);
+        return false;
+    }
 
-			if (updates > 0) {
-				return true;
-			}
-		} catch (Exception e) {
-			logger.error("deleteSysRole", e);
-		}
+    @Override
+    public boolean deleteSysRole(String id) {
 
-		return false;
-	}
+        logger.info("deleteSysRole");
+        try {
 
-	@Override
-	public boolean updateSysRole(SysRole record) {
+            int updates = sysRoleMapper.delete(id);
 
-		logger.info("updateSysRole");
-		try {
+            if (updates > 0) {
+                return true;
+            }
+        } catch (Exception e) {
+            logger.error("deleteSysRole", e);
+        }
 
-			int updates = sysRoleMapper.updateByPrimaryKeySelective(record);
+        return false;
+    }
 
-			if (updates > 0) {
-				return true;
-			}
-		} catch (Exception e) {
-			logger.error("updateSysRole", e);
-		}
+    @Override
+    public boolean updateSysRole(SysRole record) {
 
-		return false;
-	}
+        logger.info("updateSysRole");
+        try {
+
+            int updates = sysRoleMapper.updateByPrimaryKeySelective(record);
+
+            if (updates > 0) {
+                return true;
+            }
+        } catch (Exception e) {
+            logger.error("updateSysRole", e);
+        }
+
+        return false;
+    }
 
 }
 

+ 10 - 4
src/main/java/com/izouma/awesomeadmin/shiro/BaseRealm.java

@@ -4,6 +4,7 @@ import com.izouma.awesomeadmin.model.SysRole;
 import com.izouma.awesomeadmin.model.UserInfo;
 import com.izouma.awesomeadmin.service.SysRoleService;
 import com.izouma.awesomeadmin.service.UserInfoService;
+import org.apache.commons.lang.StringUtils;
 import org.apache.log4j.Logger;
 import org.apache.shiro.authz.AuthorizationInfo;
 import org.apache.shiro.authz.SimpleAuthorizationInfo;
@@ -11,6 +12,9 @@ import org.apache.shiro.realm.AuthorizingRealm;
 import org.apache.shiro.subject.PrincipalCollection;
 import org.springframework.beans.factory.annotation.Autowired;
 
+import java.util.Arrays;
+import java.util.List;
+
 public abstract class BaseRealm extends AuthorizingRealm {
     protected static Logger logger = Logger.getLogger(PhoneCodeRealm.class);
 
@@ -27,10 +31,12 @@ public abstract class BaseRealm extends AuthorizingRealm {
         try {
             UserInfo userInfo = (UserInfo) principalCollection.getPrimaryPrincipal();
             //获取角色数据权限授权
-            SysRole sysRole = sysRoleService.getSysRoleById(userInfo.getRoleId());
-            String[] permission = sysRole.getPermission().split(",");
-            for (String perm : permission) {
-                info.addStringPermission(perm);
+            List<SysRole> sysRoles = sysRoleService.getSysRoleByIds(userInfo.getRoleId());
+            for (SysRole sysRole : sysRoles) {
+                info.addRole(sysRole.getEnname());
+                if (StringUtils.isNotEmpty(sysRole.getPermission())) {
+                    info.addStringPermissions(Arrays.asList(sysRole.getPermission().split(",")));
+                }
             }
         } catch (Exception e) {
             logger.error("doGetAuthorizationInfo", e);

+ 5 - 0
src/main/java/com/izouma/awesomeadmin/shiro/UserPasswordRealm.java

@@ -1,9 +1,13 @@
 package com.izouma.awesomeadmin.shiro;
 
 import com.izouma.awesomeadmin.model.UserInfo;
+import org.activiti.engine.IdentityService;
 import org.apache.shiro.authc.*;
+import org.springframework.beans.factory.annotation.Autowired;
 
 public class UserPasswordRealm extends BaseRealm {
+    @Autowired
+    private IdentityService identityService;
 
     @Override
     protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
@@ -13,6 +17,7 @@ public class UserPasswordRealm extends BaseRealm {
         if (userInfo == null) {
             throw new AuthenticationException("用户名或密码错误");
         }
+        identityService.setAuthenticatedUserId(userInfo.getId().toString());
         return new SimpleAuthenticationInfo(userInfo, token.getCredentials(), this.getName());
     }
 }

+ 19 - 12
src/main/java/com/izouma/awesomeadmin/web/activiti/ProcessController.java

@@ -10,15 +10,14 @@ import org.activiti.engine.runtime.ProcessInstance;
 import org.apache.commons.lang.StringUtils;
 import org.apache.shiro.SecurityUtils;
 import org.apache.shiro.authz.annotation.RequiresAuthentication;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.apache.shiro.authz.annotation.RequiresRoles;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Controller;
 import org.springframework.web.bind.annotation.*;
 
 import javax.servlet.http.HttpServletRequest;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Set;
+import java.util.*;
 
 @Controller
 @RequestMapping("/activiti/process")
@@ -41,17 +40,13 @@ public class ProcessController extends BaseController {
     @Autowired
     private ProcessEngineConfigurationImpl processEngineConfiguration;
 
-    @RequestMapping(value = "/start/{processDefinitionId}", method = RequestMethod.POST)
+    @RequestMapping(value = "/start", method = RequestMethod.POST)
     @ResponseBody
-    public Result startProcess(@PathVariable("processDefinitionId") String processDefinitionId, HttpServletRequest request) {
+    public Result startProcess(@RequestParam("processDefinitionId") String processDefinitionId, List<Map<String, String>> properties, String businessKey) {
         Map<String, String> formProperties = new HashMap<>();
 
-        // 从request中读取参数然后转换
-        Map<String, String[]> parameterMap = request.getParameterMap();
-        Set<Map.Entry<String, String[]>> entrySet = parameterMap.entrySet();
-        for (Map.Entry<String, String[]> entry : entrySet) {
-            String key = entry.getKey();
-            formProperties.put(key, StringUtils.join(entry.getValue(), ","));
+        for (Map<String, String> map : properties) {
+            formProperties.put(map.get("id"), map.get("value"));
         }
         try {
             identityService.setAuthenticatedUserId(((UserInfo) SecurityUtils.getSubject().getPrincipal()).getId().toString());
@@ -77,4 +72,16 @@ public class ProcessController extends BaseController {
         }
         return new Result(true, query.list());
     }
+
+    @RequestMapping(value = "/deleteDeployment", method = RequestMethod.POST)
+    @ResponseBody
+    public Result delete(@RequestParam("deploymentId") String deploymentId) {
+        try {
+            repositoryService.deleteDeployment(deploymentId, true);
+            return new Result(true, null);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return new Result(false, "删除失败");
+    }
 }

+ 11 - 8
src/main/java/org/activiti/conf/SecurityConfiguration.java

@@ -1,14 +1,18 @@
 package org.activiti.conf;
 
-import org.activiti.rest.security.BasicAuthenticationProvider;
+import com.izouma.awesomeadmin.activiti.CustomAuthenticationProvider;
+import com.izouma.awesomeadmin.activiti.RestFilter;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 import org.springframework.security.authentication.AuthenticationProvider;
+import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
 import org.springframework.security.config.annotation.web.builders.HttpSecurity;
 import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
 import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
 import org.springframework.security.config.annotation.web.servlet.configuration.EnableWebMvcSecurity;
 import org.springframework.security.config.http.SessionCreationPolicy;
+import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;
 
 @Configuration
 @EnableWebSecurity
@@ -17,17 +21,16 @@ public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
 
     @Bean
     public AuthenticationProvider authenticationProvider() {
-        return new BasicAuthenticationProvider();
+        return new CustomAuthenticationProvider();
     }
 
     @Override
     protected void configure(HttpSecurity http) throws Exception {
         http.authenticationProvider(authenticationProvider())
-            .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS).and()
-            .csrf().disable()
-            .authorizeRequests()
-            .anyRequest().authenticated()
-            .and()
-            .httpBasic();
+                .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS).and()
+                .csrf().disable()
+                .addFilterBefore(new RestFilter(), UsernamePasswordAuthenticationFilter.class)
+                .authorizeRequests()
+                .anyRequest().permitAll();
     }
 }

+ 9 - 5
src/main/resources/spring/applicationContext.xml

@@ -24,7 +24,7 @@
     <import resource="classpath:spring/appWebService.xml"/>
 
     <!-- 配置一个shiro框架的过滤器工厂bean,用于创建shiro框架的过滤器 -->
-    <bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean" >
+    <bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
         <property name="securityManager" ref="securityManager"/>
         <property name="filters">
             <util:map>
@@ -41,6 +41,12 @@
     <bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
         <!-- 注入realm到安全管理器进行密码匹配 -->
         <property name="authenticator" ref="modularRealmAuthenticator"/>
+        <property name="realms">
+            <list>
+                <ref bean="phoneCodeRealm"/>
+                <ref bean="userPasswordRealm"/>
+            </list>
+        </property>
     </bean>
 
     <bean id="modularRealmAuthenticator" class="com.izouma.awesomeadmin.shiro.MyModularRealmAuthenticator">
@@ -64,9 +70,8 @@
         <property name="authenticationTokenClass" value="org.apache.shiro.authc.UsernamePasswordToken"/>
     </bean>
 
-
-    <context:component-scan
-            base-package="org.activiti.conf,org.activiti.rest.editor">
+    <!--ACTIVITI-->
+    <context:component-scan base-package="org.activiti.conf,org.activiti.rest.editor,org.activiti.rest.service">
         <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
     </context:component-scan>
 
@@ -105,7 +110,6 @@
     <bean id="processEngine" class="org.activiti.spring.ProcessEngineFactoryBean">
         <property name="processEngineConfiguration" ref="processEngineConfiguration"/>
     </bean>
-
     <!-- 7大接口 -->
     <bean id="repositoryService" factory-bean="processEngine" factory-method="getRepositoryService"/>
     <bean id="runtimeService" factory-bean="processEngine" factory-method="getRuntimeService"/>

+ 0 - 1
src/main/resources/spring/spring-mvc-modeler.xml

@@ -12,5 +12,4 @@
     </context:component-scan>
 
     <mvc:annotation-driven/>
-    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver" />
 </beans>

+ 0 - 1
src/main/resources/spring/spring-mvc-rest.xml

@@ -12,5 +12,4 @@
     </context:component-scan>
 
     <mvc:annotation-driven />
-    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver" />
 </beans>

+ 29 - 12
src/main/vue/src/components/DynamicForm.vue

@@ -1,14 +1,14 @@
 <template>
     <el-form :model="formData" ref="form" label-position="right" label-width="100px" size="small" :rules="rules">
-        <el-form-item v-for="item in formDef" :prop="item.id" :label="item.name" :key="item.id">
-            <el-input v-if="item.type === 'string'" v-model="formData[item.id]"></el-input>
-            <el-select v-else-if="item.type === 'enum'" v-model="formData[item.id]">
+        <el-form-item v-for="item in formDef" :prop="item.id" :label="item.name" :key="item.id" v-if="item.readable">
+            <el-input v-if="item.type === 'string'" v-model="formData[item.id]" :disabled="!item.writable" class="form-item"></el-input>
+            <el-select v-else-if="item.type === 'enum'" v-model="formData[item.id]" :disabled="!item.writable" class="form-item">
                 <el-option v-for="(option,index) in item.enumValues" :label="option.name" :value="option.id" :key="index">
                 </el-option>
             </el-select>
-            <el-date-picker v-else-if="item.type === 'date'" v-model="formData[item.id]" type="datetime" :format="item.datePattern" :value-format="item.datePattern">
+            <el-date-picker v-else-if="item.type === 'date'" v-model="formData[item.id]" type="datetime" :format="item.datePattern" :value-format="item.datePattern" :disabled="!item.writable" class="form-item">
             </el-date-picker>
-            <el-switch v-else-if="item.type === 'boolean'" v-model="formData[item.id]">
+            <el-switch v-else-if="item.type === 'boolean'" v-model="formData[item.id]" :disabled="!item.writable" class="form-item">
             </el-switch>
         </el-form-item>
     </el-form>
@@ -26,6 +26,11 @@ export default {
     },
     created() {
         this.formData = this.val || {}
+        this.formDef.forEach(i => {
+            if (i.value) {
+                this.formData[i.id] = i.value
+            }
+        })
     },
     data() {
         return {
@@ -52,20 +57,29 @@ export default {
         clearValidate() {
             this.$refs.form.clearValidate()
         },
-        getData() {
+        getData(all) {
             let data = [];
-            for (let key in this.formData) {
-                data.push({
-                    id: key,
-                    value: this.formData[key]
-                })
-            }
+            this.formDef.forEach(i => {
+                if (i.writable || all) {
+                    if (this.formData[i.id]) {
+                        data.push({
+                            id: i.id,
+                            value: this.formData[i.id]
+                        })
+                    }
+                }
+            })
             return data;
         }
     },
     watch: {
         formDef() {
             this.$refs.form.clearValidate()
+            this.formDef.forEach(i => {
+                if (i.value) {
+                    this.formData[i.id] = i.value
+                }
+            })
         },
         value(val) {
             if (val instanceof Object) {
@@ -79,6 +93,9 @@ export default {
 }
 </script>
 <style lang="less" scoped>
+.form-item {
+    width: 100%;
+}
 </style>
 
 

+ 65 - 65
src/main/vue/src/pages/Login.vue

@@ -20,76 +20,76 @@
     </div>
 </template>
 <script>
-    export default {
-        data() {
-            return {
-                rememberMe: false,
-                loading: false,
-                userInfo: {
-                    username: '',
-                    password: ''
-                }
-            }
-        },
-        methods: {
-            login() {
-                this.$refs.form.validate(valid => {
-                    if (valid) {
-                        this.loading = true;
-                        this.$http.post({
-                            url: '/userInfo/login',
-                            data: {
-                                username: this.userInfo.username,
-                                password: this.userInfo.password,
-                                remember: this.rememberMe
-                            }
-                        }).then(res => {
-                            this.loading = false;
-                            if (res.success) {
-                                this.$router.replace('/');
-                            } else {
-                                this.$message.error('登录失败');
-                            }
-                        }).catch(() => {
-                            this.loading = false;
-                        })
-                    }
-                })
+export default {
+    data() {
+        return {
+            rememberMe: false,
+            loading: false,
+            userInfo: {
+                username: '',
+                password: ''
             }
         }
+    },
+    methods: {
+        login() {
+            this.$refs.form.validate(valid => {
+                if (valid) {
+                    this.loading = true;
+                    this.$http.post({
+                        url: '/userInfo/login',
+                        data: {
+                            username: this.userInfo.username,
+                            password: this.userInfo.password,
+                            remember: this.rememberMe
+                        }
+                    }).then(res => {
+                        this.loading = false;
+                        if (res.success) {
+                            this.$router.replace('/');
+                        } else {
+                            this.$message.error('登录失败');
+                        }
+                    }).catch(() => {
+                        this.loading = false;
+                    })
+                }
+            })
+        }
     }
+}
 </script>
 <style lang="less" scoped>
-    .container {
-        width: 100%;
-        height: 100%;
-        display: flex;
-        align-items: center;
-        justify-content: center;
-        background-color: #ebebeb;
-        background-image: url("https://microball.oss-cn-hangzhou.aliyuncs.com/izouma/application/rawpixel-com-565462-unsplash%20%281%29.jpg");
-        background-size: cover;
-        background-position: center;
-        background-repeat: no-repeat;
-    }
+.container {
+    width: 100%;
+    height: 100%;
+    display: flex;
+    align-items: center;
+    justify-content: center;
+    background-color: #ebebeb;
+    background-image: url('https://microball.oss-cn-hangzhou.aliyuncs.com/izouma/application/rawpixel-com-565462-unsplash%20%281%29.jpg');
+    background-size: cover;
+    background-position: center;
+    background-repeat: no-repeat;
+}
 
-    .login-wrapper {
-        display: flex;
-        flex-direction: column;
-        align-items: center;
-        justify-content: center;
-        border-radius: 5px;
-        background: white;
-        border: 1px #eaeaea solid;
-        position: absolute;
-        right: 100px;
-        top: 100px;
-        width: 400px;
-        .title {
-            color: #20a0ff;
-            font-weight: bold;
-            width: 350px;
-            line-height: 60px;
-        }
+.login-wrapper {
+    display: flex;
+    flex-direction: column;
+    align-items: center;
+    justify-content: center;
+    border-radius: 5px;
+    background: white;
+    border: 1px #eaeaea solid;
+    position: absolute;
+    right: 100px;
+    top: 100px;
+    width: 400px;
+    .title {
+        color: #20a0ff;
+        font-weight: bold;
+        width: 350px;
+        line-height: 60px;
     }
+}
 </style>

+ 30 - 10
src/main/vue/src/pages/MyProcesses.vue

@@ -14,8 +14,21 @@
             </el-table-column>
             <el-table-column prop="processDefinitionName" label="名称">
             </el-table-column>
+            <el-table-column label="状态" align="center">
+                <template slot-scope="{row}">
+                    <el-tag size="mini" type="info" v-if="row.endTime">已完成</el-tag>
+                    <el-tag size="mini" type="success" v-else>运行中</el-tag>
+                </template>
+            </el-table-column>
             <el-table-column prop="startTime" label="创建时间" :formatter="datetimeFormatter">
             </el-table-column>
+            <el-table-column prop="endTime" label="结束时间" :formatter="datetimeFormatter">
+            </el-table-column>
+            <el-table-column label="操作">
+                <template slot-scope="{row}">
+                    <el-button @click="view(row)" type="primary" size="mini" plain>查看</el-button>
+                </template>
+            </el-table-column>
         </el-table>
         <div class="pagination-wrapper">
             <el-pagination background @size-change="pageSizeChange" @current-change="currentPageChange" :current-page="currentPage" :page-sizes="[10, 20, 30, 40, 50]" :page-size="pageSize" layout="total, sizes, prev, pager, next, jumper" :total="totalNumber">
@@ -53,7 +66,6 @@ export default {
             dialogVisible: false,
             startForm: [],
             startFormModel: {},
-            enumValues: {}
         }
     },
     computed: {
@@ -89,12 +101,14 @@ export default {
             })
         },
         startProcess() {
+            this.loading = true
             this.$http.get({
                 url: '/rest/form/form-data',
                 data: {
                     processDefinitionId: this.selectedProcessDefinitionId
                 }
             }).then(res => {
+                this.loading = false
                 this.startForm = res.formProperties;
                 this.startFormModel = {};
                 this.dialogVisible = true;
@@ -106,18 +120,24 @@ export default {
         confirmStartProcess() {
             this.$refs.startForm.validate(valid => {
                 if (valid) {
-                    this.$http.post({
-                        url: `/activiti/process/start/${this.selectedProcessDefinitionId}`,
-                        data: this.startFormModel
-                    }).then(res => {
-                        if (res.success) {
-                            this.dialogVisible = false;
-                            this.$message.success('成功');
-                            this.getData()
-                        }
+                    this.loading = true
+                    axios.post('/rest/form/form-data', {
+                        processDefinitionId: this.selectedProcessDefinitionId,
+                        businessKey: null,
+                        properties: this.$refs.startForm.getData()
+                    }).then(res => {                    this.loading = false
+                        this.dialogVisible = false;
+                        this.$message.success('成功');
+                        this.getData()
+                    }).catch(e => {
+                        this.loading = false
+                        this.$message.success('失败');
                     })
                 }
             })
+        },
+        view(row) {
+            window.open(this.$baseUrl + `/diagram-viewer/index.html?processDefinitionId=${row.processDefinitionId}&processInstanceId=${row.processInstanceId}`);
         }
     },
     components: {

+ 5 - 0
src/main/vue/src/pages/MyTasks.vue

@@ -103,13 +103,18 @@ export default {
         completeTask() {
             this.$refs.taskForm.validate(valid => {
                 if (valid) {
+                    this.loading = true
                     axios.post('rest/form/form-data', {
                         taskId: this.selectedTaskId,
                         properties: this.$refs.taskForm.getData()
                     }).then(res => {
+                        this.loading = false
                         this.dialogVisible = false;
                         this.$message.success('成功');
                         this.getData()
+                    }).catch(e => {
+                        this.loading = false
+                        this.$message.success('失败');
                     })
                 }
             })

+ 15 - 6
src/main/vue/src/pages/ProcessDefinitions.vue

@@ -1,7 +1,7 @@
 <template>
     <div>
         <div class="filters-container"></div>
-        <el-table :data="tableData" :height="tableHeight" row-key="id" ref="table">
+        <el-table :data="tableData" :height="tableHeight" row-key="id" ref="table" v-loading="$store.state.fetchingData">
             <el-table-column v-if="multipleMode" align="center" type="selection" min-width="50">
             </el-table-column>
             <el-table-column prop="id" label="id" width="150">
@@ -102,7 +102,7 @@ export default {
         },
         changeState(row, state) {
             this.$alert(`确认${state ? '激活' : '挂起'}?`, '警告', { type: 'warning' }).then(() => {
-                return axios.put(`rest/repository/process-definitions/${row.id}`, {
+                return axios.put(`/rest/repository/process-definitions/${row.id}`, {
                     action: state ? 'activate' : 'suspend',
                     includeProcessInstances: false
                 })
@@ -119,10 +119,19 @@ export default {
         },
         deleteDeployment(row) {
             this.$alert('确认删除?', '警告', { type: 'error' }).then(() => {
-                return axios.delete(`rest/repository/deployments/${row.deploymentId}`)
-            }).then(() => {
-                this.$message.success("删除成功");
-                this.getData();
+                return this.$http.post({
+                    url: '/activiti/process/deleteDeployment',
+                    data: {
+                        deploymentId: row.deploymentId
+                    }
+                })
+            }).then((res) => {
+                if (res.success) {
+                    this.$message.success("删除成功");
+                    this.getData();
+                } else {
+                    this.$message.error("删除失败");
+                }
             }).catch(() => {
                 this.$message.error("删除失败");
             })

+ 6 - 3
src/main/vue/src/pages/ProcessModels.vue

@@ -7,7 +7,7 @@
             <el-button @click="showCreateModelDialog" type="primary" size="small" icon="el-icon-edit" class="filter-item">创建
             </el-button>
         </div>
-        <el-table :data="tableData" :height="tableHeight" row-key="id" ref="table">
+        <el-table :data="tableData" :height="tableHeight" row-key="id" ref="table"  v-loading="$store.state.fetchingData">
             <el-table-column v-if="multipleMode" align="center" type="selection" min-width="50">
             </el-table-column>
             <el-table-column prop="id" label="id" width="150">
@@ -21,7 +21,7 @@
             <el-table-column label="操作" align="center" width="300">
                 <template slot-scope="{row}">
                     <el-button @click="editRow(row)" type="primary" size="mini" plain>编辑</el-button>
-                    <el-button @click="publishModel(row)" type="success" size="mini" plain>发布</el-button>
+                    <el-button @click="publishModel(row,$event)" type="success" size="mini" plain>发布</el-button>
                     <el-button @click="editRow(row)" size="mini" plain>导出</el-button>
                     <el-button @click="deleteModel(row)" type="danger" size="mini" plain>删除</el-button>
                 </template>
@@ -148,7 +148,8 @@ export default {
                 }
             })
         },
-        publishModel(row) {
+        publishModel(row, e) {
+            console.log(e)
             this.$http.get({
                 url: '/activiti/model/publish',
                 data: {
@@ -158,6 +159,8 @@ export default {
                 if (res.success) {
                     this.$message.success('发布成功');
                 }
+            }).catch(e => {
+                this.$message.error('发布失败');
             })
         },
         deleteModel(row) {

+ 23 - 0
src/main/webapp/WEB-INF/web.xml

@@ -115,4 +115,27 @@
         <filter-name>shiroFilter</filter-name>
         <url-pattern>/*</url-pattern>
     </filter-mapping>
+
+    <filter>
+        <filter-name>springSecurityFilterChain</filter-name>
+        <filter-class>
+            org.springframework.web.filter.DelegatingFilterProxy
+        </filter-class>
+    </filter>
+
+    <filter-mapping>
+        <filter-name>springSecurityFilterChain</filter-name>
+        <url-pattern>/rest/*</url-pattern>
+        <dispatcher>ERROR</dispatcher>
+        <dispatcher>REQUEST</dispatcher>
+    </filter-mapping>
+    <!-- JSONP -->
+    <filter>
+        <filter-name>JSONPFilter</filter-name>
+        <filter-class>org.activiti.explorer.JsonpCallbackFilter</filter-class>
+    </filter>
+    <filter-mapping>
+        <filter-name>JSONPFilter</filter-name>
+        <url-pattern>/*</url-pattern>
+    </filter-mapping>
 </web-app>

+ 1 - 1
src/main/webapp/diagram-viewer/index.html

@@ -108,7 +108,7 @@ $(document).ready(function(){
   
   var baseUrl = window.document.location.protocol + "//" + window.document.location.host + "/";
   var shortenedUrl = window.document.location.href.replace(baseUrl, "");
-  baseUrl = baseUrl + shortenedUrl.substring(0, shortenedUrl.indexOf("/"));
+  // baseUrl = baseUrl + shortenedUrl.substring(0, shortenedUrl.indexOf("/"));
   
   ActivitiRest.options = {
     processInstanceHighLightsUrl: baseUrl + "/service/process-instance/{processInstanceId}/highlights?callback=?",