Merge pull request #984 from dataease/pr@dev@feat_public_link_over_time

feat: 公共链接增加有效期
This commit is contained in:
fit2cloud-chenyw 2021-10-20 14:05:47 +08:00 committed by GitHub
commit ccc539f5b0
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
22 changed files with 302 additions and 15 deletions

View File

@ -13,5 +13,7 @@ public class PanelLink implements Serializable {
private String pwd;
private Long overTime;
private static final long serialVersionUID = 1L;
}

View File

@ -363,6 +363,66 @@ public class PanelLinkExample {
addCriterion("pwd not between", value1, value2, "pwd");
return (Criteria) this;
}
public Criteria andOverTimeIsNull() {
addCriterion("over_time is null");
return (Criteria) this;
}
public Criteria andOverTimeIsNotNull() {
addCriterion("over_time is not null");
return (Criteria) this;
}
public Criteria andOverTimeEqualTo(Long value) {
addCriterion("over_time =", value, "overTime");
return (Criteria) this;
}
public Criteria andOverTimeNotEqualTo(Long value) {
addCriterion("over_time <>", value, "overTime");
return (Criteria) this;
}
public Criteria andOverTimeGreaterThan(Long value) {
addCriterion("over_time >", value, "overTime");
return (Criteria) this;
}
public Criteria andOverTimeGreaterThanOrEqualTo(Long value) {
addCriterion("over_time >=", value, "overTime");
return (Criteria) this;
}
public Criteria andOverTimeLessThan(Long value) {
addCriterion("over_time <", value, "overTime");
return (Criteria) this;
}
public Criteria andOverTimeLessThanOrEqualTo(Long value) {
addCriterion("over_time <=", value, "overTime");
return (Criteria) this;
}
public Criteria andOverTimeIn(List<Long> values) {
addCriterion("over_time in", values, "overTime");
return (Criteria) this;
}
public Criteria andOverTimeNotIn(List<Long> values) {
addCriterion("over_time not in", values, "overTime");
return (Criteria) this;
}
public Criteria andOverTimeBetween(Long value1, Long value2) {
addCriterion("over_time between", value1, value2, "overTime");
return (Criteria) this;
}
public Criteria andOverTimeNotBetween(Long value1, Long value2) {
addCriterion("over_time not between", value1, value2, "overTime");
return (Criteria) this;
}
}
public static class Criteria extends GeneratedCriteria {

View File

@ -6,6 +6,7 @@
<result column="valid" jdbcType="BIT" property="valid" />
<result column="enable_pwd" jdbcType="BIT" property="enablePwd" />
<result column="pwd" jdbcType="VARCHAR" property="pwd" />
<result column="over_time" jdbcType="BIGINT" property="overTime" />
</resultMap>
<sql id="Example_Where_Clause">
<where>
@ -66,7 +67,7 @@
</where>
</sql>
<sql id="Base_Column_List">
resource_id, `valid`, enable_pwd, pwd
resource_id, `valid`, enable_pwd, pwd, over_time
</sql>
<select id="selectByExample" parameterType="io.dataease.base.domain.PanelLinkExample" resultMap="BaseResultMap">
select
@ -100,9 +101,9 @@
</delete>
<insert id="insert" parameterType="io.dataease.base.domain.PanelLink">
insert into panel_link (resource_id, `valid`, enable_pwd,
pwd)
pwd, over_time)
values (#{resourceId,jdbcType=VARCHAR}, #{valid,jdbcType=BIT}, #{enablePwd,jdbcType=BIT},
#{pwd,jdbcType=VARCHAR})
#{pwd,jdbcType=VARCHAR}, #{overTime,jdbcType=BIGINT})
</insert>
<insert id="insertSelective" parameterType="io.dataease.base.domain.PanelLink">
insert into panel_link
@ -119,6 +120,9 @@
<if test="pwd != null">
pwd,
</if>
<if test="overTime != null">
over_time,
</if>
</trim>
<trim prefix="values (" suffix=")" suffixOverrides=",">
<if test="resourceId != null">
@ -133,6 +137,9 @@
<if test="pwd != null">
#{pwd,jdbcType=VARCHAR},
</if>
<if test="overTime != null">
#{overTime,jdbcType=BIGINT},
</if>
</trim>
</insert>
<select id="countByExample" parameterType="io.dataease.base.domain.PanelLinkExample" resultType="java.lang.Long">
@ -156,6 +163,9 @@
<if test="record.pwd != null">
pwd = #{record.pwd,jdbcType=VARCHAR},
</if>
<if test="record.overTime != null">
over_time = #{record.overTime,jdbcType=BIGINT},
</if>
</set>
<if test="_parameter != null">
<include refid="Update_By_Example_Where_Clause" />
@ -166,7 +176,8 @@
set resource_id = #{record.resourceId,jdbcType=VARCHAR},
`valid` = #{record.valid,jdbcType=BIT},
enable_pwd = #{record.enablePwd,jdbcType=BIT},
pwd = #{record.pwd,jdbcType=VARCHAR}
pwd = #{record.pwd,jdbcType=VARCHAR},
over_time = #{record.overTime,jdbcType=BIGINT}
<if test="_parameter != null">
<include refid="Update_By_Example_Where_Clause" />
</if>
@ -183,6 +194,9 @@
<if test="pwd != null">
pwd = #{pwd,jdbcType=VARCHAR},
</if>
<if test="overTime != null">
over_time = #{overTime,jdbcType=BIGINT},
</if>
</set>
where resource_id = #{resourceId,jdbcType=VARCHAR}
</update>
@ -190,7 +204,8 @@
update panel_link
set `valid` = #{valid,jdbcType=BIT},
enable_pwd = #{enablePwd,jdbcType=BIT},
pwd = #{pwd,jdbcType=VARCHAR}
pwd = #{pwd,jdbcType=VARCHAR},
over_time = #{overTime,jdbcType=BIGINT}
where resource_id = #{resourceId,jdbcType=VARCHAR}
</update>
</mapper>

View File

@ -0,0 +1,11 @@
package io.dataease.base.mapper.ext;
import org.apache.ibatis.annotations.Param;
import io.dataease.controller.request.panel.link.OverTimeRequest;
public interface ExtPanelLinkMapper {
void updateOverTime(@Param("request") OverTimeRequest request);
}

View File

@ -0,0 +1,17 @@
<?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="io.dataease.base.mapper.ext.ExtPanelLinkMapper">
<update id="updateOverTime" >
update panel_link set over_time = #{request.overTime} where resource_id = #{request.resourceId}
</update>
</mapper>

View File

@ -6,6 +6,7 @@ import io.dataease.controller.ResultHolder;
import io.dataease.controller.request.chart.ChartExtRequest;
import io.dataease.controller.request.panel.link.EnablePwdRequest;
import io.dataease.controller.request.panel.link.LinkRequest;
import io.dataease.controller.request.panel.link.OverTimeRequest;
import io.dataease.controller.request.panel.link.PasswordRequest;
import io.dataease.dto.panel.link.GenerateDto;
import io.dataease.dto.panel.link.ValidateDto;
@ -29,6 +30,10 @@ public interface LinkApi {
@PostMapping("/enablePwd")
void enablePwd(EnablePwdRequest request);
@ApiOperation("过期时间")
@PostMapping("/resetOverTime")
void resetOverTime(OverTimeRequest request);
@ApiOperation("启用/禁用链接分享")
@PostMapping("/switchLink")
void switchLink(LinkRequest request);

View File

@ -8,6 +8,7 @@ import io.dataease.controller.panel.api.LinkApi;
import io.dataease.controller.request.chart.ChartExtRequest;
import io.dataease.controller.request.panel.link.EnablePwdRequest;
import io.dataease.controller.request.panel.link.LinkRequest;
import io.dataease.controller.request.panel.link.OverTimeRequest;
import io.dataease.controller.request.panel.link.PasswordRequest;
import io.dataease.controller.request.panel.link.ValidateRequest;
import io.dataease.dto.panel.link.GenerateDto;
@ -46,6 +47,14 @@ public class LinkServer implements LinkApi {
panelLinkService.changeEnablePwd(request);
}
@Override
public void resetOverTime(@RequestBody OverTimeRequest request) {
panelLinkService.overTime(request);
}
@Override
public void switchLink(@RequestBody LinkRequest request) {
panelLinkService.changeValid(request);
@ -74,6 +83,7 @@ public class LinkServer implements LinkApi {
dto.setValid(one.getValid());
dto.setEnablePwd(one.getEnablePwd());
dto.setPassPwd(panelLinkService.validateHeads(one));
dto.setExpire(panelLinkService.isExpire(one));
return dto;
}

View File

@ -0,0 +1,19 @@
package io.dataease.controller.request.panel.link;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.Getter;
import lombok.Setter;
@Data
@Getter
@Setter
public class OverTimeRequest {
@ApiModelProperty("资源ID")
private String resourceId;
@ApiModelProperty("过期时间")
private Long overTime;
}

View File

@ -14,4 +14,6 @@ public class GenerateDto {
private String uri;
@ApiModelProperty("密码")
private String pwd;
@ApiModelProperty("有效期")
private Long overTime;
}

View File

@ -6,6 +6,9 @@ import lombok.Data;
@Data
public class ValidateDto {
@ApiModelProperty("是否过期")
private boolean expire;
@ApiModelProperty("是否可用")
private boolean valid;
@ApiModelProperty("是否启用密码")

View File

@ -9,10 +9,12 @@ import io.dataease.base.domain.PanelGroupWithBLOBs;
import io.dataease.base.domain.PanelLink;
import io.dataease.base.mapper.PanelGroupMapper;
import io.dataease.base.mapper.PanelLinkMapper;
import io.dataease.base.mapper.ext.ExtPanelLinkMapper;
import io.dataease.commons.utils.ServletUtils;
import io.dataease.controller.ResultHolder;
import io.dataease.controller.request.panel.link.EnablePwdRequest;
import io.dataease.controller.request.panel.link.LinkRequest;
import io.dataease.controller.request.panel.link.OverTimeRequest;
import io.dataease.controller.request.panel.link.PasswordRequest;
import io.dataease.dto.panel.link.GenerateDto;
import org.apache.commons.lang3.ObjectUtils;
@ -45,6 +47,9 @@ public class PanelLinkService {
@Resource
private PanelGroupMapper panelGroupMapper;
@Resource
private ExtPanelLinkMapper extPanelLinkMapper;
public void changeValid(LinkRequest request){
PanelLink po = new PanelLink();
po.setResourceId(request.getResourceId());
@ -66,6 +71,14 @@ public class PanelLinkService {
mapper.updateByPrimaryKeySelective(po);
}
public void overTime(OverTimeRequest request) {
/* PanelLink po = new PanelLink();
po.setResourceId(request.getResourceId());
po.setOverTime(request.getOverTime());
mapper.updateByPrimaryKeySelective(po); */
extPanelLinkMapper.updateOverTime(request);
}
public PanelLink findOne(String resourceId){
PanelLink panelLink = mapper.selectByPrimaryKey(resourceId);
return panelLink;
@ -123,6 +136,7 @@ public class PanelLinkService {
result.setEnablePwd(linl.getEnablePwd());
result.setPwd(linl.getPwd());
result.setUri(baseUrl+buildLinkParam(linl.getResourceId()));
result.setOverTime(linl.getOverTime());
return result;
}
@ -144,6 +158,14 @@ public class PanelLinkService {
return verify;
}
// 验证链接是否过期
public Boolean isExpire(PanelLink panelLink) {
if (ObjectUtils.isEmpty(panelLink.getOverTime())) {
return false;
}
return System.currentTimeMillis() > panelLink.getOverTime();
}
public boolean validatePwd(PasswordRequest request) throws Exception {
String password = decryptParam(request.getPassword());
String resourceId = request.getResourceId();

View File

@ -1,3 +1,7 @@
ALTER TABLE `chart_view` ADD COLUMN `render` varchar(50) COMMENT '视图渲染方式' AFTER `type`;
UPDATE `chart_view` SET `render` = 'echarts' WHERE `type` != 'liquid';
UPDATE `chart_view` SET `render` = 'antv' WHERE `type` = 'liquid';
ALTER TABLE `panel_link` ADD COLUMN `over_time` bigint(13) NULL DEFAULT NULL COMMENT '有效截止时间' AFTER `pwd`;

View File

@ -65,7 +65,7 @@
<!--要生成的数据库表 -->
<table tableName="chart_view"/>
<table tableName="panel_link"/>
<!-- <table tableName="sys_dict_item"/>-->
<!-- <table tableName="dataset_table_field"/>-->

View File

@ -22,7 +22,7 @@
"core-js": "^2.6.5",
"echarts": "^5.0.1",
"element-resize-detector": "^1.2.3",
"element-ui": "2.13.0",
"element-ui": "2.15.6",
"file-save": "^0.2.0",
"file-saver": "^2.0.5",
"fit2cloud-ui": "1.5.0-beta.0",

View File

@ -26,6 +26,14 @@ export function setPwd(data) {
})
}
export function setOverTime(data) {
return request({
url: 'api/link/resetOverTime',
method: 'post',
data
})
}
export function switchValid(data) {
return request({
url: 'api/link/switchLink',

View File

@ -1180,6 +1180,8 @@ export default {
passwd_protect: 'Password Protect',
link: 'Link',
link_share: 'Share Link',
over_time: 'Over time',
link_expire: 'Link is expire',
link_share_desc: 'After opening the link, anyone can access the dashboard through this link.',
share: 'Share',
datalist: 'Chart List',

View File

@ -1183,6 +1183,8 @@ export default {
passwd_protect: '密碼保護',
link: '鏈接',
link_share: '鏈接分享',
over_time: '有效期',
link_expire: '鏈接已過期!',
link_share_desc: '開啓鏈接後,任何人可通過此鏈接訪問儀表板。',
share: '分享',
datalist: '視圖列表',
@ -1535,6 +1537,23 @@ export default {
deyear: {
label: '年份',
placeholder: '請選擇年份'
},
deshowdate: {
label: '時間',
show_week: '顯示星期',
show_date: '顯示日期',
time_format: '時間格式',
date_format: '日期格式',
custom: '自定義格式',
open_mode: '展示風格',
m_default: '簡單風格',
m_elec: '電子時鐘',
m_simple: '簡單錶盤',
m_complex: '複雜錶盤',
select_openMode: '請選擇展示風格',
select_time_format: '請選擇時間各式',
select_date_format: '請選擇日期格式'
}
}

View File

@ -1187,6 +1187,8 @@ export default {
copy_short_link_passwd: '复制短链接及密码',
passwd_protect: '密码保护',
link: '链接',
over_time: '有效期',
link_expire: '链接已过期!',
link_share: '链接分享',
link_share_desc: '开启链接后,任何人可通过此链接访问仪表板。',
share: '分享',
@ -1558,7 +1560,7 @@ export default {
m_complex: '复杂表盘',
select_openMode: '请选择展示风格',
select_time_format: '请选择时间格式',
select_date_format: '请选择时间格式'
select_date_format: '请选择日期格式'
}
}

View File

@ -9,7 +9,7 @@ import '@/components/canvas/custom-component' // 注册自定义组件
import widgets from '@/components/widget'
import * as echarts from 'echarts'
import UmyUi from 'umy-ui'
import '@/utils/DateUtil'
Vue.use(UmyUi)
Vue.prototype.$echarts = echarts
Vue.config.productionTip = false

View File

@ -2,7 +2,7 @@
<div>
<el-form ref="createOrganization" inline :model="form" size="small" label-width="80px">
<el-form-item :label="$t('panel.link_share')">
<el-form-item ref="form" :label="$t('panel.link_share')">
<el-switch
v-model="valid"
style="width: 370px;"
@ -22,6 +22,19 @@
/>
</el-form-item>
<el-form-item v-if="valid" :label="$t('panel.over_time')">
<el-date-picker
v-model="form.overTime"
type="datetime"
placeholder="选择日期时间"
align="right"
value-format="timestamp"
:picker-options="pickerOptions"
default-time="23:59:59"
@change="resetOverTime"
/>
</el-form-item>
<el-form-item v-if="valid" label=" ">
<el-checkbox v-model="form.enablePwd" @change="resetEnablePwd">{{ $t('panel.passwd_protect') }} </el-checkbox>
@ -45,7 +58,7 @@
</template>
<script>
import { loadGenerate, setPwd, switchValid, switchEnablePwd, shortUrl } from '@/api/link'
import { loadGenerate, setPwd, switchValid, switchEnablePwd, shortUrl, setOverTime } from '@/api/link'
import { encrypt, decrypt } from '@/utils/rsaEncrypt'
export default {
@ -65,7 +78,28 @@ export default {
valid: false,
form: {},
newUrl: null,
defaultForm: { enablePwd: false, pwd: null, uri: null }
defaultForm: { enablePwd: false, pwd: null, uri: null },
pickerOptions: {
disabledDate: time => {
return time < (Date.now() - 8.64e7)
},
shortcuts: [{
text: '一天',
onClick: function(picker) {
picker.$emit('pick', this.limitDate('day'))
}.bind(this)
}, {
text: '一周',
onClick: (picker) => {
picker.$emit('pick', this.limitDate('week'))
}
}, {
text: '一月',
onClick: (picker) => {
picker.$emit('pick', this.limitDate('month'))
}
}]
}
}
},
computed: {
@ -80,12 +114,14 @@ export default {
methods: {
currentGenerate() {
loadGenerate(this.resourceId).then(res => {
const { valid, enablePwd, pwd, uri } = res.data
const { valid, enablePwd, pwd, uri, overTime } = res.data
this.valid = valid
this.form.enablePwd = enablePwd
this.form.uri = uri ? (this.origin + uri) : uri
//
pwd && (this.form.pwd = decrypt(pwd))
/* overTime && (this.form.overTime = overTime) */
overTime && (this.$set(this.form, 'overTime', overTime))
this.requestShort()
})
},
@ -122,6 +158,16 @@ export default {
value && !this.form.pwd && this.resetPwd()
})
},
resetOverTime(value) {
const param = {
resourceId: this.resourceId,
overTime: value
}
setOverTime(param).then(res => {
// this.form.overTime = value
this.$forceUpdate()
})
},
onCopy(e) {
// alert('You just copied: ' + e.text)
@ -152,6 +198,33 @@ export default {
this.newUrl = res.data
}
})
},
limitDate(type) {
const now = new Date()
const nowTime = now.getTime()
const oneDay = 24 * 60 * 60 * 1000
if (type === 'day') {
const tom = new Date(nowTime + oneDay)
return new Date(tom.format('yyyy-MM-dd') + ' 23:59:59')
}
if (type === 'week') {
const tom = new Date(nowTime + oneDay * 7)
return new Date(tom.format('yyyy-MM-dd') + ' 23:59:59')
}
if (type === 'month') {
const result = new Date()
const curMonth = now.getMonth() + 1
if (curMonth === 12) {
result.setYear(now.getYear() + 1)
result.setMonth(0)
} else {
result.setMonth(curMonth)
}
return new Date(result.format('yyyy-MM-dd') + ' 23:59:59')
}
return null
}
}
}

View File

@ -3,6 +3,7 @@
<link-error v-if="showIndex===0" :resource-id="resourceId" />
<link-pwd v-if="showIndex===1" :resource-id="resourceId" @fresh-token="refreshToken" />
<link-view v-if="showIndex===2" :resource-id="resourceId" />
<link-expire v-if="showIndex===3" :resource-id="resourceId" />
</div>
</template>
<script>
@ -11,9 +12,10 @@ import { validate } from '@/api/link'
import LinkView from './view'
import LinkError from './error'
import LinkPwd from './pwd'
import LinkExpire from './overtime'
export default {
components: {
LinkError, LinkPwd, LinkView
LinkError, LinkPwd, LinkView, LinkExpire
},
data() {
return {
@ -31,7 +33,7 @@ export default {
loadInit() {
this.link = getQueryVariable(this.PARAMKEY)
validate({ link: this.link }).then(res => {
const { resourceId, valid, enablePwd, passPwd } = res.data
const { resourceId, valid, enablePwd, passPwd, expire } = res.data
this.resourceId = resourceId
//
if (!valid || !resourceId) {
@ -39,6 +41,11 @@ export default {
return
}
if (expire) {
this.showExpire()
return
}
if (enablePwd && !passPwd) {
this.showPwd()
return
@ -64,6 +71,9 @@ export default {
//
showView() {
this.showIndex = 2
},
showExpire() {
this.showIndex = 3
}
}
}

View File

@ -0,0 +1,3 @@
<template>
<el-empty :description="$t('panel.link_expire')" />
</template>