1
0
mirror of https://github.com/chatopera/cosin.git synced 2025-07-28 12:32:15 +08:00

https://github.com/chatopera/cskefu/issues/701 add user experience plan in sys settings

This commit is contained in:
Hai Liang Wang 2022-04-26 21:45:08 +08:00
parent 5864f895d5
commit 7cb9d857a4
8 changed files with 703 additions and 457 deletions

View File

@ -18,6 +18,7 @@ package com.chatopera.cc.config;
import com.chatopera.cc.interceptor.CrossInterceptorHandler; import com.chatopera.cc.interceptor.CrossInterceptorHandler;
import com.chatopera.cc.interceptor.LogIntercreptorHandler; import com.chatopera.cc.interceptor.LogIntercreptorHandler;
import com.chatopera.cc.interceptor.UserExperiencePlanInterceptorHandler;
import com.chatopera.cc.interceptor.UserInterceptorHandler; import com.chatopera.cc.interceptor.UserInterceptorHandler;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
@ -32,6 +33,7 @@ public class CSKeFuWebAppConfigurer
// 多个拦截器组成一个拦截器链 // 多个拦截器组成一个拦截器链
// addPathPatterns 用于添加拦截规则 // addPathPatterns 用于添加拦截规则
// excludePathPatterns 用户排除拦截 // excludePathPatterns 用户排除拦截
registry.addInterceptor(new UserExperiencePlanInterceptorHandler()).addPathPatterns("/**").excludePathPatterns("/im/**","/res/image*","/res/file*","/cs/**","/messenger/webhook/*");
registry.addInterceptor(new UserInterceptorHandler()).addPathPatterns("/**").excludePathPatterns("/login.html","/im/**","/res/image*","/res/file*","/cs/**","/messenger/webhook/*"); registry.addInterceptor(new UserInterceptorHandler()).addPathPatterns("/**").excludePathPatterns("/login.html","/im/**","/res/image*","/res/file*","/cs/**","/messenger/webhook/*");
registry.addInterceptor(new CrossInterceptorHandler()).addPathPatterns("/**"); registry.addInterceptor(new CrossInterceptorHandler()).addPathPatterns("/**");
registry.addInterceptor(new LogIntercreptorHandler()).addPathPatterns("/**"); registry.addInterceptor(new LogIntercreptorHandler()).addPathPatterns("/**");

View File

