소스 검색

feature 代码提交

xiahan 3 주 전
부모
커밋
b59f281984
24개의 변경된 파일848개의 추가작업 그리고 34개의 파일을 삭제
  1. 5 0
      qhse-common/pom.xml
  2. 158 0
      qhse-common/src/main/java/com/rongwei/bscommon/system/config/MybatisConfig.java
  3. 200 0
      qhse-common/src/main/java/com/rongwei/bscommon/system/config/QuerySqlAdaptationInterceptor.java
  4. 5 0
      qhse-common/src/main/java/com/rongwei/bscommon/system/dao/QHSEUserDao.java
  5. 16 0
      qhse-common/src/main/java/com/rongwei/bscommon/system/fegin/QhseLoginAuth.java
  6. 17 0
      qhse-common/src/main/java/com/rongwei/bscommon/system/fegin/QhseLoginAuthImpl.java
  7. 1 1
      qhse-common/src/main/java/com/rongwei/bscommon/system/service/QhseItemService.java
  8. 3 0
      qhse-common/src/main/java/com/rongwei/bscommon/system/service/QHSELoginService.java
  9. 2 2
      qhse-common/src/main/java/com/rongwei/bscommon/system/service/RedisService.java
  10. 14 0
      qhse-common/src/main/java/com/rongwei/bscommon/system/service/QHSEUserService.java
  11. 2 2
      qhse-common/src/main/java/com/rongwei/bscommon/system/service/impl/FileFormatConversionServiceImpl.java
  12. 2 2
      qhse-common/src/main/java/com/rongwei/bscommon/system/service/impl/QhseQhseItemServiceImpl.java
  13. 145 10
      qhse-common/src/main/java/com/rongwei/bscommon/system/service/impl/QHSELoginServiceImpl.java
  14. 8 2
      qhse-common/src/main/java/com/rongwei/bscommon/system/service/impl/RedisServiceImpl.java
  15. 123 0
      qhse-common/src/main/java/com/rongwei/bscommon/system/service/impl/QHSEUserServiceImpl.java
  16. 1 1
      qhse-common/src/main/java/com/rongwei/bscommon/system/service/impl/QhseTargetResponsibilityDocumentServiceImpl.java
  17. 4 4
      qhse-common/src/main/java/com/rongwei/bscommon/system/service/impl/QhseVisitorManagementServiceImpl.java
  18. 5 5
      qhse-common/src/main/java/com/rongwei/bscommon/system/utils/QHSEUtils.java
  19. 111 0
      qhse-common/src/main/resources/mybatis/system/QHSEUserDao.xml
  20. 1 1
      qhse-common/src/main/resources/mybatis/sys/StudyFileRecordDao.xml
  21. 16 0
      qhse-entity/src/main/java/com/rongwei/bsentity/vo/LoginInVo.java
  22. 7 0
      qhse-server/src/main/java/com/rongwei/controller/QHSELoginController.java
  23. 0 2
      qhse-server/src/main/resources/bootstrap-dev.yml
  24. 2 2
      qhse-server/src/main/resources/bootstrap.yml

+ 5 - 0
qhse-common/pom.xml

@@ -78,6 +78,11 @@
             <artifactId>dysmsapi20170525</artifactId>
             <version>4.1.2</version>
         </dependency>
+        <dependency>
+            <groupId>com.rongwei</groupId>
+            <artifactId>rw-admin-common</artifactId>
+            <version>1.1-SNAPSHOT</version>
+        </dependency>
 <!--        <dependency>-->
 <!--            <groupId>com.aspose</groupId>-->
 <!--            <artifactId>aspose-cells</artifactId>-->

+ 158 - 0
qhse-common/src/main/java/com/rongwei/bscommon/system/config/MybatisConfig.java

@@ -0,0 +1,158 @@
+package com.rongwei.bscommon.system.config;
+
+import com.baomidou.mybatisplus.core.parser.ISqlParser;
+import com.baomidou.mybatisplus.core.parser.ISqlParserFilter;
+import com.baomidou.mybatisplus.core.parser.SqlParserHelper;
+import com.baomidou.mybatisplus.extension.plugins.tenant.TenantHandler;
+import com.baomidou.mybatisplus.extension.plugins.tenant.TenantSqlParser;
+import com.rongwei.rwcommonconfig.config.interceptor.QuerySqlAdaptationInterceptor;
+import com.rongwei.rwcommonconfig.config.interceptor.SaasPaginationInterceptor;
+import net.sf.jsqlparser.expression.Expression;
+import net.sf.jsqlparser.expression.LongValue;
+import org.apache.ibatis.mapping.MappedStatement;
+import org.apache.ibatis.reflection.MetaObject;
+import org.mybatis.spring.annotation.MapperScan;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.transaction.annotation.EnableTransactionManagement;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Created by duyisong on 17/5/28.
+ */
+@EnableTransactionManagement
+@Configuration
+@MapperScan("com.rongwei.bscommon.system.dao")
+public class MybatisConfig {
+
+
+    @Value("${page.size:#{null}}")
+    private Long pageSize;
+    /**
+     * 自定义查询sql多数据库适配
+     * @return
+     */
+    @Bean
+    public QuerySqlAdaptationInterceptor querySqlAdaptationInterceptor(){
+        QuerySqlAdaptationInterceptor sqlAdaptation = new QuerySqlAdaptationInterceptor();
+        return sqlAdaptation;
+    }
+
+    /*
+     * 分页插件,自动识别数据库类型
+     * 多租户,请参考官网【插件扩展】
+     */
+    @Bean
+    public SaasPaginationInterceptor paginationInterceptor() {
+        SaasPaginationInterceptor paginationInterceptor = new SaasPaginationInterceptor();
+        /*
+         * 【测试多租户】 SQL 解析处理拦截器<br>
+         * 这里固定写成住户 1 实际情况你可以从cookie读取,因此数据看不到 【 麻花藤 】 这条记录( 注意观察 SQL )<br>
+         */
+        List<ISqlParser> sqlParserList = new ArrayList<>();
+        TenantSqlParser tenantSqlParser = new TenantSqlParser();
+        tenantSqlParser.setTenantHandler(new TenantHandler() {
+            @Override
+            public Expression getTenantId(boolean a) {
+                // 该 where 条件 3.2.0 版本开始添加的,用于分区是否为在 where 条件中使用
+                // 此判断用于支持返回多个租户 ID 场景,具体使用查看示例工程
+                // 查询redis缓存的租户ID
+                return new LongValue(1L);
+            }
+
+            @Override
+            public String getTenantIdColumn() {
+                return "TENANTID";
+            }
+
+            @Override
+            public boolean doTableFilter(String tableName) {
+                // 这里可以判断是否过滤表,true表示过滤、false不过滤
+                /*
+                if ("user".equals(tableName)) {
+                    return true;
+                }*/
+                return true;
+            }
+        });
+        sqlParserList.add(tenantSqlParser);
+        paginationInterceptor.setSqlParserList(sqlParserList);
+        paginationInterceptor.setSqlParserFilter(new ISqlParserFilter() {
+            @Override
+            public boolean doFilter(MetaObject metaObject) {
+                MappedStatement ms = SqlParserHelper.getMappedStatement(metaObject);
+                // 过滤自定义查询此时无租户信息约束【 麻花藤 】出现
+                if ("com.rongwei.rwadmincommon.system.dao.getAll".equals(ms.getId())) {
+                    return true;
+                }
+                return false;
+            }
+        });
+        paginationInterceptor.setLimit(pageSize == null ? 10000 :pageSize);
+        return paginationInterceptor;
+    }
+
+    /**
+     * 打印 sql
+     */
+    /*@Bean
+    public PerformanceInterceptor performanceInterceptor() {
+        PerformanceInterceptor performanceInterceptor = new PerformanceInterceptor();
+        //格式化sql语句
+        Properties properties = new Properties();
+        properties.setProperty("format", "true");
+        performanceInterceptor.setProperties(properties);
+        return performanceInterceptor;
+    }*/
+
+    /*@Bean
+    public MapperScannerConfigurer mapperScannerConfigurer() {
+        log.info("[config] 注册 tkMtBatis");
+        MapperScannerConfigurer mapperScannerConfigurer = new MapperScannerConfigurer();
+        mapperScannerConfigurer.setBasePackage("com.rongwei.rwadmin.system.dao");
+        Properties properties = new Properties();
+        properties.setProperty("markerInterface", "com.rongwei.rwadmin.common.mapper.BaseDao");
+        mapperScannerConfigurer.setProperties(properties);
+        return mapperScannerConfigurer;
+    }
+
+    @Bean
+    public PageHelper pageHelper(DataSource dataSource) {
+        log.info("[config] 注册 MyBatis分页插件PageHelper");
+        PageHelper pageHelper = new PageHelper();
+        Properties p = new Properties();
+        p.setProperty("offsetAsPageNum", "true");
+        p.setProperty("rowBoundsWithCount", "true");
+        p.setProperty("reasonable", "true");
+        pageHelper.setProperties(p);
+        return pageHelper;
+    }*/
+
+
+    // 配置sqlSessionFactory
+    /*@Bean(name = "sqlSessionFactory")
+    public SqlSessionFactory sqlSessionFactoryBean(DataSource dataSource
+            ,QuerySqlAdaptationInterceptor sqlAdaptation,PaginationInterceptor paginationInterceptor) {
+        SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
+        bean.setDataSource(dataSource);
+        if(StringUtils.isNotBlank(typeAliasesPackage)){
+            bean.setTypeAliasesPackage(typeAliasesPackage);
+        }
+
+        // 自定义的sql日志拦截器
+        Interceptor sqlLogInterceptor = new SqlLogInterceptor();
+        Interceptor[] plugins =  new Interceptor[]{ sqlLogInterceptor};
+        bean.setPlugins(plugins);
+        try {
+            bean.setMapperLocations(resolver.getResources(xmlLocation));
+            return bean.getObject();
+        } catch (Exception e) {
+            e.printStackTrace();
+            throw new RuntimeException(e);
+        }
+    }*/
+
+}

