Преглед изворни кода

fix 修改招商统计分析榜单不全的问题,每个页面变成两个榜单,新增短信发送模块.修改登录日志

Administrator пре 4 година
родитељ
комит
750049c29e

+ 0 - 1
pom.xml

@@ -37,7 +37,6 @@
     <!-- 依赖声明 -->
     <dependencyManagement>
         <dependencies>
-        
             <!-- SpringBoot的依赖配置-->
             <dependency>
                 <groupId>org.springframework.boot</groupId>

+ 0 - 1
ruoyi-admin/pom.xml

@@ -16,7 +16,6 @@
     </description>
 
     <dependencies>
-
         <!-- spring-boot-devtools -->
         <dependency>
             <groupId>org.springframework.boot</groupId>

+ 11 - 0
ruoyi-common/pom.xml

@@ -17,6 +17,17 @@
 
     <dependencies>
 
+        <!--阿里短信服务-->
+        <dependency>
+            <groupId>com.aliyun</groupId>
+            <artifactId>aliyun-java-sdk-core</artifactId>
+            <version>4.5.22</version>
+        </dependency>
+        <dependency>
+            <groupId>com.aliyun</groupId>
+            <artifactId>aliyun-java-sdk-dysmsapi</artifactId>
+            <version>1.0.0</version>
+        </dependency>
         <!-- Spring框架基本的核心工具 -->
         <dependency>
             <groupId>org.springframework</groupId>

+ 33 - 0
ruoyi-common/src/main/java/com/ruoyi/common/utils/DateUtils.java

@@ -3,7 +3,10 @@ package com.ruoyi.common.utils;
 import java.lang.management.ManagementFactory;
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
+import java.time.LocalDate;
 import java.time.LocalDateTime;
+import java.time.ZoneId;
+import java.time.ZonedDateTime;
 import java.util.Date;
 import java.util.Locale;
 
@@ -21,6 +24,7 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils
     public static String YYYY_MM = "yyyy-MM";
 
     public static String YYYY_MM_DD = "yyyy-MM-dd";
+    public static String YYYYMMDD = "yyyyMMdd";
 
     public static String YYYYMMDDHHMMSS = "yyyyMMddHHmmss";
 
@@ -52,6 +56,11 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils
         return dateTimeNow(YYYY_MM_DD);
     }
 
+    public static String getDateNow()
+    {
+        return dateTimeNow(YYYYMMDD);
+    }
+
     /**
      * 获取当前年, 默认格式为yyyy
      *
@@ -185,4 +194,28 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils
         // long sec = diff % nd % nh % nm / ns;
         return day + "天" + hour + "小时" + min + "分钟";
     }
+
+    /**
+     * LocalDate转Date
+     * @param localDate
+     * @return
+     */
+    public static Date localDate2Date(LocalDate localDate) {
+        if (null == localDate) {
+            return null;
+        }
+        ZonedDateTime zonedDateTime = localDate.atStartOfDay(ZoneId.systemDefault());
+        return Date.from(zonedDateTime.toInstant());
+    }
+
+    /**
+     * Date转LocalDate
+     * @param date
+     */
+    public static LocalDate date2LocalDate(Date date) {
+        if(null == date) {
+            return null;
+        }
+        return date.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
+    }
 }

+ 117 - 0
ruoyi-common/src/main/java/com/ruoyi/common/utils/SendSmsUtils.java

