@@ -0,0 +1,514 @@
< style type = "text/css" >
. inline-block { display : inline-block ; }
. wxwork-form . layui-form-item { margin-bottom : 20 px ; }
. wxwork-form . layui-input-block { margin-left : 120 px ; }
. wxwork-help { color : #999 ; font-size : 12 px ; margin-top : 5 px ; }
. wxwork-required { color : #ff5722 ; margin-right : 4 px ; }
. wxwork-guide { background : #f8f9fa ; border-left : 3 px solid #007bff ; padding : 15 px ; margin-top : 10 px ; border-radius : 4 px ; }
. wxwork-guide h4 { margin : 0 0 10 px 0 ; color : #007bff ; }
. wxwork-guide ol { margin : 0 ; padding-left : 20 px ; }
. wxwork-guide li { margin-bottom : 8 px ; }
. wxwork-code { background : #f1f3f4 ; padding : 2 px 6 px ; border-radius : 3 px ; font-family : monospace ; font-size : 12 px ; }
. wxwork-field-required . layui-form-label { color : #333 ; }
. wxwork-link { color : #007bff ; text-decoration : none ; }
. wxwork-link : hover { text-decoration : underline ; }
. wxwork-guide-toggle { margin-top : 30 px ; }
. wxwork-guide-toggle . guide-toggle-btn { width : 100 % ; padding : 12 px ; background : #f8f9fa ; border : 1 px solid #dee2e6 ; border-radius : 4 px ; cursor : pointer ; transition : all 0.3 s ; display : flex ; align-items : center ; justify-content : center ; gap : 8 px ; font-size : 14 px ; color : #333 ; }
. wxwork-guide-toggle . guide-toggle-btn : hover { background : #e9ecef ; border-color : #007bff ; }
. wxwork-guide-toggle . guide-toggle-btn . active { background : #007bff ; color : white ; border-color : #007bff ; }
. wxwork-guide-toggle . guide-content { margin-top : 15 px ; background : #f8f9fa ; border-left : 3 px solid #007bff ; padding : 15 px ; border-radius : 4 px ; display : none ; }
. wxwork-guide-toggle . guide-content . show { display : block ; }
. guide-toggle-icon { transition : transform 0.3 s ; }
. guide-toggle-icon . rotate { transform : rotate ( 180 deg ) ; }
. password-wrapper { position : relative ; }
. password-toggle { position : absolute ; right : 10 px ; top : 50 % ; transform : translateY ( -50 % ) ; cursor : pointer ; color : #999 ; font-size : 16 px ; user-select : none ; }
. password-toggle : hover { color : #007bff ; }
< / style >
< div class = "layui-form form-wrap wxwork-form" >
< div class = "layui-form-item" >
< label class = "layui-form-label" > 启用状态:< / label >
< div class = "layui-input-block" >
< input type = "checkbox" name = "enabled" value = "1" lay-skin = "switch" { if condition = "$wxwork_config.enabled == 1" } checked { / if } lay-title = "启用|关闭" / >
< / div >
< div class = "wxwork-help" > 开启后,企业微信相关功能将可用< / div >
< / div >
< div class = "layui-form-item wxwork-field-required" >
< label class = "layui-form-label" > < span class = "wxwork-required" > *< / span > 企业ID: < / label >
< div class = "layui-input-block" >
< input type = "text" name = "corp_id" required autocomplete = "off" value = "{$wxwork_config.corp_id ?? ''}" class = "layui-input len-long" placeholder = "wwxxxxxxxxxxxx" >
< / div >
< div class = "wxwork-help" >
< p > < strong > 获取方式< / strong > :企业微信管理后台 → 我的企业 → 企业信息 → 企业ID< / p >
< p > < strong > 格式< / strong > :通常以 "ww" 开头的18位字符串< / p >
< / div >
< / div >
< div class = "layui-form-item wxwork-field-required" >
< label class = "layui-form-label" > < span class = "wxwork-required" > *< / span > 应用ID: < / label >
< div class = "layui-input-block" >
< input type = "text" name = "agent_id" required autocomplete = "off" value = "{$wxwork_config.agent_id ?? ''}" class = "layui-input len-long" placeholder = "1000001" >
< / div >
< div class = "wxwork-help" >
< p > < strong > 获取方式< / strong > :应用管理 → 选择应用 → 查看应用详情 → AgentId< / p >
< p > < strong > 格式< / strong > :数字字符串,如 1000001< / p >
< / div >
< / div >
< div class = "layui-form-item wxwork-field-required" >
< label class = "layui-form-label" > < span class = "wxwork-required" > *< / span > 应用Secret: < / label >
< div class = "layui-input-block" >
< div class = "password-wrapper" >
< input type = "password" name = "secret" id = "secret-input" required autocomplete = "off" value = "{$wxwork_config.secret ?? ''}" class = "layui-input len-long" placeholder = "请输入应用Secret" >
< span class = "password-toggle" onclick = "togglePassword()" > 👁️< / span >
< / div >
< / div >
< div class = "wxwork-help" style = "color: #ff5722;" >
< p > < strong > 获取方式< / strong > :企业微信管理后台 → 应用管理 → 选择应用 → 查看Secret< / p >
< p > < strong > 说明< / strong > : < strong style = "color: #ff5722;" > 系统必需< / strong > :用于自动生成签名,请妥善保管< / p >
< p > < strong > 安全提示< / strong > : Secret仅在创建时可见, 请立即复制保存< / p >
< / div >
< / div >
< div class = "layui-form-item wxwork-field-required" >
< label class = "layui-form-label" > < span class = "wxwork-required" > *< / span > 客服ID: < / label >
< div class = "layui-input-block" >
< input type = "text" name = "contact_id" required autocomplete = "off" value = "{$wxwork_config.contact_id ?? ''}" class = "layui-input len-long" placeholder = "kfc_xxxxx" >
< / div >
< div class = "wxwork-help" style = "color: #ff5722;" >
< p > < strong > 获取方式< / strong > :企业微信管理后台 → 应用管理 → 客服 → 联系我< / p >
< p > < strong > 说明< / strong > : < strong style = "color: #ff5722;" > 系统必需功能< / strong > ,用于企业微信客服对接< / p >
< p > < strong > 格式< / strong > :通常以 "kfc_" 开头的字符串< / p >
< / div >
< / div >
< div class = "layui-form-item wxwork-field-required" >
< label class = "layui-form-label" > < span class = "wxwork-required" > *< / span > 活码链接:< / label >
< div class = "layui-input-block" >
< input type = "text" name = "contact_url" required autocomplete = "off" value = "{$wxwork_config.contact_url ?? ''}" class = "layui-input len-long" placeholder = "https://work.weixin.qq.com/kf/..." >
< / div >
< div class = "wxwork-help" style = "color: #ff5722;" >
< p > < strong > 获取方式< / strong > :企业微信管理后台 → 客服 → 联系我 → 生成活码< / p >
< p > < strong > 说明< / strong > : < strong style = "color: #ff5722;" > 系统必需功能< / strong > ,客服活码的完整链接地址< / p >
< p > < strong > 格式< / strong > : 完整的HTTPS链接, 如 https://work.weixin.qq.com/kf/xxxx< / p >
< / div >
< / div >
<!-- 隐藏的自动生成字段 -->
< input type = "hidden" name = "timestamp" value = "{$wxwork_config.timestamp ?? ''}" >
< input type = "hidden" name = "nonceStr" value = "{$wxwork_config.nonceStr ?? ''}" >
< input type = "hidden" name = "signature" value = "{$wxwork_config.signature ?? ''}" >
<!-- 系统状态显示区域 -->
< div class = "layui-form-item" >
< div class = "layui-input-block" >
< div class = "wxwork-status-panel" style = "border: 1px solid #e6e6e6; border-radius: 4px; padding: 15px; background: #fafafa; display: flex; flex-direction: column;" >
< div style = "margin-bottom: 10px;" >
< span > < strong > 配置完整性:< / strong > < / span >
< span id = "config-completeness" style = "color: #999;" > 检查中...< / span >
< / div >
< div style = "margin-bottom: 10px;" >
< span > < strong > 签名生成状态:< / strong > < / span >
< span id = "signature-status" style = "color: #999;" > 点击保存配置,将自动生成< / span >
< / div >
< div style = "margin-bottom: 10px;" >
< span > < strong > 时间戳:< / strong > < / span >
< span id = "timestamp-value" style = "color: #666;" > {if condition="$wxwork_config.timestamp"}{$wxwork_config.timestamp}{else /}未生成{/if}< / span >
< / div >
< div style = "margin-bottom: 10px;" >
< span > < strong > 随机字符串:< / strong > < / span >
< span id = "nonce-str-value" style = "color: #666;" > {if condition="$wxwork_config.nonceStr"}{$wxwork_config.nonceStr}{else /}未生成{/if}< / span >
< / div >
< div style = "margin-bottom: 10px;" >
< span > < strong > 签名:< / strong > < / span >
< span id = "signature-value" style = "color: #52c41a; font-family: monospace; font-size: 12px; word-break: break-all;" > {if condition="$wxwork_config.signature"}{$wxwork_config.signature}{else /}未生成{/if}< / span >
< / div >
< div >
< span > < strong > 最后更新时间:< / strong > < / span >
< span id = "last-update-time" style = "color: #666;" > {if condition="$wxwork_config.timestamp"}<?php echo date('Y-m-d H:i:s', $wxwork_config['timestamp']); ?> {else /}从未生成{/if}< / span >
< / div >
< / div >
< / div >
< div class = "wxwork-help" >
< p > < strong > 说明< / strong > :系统将在保存配置时自动生成时间戳、随机字符串和签名< / p >
< p > < strong > 生成规则< / strong > : 基于Secret使用SHA1算法生成, 用于企业微信API验证< / p >
< / div >
< / div >
< div class = "form-row" >
< button class = "layui-btn" lay-submit lay-filter = "save" > 保存配置< / button >
< button type = "button" class = "layui-btn layui-btn-primary" onclick = "window.location.reload()" > 重置< / button >
< button type = "button" class = "layui-btn layui-btn-normal" onclick = "window.open('https://work.weixin.qq.com/', '_blank')" > 企业微信管理后台< / button >
< / div >
< / div >
<!-- 获取指南 -->
< div class = "wxwork-guide-toggle" >
< div class = "guide-toggle-btn" onclick = "toggleGuide()" >
< span > 📋 企业微信配置获取指南< / span >
< span class = "guide-toggle-icon" > ▼< / span >
< / div >
< div class = "guide-content" >
< p style = "color: #ff5722; font-weight: bold; margin-bottom: 15px;" > ⚠️ 注意:客服功能为系统必需功能,必须正确配置相关参数< / p >
< ol >
< li > < strong > 登录企业微信管理后台< / strong > : < a href = "https://work.weixin.qq.com/" target = "_blank" class = "wxwork-link" > https://work.weixin.qq.com/< / a > < / li >
< li > < strong > 获取企业ID< / strong > : 进入「我的企业」→「企业信息」→「企业ID」< / li >
< li > < strong > 创建应用< / strong > :进入「应用管理」→「应用」→「创建应用」→「自建」< / li >
< li > < strong > 获取应用ID< / strong > :创建完成后进入应用详情页,查看 < span class = "wxwork-code" > AgentId< / span > < / li >
< li > < strong > 获取Secret< / strong > :在应用详情页查看 < span class = "wxwork-code" > Secret< / span > (用于生成签名)< / li >
< li > < strong > 配置可信域名< / strong > : 在应用详情页设置可信域名, 用于JS接口调用< / li >
< li > < strong > 开启客服功能< / strong > : < strong style = "color: #ff5722;" > (必需)< / strong > 进入「应用管理」→「客服」→「联系我」→ 开启服务< / li >
< li > < strong > 获取客服参数< / strong > : 在客服页面获取客服ID和活码链接< / li >
< / ol >
< h5 style = "margin-top: 15px; color: #007bff;" > 🔧 参数获取方式说明< / h5 >
< table style = "width: 100%; border-collapse: collapse; margin-top: 10px;" >
< tr style = "background: #f8f9fa;" >
< th style = "border: 1px solid #dee2e6; padding: 8px; text-align: left;" > 参数名称< / th >
< th style = "border: 1px solid #dee2e6; padding: 8px; text-align: left;" > 获取方式< / th >
< th style = "border: 1px solid #dee2e6; padding: 8px; text-align: left;" > 说明< / th >
< / tr >
< tr >
< td style = "border: 1px solid #dee2e6; padding: 8px;" > 企业ID< / td >
< td style = "border: 1px solid #dee2e6; padding: 8px;" > 企业微信管理后台 → 我的企业 → 企业信息 → 企业ID< / td >
< td style = "border: 1px solid #dee2e6; padding: 8px;" > 企业唯一标识< / td >
< / tr >
< tr >
< td style = "border: 1px solid #dee2e6; padding: 8px;" > 应用ID< / td >
< td style = "border: 1px solid #dee2e6; padding: 8px;" > 企业微信管理后台 → 应用管理 → 选择应用 → 查看应用详情 → AgentId< / td >
< td style = "border: 1px solid #dee2e6; padding: 8px;" > 应用的AgentId< / td >
< / tr >
< tr >
< td style = "border: 1px solid #dee2e6; padding: 8px;" > 应用Secret< / td >
< td style = "border: 1px solid #dee2e6; padding: 8px;" > 企业微信管理后台 → 应用管理 → 选择应用 → 查看Secret< / td >
< td style = "border: 1px solid #dee2e6; padding: 8px; color: #ff5722;" > < strong > 必需< / strong > :用于生成签名的密钥< / td >
< / tr >
< tr >
< td style = "border: 1px solid #dee2e6; padding: 8px;" > 客服ID< / td >
< td style = "border: 1px solid #dee2e6; padding: 8px;" > 企业微信管理后台 → 应用管理 → 客服 → 联系我< / td >
< td style = "border: 1px solid #dee2e6; padding: 8px; color: #ff5722;" > < strong > 必需< / strong > :客服功能的唯一标识< / td >
< / tr >
< tr >
< td style = "border: 1px solid #dee2e6; padding: 8px;" > 活码链接< / td >
< td style = "border: 1px solid #dee2e6; padding: 8px;" > 企业微信管理后台 → 客服 → 联系我 → 生成活码< / td >
< td style = "border: 1px solid #dee2e6; padding: 8px; color: #ff5722;" > < strong > 必需< / strong > :客服活码的完整链接< / td >
< / tr >
< tr >
< td style = "border: 1px solid #dee2e6; padding: 8px;" > 时间戳< / td >
< td style = "border: 1px solid #dee2e6; padding: 8px;" > < span class = "wxwork-code" > 本系统自动生成< / span > < / td >
< td style = "border: 1px solid #dee2e6; padding: 8px;" > Unix时间戳, 无需手动填写< / td >
< / tr >
< tr >
< td style = "border: 1px solid #dee2e6; padding: 8px;" > 随机字符串< / td >
< td style = "border: 1px solid #dee2e6; padding: 8px;" > < span class = "wxwork-code" > 本系统自动生成< / span > < / td >
< td style = "border: 1px solid #dee2e6; padding: 8px;" > 16位随机字符, 无需手动填写< / td >
< / tr >
< tr >
< td style = "border: 1px solid #dee2e6; padding: 8px;" > 签名< / td >
< td style = "border: 1px solid #dee2e6; padding: 8px;" > < span class = "wxwork-code" > 本系统自动生成< / span > < / td >
< td style = "border: 1px solid #dee2e6; padding: 8px;" > SHA1签名, 无需手动填写< / td >
< / tr >
< / table >
< / div >
< / div >
< script >
layui . use ( [ 'form' , 'layer' ] , function ( ) {
var form = layui . form ,
layer = layui . layer ,
repeat _flag = false ; //防重复标识
form . render ( ) ;
// 启用状态切换时的验证
$ ( 'input[name="enabled"]' ) . on ( 'change' , function ( ) {
if ( $ ( this ) . is ( ':checked' ) ) {
var corpId = $ ( 'input[name="corp_id"]' ) . val ( ) . trim ( ) ;
var agentId = $ ( 'input[name="agent_id"]' ) . val ( ) . trim ( ) ;
var secret = $ ( 'input[name="secret"]' ) . val ( ) . trim ( ) ;
var contactId = $ ( 'input[name="contact_id"]' ) . val ( ) . trim ( ) ;
var contactUrl = $ ( 'input[name="contact_url"]' ) . val ( ) . trim ( ) ;
if ( ! corpId ) {
layer . msg ( '请先填写企业ID( 必填项) ' , { icon : 2 } ) ;
$ ( this ) . prop ( 'checked' , false ) ;
form . render ( ) ;
$ ( 'input[name="corp_id"]' ) . focus ( ) ;
return ;
}
if ( ! agentId ) {
layer . msg ( '请先填写应用ID( 必填项) ' , { icon : 2 } ) ;
$ ( this ) . prop ( 'checked' , false ) ;
form . render ( ) ;
$ ( 'input[name="agent_id"]' ) . focus ( ) ;
return ;
}
if ( ! secret ) {
layer . msg ( '请先填写应用Secret( 系统必需) ' , { icon : 2 } ) ;
$ ( this ) . prop ( 'checked' , false ) ;
form . render ( ) ;
$ ( 'input[name="secret"]' ) . focus ( ) ;
return ;
}
if ( ! contactId ) {
layer . msg ( '请先填写客服ID( 系统必需功能) ' , { icon : 2 } ) ;
$ ( this ) . prop ( 'checked' , false ) ;
form . render ( ) ;
$ ( 'input[name="contact_id"]' ) . focus ( ) ;
return ;
}
if ( ! contactUrl ) {
layer . msg ( '请先填写活码链接(系统必需功能)' , { icon : 2 } ) ;
$ ( this ) . prop ( 'checked' , false ) ;
form . render ( ) ;
$ ( 'input[name="contact_url"]' ) . focus ( ) ;
return ;
}
// 企业ID格式验证
if ( ! /^ww[a-zA-Z0-9]{16}$/ . test ( corpId ) ) {
layer . msg ( '企业ID格式不正确, 应为ww开头的18位字符' , { icon : 2 } ) ;
$ ( this ) . prop ( 'checked' , false ) ;
form . render ( ) ;
$ ( 'input[name="corp_id"]' ) . focus ( ) ;
return ;
}
// 应用ID格式验证
if ( ! /^\d+$/ . test ( agentId ) ) {
layer . msg ( '应用ID格式不正确, 应为纯数字' , { icon : 2 } ) ;
$ ( this ) . prop ( 'checked' , false ) ;
form . render ( ) ;
$ ( 'input[name="agent_id"]' ) . focus ( ) ;
return ;
}
// Secret格式验证
if ( secret . length < 10 ) {
layer . msg ( 'Secret格式不正确, 长度至少10位字符' , { icon : 2 } ) ;
$ ( this ) . prop ( 'checked' , false ) ;
form . render ( ) ;
$ ( 'input[name="secret"]' ) . focus ( ) ;
return ;
}
layer . msg ( '配置验证通过!企业微信功能已启用,系统将自动生成签名' , { icon : 1 } ) ;
}
} ) ;
// 更新配置完整性状态
function updateConfigStatus ( ) {
var corpId = $ ( 'input[name="corp_id"]' ) . val ( ) . trim ( ) ;
var agentId = $ ( 'input[name="agent_id"]' ) . val ( ) . trim ( ) ;
var secret = $ ( 'input[name="secret"]' ) . val ( ) . trim ( ) ;
var contactId = $ ( 'input[name="contact_id"]' ) . val ( ) . trim ( ) ;
var contactUrl = $ ( 'input[name="contact_url"]' ) . val ( ) . trim ( ) ;
var timestamp = $ ( 'input[name="timestamp"]' ) . val ( ) ;
var nonceStr = $ ( 'input[name="nonceStr"]' ) . val ( ) ;
var signature = $ ( 'input[name="signature"]' ) . val ( ) ;
// 更新配置完整性
var requiredFields = [ corpId , agentId , secret , contactId , contactUrl ] ;
var filledCount = requiredFields . filter ( function ( field ) { return field . length > 0 ; } ) . length ;
var completeness = Math . round ( ( filledCount / requiredFields . length ) * 100 ) ;
var completenessElement = $ ( '#config-completeness' ) ;
if ( completeness === 100 ) {
completenessElement . text ( '完整 (100%)' ) . css ( 'color' , '#52c41a' ) ;
} else {
completenessElement . text ( '不完整 (' + completeness + '%)' ) . css ( 'color' , '#ff7875' ) ;
}
// 更新签名状态和相关信息
var signatureElement = $ ( '#signature-status' ) ;
var timestampElement = $ ( '#timestamp-value' ) ;
var nonceStrElement = $ ( '#nonce-str-value' ) ;
var signatureValueElement = $ ( '#signature-value' ) ;
if ( signature && timestamp ) {
// 显示已存在的签名信息
signatureElement . text ( '已生成' ) . css ( 'color' , '#52c41a' ) ;
timestampElement . text ( timestamp ) . css ( 'color' , '#52c41a' ) ;
nonceStrElement . text ( nonceStr || '未生成' ) . css ( 'color' , '#52c41a' ) ;
signatureValueElement . text ( signature ) . css ( 'color' , '#52c41a' ) ;
} else {
// 显示生成提示
if ( completeness === 100 ) {
signatureElement . text ( '配置完整,点击保存将生成' ) . css ( 'color' , '#1890ff' ) ;
} else {
signatureElement . text ( '请完善必填配置信息' ) . css ( 'color' , '#ff7875' ) ;
}
timestampElement . text ( '未生成' ) . css ( 'color' , '#999' ) ;
nonceStrElement . text ( '未生成' ) . css ( 'color' , '#999' ) ;
signatureValueElement . text ( '未生成' ) . css ( 'color' , '#999' ) ;
}
}
// 监听所有输入框变化
$ ( 'input[name="corp_id"], input[name="agent_id"], input[name="secret"], input[name="contact_id"], input[name="contact_url"]' ) . on ( 'input blur' , function ( ) {
updateConfigStatus ( ) ;
} ) ;
// 初始化状态
updateConfigStatus ( ) ;
// 表单提交前的必填项验证
form . on ( 'submit(save)' , function ( data ) {
var corpId = data . field . corp _id . trim ( ) ;
var agentId = data . field . agent _id . trim ( ) ;
var secret = data . field . secret . trim ( ) ;
var contactId = data . field . contact _id . trim ( ) ;
var contactUrl = data . field . contact _url . trim ( ) ;
// 验证企业ID
if ( ! corpId ) {
layer . msg ( '企业ID为必填项' , { icon : 2 } ) ;
$ ( 'input[name="corp_id"]' ) . focus ( ) ;
repeat _flag = false ;
return false ;
}
// 验证应用ID
if ( ! agentId ) {
layer . msg ( '应用ID为必填项' , { icon : 2 } ) ;
$ ( 'input[name="agent_id"]' ) . focus ( ) ;
repeat _flag = false ;
return false ;
}
// 验证Secret( 必需)
if ( ! secret ) {
layer . msg ( '应用Secret为系统必需参数, 必须填写' , { icon : 2 } ) ;
$ ( 'input[name="secret"]' ) . focus ( ) ;
repeat _flag = false ;
return false ;
}
// 验证客服ID( 必需)
if ( ! contactId ) {
layer . msg ( '客服ID为系统必需功能, 必须填写' , { icon : 2 } ) ;
$ ( 'input[name="contact_id"]' ) . focus ( ) ;
repeat _flag = false ;
return false ;
}
// 验证活码链接(必需)
if ( ! contactUrl ) {
layer . msg ( '活码链接为系统必需功能,必须填写' , { icon : 2 } ) ;
$ ( 'input[name="contact_url"]' ) . focus ( ) ;
repeat _flag = false ;
return false ;
}
// 企业ID格式验证
if ( ! /^ww[a-zA-Z0-9]{16}$/ . test ( corpId ) ) {
layer . msg ( '企业ID格式不正确, 应为ww开头的18位字符' , { icon : 2 } ) ;
$ ( 'input[name="corp_id"]' ) . focus ( ) ;
repeat _flag = false ;
return false ;
}
// 应用ID格式验证
if ( ! /^\d+$/ . test ( agentId ) ) {
layer . msg ( '应用ID格式不正确, 应为纯数字' , { icon : 2 } ) ;
$ ( 'input[name="agent_id"]' ) . focus ( ) ;
repeat _flag = false ;
return false ;
}
// Secret格式验证
if ( secret . length < 10 ) {
layer . msg ( 'Secret格式不正确, 长度至少10位字符' , { icon : 2 } ) ;
$ ( 'input[name="secret"]' ) . focus ( ) ;
repeat _flag = false ;
return false ;
}
// 客服ID格式验证
if ( ! /^kfc_[a-zA-Z0-9]+$/ . test ( contactId ) ) {
layer . msg ( '客服ID格式不正确, 应以kfc_开头' , { icon : 2 } ) ;
$ ( 'input[name="contact_id"]' ) . focus ( ) ;
repeat _flag = false ;
return false ;
}
// 活码链接格式验证
if ( ! /^https:\/\/work\.weixin\.qq\.com\/kf\// . test ( contactUrl ) ) {
layer . msg ( '活码链接格式不正确,应为 https://work.weixin.qq.com/kf/... 格式' , { icon : 2 } ) ;
$ ( 'input[name="contact_url"]' ) . focus ( ) ;
repeat _flag = false ;
return false ;
}
// 继续执行原有的AJAX提交逻辑
if ( repeat _flag ) return false ;
repeat _flag = true ;
// 开关值处理
data . field . enabled = data . field . enabled ? 1 : 0 ;
$ . ajax ( {
url : ns . url ( "shop/config/wxwork" ) ,
data : data . field ,
dataType : 'JSON' ,
type : 'POST' ,
success : function ( res ) {
if ( res . code == 0 ) {
layer . msg ( '企业微信配置保存成功!系统已自动生成签名和时间戳' , { icon : 1 } ) ;
// 刷新页面以显示更新后的状态
setTimeout ( function ( ) {
window . location . reload ( ) ;
} , 1500 ) ;
} else {
layer . msg ( res . message , { icon : 2 } ) ;
}
repeat _flag = false ;
} ,
error : function ( ) {
layer . msg ( '服务器错误' , { icon : 2 } ) ;
repeat _flag = false ;
}
} ) ;
return false ; // 阻止默认提交
} ) ;
} ) ;
// 切换密码显示/隐藏
function togglePassword ( ) {
var secretInput = $ ( '#secret-input' ) ;
var toggleBtn = $ ( '.password-toggle' ) ;
if ( secretInput . attr ( 'type' ) === 'password' ) {
secretInput . attr ( 'type' , 'text' ) ;
toggleBtn . text ( '🙈' ) ;
} else {
secretInput . attr ( 'type' , 'password' ) ;
toggleBtn . text ( '👁️' ) ;
}
}
// 切换指南显示/隐藏
function toggleGuide ( ) {
var btn = $ ( '.guide-toggle-btn' ) ;
var content = $ ( '.guide-content' ) ;
var icon = $ ( '.guide-toggle-icon' ) ;
if ( content . hasClass ( 'show' ) ) {
content . removeClass ( 'show' ) ;
btn . removeClass ( 'active' ) ;
icon . removeClass ( 'rotate' ) ;
} else {
content . addClass ( 'show' ) ;
btn . addClass ( 'active' ) ;
icon . addClass ( 'rotate' ) ;
}
}
< / script >