he2802 4 tahun lalu
induk
melakukan
c80cdd0c33

+ 2 - 1
zhongzheng-admin-saas/src/main/java/com/zhongzheng/controller/system/SysTenantController.java

@@ -11,6 +11,7 @@ import com.zhongzheng.modules.system.vo.SysTenantVo;
 import lombok.RequiredArgsConstructor;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.PutMapping;
@@ -84,7 +85,7 @@ public class SysTenantController extends BaseController {
     @PreAuthorize("@ss.hasPermi('system:tenant:add')")
     @Log(title = "系统商户", businessType = BusinessType.INSERT)
     @PostMapping()
-    public AjaxResult<Void> add(@RequestBody SysTenantAddBo bo) {
+    public AjaxResult<Void> add(@Validated @RequestBody SysTenantAddBo bo) {
         return toAjax(iSysTenantService.insertByAddBo(bo) ? 1 : 0);
     }
 

+ 0 - 3
zhongzheng-admin-saas/src/main/java/com/zhongzheng/core/config/SwaggerConfig.java

@@ -132,9 +132,6 @@ public class SwaggerConfig
         ParameterBuilder parameterBuilder = new ParameterBuilder();
         parameterBuilder.name("X-Auth-Token").description("token").modelRef(new ModelRef("string")).parameterType("header").defaultValue("test").required(false);
         pars.add(parameterBuilder.build());
-        ParameterBuilder parameterBuilder1 = new ParameterBuilder();
-        parameterBuilder1.name("AuthorizationToken").description("AuthorizationToken").modelRef(new ModelRef("string")).parameterType("header").defaultValue("BearerSuper 123").required(false);
-        pars.add(parameterBuilder1.build());
         return pars;
     }
 }

+ 2 - 1
zhongzheng-admin/src/main/java/com/zhongzheng/controller/system/SysUserController.java

