/** * 教师搜索功能模块 * 支持:按姓氏搜索、按系所搜索、按职称搜索 * 兼容 IE10+ */ (function(window, $) { 'use strict'; // ==================== 配置参数 ==================== var CONFIG = { dataUrl: '../../common/clxyjsdw.json', // 数据文件路径 $navContainer: '.troops_nav', // 导航容器 $tabContainer: '.access_r', // tab切换容器 $tabList: '.tabList', // 内容展示容器 $departmentNav: '.troops_letter', // 系所导航容器 titleCategories: [ '教授/研究员', '副教授/副研究员/高级工程师', '讲师/博士后/工程师' ] }; // ==================== 全局数据存储 ==================== var teacherData = []; // 原始教师数据 var departmentList = []; // 系所列表(去重后) var currentMode = 'name'; // 当前搜索模式:name/department/title var currentDepartment = '';// 当前选中的系所 var map = { '前沿交叉科学技术研究院': 1, '材料学系': 2, '材料加工与控制工程系': 3, '材料物理与化学系': 4, '无机非金属材料系': 5, '粉末冶金与先进陶瓷研究所': 6, '材料科学与工程': 7, '高分子材料系': 8 }; // ==================== 工具函数 ==================== /** * 比较函数 - 按字母和姓名排序 * @param {Object} a 教师对象a * @param {Object} b 教师对象b * @returns {Number} 比较结果 */ function compareByLetterAndName(a, b) { var letterA = a.properties.letter || ''; var letterB = b.properties.letter || ''; var nameA = a.title || ''; var nameB = b.title || ''; // 先按字母排序 if (letterA < letterB) return -1; if (letterA > letterB) return 1; // 字母相同则按姓名排序 if (nameA < nameB) return -1; if (nameA > nameB) return 1; return 0; } /** * 获取职称分类 * @param {Object} teacher 教师对象 * @returns {String} 职称分类 */ function getTitleCategory(teacher) { var titleSort = teacher.properties.title_sort || ''; return titleSort; } /** * 判断教师是否属于某职称分类 * @param {Object} teacher 教师对象 * @param {String} category 职称分类 * @returns {Boolean} */ function isTitleCategory(teacher, category) { return getTitleCategory(teacher) === category; } /** * 生成教师链接HTML * @param {Object} teacher 教师对象 * @returns {String} HTML字符串 */ function generateTeacherLink(teacher) { var url = teacher.url || '#'; var name = teacher.title || ''; return '
  • ' + name + '
  • '; } /** * 生成字母分组标题HTML * @param {String} letter 字母 * @returns {String} HTML字符串 */ function generateLetterGroupHeader(letter) { return '
  • ' + '
    ' + '
    ' + letter + '
    ' + '
    ' + '
    '; } /** * 生成职称分类区域HTML * @param {String} category 职称分类名称 * @param {Array} teachers 教师列表 * @returns {String} HTML字符串 */ function generateTitleCategorySection(category, teachers) { var links = ''; for (var i = 0; i < teachers.length; i++) { links += generateTeacherLink(teachers[i]); } return '
    ' + '

    ' + category + '

    ' + '
      ' + links + '
    ' + '
    '; } /** * 生成系所导航项HTML * @param {String} department 系所名称 * @param {Boolean} isActive 是否选中 * @returns {String} HTML字符串 */ function generateDepartmentNavItem(department, isActive) { var activeClass = isActive ? ' class="on"' : ''; return '' + department + '
  • '; } // ==================== 数据加载 ==================== /** * 加载教师数据 * @param {Function} callback 加载完成回调 */ function loadTeacherData(callback) { $.ajax({ url: CONFIG.dataUrl, type: 'GET', dataType: 'json', cache: true, success: function(response) { if (response && response.data && response.data.length > 0) { teacherData = response.data; // 初始化数据 initData(); if (callback) { callback(); } } }, error: function(xhr, status, error) { console.log('数据加载失败: ' + error); } }); } /** * 初始化数据处理 */ function initData() { // 收集所有系所并去重 var deptMap = {}; for (var i = 0; i < teacherData.length; i++) { var dept = teacherData[i].properties.department; if (dept && !deptMap[dept]) { deptMap[dept] = true; departmentList.push(dept); } } // 按系所名称排序 // departmentList.sort(); departmentList.sort((a, b) => { const orderA = map[a] ?? Infinity; const orderB = map[b] ?? Infinity; return orderA - orderB; }); } // ==================== 搜索模式处理 ==================== /** * 渲染按姓氏搜索结果 * 按字母排序,字母相同按姓名排序 */ function renderBySurname() { currentMode = 'name'; // 按字母和姓名排序 var sortedData = teacherData.slice().sort(compareByLetterAndName); // 按字母分组 var letterGroups = {}; for (var i = 0; i < sortedData.length; i++) { var teacher = sortedData[i]; var letter = teacher.properties.letter || 'Other'; if (!letterGroups[letter]) { letterGroups[letter] = []; } letterGroups[letter].push(teacher); } // 生成HTML var html = ''; // 更新第一个tabList内容 $(CONFIG.$tabList).eq(0).html(html); } /** * 渲染按系所搜索结果 * @param {String} department 选中的系所,为空则显示第一个 */ function renderByDepartment(department) { currentMode = 'department'; // 确定当前系所 if (!department && departmentList.length > 0) { currentDepartment = departmentList[0]; } else { currentDepartment = department || ''; } // 筛选数据 var filteredData = []; for (var i = 0; i < teacherData.length; i++) { if (teacherData[i].properties.department === currentDepartment) { filteredData.push(teacherData[i]); } } // 按字母排序 filteredData.sort(compareByLetterAndName); // 按职称分类 var categoryData = {}; for (var j = 0; j < CONFIG.titleCategories.length; j++) { categoryData[CONFIG.titleCategories[j]] = []; } for (var k = 0; k < filteredData.length; k++) { var category = getTitleCategory(filteredData[k]); if (category && categoryData[category]) { categoryData[category].push(filteredData[k]); } } // 生成系所导航HTML var navHtml = ''; // 生成职称分类内容HTML var contentHtml = ''; for (var n = 0; n < CONFIG.titleCategories.length; n++) { var cat = CONFIG.titleCategories[n]; var catTeachers = categoryData[cat]; if (catTeachers.length > 0) { contentHtml += generateTitleCategorySection(cat, catTeachers); } } // 更新第二个tabList内容 $(CONFIG.$tabList).eq(1).html(navHtml + contentHtml); // 绑定系所导航点击事件 bindDepartmentNavEvents(); } /** * 渲染按职称搜索结果 * 按职称分类显示,分类内按字母排序 */ function renderByTitle() { currentMode = 'title'; // 按字母排序所有数据 var sortedData = teacherData.slice().sort(compareByLetterAndName); // 按职称分类 var categoryData = {}; for (var i = 0; i < CONFIG.titleCategories.length; i++) { categoryData[CONFIG.titleCategories[i]] = []; } for (var j = 0; j < sortedData.length; j++) { var category = getTitleCategory(sortedData[j]); if (category && categoryData[category]) { categoryData[category].push(sortedData[j]); } } // 生成HTML var html = ''; for (var k = 0; k < CONFIG.titleCategories.length; k++) { var cat = CONFIG.titleCategories[k]; var catTeachers = categoryData[cat]; if (catTeachers.length > 0) { html += generateTitleCategorySection(cat, catTeachers); } } // 更新第三个tabList内容 $(CONFIG.$tabList).eq(2).html(html); } // ==================== 事件绑定 ==================== /** * 绑定导航切换事件 */ function bindNavEvents() { $(CONFIG.$navContainer).find('a').each(function(index) { $(this).on('click', function(e) { e.preventDefault(); // 更新导航样式 $(CONFIG.$navContainer).find('a').removeClass('on'); $(this).addClass('on'); // 根据索引渲染对应内容 switch (index) { case 0: renderBySurname(); break; case 1: renderByDepartment(); break; case 2: renderByTitle(); break; } }); }); // 默认选中第一个并显示内容 $(CONFIG.$navContainer).find('a').eq(0).addClass('on'); } /** * 绑定系所导航点击事件 */ function bindDepartmentNavEvents() { $(CONFIG.$tabList).eq(1).find('.troops_letter li a').each(function(index) { $(this).on('click', function(e) { e.preventDefault(); // 更新导航样式 $(CONFIG.$tabList).eq(1).find('.troops_letter li').removeClass('on'); $(this).parent().addClass('on'); // 渲染对应系所内容 var department = departmentList[index]; if (department) { currentDepartment = department; renderByDepartmentContent(department); } }); }); } /** * 只渲染系所内容区域(不重新渲染导航) * @param {String} department 系所名称 */ function renderByDepartmentContent(department) { // 筛选数据 var filteredData = []; for (var i = 0; i < teacherData.length; i++) { if (teacherData[i].properties.department === department) { filteredData.push(teacherData[i]); } } // 按字母排序 filteredData.sort(compareByLetterAndName); // 按职称分类 var categoryData = {}; for (var j = 0; j < CONFIG.titleCategories.length; j++) { categoryData[CONFIG.titleCategories[j]] = []; } for (var k = 0; k < filteredData.length; k++) { var category = getTitleCategory(filteredData[k]); if (category && categoryData[category]) { categoryData[category].push(filteredData[k]); } } // 生成职称分类内容HTML var contentHtml = ''; for (var n = 0; n < CONFIG.titleCategories.length; n++) { var cat = CONFIG.titleCategories[n]; var catTeachers = categoryData[cat]; if (catTeachers.length > 0) { contentHtml += generateTitleCategorySection(cat, catTeachers); } } // 更新第二个tabList的职称内容区域(保留导航) var $tabList = $(CONFIG.$tabList).eq(1); $tabList.find('.bookman').remove(); $tabList.append(contentHtml); } // ==================== 初始化 ==================== /** * 初始化模块 */ function init() { // 加载数据并初始化 loadTeacherData(function() { // 绑定导航事件 bindNavEvents(); // 默认显示按姓氏搜索结果 renderBySurname(); // 初始化tab切换功能 initTabSwitch(); }); } /** * 初始化tab切换功能 * 复用原有tab切换逻辑,但改为click事件触发 */ function initTabSwitch() { // 初始化时第一个tabList显示,其他隐藏 $(CONFIG.$tabList).removeClass('on').addClass('off'); $(CONFIG.$tabList).eq(0).addClass('on').removeClass('off'); // 监听导航点击,切换对应的tabList $(CONFIG.$navContainer).find('a').each(function(index) { $(this).on('click', function() { $(CONFIG.$tabList).removeClass('on').addClass('off'); $(CONFIG.$tabList).eq(index).addClass('on').removeClass('off'); }); }); } // ==================== 暴露接口 ==================== // 创建全局对象 window.TeacherSearch = { init: init, renderBySurname: renderBySurname, renderByDepartment: renderByDepartment, renderByTitle: renderByTitle, getData: function() { return teacherData; }, getDepartmentList: function() { return departmentList; } }; // DOM加载完成后自动初始化 $(document).ready(function() { init(); }); })(window, jQuery);