+ 200 - 0
qhse-common/src/main/java/com/rongwei/bscommon/system/config/QuerySqlAdaptationInterceptor.java

@@ -0,0 +1,200 @@
+package com.rongwei.bscommon.system.config;
+
+import com.alibaba.druid.pool.DruidDataSource;
+import com.rongwei.commonservice.service.RedisService;
+import com.rongwei.rwadmincommon.system.vo.SysUserVo;
+import com.rongwei.rwcommon.utils.SqlAdaptationUtil;
+import com.rongwei.rwcommon.utils.StringUtils;
+import org.apache.ibatis.binding.MapperMethod;
+import org.apache.ibatis.executor.statement.StatementHandler;
+import org.apache.ibatis.mapping.BoundSql;
+import org.apache.ibatis.plugin.*;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.web.context.request.RequestContextHolder;
+import org.springframework.web.context.request.ServletRequestAttributes;
+
+import javax.servlet.http.HttpServletRequest;
+import java.lang.reflect.Field;
+import java.sql.Connection;
+import java.util.Properties;
+
+/**
+ * 自定义查询拦截器方法、适配多数据库语法
+ */
+@Intercepts({@Signature(type = StatementHandler.class, method = "prepare", args = {Connection.class, Integer.class})})
+public class QuerySqlAdaptationInterceptor implements Interceptor {
+
+    private static final Logger logger = LoggerFactory.getLogger(QuerySqlAdaptationInterceptor.class);
+
+    @Value("${saas.tenantmode:NONE}")
+    private String saasmode;
+
+    @Autowired
+    private RedisService redisService;
+
+    @Autowired
+    private DruidDataSource datasource;
+
+    @Override
+    public Object intercept(Invocation invocation) throws Throwable {
+//        DruidDataSource datasource = (DruidDataSource)DynamicDataSource.dataSourcesMap.get(DynamicDataSource.getDataSource());
+        // 获取数据库类型
+        String dbType = datasource.getDbType();
+        // 方法一
+        StatementHandler statementHandler = (StatementHandler) invocation.getTarget();
+        //映射工具
+//        MetaObject metaObject = SystemMetaObject.forObject(statementHandler);
+//        MetaObject metaObject = MetaObject.forObject(statementHandler, SystemMetaObject.DEFAULT_OBJECT_FACTORY, SystemMetaObject.DEFAULT_OBJECT_WRAPPER_FACTORY, new DefaultReflectorFactory());
+        //先拦截到RoutingStatementHandler,里面有个StatementHandler类型的delegate变量,其实现类是BaseStatementHandler,然后就到BaseStatementHandler的成员变量mappedStatement
+//        MappedStatement mappedStatement = (MappedStatement) metaObject.getValue("delegate.mappedStatement");
+        //id为执行的mapper方法的全路径名,如com.uv.dao.UserMapper.insertUser
+        BoundSql boundSql = statementHandler.getBoundSql();
+
+        //获取到原始sql语句
+        String sql = boundSql.getSql();
+        // dao参数
+        Object parObj = statementHandler.getParameterHandler().getParameterObject();
+        SqlAdaptationUtil sqlAdaptation = new SqlAdaptationUtil();
+        String mSql = sqlAdaptation.modifySql(sqlAdaptation.commonRuleAnalysis(sql),dbType,parObj);
+        //通过反射修改sql语句
+        Field field = boundSql.getClass().getDeclaredField("sql");
+        field.setAccessible(true);
+
+        // SaaS环境下schema切换
+        if("DATASOURCE".equals(saasmode)){
+            System.out.println("saas切换");
+            logger.info("saas切换");
+            String schema = null;
+            try{
+                schema = this.getSchema();
+            }catch (Exception e){
+                e.printStackTrace();
+            }
+            // 判断是否有参数(appointSchema)指定schema
+            if(parObj instanceof MapperMethod.ParamMap){
+                MapperMethod.ParamMap paramMap = (MapperMethod.ParamMap)parObj;
+                if(paramMap.containsKey("appointSchema") && paramMap.get("appointSchema") != null){
+                    String appointSchema = paramMap.get("appointSchema").toString();
+                    schema = appointSchema;
+                }
+            }
+            System.out.println("schema:"+schema);
+            logger.info("schema:"+schema);
+            if(StringUtils.isNotBlank(schema)){
+                // 多租户schema切换方案一:通过 USE databaseName; 实现切换
+                mSql = "USE " + schema + ";" + mSql;
+                System.out.println("mSql:"+mSql);
+                logger.info("mSql:"+mSql);
+                // 多租户schema切换方案二:直接获取Connection设置schema
+                /*Object[] objs = invocation.getArgs();
+                Connection conn = (Connection)objs[0];
+                conn.setSchema(schema);*/
+            }else{
+//                throw new Exception("SaaS模式下查不到相应schema");
+                System.out.println("SaaS模式下查不到相应schema");
+                logger.warn("SaaS模式下查不到相应schema");
+            }
+            /*Connection o = (Connection)invocation.getArgs()[0];
+            System.out.println("o.getSchema():"+o.getSchema());
+            o.setSchema(schema);
+            System.out.println("o.getSchema():"+o.getSchema());*/
+        }
+
+        field.set(boundSql, mSql);
+        //sql语句类型 select、delete、insert、update
+        /*if(SqlCommandType.SELECT == mappedStatement.getSqlCommandType()){
+            System.out.println("sql:"+sql);
+        }*/
+
+        // 返回
+        return invocation.proceed();
+    }
+
+    @Override
+    public Object plugin(Object target) {
+        return Plugin.wrap(target, this);
+    }
+
+    @Override
+    public void setProperties(Properties properties) {
+
+    }
+
+    /**
+     * SaaS模式下获取当前租户的数据库名
+     * @return
+     * @throws Exception
+     */
+    private String getSchema() throws Exception{
+        Long startTime = System.currentTimeMillis();
+        String schema = null;
+        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
+        if(attributes == null){
+            logger.error("ServletRequestAttributes为null");
+            throw new Exception("ServletRequestAttributes为null");
+        }
+        HttpServletRequest request = attributes.getRequest();
+        if(request == null){
+            logger.error("HttpServletRequest为null");
+            throw new Exception("HttpServletRequest为null");
+        }
+
+        schema = request.getHeader("schema");
+        if(StringUtils.isNotBlank(schema)) {
+            return schema;
+        }
+
+        String token = request.getHeader("token");
+        System.out.println("token:"+token);
+        logger.info("token:"+token);
+//        if(StringUtils.isBlank(token)){
+//            String incontrolToken = request.getHeader("incontrol-token");
+//            Object tokenDskey = request.getAttribute(Constants.SAAS_LOGIN_TOKEN);
+//            // 登录功能特殊处理获取DsKey
+//            if(tokenDskey != null){
+//                logger.info("tokenDskey:"+tokenDskey);
+//                schema = (String) tokenDskey;
+//            }
+//            // 某些特殊功能incontrolToken也可以作为token
+//            else if(StringUtils.isNotBlank(incontrolToken)){
+//                logger.info("incontrolToken:"+incontrolToken);
+//                schema = getSchemaByToken(incontrolToken);
+//            }
+//            // 某些特殊功能token放入线程全局变量中
+//            else if(StringUtils.isNotBlank(ThreadLocalResource.token.get())){
+//                logger.info("ThreadToken:"+ThreadLocalResource.token.get());
+//                token = ThreadLocalResource.token.get();
+//                schema = getSchemaByToken(token);
+//            }
+//        } else{
+//            schema = getSchemaByToken(token);
+//            System.out.println("Dskey:"+schema);
+//        }
+        schema = getSchemaByToken(token);
+        System.out.println("Dskey:"+schema);
+        Long endTime = System.currentTimeMillis();
+        System.out.println("查找schema时间为:"+(endTime-startTime));
+        return schema;
+    }
+
+    /**
+     * 根据token获取多租户模式的schema
+     * @param token
+     * @return
+     */
+    private String getSchemaByToken(String token){
+        SysUserVo currUser = null;
+        if(StringUtils.isNotEmpty(token)){
+            currUser = redisService.getLoginUser(token);
+        }
+        String schema = null;
+        if(currUser != null){
+            schema = currUser.getTenantDo().getDskey();
+        }
+        return schema;
+    }
+
+}