@@ -111,7 +111,8 @@ public class SysUserController extends BaseController
     {
         AjaxResult ajax = AjaxResult.success();
         List<SysRole> roles = roleService.selectRoleAll();
-        ajax.put("roles", SysUser.isAdmin(userId) ? roles : roles.stream().filter(r -> !r.isAdmin()).collect(Collectors.toList()));
+        SysUser sysUser = userService.selectUserById(userId);
+        ajax.put("roles", SysUser.isAdmin(sysUser.getUserName()) ? roles : roles.stream().filter(r -> !r.isAdmin()).collect(Collectors.toList()));
         ajax.put("posts", postService.selectPostAll());
         if (Validator.isNotNull(userId))
         {

+ 0 - 1
zhongzheng-admin/src/main/resources/application.yml

@@ -210,7 +210,6 @@ pagehelper:
   reasonable: true
   supportMethodsArguments: true
   params: count=countSql
-
 # Swagger配置
 swagger:
   # 是否开启swagger

+ 8 - 3
zhongzheng-common/src/main/java/com/zhongzheng/common/core/domain/entity/SysUser.java

@@ -157,12 +157,17 @@ public class SysUser implements Serializable
 
     public boolean isAdmin()
     {
-        return isAdmin(this.userId);
+        return isAdmin(this.userName);
     }
 
-    public static boolean isAdmin(Long userId)
+    public static boolean isAdmin(String userName)
     {
-        return userId != null && 1L == userId;
+        return userName != null && "admin".equals(userName) ;
     }
 
+  /*  public static boolean isAdmin(Long userId)
+    {
+        return userId != null && 1L == userId;
+    }*/
+
 }

+ 37 - 3
zhongzheng-common/src/main/java/com/zhongzheng/common/utils/SecurityUtils.java

@@ -1,19 +1,36 @@
 package com.zhongzheng.common.utils;
 
 import cn.hutool.http.HttpStatus;
+import com.zhongzheng.common.core.domain.model.TopLoginUser;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.security.core.Authentication;
 import org.springframework.security.core.context.SecurityContextHolder;
 import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
 import com.zhongzheng.common.core.domain.model.LoginUser;
 import com.zhongzheng.common.exception.CustomException;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.PostConstruct;
 
 /**
  * 安全服务工具类
- * 
+ *
  * @author zhongzheng
  */
+@Component
 public class SecurityUtils
 {
+
+    @Value("${mybatis-plus.tenant.enabled-tenant:true}")
+    public static boolean EnabledTenant;
+
+    @Value("${mybatis-plus.tenant.enabled-tenant:true}")
+    private boolean enabledTenant;
+
+    @PostConstruct
+    public void getEnvironment(){
+        EnabledTenant = this.enabledTenant;
+    }
     /**
      * 获取用户账户
      **/
@@ -21,7 +38,12 @@ public class SecurityUtils
     {
         try
         {
-            return getLoginUser().getUsername();
+            if(EnabledTenant){
+                return getLoginUser().getUsername();
+            }else{
+                return getTopLoginUser().getUsername();
+            }
+
         }
         catch (Exception e)
         {
@@ -44,6 +66,18 @@ public class SecurityUtils
         }
     }
 
+    public static TopLoginUser getTopLoginUser()
+    {
+        try
+        {
+            return (TopLoginUser) getAuthentication().getPrincipal();
+        }
+        catch (Exception e)
+        {
+            throw new CustomException("获取用户信息异常", HttpStatus.HTTP_UNAUTHORIZED);
+        }
+    }
+
     /**
      * 获取Authentication
      */
@@ -79,7 +113,7 @@ public class SecurityUtils
 
     /**
      * 是否为管理员
-     * 
+     *
      * @param userId 用户ID
      * @return 结果
      */

+ 6 - 1
zhongzheng-framework/src/main/java/com/zhongzheng/framework/config/MybatisPlusConfig.java

@@ -8,19 +8,24 @@ import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerIntercept
 import com.baomidou.mybatisplus.extension.plugins.inner.TenantLineInnerInterceptor;
 import com.zhongzheng.framework.mybatisplus.CreateAndUpdateMetaObjectHandler;
 import com.zhongzheng.framework.mybatisplus.CustomTenantLineHandler;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 import org.springframework.transaction.annotation.EnableTransactionManagement;
+import org.springframework.web.filter.CorsFilter;
 
 @EnableTransactionManagement(proxyTargetClass = true)
 @Configuration
 public class MybatisPlusConfig {
 
+	@Autowired
+	private CustomTenantLineHandler customTenantLineHandler;
+
 	@Bean
 	public MybatisPlusInterceptor mybatisPlusInterceptor() {
 		MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
 		// 多租户插件(注意:这个一定要放在最上面)
-		interceptor.addInnerInterceptor(new TenantLineInnerInterceptor(new CustomTenantLineHandler()));
+		interceptor.addInnerInterceptor(new TenantLineInnerInterceptor(customTenantLineHandler));
 		// 分页插件
 		interceptor.addInnerInterceptor(paginationInnerInterceptor());
 		// 乐观锁插件

+ 20 - 2
zhongzheng-framework/src/main/java/com/zhongzheng/framework/mybatisplus/CustomTenantLineHandler.java

@@ -11,10 +11,16 @@ import lombok.SneakyThrows;
 import net.sf.jsqlparser.expression.Expression;
 import net.sf.jsqlparser.expression.LongValue;
 import org.apache.commons.compress.utils.Lists;
-import org.springframework.beans.factory.annotation.Value;
 
+
+import java.lang.reflect.Field;
 import java.util.ArrayList;
 import java.util.List;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Component;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.xml.soap.MimeHeaders;
 
 /**
  * 多租户处理插件
@@ -22,6 +28,7 @@ import java.util.List;
  * @author hjl
  * @date 2021/07/30 13:37
  */
+@Component
 public class CustomTenantLineHandler implements TenantLineHandler {
 
     /**
@@ -29,6 +36,8 @@ public class CustomTenantLineHandler implements TenantLineHandler {
      */
     public static final String TENANT_ID_COLUMN = "tenant_id";
 
+  //  public static  String TENANT_ID = null;
+
     @Value("${mybatis-plus.tenant.enabled-tenant:true}")
     private boolean enabledTenant;
 
@@ -54,14 +63,21 @@ public class CustomTenantLineHandler implements TenantLineHandler {
     @SneakyThrows
     @Override
     public Expression getTenantId() {
+
+      /*  if(StrUtil.isNotBlank(CustomTenantLineHandler.TENANT_ID)){
+            System.out.println("获取企业ID"+CustomTenantLineHandler.TENANT_ID);
+            return new LongValue(CustomTenantLineHandler.TENANT_ID);
+        }*/
         String TenantId = ServletUtils.getRequest().getHeader("TenantId");
-        if(!StrUtil.isNotBlank(TenantId)){
+        if(!StrUtil.isNotBlank(TenantId)||TenantId==null){
             if(enabledTenant){
                 int code = HttpStatus.HTTP_UNAVAILABLE;
                 String msg = "企业非法访问";
                 ServletUtils.renderString( ServletUtils.getResponse(), JSON.toJSONString(AjaxResult.error(code, msg)));
                 ServletUtils.getResponse().getWriter().flush();
                 ServletUtils.getResponse().getWriter().close();
+            }else{
+                TenantId = ServletUtils.getResponse().getHeader("TenantId");
             }
         }
         return new LongValue(TenantId);
@@ -87,4 +103,6 @@ public class CustomTenantLineHandler implements TenantLineHandler {
     public boolean ignoreTable(String tableName) {
         return IGNORE_TABLE_NAMES.contains(tableName);
     }
+
+
 }

+ 141 - 0
zhongzheng-framework/src/main/java/com/zhongzheng/framework/web/service/SysTenantServiceImpl.java

@@ -0,0 +1,141 @@
+package com.zhongzheng.framework.web.service;
+
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.lang.Validator;
+import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.github.pagehelper.Page;
+import com.zhongzheng.common.core.domain.entity.SysUser;
+import com.zhongzheng.common.exception.CustomException;
+import com.zhongzheng.common.utils.DateUtils;
+import com.zhongzheng.common.utils.SecurityUtils;
+import com.zhongzheng.common.utils.ServletUtils;
+import com.zhongzheng.framework.mybatisplus.CustomTenantLineHandler;
+import com.zhongzheng.modules.system.bo.SysTenantAddBo;
+import com.zhongzheng.modules.system.bo.SysTenantEditBo;
+import com.zhongzheng.modules.system.bo.SysTenantQueryBo;
+import com.zhongzheng.modules.system.domain.SysTenant;
+import com.zhongzheng.modules.system.mapper.SysTenantMapper;
+import com.zhongzheng.modules.system.service.ISysTenantService;
+import com.zhongzheng.modules.system.service.ISysUserService;
+import com.zhongzheng.modules.system.vo.SysTenantVo;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.Collection;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * 系统商户Service业务层处理
+ *
+ * @author hjl
+ * @date 2021-08-03
+ */
+@Service
+public class SysTenantServiceImpl extends ServiceImpl<SysTenantMapper, SysTenant> implements ISysTenantService {
+
+    @Autowired
+    private ISysUserService userService;
+
+    @Override
+    public SysTenantVo queryById(Long tenantId){
+        SysTenant db = this.baseMapper.selectById(tenantId);
+        return BeanUtil.toBean(db, SysTenantVo.class);
+    }
+
+    @Override
+    public List<SysTenantVo> queryList(SysTenantQueryBo bo) {
+        LambdaQueryWrapper<SysTenant> lqw = Wrappers.lambdaQuery();
+        lqw.eq(bo.getStatus() != null, SysTenant::getStatus, bo.getStatus());
+        lqw.like(StrUtil.isNotBlank(bo.getTenantName()), SysTenant::getTenantName, bo.getTenantName());
+        return entity2Vo(this.list(lqw));
+    }
+
+    /**
+    * 实体类转化成视图对象
+    *
+    * @param collection 实体类集合
+    * @return
+    */
+    private List<SysTenantVo> entity2Vo(Collection<SysTenant> collection) {
+        List<SysTenantVo> voList = collection.stream()
+                .map(any -> BeanUtil.toBean(any, SysTenantVo.class))
+                .collect(Collectors.toList());
+        if (collection instanceof Page) {
+            Page<SysTenant> page = (Page<SysTenant>)collection;
+            Page<SysTenantVo> pageVo = new Page<>();
+            BeanUtil.copyProperties(page,pageVo);
+            pageVo.addAll(voList);
+            voList = pageVo;
+        }
+        return voList;
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public Boolean insertByAddBo(SysTenantAddBo bo) {
+        return this.createTenant(bo);
+    }
+
+    @Override
+    public Boolean updateByEditBo(SysTenantEditBo bo) {
+        SysTenant update = BeanUtil.toBean(bo, SysTenant.class);
+        validEntityBeforeSave(update);
+        update.setUpdateTime(DateUtils.getNowTime());
+        return this.updateById(update);
+    }
+
+    /**
+     * 保存前的数据校验
+     *
+     * @param entity 实体类数据
+     */
+    private void validEntityBeforeSave(SysTenant entity){
+        //TODO 做一些数据校验,如唯一约束
+        if(checkNameUnique(entity)){
+            throw new CustomException("公司名已存在");
+        }
+    }
+
+    @Override
+    public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
+        if(isValid){
+            //TODO 做一些业务上的校验,判断是否需要校验
+        }
+        return this.removeByIds(ids);
+    }
+
+    private boolean checkNameUnique(SysTenant entity) {
+        SysTenant info = getOne(new LambdaQueryWrapper<SysTenant>()
+                .eq(SysTenant::getTenantName,entity.getTenantName())
+                .last("limit 1"));
+        if (Validator.isNotNull(info)) {
+            return true;
+        }
+        return false;
+    }
+
+
+    public boolean createTenant(SysTenantAddBo bo){
+        SysTenant add = BeanUtil.toBean(bo, SysTenant.class);
+        validEntityBeforeSave(add);
+        add.setCreateTime(DateUtils.getNowTime());
+        add.setUpdateTime(DateUtils.getNowTime());
+        this.save(add);
+        //创建属于新公司的admin用户
+        Long tenantId = add.getTenantId();
+        ServletUtils.getRequestAttributes().getResponse().setHeader("TenantId",String.valueOf(tenantId));
+        SysUser user = new SysUser();
+        user.setUserName("admin");
+        user.setNickName(bo.getTenantName());
+        user.setCreateBy("SAAS-"+SecurityUtils.getUsername());
+        user.setPassword(SecurityUtils.encryptPassword(bo.getPassword()));
+        userService.insertUser(user);
+        return true;
+    }
+
+}

+ 1 - 1
zhongzheng-framework/src/main/java/com/zhongzheng/framework/web/service/WxLoginService.java

@@ -86,6 +86,7 @@ public class WxLoginService
         return map;
     }
 
+    @Transactional(rollbackFor = Exception.class)
     public Map<String,String> login(WxLoginBody loginBody) {
         User user = getWxUnionIdUser(loginBody);
         if(user==null){
@@ -132,7 +133,6 @@ public class WxLoginService
      * @param tel
      * @return
      */
-    @Transactional(rollbackFor = Exception.class)
     public Boolean register_small(String openId,String unionId,String tel,String inviteCode) {
         User bo = new User();
         bo.setOpenId(openId);

+ 8 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/system/bo/SysTenantAddBo.java

@@ -4,6 +4,9 @@ import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import com.fasterxml.jackson.annotation.JsonFormat;
 import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
 import java.util.Date;
 
 
@@ -29,5 +32,10 @@ public class SysTenantAddBo {
     private Integer status;
     /** 名称 */
     @ApiModelProperty("名称")
+    @NotNull(message = "名称不能为空")
     private String tenantName;
+    /** admin密码*/
+    @ApiModelProperty("admin密码")
+    @NotNull(message = "admin密码不能为空")
+    private String password;
 }

+ 6 - 1
zhongzheng-system/src/main/java/com/zhongzheng/modules/system/service/impl/SysMenuServiceImpl.java

@@ -17,6 +17,7 @@ import com.zhongzheng.modules.system.service.ISysMenuService;
 import com.zhongzheng.modules.system.mapper.SysMenuMapper;
 import com.zhongzheng.modules.system.mapper.SysRoleMapper;
 import com.zhongzheng.modules.system.mapper.SysRoleMenuMapper;
+import com.zhongzheng.modules.system.service.ISysUserService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
@@ -38,6 +39,9 @@ public class SysMenuServiceImpl extends ServiceImpl<SysMenuMapper, SysMenu> impl
     @Autowired
     private SysRoleMenuMapper roleMenuMapper;
 
+    @Autowired
+    private ISysUserService userService;
+
     /**
      * 根据用户查询系统菜单列表
      *
@@ -58,8 +62,9 @@ public class SysMenuServiceImpl extends ServiceImpl<SysMenuMapper, SysMenu> impl
     @Override
     public List<SysMenu> selectMenuList(SysMenu menu, Long userId) {
         List<SysMenu> menuList = null;
+        SysUser sysUser = userService.selectUserById(userId);
         // 管理员显示所有菜单信息
-        if (SysUser.isAdmin(userId)) {
+        if (SysUser.isAdmin(sysUser.getUserName())) {
             menuList = list(new LambdaQueryWrapper<SysMenu>()
                     .like(StrUtil.isNotBlank(menu.getMenuName()),SysMenu::getMenuName,menu.getMenuName())
                     .eq(StrUtil.isNotBlank(menu.getVisible()),SysMenu::getVisible,menu.getVisible())