@ -19,7 +19,9 @@ package com.chatopera.cc.controller.admin.config;
import com.chatopera.cc.basic.Constants; import com.chatopera.cc.basic.Constants;
import com.chatopera.cc.basic.MainContext; import com.chatopera.cc.basic.MainContext;
import com.chatopera.cc.basic.MainUtils; import com.chatopera.cc.basic.MainUtils;
import com.chatopera.cc.cache.RedisCommand;
import com.chatopera.cc.controller.Handler; import com.chatopera.cc.controller.Handler;
import com.chatopera.cc.interceptor.UserExperiencePlanInterceptorHandler;
import com.chatopera.cc.model.Dict; import com.chatopera.cc.model.Dict;
import com.chatopera.cc.model.Secret; import com.chatopera.cc.model.Secret;
import com.chatopera.cc.model.SysDic; import com.chatopera.cc.model.SysDic;
@ -69,6 +71,8 @@ public class SystemConfigController extends Handler {
@Autowired @Autowired
private SystemConfigRepository systemConfigRes; private SystemConfigRepository systemConfigRes;
@Autowired
private RedisCommand redisCommand;
@Autowired @Autowired
private SystemMessageRepository systemMessageRes; private SystemMessageRepository systemMessageRes;
@ -135,6 +139,14 @@ public class SystemConfigController extends Handler {
if (StringUtils.isNotBlank(request.getParameter("msg"))) { if (StringUtils.isNotBlank(request.getParameter("msg"))) {
map.addAttribute("msg", request.getParameter("msg")); map.addAttribute("msg", request.getParameter("msg"));
} }
String userExpTelemetrySetting = redisCommand.get(UserExperiencePlanInterceptorHandler.FLAG_KEY);
if (StringUtils.isEmpty(userExpTelemetrySetting) || StringUtils.equalsIgnoreCase(userExpTelemetrySetting, UserExperiencePlanInterceptorHandler.USER_EXP_PLAN_ON)) {
map.addAttribute("userExpTelemetrySetting", true);
} else {
map.addAttribute("userExpTelemetrySetting", false);
}
return request(super.createView("/admin/config/index")); return request(super.createView("/admin/config/index"));
} }
@ -188,7 +200,8 @@ public class SystemConfigController extends Handler {
@Menu(type = "admin", subtype = "save", admin = true) @Menu(type = "admin", subtype = "save", admin = true)
public ModelAndView save( public ModelAndView save(
ModelMap map, HttpServletRequest request, ModelMap map, HttpServletRequest request,
@Valid SystemConfig config, BindingResult result, @Valid SystemConfig config,
BindingResult result,
@RequestParam(value = "keyfile", required = false) MultipartFile keyfile, @RequestParam(value = "keyfile", required = false) MultipartFile keyfile,
@RequestParam(value = "loginlogo", required = false) MultipartFile loginlogo, @RequestParam(value = "loginlogo", required = false) MultipartFile loginlogo,
@RequestParam(value = "consolelogo", required = false) MultipartFile consolelogo, @RequestParam(value = "consolelogo", required = false) MultipartFile consolelogo,
@ -274,6 +287,11 @@ public class SystemConfigController extends Handler {
} }
map.addAttribute("msg", msg); map.addAttribute("msg", msg);
} }
// 设置用户体验计划开关
redisCommand.put(UserExperiencePlanInterceptorHandler.FLAG_KEY, config.getUserExpTelemetrySetting() ? UserExperiencePlanInterceptorHandler.USER_EXP_PLAN_ON : UserExperiencePlanInterceptorHandler.USER_EXP_PLAN_OFF);
// 保存到数据库
systemConfigRes.save(systemConfig); systemConfigRes.save(systemConfig);
MainContext.getCache().putSystemByIdAndOrgi("systemConfig", super.getOrgi(request), systemConfig); MainContext.getCache().putSystemByIdAndOrgi("systemConfig", super.getOrgi(request), systemConfig);

View File

@ -0,0 +1,80 @@
/*
* Copyright (C) 2019-2022 Chatopera Inc, <https://www.chatopera.com>
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.chatopera.cc.interceptor;
import com.chatopera.cc.basic.MainContext;
import com.chatopera.cc.cache.RedisCommand;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* 用户体验计划
*/
public class UserExperiencePlanInterceptorHandler extends HandlerInterceptorAdapter {
private static final Logger logger = LoggerFactory.getLogger(UserExperiencePlanInterceptorHandler.class);
public final static String FLAG_KEY = "cskefu:global:user-experience-plan";
private static RedisCommand redis;
public static final String USER_EXP_PLAN_ON = "on";
public static final String USER_EXP_PLAN_OFF = "off";
private static final String USER_EXP_TELEMETRY = "userExpTelemetry";
@Override
public void postHandle(
HttpServletRequest request, HttpServletResponse response, Object arg2,
ModelAndView view) {
if (!request.getMethod().equals("GET")) {
return;
}
if (view == null) {
return;
}
String flag = getRedis().get(FLAG_KEY);
if (StringUtils.isEmpty(flag)) {
// flag is empty, add init value
flag = USER_EXP_PLAN_ON;
getRedis().put(FLAG_KEY, USER_EXP_PLAN_ON);
}
// logger.info("flag {}", flag);
if (StringUtils.equalsIgnoreCase(USER_EXP_PLAN_OFF, flag)) {
view.addObject(USER_EXP_TELEMETRY, "off");
} else {
view.addObject(USER_EXP_TELEMETRY, "on");
}
}
/**
* Get redis bean
*
* @return
*/
private static RedisCommand getRedis() {
if (redis == null) {
redis = MainContext.getContext().getBean(RedisCommand.class);
}
return redis;
}
}