+ 5 - 0
qhse-common/src/main/java/com/rongwei/bscommon/system/dao/QHSEUserDao.java

@@ -2,6 +2,10 @@ package com.rongwei.bscommon.system.dao;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.rongwei.rwadmincommon.system.domain.SysUserDo;
+import com.rongwei.rwadmincommon.system.vo.SysPermissionVo;
+
+import java.util.List;
+import java.util.Map;
 
 /**
  * QHSEUserDao class
@@ -10,4 +14,5 @@ import com.rongwei.rwadmincommon.system.domain.SysUserDo;
  * @date 2025/08/25
  */
 public interface QHSEUserDao extends BaseMapper<SysUserDo> {
+    List<SysPermissionVo> getPermissionByUser(Map<String, Object> map);
 }

+ 16 - 0
qhse-common/src/main/java/com/rongwei/bscommon/system/fegin/QhseLoginAuth.java

@@ -0,0 +1,16 @@
+package com.rongwei.bscommon.system.fegin;
+
+import com.rongwei.rwadmincommon.system.vo.JwtAuthenticationRequest;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+
+import java.util.Map;
+
+@FeignClient(value = "rw-auth-server",fallback = QhseLoginAuthImpl.class, contextId = "qhseAuthService")
+public interface QhseLoginAuth {
+
+    @PostMapping(value = "/jwt/token")
+    Map<String,Object> getTokenInfo(@RequestBody JwtAuthenticationRequest authenticationRequest);
+
+}

+ 17 - 0
qhse-common/src/main/java/com/rongwei/bscommon/system/fegin/QhseLoginAuthImpl.java

@@ -0,0 +1,17 @@
+package com.rongwei.bscommon.system.fegin;
+
+import com.rongwei.rwadmincommon.system.vo.JwtAuthenticationRequest;
+import org.springframework.stereotype.Component;
+
+import java.util.HashMap;
+import java.util.Map;
+
+@Component
+public class QhseLoginAuthImpl implements QhseLoginAuth {
+    @Override
+    public Map<String,Object> getTokenInfo(JwtAuthenticationRequest authenticationRequest) {
+        Map<String,Object> map = new HashMap<>();
+        map.put("msg","ServerAbnormal");
+        return map;
+    }
+}

+ 1 - 1
qhse-common/src/main/java/com/rongwei/bscommon/system/service/QhseItemService.java

@@ -11,6 +11,6 @@ import com.rongwei.rwcommonentity.commonservers.domain.SysFileItemDo;
  * @email sunlightcs@gmail.com
  * @date 2019-10-08 14:53:10
  */