@@ -0,0 +1,117 @@
+package com.ruoyi.common.utils;
+
+import com.aliyuncs.DefaultAcsClient;
+import com.aliyuncs.IAcsClient;
+import com.aliyuncs.dysmsapi.model.v20170525.QuerySendDetailsRequest;
+import com.aliyuncs.dysmsapi.model.v20170525.QuerySendDetailsResponse;
+import com.aliyuncs.dysmsapi.model.v20170525.SendSmsRequest;
+import com.aliyuncs.dysmsapi.model.v20170525.SendSmsResponse;
+import com.aliyuncs.exceptions.ClientException;
+import com.aliyuncs.profile.DefaultProfile;
+import com.aliyuncs.profile.IClientProfile;
+import com.ruoyi.common.utils.http.HttpUtils;
+
+import java.text.SimpleDateFormat;
+
+/**
+ * @author tjf
+ * @Date: 2021/07/15/10:21
+ */
+public class SendSmsUtils {
+    /**
+     * 产品名称:云通信短信API产品,开发者无需替换
+     */
+    static final String PRODUCT = "Dysmsapi";
+    /**
+     * 产品域名,开发者无需替换
+     */
+    static final String DOMAIN = "dysmsapi.aliyuncs.com";
+
+    /**
+     * TODO 此处需要替换成开发者自己的AK(在阿里云访问控制台寻找)
+     */
+    static final String ACCESS_KEY_ID = "";
+    static final String ACCESS_KEY_SECRET = "";
+
+    /**
+     * 发送短信接口
+     * @param phone
+     * @return
+     * @throws ClientException
+     */
+    public static SendSmsResponse sendSms(String phone) throws ClientException {
+        //可自助调整超时时间
+        System.setProperty("sun.net.client.defaultConnectTimeout", "10000");
+        System.setProperty("sun.net.client.defaultReadTimeout", "10000");
+
+        //初始化acsClient,暂不支持region化
+        IClientProfile profile = DefaultProfile.getProfile("cn-hangzhou", ACCESS_KEY_ID, ACCESS_KEY_SECRET);
+        DefaultProfile.addEndpoint("cn-hangzhou", "cn-hangzhou", PRODUCT, DOMAIN);
+        IAcsClient acsClient = new DefaultAcsClient(profile);
+
+        //组装请求对象-具体描述见控制台-文档部分内容
+        SendSmsRequest request = new SendSmsRequest();
+        //必填:待发送手机号 多个手机号用逗号分割
+        request.setPhoneNumbers(phone);
+        //必填:短信签名-可在短信控制台中找到
+        request.setSignName("");
+        //必填:短信模板-可在短信控制台中找到
+        request.setTemplateCode("");
+        //可选:模板中的变量替换JSON串,如模板内容为"亲爱的${name},您的验证码为${code}"时,此处的值为
+        request.setTemplateParam("{\"name\":\"Tom\", \"code\":\"123\"}");
+        //可选:outId为提供给业务方扩展字段,最终在短信回执消息中将此值带回给调用者
+        request.setOutId("zhaoShang");
+
+        //hint 此处可能会抛出异常,注意catch
+        SendSmsResponse sendSmsResponse = null;
+        try {
+            sendSmsResponse = acsClient.getAcsResponse(request);
+        } catch (ClientException e) {
+            e.printStackTrace();
+        }
+        return sendSmsResponse;
+    }
+
+
+    /**
+     * 短信查验接口
+     * @param bizId
+     * @param phone
+     * @return
+     * @throws ClientException
+     */
+    public static QuerySendDetailsResponse querySendDetails(String bizId, String phone) throws ClientException {
+
+        //可自助调整超时时间
+        System.setProperty("sun.net.client.defaultConnectTimeout", "10000");
+        System.setProperty("sun.net.client.defaultReadTimeout", "10000");
+
+        //初始化acsClient,暂不支持region化
+        IClientProfile profile = DefaultProfile.getProfile("cn-hangzhou", ACCESS_KEY_ID, ACCESS_KEY_SECRET);
+        DefaultProfile.addEndpoint("cn-hangzhou", "cn-hangzhou", PRODUCT, DOMAIN);
+        IAcsClient acsClient = new DefaultAcsClient(profile);
+
+        //组装请求对象
+        QuerySendDetailsRequest request = new QuerySendDetailsRequest();
+        //必填-号码
+        request.setPhoneNumber(phone);
+        //可选-流水号
+        request.setBizId(bizId);
+        //必填-发送日期 支持30天内记录查询,格式yyyyMMdd
+        request.setSendDate(DateUtils.getDateNow());
+        //必填-页大小
+        request.setPageSize(10L);
+        //必填-当前页码从1开始计数
+        request.setCurrentPage(1L);
+
+        //hint 此处可能会抛出异常,注意catch
+        QuerySendDetailsResponse querySendDetailsResponse = null;
+        try {
+            querySendDetailsResponse = acsClient.getAcsResponse(request);
+        } catch (ClientException e) {
+            e.printStackTrace();
+        }
+
+        return querySendDetailsResponse;
+    }
+}

+ 13 - 0
ruoyi-system/src/main/java/com/ruoyi/system/domain/SysLogininfor.java

