PageSourceSearch

https://0hm.cn/article/757.html

html 0hm.cn collected 2026-10-09 04:34:08 UTC 79,526 bytes, 2,352 lines download raw bytes

1<!DOCTYPE html>
2<html lang="en">
3<head>
4<meta charset="utf-8">
5<title>社区圈子</title>
6<meta name="keywords" content="诚盟软件行业解决方案
7
8">
9<meta name="description" content="诚盟软件行业解决方案
10
11">
12<link rel="icon" href="https://zj.chengmenghudong.com.cn/storage/2/20221212/4b267f86d702fff8956b9774e853ae06.png" />
13<!-- Stylesheets -->
14<link href="/resource/css/bootstrap.css" rel="stylesheet">
15<link href="/resource/css/icons.css" rel="stylesheet">
16<link href="/resource/css/style.css" rel="stylesheet">
17<link href="/resource/css/style1.css" rel="stylesheet">
18<link href="/resource/css/animation.css" rel="stylesheet">
19<link href="/resource/css/responsive.css" rel="stylesheet">
20<link href="/resource/css/style-zh.css" rel="stylesheet">
21<link href="/resource/css/layer.css" rel="stylesheet">
22<script src="/resource/js/jquery.js"></script>
vendor: 1 bytes, line 22
22
23<script src="/resource/js/layer.js"></script>
23
24<link rel="stylesheet" type="text/css" href="//at.alicdn.com/t/c/font_2408324_pezmgeu9b9d.css">
25<meta name="content-protection" content='{"enabled":false,"mode":"disable_all","message":""}'>
26<script src="/resource/js/custom.js"></script>
26
27<meta name="external-link-notice" content='{"enabled":false}'>
28<!-- 水印配置信息 -->
29<meta name="watermark" content='{"enabled":false,"type":"text","text":"网站水印","color":"#CCCCCC","fontSize":"16","image":"","imageWidth":"100","opacity":"0.3","position":"tile","rotate":"-30","xSpace":"100","ySpace":"100","xOffset":"20","yOffset":"20"}'>
30
31
32<!-- Responsive -->
33<meta http-equiv="X-UA-Compatible" content="IE=edge">
34<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0">
35<!--[if lt IE 9]>
35<script src="/resource/js/html5shiv.js"></script>
35<![endif]-->
36<!--[if lt IE 9]>
36<script src="/resource/js/respond.js"></script>
36<![endif]-->
37<script type="text/javascript" src="/resource/js/swiper.min.js"></script>
37
38<style>
39	.theme-color{color:!important;}
40    .theme-bor-color{border-color:!important;}
41    .theme-icon-color{color:!important;}
42    .theme-bg-color{background:!important;}
43    .theme-active-color:active{color:!important;}
44    .theme-actice-bg-color:active{background:!important;}
45    .btn-style-one, .quote-widget .widget-content, .projects-section-five .filters .filter:hover, .blog-cat-three li a:hover, .blog-cat-three li.active a, .blog-cat-three li a:before, .services-block .inner-box .lower-content .category:before, .services-section .owl-dots .owl-dot.active, .services-section .owl-dots .owl-dot:hover, .btn-style-two, .banner-carousel .content-box .btn-style-three:hover::before, .news-block-three .inner-box .image .post-date, .scroll-to-top, .contact-form .form-group .submit-btn:hover, .accordion-box .block .acc-btn.active .icon-outer, .news-block .inner-box .image .post-date, .footer_kf, .main-menu .navigation > li > ul > li  > ul > li > a:before, .main-menu .navigation > li > ul > li >
46            a:before, .projects-section-five .filters li.active, .sidebar-title h2, .our-product .single-product:hover, .pagination .pagination .active span, .imgText ul li.active span{background-color: ;}
47    .accordion-box .block .acc-btn.active .icon-outer{border-color: ;}
48    .services-block-two .inner-box .image .overlay-box, .services-block-two .inner-box .image .heading-box
49            {border-color: ;}
50    .text_theme_color{transition:.3s; color: !important;}
51    .bg_theme_color{transition:.3s; background: !important;}
52    .pagination > .active > a, .pagination > .active > span, .pagination > .active > a:focus, .pagination > .active > span:focus{background:!important;border-color:!important;}
53    #think_page_trace_open{display: none;}
54
55    /* 提取主题颜色的RGB值,用于透明度效果 */
56    :root {
57        --theme-color: #409EFF;
58        --theme-color-rgb: 64, 158, 255; /* 默认蓝色 */
59    }
60
61    /* 水印样式 */
62    .watermark {
63        position: fixed;
64        top: 0;
65        left: 0;
66        width: 100%;
67        height: 100%;
68        pointer-events: none; /* 确保水印不会影响页面交互 */
69        z-index: 9999;
70        overflow: hidden;
71    }
72</style>
73<style>
74	.main-menu .navigation > li > a{color:#333333;}
75	.fixed-header .navigation > li > a{color:#333333;}
76	.main-menu .navigation > li .active{padding: 0 15px;border-radius: 30px;border:1px solid #409EFF;color:#ffffff;background:#409EFF;}
77	.iconfont{font-size: 25px;}
78</style>
79<!-- header1 -->
80<header class="main-header clearfix pc-show" style="background:#ffffff;">
81	<div class="header-upper">
82		<div class="inner-container">
83			<div class="auto-container clearfix zh-logo">
84				<div class="fl flex">
85					<div class="gf-logo logo55 pad-20 pad-l5">
86						<a href="/"><img src="https://zj.chengmenghudong.com.cn/storage/2/20260402/1776134117890.png" alt=""></a>
87					</div>
88					<div class="trans_logo logo55 pd-10">
89						<a href="/"><img src="https://zj.chengmenghudong.com.cn/storage/2/20251101/1762761216087.png" alt=""></a>
90					</div>
91					
91<script src="/resource/js/vue.min.js"></script>
91
92<link rel="stylesheet" href="/resource/css/city-selector.css">
93				</div>
94
95				<div class="nav-outer clearfix">
96					<nav class="main-menu navbar-expand-md navbar-light">
97						<div class="navbar-header">
98							<button class="navbar-toggler" type="button" data-toggle="collapse"
99								data-target="#navbarSupportedContent" aria-controls="navbarSupportedContent"
100								aria-expanded="false" aria-label="Toggle navigation">
101								<span class="icon flaticon-menu"></span>
102							</button>
103						</div>
104
105						<div class="collapse navbar-collapse clearfix" id="navbarSupportedContent">
106							<ul class="navigation clearfix">
107																<li class="current dropdown">
108									<a  data-translate="true" class=""
109										href="/124"  data-field=" ">
110										首页									</a>
111																	</li>
112																								<li class="current dropdown">
113									<a  data-translate="true" class=""
114										href="/128"  data-field=" ">
115										行业资讯									</a>
116																	</li>
117																								<li class="current dropdown">
118									<a  data-translate="true" class=""
119										href="/127"  data-field=" ">
120										常见问题									</a>
121																	</li>
122																								<li class="current dropdown">
123									<a  data-translate="true" class=""
124										href="/126"  data-field=" ">
125										案例展示									</a>
126																	</li>
127																								<li class="current dropdown">
128									<a  data-translate="true" class=""
129										href="/125"  target="_blank"  data-field=" ">
130										旗下产品									</a>
131																	</li>
132																								<li class="current dropdown">
133									<a  data-translate="true" class=""
134										href="/130"  data-field=" ">
135										关于我们									</a>
136																	</li>
137																							</ul>
138							<div class="outer-box clearfix">
139								<!-- 主题样式 -->
140<style>
141    :root {
142        --theme-color: #409EFF;
143    }
144
145    .user-menu .dropdown-toggle span.name {
146        position: relative;
147        top: 0;
148        left: 0;
149        background: transparent;
150        color: #000;
151    }
152        #think_page_trace_open{display: none;}
153
154    /* 用户菜单样式 */
155    .user-menu {
156        position: relative;
157        display: inline-block;
158        margin: 0 15px;
159    }
160
161    .user-menu .avatar {
162        width: 32px;
163        height: 32px;
164        border-radius: 50%;
165        margin-right: 8px;
166        object-fit: cover;
167        border: 2px solid var(--theme-color);
168    }
169
170    .user-menu .dropdown-toggle {
171        display: flex;
172        align-items: center;
173        color: #333;
174        text-decoration: none;
175        padding: 5px 10px;
176        border-radius: 4px;
177        transition: all 0.3s;
178    }
179
180    .user-menu .dropdown-toggle:hover {
181        background: rgba(0,0,0,0.05);
182    }
183
184    .user-menu .dropdown-toggle span {
185        max-width: 120px;
186        overflow: hidden;
187        text-overflow: ellipsis;
188        white-space: nowrap;
189    }
190
191    .user-menu .dropdown-menu {
192        min-width: 200px;
193        padding: 8px 0;
194        margin-top: 10px;
195        display: none;
196        position: absolute;
197        right: 0;
198        background: #fff;
199        border: 1px solid #ddd;
200        border-radius: 4px;
201        box-shadow: 0 2px 8px rgba(0,0,0,0.1);
202        z-index: 1000;
203        animation: fadeIn 0.2s ease-out;
204    }
205
206    @keyframes fadeIn {
207        from {
208            opacity: 0;
209            transform: translateY(-10px);
210        }
211        to {
212            opacity: 1;
213            transform: translateY(0);
214        }
215    }
216
217    .user-menu .dropdown-menu.show {
218        display: block;
219    }
220
221    .user-menu .dropdown-item {
222        display: flex;
223        align-items: center;
224        padding: 8px 20px;
225        color: #333;
226        text-decoration: none;
227        transition: all 0.3s;
228    }
229
230    .user-menu .dropdown-item i {
231        width: 20px;
232        margin-right: 8px;
233        color: #666;
234        transition: all 0.3s;
235    }
236
237    .user-menu .dropdown-item:hover {
238        background: #f8f9fa;
239        color: var(--theme-color);
240    }
241
242    .user-menu .dropdown-item:hover i {
243        color: var(--theme-color);
244    }
245
246    .user-menu .dropdown-divider {
247        height: 1px;
248        margin: 8px 0;
249        background-color: #e9ecef;
250    }
251
252    .user-menu .login-btns {
253        display: flex;
254        gap: 10px;
255        align-items: center;
256    }
257
258    .user-menu .login-btns .btn {
259        padding: 7px 16px;
260        border-radius: 4px;
261        text-decoration: none;
262        transition: all 0.3s;
263        font-weight: 500;
264    }
265
266    .user-menu .login-btns .btn-outline-primary {
267        border: 1px solid var(--theme-color);
268        color: var(--theme-color);
269    }
270
271    .user-menu .login-btns .btn-outline-primary:hover {
272        background: var(--theme-color);
273        color: #fff;
274    }
275
276    .user-menu .login-btns .btn-primary {
277        background: var(--theme-color);
278        color: #fff;
279        border: 1px solid var(--theme-color);
280    }
281
282    .user-menu .login-btns .btn-primary:hover {
283        opacity: 0.9;
284        transform: translateY(-1px);
285    }
286</style>
287
288<!-- 动态主题颜色 -->
289<script>
290document.documentElement.style.setProperty('--theme-color', '');
291</script>
291
292<!-- 用户菜单 -->
293<div class="user-menu">
294        <div class="login-btns">
295        <style>
296    /* 语言下拉菜单样式 */
297    .language-dropdown {
298        position: relative;
299    }
300
301    .language-dropdown .dropdown-toggle {
302        display: flex;
303        align-items: center;
304        text-decoration: none;
305        padding: 5px 10px;
306        border-radius: 4px;
307        transition: all 0.3s;
308        color:#333333;
309    }
310    .fixed-header .language-dropdown .dropdown-toggle {
311        color:#333333;
312    }
313
314    .language-dropdown .dropdown-toggle i {
315        margin-right: 5px;
316    }
317
318    .language-dropdown .dropdown-toggle:hover {
319        background: rgba(0,0,0,0.05);
320    }
321
322    .language-dropdown .dropdown-menu {
323        display: none; /* 默认隐藏下拉框 */
324        position: absolute;
325        top: 100%;
326        left: 0;
327        z-index: 1000;
328        min-width: 150px;
329        background: #fff;
330        border: 1px solid rgba(0,0,0,0.15);
331        border-radius: 4px;
332        box-shadow: 0 2px 8px rgba(0,0,0,0.1);
333        margin-top: 2px;
334    }
335
336    .language-dropdown .dropdown-menu.show {
337        display: block; /* 点击时显示下拉框 */
338    }
339
340    /* 多列展示样式 - 当语言超过10种时使用 */
341    .language-dropdown .dropdown-menu.multi-column.show {
342        display: flex; /* 只有在show状态下才使用flex布局 */
343        flex-wrap: wrap;
344        min-width: 235px;
345        padding: 5px;
346        line-height: 1.2;
347    }
348
349    .language-dropdown .dropdown-menu.multi-column .dropdown-item {
350        width: 33.33%; /* 三列布局 */
351        box-sizing: border-box;
352        padding: 0 8px;
353        font-size: 13px;
354        white-space: nowrap;
355        overflow: hidden;
356        text-overflow: ellipsis;
357        margin: 0;
358    }
359
360    /* 响应式调整 - 当屏幕较小时改为两列 */
361    @media (max-width: 768px) {
362        .language-dropdown .dropdown-menu.multi-column {
363            min-width: 240px;
364            max-width: 320px;
365            padding: 4px;
366        }
367
368        .language-dropdown .dropdown-menu.multi-column .dropdown-item {
369            width: 50%; /* 两列布局 */
370            padding: 5px 6px;
371            font-size: 12px;
372        }
373    }
374
375    /* 超小屏幕优化 */
376    @media (max-width: 480px) {
377        .language-dropdown .dropdown-menu.multi-column {
378            min-width: 200px;
379            max-width: 280px;
380        }
381
382        .language-dropdown .dropdown-menu.multi-column .dropdown-item {
383            padding: 4px 5px;
384        }
385    }
386
387    /* 语言选中状态样式 */
388    .language-dropdown .dropdown-item.active {
389        background-color: var(--theme-color);
390        color: #fff;
391    }
392
393    .language-dropdown .dropdown-item:hover {
394        background-color: rgba(0,0,0,0.05);
395    }
396
397    .language-dropdown .dropdown-item.active:hover {
398        background-color: var(--theme-color);
399        opacity: 0.9;
400    }
401</style>
402<!-- 语言切换下拉菜单 -->
403<script>
404    // 语言切换工具对象
405    window.langSwitchUtils = {
406        // 切换下拉菜单显示/隐藏
407        toggleDropdown: function(element) {
408            if (!element) return;
409            var dropdownMenu = element.nextElementSibling;
410            if (!dropdownMenu) return;
411            dropdownMenu.classList.toggle('show');
412
413            // 如果是显示状态,点击页面其他区域时关闭
414            if (dropdownMenu.classList.contains('show')) {
415                document.addEventListener('click', this.closeDropdownOnOutsideClick);
416            } else {
417                document.removeEventListener('click', this.closeDropdownOnOutsideClick);
418            }
419        },
420
421        // 点击页面其他区域关闭下拉菜单
422        closeDropdownOnOutsideClick: function(event) {
423            const dropdowns = document.querySelectorAll('.dropdown-menu.show');
424            dropdowns.forEach(function(dropdown) {
425                let targetElement = event.target;
426                let isDropdownClick = false;
427
428                while (targetElement != null) {
429                    if (targetElement.classList && targetElement.classList.contains('language-dropdown')) {
430                        isDropdownClick = true;
431                        break;
432                    }
433                    targetElement = targetElement.parentElement;
434                }
435
436                if (!isDropdownClick) {
437                    dropdown.classList.remove('show');
438                    document.removeEventListener('click', langSwitchUtils.closeDropdownOnOutsideClick);
439                }
440            });
441        },
442
443        // 切换语言
444        changeLanguage: function(languageCode) {
445            console.log('切换语言到:', languageCode);
446
447            // 保存用户语言偏好到本地存储
448            try {
449                localStorage.setItem('preferred_language', languageCode);
450            } catch (e) {
451                console.error('保存语言偏好失败:', e);
452            }
453
454            // 更新语言显示和菜单选中状态
455            this.updateLanguageDisplay(languageCode);
456
457            // 刷新页面应用新语言
458            if (languageCode === 'zh-cn') {
459                window.location.reload();
460                return;
461            }
462
463            // 显示加载提示
464            const translationLoading = document.querySelector('.translation-loading');
465            if (translationLoading) {
466                translationLoading.style.display = 'block';
467            }
468
469            // 尝试调用全局的translate函数进行翻译
470            if (typeof window.translate === 'object' && typeof window.translate.changeLanguage === 'function') {
471                try {
472                    window.translate.changeLanguage(languageCode);
473                } catch (e) {
474                    console.error('调用翻译函数失败:', e);
475                    // 失败时刷新页面
476                    window.location.reload();
477                }
478            } else {
479                // 没有翻译函数时直接刷新页面
480                window.location.reload();
481            }
482        },
483
484        // 更新语言显示和菜单选中状态
485        updateLanguageDisplay: function(languageCode) {
486            // 获取当前语言对应的名称
487            fetch('/index/translate/getLanguages')
488                .then(response => response.json())
489                .then(data => {
490                    if (data.code === 200 && data.data && data.data.languages) {
491                        const languages = data.data.languages;
492                        const language = languages.find(lang => lang.code === languageCode);
493
494                        if (language) {
495                            // 更新当前显示的语言名称
496                            const currentLanguageElement = document.getElementById('current-language');
497                            if (currentLanguageElement) {
498                                currentLanguageElement.textContent = language.name;
499                            }
500
501                            // 更新下拉菜单中的选中状态
502                            const languageMenu = document.getElementById('language-menu');
503                            if (languageMenu) {
504                                // 移除所有项的选中状态
505                                const items = languageMenu.querySelectorAll('.dropdown-item');
506                                items.forEach(item => {
507                                    item.classList.remove('active');
508                                });
509
510                                // 为当前选中的语言添加选中状态
511                                const selectedItem = Array.from(items).find(item => {
512                                    return item.getAttribute('data-lang-code') === languageCode;
513                                });
514
515                                if (selectedItem) {
516                                    selectedItem.classList.add('active');
517                                }
518                            }
519                        }
520                    }
521                })
522                .catch(error => {
523                    console.error('获取语言名称失败:', error);
524                });
525        }
526    };
527
528    // 页面加载完成后获取语言列表
529    document.addEventListener('DOMContentLoaded', function() {
530        // 检查是否启用多语言功能
531        const enableMultilang = '0' === '1';
532        if (!enableMultilang) {
533            return; // 如果未启用多语言功能,则不加载语言列表
534        }
535
536        // 获取语言列表
537        fetch('/index/translate/getLanguages')
538            .then(response => response.json())
539            .then(data => {
540                if (data.code === 200 && data.data) {
541                    const languages = data.data.languages || [];
542
543                    // 渲染语言菜单
544                    renderLanguageMenu(languages);
545
546                    // 如果没有语言配置,保留"加载中"的显示
547                    if (!languages || languages.length === 0) {
548                        const languageMenu = document.getElementById('language-menu');
549                        if (languageMenu) {
550                            languageMenu.innerHTML = '<div class="dropdown-item loading-text"><span>加载中...</span></div>';
551                        }
552                        return;
553                    }
554                }
555            })
556            .catch(error => {
557                console.error('获取语言列表失败:', error);
558            });
559    });
560
561    // 渲染语言菜单
562    function renderLanguageMenu(languages) {
563        const languageMenu = document.getElementById('language-menu');
564        if (!languageMenu) return;
565
566        // 清空加载提示
567        languageMenu.innerHTML = '';
568
569        // 判断是否需要多列展示(语言超过10种)
570        if (languages && languages.length > 10) {
571            languageMenu.classList.add('multi-column');
572        } else {
573            languageMenu.classList.remove('multi-column');
574        }
575
576        // 如果语言列表为空,保留加载中的显示
577        if (!languages || languages.length === 0) {
578            // 保持"加载中"文本显示
579            languageMenu.innerHTML = '<div class="dropdown-item loading-text"><span>加载中...</span></div>';
580            return;
581        }
582
583        // 获取当前选中的语言代码
584        let currentLangCode = '';
585        try {
586            currentLangCode = localStorage.getItem('preferred_language');
587        } catch (e) {
588            console.error('获取语言偏好失败:', e);
589        }
590
591        // 如果本地存储中没有语言偏好,尝试从translate.to获取
592        if (!currentLangCode && window.translate && window.translate.to) {
593            currentLangCode = window.translate.to;
594        }
595
596        // 如果仍然没有语言代码,使用第一个语言作为默认
597        if (!currentLangCode && languages.length > 0) {
598            currentLangCode = languages[0].code;
599        }
600
601        // 创建文档片段,减少DOM操作次数
602        const fragment = document.createDocumentFragment();
603
604        // 添加语言选项
605        languages.forEach(lang => {
606            const item = document.createElement('a');
607            item.className = 'dropdown-item';
608
609            // 设置data-lang-code属性
610            item.setAttribute('data-lang-code', lang.code);
611            item.dataset.langCode = lang.code;
612
613            // 检查是否为当前选中的语言
614            if (lang.code === currentLangCode) {
615                item.className += ' active'; // 添加active类以高亮显示当前选中的语言
616
617                // 同时更新顶部显示的语言名称
618                const currentLanguageElement = document.getElementById('current-language');
619                if (currentLanguageElement) {
620                    currentLanguageElement.textContent = lang.name;
621                }
622            }
623
624            item.href = 'javascript:void(0);';
625
626            const span = document.createElement('span');
627            span.textContent = lang.name;
628
629            item.appendChild(span);
630            fragment.appendChild(item);
631        });
632
633        // 一次性添加所有元素到DOM
634        languageMenu.appendChild(fragment);
635
636        // 使用事件委托绑定点击事件
637        languageMenu.addEventListener('click', function(e) {
638            const target = e.target.closest('.dropdown-item');
639            if (target && target.dataset.langCode) {
640                const langCode = target.dataset.langCode;
641                console.log('点击切换语言:', langCode);
642
643                // 调用语言切换工具对象的方法
644                langSwitchUtils.changeLanguage(langCode);
645            }
646        });
647    }
648
649    // 设置全局changeLanguage函数
650    window.changeLanguage = function(languageCode) {
651        langSwitchUtils.changeLanguage(languageCode);
652    };
653</script>
653
654            </div>
655    </div>
656
657<script>
658// 处理退出登录
659function handleLogout() {
660    const confirmMsg = window.LangUtil ? window.LangUtil.getText('logout_confirm') : '确定要退出登录吗?';
661    if(!confirm(confirmMsg)) return;
662
663    // 清除本地存储
664    localStorage.clear();
665    sessionStorage.clear();
666
667    // 清除所有cookie
668    document.cookie.split(';').forEach(function(c) {
669        document.cookie = c.trim().split('=')[0] + '=;expires=Thu, 01 Jan 1970 00:00:00 UTC;path=/';
670    });
671
672    // 发送退出请求并刷新当前页面
673    fetch('/index/login/logout.html', {
674        method: 'GET',
675        credentials: 'same-origin',
676        cache: 'no-cache'
677    }).then(function(response) {
678        return response.json();
679    }).then(function(data) {
680        if(data.code === 200) {
681            // 刷新当前页面
682            window.location.reload(true);
683        } else {
684            // 如果有错误,也刷新页面
685            window.location.reload(true);
686        }
687    }).catch(function() {
688        // 发生错误时也刷新页面
689        window.location.reload(true);
690    });
691}
692
693// 切换下拉菜单显示/隐藏
694function toggleDropdown(element) {
695    if (!element) return;
696    var dropdownMenu = element.nextElementSibling;
697    if (!dropdownMenu) return;
698    dropdownMenu.classList.toggle('show');
699}
700
701// 点击页面其他地方关闭下拉菜单
702document.addEventListener('click', function(event) {
703    var dropdowns = document.getElementsByClassName('dropdown-menu');
704    Array.from(dropdowns).forEach(function(dropdown) {
705        if (dropdown.classList.contains('show')) {
706            var targetElement = event.target;
707            var isDropdownClick = false;
708            while (targetElement != null) {
709                if (targetElement.classList.contains('dropdown')) {
710                    isDropdownClick = true;
711                    break;
712                }
713                targetElement = targetElement.parentElement;
714            }
715            if (!isDropdownClick) {
716                dropdown.classList.remove('show');
717            }
718        }
719    });
720});
721</script>
721
722							</div>
723						</div>
724					</nav>
725				</div>
726			</div>
727		</div>
728	</div>
729	
729<script src="/resource/js/custom.js"></script>
729
730</header>
731<!-- 手机端头部导航 -->
732<header class="mobile-header mobile-show">
733    <div class="header-container">
734        <!-- 左侧Logo区域 -->
735        <div class="header-logo">
736            <a href="/">
737                <picture class="logo">
738                    <img srcset="https://zj.chengmenghudong.com.cn/storage/2/20251101/1762761216087.png" alt="logo">
739                </picture>
740            </a>
741        </div>
742        <div class="mobile-language-switch-container">
743            <!-- 移动端语言切换 -->
744            <div class="mobile-language-switch">
745                            </div>
746            <!-- 汉堡菜单按钮 -->
747            <div class="menu-trigger">
748                <span></span>
749                <span></span>
750                <span></span>
751            </div>
752        </div>
753        
754        <!-- 导航菜单区域 -->
755        <div class="nav-wrapper">
756            <nav class="main-nav">
757                <ul class="nav-list">
758                                        <li class="nav-item">
759                                                <a href="/124" class="nav-link">
760                            <span>首页</span>
761                        </a>
762                                            </li>
763                                                            <li class="nav-item">
764                                                <a href="/128" class="nav-link">
765                            <span>行业资讯</span>
766                        </a>
767                                            </li>
768                                                            <li class="nav-item">
769                                                <a href="/127" class="nav-link">
770                            <span>常见问题</span>
771                        </a>
772                                            </li>
773                                                            <li class="nav-item">
774                                                <a href="/126" class="nav-link">
775                            <span>案例展示</span>
776                        </a>
777                                            </li>
778                                                            <li class="nav-item">
779                                                <a href="/125" class="nav-link">
780                            <span>旗下产品</span>
781                        </a>
782                                            </li>
783                                                            <li class="nav-item">
784                                                <a href="/130" class="nav-link">
785                            <span>关于我们</span>
786                        </a>
787                                            </li>
788                                                        </ul>
789            </nav>
790            
791            <!-- 登录注册按钮区域 -->
792            <div class="auth-buttons">
793                            </div>
794        </div>
795
796    </div>
797    
798</header>
799
800<style>
801/* 移动端头部样式 */
802.mobile-header {
803    position: relative; /* 初始为absolute定位 */
804    top: 0;
805    left: 0;
806    width: 100%;
807    background: #fff;
808    box-shadow: 0 2px 10px rgba(0,0,0,0.1);
809    z-index: 1000;
810    transition: all 0.3s ease; /* 添加过渡效果 */
811}
812
813/* 滚动状态下的样式 */
814.mobile-header.fixed {
815    position: fixed;
816    animation: slideDown 0.3s forwards; /* 添加向下滑入动画 */
817}
818
819@keyframes slideDown {
820    from {
821        transform: translateY(-100%);
822    }
823    to {
824        transform: translateY(0);
825    }
826}
827
828.header-container {
829    display: flex;
830    align-items: center;
831    justify-content: space-between;
832    padding: 15px;
833    height: 60px;
834}
835
836/* Logo样式 */
837.header-logo {
838    height: 35px;
839}
840
841.header-logo img {
842    height: 100%;
843    width: auto;
844}
845
846/* 汉堡菜单按钮 */
847.menu-trigger {
848    width: 30px;
849    height: 20px;
850    position: relative;
851    cursor: pointer;
852    z-index: 1001;
853}
854
855.menu-trigger span {
856    display: block;
857    position: absolute;
858    height: 2px;
859    width: 100%;
860    background: #333;
861    border-radius: 2px;
862    transition: all 0.3s ease;
863}
864
865.menu-trigger span:nth-child(1) { top: 0; }
866.menu-trigger span:nth-child(2) { top: 9px; }
867.menu-trigger span:nth-child(3) { top: 18px; }
868
869/* 菜单打开状态 */
870.menu-active .menu-trigger span:nth-child(1) {
871    transform: rotate(45deg);
872    top: 9px;
873}
874
875.menu-active .menu-trigger span:nth-child(2) {
876    opacity: 0;
877}
878
879.menu-active .menu-trigger span:nth-child(3) {
880    transform: rotate(-45deg);
881    top: 9px;
882}
883
884/* 移动端语言切换样式 */
885.mobile-language-switch {
886    margin-right: 10px;
887    position: relative;
888    z-index: 1001;
889}
890.mobile-language-switch-container{
891    display: flex;
892    align-items: center;
893    justify-content: center;
894}
895/* 移动端语言下拉菜单样式覆盖 */
896.mobile-language-switch .language-dropdown {
897    margin-right: 5px;
898}
899
900.mobile-language-switch .language-dropdown .dropdown-toggle {
901    padding: 5px 8px;
902    font-size: 14px;
903    white-space: nowrap;
904    background-color: #f5f5f5;
905    border-radius: 4px;
906    display: flex;
907    align-items: center;
908}
909
910.mobile-language-switch .language-dropdown .dropdown-toggle i {
911    margin-right: 3px;
912}
913
914.mobile-language-switch .language-dropdown .dropdown-menu {
915    position: absolute;
916    top: 100%;
917    right: 0;
918    left: auto;
919    min-width: 120px;
920    background: #fff;
921    border-radius: 4px;
922    box-shadow: 0 2px 10px rgba(0,0,0,0.1);
923    z-index: 1002;
924    padding: 5px 0;
925    margin-top: 5px;
926    display: none;
927}
928
929.mobile-language-switch .language-dropdown .dropdown-menu.show {
930    display: block;
931}
932
933.mobile-language-switch .language-dropdown .dropdown-item {
934    padding: 8px 15px;
935    font-size: 14px;
936    color: #333;
937    text-decoration: none;
938    display: block;
939    white-space: nowrap;
940}
941
942.mobile-language-switch .language-dropdown .dropdown-item:hover {
943    background-color: #f5f5f5;
944}
945
946.mobile-language-switch .language-dropdown .dropdown-item.active {
947    background-color: var(--theme-color);
948    color: #fff;
949}
950
951/* 导航菜单区域 */
952.nav-wrapper {
953    position: fixed;
954    top: 60px;
955    left: 0;
956    width: 100%;
957    height: calc(100vh - 60px);
958    background: #fff;
959    overflow-y: auto;
960    transform: translateX(100%);
961    transition: transform 0.3s ease;
962    z-index: 999;
963}
964
965.menu-active .nav-wrapper {
966    transform: translateX(0);
967}
968
969/* 主导航样式 */
970.nav-list {
971    padding: 0;
972    margin: 0;
973    list-style: none;
974}
975
976.nav-item {
977    border-bottom: 1px solid #eee;
978}
979
980.nav-link {
981    display: flex;
982    align-items: center;
983    justify-content: space-between;
984    padding: 15px;
985    color: #333;
986    text-decoration: none;
987    font-size: 16px;
988}
989
990.arrow {
991    width: 10px;
992    height: 10px;
993    border-right: 2px solid #666;
994    border-bottom: 2px solid #666;
995    transform: rotate(45deg);
996    transition: transform 0.3s ease;
997}
998
999.nav-item.active > .nav-link .arrow {
1000    transform: rotate(-135deg);
1001}
1002
1003/* 二级菜单样式 */
1004.submenu {
1005    display: none;
1006    background: #f8f8f8;
1007}
1008
1009.nav-item.active > .submenu {
1010    display: block;
1011}
1012
1013.submenu-item {
1014    border-bottom: 1px solid #eee;
1015}
1016
1017.submenu-title {
1018    display: flex;
1019    align-items: center;
1020    justify-content: space-between;
1021    padding: 12px 15px 12px 30px;
1022    color: #666;
1023    font-size: 15px;
1024}
1025
1026/* 三级菜单样式 */
1027.third-menu {
1028    display: none;
1029    background: #f1f1f1;
1030    padding: 0;
1031    margin: 0;
1032    list-style: none;
1033}
1034
1035.submenu-item.active > .third-menu {
1036    display: block;
1037}
1038
1039.third-menu li a {
1040    display: block;
1041    padding: 10px 15px 10px 45px;
1042    color: #888;
1043    font-size: 14px;
1044    text-decoration: none;
1045}
1046
1047/* 登录注册按钮样式 */
1048.auth-buttons {
1049    padding: 20px 15px;
1050    display: flex;
1051    gap: 10px;
1052}
1053
1054.auth-btn {
1055    flex: 1;
1056    display: flex;
1057    align-items: center;
1058    justify-content: center;
1059    padding: 12px;
1060    border-radius: 5px;
1061    text-decoration: none;
1062    font-size: 15px;
1063    transition: all 0.3s ease;
1064}
1065
1066.login-btn {
1067    background: #f5f5f5;
1068    color: #333;
1069}
1070
1071.register-btn {
1072    background: #2196F3;
1073    color: #fff;
1074}
1075
1076.auth-btn i {
1077    margin-right: 5px;
1078}
1079</style>
1080
1081<script>
1082$(function() {
1083    // 初始化菜单交互
1084    initMobileMenu();
1085    
1086    // 初始化滚动监听
1087    initScrollHeader();
1088    
1089    // 初始化移动端语言切换
1090    initMobileLangSwitch();
1091});
1092
1093// 初始化移动端语言切换功能
1094function initMobileLangSwitch() {
1095    // 检查是否启用多语言功能
1096    const enableMultilang = '0' === '1';
1097    if (!enableMultilang) {
1098        return; // 如果未启用多语言功能,则不加载语言列表
1099    }
1100    
1101    // 获取语言列表
1102    fetch('/index/translate/getLanguages')
1103        .then(response => response.json())
1104        .then(data => {
1105            if (data.code === 200 && data.data) {
1106                const languages = data.data.languages || [];
1107                
1108                // 渲染移动端语言菜单
1109                renderMobileLanguageMenu(languages);
1110                
1111                // 如果没有语言配置,保留"加载中"的显示
1112                if (!languages || languages.length === 0) {
1113                    const languageMenu = document.getElementById('m-language-menu');
1114                    if (languageMenu) {
1115                        languageMenu.innerHTML = '<div class="dropdown-item loading-text"><span>加载中...</span></div>';
1116                    }
1117                    return;
1118                }
1119            }
1120        })
1121        .catch(error => {
1122            console.error('获取语言列表失败:', error);
1123        });
1124}
1125
1126// 渲染移动端语言菜单
1127function renderMobileLanguageMenu(languages) {
1128    const languageMenu = document.getElementById('m-language-menu');
1129    if (!languageMenu) return;
1130    
1131    // 清空加载提示
1132    languageMenu.innerHTML = '';
1133    
1134    // 如果语言列表为空,保留加载中的显示
1135    if (!languages || languages.length === 0) {
1136        languageMenu.innerHTML = '<div class="dropdown-item loading-text"><span>加载中...</span></div>';
1137        return;
1138    }
1139    
1140    // 获取当前选中的语言代码
1141    let currentLangCode = '';
1142    try {
1143        currentLangCode = localStorage.getItem('preferred_language');
1144    } catch (e) {
1145        console.error('获取语言偏好失败:', e);
1146    }
1147    
1148    // 如果本地存储中没有语言偏好,尝试从translate.to获取
1149    if (!currentLangCode && window.translate && window.translate.to) {
1150        currentLangCode = window.translate.to;
1151    }
1152    
1153    // 如果仍然没有语言代码,使用第一个语言作为默认
1154    if (!currentLangCode && languages.length > 0) {
1155        currentLangCode = languages[0].code;
1156    }
1157    
1158    // 创建文档片段,减少DOM操作次数
1159    const fragment = document.createDocumentFragment();
1160    
1161    // 添加语言选项
1162    languages.forEach(lang => {
1163        const item = document.createElement('a');
1164        item.className = 'dropdown-item';
1165        
1166        // 设置data-lang-code属性
1167        item.setAttribute('data-lang-code', lang.code);
1168        item.dataset.langCode = lang.code;
1169        
1170        // 检查是否为当前选中的语言
1171        if (lang.code === currentLangCode) {
1172            item.className += ' active'; // 添加active类以高亮显示当前选中的语言
1173            
1174            // 同时更新顶部显示的语言名称
1175            const currentLanguageElement = document.getElementById('m-current-language');
1176            if (currentLanguageElement) {
1177                currentLanguageElement.textContent = lang.name;
1178            }
1179        }
1180        
1181        item.href = 'javascript:void(0);';
1182        
1183        const span = document.createElement('span');
1184        span.textContent = lang.name;
1185        
1186        item.appendChild(span);
1187        fragment.appendChild(item);
1188    });
1189    
1190    // 一次性添加所有元素到DOM
1191    languageMenu.appendChild(fragment);
1192    
1193    // 使用事件委托绑定点击事件
1194    languageMenu.addEventListener('click', function(e) {
1195        const target = e.target.closest('.dropdown-item');
1196        if (target && target.dataset.langCode) {
1197            const langCode = target.dataset.langCode;
1198            console.log('点击切换语言:', langCode);
1199            
1200            // 调用语言切换方法
1201            if (window.langSwitchUtils && typeof window.langSwitchUtils.changeLanguage === 'function') {
1202                window.langSwitchUtils.changeLanguage(langCode);
1203            } else {
1204                // 如果没有全局方法,使用简单的刷新方式切换
1205                try {
1206                    localStorage.setItem('preferred_language', langCode);
1207                } catch (e) {
1208                    console.error('保存语言偏好失败:', e);
1209                }
1210                window.location.reload();
1211            }
1212        }
1213    });
1214}
1215
1216// 移动端语言切换工具对象
1217window.mobileLangSwitchUtils = {
1218    // 切换下拉菜单显示/隐藏
1219    toggleDropdown: function(element) {
1220        if (!element) return;
1221        var dropdownMenu = document.getElementById('m-language-menu');
1222        if (!dropdownMenu) return;
1223        dropdownMenu.classList.toggle('show');
1224        
1225        // 阻止事件冒泡
1226        event.stopPropagation();
1227        
1228        // 如果是显示状态,点击页面其他区域时关闭
1229        if (dropdownMenu.classList.contains('show')) {
1230            document.addEventListener('click', this.closeDropdownOnOutsideClick);
1231        } else {
1232            document.removeEventListener('click', this.closeDropdownOnOutsideClick);
1233        }
1234    },
1235    
1236    // 点击页面其他区域关闭下拉菜单
1237    closeDropdownOnOutsideClick: function(event) {
1238        const dropdownMenu = document.getElementById('m-language-menu');
1239        if (!dropdownMenu) return;
1240        
1241        let targetElement = event.target;
1242        let isDropdownClick = false;
1243        
1244        while (targetElement != null) {
1245            if (targetElement.classList && targetElement.classList.contains('language-dropdown')) {
1246                isDropdownClick = true;
1247                break;
1248            }
1249            targetElement = targetElement.parentElement;
1250        }
1251        
1252        if (!isDropdownClick) {
1253            dropdownMenu.classList.remove('show');
1254            document.removeEventListener('click', mobileLangSwitchUtils.closeDropdownOnOutsideClick);
1255        }
1256    }
1257};
1258
1259function initMobileMenu() {
1260    // 汉堡菜单点击事件
1261    $('.menu-trigger').on('click', function(e) {
1262        e.stopPropagation();
1263        $('body').toggleClass('menu-active');
1264    });
1265
1266    // 一级菜单点击事件
1267    $('.nav-link').on('click', function(e) {
1268        if ($(this).siblings('.submenu').length) {
1269            e.preventDefault();
1270            const $parent = $(this).parent();
1271            
1272            if ($parent.hasClass('active')) {
1273                $parent.removeClass('active');
1274                $parent.find('.submenu-item.active').removeClass('active');
1275            } else {
1276                $('.nav-item.active').removeClass('active');
1277                $parent.addClass('active');
1278            }
1279        }
1280    });
1281
1282    // 二级菜单点击事件
1283    $('.submenu-title').on('click', function(e) {
1284        if ($(this).siblings('.third-menu').length) {
1285            e.preventDefault();
1286            const $parent = $(this).parent();
1287            
1288            if ($parent.hasClass('active')) {
1289                $parent.removeClass('active');
1290            } else {
1291                $(this).closest('.submenu').find('.submenu-item.active').removeClass('active');
1292                $parent.addClass('active');
1293            }
1294        }
1295    });
1296
1297    // 点击空白处关闭菜单,但不关闭语言切换菜单
1298    $(document).on('click', function(e) {
1299        // 检查点击的元素是否在语言切换区域内
1300        if (!$(e.target).closest('.mobile-language-switch, .language-dropdown, .menu-trigger').length) {
1301            // 不是在语言切换区域内的点击,关闭主菜单
1302            $('body').removeClass('menu-active');
1303        }
1304    });
1305
1306    // 阻止菜单内部点击事件冒泡
1307    $('.nav-wrapper').on('click', function(e) {
1308        e.stopPropagation();
1309    });
1310}
1311
1312function initScrollHeader() {
1313    const $header = $('.mobile-header');
1314    const headerHeight = $header.outerHeight();
1315    let lastScroll = 0;
1316    const scrollThreshold = 300; // 滚动多少像素后固定头部
1317    
1318    // 创建一个占位元素,防止内容跳动
1319    const $placeholder = $('<div>').css({
1320        height: headerHeight,
1321        display: 'none'
1322    }).insertAfter($header);
1323    
1324    $(window).on('scroll', function() {
1325        const currentScroll = $(this).scrollTop();
1326        
1327        // 向下滚动超过阈值时固定头部
1328        if (currentScroll > scrollThreshold) {
1329            if (!$header.hasClass('fixed')) {
1330                $header.addClass('fixed');
1331                $placeholder.show();
1332            }
1333        } else {
1334            // 回到顶部附近时恢复原始位置
1335            $header.removeClass('fixed');
1336            $placeholder.hide();
1337        }
1338        
1339        lastScroll = currentScroll;
1340    });
1341}
1342</script>
1342
1343<!-- 添加必要的JS库 -->
1344<script src="/static/js/layer.min.js"></script>
vendor: 1 bytes, line 1344
1344
1345<script src="/static/js/qrcode.min.js"></script>
1345
1346<section class="page-title zh-w-100 pc-show">
1347        <img src="/resource/image/inner_img.jpg" alt="">
1348    </section>
1349<section class="page-title zh-w-100 mobile-show">
1350        <img src="/resource/image/inner_img.jpg" alt="">
1351    </section>
1352<!-- img_template1 -->
1353<div class="sidebar-page-container">
1354    <div class="auto-container">
1355        <div class="row clearfix flex-row-reverse">
1356            <!--Content Side-->
1357            <div class="content-side col-lg-9 col-md-12 col-xs-12">
1358                <div class="services-single">
1359                    <div class="inner-box">
1360                        <h2>社区圈子</h2>
1361                        <div class="issue_time">
1362                                                        <span>分类:</span>四项能力                                                        <span class="mar-l20">发布人:</span>admin                                                        <span class="mar-l20">阅读:</span>36350                                                    </div>
1363                        <div class="text w-e-text-container">
1364                                                    </div>
1365
1366                        <!-- 转载说明和社交分享区域 -->
1367                        
1368                        <!-- 点赞和分享区域 -->
1369                        
1370                        <!-- 附件列表 -->
1371                        
1372                    </div>
1373                </div>
1374                <div class="bottom-page clearfix">
1375                    <div class="left-column">
1376                        <div class="inner-column">
1377                                                    </div>
1378                    </div>
1379                    <div class="right-column">
1380                        <div class="inner-column">
1381                                                        <a href="/article/756.html">
1382                                <div>
1383                                    <div class="post"><span>下一篇:</span>分享助力</div>
1384                                </div>
1385                            </a>
1386                                                    </div>
1387                    </div>
1388                </div>
1389            </div>
1390
1391            <div class="sidebar-side col-lg-3 col-md-12 col-xs-12">
1392                <div class="left-sidebar">
1393
1394                    <!-- 热门推荐 -->
1395                    <div class="sidebar-widget categories-widget">
1396                        <div class="sidebar-title">
1397                            <h2>热门推荐</h2>
1398                        </div>
1399                        <div class="widget-content">
1400                            <ul class="blog-cat">
1401                                                                <li><a href="/article/757.html">社区圈子</a></li>
1402                                                                <li><a href="/article/756.html">分享助力</a></li>
1403                                                                <li><a href="/article/755.html">社群营销</a></li>
1404                                                                <li><a href="/article/754.html">社区圈子</a></li>
1405                                                            </ul>
1406                        </div>
1407                    </div>
1408
1409
1410                    <!-- 联系 -->
1411                    <div class="sidebar-widget quote-widget">
1412                        <div class="sidebar-title">
1413                            <h2>联系我们</h2>
1414                        </div>
1415                        <div class="iconfont icon-dianhua2 theme-color text-center pad-b20 bor-b-1"><p class="theme-color mar-t20 f-siz26"></p></div>
1416                        <div class="lower-box pad-20">
1417                            <p>诚盟软件行业解决方案</p>
1418                            <p>手机:18523692368</p>
1419                                                        <p>邮箱:[email protected]</p>
1420                                                        <p>地址:云南省丽江市古城区西安街道寨鑫路博士后写字楼6层</p>
1421                        </div>
1422                    </div>
1423
1424                </div>
1425            </div>
1426        </div>
1427    </div>
1428</div>
1429
1430<style type="text/css">
1431/* 附件列表样式 */
1432.attachment-section {
1433    margin-top: 30px;
1434    padding: 20px;
1435    background: #f8f9fa;
1436    border-radius: 4px;
1437}
1438
1439.attachment-title {
1440    font-size: 18px;
1441    color: #333;
1442    margin-bottom: 15px;
1443    padding-bottom: 10px;
1444    border-bottom: 1px solid #eee;
1445}
1446
1447.attachment-list {
1448    display: flex;
1449    flex-direction: column;
1450    gap: 15px;
1451}
1452
1453.attachment-item {
1454    display: flex;
1455    justify-content: space-between;
1456    align-items: center;
1457    padding: 15px;
1458    background: #fff;
1459    border-radius: 4px;
1460    box-shadow: 0 2px 4px rgba(0,0,0,0.05);
1461    transition: all 0.3s ease;
1462}
1463
1464.attachment-item:hover {
1465    box-shadow: 0 4px 8px rgba(0,0,0,0.1);
1466}
1467
1468.attachment-info {
1469    flex: 1;
1470    margin-right: 15px;
1471}
1472
1473.attachment-name {
1474    font-size: 16px;
1475    color: #333;
1476    margin-left: 8px;
1477}
1478
1479.attachment-desc {
1480    margin-top: 5px;
1481    font-size: 14px;
1482    color: #666;
1483    padding-left: 24px;
1484}
1485
1486.attachment-download,
1487.attachment-link {
1488    display: inline-flex;
1489    align-items: center;
1490    padding: 8px 15px;
1491    background: #409EFF;
1492    color: #fff;
1493    border-radius: 4px;
1494    text-decoration: none;
1495    transition: all 0.3s ease;
1496}
1497
1498.attachment-download:hover,
1499.attachment-link:hover {
1500    background: #66b1ff;
1501}
1502
1503.attachment-pwd {
1504    margin-left: 10px;
1505    padding: 2px 8px;
1506    background: #f4f4f5;
1507    color: #909399;
1508    border-radius: 2px;
1509    font-size: 12px;
1510}
1511
1512.iconfont {
1513    font-size: 18px;
1514}
1515
1516.icon-attachment,
1517.icon-download,
1518.icon-link {
1519    margin-right: 5px;
1520}
1521
1522/* 转载说明样式 */
1523.article-copyright {
1524    margin: 30px 0;
1525    padding: 15px 20px;
1526    background: #f8f9fa;
1527    border-left: 4px solid #409EFF;
1528    border-radius: 4px;
1529}
1530
1531.copyright-info {
1532    display: flex;
1533    align-items: center;
1534    color: #666;
1535    font-size: 14px;
1536}
1537
1538.copyright-info i {
1539    margin-right: 8px;
1540}
1541
1542.copyright-info a {
1543    color: #409EFF;
1544    text-decoration: none;
1545    margin-left: 5px;
1546}
1547
1548/* 社交操作区域样式 */
1549.social-actions {
1550    margin: 30px 0;
1551    padding: 20px;
1552    border-top: 1px solid #eee;
1553    border-bottom: 1px solid #eee;
1554    display: flex;
1555    align-items: center;
1556    justify-content: center;
1557    gap: 30px;
1558}
1559
1560/* 点赞按钮样式 */
1561.like-btn {
1562    display: flex;
1563    align-items: center;
1564    padding: 8px 20px;
1565    border-radius: 20px;
1566    background: #f8f9fa;
1567    cursor: pointer;
1568    transition: all 0.3s ease;
1569}
1570
1571.like-btn:hover {
1572    background: #e8f4ff;
1573}
1574
1575.like-btn i {
1576    margin-right: 5px;
1577}
1578
1579.like-count {
1580    color: #666;
1581}
1582
1583/* 赞赏按钮样式 */
1584.reward-btn {
1585    position: relative;
1586    display: flex;
1587    align-items: center;
1588    padding: 8px 20px;
1589    border-radius: 20px;
1590    background: #f8f9fa;
1591    cursor: pointer;
1592    transition: all 0.3s ease;
1593}
1594
1595.reward-btn:hover {
1596    background: #e8f4ff;
1597}
1598
1599.reward-btn i {
1600    margin-right: 5px;
1601}
1602
1603/* 分享按钮组样式 */
1604.share-btns {
1605    display: flex;
1606    align-items: center;
1607    gap: 10px;
1608}
1609
1610.share-title {
1611    color: #666;
1612    font-size: 14px;
1613}
1614
1615.share-item {
1616    width: 36px;
1617    height: 36px;
1618    border-radius: 50%;
1619    background: #f8f9fa;
1620    display: flex;
1621    align-items: center;
1622    justify-content: center;
1623    text-decoration: none;
1624    transition: all 0.3s ease;
1625    position: relative;
1626}
1627
1628.share-item:hover {
1629    background: #e8f4ff;
1630}
1631
1632.share-item i {
1633    font-size: 20px;
1634}
1635
1636.share-item i.icon-weibo-sina {
1637    color: #e6162d;
1638}
1639
1640.share-item i.icon-tubiao215 {
1641    color: #12b7f5;
1642}
1643
1644.share-item i.icon-xiaoxi-comment {
1645    color: #07c160;
1646}
1647
1648/* 二维码弹窗样式 */
1649.qrcode-popup {
1650    position: absolute;
1651    bottom: 100%;
1652    left: 50%;
1653    transform: translateX(-50%);
1654    background: white;
1655    padding: 10px;
1656    border-radius: 4px;
1657    box-shadow: 0 2px 12px rgba(0,0,0,0.1);
1658    display: none;
1659    z-index: 100;
1660    width: 150px;
1661    text-align: center;
1662}
1663
1664.reward-btn:hover .qrcode-popup,
1665.share-item:hover .qrcode-popup {
1666    display: block;
1667}
1668
1669.qrcode-popup img {
1670    width: 100%;
1671    height: auto;
1672}
1673
1674.qrcode-popup p {
1675    margin: 5px 0 0;
1676    font-size: 12px;
1677    color: #666;
1678}
1679
1680/* 字体大小控制样式 */
1681.font-size-control {
1682    display: inline-flex;
1683    align-items: center;
1684    vertical-align: middle;
1685}
1686
1687.font-size-control span {
1688    color: #666;
1689    margin-right: 5px;
1690    font-size: 14px;
1691}
1692
1693.size-btns {
1694    display: inline-flex;
1695    gap: 5px;
1696}
1697
1698.size-btn {
1699    padding: 0 5px;
1700    cursor: pointer;
1701    color: #666;
1702    text-align: center;
1703}
1704
1705.size-btn.active {
1706    color: #409EFF;
1707}
1708
1709/* 文章内容样式 - 使用WangEditor样式,不覆盖编辑器内容 */
1710.text {
1711    transition: all 0.3s ease;
1712}
1713
1714/* 确保编辑器内容样式不被覆盖 */
1715.text.w-e-text-container {
1716    /* 移除可能覆盖编辑器样式的属性,让编辑器样式完全生效 */
1717    font-size: inherit;
1718    line-height: inherit;
1719}
1720
1721/* 字体大小控制时,只影响基础字体大小,不影响编辑器内部元素的样式 */
1722.text.w-e-text-container[style*="font-size"] * {
1723    /* 字体大小控制只影响容器,内部元素保持编辑器样式 */
1724    font-size: inherit;
1725}
1726</style>
1727<script type="text/javascript">
1728    // 点赞功能
1729    function handleLike(articleId) {
1730        fetch('/index/article/like', {
1731            method: 'POST',
1732            headers: {
1733                'Content-Type': 'application/json',
1734            },
1735            body: JSON.stringify({ id: articleId })
1736        })
1737            .then(response => response.json())
1738            .then(data => {
1739                if (data.code === 200) {
1740                    let likeCount = document.querySelector('.like-count');
1741                    likeCount.textContent = parseInt(likeCount.textContent) + 1;
1742                    layer.msg('点赞成功');
1743                } else {
1744                    layer.msg(data.message || '操作失败');
1745                }
1746            })
1747            .catch(error => {
1748                console.error('点赞失败:', error);
1749                layer.msg('操作失败');
1750            });
1751    }
1752
1753    // 分享到微博
1754    function shareToWeibo() {
1755        const url = encodeURIComponent(window.location.href);
1756        const title = encodeURIComponent(document.title);
1757        window.open('https://service.weibo.com/share/share.php?url=' + url + '&title=' + title, '_blank', 'width=700,height=500');
1758    }
1759
1760    // 分享到QQ
1761    function shareToQQ() {
1762        const url = encodeURIComponent(window.location.href);
1763        const title = encodeURIComponent(document.title);
1764        const desc = encodeURIComponent(document.querySelector('meta[name="description"]')?.content || '');
1765        window.open('https://connect.qq.com/widget/shareqq/index.html?url=' + url + '&title=' + title + '&desc=' + desc, '_blank', 'width=700,height=500');
1766    }
1767
1768    // 分享到微信
1769    function shareToWechat() {
1770        const qrcodeElement = document.getElementById('wechatQrcode');
1771        if (!qrcodeElement.hasChildNodes()) {
1772            new QRCode(qrcodeElement, {
1773                text: window.location.href,
1774                width: 128,
1775                height: 128,
1776                colorDark: "#000000",
1777                colorLight: "#ffffff",
1778                correctLevel: QRCode.CorrectLevel.H
1779            });
1780        }
1781    }
1782
1783    // 页面加载完成后执行
1784    window.onload = function () {
1785        // 初始化微信二维码
1786        const qrcodeElement = document.getElementById('wechatQrcode');
1787        if (qrcodeElement && !qrcodeElement.hasChildNodes()) {
1788            new QRCode(qrcodeElement, {
1789                text: window.location.href,
1790                width: 128,
1791                height: 128,
1792                colorDark: "#000000",
1793                colorLight: "#ffffff",
1794                correctLevel: QRCode.CorrectLevel.H
1795            });
1796        }
1797
1798        // 初始化字体大小
1799        initFontSizeControl();
1800    };
1801
1802    // 字体大小控制功能
1803    function initFontSizeControl() {
1804        // 获取文章内容元素
1805        const contentElement = document.querySelector('.text');
1806        const sizeButtons = document.querySelectorAll('.size-btn');
1807
1808        if (!contentElement || sizeButtons.length === 0) {
1809            console.error('找不到文章内容元素或字体大小按钮');
1810            return;
1811        }
1812
1813        // 字体大小比例映射 - 使用后台配置的值
1814        const fontSizeRatios = {
1815            'small': parseFloat("0.875"),  // 默认0.875
1816            'medium': 1,     // 原始大小100%
1817            'large': parseFloat("1.125")   // 默认1.125
1818        };
1819
1820        // 从本地存储中获取用户之前的字体大小设置
1821        const savedSize = localStorage.getItem('articleFontSize') || 'medium';
1822
1823        // 立即应用保存的字体大小
1824        setTimeout(() => {
1825            applyFontSize(contentElement, fontSizeRatios[savedSize]);
1826
1827            // 设置对应按钮为激活状态
1828            updateActiveButton(sizeButtons, savedSize);
1829
1830            console.log('初始化字体大小:', savedSize);
1831        }, 100);
1832
1833        // 为按钮添加点击事件
1834        sizeButtons.forEach(button => {
1835            button.addEventListener('click', function(event) {
1836                event.preventDefault(); // 阻止默认行为
1837                // 获取选中的字体大小
1838                const selectedSize = this.getAttribute('data-size');
1839
1840                // 设置字体大小
1841                applyFontSize(contentElement, fontSizeRatios[selectedSize]);
1842
1843                // 更新按钮状态
1844                updateActiveButton(sizeButtons, selectedSize);
1845
1846                // 保存到本地存储
1847                localStorage.setItem('articleFontSize', selectedSize);
1848
1849                console.log('字体大小已更改为:', selectedSize);
1850            });
1851        });
1852    }
1853
1854    // 应用字体大小 - 修改后的方法使用document.body.style来设置全局字体大小
1855    function applyFontSize(element, scale) {
1856        try {
1857            // 设置直接样式
1858            element.style.fontSize = scale + 'em';
1859
1860            // 直接修改元素内部所有文本节点的大小
1861            const allElements = element.getElementsByTagName('*');
1862            for (let i = 0; i < allElements.length; i++) {
1863                if (allElements[i].style) {
1864                    // 注意:这里不使用em而是使用相对比例
1865                    allElements[i].style.fontSize = scale * 100 + '%';
1866                }
1867            }
1868        } catch (error) {
1869            console.error('设置字体大小时出错:', error);
1870        }
1871    }
1872
1873    // 更新激活按钮
1874    function updateActiveButton(buttons, activeSize) {
1875        buttons.forEach(btn => {
1876            if (btn.getAttribute('data-size') === activeSize) {
1877                btn.classList.add('active');
1878            } else {
1879                btn.classList.remove('active');
1880            }
1881        });
1882    }
1883</script>
1883
1884    <style>
1885    .suspension{position:fixed;z-index:1000;right: 20px; top: 50%;width:70px;height:240px;transform: translateY(-50%);}
1886    .suspension-box{position:relative;float:right;}
1887    .suspension .a{display:block;width:44px;height:44px;margin-bottom:4px;cursor:pointer;outline:none;line-height: 44px;text-align: center;background-color: #ffffff ;}
1888    .suspension .a.active,
1889    .suspension .a:hover{color:#fff;background:#888;}
1890    .suspension .a, .suspension .a i{font-size: 24px;color: #fff;}
1891    .suspension .a-qrcode .i{background-position:-44px 0;}
1892    .suspension .a-cart .i{background-position:-88px 0;}
1893    .suspension .a-top .i{background-position:-132px 0;}
1894    .suspension .a-top{background:#D2D3D6;display:none;}
1895    .suspension .a-top:hover{background:#c0c1c3;}
1896    .suspension .d{display:none;width:223px;background:#fff;position:absolute;right:67px;min-height:90px;border:1px solid #E0E1E5;border-radius:3px;box-shadow:0px 2px 5px 0px rgba(161, 163, 175, 0.11);}
1897    .suspension .d .arrow-left{position:absolute;width:8px;height:12px;background:url(/resource/image/side_bg_arrow.png) no-repeat;right:-8px;top:31px;}
1898    .suspension .d-service{top:0;}
1899    .suspension .d-service-phone{top:34px;}
1900    .suspension .d-qrcode{top:78px;}
1901    .suspension .d .inner-box{padding:8px 22px 12px;}
1902    .suspension .d-service-item{padding:14px 0;}
1903    .suspension .d-service .d-service-item{border-bottom:none;}
1904    .suspension .d-service-item .circle{width:44px;height:44px;border-radius:50%;overflow:hidden;background:#F1F1F3;display:block;float:left;}
1905    .suspension .d-service-item .i-qq{width:44px;height:44px;background:url(/resource/image/side_con_icon03.png) no-repeat center 15px;display:block;transition:all .2s;border-radius:50%;overflow:hidden;}
1906    .suspension .d-service-item:hover .i-qq{background-position:center 3px;}
1907    .suspension .d-service-item .i-tel{width:44px;height:44px;background:url(/resource/image/side_con_icon02.png) no-repeat center center;display:block;}
1908    .suspension .d-service-item h3{float:left;width:112px;line-height:44px;font-size:15px;margin-left:12px;}
1909    .suspension .d-service-item .text{float:left;width:112px;line-height:22px;font-size:15px;margin-left:12px;}
1910    .suspension .d-service-item .text .number{font-family:Arial,"Microsoft Yahei","HanHei SC",PingHei,"PingFang SC","Helvetica Neue",Helvetica,Arial,"Hiragino Sans GB","Heiti SC","WenQuanYi Micro Hei",sans-serif;}
1911    .suspension .d-service-intro{padding-top:10px;font-size: 14px;}
1912    .suspension .d-service-intro p{float:left;line-height:27px;font-size:12px;width:50%;white-space:nowrap;color:#888;}
1913    .suspension .d-qrcode{text-align:center;}
1914    .suspension .d-qrcode .inner-box, .suspension .d-ewmcode .inner-box{padding:20px;}
1915    .suspension .d-qrcode p{font-size:14px;color:#93959c;line-height:30px;margin: 0;}
1916    .suspension p{margin: 0;}
1917    .scroll-top{display: none;}
1918    .suspension .d-qrcode img, .suspension .d-ewmcode img{display: inline-block;}
1919    .suspension .d-ewmcode{top: 130px;}
1920    .scroll-to-top{display: none!important;}
1921    .suspension .a{background-color: ;}
1922	.suspension .a.active, .suspension .a:hover{background: ;}
1923</style>
1924<!-- service1 -->
1925<div class="suspension pc_show">
1926    <div class="suspension-box">
1927                <a href="javascript:;" class="a a-service tran3s"><i class="iconfont icon-tubiao215"></i></a>
1928                <a href="javascript:;" class="a a-service-phone tran3s"><i class="iconfont icon-dianhua1"></i></a>
1929        <a href="javascript:;" class="a a-qrcode tran3s"><i class="iconfont icon-kefu"></i></a>
1930        <a href="javascript:;" class="a a-ewmcode a-cart"><i class="iconfont icon-weixin"></i></a>
1931        <a href="javascript:;" class="a a-top tran3s"><i class="iconfont icon-huidingbu1"></i></a>
1932                <div class="d d-service" style="display: none;">
1933            <i class="arrow-left"></i>
1934            <div class="inner-box">
1935                <div class="d-service-item clearfix">
1936                    <a href="http://wpa.qq.com/msgrd?v=3&amp;uin=877998773&amp;site=qq&amp;menu=yes" target="_blank"
1937                       class="clearfix"><span class="circle"><i class="i-qq"></i></span>
1938                        <h3>咨询在线客服</h3>
1939                    </a>
1940                </div>
1941            </div>
1942        </div>
1943                <div class="d d-service-phone" style="display: none;">
1944            <i class="arrow-left"></i>
1945            <div class="inner-box">
1946                <div class="d-service-item clearfix">
1947                    <span class="circle"><i class="i-tel"></i></span>
1948                    <div class="text">
1949                        <p>服务热线</p>
1950                        <p class="red number"><a href="tel:18523692368">18523692368</a></p>
1951                    </div>
1952                </div>
1953            </div>
1954        </div>
1955                <div class="d d-qrcode" style="display: none;">
1956            <i class="arrow-left"></i>
1957            <div class="inner-box">
1958                <div class="qrcode-img"><img src="https://zj.chengmenghudong.com.cn/storage/2/20251101/1762761177945.jpg" width="150" height="150" alt=""></div>
1959                <p>在线客服</p>
1960            </div>
1961        </div>
1962                <div class="d d-ewmcode text-center" style="display: none;">
1963            <i class="arrow-left"></i>
1964            <div class="inner-box">
1965                <div class="qrcode-img"><img src="https://zj.chengmenghudong.com.cn/storage/2/20251101/1762761177945.jpg " width="150" height="150" alt=""></div>
1966                <p>微信公众号</p>
1967            </div>
1968        </div>
1969            </div>
1970</div>
1971<script type="text/javascript">
1972    $(document).ready(function () {
1973                /* ----- 侧边悬浮 ---- */
1974        $(document).on("mouseenter", ".suspension .a", function () {
1975            var _this = $(this);
1976            var s = $(".suspension");
1977            var isService = _this.hasClass("a-service");
1978            var isServicePhone = _this.hasClass("a-service-phone");
1979            var isQrcode = _this.hasClass("a-qrcode");
1980            var isEwmcode = _this.hasClass("a-ewmcode");
1981            if (isService) { s.find(".d-service").show().siblings(".d").hide(); }
1982            if (isServicePhone) { s.find(".d-service-phone").show().siblings(".d").hide(); }
1983            if (isQrcode) { s.find(".d-qrcode").show().siblings(".d").hide(); }
1984            if (isEwmcode) { s.find(".d-ewmcode").show().siblings(".d").hide(); }
1985        });
1986        $(document).on("mouseleave", ".suspension, .suspension .a-top", function () {
1987            $(".suspension").find(".d").hide();
1988        });
1989        $(document).on("mouseenter", ".suspension .a-top", function () {
1990            $(".suspension").find(".d").hide();
1991        });
1992        $(document).on("click", ".suspension .a-top", function () {
1993            $("html,body").animate({ scrollTop: 0 });
1994        });
1995        $(window).scroll(function () {
1996            var st = $(document).scrollTop();
1997            var $top = $(".suspension .a-top");
1998            if (st > 400) {
1999                $top.css({ display: 'block' });
2000            } else {
2001                if ($top.is(":visible")) {
2002                    $top.hide();
2003                }
2004            }
2005        });
2006            });
2007</script>
2007
2008<style>
2009    .main-footer{background:#2d3047;}
2010    .footer-bottom .copyright span.follow{background: url(/resource/picture/beian.png) no-repeat left top;}
2011    .bottom-img{ background:url("") no-repeat center/cover;}
2012    .bottom-img::before{background:;}
2013    .main-footer .footer-bottom .footer-color, .main-footer .footer-bottom .copyright a, .main-footer .footer-bottom .copyright span{color:#ccc;}
2014    .footer-bottom .copyright span.follow::before, .footer-bottom .copyright .more_link::before {background-color: #ccc;}
2015</style>
2016<!-- footer1 -->
2017<footer class="main-footer">
2018    <div class="bottom-img"></div>
2019    <div class="auto-container">
2020        <!-- 版权信息 -->
2021        <div class="footer-bottom">
2022            <div class="clearfix">
2023                <div class="">
2024                    <div class="copyright footer-color">云南诚盟互动科技有限责任公司</div>
2025                    <div class="copyright">
2026                        <a href="https://beian.miit.gov.cn" target="_blank">备案号:滇ICP备2021000460号-6</a>
2027                                                <span class="follow footer-color"><a href="http://www.beian.gov.cn/portal/registerSystemInfo?recordcode=53070202001314" target="_blank">公安机关备案号:滇公安备53070202001314</a></span>
2028                                            </div>
2029                    <div class="copyright footer-color">云南省丽江市古城区西安街道寨鑫路博士后写字楼6层</div> 
2030                </div>
2031            </div>
2032        </div>
2033    </div>
2034</footer>
2035</div>
2036<script src="https://res.wx.qq.com/open/js/jweixin-1.6.0.js"></script>
vendor: 1 bytes, line 2036
2036
2037<script type="text/javascript">
2038(function() {
2039    // 检查是否在微信浏览器中
2040    var ua = navigator.userAgent.toLowerCase();
2041    var isWechat = ua.indexOf('micromessenger') !== -1
2042        || ua.indexOf('windowswechat') !== -1
2043        || ua.indexOf('macwechat') !== -1
2044        || ua.indexOf('wxwork') !== -1;
2045
2046    if (!isWechat) {
2047        return; // 非微信浏览器,不初始化微信分享
2048    }
2049
2050    // 获取当前页面URL(去除hash和参数中的code、state等)
2051    var currentUrl = window.location.href.split('#')[0];
2052    // 移除微信授权相关参数
2053    var urlObj = new URL(currentUrl);
2054    urlObj.searchParams.delete('code');
2055    urlObj.searchParams.delete('state');
2056    urlObj.searchParams.delete('trigger_auth');
2057    urlObj.searchParams.delete('refresh_userinfo');
2058    currentUrl = urlObj.toString();
2059
2060    // 获取配置ID(从config表)
2061    var configId = "";
2062    var userId = "2";
2063    var shareTitle = "诚盟软件行业解决方案";
2064    var shareDesc = "诚盟软件行业解决方案
2065
2066";
2067    var shareImgUrl = "https://zj.chengmenghudong.com.cn/storage/2/20221212/4b267f86d702fff8956b9774e853ae06.png";
2068
2069    // 如果没有配置ID,尝试通过user_id获取
2070    if (!configId && userId) {
2071        // 通过AJAX获取config的id
2072        fetch('/index/api/getConfigId?user_id=' + userId)
2073            .then(function(response) { return response.json(); })
2074            .then(function(data) {
2075                if (data.code === 200 && data.data && data.data.config_id) {
2076                    configId = data.data.config_id;
2077                    initWechatShare();
2078                }
2079            })
2080            .catch(function(err) {
2081                console.error('获取配置ID失败:', err);
2082            });
2083    } else if (configId) {
2084        initWechatShare();
2085    }
2086
2087    function initWechatShare() {
2088        if (!configId) {
2089            return;
2090        }
2091
2092        // 获取微信JS-SDK配置
2093        fetch('/index/api/getJssdk?uid=' + configId + '&url=' + encodeURIComponent(currentUrl))
2094            .then(function(response) { return response.json(); })
2095            .then(function(data) {
2096                if (data.code !== 200 || !data.data || !data.data.appId) {
2097                    console.log('微信JS-SDK配置获取失败或未配置微信参数');
2098                    return;
2099                }
2100
2101                var wxConfig = data.data;
2102
2103                // 配置微信JS-SDK
2104                wx.config({
2105                    debug: false,
2106                    appId: wxConfig.appId,
2107                    timestamp: wxConfig.timestamp,
2108                    nonceStr: wxConfig.nonceStr,
2109                    signature: wxConfig.signature,
2110                    jsApiList: ['onMenuShareAppMessage', 'onMenuShareTimeline']
2111                });
2112
2113                wx.ready(function () {
2114                    // 优先使用后台配置的分享信息
2115                    // 处理空字符串的情况:如果值为空字符串,也视为未设置
2116                    var apiTitle = (wxConfig.share_title && wxConfig.share_title.trim()) ? wxConfig.share_title.trim() : '';
2117                    var apiDesc = (wxConfig.share_desc && wxConfig.share_desc.trim()) ? wxConfig.share_desc.trim() : '';
2118                    var apiImg = (wxConfig.share_img && wxConfig.share_img.trim()) ? wxConfig.share_img.trim() : '';
2119
2120                    var pageTitle = (shareTitle && shareTitle.trim()) ? shareTitle.trim() : '';
2121                    var pageDesc = (shareDesc && shareDesc.trim()) ? shareDesc.trim() : '';
2122                    var pageImg = (shareImgUrl && shareImgUrl.trim()) ? shareImgUrl.trim() : '';
2123
2124                    // 确定最终使用的分享信息:优先API返回的,其次页面配置的
2125                    // 标题:必须使用后台配置,如果都为空则使用站点名称(从document.title提取)
2126                    var finalTitle = apiTitle || pageTitle;
2127                    if (!finalTitle) {
2128                        // 如果都没有,尝试从页面标题中提取(去除"- 装修"等后缀)
2129                        var docTitle = document.title || '';
2130                        finalTitle = docTitle.replace(/\s*[-|]\s*.*$/, '').trim();
2131                    }
2132
2133                    var finalDesc = apiDesc || pageDesc || '';
2134                    var finalImgUrl = apiImg || pageImg || '';
2135
2136                    // 确保图片URL是完整路径
2137                    if (finalImgUrl && finalImgUrl.indexOf('http') !== 0) {
2138                        finalImgUrl = window.location.protocol + '//' + window.location.host + finalImgUrl;
2139                    }
2140
2141                    // 分享给微信好友
2142                    wx.onMenuShareAppMessage({
2143                        title: finalTitle,
2144                        desc: finalDesc,
2145                        link: currentUrl,
2146                        imgUrl: finalImgUrl,
2147                        success: function () {
2148                            console.log('分享给微信好友成功');
2149                        },
2150                        cancel: function () {
2151                            console.log('取消分享给微信好友');
2152                        }
2153                    });
2154
2155                    // 分享到朋友圈(朋友圈只显示标题,不显示描述)
2156                    wx.onMenuShareTimeline({
2157                        title: finalTitle,
2158                        link: currentUrl,
2159                        imgUrl: finalImgUrl,
2160                        success: function () {
2161                            console.log('分享到朋友圈成功');
2162                        },
2163                        cancel: function () {
2164                            console.log('取消分享到朋友圈');
2165                        }
2166                    });
2167                });
2168
2169                wx.error(function(res) {
2170                    console.error('微信JS-SDK配置失败:', res);
2171                });
2172            })
2173            .catch(function(err) {
2174                console.error('获取微信JS-SDK配置失败:', err);
2175            });
2176    }
2177})();
2178</script>
vendor: 1 bytes, line 2178
2178
2179<script src="/resource/js/popper.min.js"></script>
vendor: 1 bytes, line 2179
2179
2180<script src="/resource/js/jquery-ui.js"></script>
vendor: 1 bytes, line 2180
2180
2181<script src="/resource/js/jquery.fancybox.js"></script>
vendor: 1 bytes, line 2181
2181
2182<script src="/resource/js/owl.js"></script>
vendor: 1 bytes, line 2182
2182
2183<script src="/resource/js/validate.js"></script>
vendor: 1 bytes, line 2183
2183
2184<script src="/resource/js/wow.js"></script>
vendor: 1 bytes, line 2184
2184
2185<script src="/resource/js/mixitup.js"></script>
vendor: 1 bytes, line 2185
2185
2186<script src="/resource/js/appear.js"></script>
vendor: 1 bytes, line 2186
2186
2187<script src="/resource/js/script.js"></script>
vendor: 1 bytes, line 2187
2187
2188<script src="/resource/js/jquery.cycle2.js"></script>
vendor: 1 bytes, line 2188
2188
2189<script src="/resource/js/slides.jquery.js"></script>
vendor: 1 bytes, line 2189
2189
2190<script src="/resource/js/main.js"></script>
2190
2191</body>
2192<script src="/resource/js/translate.js"></script>
vendor: 1 bytes, line 2192
2192
2193<script>
2194    $(function () {
2195        // 初始化翻译功能
2196        initTranslate();
2197    });
2198
2199    function translateSelectLanguageFunction(value){
2200        translate.changeLanguage(value);
2201    }
2202
2203    function changeStationTranslationF(obj){
2204        var value = $(obj).val();
2205        translate.changeLanguage(value);
2206    }
2207
2208    // 定义changeLanguage函数用于前台切换语言
2209    function changeLanguage(languageCode) {
2210        // 保存语言偏好到本地存储
2211        try {
2212            localStorage.setItem('preferred_language', languageCode);
2213        } catch (e) {
2214            console.error('保存语言偏好失败:', e);
2215        }
2216
2217        // 调用translate的语言切换函数
2218        translate.changeLanguage(languageCode);
2219
2220        // 更新语言显示
2221        updateLanguageDisplay(languageCode);
2222
2223        // 关闭下拉菜单
2224        var dropdowns = document.getElementsByClassName('dropdown-menu');
2225        Array.from(dropdowns).forEach(function(dropdown) {
2226            dropdown.classList.remove('show');
2227        });
2228    }
2229
2230    // 更新语言显示
2231    function updateLanguageDisplay(languageCode) {
2232        // 获取当前语言对应的名称
2233        fetch('/index/translate/getLanguages')
2234            .then(response => response.json())
2235            .then(data => {
2236                if (data.code === 200 && data.data && data.data.languages) {
2237                    const languages = data.data.languages;
2238                    const language = languages.find(lang => lang.code === languageCode);
2239
2240                    if (language) {
2241                        // 更新当前显示的语言名称
2242                        const currentLanguageElement = document.getElementById('current-language');
2243                        if (currentLanguageElement) {
2244                            currentLanguageElement.textContent = language.name;
2245                        }
2246
2247                        // 更新下拉菜单中的选中状态
2248                        const languageMenu = document.getElementById('language-menu');
2249                        if (languageMenu) {
2250                            // 移除所有项的选中状态
2251                            const items = languageMenu.querySelectorAll('.dropdown-item');
2252                            items.forEach(item => {
2253                                item.classList.remove('active');
2254                            });
2255
2256                            // 为当前选中的语言添加选中状态
2257                            const selectedItem = Array.from(items).find(item => {
2258                                return item.getAttribute('data-lang-code') === languageCode;
2259                            });
2260
2261                            if (selectedItem) {
2262                                selectedItem.classList.add('active');
2263                            }
2264                        }
2265                    }
2266                }
2267            })
2268            .catch(error => {
2269                console.error('获取语言名称失败:', error);
2270            });
2271    }
2272
2273    // 确保nodeuuid对象可用
2274    if (typeof nodeuuid === 'undefined') {
2275        nodeuuid = {
2276            uuid: function(node) {
2277                return node ? (Math.random().toString(36).substring(2, 15)) : '';
2278            }
2279        };
2280    }
2281
2282    // 禁用初始化请求,避免错误
2283    if (translate.init) {
2284        translate.init_execute = '已进行';
2285    }
2286
2287    // 设置请求超时,避免请求挂起
2288    if (translate.request) {
2289        translate.request.timeout = 3000;
2290    }
2291
2292    // 初始化翻译功能
2293    function initTranslate() {
2294        translate.setUseVersion2();
2295        translate.setAutoDiscriminateLocalLanguage(); // 设置用户第一次用时,自动识别其所在国家的语种进行切换
2296        translate.selectLanguageTag.show = false; // 不显示select的选择语言
2297
2298        // 从后台获取默认语言
2299        fetch('/index/translate/getDefaultLanguage')
2300            .then(response => response.json())
2301            .then(data => {
2302                if (data.code === 200 && data.data && data.data.language) {
2303                    // 设置默认语言
2304                    var default_language = data.data.translate_js_code || data.data.language.code;
2305                    if (default_language) {
2306                        translate.language.setDefaultTo(default_language);
2307                    }
2308
2309                    // 使用Edge翻译服务
2310                    translate.service.use('client.edge');
2311
2312                    // 启动监听,用于动态内容的翻译
2313                    translate.listener.start();
2314
2315                    try {
2316                        // 执行翻译
2317                        translate.execute();
2318                    } catch (e) {
2319                        console.log('翻译执行错误: ' + e.message);
2320                        // 如果Edge翻译出错,尝试使用本地翻译
2321                        translate.service.use('local');
2322                        translate.execute();
2323                    }
2324                } else {
2325                    // 使用默认值
2326                    fallbackTranslate();
2327                }
2328            })
2329            .catch(error => {
2330                console.error('获取默认语言失败:', error);
2331                // 使用默认值
2332                fallbackTranslate();
2333            });
2334    }
2335
2336    // 回退到默认翻译设置
2337    function fallbackTranslate() {
2338        var default_language = "chinese_simplified";
2339        translate.language.setDefaultTo(default_language);
2340        translate.service.use('client.edge');
2341        translate.listener.start();
2342
2343        try {
2344            translate.execute();
2345        } catch (e) {
2346            console.log('翻译执行错误: ' + e.message);
2347            translate.service.use('local');
2348            translate.execute();
2349        }
2350    }
2351</script>
2351
2352</html>

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.