-public interface QhseItemService extends IService<SysFileItemDo> {
+public interface QHSEFileItemService extends IService<SysFileItemDo> {
 }
 

+ 3 - 0
qhse-common/src/main/java/com/rongwei/bscommon/system/service/QHSELoginService.java

@@ -1,5 +1,6 @@
 package com.rongwei.bscommon.system.service;
 
+import com.rongwei.bsentity.vo.LoginInVo;
 import com.rongwei.rwadmincommon.system.domain.UserLoginVo;
 import com.rongwei.rwcommon.base.R;
 
@@ -13,4 +14,6 @@ import javax.servlet.http.HttpServletRequest;
  */
 public interface QHSELoginService {
     R sendSmsCode(UserLoginVo userLogin, HttpServletRequest request);
+
+    R loginIn(LoginInVo userLogin);
 }

+ 2 - 2
qhse-common/src/main/java/com/rongwei/bscommon/system/service/RedisService.java

@@ -6,7 +6,7 @@ import com.rongwei.rwadmincommon.system.vo.SysUserVo;
 
 import java.util.Set;
 
-public interface RedisService {
+public interface QHSERedisService {
 
 
     void redisCatchInit(String key, Object obj, int expireTime);
@@ -24,5 +24,5 @@ public interface RedisService {
     void  updateValueNoUpdateExpireTime(String key, Object value);
 
     long getExpireTime(String key);
-
+    void setLoginUser(String token, SysUserVo user);
 }

+ 14 - 0
qhse-common/src/main/java/com/rongwei/bscommon/system/service/QHSEUserService.java

@@ -1,7 +1,19 @@
 package com.rongwei.bscommon.system.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.rongwei.rwadmincommon.system.domain.SysOrganizationDo;
+import com.rongwei.rwadmincommon.system.domain.SysRoleDo;
 import com.rongwei.rwadmincommon.system.domain.SysUserDo;
+import com.rongwei.rwadmincommon.system.vo.SysOrganizationVo;
+import com.rongwei.rwadmincommon.system.vo.SysPermissionVo;
+import com.rongwei.rwadmincommon.system.vo.SysUserVo;
+import com.rongwei.rwcommon.utils.Constants;
+import com.rongwei.rwcommon.utils.TreeCodeCompare;
+
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
 
 /**
  * QHSEUserService class
@@ -10,4 +22,6 @@ import com.rongwei.rwadmincommon.system.domain.SysUserDo;
  * @date 2025/08/25
  */
 public interface QHSEUserService extends IService<SysUserDo> {
+    void getUserRoleOrgPer(SysUserVo sysUserVo);
+
 }

+ 2 - 2
qhse-common/src/main/java/com/rongwei/bscommon/system/service/impl/FileFormatConversionServiceImpl.java

@@ -49,7 +49,7 @@ public class FileFormatConversionServiceImpl implements FileFormatConversionServ
     private static final Logger log = LoggerFactory.getLogger(FileFormatConversionServiceImpl.class);
 
     @Autowired
-    private QhseQhseItemServiceImpl qhseFileItemServiceImpl;
+    private QHSEFileItemServiceImpl qhseFileItemServiceImpl;
 
     public SysFileItemDo fileCheck(String id) {
         SysFileItemDo sysFileItemDo = qhseFileItemServiceImpl.getById(id);
@@ -91,7 +91,7 @@ public class FileFormatConversionServiceImpl implements FileFormatConversionServ
         String waterMarkStr = "";
         if (waterMark) {
             SysUserVo currentUser = QHSEUtils.getCurrentUser();
-            waterMarkStr = String.format(DEFAULT_WATER_MARK, currentUser.getAccount(), currentUser.getName());
+            waterMarkStr = String.format(DEFAULT_WATER_MARK, StringUtils.isBlank(currentUser.getCode()) ? "" : currentUser.getCode(), currentUser.getName());
         }
         FontSettings fontSettings = new FontSettings();
         fontSettings.setFontsFolder("/usr/share/fonts/simsun.ttc", true); // 指定中文字体目录

+ 2 - 2
qhse-common/src/main/java/com/rongwei/bscommon/system/service/impl/QhseQhseItemServiceImpl.java

@@ -2,11 +2,11 @@ package com.rongwei.bscommon.system.service.impl;
 
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.rongwei.bscommon.system.dao.QHSEFileItemDao;
-import com.rongwei.bscommon.system.service.QhseItemService;
+import com.rongwei.bscommon.system.service.QHSEFileItemService;
 import com.rongwei.rwcommonentity.commonservers.domain.SysFileItemDo;
 import org.springframework.stereotype.Service;
 
 @Service
-public class QhseQhseItemServiceImpl extends ServiceImpl<QHSEFileItemDao, SysFileItemDo> implements QhseItemService {
+public class QHSEFileItemServiceImpl extends ServiceImpl<QHSEFileItemDao, SysFileItemDo> implements QHSEFileItemService {
 
 }

+ 145 - 10
qhse-common/src/main/java/com/rongwei/bscommon/system/service/impl/QHSELoginServiceImpl.java

@@ -1,26 +1,38 @@
 package com.rongwei.bscommon.system.service.impl;
 
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.json.JSONUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.rongwei.bscommon.system.config.SmsCodeConfig;
+import com.rongwei.bscommon.system.fegin.QhseLoginAuth;
 import com.rongwei.bscommon.system.service.AliyunSmsService;
 import com.rongwei.bscommon.system.service.QHSELoginService;
+import com.rongwei.bsentity.vo.LoginInVo;
+import com.rongwei.commonservice.service.SysConfigService;
+import com.rongwei.rwadmincommon.system.dao.SysModuleHelpDao;
+import com.rongwei.rwadmincommon.system.domain.SysLastvisitRouteDo;
+import com.rongwei.rwadmincommon.system.domain.SysModuleHelpDo;
 import com.rongwei.rwadmincommon.system.domain.SysUserDo;
 import com.rongwei.rwadmincommon.system.domain.UserLoginVo;
+import com.rongwei.rwadmincommon.system.service.SysLastvisitRouteService;
+import com.rongwei.rwadmincommon.system.service.SysUserService;
+import com.rongwei.rwadmincommon.system.vo.JwtAuthenticationRequest;
+import com.rongwei.rwadmincommon.system.vo.SysUserVo;
 import com.rongwei.rwcommon.base.BaseDo;
 import com.rongwei.rwcommon.base.R;
+import com.rongwei.rwcommon.base.exception.CustomException;
 import com.rongwei.rwcommon.utils.SecurityUtil;
 import com.rongwei.rwcommon.utils.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.cloud.context.config.annotation.RefreshScope;
 import org.springframework.stereotype.Service;
 
 import javax.servlet.http.HttpServletRequest;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Random;
+import java.util.*;
 
 /**
  * QHSELoginServiceImpl class
@@ -38,10 +50,21 @@ public class QHSELoginServiceImpl implements QHSELoginService {
     @Autowired
     private SmsCodeConfig smsCodeConfig;
     @Autowired
-    private RedisServiceImpl redisService;
+    private QHSEQHSERedisServiceImpl redisService;
     @Autowired
     private AliyunSmsService aliyunSmsService;
-
+    @Value("${jwt.expire:1209600}")
+    private int jwtExpire;
+    @Autowired
+    private QhseLoginAuth loginAuth;
+    @Autowired
+    private SysUserService sysUserService;
+    @Autowired
+    private SysConfigService sysConfigService;
+    @Autowired
+    private SysLastvisitRouteService sysLastvisitRouteService;
+    @Autowired
+    private SysModuleHelpDao sysModuleHelpDao;
     /**
      * 双因素认证输入账号,密码,手机验证码:
      * 1、输入用户名密码+手机号验证码双因素登录系统;
@@ -105,9 +128,9 @@ public class QHSELoginServiceImpl implements QHSELoginService {
         // 生成6位数验证码
         int smsCode = generateSms();
         Map<String, Object> map = new HashMap<>();
-        map.put("smsCode", smsCode);
         if (!smsCodeConfig.isSendEnabled()) {
-            redisService.redisCatchInit(smsKey, smsCode, 60);
+            map.put("smsCode", smsCode);
+            redisService.redisCatchInit(smsKey, smsCode, 100);
             return R.ok(map);
         }
         try {
@@ -120,14 +143,126 @@ public class QHSELoginServiceImpl implements QHSELoginService {
             throw new RuntimeException(e.getMessage());
         }
         // 验证码60秒过期
-        redisService.redisCatchInit(smsKey, smsCode, 60);
+        redisService.redisCatchInit(smsKey, smsCode, 100);
         redisService.removeKey(smsErrorKey);
         return R.ok(map);
     }
 
+    /**
+     * 登录逻辑处理
+     * @param userLogin
+     * @return
+     */
+    @Override
+    public R loginIn(LoginInVo userLogin) {
+        // 验证码校验
+        String username = userLogin.getUsername();
+        List<SysUserDo> sysUserDos = qhseUserService.list(new LambdaQueryWrapper<SysUserDo>()
+                .eq(BaseDo::getDeleted, "0").eq(SysUserDo::getAccount, username));
+        if (sysUserDos.size() != 1) {
+            log.error("该账号不存在请重新输入");
+            return R.error("ZHBCZ","该账号不存在请重新输入");
+        }
+        SysUserDo sysUserDo = sysUserDos.get(0);
+        if ("1".equals(sysUserDo.getEnabled())) {
+            log.error("验证码错误");
+            return R.error("YHBKY","账号不可用,请联系管理员");
+        }
+        String mobile = sysUserDo.getMobile();
+        //密码校验
+        String secPas = SecurityUtil.getSaltMd5AndSha(userLogin.getPassword(), sysUserDo.getId());
+        if(userLogin.getPassword().equals(secPas)){
+            log.error("密码错误");
+            throw new CustomException("密码错误!请检查账号");
+        }
+        // 验证码校验
+        String smsKey = "smscode-" + mobile;
+        if(!redisService.hasKey(smsKey)){
+            log.error("验证码已过期请重新获取");
+            return R.error("YZMGQ","验证码已过期请重新获取");
+        }
+        String cacheSmsCode = redisService.getRedisCatchObj(smsKey).toString();
+        if(!cacheSmsCode.equals(userLogin.getSmsCode())){
+            log.error("验证码错误");
+            return R.error("YZMCW","验证码错误请重新输入");
+        }
+        // UserLoginVo userLoginVo= new UserLoginVo();
+        // userLoginVo.setUsername(userLogin.getUsername());
+        // userLoginVo.setPassword(userLogin.getPassword());
+        // R login = qhseAdminFegin.login(userLoginVo);
+        //token生成
+        JwtAuthenticationRequest jwtAuthenticationRequest = new JwtAuthenticationRequest(sysUserDo.getId(), sysUserDo.getAccount(), sysUserDo.getName());
+
+        jwtAuthenticationRequest.setExpire(jwtExpire);
+
+        Map<String, Object> tokenmap = loginAuth.getTokenInfo(jwtAuthenticationRequest);
+        String token = (String) tokenmap.get("token");
+        if ("ServerAbnormal".equals(token)) {
+            log.error("认证服务异常");
+            throw new RuntimeException("登录异常!请联系系统管理员");
+        }
+
+        // 用户
+        SysUserVo sysUserVo = new SysUserVo();
+        BeanUtils.copyProperties(sysUserDo, sysUserVo);
+        qhseUserService.getUserRoleOrgPer(sysUserVo);
+
+        // 设置密码是否过期
+        String pwConfig = sysConfigService.getContentByConfigCode("pwConfig");
+        if (StringUtils.isNotBlank(pwConfig)) {
+            cn.hutool.json.JSONObject pwConfigJo = JSONUtil.parseObj(pwConfig);
+            if (pwConfigJo.getInt("overdueDays") != null) {
+                int overdueDays = pwConfigJo.getInt("overdueDays");
+                String userRoption = sysUserVo.getRoption();
+                if (StringUtils.isNotBlank(userRoption)) {
+                    cn.hutool.json.JSONObject userRoptionJo = JSONUtil.parseObj(userRoption);
+                    if (userRoptionJo.containsKey("lastUpdatePwTime")) {
+                        String lastUpdatePwTime = userRoptionJo.getStr("lastUpdatePwTime");
+                        Date oDay = DateUtil.offsetDay(DateUtil.parse(lastUpdatePwTime, "yyyy-MM-dd HH:mm:ss"), overdueDays);
+                        // 超过强制修改密码的天数了
+                        if (oDay != null && DateUtil.compare(new Date(), oDay) >= 0) {
+                            sysUserVo.setHasPwOverdue("overdue");
+                        }
+                    }
+                }
+            }
+            if (pwConfigJo.getBool("updateFirst", false)) {
+                Boolean updateFirst = pwConfigJo.getBool("updateFirst");
+                if (updateFirst) {
+                    String userRoption = sysUserVo.getRoption();
+                    if (StringUtils.isNotBlank(userRoption)) {
+                        cn.hutool.json.JSONObject userRoptionJo = JSONUtil.parseObj(userRoption);
+                        // 当updateFirst=true以及没有lastUpdatePwTime时,判定为未修改初始密码
+                        if (!userRoptionJo.containsKey("lastUpdatePwTime")) {
+                            sysUserVo.setHasPwOverdue("overdue");
+                        }
+                    } else {
+                        sysUserVo.setHasPwOverdue("overdue");
+                    }
+                }
+            }
+        }
+        setModuleHelp(sysUserVo);
+        // 设置最后一次登录的路由
+        List<SysLastvisitRouteDo> lastvisitRouteDos = sysLastvisitRouteService.list(new LambdaQueryWrapper<SysLastvisitRouteDo>()
+                .eq(SysLastvisitRouteDo::getUserid, sysUserVo.getId()).orderByAsc(SysLastvisitRouteDo::getRoutesort));
+        sysUserVo.setSysLastvisitRouteDos(lastvisitRouteDos);
+        // 菜单
+        Map<String, Object> map = new HashMap<>();
+        map.put("token", token);
+        map.put("userInfo", sysUserVo);
+        //redis缓存登录用户信息
+        redisService.setLoginUser(token, sysUserVo);
+        redisService.removeKey(smsKey);
+        return R.ok(map);
+    }
+
     public int generateSms() {
         return 100000 + new Random().nextInt(900000);
     }
 
-
+    private void setModuleHelp(SysUserVo sysUserVo){
+        List<SysModuleHelpDo> sysModuleHelpDos = sysModuleHelpDao.selectList(new LambdaQueryWrapper<SysModuleHelpDo>());
+        sysUserVo.setSysmodulehelp(sysModuleHelpDos);
+    }
 }

+ 8 - 2
qhse-common/src/main/java/com/rongwei/bscommon/system/service/impl/RedisServiceImpl.java

@@ -6,7 +6,7 @@ import com.fasterxml.jackson.databind.DeserializationFeature;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.SerializationFeature;
 import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
-import com.rongwei.bscommon.system.service.RedisService;
+import com.rongwei.bscommon.system.service.QHSERedisService;
 import com.rongwei.rwadmincommon.system.vo.SysUserVo;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
@@ -20,7 +20,7 @@ import java.util.Set;
 import java.util.concurrent.TimeUnit;
 
 @Service("QhseRedisService")
-public class RedisServiceImpl implements RedisService {
+public class QHSEQHSERedisServiceImpl implements QHSERedisService {
 
     @Value("${jwt.expire:360000}")
     private int expire;
@@ -109,4 +109,10 @@ public class RedisServiceImpl implements RedisService {
     public SysUserVo getLoginUser(String token) {
         return (SysUserVo) redisTemplate.opsForValue().get("token-" + token);
     }
+
+    @Override
+    public void setLoginUser(String token,SysUserVo user) {
+//        redisTemplate.opsForValue().set("token-"+token,user,expire*900,TimeUnit.DAYS);
+        redisTemplate.opsForValue().set("token-"+token,user,expire, TimeUnit.SECONDS);
+    }
 }

+ 123 - 0
qhse-common/src/main/java/com/rongwei/bscommon/system/service/impl/QHSEUserServiceImpl.java

@@ -3,9 +3,26 @@ package com.rongwei.bscommon.system.service.impl;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.rongwei.bscommon.system.dao.QHSEUserDao;
 import com.rongwei.bscommon.system.service.QHSEUserService;
+import com.rongwei.rwadmincommon.system.dao.SysOrganizationDao;
+import com.rongwei.rwadmincommon.system.domain.SysOrganizationDo;
+import com.rongwei.rwadmincommon.system.domain.SysRoleDo;
 import com.rongwei.rwadmincommon.system.domain.SysUserDo;
+import com.rongwei.rwadmincommon.system.service.impl.SysOrganizationServiceImpl;
+import com.rongwei.rwadmincommon.system.service.impl.SysRoleServiceImpl;
+import com.rongwei.rwadmincommon.system.vo.SysOrganizationVo;
+import com.rongwei.rwadmincommon.system.vo.SysPermissionVo;
+import com.rongwei.rwadmincommon.system.vo.SysUserVo;
+import com.rongwei.rwcommon.utils.Constants;
+import com.rongwei.rwcommon.utils.TreeCodeCompare;
+import org.checkerframework.checker.units.qual.A;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
 /**
  * QHSEUserServiceImpl class
  *
@@ -15,4 +32,110 @@ import org.springframework.stereotype.Service;
 @Service
 public class QHSEUserServiceImpl extends ServiceImpl<QHSEUserDao, SysUserDo>
         implements QHSEUserService {
+    @Autowired
+    private QHSEUserDao qhseUserDao;
+    @Autowired
+    private SysRoleServiceImpl sysRoleService;
+    @Autowired
+    private SysOrganizationDao sysOrganizationDao;
+
+    public void getUserRoleOrgPer(SysUserVo sysUserVo) {
+        //获取用户角色
+        List<SysRoleDo> roles = sysRoleService.getRolesByUser(sysUserVo.getId());
+        sysUserVo.setRoleDos(roles);
+        //获取用户部门
+        List<SysOrganizationVo> organizations = sysOrganizationDao.getOrgByUser(sysUserVo.getId());
+        sysUserVo.setOrganizationDoList(organizations);
+        //获取用户所有可见资源权限
+        Map<String, Object> map = new HashMap<>();
+        //角色ids
+        String rolespar = "";
+        if (roles != null && roles.size() > 0) {
+            for (SysRoleDo role : roles) {
+                if ("".equals(rolespar)) {
+                    rolespar = "'" + role.getId() + "'";
+                } else {
+                    rolespar = rolespar + "," + "'" + role.getId() + "'";
+                }
+            }
+        }
+        if (!"".equals(rolespar)) {
+            map.put("roles", rolespar);
+        }
+        //部门ids
+        String orgids = "";
+        if (organizations != null && organizations.size() > 0) {
+            for (SysOrganizationDo organizationDo : organizations) {
+                if ("".equals(orgids)) {
+                    orgids = "'" + organizationDo.getId() + "'";
+                } else {
+                    orgids = orgids + ",'" + organizationDo.getId() + "'";
+                }
+            }
+        }
+        if (!"".equals(orgids)) {
+            map.put("orgids", orgids);
+        }
+        //获取资源权限
+        map.put("userid", sysUserVo.getId());
+        List<SysPermissionVo> permissions = getPermissionByUser(map);
+        TreeCodeCompare<SysPermissionVo> treeCodeCompare = new TreeCodeCompare();
+        Collections.sort(permissions, treeCodeCompare);
+        // 过滤没有子节点的模块
+        if (permissions != null && permissions.size() > 0) {
+            for (int i = 0; i < permissions.size(); i++) {
+                // 非叶子节点以及系统模块需要过滤
+                if ("n".equalsIgnoreCase(permissions.get(i).getSysModuleDo().getIsleaf())
+                        && Constants.MODULETYPE_MODULE.equals(permissions.get(i).getSysModuleDo().getModuletype())) {
+                    boolean isRemove = true;
+                    for (SysPermissionVo permissionVo : permissions) {
+                        if (permissions.get(i).getSysModuleDo().getId().equals(permissionVo.getSysModuleDo().getPid())) {
+                            isRemove = false;
+                        }
+                    }
+                    if (isRemove) {
+                        permissions.remove(i);
+                        i--;
+                    }
+                }
+            }
+        }
+        sysUserVo.setSysPermissionVos(permissions);
+    }
+
+    public List<SysPermissionVo> getPermissionByUser(Map<String, Object> map) {
+        List<SysPermissionVo> sysPermissionVos = null;
+        // 正选权限
+        String sqlpar = null;
+        if(map.get("roles") != null || map.get("userid") != null || map.get("orgids") != null){
+            // 角色权限
+            if(map.get("roles") != null){
+                if(sqlpar == null){
+                    sqlpar = "OR (OPERATIONTYPE = '" + Constants.SYS_OPERATIONTYPE_ROLE + "' and OPERATIONID in ("+map.get("roles")+"))";
+                }else{
+                    sqlpar = sqlpar+"OR (OPERATIONTYPE = '" + Constants.SYS_OPERATIONTYPE_ROLE + "' and OPERATIONID in ("+map.get("roles")+"))";
+                }
+            }
+            // 用户权限
+            if(map.get("userid") != null){
+                if(sqlpar == null){
+                    sqlpar = "OR (OPERATIONTYPE = '" + Constants.SYS_OPERATIONTYPE_USER + "' and OPERATIONID='"+map.get("userid")+"')";
+                }else{
+                    sqlpar = sqlpar+"OR (OPERATIONTYPE = '" + Constants.SYS_OPERATIONTYPE_USER + "' and OPERATIONID='"+map.get("userid")+"')";
+                }
+            }
+            // 组织机构权限
+            if(map.get("orgids") != null){
+                if(sqlpar == null){
+                    sqlpar = "OR (OPERATIONTYPE = '" + Constants.SYS_OPERATIONTYPE_ORG + "' and OPERATIONID in ("+map.get("orgids")+"))";
+                }else{
+                    sqlpar = sqlpar+"OR (OPERATIONTYPE = '" + Constants.SYS_OPERATIONTYPE_ORG + "' and OPERATIONID in ("+map.get("orgids")+"))";
+                }
+            }
+            sqlpar = sqlpar.replaceFirst("OR","");
+        }
+        map.put("sqlpar",sqlpar);
+        sysPermissionVos = qhseUserDao.getPermissionByUser(map);
+        return sysPermissionVos;
+    }
 }

+ 1 - 1
qhse-common/src/main/java/com/rongwei/bscommon/system/service/impl/QhseTargetResponsibilityDocumentServiceImpl.java

@@ -55,7 +55,7 @@ public class QhseTargetResponsibilityDocumentServiceImpl extends ServiceImpl<Qhs
 
     private static final Logger log = LoggerFactory.getLogger(QhseTargetResponsibilityDocumentServiceImpl.class);
     @Autowired
-    private QhseQhseItemServiceImpl qhseFileItemServiceImpl;
+    private QHSEFileItemServiceImpl qhseFileItemServiceImpl;
 
     @Override
     public void lettersOfResponsibilitySignaturePreview(String mainId, String subTableId, HttpServletResponse response) {

+ 4 - 4
qhse-common/src/main/java/com/rongwei/bscommon/system/service/impl/QhseVisitorManagementServiceImpl.java

@@ -6,8 +6,8 @@ import com.aspose.words.Document;
 import com.aspose.words.SaveFormat;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.rongwei.bscommon.system.fegin.QhseAdminFeginService;
 import com.rongwei.bscommon.system.dao.QhseVisitorManagementDao;
+import com.rongwei.bscommon.system.fegin.QhseAdminFeginService;
 import com.rongwei.bscommon.system.service.QhseVisitorManagementService;
 import com.rongwei.bscommon.system.utils.WordMergeHandler;
 import com.rongwei.bscommon.system.utils.WordUtils;
@@ -46,7 +46,7 @@ public class QhseVisitorManagementServiceImpl extends ServiceImpl<QhseVisitorMan
     private final Logger logger = LoggerFactory.getLogger(getClass());
 
     @Autowired
-    private QhseAdminFeginService qhseAdminFeginService;
+    private QhseAdminFeginService qhseAdminFegin;
 
     @Autowired
     private QhseVisitorManagementDao qhseVisitorManagementDao;
@@ -59,11 +59,11 @@ public class QhseVisitorManagementServiceImpl extends ServiceImpl<QhseVisitorMan
 
 
     @Autowired
-    private QhseQhseItemServiceImpl qhseFileItemServiceImpl;
+    private QHSEFileItemServiceImpl qhseFileItemServiceImpl;
 
     @Override
     public R generalMsInsert(MasterSlaveInsertVo masterSlaveInsert) {
-       return qhseAdminFeginService.generalMsInsert(masterSlaveInsert);
+       return qhseAdminFegin.generalMsInsert(masterSlaveInsert);
     }
 
     @Override

+ 5 - 5
qhse-common/src/main/java/com/rongwei/bscommon/system/utils/QHSEUtils.java

@@ -1,6 +1,6 @@
 package com.rongwei.bscommon.system.utils;
 
-import com.rongwei.bscommon.system.service.RedisService;
+import com.rongwei.bscommon.system.service.QHSERedisService;
 import com.rongwei.rwadmincommon.system.domain.SysUserDo;
 import com.rongwei.rwadmincommon.system.vo.SysUserVo;
 import com.rongwei.rwcommon.base.BaseDo;
@@ -23,9 +23,9 @@ import java.util.Date;
  */
 @Component
 public class QHSEUtils {
-    private static RedisService redisService;
+    private static QHSERedisService QHSERedisService;
     @Autowired
-    private RedisService autoRedisService;
+    private QHSERedisService autoQHSERedisService;
 
     /**
      * 获取当前的登陆人信息
@@ -41,7 +41,7 @@ public class QHSEUtils {
             if (request != null) {
                 String token = request.getHeader("token");
                 if (com.rongwei.rwcommon.utils.StringUtils.isNotEmpty(token)) {
-                    currUser = redisService.getLoginUser(token);
+                    currUser = QHSERedisService.getLoginUser(token);
                 }
             }
         }
@@ -76,7 +76,7 @@ public class QHSEUtils {
     @PostConstruct
     public void init() {
 
-        redisService = autoRedisService;
+        QHSERedisService = autoQHSERedisService;
     }
 
     public static String getIp(HttpServletRequest request) {

+ 111 - 0
qhse-common/src/main/resources/mybatis/system/QHSEUserDao.xml

@@ -0,0 +1,111 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.rongwei.bscommon.system.dao.QHSEUserDao">
+    <select id="getPermissionByUser" resultMap="sysPermissionMap">
+        select DISTINCT b.*,
+        c.TREECODE AS "TREECODE",
+        c.ID AS "sysModuleDo.ID",
+        c.PID AS "sysModuleDo.PID",
+        c.FULLPID AS "sysModuleDo.FULLPID",
+        c.LEVEL AS "sysModuleDo.LEVEL",
+        c.ISLEAF AS "sysModuleDo.ISLEAF",
+        c.TREECODE AS "sysModuleDo.TREECODE",
+        c.CODE AS "sysModuleDo.CODE",
+        c.NAME AS "sysModuleDo.NAME",
+        c.ENNAME AS "sysModuleDo.ENNAME",
+        c.ICON AS "sysModuleDo.ICON",
+        c.MODULETYPE AS "sysModuleDo.MODULETYPE",
+        c.URLADDR AS "sysModuleDo.URLADDR",
+        c.PATHADDR AS "sysModuleDo.PATHADDR",
+        c.TARGET AS "sysModuleDo.TARGET",
+        c.ISEXPANDED AS "sysModuleDo.ISEXPANDED",
+        c.SORT AS "sysModuleDo.SORT",
+        c.VIEWTYPE AS "sysModuleDo.VIEWTYPE",
+        c.ENABLED AS "sysModuleDo.ENABLED",
+        c.ROPTION AS "sysModuleDo.ROPTION",
+        c.DELETED AS "sysModuleDo.DELETED",
+        c.REMARK AS "sysModuleDo.REMARK",
+        c.CREATEDATE AS "sysModuleDo.CREATEDATE",
+        c.CREATEUSERID AS "sysModuleDo.CREATEUSERID",
+        c.MODIFYDATE AS "sysModuleDo.MODIFYDATE",
+        c.MODIFYUSERID AS "sysModuleDo.MODIFYUSERID",
+        c.CLIENTTYPE AS "sysModuleDo.CLIENTTYPE",
+        c.OPENTYPE AS "sysModuleDo.OPENTYPE"
+        from sys_permission_operation a LEFT JOIN sys_permission b on a.PERMISSIONID=b.ID
+        LEFT JOIN sys_module c on b.MODULEID=c.ID
+        <where>
+            a.DELETED = '0' AND b.DELETED = '0' AND c.DELETED = '0'
+            <if test="moduletype != null">
+                AND c.MODULETYPE in (${moduletype}))
+            </if>
+            <if test="permissiontype != null">
+                AND b.PERMISSIONTYPE in (${permissiontype}))
+            </if>
+            <if test="sqlpar != null">
+                AND (${sqlpar})
+            </if>
+            AND (c.MODULETYPE != '20' or (c.MODULETYPE = '20' AND not EXISTS (select * from sys_permission_operation m left join sys_permission n on m.PERMISSIONID=n.ID
+            where m.DELETED='0' and n.DELETED='0' and m.OPERATIONTYPE = '25' and n.MODULEID=c.ID and m.OPERATIONID = #{userid})))
+        </where>
+
+        <choose>
+            <when test="orderItems !=null and orderItems != ''">
+                ORDER BY ${orderItems}
+            </when>
+            <!--
+            <otherwise>
+                ORDER BY LEVEL ASC,TREECODE ASC,SORT ASC
+            </otherwise>
+            -->
+            <otherwise>
+                ORDER BY SORT ASC
+            </otherwise>
+        </choose>
+    </select>
+    <resultMap type="com.rongwei.rwadmincommon.system.vo.SysPermissionVo" id="sysPermissionMap">
+        <id property="id" column="ID"/>
+        <result property="permissiontype" column="PERMISSIONTYPE"/>
+        <result property="moduleid" column="MODULEID"/>
+        <result property="code" column="CODE"/>
+        <result property="name" column="NAME"/>
+        <result property="enabled" column="ENABLED"/>
+        <result property="roption" column="ROPTION"/>
+        <result property="deleted" column="DELETED"/>
+        <result property="remark" column="REMARK"/>
+        <result property="createdate" column="CREATEDATE"/>
+        <result property="createuserid" column="CREATEUSERID"/>
+        <result property="modifydate" column="MODIFYDATE"/>
+        <result property="modifyuserid" column="MODIFYUSERID"/>
+        <result property="treecode" column="TREECODE"/>
+
+        <association property="sysModuleDo" javaType="com.rongwei.rwadmincommon.system.vo.SysModuleVo">
+            <id column="sysModuleDo.ID" property="id"></id>
+            <result property="pid" column="sysModuleDo.PID"/>
+            <result property="fullpid" column="sysModuleDo.FULLPID"/>
+            <result property="level" column="sysModuleDo.LEVEL"/>
+            <result property="isleaf" column="sysModuleDo.ISLEAF"/>
+            <result property="code" column="sysModuleDo.CODE"/>
+            <result property="name" column="sysModuleDo.NAME"/>
+            <result property="enname" column="sysModuleDo.ENNAME"/>
+            <result property="icon" column="sysModuleDo.ICON"/>
+            <result property="moduletype" column="sysModuleDo.MODULETYPE"/>
+            <result property="urladdr" column="sysModuleDo.URLADDR"/>
+            <result property="pathaddr" column="sysModuleDo.PATHADDR"/>
+            <result property="target" column="sysModuleDo.TARGET"/>
+            <result property="isexpanded" column="sysModuleDo.ISEXPANDED"/>
+            <result property="sort" column="sysModuleDo.SORT"/>
+            <result property="viewtype" column="sysModuleDo.VIEWTYPE"/>
+            <result property="enabled" column="sysModuleDo.ENABLED"/>
+            <result property="roption" column="sysModuleDo.ROPTION"/>
+            <result property="deleted" column="sysModuleDo.DELETED"/>
+            <result property="remark" column="sysModuleDo.REMARK"/>
+            <result property="createdate" column="sysModuleDo.CREATEDATE"/>
+            <result property="createuserid" column="sysModuleDo.CREATEUSERID"/>
+            <result property="modifydate" column="sysModuleDo.MODIFYDATE"/>
+            <result property="modifyuserid" column="sysModuleDo.MODIFYUSERID"/>
+            <result property="clienttype" column="sysModuleDo.CLIENTTYPE"/>
+            <result property="opentype" column="sysModuleDo.OPENTYPE"/>
+        </association>
+    </resultMap>
+
+</mapper>

+ 1 - 1
qhse-common/src/main/resources/mybatis/sys/StudyFileRecordDao.xml

@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
-<mapper namespace="com.rongwei.bscommon.sys.dao.StudyFileRecordDao">
+<mapper namespace="com.rongwei.bscommon.system.dao.StudyFileRecordDao">
     <select id="selectLatestRecordByMainId" resultType="com.rongwei.bsentity.domain.StudyFileRecordDo">
         SELECT * FROM qhse_study_file_record ORDER BY CREATEDATE LIMIT 1
     </select>

+ 16 - 0
qhse-entity/src/main/java/com/rongwei/bsentity/vo/LoginInVo.java

@@ -0,0 +1,16 @@
+package com.rongwei.bsentity.vo;
+
+import lombok.Data;
+
+/**
+ * LoginInVo class
+ *
+ * @author XH
+ * @date 2025/08/26
+ */
+@Data
+public class LoginInVo {
+    private String username;
+    private String password;
+    private String smsCode;
+}

+ 7 - 0
qhse-server/src/main/java/com/rongwei/controller/QHSELoginController.java

@@ -1,6 +1,7 @@
 package com.rongwei.controller;
 
 import com.rongwei.bscommon.system.service.impl.QHSELoginServiceImpl;
+import com.rongwei.bsentity.vo.LoginInVo;
 import com.rongwei.rwadmincommon.system.domain.UserLoginVo;
 import com.rongwei.rwcommon.base.R;
 import org.slf4j.Logger;
@@ -40,4 +41,10 @@ public class QHSELoginController {
         log.info("发送验证码,开始发送短信");
         return qhseLoginService.sendSmsCode(userLogin, request);
     }
+
+    @PostMapping("/login/in")
+    public R loginIn(@RequestBody LoginInVo userLogin) {
+        log.info("开始登录:{}",userLogin);
+        return qhseLoginService.loginIn(userLogin);
+    }
 }

+ 0 - 2
qhse-server/src/main/resources/bootstrap-dev.yml

@@ -10,7 +10,5 @@ spring:
       discovery:
         server-addr: 127.0.0.1:8848
         namespace: cd047569-9470-4dfb-8663-b113d01cd30f
-        ext-config[0]:
-          data-id: common-config.yaml
 
   

+ 2 - 2
qhse-server/src/main/resources/bootstrap.yml

@@ -30,8 +30,8 @@ mybatis-plus:
   configuration:
     log-impl: org.apache.ibatis.logging.slf4j.Slf4jImpl
     map-underscore-to-camel-case: false
-  mapperLocations: "classpath:mybatis/**/**.xml"
-  typeAliasesPackage: com.rongwei.bsentity.domain
+  mapperLocations: "classpath:mybatis/**/*Dao.xml"
+  typeAliasesPackage: com.rongwei.*.**.domain
   global-config:
     db-config:
       logic-delete-value: 1