@@ -52,6 +52,19 @@ public class SysLogininfor extends BaseEntity
     @Excel(name = "访问时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
     private Date loginTime;
 
+    /**
+     * 多少天未登录
+     */
+    private String loginDay;
+
+    public String getLoginDay() {
+        return loginDay;
+    }
+
+    public void setLoginDay(String loginDay) {
+        this.loginDay = loginDay;
+    }
+
     public Long getInfoId()
     {
         return infoId;

+ 7 - 0
ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysLogininforMapper.java

@@ -25,6 +25,13 @@ public interface SysLogininforMapper
      */
     public List<SysLogininfor> selectLogininforList(SysLogininfor logininfor);
 
+    /**
+     * 查询近期未登录的用户
+     * @param logininfor
+     * @return
+     */
+    public List<SysLogininfor> selectLogininforDayList(SysLogininfor logininfor);
+
     /**
      * 批量删除系统登录日志
      * 

+ 78 - 15
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysLogininforServiceImpl.java

@@ -1,56 +1,120 @@
 package com.ruoyi.system.service.impl;
 
+import java.time.LocalDate;
+import java.time.temporal.ChronoUnit;
+import java.util.ArrayList;
+import java.util.Date;
 import java.util.List;
+
+import com.ruoyi.common.core.domain.entity.SysDictData;
+import com.ruoyi.common.utils.DateUtils;
+import com.ruoyi.common.utils.StringUtils;
+import com.ruoyi.system.mapper.SysDictDataMapper;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import com.ruoyi.system.domain.SysLogininfor;
 import com.ruoyi.system.mapper.SysLogininforMapper;
 import com.ruoyi.system.service.ISysLogininforService;
 
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.Size;
+
 /**
  * 系统访问日志情况信息 服务层处理
- * 
+ *
  * @author ruoyi
  */
 @Service
-public class SysLogininforServiceImpl implements ISysLogininforService
-{
+public class SysLogininforServiceImpl implements ISysLogininforService {
 
     @Autowired
     private SysLogininforMapper logininforMapper;
 
+    @Autowired
+    private SysDictDataMapper sysDictDataMapper;
+
     /**
      * 新增系统登录日志
-     * 
+     *
      * @param logininfor 访问日志对象
      */
     @Override
-    public void insertLogininfor(SysLogininfor logininfor)
-    {
+    public void insertLogininfor(SysLogininfor logininfor) {
         logininforMapper.insertLogininfor(logininfor);
     }
 
     /**
      * 查询系统登录日志集合
-     * 
+     *
      * @param logininfor 访问日志对象
      * @return 登录记录集合
      */
     @Override
-    public List<SysLogininfor> selectLogininforList(SysLogininfor logininfor)
-    {
-        return logininforMapper.selectLogininforList(logininfor);
+    public List<SysLogininfor> selectLogininforList(SysLogininfor logininfor) {
+        String loginDay = logininfor.getLoginDay();
+        List<SysLogininfor> sysLogininfors = new ArrayList<>();
+        LocalDate now = LocalDate.now();
+        if (StringUtils.isNotBlank(loginDay)) {
+            LocalDate localDate = now.minusDays(Long.parseLong(loginDay));
+            Date date = DateUtils.parseDate(localDate.toString());
+            logininfor.setLoginTime(date);
+            //查询近期X天未登录的用户
+            sysLogininfors = logininforMapper.selectLogininforDayList(logininfor);
+            List<SysDictData> dictDataList = sysDictDataMapper.selectDictDataByType("sys_login_day");
+            String msg = "";
+            if (dictDataList != null && dictDataList.size() > 0){
+                for (SysDictData sysDictData : dictDataList) {
+                    String dictValue = sysDictData.getDictValue();
+                    if (dictValue.equals(loginDay)) {
+                        msg = sysDictData.getDictLabel();
+                        break;
+                    }
+                }
+            }
+            if (sysLogininfors != null && sysLogininfors.size() > 0){
+                for (SysLogininfor sysLogininfor : sysLogininfors) {
+                    sysLogininfor.setStatus(msg + "未登录");
+                }
+            }
+
+        } else {
+            sysLogininfors = logininforMapper.selectLogininforList(logininfor);
+            List<SysDictData> dictDataList = sysDictDataMapper.selectDictDataByType("sys_login_day");
+            //分组查询出对应用户最后的登录日期
+            List<SysLogininfor> sysLogininforsDay = logininforMapper.selectLogininforDayList(logininfor);
+            //判断这个用户是多少天未登录
+            for (SysLogininfor sysLogininfor : sysLogininforsDay) {
+                Date loginTime = sysLogininfor.getLoginTime();
+                LocalDate localDate = DateUtils.date2LocalDate(loginTime);
+                long days = localDate.until(now, ChronoUnit.DAYS);
+                sysLogininfor.setStatus("成功登录");
+                for (SysDictData sysDictData : dictDataList) {
+                    long dictValue = Long.parseLong(sysDictData.getDictValue());
+                    if (days > dictValue){
+                        sysLogininfor.setStatus(sysDictData.getDictLabel()+"未登录");
+                    }
+                }
+            }
+            for (SysLogininfor sysLogininfor : sysLogininfors) {
+                for (SysLogininfor sysLogininfor1 : sysLogininforsDay) {
+                    if (sysLogininfor.getUserName().equals(sysLogininfor1.getUserName())){
+                        sysLogininfor.setStatus(sysLogininfor1.getStatus());
+                        break;
+                    }
+                }
+            }
+        }
+        return sysLogininfors;
     }
 
     /**
      * 批量删除系统登录日志
-     * 
+     *
      * @param infoIds 需要删除的登录日志ID
      * @return
      */
     @Override
-    public int deleteLogininforByIds(Long[] infoIds)
-    {
+    public int deleteLogininforByIds(Long[] infoIds) {
         return logininforMapper.deleteLogininforByIds(infoIds);
     }
 
@@ -58,8 +122,7 @@ public class SysLogininforServiceImpl implements ISysLogininforService
      * 清空系统登录日志
      */
     @Override
-    public void cleanLogininfor()
-    {
+    public void cleanLogininfor() {
         logininforMapper.cleanLogininfor();
     }
 }

+ 21 - 0
ruoyi-system/src/main/resources/mapper/system/SysLogininforMapper.xml

@@ -42,6 +42,27 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 		</where>
 		order by info_id desc
 	</select>
+
+
+	<select id="selectLogininforDayList" parameterType="SysLogininfor" resultMap="SysLogininforResult">
+		SELECT
+		s1.*
+		FROM
+		( SELECT info_id, user_name, ipaddr, login_location, browser, os, STATUS, msg, login_time FROM sys_logininfor
+		<where>
+			<if test="userName != null and userName != ''">
+				AND user_name like concat('%', #{userName}, '%')
+			</if>
+		</where>
+		 ORDER BY login_time DESC ) s1
+		<where>
+			<if test="loginTime != null"><!-- 近期未登录 -->
+				 date_format(login_time,'%y-%m-%d') &lt; date_format(#{loginTime},'%y-%m-%d' )
+			</if>
+		</where>
+		GROUP BY
+		s1.user_name
+	</select>
 	
 	<delete id="deleteLogininforByIds" parameterType="Long">
  		delete from sys_logininfor where info_id in

+ 11 - 20
ruoyi-ui/src/views/monitor/logininfor/index.vue

@@ -1,16 +1,7 @@
 <template>
   <div class="app-container">
     <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
-      <el-form-item label="登录地址" prop="ipaddr">
-        <el-input
-          v-model="queryParams.ipaddr"
-          placeholder="请输入登录地址"
-          clearable
-          style="width: 240px;"
-          size="small"
-          @keyup.enter.native="handleQuery"
-        />
-      </el-form-item>
+
       <el-form-item label="用户名称" prop="userName">
         <el-input
           v-model="queryParams.userName"
@@ -21,10 +12,10 @@
           @keyup.enter.native="handleQuery"
         />
       </el-form-item>
-      <el-form-item label="状态" prop="status">
+      <el-form-item label="近期未登录" prop="status" label-width="100px">
         <el-select
-          v-model="queryParams.status"
-          placeholder="登录状态"
+          v-model="queryParams.loginDay"
+          placeholder="请选择时间"
           clearable
           size="small"
           style="width: 240px"
@@ -92,19 +83,19 @@
 
     <el-table v-loading="loading" :data="list" @selection-change="handleSelectionChange">
       <el-table-column type="selection" width="55" align="center" />
-      <el-table-column label="访问编号" align="center" prop="infoId" />
+<!--      <el-table-column label="访问编号" align="center" prop="infoId" />-->
       <el-table-column label="用户名称" align="center" prop="userName" />
       <el-table-column label="登录地址" align="center" prop="ipaddr" width="130" :show-overflow-tooltip="true" />
-      <el-table-column label="登录地点" align="center" prop="loginLocation" :show-overflow-tooltip="true" />
+<!--      <el-table-column label="登录地点" align="center" prop="loginLocation" :show-overflow-tooltip="true" />-->
       <el-table-column label="浏览器" align="center" prop="browser" />
       <el-table-column label="操作系统" align="center" prop="os" />
-      <el-table-column label="登录状态" align="center" prop="status" :formatter="statusFormat" />
-      <el-table-column label="操作信息" align="center" prop="msg" />
       <el-table-column label="登录日期" align="center" prop="loginTime" width="180">
         <template slot-scope="scope">
           <span>{{ parseTime(scope.row.loginTime) }}</span>
         </template>
       </el-table-column>
+      <el-table-column label="登录状态" align="center" prop="status" />
+      <el-table-column label="操作信息" align="center" prop="msg" />
     </el-table>
 
     <pagination
@@ -144,15 +135,15 @@ export default {
       queryParams: {
         pageNum: 1,
         pageSize: 10,
-        ipaddr: undefined,
         userName: undefined,
-        status: undefined
+        status: undefined,
+        loginDay: undefined
       }
     };
   },
   created() {
     this.getList();
-    this.getDicts("sys_common_status").then(response => {
+    this.getDicts("sys_login_day").then(response => {
       this.statusOptions = response.data;
     });
   },