Parcourir la source

commit 修复因调整UI导致的搜索实效bug

林海 il y a 11 heures
Parent
commit
43da432ccd
3 fichiers modifiés avec 123 ajouts et 81 suppressions
  1. 96 63
      app.py
  2. 25 16
      templates/add_member.html
  3. 2 2
      templates/members.html

+ 96 - 63
app.py

@@ -1702,73 +1702,106 @@ def search_member():
     keyword     = data.get('keyword', '').strip()
     keyword     = data.get('keyword', '').strip()
     search_type = data.get('search_type', 'name')  # name | former_name | childhood_name | name_word
     search_type = data.get('search_type', 'name')  # name | former_name | childhood_name | name_word
 
 
-    if not keyword:
-        return jsonify({"success": False, "message": "请输入搜索关键词"})
-
     conn = get_db_connection()
     conn = get_db_connection()
     try:
     try:
         with conn.cursor() as cursor:
         with conn.cursor() as cursor:
-            like = f'%{keyword}%'
-            # 根据搜索类型构建 WHERE 子句
-            if search_type == 'former_name':
-                where_clause = "fmi.former_name LIKE %s"
-                where_params = (like,)
-                order_params = (keyword, keyword, f'{keyword}%', f'{keyword}%')
-            elif search_type == 'childhood_name':
-                where_clause = "fmi.childhood_name LIKE %s"
-                where_params = (like,)
-                order_params = (keyword, keyword, f'{keyword}%', f'{keyword}%')
-            elif search_type == 'name_word':
-                where_clause = "fmi.name_word LIKE %s"
-                where_params = (like,)
-                order_params = (keyword, keyword, f'{keyword}%', f'{keyword}%')
-            else:  # name(默认:姓名搜索)
-                where_clause = "fmi.name LIKE %s OR fmi.simplified_name LIKE %s OR fmi.former_name LIKE %s"
-                where_params = (like, like, like)
-                order_params = (keyword, keyword, f'{keyword}%', f'{keyword}%')
+            if keyword:
+                like = f'%{keyword}%'
+                # 根据搜索类型构建 WHERE 子句
+                if search_type == 'former_name':
+                    where_clause = "fmi.former_name LIKE %s"
+                    where_params = (like,)
+                    order_params = (keyword, keyword, f'{keyword}%', f'{keyword}%')
+                elif search_type == 'childhood_name':
+                    where_clause = "fmi.childhood_name LIKE %s"
+                    where_params = (like,)
+                    order_params = (keyword, keyword, f'{keyword}%', f'{keyword}%')
+                elif search_type == 'name_word':
+                    where_clause = "fmi.name_word LIKE %s"
+                    where_params = (like,)
+                    order_params = (keyword, keyword, f'{keyword}%', f'{keyword}%')
+                else:  # name(默认:姓名搜索)
+                    where_clause = "fmi.name LIKE %s OR fmi.simplified_name LIKE %s OR fmi.former_name LIKE %s"
+                    where_params = (like, like, like)
+                    order_params = (keyword, keyword, f'{keyword}%', f'{keyword}%')
 
 
-            cursor.execute(f"""
-                SELECT
-                    fmi.id,
-                    fmi.name,
-                    fmi.simplified_name,
-                    fmi.name_word_generation,
-                    fmi.former_name,
-                    fmi.childhood_name,
-                    fmi.name_word,
-                    -- 父亲:优先非入继父(sub_type != 3),取第一条
-                    (SELECT p.name FROM family_relation_info r
-                     JOIN family_member_info p ON r.parent_mid = p.id
-                     WHERE r.child_mid = fmi.id AND r.relation_type = 1
-                     ORDER BY CASE WHEN COALESCE(r.sub_relation_type,0)=3 THEN 1 ELSE 0 END, r.id
-                     LIMIT 1) AS father_name,
-                    (SELECT p.simplified_name FROM family_relation_info r
-                     JOIN family_member_info p ON r.parent_mid = p.id
-                     WHERE r.child_mid = fmi.id AND r.relation_type = 1
-                     ORDER BY CASE WHEN COALESCE(r.sub_relation_type,0)=3 THEN 1 ELSE 0 END, r.id
-                     LIMIT 1) AS father_simplified_name,
-                    -- 出继标注
-                    (SELECT CONCAT(
-                         '出继自',
-                         COALESCE(pbio.simplified_name, pbio.name, '?'),
-                         ',入继至',
-                         COALESCE(padopt.simplified_name, padopt.name, '?'))
-                     FROM family_relation_info rbio
-                     JOIN family_member_info pbio ON rbio.parent_mid = pbio.id
-                     JOIN family_relation_info radopt ON radopt.child_mid = fmi.id AND radopt.sub_relation_type = 3
-                     JOIN family_member_info padopt ON radopt.parent_mid = padopt.id
-                     WHERE rbio.child_mid = fmi.id AND rbio.sub_relation_type = 2
-                     LIMIT 1) AS adoption_note
-                FROM family_member_info fmi
-                WHERE {where_clause}
-                GROUP BY fmi.id
-                ORDER BY
-                    CASE WHEN fmi.name = %s THEN 1
-                         WHEN fmi.simplified_name = %s THEN 2
-                         WHEN fmi.name LIKE %s THEN 3
-                         WHEN fmi.simplified_name LIKE %s THEN 4
-                         ELSE 5 END
-            """, (*where_params, *order_params))
+                cursor.execute(f"""
+                    SELECT
+                        fmi.id,
+                        fmi.name,
+                        fmi.simplified_name,
+                        fmi.name_word_generation,
+                        fmi.former_name,
+                        fmi.childhood_name,
+                        fmi.name_word,
+                        -- 父亲:优先非入继父(sub_type != 3),取第一条
+                        (SELECT p.name FROM family_relation_info r
+                         JOIN family_member_info p ON r.parent_mid = p.id
+                         WHERE r.child_mid = fmi.id AND r.relation_type = 1
+                         ORDER BY CASE WHEN COALESCE(r.sub_relation_type,0)=3 THEN 1 ELSE 0 END, r.id
+                         LIMIT 1) AS father_name,
+                        (SELECT p.simplified_name FROM family_relation_info r
+                         JOIN family_member_info p ON r.parent_mid = p.id
+                         WHERE r.child_mid = fmi.id AND r.relation_type = 1
+                         ORDER BY CASE WHEN COALESCE(r.sub_relation_type,0)=3 THEN 1 ELSE 0 END, r.id
+                         LIMIT 1) AS father_simplified_name,
+                        -- 出继标注
+                        (SELECT CONCAT(
+                             '出继自',
+                             COALESCE(pbio.simplified_name, pbio.name, '?'),
+                             ',入继至',
+                             COALESCE(padopt.simplified_name, padopt.name, '?'))
+                         FROM family_relation_info rbio
+                         JOIN family_member_info pbio ON rbio.parent_mid = pbio.id
+                         JOIN family_relation_info radopt ON radopt.child_mid = fmi.id AND radopt.sub_relation_type = 3
+                         JOIN family_member_info padopt ON radopt.parent_mid = padopt.id
+                         WHERE rbio.child_mid = fmi.id AND rbio.sub_relation_type = 2
+                         LIMIT 1) AS adoption_note
+                    FROM family_member_info fmi
+                    WHERE {where_clause}
+                    GROUP BY fmi.id
+                    ORDER BY
+                        CASE WHEN fmi.name = %s THEN 1
+                             WHEN fmi.simplified_name = %s THEN 2
+                             WHEN fmi.name LIKE %s THEN 3
+                             WHEN fmi.simplified_name LIKE %s THEN 4
+                             ELSE 5 END
+                """, (*where_params, *order_params))
+            else:
+                cursor.execute("""
+                    SELECT
+                        fmi.id,
+                        fmi.name,
+                        fmi.simplified_name,
+                        fmi.name_word_generation,
+                        fmi.former_name,
+                        fmi.childhood_name,
+                        fmi.name_word,
+                        (SELECT p.name FROM family_relation_info r
+                         JOIN family_member_info p ON r.parent_mid = p.id
+                         WHERE r.child_mid = fmi.id AND r.relation_type = 1
+                         ORDER BY CASE WHEN COALESCE(r.sub_relation_type,0)=3 THEN 1 ELSE 0 END, r.id
+                         LIMIT 1) AS father_name,
+                        (SELECT p.simplified_name FROM family_relation_info r
+                         JOIN family_member_info p ON r.parent_mid = p.id
+                         WHERE r.child_mid = fmi.id AND r.relation_type = 1
+                         ORDER BY CASE WHEN COALESCE(r.sub_relation_type,0)=3 THEN 1 ELSE 0 END, r.id
+                         LIMIT 1) AS father_simplified_name,
+                        (SELECT CONCAT(
+                             '出继自',
+                             COALESCE(pbio.simplified_name, pbio.name, '?'),
+                             ',入继至',
+                             COALESCE(padopt.simplified_name, padopt.name, '?'))
+                         FROM family_relation_info rbio
+                         JOIN family_member_info pbio ON rbio.parent_mid = pbio.id
+                         JOIN family_relation_info radopt ON radopt.child_mid = fmi.id AND radopt.sub_relation_type = 3
+                         JOIN family_member_info padopt ON radopt.parent_mid = padopt.id
+                         WHERE rbio.child_mid = fmi.id AND rbio.sub_relation_type = 2
+                         LIMIT 1) AS adoption_note
+                    FROM family_member_info fmi
+                    ORDER BY fmi.name_word_generation ASC, fmi.id ASC
+                    LIMIT 30
+                """)
             members = cursor.fetchall()
             members = cursor.fetchall()
 
 
             if not members:
             if not members:

+ 25 - 16
templates/add_member.html

@@ -1359,28 +1359,36 @@
         });
         });
     });
     });
 
 
+    document.getElementById('memberSelectModal').addEventListener('shown.bs.modal', function() {
+        searchMembers();
+    });
+
     function searchMembers() {
     function searchMembers() {
         const keyword = document.getElementById('member-search').value;
         const keyword = document.getElementById('member-search').value;
         const searchType = document.getElementById('member-search-type').value;
         const searchType = document.getElementById('member-search-type').value;
-        fetch(`/manager/api/search_members?keyword=${encodeURIComponent(keyword)}&type=${searchType}&page=1`)
+        fetch('/manager/api/search_member', {
+            method: 'POST',
+            headers: {
+                'Content-Type': 'application/json'
+            },
+            body: JSON.stringify({ keyword: keyword, search_type: searchType })
+        })
             .then(response => response.json())
             .then(response => response.json())
             .then(data => {
             .then(data => {
-                renderMemberList(data.members);
-                totalMembers = data.total;
-                document.getElementById('total-members').textContent = totalMembers;
+                if (data.success && data.members) {
+                    renderMemberList(data.members);
+                    totalMembers = data.members.length;
+                    document.getElementById('total-members').textContent = totalMembers;
+                } else {
+                    renderMemberList([]);
+                    document.getElementById('total-members').textContent = 0;
+                }
             })
             })
             .catch(error => console.error('Search error:', error));
             .catch(error => console.error('Search error:', error));
     }
     }
 
 
     function changePage(page) {
     function changePage(page) {
-        const keyword = document.getElementById('member-search').value;
-        const searchType = document.getElementById('member-search-type').value;
-        fetch(`/manager/api/search_members?keyword=${encodeURIComponent(keyword)}&type=${searchType}&page=${page}`)
-            .then(response => response.json())
-            .then(data => {
-                renderMemberList(data.members);
-            })
-            .catch(error => console.error('Page error:', error));
+        searchMembers();
     }
     }
 
 
     function renderMemberList(members) {
     function renderMemberList(members) {
@@ -1393,18 +1401,19 @@
         }
         }
         
         
         members.forEach(member => {
         members.forEach(member => {
-            const item = document.createElement('a');
-            item.href = '#';
+            const item = document.createElement('div');
             item.className = 'list-group-item list-group-item-action d-flex justify-content-between align-items-center';
             item.className = 'list-group-item list-group-item-action d-flex justify-content-between align-items-center';
             item.innerHTML = `
             item.innerHTML = `
                 <div>
                 <div>
-                    <div class="fw-bold">${member.name}${member.simplified_name ? '(' + member.simplified_name + ')' : ''}</div>
+                    <a href="/manager/member_detail/${member.id}" target="_blank" class="fw-bold text-primary member-name-link">${member.name}${member.simplified_name ? '(' + member.simplified_name + ')' : ''}</a>
                     <div class="small text-muted">${member.name_word_generation || ''} | ${member.birthday_str || '未知'}</div>
                     <div class="small text-muted">${member.name_word_generation || ''} | ${member.birthday_str || '未知'}</div>
                 </div>
                 </div>
                 <span class="text-muted small">ID: ${member.id}</span>
                 <span class="text-muted small">ID: ${member.id}</span>
             `;
             `;
             item.addEventListener('click', function(e) {
             item.addEventListener('click', function(e) {
-                e.preventDefault();
+                if (e.target.classList.contains('member-name-link')) {
+                    return;
+                }
                 const row = document.querySelector(`.relation-row[data-index="${currentSelectIndex}"]`);
                 const row = document.querySelector(`.relation-row[data-index="${currentSelectIndex}"]`);
                 if (row) {
                 if (row) {
                     row.querySelector('.related-member-display').value = member.name + (member.simplified_name ? '(' + member.simplified_name + ')' : '');
                     row.querySelector('.related-member-display').value = member.name + (member.simplified_name ? '(' + member.simplified_name + ')' : '');

+ 2 - 2
templates/members.html

@@ -149,7 +149,7 @@
         </div>
         </div>
     </div>
     </div>
     <div class="page-actions">
     <div class="page-actions">
-        <div class="search-bar">
+        <form action="{{ url_for('members') }}" method="GET" class="search-bar">
             <div class="input-group">
             <div class="input-group">
                 <select name="search_type" class="form-select" style="max-width:100px;">
                 <select name="search_type" class="form-select" style="max-width:100px;">
                     <option value="name" {% if search_type != 'name_word' %}selected{% endif %}>姓名</option>
                     <option value="name" {% if search_type != 'name_word' %}selected{% endif %}>姓名</option>
@@ -163,7 +163,7 @@
             {% if search_name %}
             {% if search_name %}
             <a href="{{ url_for('members') }}" class="btn btn-secondary">重置</a>
             <a href="{{ url_for('members') }}" class="btn btn-secondary">重置</a>
             {% endif %}
             {% endif %}
-        </div>
+        </form>
         <a href="{{ url_for('add_member') }}" class="btn btn-primary">
         <a href="{{ url_for('add_member') }}" class="btn btn-primary">
             <i class="bi bi-plus-lg"></i> 录入新成员
             <i class="bi bi-plus-lg"></i> 录入新成员
         </a>
         </a>