diff --git a/lawrisk/api/v2.py b/lawrisk/api/v2.py index 7e713da..de0a57d 100644 --- a/lawrisk/api/v2.py +++ b/lawrisk/api/v2.py @@ -6,7 +6,12 @@ from flask import Blueprint, jsonify, request from concurrent.futures import ThreadPoolExecutor from lawrisk.services.lawrisk_v2_service import search_v2, list_regions -from lawrisk.services.licensing_repo import list_permits_for_region +from lawrisk.services.licensing_repo import ( + list_permits_for_region, + load_permits_and_risks, + list_region_theme_options, + load_theme_payload, +) from lawrisk.services.lawrisk_service import suggest_questions_embed v2_bp = Blueprint('lawrisk_v2', __name__, url_prefix='/fs-ai-asistant/api/workflow/lawrisk') @@ -58,7 +63,7 @@ def lawrisk_search_v2(): return jsonify({"success": False, "message": str(e), "data": {}}), 500 -@v2_bp.get('/v2/regions') +@v2_bp.route('/v2/regions', methods=['GET']) def lawrisk_regions(): """Get list of available regions.""" try: @@ -125,3 +130,123 @@ def _extract_params(): region_value = payload.get("region") or payload.get("region_id") return query, debug_flag, top_k_int, mode_value, region_value + + +@v2_bp.route('/admin/test', methods=['GET']) +def admin_test(): + """Simple test route.""" + return jsonify({"success": True, "message": "Test route works!"}) + + +@v2_bp.route('/test-simple', methods=['GET']) +def test_simple(): + """Very simple test.""" + return jsonify({"status": "ok"}) + + +@v2_bp.route('/admin/regions', methods=['GET']) +def admin_regions(): + """Get all regions for database maintenance.""" + try: + regions = list_regions() + return jsonify({"success": True, "data": {"regions": regions}}) + except Exception as exc: + print(f"admin_regions error: {exc}") + return jsonify({"success": False, "message": str(exc)}), 500 + + +@v2_bp.route('/admin/themes', methods=['GET']) +def admin_themes(): + """Get themes for a specific region.""" + region_value = request.args.get("region") or request.args.get("region_id") + + if not region_value or (isinstance(region_value, str) and not region_value.strip()): + return jsonify({"success": False, "message": "region is required", "data": {}}), 400 + + region_token = region_value.strip() if isinstance(region_value, str) else str(region_value) + + try: + catalog = list_region_theme_options() + region_id_lower = region_token.lower() + + themes = [] + seen_theme_ids = set() + + for item in catalog: + if (item["region_id"] == region_token or + item["region_id"].lower() == region_id_lower or + item["region_name"].lower() == region_id_lower): + theme_id = item["theme_id"] + if theme_id not in seen_theme_ids: + seen_theme_ids.add(theme_id) + themes.append({ + "id": theme_id, + "name": item["theme_name"], + "option_id": item["option_id"] + }) + + return jsonify({"success": True, "data": {"region": region_token, "themes": themes}}) + except Exception as exc: + print(f"admin_themes error: {exc}") + return jsonify({"success": False, "message": str(exc)}), 500 + + +@v2_bp.route('/admin/permits', methods=['GET']) +def admin_permits(): + """Get permits for a specific region-theme combination.""" + region_value = request.args.get("region") or request.args.get("region_id") + theme_value = request.args.get("theme") or request.args.get("theme_id") + + if not region_value or not theme_value: + return jsonify({"success": False, "message": "region and theme are required", "data": {}}), 400 + + region_token = region_value.strip() if isinstance(region_value, str) else str(region_value) + theme_token = theme_value.strip() if isinstance(theme_value, str) else str(theme_value) + + try: + permits = load_permits_and_risks(region_token, theme_token) + + return jsonify({ + "success": True, + "data": { + "region": region_token, + "theme": theme_token, + "permits": permits + } + }) + except Exception as exc: + print(f"admin_permits error: {exc}") + return jsonify({"success": False, "message": str(exc)}), 500 + + +@v2_bp.route('/admin/permit-details', methods=['GET']) +def admin_permit_details(): + """Get detailed information for a specific permit.""" + region_value = request.args.get("region") or request.args.get("region_id") + theme_value = request.args.get("theme") or request.args.get("theme_id") + permit_value = request.args.get("permit") or request.args.get("permit_id") + + if not region_value or not theme_value or not permit_value: + return jsonify({"success": False, "message": "region, theme, and permit are required", "data": {}}), 400 + + region_token = region_value.strip() if isinstance(region_value, str) else str(region_value) + theme_token = theme_value.strip() if isinstance(theme_value, str) else str(theme_value) + permit_token = permit_value.strip() if isinstance(permit_value, str) else str(permit_value) + + try: + permits = load_permits_and_risks(region_token, theme_token, permit_token) + + if not permits: + return jsonify({"success": False, "message": "Permit not found", "data": {}}), 404 + + return jsonify({ + "success": True, + "data": { + "region": region_token, + "theme": theme_token, + "permit": permits[0] + } + }) + except Exception as exc: + print(f"admin_permit_details error: {exc}") + return jsonify({"success": False, "message": str(exc)}), 500 diff --git a/static/db_admin.html b/static/db_admin.html new file mode 100644 index 0000000..d07552a --- /dev/null +++ b/static/db_admin.html @@ -0,0 +1,629 @@ + + +
+ + +LawRisk 法律风险提示系统 - 数据库维护与查询工具
+请先选择地区以查看可用主题
+