From 84b243dc526c7a52e55e10c378a0e6a481929b2e Mon Sep 17 00:00:00 2001 From: jeremygan2021 Date: Fri, 27 Mar 2026 13:27:47 +0800 Subject: [PATCH] new --- __pycache__/main.cpython-312.pyc | Bin 92129 -> 97876 bytes __pycache__/main.cpython-313.pyc | Bin 30201 -> 102180 bytes add_industry_column.py | 91 ------------- config.json | 19 ++- fix_industry_column.py | 78 ----------- main.py | 177 ++++++++++++++++++------- static/qrcode.png | Bin 0 -> 9354 bytes templates/admin.html | 103 +++++++++++---- templates/index.html | 126 +++++++++--------- templates/wall.html | 220 +++++++++++++++++++++++++------ 10 files changed, 464 insertions(+), 350 deletions(-) delete mode 100644 add_industry_column.py delete mode 100644 fix_industry_column.py create mode 100644 static/qrcode.png diff --git a/__pycache__/main.cpython-312.pyc b/__pycache__/main.cpython-312.pyc index 20cdd5e86bcd4669736ebe07e542a79fa3ff34b6..2c29b3f6f5ec14d789afff290f662c2c93ea26cb 100644 GIT binary patch delta 21034 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 XC=~FCjpa*4cbkt^gE3KT01^K$f-8=) delta 16118 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 ZG!zRT7ssrNQ+}e*uZvcG60HXO{{jV);%fi^ diff --git a/add_industry_column.py b/add_industry_column.py deleted file mode 100644 index 63470b4..0000000 --- a/add_industry_column.py +++ /dev/null @@ -1,91 +0,0 @@ -#!/usr/bin/env python3 -""" -修复脚本:确保 gsdh_data 表有 industry_company 列 -""" - -import psycopg2 -import json -import os - -def load_config(): - """加载数据库配置""" - if os.path.exists("config.json"): - with open("config.json", "r", encoding="utf-8") as f: - return json.load(f) - return {} - -def safe_add_column(conn, table, col, dtype): - """安全地添加列(如果不存在)""" - cur = conn.cursor() - try: - # 首先检查列是否存在 - cur.execute(""" - SELECT column_name FROM information_schema.columns - WHERE table_name = %s AND column_name = %s - """, (table, col)) - - if not cur.fetchone(): - cur.execute(f"ALTER TABLE {table} ADD COLUMN {col} {dtype}") - print(f"✅ 添加列 {col} 到 {table} 表") - return True - else: - print(f"ℹ️ 列 {col} 已存在于 {table} 表") - return False - except Exception as e: - print(f"❌ 添加列 {col} 时出错: {e}") - return False - finally: - cur.close() - -def main(): - config = load_config() - - if not config.get('db_host'): - print("❌ 未找到数据库配置") - return - - print(f"🔗 连接到数据库: {config.get('db_host')}:{config.get('db_port')}/{config.get('db_name')}") - - try: - conn = psycopg2.connect( - host=config.get("db_host", "localhost"), - port=config.get("db_port", "5432"), - user=config.get("db_user", "gsdh"), - password=config.get("db_password", "123gsdh"), - database=config.get("db_name", "gsdh"), - connect_timeout=5 - ) - - # 确保 gsdh_data 表有 industry_company 列 - print("\n📋 检查 gsdh_data 表结构...") - added = safe_add_column(conn, 'gsdh_data', 'industry_company', 'VARCHAR(200)') - - if added: - conn.commit() - print("\n✅ 数据库修复成功!") - print(" 现在签到功能应该可以正常工作了。") - else: - print("\n✅ 数据库已经是最新状态,无需修复") - - # 显示当前表结构 - print("\n📊 当前 gsdh_data 表的列:") - cur = conn.cursor() - cur.execute(""" - SELECT column_name, data_type - FROM information_schema.columns - WHERE table_name = 'gsdh_data' - ORDER BY ordinal_position - """) - for col in cur.fetchall(): - print(f" - {col[0]}: {col[1]}") - cur.close() - - conn.close() - - except Exception as e: - print(f"\n❌ 连接数据库失败: {e}") - import traceback - traceback.print_exc() - -if __name__ == "__main__": - main() diff --git a/config.json b/config.json index 0f8ae6b..9607e1c 100644 --- a/config.json +++ b/config.json @@ -8,9 +8,11 @@ "secondary_color": "#0066ff", "bg_color": "#050814", "header_image": "/static/image1.jpg", - "enable_ticket_validation": true, - "enable_sms_verification": true, - "enable_payment": true, + "enable_qrcode": false, + "qrcode_image": "/admin", + "enable_ticket_validation": false, + "enable_sms_verification": false, + "enable_payment": false, "payment_amount": 0.01, "wechat_pay_config": { "appid": "wxdf2ca73e6c0929f0", @@ -21,6 +23,7 @@ "notify_url": "https://event.quant-speed.com/ticket/finish/" }, "enable_seating": false, + "seat_unit_name": "桌", "total_tables": 14, "max_per_table": 10, "ticket_field_config": { @@ -65,22 +68,18 @@ "label": "公司主要经营 / 业务", "show": true, "required": true - }, - "vision_2026": { - "label": "2026年业务愿景", - "show": false, - "required": false } }, "wall_config": { "bg_opacity": 0.3, "show_title": true, "learn_more_url": "", + "show_qrcode": true, "show_fields": { - "name": true, + "name": false, + "phone": false, "company_name": false, "position": true, - "vision_2026": true, "business_scope": true } }, diff --git a/fix_industry_column.py b/fix_industry_column.py deleted file mode 100644 index 2adad0d..0000000 --- a/fix_industry_column.py +++ /dev/null @@ -1,78 +0,0 @@ -#!/usr/bin/env python3 -""" -修复数据库脚本:为 gsdh_data 表添加缺失的 industry_company 列 -""" - -import psycopg2 -import json -import os - -def load_config(): - """加载数据库配置""" - if os.path.exists("config.json"): - with open("config.json", "r", encoding="utf-8") as f: - return json.load(f) - return {} - -def fix_industry_column(): - """添加 industry_company 列到 gsdh_data 表""" - config = load_config() - - print(f"连接到数据库: {config.get('db_host')}:{config.get('db_port')}/{config.get('db_name')}") - - try: - conn = psycopg2.connect( - host=config.get("db_host", "localhost"), - port=config.get("db_port", "5432"), - user=config.get("db_user", "gsdh"), - password=config.get("db_password", "123gsdh"), - database=config.get("db_name", "gsdh"), - connect_timeout=5 - ) - cur = conn.cursor() - - # 检查列是否存在 - cur.execute(""" - SELECT column_name - FROM information_schema.columns - WHERE table_name = 'gsdh_data' AND column_name = 'industry_company' - """) - - if cur.fetchone(): - print("✅ industry_company 列已存在,无需修复") - else: - # 添加列 - print("🔧 正在添加 industry_company 列...") - cur.execute(""" - ALTER TABLE gsdh_data - ADD COLUMN industry_company VARCHAR(200) - """) - conn.commit() - print("✅ industry_company 列已成功添加") - - # 验证列存在 - print("\n当前 gsdh_data 表的列:") - cur.execute(""" - SELECT column_name, data_type - FROM information_schema.columns - WHERE table_name = 'gsdh_data' - ORDER BY ordinal_position - """) - columns = cur.fetchall() - for col in columns: - print(f" - {col[0]}: {col[1]}") - - cur.close() - conn.close() - print("\n✨ 修复完成!") - - except Exception as e: - print(f"\n❌ 错误: {e}") - import traceback - traceback.print_exc() - return False - - return True - -if __name__ == "__main__": - fix_industry_column() diff --git a/main.py b/main.py index 8d89629..1c459e8 100644 --- a/main.py +++ b/main.py @@ -941,19 +941,35 @@ def checkin_user(checkin_data: CheckinRequest): new_real_id = str(max_id + 1) # 2. Insert into gsdh_data first to satisfy Foreign Key - insert_user_sql = """ - INSERT INTO gsdh_data (new_id, name, phone, industry_company, fee, payment_channel, is_signed) - VALUES (%s, %s, %s, %s, '0', 'onsite_checkin', 'TRUE') - """ - # Use provided company name or default - industry_val = checkin_data.company_name or "现场注册" + # 先检查 industry_company 列是否存在 + cur.execute(""" + SELECT column_name FROM information_schema.columns + WHERE table_name = 'gsdh_data' AND column_name = 'industry_company' + """) + has_industry_col = cur.fetchone() is not None - cur.execute(insert_user_sql, ( - new_real_id, - checkin_data.name, - checkin_data.phone, - industry_val - )) + if has_industry_col: + insert_user_sql = """ + INSERT INTO gsdh_data (new_id, name, phone, industry_company, fee, payment_channel, is_signed) + VALUES (%s, %s, %s, %s, '0', 'onsite_checkin', 'TRUE') + """ + industry_val = checkin_data.company_name or "现场注册" + cur.execute(insert_user_sql, ( + new_real_id, + checkin_data.name, + checkin_data.phone, + industry_val + )) + else: + insert_user_sql = """ + INSERT INTO gsdh_data (new_id, name, phone, fee, payment_channel, is_signed) + VALUES (%s, %s, %s, '0', 'onsite_checkin', 'TRUE') + """ + cur.execute(insert_user_sql, ( + new_real_id, + checkin_data.name, + checkin_data.phone + )) # Update ID for subsequent operations final_gsdh_id = new_real_id @@ -1213,18 +1229,38 @@ def add_user_api(user_data: AddUserRequest): max_id = row[0] if row and row[0] is not None else 0 new_id = str(max_id + 1) - insert_sql = """ - INSERT INTO gsdh_data (new_id, name, phone, industry_company, fee, payment_channel, is_signed) - VALUES (%s, %s, %s, %s, %s, %s, 'FALSE') - """ - cur.execute(insert_sql, ( - new_id, - user_data.name, - user_data.phone, - user_data.industry_company, - user_data.fee, - user_data.payment_channel - )) + # 先检查 industry_company 列是否存在 + cur.execute(""" + SELECT column_name FROM information_schema.columns + WHERE table_name = 'gsdh_data' AND column_name = 'industry_company' + """) + has_industry_col = cur.fetchone() is not None + + if has_industry_col: + insert_sql = """ + INSERT INTO gsdh_data (new_id, name, phone, industry_company, fee, payment_channel, is_signed) + VALUES (%s, %s, %s, %s, %s, %s, 'FALSE') + """ + cur.execute(insert_sql, ( + new_id, + user_data.name, + user_data.phone, + user_data.industry_company, + user_data.fee, + user_data.payment_channel + )) + else: + insert_sql = """ + INSERT INTO gsdh_data (new_id, name, phone, fee, payment_channel, is_signed) + VALUES (%s, %s, %s, %s, %s, 'FALSE') + """ + cur.execute(insert_sql, ( + new_id, + user_data.name, + user_data.phone, + user_data.fee, + user_data.payment_channel + )) conn.commit() cur.close() @@ -1423,10 +1459,23 @@ def reset_database(): """) # Initial Data (Optional - add a test user) + # 先检查 industry_company 列是否存在 cur.execute(""" - INSERT INTO gsdh_data (new_id, name, phone, industry_company, fee, payment_channel, is_signed) - VALUES ('1', '测试用户', '13800000000', '科技', '0', 'test', 'FALSE'); + SELECT column_name FROM information_schema.columns + WHERE table_name = 'gsdh_data' AND column_name = 'industry_company' """) + has_industry_col = cur.fetchone() is not None + + if has_industry_col: + cur.execute(""" + INSERT INTO gsdh_data (new_id, name, phone, industry_company, fee, payment_channel, is_signed) + VALUES ('1', '测试用户', '13800000000', '科技', '0', 'test', 'FALSE') + """) + else: + cur.execute(""" + INSERT INTO gsdh_data (new_id, name, phone, fee, payment_channel, is_signed) + VALUES ('1', '测试用户', '13800000000', '0', 'test', 'FALSE') + """) conn.commit() cur.close() @@ -2152,6 +2201,13 @@ async def create_payment(req: TicketPaymentRequest, request: Request): cur.execute("SELECT new_id, fee FROM gsdh_data WHERE phone = %s", (req.phone,)) existing = cur.fetchone() + # 先检查 industry_company 列是否存在 + cur.execute(""" + SELECT column_name FROM information_schema.columns + WHERE table_name = 'gsdh_data' AND column_name = 'industry_company' + """) + has_industry_col = cur.fetchone() is not None + if existing: user_id = existing[0] current_fee = existing[1] @@ -2163,17 +2219,30 @@ async def create_payment(req: TicketPaymentRequest, request: Request): release_db_connection(conn) return JSONResponse(content={"success": False, "message": "该手机号已完成报名,无需重复支付"}, status_code=400) - cur.execute(""" - UPDATE gsdh_data - SET name=%s, industry_company=%s, fee='PENDING', payment_channel='wechat_h5_pending', out_trade_no=%s - WHERE new_id=%s - """, (req.name, req.company_name, out_trade_no, user_id)) + if has_industry_col: + cur.execute(""" + UPDATE gsdh_data + SET name=%s, industry_company=%s, fee='PENDING', payment_channel='wechat_h5_pending', out_trade_no=%s + WHERE new_id=%s + """, (req.name, req.company_name, out_trade_no, user_id)) + else: + cur.execute(""" + UPDATE gsdh_data + SET name=%s, fee='PENDING', payment_channel='wechat_h5_pending', out_trade_no=%s + WHERE new_id=%s + """, (req.name, out_trade_no, user_id)) else: user_id = new_id - cur.execute(""" - INSERT INTO gsdh_data (new_id, name, phone, industry_company, fee, payment_channel, is_signed, out_trade_no) - VALUES (%s, %s, %s, %s, 'PENDING', 'wechat_h5_pending', 'FALSE', %s) - """, (user_id, req.name, req.phone, req.company_name, out_trade_no)) + if has_industry_col: + cur.execute(""" + INSERT INTO gsdh_data (new_id, name, phone, industry_company, fee, payment_channel, is_signed, out_trade_no) + VALUES (%s, %s, %s, %s, 'PENDING', 'wechat_h5_pending', 'FALSE', %s) + """, (user_id, req.name, req.phone, req.company_name, out_trade_no)) + else: + cur.execute(""" + INSERT INTO gsdh_data (new_id, name, phone, fee, payment_channel, is_signed, out_trade_no) + VALUES (%s, %s, %s, 'PENDING', 'wechat_h5_pending', 'FALSE', %s) + """, (user_id, req.name, req.phone, out_trade_no)) # Also store extra info in checkin_info? # Requirement: "If registration paid then add to gsdh_data" @@ -2250,6 +2319,13 @@ async def create_native_payment(req: TicketPaymentRequest, request: Request): cur.execute("SELECT new_id, fee FROM gsdh_data WHERE phone = %s", (req.phone,)) existing = cur.fetchone() + # 先检查 industry_company 列是否存在 + cur.execute(""" + SELECT column_name FROM information_schema.columns + WHERE table_name = 'gsdh_data' AND column_name = 'industry_company' + """) + has_industry_col = cur.fetchone() is not None + if existing: user_id = existing[0] current_fee = existing[1] @@ -2260,17 +2336,30 @@ async def create_native_payment(req: TicketPaymentRequest, request: Request): release_db_connection(conn) return JSONResponse(content={"success": False, "message": "该手机号已完成报名,无需重复支付"}, status_code=400) - cur.execute(""" - UPDATE gsdh_data - SET name=%s, industry_company=%s, fee='PENDING', payment_channel='微信线上支付_pending', out_trade_no=%s - WHERE new_id=%s - """, (req.name, req.company_name, out_trade_no, user_id)) + if has_industry_col: + cur.execute(""" + UPDATE gsdh_data + SET name=%s, industry_company=%s, fee='PENDING', payment_channel='微信线上支付_pending', out_trade_no=%s + WHERE new_id=%s + """, (req.name, req.company_name, out_trade_no, user_id)) + else: + cur.execute(""" + UPDATE gsdh_data + SET name=%s, fee='PENDING', payment_channel='微信线上支付_pending', out_trade_no=%s + WHERE new_id=%s + """, (req.name, out_trade_no, user_id)) else: user_id = new_id - cur.execute(""" - INSERT INTO gsdh_data (new_id, name, phone, industry_company, fee, payment_channel, is_signed, out_trade_no) - VALUES (%s, %s, %s, %s, 'PENDING', '微信线上支付_pending', 'FALSE', %s) - """, (user_id, req.name, req.phone, req.company_name, out_trade_no)) + if has_industry_col: + cur.execute(""" + INSERT INTO gsdh_data (new_id, name, phone, industry_company, fee, payment_channel, is_signed, out_trade_no) + VALUES (%s, %s, %s, %s, 'PENDING', '微信线上支付_pending', 'FALSE', %s) + """, (user_id, req.name, req.phone, req.company_name, out_trade_no)) + else: + cur.execute(""" + INSERT INTO gsdh_data (new_id, name, phone, fee, payment_channel, is_signed, out_trade_no) + VALUES (%s, %s, %s, 'PENDING', '微信线上支付_pending', 'FALSE', %s) + """, (user_id, req.name, req.phone, out_trade_no)) conn.commit() cur.close() diff --git a/static/qrcode.png b/static/qrcode.png new file mode 100644 index 0000000000000000000000000000000000000000..73d2bb6ba8f9f862b9bc0d9bef43894864c382d4 GIT binary patch literal 9354 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 literal 0 HcmV?d00001 diff --git a/templates/admin.html b/templates/admin.html index 659faf7..2929f8a 100644 --- a/templates/admin.html +++ b/templates/admin.html @@ -776,22 +776,14 @@ +

- -
- -
-
- -
-
- -
-
- -
-
- + +

勾选要在签到大屏上显示的字段,字段名称与签到字段设置同步

+
+
@@ -1045,6 +1037,9 @@ "vision_2026": {"label": "2026年业务愿景", "show": true, "required": false} }); + // 渲染大屏显示字段 + renderWallDisplayFields(config.checkin_field_config || {}, config.wall_config || {}); + // DB Config document.getElementById('db_host').value = config.db_host || ''; document.getElementById('db_port').value = config.db_port || ''; @@ -1054,14 +1049,10 @@ // Wall Config const wc = config.wall_config || {}; - const show = wc.show_fields || {}; document.getElementById('wall_bg_opacity').value = wc.bg_opacity !== undefined ? wc.bg_opacity : 0.3; document.getElementById('wall_show_title').checked = wc.show_title !== false; document.getElementById('wall_learn_more_url').value = wc.learn_more_url || ''; - document.getElementById('wall_show_name').checked = show.name !== false; - document.getElementById('wall_show_position').checked = show.position !== false; - document.getElementById('wall_show_vision').checked = show.vision_2026 !== false; - document.getElementById('wall_show_scope').checked = show.business_scope !== false; + document.getElementById('wall_show_qrcode').checked = wc.show_qrcode === true; }); function renderFieldConfig(tbodyId, fieldConfig, orderedKeys) { @@ -1132,6 +1123,8 @@ Object.keys(fieldConfig).forEach(key => { const field = fieldConfig[key]; + if (!field) return; + const isLocked = (key === 'name' || key === 'phone'); const row = document.createElement('div'); @@ -1166,6 +1159,8 @@ Object.keys(fieldConfig).forEach(key => { const field = fieldConfig[key]; + if (!field) return; + const isLocked = (key === 'name' || key === 'phone'); const row = document.createElement('div'); @@ -1191,6 +1186,63 @@ }); } + /** + * 渲染大屏显示字段复选框 + * @param {Object} checkinFieldConfig 签到字段配置 + * @param {Object} wallConfig 大屏配置 + */ + function renderWallDisplayFields(checkinFieldConfig, wallConfig) { + const container = document.getElementById('wall_display_fields'); + container.innerHTML = ''; + + const showFields = wallConfig.show_fields || {}; + + Object.keys(checkinFieldConfig).forEach(key => { + const field = checkinFieldConfig[key]; + if (!field || !field.show) return; + + const isChecked = showFields[key] !== false; + + const label = document.createElement('label'); + label.className = 'checkbox-wrapper'; + label.style.marginBottom = '0'; + label.innerHTML = ` + + ${field.label} + (${key}) + `; + container.appendChild(label); + }); + + // 如果没有可用字段,显示提示 + if (container.children.length === 0) { + container.innerHTML = '