View File

@ -93,9 +93,14 @@ public class SystemConfig implements java.io.Serializable{
private boolean enabletneant; //启用多租户管理模式 private boolean enabletneant; //启用多租户管理模式
@Transient
private boolean userExpTelemetrySetting; // 加入用户体验计划的设置
public boolean isEmailshowrecipient() { public boolean isEmailshowrecipient() {
return emailshowrecipient; return emailshowrecipient;
} }
public void setEmailshowrecipient(boolean emailshowrecipient) { public void setEmailshowrecipient(boolean emailshowrecipient) {
this.emailshowrecipient = emailshowrecipient; this.emailshowrecipient = emailshowrecipient;
} }
@ -114,72 +119,95 @@ public class SystemConfig implements java.io.Serializable{
public String getId() { public String getId() {
return id; return id;
} }
public void setId(String id) { public void setId(String id) {
this.id = id; this.id = id;
} }
public String getName() { public String getName() {
return name; return name;
} }
public void setName(String name) { public void setName(String name) {
this.name = name; this.name = name;
} }
public String getTitle() { public String getTitle() {
return title; return title;
} }
public void setTitle(String title) { public void setTitle(String title) {
this.title = title; this.title = title;
} }
public String getTheme() { public String getTheme() {
return theme; return theme;
} }
public void setTheme(String theme) { public void setTheme(String theme) {
this.theme = theme; this.theme = theme;
} }
public String getCode() { public String getCode() {
return code; return code;
} }
public void setCode(String code) { public void setCode(String code) {
this.code = code; this.code = code;
} }
public String getOrgi() { public String getOrgi() {
return orgi; return orgi;
} }
public void setOrgi(String orgi) { public void setOrgi(String orgi) {
this.orgi = orgi; this.orgi = orgi;
} }
public String getDescription() { public String getDescription() {
return description; return description;
} }
public void setDescription(String description) { public void setDescription(String description) {
this.description = description; this.description = description;
} }
public String getMemo() { public String getMemo() {
return memo; return memo;
} }
public void setMemo(String memo) { public void setMemo(String memo) {
this.memo = memo; this.memo = memo;
} }
public String getCreater() { public String getCreater() {
return creater; return creater;
} }
public void setCreater(String creater) { public void setCreater(String creater) {
this.creater = creater; this.creater = creater;
} }
public Date getCreatetime() { public Date getCreatetime() {
return createtime; return createtime;
} }
public void setCreatetime(Date createtime) { public void setCreatetime(Date createtime) {
this.createtime = createtime; this.createtime = createtime;
} }
public Date getUpdatetime() { public Date getUpdatetime() {
return updatetime; return updatetime;
} }
public void setUpdatetime(Date updatetime) { public void setUpdatetime(Date updatetime) {
this.updatetime = updatetime; this.updatetime = updatetime;
} }
public String getLoglevel() { public String getLoglevel() {
return loglevel; return loglevel;
} }
public void setLoglevel(String loglevel) { public void setLoglevel(String loglevel) {
this.loglevel = loglevel; this.loglevel = loglevel;
} }
@ -187,18 +215,23 @@ public class SystemConfig implements java.io.Serializable{
public boolean isEnablessl() { public boolean isEnablessl() {
return enablessl; return enablessl;
} }
public void setEnablessl(boolean enablessl) { public void setEnablessl(boolean enablessl) {
this.enablessl = enablessl; this.enablessl = enablessl;
} }
public String getJksfile() { public String getJksfile() {
return jksfile; return jksfile;
} }
public void setJksfile(String jksfile) { public void setJksfile(String jksfile) {
this.jksfile = jksfile; this.jksfile = jksfile;
} }
public String getJkspassword() { public String getJkspassword() {
return jkspassword; return jkspassword;
} }
public void setJkspassword(String jkspassword) { public void setJkspassword(String jkspassword) {
this.jkspassword = jkspassword; this.jkspassword = jkspassword;
} }
@ -206,6 +239,7 @@ public class SystemConfig implements java.io.Serializable{
public String getMapkey() { public String getMapkey() {
return mapkey; return mapkey;
} }
public void setMapkey(String mapkey) { public void setMapkey(String mapkey) {
this.mapkey = mapkey; this.mapkey = mapkey;
} }
@ -213,54 +247,71 @@ public class SystemConfig implements java.io.Serializable{
public boolean isWorkorders() { public boolean isWorkorders() {
return workorders; return workorders;
} }
public void setWorkorders(boolean workorders) { public void setWorkorders(boolean workorders) {
this.workorders = workorders; this.workorders = workorders;
} }
public boolean isCallcenter() { public boolean isCallcenter() {
return callcenter; return callcenter;
} }
public void setCallcenter(boolean callcenter) { public void setCallcenter(boolean callcenter) {
this.callcenter = callcenter; this.callcenter = callcenter;
} }
public String getCc_extention() { public String getCc_extention() {
return cc_extention; return cc_extention;
} }
public void setCc_extention(String cc_extention) { public void setCc_extention(String cc_extention) {
this.cc_extention = cc_extention; this.cc_extention = cc_extention;
} }
public String getCc_quene() { public String getCc_quene() {
return cc_quene; return cc_quene;
} }
public void setCc_quene(String cc_quene) { public void setCc_quene(String cc_quene) {
this.cc_quene = cc_quene; this.cc_quene = cc_quene;
} }
public String getCc_router() { public String getCc_router() {
return cc_router; return cc_router;
} }
public void setCc_router(String cc_router) { public void setCc_router(String cc_router) {
this.cc_router = cc_router; this.cc_router = cc_router;
} }
public String getCc_ivr() { public String getCc_ivr() {
return cc_ivr; return cc_ivr;
} }
public void setCc_ivr(String cc_ivr) { public void setCc_ivr(String cc_ivr) {
this.cc_ivr = cc_ivr; this.cc_ivr = cc_ivr;
} }
public String getCc_acl() { public String getCc_acl() {
return cc_acl; return cc_acl;
} }
public void setCc_acl(String cc_acl) { public void setCc_acl(String cc_acl) {
this.cc_acl = cc_acl; this.cc_acl = cc_acl;
} }
public String getCc_siptrunk() { public String getCc_siptrunk() {
return cc_siptrunk; return cc_siptrunk;
} }
public void setCc_siptrunk(String cc_siptrunk) { public void setCc_siptrunk(String cc_siptrunk) {
this.cc_siptrunk = cc_siptrunk; this.cc_siptrunk = cc_siptrunk;
} }
public String getCc_callcenter() { public String getCc_callcenter() {
return cc_callcenter; return cc_callcenter;
} }
public void setCc_callcenter(String cc_callcenter) { public void setCc_callcenter(String cc_callcenter) {
this.cc_callcenter = cc_callcenter; this.cc_callcenter = cc_callcenter;
} }
@ -268,12 +319,15 @@ public class SystemConfig implements java.io.Serializable{
public boolean isCallout() { public boolean isCallout() {
return callout; return callout;
} }
public void setCallout(boolean callout) { public void setCallout(boolean callout) {
this.callout = callout; this.callout = callout;
} }
public boolean isAuth() { public boolean isAuth() {
return auth; return auth;
} }
public void setAuth(boolean auth) { public void setAuth(boolean auth) {
this.auth = auth; this.auth = auth;
} }
@ -281,36 +335,47 @@ public class SystemConfig implements java.io.Serializable{
public boolean isEnablemail() { public boolean isEnablemail() {
return enablemail; return enablemail;
} }
public void setEnablemail(boolean enablemail) { public void setEnablemail(boolean enablemail) {
this.enablemail = enablemail; this.enablemail = enablemail;
} }
public String getEmailid() { public String getEmailid() {
return emailid; return emailid;
} }
public void setEmailid(String emailid) { public void setEmailid(String emailid) {
this.emailid = emailid; this.emailid = emailid;
} }
public String getEmailworkordertp() { public String getEmailworkordertp() {
return emailworkordertp; return emailworkordertp;
} }
public void setEmailworkordertp(String emailworkordertp) { public void setEmailworkordertp(String emailworkordertp) {
this.emailworkordertp = emailworkordertp; this.emailworkordertp = emailworkordertp;
} }
public boolean isEnablesms() { public boolean isEnablesms() {
return enablesms; return enablesms;
} }
public void setEnablesms(boolean enablesms) { public void setEnablesms(boolean enablesms) {
this.enablesms = enablesms; this.enablesms = enablesms;
} }
public String getSmsid() { public String getSmsid() {
return smsid; return smsid;
} }
public void setSmsid(String smsid) { public void setSmsid(String smsid) {
this.smsid = smsid; this.smsid = smsid;
} }
public String getSmsworkordertp() { public String getSmsworkordertp() {
return smsworkordertp; return smsworkordertp;
} }
public void setSmsworkordertp(String smsworkordertp) { public void setSmsworkordertp(String smsworkordertp) {
this.smsworkordertp = smsworkordertp; this.smsworkordertp = smsworkordertp;
} }
@ -318,72 +383,95 @@ public class SystemConfig implements java.io.Serializable{
public String getMailcreatetp() { public String getMailcreatetp() {
return mailcreatetp; return mailcreatetp;
} }
public void setMailcreatetp(String mailcreatetp) { public void setMailcreatetp(String mailcreatetp) {
this.mailcreatetp = mailcreatetp; this.mailcreatetp = mailcreatetp;
} }
public String getMailupdatetp() { public String getMailupdatetp() {
return mailupdatetp; return mailupdatetp;
} }
public void setMailupdatetp(String mailupdatetp) { public void setMailupdatetp(String mailupdatetp) {
this.mailupdatetp = mailupdatetp; this.mailupdatetp = mailupdatetp;
} }
public String getMailprocesstp() { public String getMailprocesstp() {
return mailprocesstp; return mailprocesstp;
} }
public void setMailprocesstp(String mailprocesstp) { public void setMailprocesstp(String mailprocesstp) {
this.mailprocesstp = mailprocesstp; this.mailprocesstp = mailprocesstp;
} }
public boolean isEmailtocreater() { public boolean isEmailtocreater() {
return emailtocreater; return emailtocreater;
} }
public void setEmailtocreater(boolean emailtocreater) { public void setEmailtocreater(boolean emailtocreater) {
this.emailtocreater = emailtocreater; this.emailtocreater = emailtocreater;
} }
public String getSmscreatetp() { public String getSmscreatetp() {
return smscreatetp; return smscreatetp;
} }
public void setSmscreatetp(String smscreatetp) { public void setSmscreatetp(String smscreatetp) {
this.smscreatetp = smscreatetp; this.smscreatetp = smscreatetp;
} }
public String getSmsupdatetp() { public String getSmsupdatetp() {
return smsupdatetp; return smsupdatetp;
} }
public void setSmsupdatetp(String smsupdatetp) { public void setSmsupdatetp(String smsupdatetp) {
this.smsupdatetp = smsupdatetp; this.smsupdatetp = smsupdatetp;
} }
public String getSmsprocesstp() { public String getSmsprocesstp() {
return smsprocesstp; return smsprocesstp;
} }
public void setSmsprocesstp(String smsprocesstp) { public void setSmsprocesstp(String smsprocesstp) {
this.smsprocesstp = smsprocesstp; this.smsprocesstp = smsprocesstp;
} }
public boolean isSmstocreater() { public boolean isSmstocreater() {
return smstocreater; return smstocreater;
} }
public void setSmstocreater(boolean smstocreater) { public void setSmstocreater(boolean smstocreater) {
this.smstocreater = smstocreater; this.smstocreater = smstocreater;
} }
public String getEmailtocreatertp() { public String getEmailtocreatertp() {
return emailtocreatertp; return emailtocreatertp;
} }
public void setEmailtocreatertp(String emailtocreatertp) { public void setEmailtocreatertp(String emailtocreatertp) {
this.emailtocreatertp = emailtocreatertp; this.emailtocreatertp = emailtocreatertp;
} }
public String getSmstocreatertp() { public String getSmstocreatertp() {
return smstocreatertp; return smstocreatertp;
} }
public void setSmstocreatertp(String smstocreatertp) { public void setSmstocreatertp(String smstocreatertp) {
this.smstocreatertp = smstocreatertp; this.smstocreatertp = smstocreatertp;
} }
public boolean isEnabletneant() { public boolean isEnabletneant() {
return enabletneant; return enabletneant;
} }
public void setEnabletneant(boolean enabletneant) { public void setEnabletneant(boolean enabletneant) {
this.enabletneant = enabletneant; this.enabletneant = enabletneant;
} }
public boolean isTenantshare() { public boolean isTenantshare() {
return tenantshare; return tenantshare;
} }
public void setTenantshare(boolean tenantshare) { public void setTenantshare(boolean tenantshare) {
this.tenantshare = tenantshare; this.tenantshare = tenantshare;
} }
@ -391,39 +479,51 @@ public class SystemConfig implements java.io.Serializable{
public String getNamealias() { public String getNamealias() {
return namealias; return namealias;
} }
public void setNamealias(String namealias) { public void setNamealias(String namealias) {
this.namealias = namealias; this.namealias = namealias;
} }
public boolean isTenantconsole() { public boolean isTenantconsole() {
return tenantconsole; return tenantconsole;
} }
public void setTenantconsole(boolean tenantconsole) { public void setTenantconsole(boolean tenantconsole) {
this.tenantconsole = tenantconsole; this.tenantconsole = tenantconsole;
} }
public boolean isEnableregorgi() { public boolean isEnableregorgi() {
return enableregorgi; return enableregorgi;
} }
public void setEnableregorgi(boolean enableregorgi) { public void setEnableregorgi(boolean enableregorgi) {
this.enableregorgi = enableregorgi; this.enableregorgi = enableregorgi;
} }
public String getLoginlogo() { public String getLoginlogo() {
return loginlogo; return loginlogo;
} }
public void setLoginlogo(String loginlogo) { public void setLoginlogo(String loginlogo) {
this.loginlogo = loginlogo; this.loginlogo = loginlogo;
} }
public String getConsolelogo() { public String getConsolelogo() {
return consolelogo; return consolelogo;
} }
public void setConsolelogo(String consolelogo) { public void setConsolelogo(String consolelogo) {
this.consolelogo = consolelogo; this.consolelogo = consolelogo;
} }
public String getFavlogo() { public String getFavlogo() {
return favlogo; return favlogo;
} }
public void setFavlogo(String favlogo) { public void setFavlogo(String favlogo) {
this.favlogo = favlogo; this.favlogo = favlogo;
} }
@Transient @Transient
public String getBackgroundColor() { public String getBackgroundColor() {
String backgroundColor = "background-color:#32c24d !important;"; String backgroundColor = "background-color:#32c24d !important;";
@ -436,6 +536,7 @@ public class SystemConfig implements java.io.Serializable{
} }
return backgroundColor; return backgroundColor;
} }
@Transient @Transient
public String getColor() { public String getColor() {
String color = "color:#32c24d;"; String color = "color:#32c24d;";
@ -474,11 +575,21 @@ public class SystemConfig implements java.io.Serializable{
} }
return color; return color;
} }
public String getIconstr() { public String getIconstr() {
return iconstr; return iconstr;
} }
public void setIconstr(String iconstr) { public void setIconstr(String iconstr) {
this.iconstr = iconstr; this.iconstr = iconstr;
} }
@Transient
public boolean getUserExpTelemetrySetting() {
return userExpTelemetrySetting;
}
public void setUserExpTelemetrySetting(boolean userExpTelemetrySetting) {
this.userExpTelemetrySetting = userExpTelemetrySetting;
}
} }

View File

@ -269,7 +269,16 @@ block content
p 系统菜单的权限控制 p 系统菜单的权限控制
p(style='color:#888888;font-size:13px;margin-top:10px;') 默认不启用权限控制如果选择启用用户需要授权才能访问需要授权的系统菜单功能系统管理员账号admin不受控制 p(style='color:#888888;font-size:13px;margin-top:10px;') 默认不启用权限控制如果选择启用用户需要授权才能访问需要授权的系统菜单功能系统管理员账号admin不受控制
.col-lg-4(style='text-align:right;') .col-lg-4(style='text-align:right;')
input(type="checkbox", title="启用", name="auth", value="1", checked= (systemConfig.auth ? 'checked': false)) input(type="checkbox", title="启用", name="auth", value="1", checked= (systemConfig.auth == "true" ? 'checked': false))
.ukefu-webim-prop
.ukefu-webim-tl(style='clear:both;') 加入用户体验计划
.box-item
.row
.col-lg-8
p 是否开启
p(style='color:#888888;font-size:13px;margin-top:10px;') 反馈功能使用情况,以指导春松客服优化和完善产品功能; 相关数据匿名,不发送敏感数据
.col-lg-4(style='text-align:right;')
input(type="checkbox", title="启用", name="userExpTelemetrySetting", value="1", checked= (userExpTelemetrySetting ? 'checked': false))
.ukefu-webim-prop(hidden) .ukefu-webim-prop(hidden)
.ukefu-webim-tl(style='clear:both;') 启用语音平台模板配置 .ukefu-webim-tl(style='clear:both;') 启用语音平台模板配置
.box-item .box-item

View File

@ -35,6 +35,13 @@ html(xmlns='http://www.w3.org/1999/xhtml', xmlns:th='http://www.thymeleaf.org',
script(language='javascript', src='/js/theme/wonderland.js') script(language='javascript', src='/js/theme/wonderland.js')
script(src='/layui.js') script(src='/layui.js')
script(src='/js/cskefu.js') script(src='/js/cskefu.js')
if userExpTelemetry == 'on'
script(src='https://www.googletagmanager.com/gtag/js?id=G-SBBX10RKTC' async)
script.
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
gtag('config', 'G-SBBX10RKTC');
body body
.layui-layout.layui-layout-content .layui-layout.layui-layout-content
.layui-side.layui-bg-black .layui-side.layui-bg-black

View File

@ -53,6 +53,15 @@ html(xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org" xm
script(src="http://api.map.baidu.com/api?v=2.0&ak=" + systemConfig.mapkey) script(src="http://api.map.baidu.com/api?v=2.0&ak=" + systemConfig.mapkey)
script(src="/js/echarts.common.min.js") script(src="/js/echarts.common.min.js")
script(language="javascript" src="/js/theme/wonderland.js") script(language="javascript" src="/js/theme/wonderland.js")
if userExpTelemetry == 'on'
script(src='https://www.googletagmanager.com/gtag/js?id=G-SBBX10RKTC' async)
script.
window.dataLayer = window.dataLayer || [];
function gtag() {
dataLayer.push(arguments);
}
gtag('js', new Date());
gtag('config', 'G-SBBX10RKTC');
body body
.layui-layout.layui-layout-content .layui-layout.layui-layout-content

View File

@ -70,6 +70,16 @@ html
s.parentNode.insertBefore(hm, s); s.parentNode.insertBefore(hm, s);
})(); })();
} }
if userExpTelemetry == 'on'
script(src='https://www.googletagmanager.com/gtag/js?id=G-SBBX10RKTC' async)
script.
window.dataLayer = window.dataLayer || [];
function gtag() {
dataLayer.push(arguments);
}
gtag('js', new Date());
gtag('config', 'G-SBBX10RKTC');
body.login body.login
if extrasLoginBanner != "off" if extrasLoginBanner != "off"
div(style="width: 100%; height:50px; background-color: #2bd99e; padding-top: 0px;display: flex;") div(style="width: 100%; height:50px; background-color: #2bd99e; padding-top: 0px;display: flex;")