提交 ad63e4db authored 作者: taojinlong's avatar taojinlong

Merge branch 'v1.1' of github.com:dataease/dataease into v1.1

...@@ -50,6 +50,7 @@ public class ShiroConfig { ...@@ -50,6 +50,7 @@ public class ShiroConfig {
filterMap.put("f2cPerms", new F2CPermissionsFilter()); filterMap.put("f2cPerms", new F2CPermissionsFilter());
filterMap.put("jwt", new JWTFilter()); filterMap.put("jwt", new JWTFilter());
filterMap.put("logout", new F2CLogoutFilter()); filterMap.put("logout", new F2CLogoutFilter());
filterMap.put("link", new F2CLinkFilter());
factoryBean.setSecurityManager(securityManager); factoryBean.setSecurityManager(securityManager);
factoryBean.setLoginUrl("/login"); factoryBean.setLoginUrl("/login");
factoryBean.setUnauthorizedUrl("/login"); factoryBean.setUnauthorizedUrl("/login");
......
package io.dataease.auth.filter;
import cn.hutool.core.util.ObjectUtil;
import com.auth0.jwt.JWT;
import com.auth0.jwt.interfaces.Claim;
import com.auth0.jwt.interfaces.DecodedJWT;
import io.dataease.auth.config.RsaProperties;
import io.dataease.auth.util.JWTUtils;
import io.dataease.auth.util.LinkUtil;
import io.dataease.auth.util.RsaUtil;
import io.dataease.base.domain.PanelLink;
import io.dataease.commons.utils.LogUtil;
import org.apache.commons.lang3.StringUtils;
import org.apache.shiro.web.filter.authc.AnonymousFilter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
public class F2CLinkFilter extends AnonymousFilter {
private static final Logger logger = LoggerFactory.getLogger(F2CLogoutFilter.class);
private static final String LINK_TOKEN_KEY = "LINK-PWD-TOKEN";
@Override
protected boolean onPreHandle(ServletRequest request, ServletResponse response, Object mappedValue) {
try{
HttpServletRequest req = (HttpServletRequest) request;
String link_token = req.getHeader(LINK_TOKEN_KEY);
DecodedJWT jwt = JWT.decode(link_token);
Claim resourceId = jwt.getClaim("resourceId");
String id = resourceId.asString();
PanelLink panelLink = LinkUtil.queryLink(id);
if (ObjectUtil.isEmpty(panelLink)) return false;
if (!panelLink.getEnablePwd()) {
panelLink.setPwd("dataease");
}
return JWTUtils.verifyLink(link_token, id, RsaUtil.decryptByPrivateKey(RsaProperties.privateKey, panelLink.getPwd()));
}catch (Exception e) {
LogUtil.error(e);
}
return false;
}
}
...@@ -41,8 +41,7 @@ public class ShiroServiceImpl implements ShiroService { ...@@ -41,8 +41,7 @@ public class ShiroServiceImpl implements ShiroService {
//验证链接 //验证链接
filterChainDefinitionMap.put("/api/link/validate**", ANON); filterChainDefinitionMap.put("/api/link/validate**", ANON);
filterChainDefinitionMap.put("/panel/group/findOne/**", ANON);
filterChainDefinitionMap.put("/chart/view/getData/**", ANON);
filterChainDefinitionMap.put("/system/ui/**", ANON); filterChainDefinitionMap.put("/system/ui/**", ANON);
...@@ -59,9 +58,16 @@ public class ShiroServiceImpl implements ShiroService { ...@@ -59,9 +58,16 @@ public class ShiroServiceImpl implements ShiroService {
filterChainDefinitionMap.put("/tokenExpired", ANON); filterChainDefinitionMap.put("/tokenExpired", ANON);
filterChainDefinitionMap.put("/downline", ANON); filterChainDefinitionMap.put("/downline", ANON);
filterChainDefinitionMap.put("/common-files/**", ANON); filterChainDefinitionMap.put("/common-files/**", ANON);
filterChainDefinitionMap.put("/api/auth/logout", "logout"); filterChainDefinitionMap.put("/api/auth/logout", "logout");
filterChainDefinitionMap.put("/api/link/resourceDetail/**", "link");
filterChainDefinitionMap.put("/api/link/viewDetail/**", "link");
filterChainDefinitionMap.put("/**", "authc"); filterChainDefinitionMap.put("/**", "authc");
filterChainDefinitionMap.put("/**", "jwt"); filterChainDefinitionMap.put("/**", "jwt");
return filterChainDefinitionMap; return filterChainDefinitionMap;
} }
......
package io.dataease.auth.util;
import io.dataease.base.domain.PanelLink;
import io.dataease.service.panel.PanelLinkService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
public class LinkUtil {
private static PanelLinkService panelLinkService;
@Autowired
public void setPanelLinkService(PanelLinkService panelLinkService) {
LinkUtil.panelLinkService = panelLinkService;
}
public static PanelLink queryLink(String resourceId) {
return panelLinkService.findOne(resourceId);
}
}
package io.dataease.controller.panel.api; package io.dataease.controller.panel.api;
import io.dataease.controller.request.chart.ChartExtRequest;
import io.dataease.controller.request.panel.link.EnablePwdRequest; import io.dataease.controller.request.panel.link.EnablePwdRequest;
import io.dataease.controller.request.panel.link.LinkRequest; import io.dataease.controller.request.panel.link.LinkRequest;
import io.dataease.controller.request.panel.link.PasswordRequest; import io.dataease.controller.request.panel.link.PasswordRequest;
...@@ -40,4 +41,12 @@ public interface LinkApi { ...@@ -40,4 +41,12 @@ public interface LinkApi {
@ApiOperation("验证密码") @ApiOperation("验证密码")
@PostMapping("/validatePwd") @PostMapping("/validatePwd")
boolean validatePwd(PasswordRequest request) throws Exception; boolean validatePwd(PasswordRequest request) throws Exception;
@ApiOperation("资源详息")
@PostMapping("/resourceDetail/{resourceId}")
Object resourceDetail(@PathVariable String resourceId);
@ApiOperation("视图详息")
@PostMapping("/viewDetail/{viewId}")
Object viewDetail(@PathVariable String viewId, @RequestBody ChartExtRequest requestList) throws Exception;
} }
...@@ -4,18 +4,22 @@ package io.dataease.controller.panel.server; ...@@ -4,18 +4,22 @@ package io.dataease.controller.panel.server;
import com.google.gson.Gson; import com.google.gson.Gson;
import io.dataease.base.domain.PanelLink; import io.dataease.base.domain.PanelLink;
import io.dataease.controller.panel.api.LinkApi; 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.EnablePwdRequest;
import io.dataease.controller.request.panel.link.LinkRequest; import io.dataease.controller.request.panel.link.LinkRequest;
import io.dataease.controller.request.panel.link.PasswordRequest; import io.dataease.controller.request.panel.link.PasswordRequest;
import io.dataease.controller.request.panel.link.ValidateRequest; import io.dataease.controller.request.panel.link.ValidateRequest;
import io.dataease.dto.panel.link.GenerateDto; import io.dataease.dto.panel.link.GenerateDto;
import io.dataease.dto.panel.link.ValidateDto; import io.dataease.dto.panel.link.ValidateDto;
import io.dataease.service.chart.ChartViewService;
import io.dataease.service.panel.PanelLinkService; import io.dataease.service.panel.PanelLinkService;
import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.ObjectUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import java.util.Map; import java.util.Map;
...@@ -27,6 +31,9 @@ public class LinkServer implements LinkApi { ...@@ -27,6 +31,9 @@ public class LinkServer implements LinkApi {
@Autowired @Autowired
private PanelLinkService panelLinkService; private PanelLinkService panelLinkService;
@Resource
private ChartViewService chartViewService;
@Override @Override
public void replacePwd(@RequestBody PasswordRequest request) { public void replacePwd(@RequestBody PasswordRequest request) {
...@@ -73,4 +80,14 @@ public class LinkServer implements LinkApi { ...@@ -73,4 +80,14 @@ public class LinkServer implements LinkApi {
public boolean validatePwd(@RequestBody PasswordRequest request) throws Exception { public boolean validatePwd(@RequestBody PasswordRequest request) throws Exception {
return panelLinkService.validatePwd(request); return panelLinkService.validatePwd(request);
} }
@Override
public Object resourceDetail(@PathVariable String resourceId) {
return panelLinkService.resourceInfo(resourceId);
}
@Override
public Object viewDetail(String viewId, ChartExtRequest requestList) throws Exception{
return chartViewService.getData(viewId, requestList);
}
} }
...@@ -4,7 +4,9 @@ import com.google.gson.Gson; ...@@ -4,7 +4,9 @@ import com.google.gson.Gson;
import io.dataease.auth.config.RsaProperties; import io.dataease.auth.config.RsaProperties;
import io.dataease.auth.util.JWTUtils; import io.dataease.auth.util.JWTUtils;
import io.dataease.auth.util.RsaUtil; import io.dataease.auth.util.RsaUtil;
import io.dataease.base.domain.PanelGroupWithBLOBs;
import io.dataease.base.domain.PanelLink; import io.dataease.base.domain.PanelLink;
import io.dataease.base.mapper.PanelGroupMapper;
import io.dataease.base.mapper.PanelLinkMapper; import io.dataease.base.mapper.PanelLinkMapper;
import io.dataease.commons.utils.ServletUtils; import io.dataease.commons.utils.ServletUtils;
import io.dataease.controller.request.panel.link.EnablePwdRequest; import io.dataease.controller.request.panel.link.EnablePwdRequest;
...@@ -32,6 +34,9 @@ public class PanelLinkService { ...@@ -32,6 +34,9 @@ public class PanelLinkService {
@Resource @Resource
private PanelLinkMapper mapper; private PanelLinkMapper mapper;
@Resource
private PanelGroupMapper panelGroupMapper;
public void changeValid(LinkRequest request){ public void changeValid(LinkRequest request){
PanelLink po = new PanelLink(); PanelLink po = new PanelLink();
po.setResourceId(request.getResourceId()); po.setResourceId(request.getResourceId());
...@@ -117,7 +122,16 @@ public class PanelLinkService { ...@@ -117,7 +122,16 @@ public class PanelLinkService {
public Boolean validateHeads(PanelLink panelLink) throws Exception{ public Boolean validateHeads(PanelLink panelLink) throws Exception{
HttpServletRequest request = ServletUtils.request(); HttpServletRequest request = ServletUtils.request();
String token = request.getHeader("LINK-PWD-TOKEN"); String token = request.getHeader("LINK-PWD-TOKEN");
if (StringUtils.isEmpty(token) || StringUtils.equals("undefined", token) || StringUtils.equals("null", token)) return false; if (!panelLink.getEnablePwd() || StringUtils.isEmpty(token) || StringUtils.equals("undefined", token) || StringUtils.equals("null", token)) {
String resourceId = panelLink.getResourceId();
String pwd = "dataease";
String tk = JWTUtils.signLink(resourceId, pwd);
HttpServletResponse httpServletResponse = ServletUtils.response();
httpServletResponse.addHeader("Access-Control-Expose-Headers", "LINK-PWD-TOKEN");
httpServletResponse.setHeader("LINK-PWD-TOKEN", tk);
return false;
}
if (StringUtils.isEmpty(panelLink.getPwd())) return false;
boolean verify = JWTUtils.verifyLink(token, panelLink.getResourceId(), decryptParam(panelLink.getPwd())); boolean verify = JWTUtils.verifyLink(token, panelLink.getResourceId(), decryptParam(panelLink.getPwd()));
return verify; return verify;
} }
...@@ -137,4 +151,9 @@ public class PanelLinkService { ...@@ -137,4 +151,9 @@ public class PanelLinkService {
return pass; return pass;
} }
public PanelGroupWithBLOBs resourceInfo(String resourceId) {
return panelGroupMapper.selectByPrimaryKey(resourceId);
}
} }
...@@ -51,7 +51,17 @@ export function loadGenerate(resourceId) { ...@@ -51,7 +51,17 @@ export function loadGenerate(resourceId) {
export function loadResource(resourceId) { export function loadResource(resourceId) {
return request({ return request({
url: 'panel/group/findOne/' + resourceId, url: 'api/link/resourceDetail/' + resourceId,
method: 'get' method: 'post'
})
}
export function viewInfo(id, data) {
return request({
url: 'api/link/viewDetail/' + id,
method: 'post',
timeout: 30000,
hideMsg: true,
data
}) })
} }
...@@ -120,17 +120,30 @@ export default { ...@@ -120,17 +120,30 @@ export default {
if (this.$route && this.$route.name && this.$route.name === row.router) { if (this.$route && this.$route.name && this.$route.name === row.router) {
// 如果当前路由就是目标路由 那么使用router.push页面不会刷新 这时候要使用事件方式 // 如果当前路由就是目标路由 那么使用router.push页面不会刷新 这时候要使用事件方式
row.callback && bus.$emit(row.callback, param) row.callback && bus.$emit(row.callback, param)
row.status || this.setReaded(row.msgId)
} else { } else {
this.$router.push({ name: row.router, params: param }) if (this.hasPermissionRoute(row.router)) {
this.$router.push({ name: row.router, params: param })
row.status || this.setReaded(row.msgId)
return
}
this.$warning(this.$t('commons.no_target_permission'))
} }
row.status || this.setReaded(row.msgId)
}, },
remove(row) { remove(row) {
}, },
msgSetting() { msgSetting() {
},
hasPermissionRoute(name, permission_routes) {
permission_routes = permission_routes || this.permission_routes
for (let index = 0; index < permission_routes.length; index++) {
const route = permission_routes[index]
if (route.name && route.name === name) return true
if (route.children && this.hasPermissionRoute(name, route.children)) return true
}
return false
}, },
showMore() { showMore() {
const routerName = 'sys-msg-web-all' const routerName = 'sys-msg-web-all'
......
...@@ -25,10 +25,10 @@ ...@@ -25,10 +25,10 @@
<script> <script>
import { viewData } from '@/api/panel/panel' import { viewData } from '@/api/panel/panel'
import { viewInfo } from '@/api/link'
import ChartComponent from '@/views/chart/components/ChartComponent.vue' import ChartComponent from '@/views/chart/components/ChartComponent.vue'
import TableNormal from '@/views/chart/components/table/TableNormal' import TableNormal from '@/views/chart/components/table/TableNormal'
import LabelNormal from '../../../views/chart/components/normal/LabelNormal' import LabelNormal from '../../../views/chart/components/normal/LabelNormal'
import UserViewDialog from './UserViewDialog'
import { uuid } from 'vue-uuid' import { uuid } from 'vue-uuid'
import { mapState } from 'vuex' import { mapState } from 'vuex'
...@@ -36,11 +36,10 @@ import { isChange } from '@/utils/conditionUtil' ...@@ -36,11 +36,10 @@ import { isChange } from '@/utils/conditionUtil'
import { BASE_CHART_STRING } from '@/views/chart/chart/chart' import { BASE_CHART_STRING } from '@/views/chart/chart/chart'
import eventBus from '@/components/canvas/utils/eventBus' import eventBus from '@/components/canvas/utils/eventBus'
import { deepCopy } from '@/components/canvas/utils/utils' import { deepCopy } from '@/components/canvas/utils/utils'
import SettingMenu from '@/components/canvas/components/Editor/SettingMenu' import { getToken, getLinkToken } from '@/utils/auth'
export default { export default {
name: 'UserView', name: 'UserView',
components: { ChartComponent, TableNormal, LabelNormal, UserViewDialog, SettingMenu }, components: { ChartComponent, TableNormal, LabelNormal },
props: { props: {
element: { element: {
type: Object, type: Object,
...@@ -163,7 +162,14 @@ export default { ...@@ -163,7 +162,14 @@ export default {
if (id) { if (id) {
this.requestStatus = 'waiting' this.requestStatus = 'waiting'
this.message = null this.message = null
viewData(id, this.filter).then(response => {
// 增加判断 仪表板公共连接中使用viewInfo 正常使用viewData
let method = viewData
if (!getToken() && getLinkToken()) {
method = viewInfo
}
method(id, this.filter).then(response => {
// 将视图传入echart组件 // 将视图传入echart组件
if (response.success) { if (response.success) {
this.chart = response.data this.chart = response.data
......
...@@ -129,6 +129,7 @@ export default { ...@@ -129,6 +129,7 @@ export default {
password_error: 'The password can not be less than 8 digits' password_error: 'The password can not be less than 8 digits'
}, },
commons: { commons: {
no_target_permission: 'No permission',
success: 'Success', success: 'Success',
switch_lang: 'Switch Language Success', switch_lang: 'Switch Language Success',
close: 'Close', close: 'Close',
...@@ -817,7 +818,8 @@ export default { ...@@ -817,7 +818,8 @@ export default {
drag_block_funnel_width: 'Funnel Width', drag_block_funnel_width: 'Funnel Width',
drag_block_funnel_split: 'Funnel Split', drag_block_funnel_split: 'Funnel Split',
drag_block_radar_length: 'Branch Length', drag_block_radar_length: 'Branch Length',
drag_block_radar_label: 'Branch Label' drag_block_radar_label: 'Branch Label',
axis_label_rotate: 'Label Rotate'
}, },
dataset: { dataset: {
sheet_warn: 'There are multiple sheet pages, and the first one is extracted by default', sheet_warn: 'There are multiple sheet pages, and the first one is extracted by default',
......
...@@ -129,6 +129,7 @@ export default { ...@@ -129,6 +129,7 @@ export default {
password_error: '密碼不小於 8 位' password_error: '密碼不小於 8 位'
}, },
commons: { commons: {
no_target_permission: '沒有權限',
success: '成功', success: '成功',
switch_lang: '切換語言成功', switch_lang: '切換語言成功',
close: '關閉', close: '關閉',
...@@ -817,7 +818,8 @@ export default { ...@@ -817,7 +818,8 @@ export default {
drag_block_funnel_width: '漏鬥層寬', drag_block_funnel_width: '漏鬥層寬',
drag_block_funnel_split: '漏鬥分層', drag_block_funnel_split: '漏鬥分層',
drag_block_radar_length: '分支長度', drag_block_radar_length: '分支長度',
drag_block_radar_label: '分支標簽' drag_block_radar_label: '分支標簽',
axis_label_rotate: '標簽角度'
}, },
dataset: { dataset: {
sheet_warn: '有多個sheet頁面,默認抽取第一個', sheet_warn: '有多個sheet頁面,默認抽取第一個',
......
...@@ -129,6 +129,7 @@ export default { ...@@ -129,6 +129,7 @@ export default {
password_error: '密码不小于 8 位' password_error: '密码不小于 8 位'
}, },
commons: { commons: {
no_target_permission: '没有权限',
success: '成功', success: '成功',
switch_lang: '切换语言成功', switch_lang: '切换语言成功',
close: '关闭', close: '关闭',
...@@ -817,7 +818,8 @@ export default { ...@@ -817,7 +818,8 @@ export default {
drag_block_funnel_width: '漏斗层宽', drag_block_funnel_width: '漏斗层宽',
drag_block_funnel_split: '漏斗分层', drag_block_funnel_split: '漏斗分层',
drag_block_radar_length: '分支长度', drag_block_radar_length: '分支长度',
drag_block_radar_label: '分支标签' drag_block_radar_label: '分支标签',
axis_label_rotate: '标签角度'
}, },
dataset: { dataset: {
sheet_warn: '有多个 Sheet 页,默认抽取第一个', sheet_warn: '有多个 Sheet 页,默认抽取第一个',
......
...@@ -79,8 +79,8 @@ const checkAuth = response => { ...@@ -79,8 +79,8 @@ const checkAuth = response => {
store.dispatch('user/refreshToken', refreshToken) store.dispatch('user/refreshToken', refreshToken)
} }
if (response.headers[LinkTokenKey.toLocaleLowerCase()]) { if (response.headers[LinkTokenKey.toLocaleLowerCase()] || (response.config.headers && response.config.headers[LinkTokenKey.toLocaleLowerCase()])) {
const linkToken = response.headers[LinkTokenKey.toLocaleLowerCase()] const linkToken = response.headers[LinkTokenKey.toLocaleLowerCase()] || response.config.headers[LinkTokenKey.toLocaleLowerCase()]
setLinkToken(linkToken) setLinkToken(linkToken)
} }
// 许可状态改变 刷新页面 // 许可状态改变 刷新页面
......
...@@ -21,9 +21,6 @@ ...@@ -21,9 +21,6 @@
<el-form-item :label="$t('chart.name')" class="form-item"> <el-form-item :label="$t('chart.name')" class="form-item">
<el-input v-model="axisForm.name" size="mini" @blur="changeXAxisStyle" /> <el-input v-model="axisForm.name" size="mini" @blur="changeXAxisStyle" />
</el-form-item> </el-form-item>
<el-form-item :label="$t('chart.rotate')" class="form-item form-item-slider">
<el-slider v-model="axisForm.axisLabel.rotate" show-input :show-input-controls="false" :min="-90" :max="90" input-size="mini" @change="changeXAxisStyle" />
</el-form-item>
<el-form-item :label="$t('chart.axis_name_color')" class="form-item"> <el-form-item :label="$t('chart.axis_name_color')" class="form-item">
<colorPicker v-model="axisForm.nameTextStyle.color" style="margin-top: 6px;cursor: pointer;z-index: 1004;border: solid 1px black" @change="changeXAxisStyle" /> <colorPicker v-model="axisForm.nameTextStyle.color" style="margin-top: 6px;cursor: pointer;z-index: 1004;border: solid 1px black" @change="changeXAxisStyle" />
</el-form-item> </el-form-item>
...@@ -59,7 +56,10 @@ ...@@ -59,7 +56,10 @@
<el-form-item :label="$t('chart.axis_label_color')" class="form-item"> <el-form-item :label="$t('chart.axis_label_color')" class="form-item">
<colorPicker v-model="axisForm.axisLabel.color" style="margin-top: 6px;cursor: pointer;z-index: 1004;border: solid 1px black" @change="changeXAxisStyle" /> <colorPicker v-model="axisForm.axisLabel.color" style="margin-top: 6px;cursor: pointer;z-index: 1004;border: solid 1px black" @change="changeXAxisStyle" />
</el-form-item> </el-form-item>
<el-form-item :label="$t('chart.axis_label_fontsize')" class="form-item form-item-slider"> <el-form-item :label="$t('chart.axis_label_rotate')" class="form-item form-item-slider">
<el-slider v-model="axisForm.axisLabel.rotate" show-input :show-input-controls="false" :min="-90" :max="90" input-size="mini" @change="changeXAxisStyle" />
</el-form-item>
<el-form-item :label="$t('chart.axis_label_fontsize')" class="form-item">
<el-select v-model="axisForm.axisLabel.fontSize" :placeholder="$t('chart.axis_label_fontsize')" @change="changeXAxisStyle"> <el-select v-model="axisForm.axisLabel.fontSize" :placeholder="$t('chart.axis_label_fontsize')" @change="changeXAxisStyle">
<el-option v-for="option in fontSize" :key="option.value" :label="option.name" :value="option.value" /> <el-option v-for="option in fontSize" :key="option.value" :label="option.name" :value="option.value" />
</el-select> </el-select>
......
...@@ -21,9 +21,6 @@ ...@@ -21,9 +21,6 @@
<el-form-item :label="$t('chart.name')" class="form-item"> <el-form-item :label="$t('chart.name')" class="form-item">
<el-input v-model="axisForm.name" size="mini" @blur="changeYAxisStyle" /> <el-input v-model="axisForm.name" size="mini" @blur="changeYAxisStyle" />
</el-form-item> </el-form-item>
<el-form-item :label="$t('chart.rotate')" class="form-item form-item-slider">
<el-slider v-model="axisForm.axisLabel.rotate" show-input :show-input-controls="false" :min="-90" :max="90" input-size="mini" @change="changeYAxisStyle" />
</el-form-item>
<el-form-item :label="$t('chart.axis_name_color')" class="form-item"> <el-form-item :label="$t('chart.axis_name_color')" class="form-item">
<colorPicker v-model="axisForm.nameTextStyle.color" style="margin-top: 6px;cursor: pointer;z-index: 1004;border: solid 1px black" @change="changeYAxisStyle" /> <colorPicker v-model="axisForm.nameTextStyle.color" style="margin-top: 6px;cursor: pointer;z-index: 1004;border: solid 1px black" @change="changeYAxisStyle" />
</el-form-item> </el-form-item>
...@@ -59,7 +56,10 @@ ...@@ -59,7 +56,10 @@
<el-form-item :label="$t('chart.axis_label_color')" class="form-item"> <el-form-item :label="$t('chart.axis_label_color')" class="form-item">
<colorPicker v-model="axisForm.axisLabel.color" style="margin-top: 6px;cursor: pointer;z-index: 1004;border: solid 1px black" @change="changeYAxisStyle" /> <colorPicker v-model="axisForm.axisLabel.color" style="margin-top: 6px;cursor: pointer;z-index: 1004;border: solid 1px black" @change="changeYAxisStyle" />
</el-form-item> </el-form-item>
<el-form-item :label="$t('chart.axis_label_fontsize')" class="form-item form-item-slider"> <el-form-item :label="$t('chart.axis_label_rotate')" class="form-item form-item-slider">
<el-slider v-model="axisForm.axisLabel.rotate" show-input :show-input-controls="false" :min="-90" :max="90" input-size="mini" @change="changeYAxisStyle" />
</el-form-item>
<el-form-item :label="$t('chart.axis_label_fontsize')" class="form-item">
<el-select v-model="axisForm.axisLabel.fontSize" :placeholder="$t('chart.axis_label_fontsize')" @change="changeYAxisStyle"> <el-select v-model="axisForm.axisLabel.fontSize" :placeholder="$t('chart.axis_label_fontsize')" @change="changeYAxisStyle">
<el-option v-for="option in fontSize" :key="option.value" :label="option.name" :value="option.value" /> <el-option v-for="option in fontSize" :key="option.value" :label="option.name" :value="option.value" />
</el-select> </el-select>
......
...@@ -32,19 +32,19 @@ ...@@ -32,19 +32,19 @@
<span>{{ $t('chart.content_formatter') }}</span> <span>{{ $t('chart.content_formatter') }}</span>
<el-tooltip class="item" effect="dark" placement="bottom"> <el-tooltip class="item" effect="dark" placement="bottom">
<div slot="content"> <div slot="content">
模板变量有 {a}, {b},{c},{d},{e},分别表示系列名,数据名,数据值等。 模板变量有 {a}, {b},{c},{d},分别表示系列名,数据名,数据值,百分比等。
<br> <br>
trigger 为 'axis' 的时候,会有多个系列的数据,此时可以通过 {a0}, {a1}, {a2} 这种后面加索引的方式表示系列的索引。 触发位置 为 '坐标轴' 的时候,会有多个系列的数据,此时可以通过 {a0}, {a1}, {a2} 这种后面加索引的方式表示系列的索引。
<br> <br>
不同图表类型下的 {a},{b},{c},{d} 含义不一样。 其中变量{a}, {b}, {c}, {d}在不同图表类型下代表数据含义为: 不同图表类型下的 {a},{b},{c},{d} 含义不一样。 其中变量{a}, {b}, {c}, {d}在不同图表类型下代表数据含义为:
<br><br> <br><br>
折线(区域)图、柱状(条形)图、K线图 : {a}(系列名称),{b}(类目值),{c}(数值), {d}(无) 折线(区域)图、柱状(条形)图、仪表盘、雷达图 : {a}(系列名称),{b}(类目值),{c}(数值), {d}(无)
<!-- <br>-->
<!-- 散点图(气泡)图 : {a}(系列名称),{b}(数据名称),{c}(数值数组), {d}(无)-->
<!-- <br>-->
<!-- 地图 : {a}(系列名称),{b}(区域名称),{c}(合并数值), {d}(无)-->
<br> <br>
散点图(气泡)图 : {a}(系列名称),{b}(数据名称),{c}(数值数组), {d}(无) 饼图、漏斗图: {a}(系列名称),{b}(数据项名称),{c}(数值), {d}(百分比)
<br>
地图 : {a}(系列名称),{b}(区域名称),{c}(合并数值), {d}(无)
<br>
饼图、仪表板、漏斗图: {a}(系列名称),{b}(数据项名称),{c}(数值), {d}(百分比)
</div> </div>
<i class="el-icon-info" style="cursor: pointer;" /> <i class="el-icon-info" style="cursor: pointer;" />
</el-tooltip> </el-tooltip>
......
...@@ -13,7 +13,7 @@ ...@@ -13,7 +13,7 @@
<div class="input-layout"> <div class="input-layout">
<div class="input-main"> <div class="input-main">
<div class="div-input"> <div class="div-input">
<el-form ref="pwdForm" :model="form" :rules="rule" size="small"> <el-form ref="pwdForm" :model="form" :rules="rule" size="small" @submit.native.prevent>
<el-form-item prop="password"> <el-form-item prop="password">
<el-input v-model="form.password" maxlength="4" show-password class="real-input" :placeholder="$t('pblink.input_placeholder')" /> <el-input v-model="form.password" maxlength="4" show-password class="real-input" :placeholder="$t('pblink.input_placeholder')" />
</el-form-item> </el-form-item>
...@@ -65,8 +65,25 @@ export default { ...@@ -65,8 +65,25 @@ export default {
} }
} }
}, },
mounted() {
this.bindKey()
},
destroyed() {
this.unBindKey()
},
methods: { methods: {
entryKey(event) {
const keyCode = event.keyCode
if (keyCode === 13) {
this.refresh()
}
},
bindKey() {
document.addEventListener('keypress', this.entryKey)
},
unBindKey() {
document.removeEventListener('keypress', this.entryKey)
},
// 验证密码是否正确 如果正确 设置请求头部带LINK-PWD-TOKEN=entrypt(pwd)再刷新页面 // 验证密码是否正确 如果正确 设置请求头部带LINK-PWD-TOKEN=entrypt(pwd)再刷新页面
refresh() { refresh() {
this.$refs.pwdForm.validate(valid => { this.$refs.pwdForm.validate(valid => {
......
...@@ -55,6 +55,7 @@ import { query, updateStatus } from '@/api/system/msg' ...@@ -55,6 +55,7 @@ import { query, updateStatus } from '@/api/system/msg'
import { msgTypes, getTypeName, loadMsgTypes } from '@/utils/webMsg' import { msgTypes, getTypeName, loadMsgTypes } from '@/utils/webMsg'
import bus from '@/utils/bus' import bus from '@/utils/bus'
import { addOrder, formatOrders } from '@/utils/index' import { addOrder, formatOrders } from '@/utils/index'
import { mapGetters } from 'vuex'
export default { export default {
components: { components: {
LayoutContent, LayoutContent,
...@@ -82,6 +83,11 @@ export default { ...@@ -82,6 +83,11 @@ export default {
orderConditions: [] orderConditions: []
} }
}, },
computed: {
...mapGetters([
'permission_routes'
])
},
mounted() { mounted() {
this.search() this.search()
}, },
...@@ -120,8 +126,21 @@ export default { ...@@ -120,8 +126,21 @@ export default {
}, },
toDetail(row) { toDetail(row) {
const param = { ...{ msgNotification: true, msgType: row.typeId, sourceParam: row.param }} const param = { ...{ msgNotification: true, msgType: row.typeId, sourceParam: row.param }}
this.$router.push({ name: row.router, params: param }) if (this.hasPermissionRoute(row.router)) {
row.status || this.setReaded(row) this.$router.push({ name: row.router, params: param })
row.status || this.setReaded(row)
return
}
this.$warning(this.$t('commons.no_target_permission'))
},
hasPermissionRoute(name, permission_routes) {
permission_routes = permission_routes || this.permission_routes
for (let index = 0; index < permission_routes.length; index++) {
const route = permission_routes[index]
if (route.name && route.name === name) return true
if (route.children && this.hasPermissionRoute(name, route.children)) return true
}
return false
}, },
// 设置已读 // 设置已读
setReaded(row) { setReaded(row) {
......
...@@ -60,6 +60,7 @@ import ComplexTable from '@/components/business/complex-table' ...@@ -60,6 +60,7 @@ import ComplexTable from '@/components/business/complex-table'
import { query } from '@/api/system/msg' import { query } from '@/api/system/msg'
import { msgTypes, getTypeName, loadMsgTypes } from '@/utils/webMsg' import { msgTypes, getTypeName, loadMsgTypes } from '@/utils/webMsg'
import { addOrder, formatOrders } from '@/utils/index' import { addOrder, formatOrders } from '@/utils/index'
import { mapGetters } from 'vuex'
export default { export default {
components: { components: {
LayoutContent, LayoutContent,
...@@ -87,6 +88,11 @@ export default { ...@@ -87,6 +88,11 @@ export default {
} }
} }
}, },
computed: {
...mapGetters([
'permission_routes'
])
},
mounted() { mounted() {
this.search() this.search()
}, },
...@@ -125,7 +131,21 @@ export default { ...@@ -125,7 +131,21 @@ export default {
}, },
toDetail(row) { toDetail(row) {
const param = { ...{ msgNotification: true, msgType: row.typeId, sourceParam: row.param }} const param = { ...{ msgNotification: true, msgType: row.typeId, sourceParam: row.param }}
this.$router.push({ name: row.router, params: param }) // this.$router.push({ name: row.router, params: param })
if (this.hasPermissionRoute(row.router)) {
this.$router.push({ name: row.router, params: param })
return
}
this.$warning(this.$t('commons.no_target_permission'))
},
hasPermissionRoute(name, permission_routes) {
permission_routes = permission_routes || this.permission_routes
for (let index = 0; index < permission_routes.length; index++) {
const route = permission_routes[index]
if (route.name && route.name === name) return true
if (route.children && this.hasPermissionRoute(name, route.children)) return true
}
return false
}, },
sortChange({ column, prop, order }) { sortChange({ column, prop, order }) {
this.orderConditions = [] this.orderConditions = []
......
...@@ -65,7 +65,7 @@ import { query, updateStatus, batchRead } from '@/api/system/msg' ...@@ -65,7 +65,7 @@ import { query, updateStatus, batchRead } from '@/api/system/msg'
import { msgTypes, getTypeName, loadMsgTypes } from '@/utils/webMsg' import { msgTypes, getTypeName, loadMsgTypes } from '@/utils/webMsg'
import bus from '@/utils/bus' import bus from '@/utils/bus'
import { addOrder, formatOrders } from '@/utils/index' import { addOrder, formatOrders } from '@/utils/index'
import { mapGetters } from 'vuex'
export default { export default {
components: { components: {
LayoutContent, LayoutContent,
...@@ -98,6 +98,11 @@ export default { ...@@ -98,6 +98,11 @@ export default {
orderConditions: [] orderConditions: []
} }
}, },
computed: {
...mapGetters([
'permission_routes'
])
},
mounted() { mounted() {
this.search() this.search()
}, },
...@@ -136,8 +141,23 @@ export default { ...@@ -136,8 +141,23 @@ export default {
}, },
toDetail(row) { toDetail(row) {
const param = { ...{ msgNotification: true, msgType: row.typeId, sourceParam: row.param }} const param = { ...{ msgNotification: true, msgType: row.typeId, sourceParam: row.param }}
this.$router.push({ name: row.router, params: param }) // this.$router.push({ name: row.router, params: param })
this.setReaded(row) // this.setReaded(row)
if (this.hasPermissionRoute(row.router)) {
this.$router.push({ name: row.router, params: param })
this.setReaded(row)
return
}
this.$warning(this.$t('commons.no_target_permission'))
},
hasPermissionRoute(name, permission_routes) {
permission_routes = permission_routes || this.permission_routes
for (let index = 0; index < permission_routes.length; index++) {
const route = permission_routes[index]
if (route.name && route.name === name) return true
if (route.children && this.hasPermissionRoute(name, route.children)) return true
}
return false
}, },
// 设置已读 // 设置已读
setReaded(row) { setReaded(row) {
......
...@@ -134,6 +134,13 @@ export default { ...@@ -134,6 +134,13 @@ export default {
this.$warning(this.$t('chart.name_can_not_empty')) this.$warning(this.$t('chart.name_can_not_empty'))
return false return false
} }
debugger
if (this.editPanel.panelInfo.name.length > 50) {
this.$warning(this.$t('commons.char_can_not_more_50'))
return false
}
if (!this.editPanel.panelInfo.panelData && this.editPanel.optType === 'new' && this.inputType === 'copy') { if (!this.editPanel.panelInfo.panelData && this.editPanel.optType === 'new' && this.inputType === 'copy') {
this.$warning(this.$t('chart.template_can_not_empty')) this.$warning(this.$t('chart.template_can_not_empty'))
return false return false
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论