请在"签到/大屏字段设置"中配置需要显示的字段

'; + } + } + + /** + * 获取大屏显示字段配置(从 UI) + */ + function getWallDisplayFieldsFromUI() { + const config = {}; + const checkboxes = document.querySelectorAll('.wall-display-field'); + checkboxes.forEach(cb => { + config[cb.dataset.key] = cb.checked; + }); + return config; + } + + /** + * 刷新大屏显示字段(当签到字段配置改变时调用) + */ + function refreshWallDisplayFields() { + const checkinConfig = getCheckinFieldConfigFromUI(); + const wallConfig = { + show_fields: getWallDisplayFieldsFromUI() + }; + renderWallDisplayFields(checkinConfig, wallConfig); + } + /** * 获取报名字段配置(从 UI) */ @@ -1480,6 +1532,8 @@ renderTicketFields(config); } else { renderCheckinFields(config); + // 刷新大屏显示字段配置 + refreshWallDisplayFields(); } closeDeleteModal(); @@ -1546,13 +1600,8 @@ bg_opacity: parseFloat(document.getElementById('wall_bg_opacity').value), show_title: document.getElementById('wall_show_title').checked, learn_more_url: document.getElementById('wall_learn_more_url').value, - show_fields: { - name: document.getElementById('wall_show_name').checked, - company_name: document.getElementById('wall_show_company').checked, - position: document.getElementById('wall_show_position').checked, - vision_2026: document.getElementById('wall_show_vision').checked, - business_scope: document.getElementById('wall_show_scope').checked - } + show_qrcode: document.getElementById('wall_show_qrcode').checked, + show_fields: getWallDisplayFieldsFromUI() }, // DB Config diff --git a/templates/index.html b/templates/index.html index 18db249..7546d2d 100644 --- a/templates/index.html +++ b/templates/index.html @@ -571,25 +571,8 @@ - - - - - - - + +
@@ -730,6 +713,52 @@ } } + /** + * 动态渲染签到表单字段 + * 根据 checkin_field_config 配置生成字段 HTML + */ + function renderDynamicCheckinFields() { + const container = document.getElementById('dynamic-checkin-fields'); + if (!container) return; + + const fc = CONFIG.checkin_field_config || {}; + container.innerHTML = ''; + + // 定义字段显示顺序 + const fieldOrder = ['company_name', 'position', 'business_scope', 'vision_2026']; + + // 按顺序添加字段 + fieldOrder.forEach(key => { + const field = fc[key]; + if (!field) return; + + const div = document.createElement('div'); + div.className = 'input-group' + (field.show ? '' : ' hidden'); + div.id = 'group-' + key; + + const isTextarea = (key === 'business_scope' || key === 'vision_2026'); + + let placeholder = '点此输入'; + if (key === 'business_scope') placeholder = '点此输入'; + if (key === 'vision_2026') placeholder = '点此输入 (为了业务更好对接,最好表述清晰)'; + + if (isTextarea) { + const rows = key === 'vision_2026' ? 3 : 2; + div.innerHTML = ` + + + `; + } else { + div.innerHTML = ` + + + `; + } + + container.appendChild(div); + }); + } + function applyConfigUI() { const smsGroup = document.getElementById('sms-verification-group'); if (smsGroup) { @@ -740,38 +769,8 @@ } } - // Apply field config (Show/Hide/Required) - const fc = CONFIG.checkin_field_config || {}; - const fields = [ - { key: 'company_name', groupId: 'group-company', inputId: 'form-company', labelId: 'label-company' }, - { key: 'position', groupId: 'group-position', inputId: 'form-position', labelId: 'label-position' }, - { key: 'business_scope', groupId: 'group-business', inputId: 'form-business', labelId: 'label-business' }, - { key: 'vision_2026', groupId: 'group-vision', inputId: 'form-vision', labelId: 'label-vision' } - ]; - - fields.forEach(field => { - const conf = fc[field.key] || { show: false, required: false, label: '' }; - const group = document.getElementById(field.groupId); - const input = document.getElementById(field.inputId); - const label = document.getElementById(field.labelId); - - if (group && input) { - // Visibility - if (conf.show) { - group.classList.remove('hidden'); - } else { - group.classList.add('hidden'); - } - - // Required - input.required = conf.required === true; - - // Label - if (label && conf.label) { - label.textContent = conf.label; - } - } - }); + // 动态渲染字段 + renderDynamicCheckinFields(); } function updateCheckinButtonState() { @@ -979,11 +978,14 @@ setVal('form-name', user.name); setVal('form-phone', user.phone); - setVal('form-company', user.industry_company); - // Clear other optional fields to avoid carrying over data if user switches - setVal('form-position', user.position); // Note: user.position might not exist in search result - setVal('form-business', user.business_scope); - setVal('form-vision', user.vision_2026); + // 动态字段填充 + const fc = CONFIG.checkin_field_config || {}; + Object.keys(fc).forEach(key => { + if (key === 'name' || key === 'phone') return; + // 特殊映射:company_name 字段填充 industry_company 的值 + const fieldKey = (key === 'company_name') ? 'industry_company' : key; + setVal('form-' + key, user[fieldKey] || ''); + }); // Display preview if (document.getElementById('display-name')) document.getElementById('display-name').textContent = user.name; @@ -1014,18 +1016,22 @@ return el ? el.value : ''; }; + // 构建 payload const payload = { gsdh_id: getVal('gsdh-id'), name: getVal('form-name'), phone: getVal('form-phone'), verification_code: getVal('form-verification-code'), - company_name: getVal('form-company'), - position: getVal('form-position'), - business_scope: getVal('form-business'), - vision_2026: getVal('form-vision'), location: getVal('form-location') }; + // 动态收集签到字段数据 + const fc = CONFIG.checkin_field_config || {}; + Object.keys(fc).forEach(key => { + if (key === 'name' || key === 'phone') return; + payload[key] = getVal('form-' + key); + }); + try { const response = await fetch('/api/checkin', { method: 'POST', diff --git a/templates/wall.html b/templates/wall.html index 4243633..c9f97e9 100644 --- a/templates/wall.html +++ b/templates/wall.html @@ -217,6 +217,35 @@ -webkit-text-fill-color: transparent; } + .card-position { + font-size: 1.2rem; + color: var(--primary-color); + margin-bottom: 15px; + } + + .card-vision { + font-size: 1.4rem; + color: #dbe4ff; + font-style: italic; + margin-top: 15px; + } + + .card-scope { + font-size: 1.2rem; + color: #dbe4ff; + margin-top: 10px; + } + + .card-custom-field { + font-size: 1.2rem; + color: #dbe4ff; + margin-top: 10px; + padding: 8px 15px; + background: rgba(255,255,255,0.05); + border-radius: 8px; + display: inline-block; + } + /* Stats Counter */ .stats-counter { position: absolute; @@ -241,6 +270,53 @@ color: #aaa; } + /* 二维码容器 */ + .qrcode-container { + position: fixed; + top: 50%; + right: 40px; + transform: translateY(-50%); + z-index: 25; + animation: fadeInUp 0.6s ease-out; + } + + .qrcode-box { + background: rgba(10, 20, 40, 0.9); + backdrop-filter: blur(20px); + -webkit-backdrop-filter: blur(20px); + border: 2px solid rgba(0, 242, 255, 0.5); + border-radius: 16px; + padding: 20px; + box-shadow: 0 10px 40px rgba(0, 0, 0, 0.5), 0 0 20px rgba(0, 242, 255, 0.2); + } + + .qrcode-title { + font-size: 1rem; + font-weight: bold; + color: #fff; + text-align: center; + margin-bottom: 12px; + text-shadow: 0 0 10px rgba(0, 242, 255, 0.5); + } + + .qrcode-image { + width: 150px; + height: 150px; + border-radius: 8px; + border: 1px solid rgba(255, 255, 255, 0.2); + } + + @keyframes fadeInUp { + from { + opacity: 0; + transform: translateY(-50%) translateX(20px); + } + to { + opacity: 1; + transform: translateY(-50%) translateX(0); + } + } + /* Mobile Learn More Button */ .mobile-btn-container { display: none; @@ -298,9 +374,6 @@ height: 60px; font-size: 1.5rem; } - #card-extra { - font-size: 1rem !important; - } .stats-counter { bottom: 10px; right: 10px; @@ -309,6 +382,23 @@ .stats-number { font-size: 1.5rem; } + .qrcode-container { + position: fixed; + top: auto; + bottom: 80px; + right: 50%; + transform: translateX(50%); + } + .qrcode-box { + padding: 12px; + } + .qrcode-title { + font-size: 0.9rem; + } + .qrcode-image { + width: 100px; + height: 100px; + } } @@ -332,25 +422,24 @@
- +
+ + + @@ -378,8 +467,10 @@ const isMobile = () => window.innerWidth <= 768; - const SHOW_VISION = {{ 'true' if show.vision_2026 != false else 'false' }}; - const SHOW_SCOPE = {{ 'true' if show.business_scope != false else 'false' }}; + // 大屏显示字段配置(从后端获取) + const WALL_SHOW_FIELDS = {{ config.wall_config.show_fields | tojson if config.wall_config and config.wall_config.show_fields else '{}' }}; + const CHECKIN_FIELD_CONFIG = {{ config.checkin_field_config | tojson if config.checkin_field_config else '{}' }}; + const WALL_CONFIG = {{ config.wall_config | tojson if config.wall_config else '{}' }}; // --- State --- let allUsers = []; // All fetched users @@ -400,6 +491,18 @@ if (isGridMode) arrangeGrid(); }); + // 控制二维码显示/隐藏 + const qrcodeContainer = document.getElementById('qrcode-container'); + if (qrcodeContainer) { + // 如果 show_qrcode 为 true 则显示,默认为 false + if (WALL_CONFIG.show_qrcode === true) { + qrcodeContainer.style.display = 'block'; + } + } + + // 随机图标列表 + const RANDOM_ICONS = ['🎯', '⭐', '🌟', '💫', '✨', '🎊', '🎉', '🎈', '🚀', '💎', '🏆', '🎖️', '🌈', '🦄', '🎪', '🎨', '🎭', '🎪', '🎯', '🎲']; + // --- Class: UserBubble --- class UserBubble { constructor(user) { @@ -408,15 +511,23 @@ this.element = document.createElement('div'); this.element.className = 'user-bubble'; - // Content - const name = user.name || '嘉宾'; - // Dynamic font size based on name length + const showName = WALL_SHOW_FIELDS.name !== false; + let bubbleContent; let fontSize = '0.9rem'; - if (name.length > 3) fontSize = '0.7rem'; - if (name.length > 4) fontSize = '0.6rem'; + + if (showName) { + const name = user.name || '嘉宾'; + if (name.length > 3) fontSize = '0.7rem'; + if (name.length > 4) fontSize = '0.6rem'; + bubbleContent = name; + } else { + const randomIndex = Math.floor(Math.random() * RANDOM_ICONS.length); + bubbleContent = RANDOM_ICONS[randomIndex]; + fontSize = '1.5rem'; + } this.element.innerHTML = ` -
${name}
+
${bubbleContent}
`; // Interaction: Click to show in spotlight @@ -665,29 +776,58 @@ const card = document.getElementById('card'); card.classList.remove('active'); - // Wait for fade out setTimeout(() => { - if(document.getElementById('card-name')) document.getElementById('card-name').textContent = user.name; - if(document.getElementById('card-position')) document.getElementById('card-position').textContent = user.position || ''; - if(document.getElementById('card-company')) document.getElementById('card-company').textContent = user.company_name || '嘉宾'; - if(document.getElementById('card-avatar')) document.getElementById('card-avatar').textContent = user.name ? user.name.charAt(0) : '?'; + const showName = WALL_SHOW_FIELDS.name !== false; + const cardHeader = document.getElementById('card-header'); - const extraDiv = document.getElementById('card-extra'); - if (extraDiv) { - if (SHOW_VISION && user.vision_2026) { - extraDiv.textContent = "🎯 " + user.vision_2026; - extraDiv.style.display = 'block'; - } else if (SHOW_SCOPE && user.business_scope) { - extraDiv.textContent = user.business_scope; - extraDiv.style.display = 'block'; - } else { - extraDiv.style.display = 'none'; - } + if (showName) { + cardHeader.style.display = 'flex'; + if(document.getElementById('card-name')) document.getElementById('card-name').textContent = user.name || ''; + if(document.getElementById('card-avatar')) document.getElementById('card-avatar').textContent = user.name ? user.name.charAt(0) : '?'; + } else { + cardHeader.style.display = 'none'; } + + renderCardFields(user); card.classList.add('active'); }, 800); } + /** + * 根据配置动态渲染卡片字段 + */ + function renderCardFields(user) { + const container = document.getElementById('card-fields'); + container.innerHTML = ''; + + let html = ''; + + Object.keys(WALL_SHOW_FIELDS).forEach(key => { + if (!WALL_SHOW_FIELDS[key]) return; + + const fieldConfig = CHECKIN_FIELD_CONFIG[key]; + if (!fieldConfig) return; + + const fieldValue = user[key] || ''; + + if (!fieldValue) return; + + if (key === 'company_name') { + html += `
${fieldValue}
`; + } else if (key === 'vision_2026') { + html += `
🎯 ${fieldValue}
`; + } else if (key === 'business_scope') { + html += `
${fieldValue}
`; + } else if (key === 'position') { + html += `
${fieldValue}
`; + } else { + html += `
${fieldValue}
`; + } + }); + + container.innerHTML = html; + } + function startSpotlight() { if (isMobile()) return; if (spotlightInterval) clearInterval(spotlightInterval);