Refine login status bar UI in super_admin.html and db_admin.html

This commit is contained in:
Codex Agent 2025-12-18 11:51:43 +08:00
parent a3f6640b2d
commit b53fb872ed
5 changed files with 699 additions and 141 deletions

View File

@ -0,0 +1,494 @@
{
"data": {
"conversationId": "",
"conversationInfo": {},
"costStatistics": {},
"debug": {},
"executionSteps": [],
"executionTime": 2838,
"knowledgeSources": [],
"lawRisk": "",
"llmRespond": "",
"messageId": "",
"questionExtend": [
"燃气经营有什么法律风险需要注意?",
"关于开办农副食品加工企业有什么政策要求?",
"开办水产苗种生产企业需要办理哪些许可?",
"开办咖啡馆有什么法律风险需要注意?",
"关于开办母婴用品店有什么政策要求?"
],
"risk_subject": [
{
"display_name": "市级 · 开办咖啡馆",
"id": "2c29ca08-efc6-4e2c-abc2-d73685e0bdd1:b042fdb8-a996-4f32-bbe1-56c6cac8deed",
"permits": [
{
"binds_all_themes": false,
"business_scopes": [
{
"description": "酒吧服务。",
"id": "befdcf73-a25a-4534-bf63-b8c8fc88e7a3"
},
{
"description": "餐饮服务",
"id": "b7aa02e9-d6df-4b53-ba6f-80738d2abc11"
}
],
"id": "6c8ccda5-f157-46e6-9165-748872818b0e",
"jurisdiction_scope": null,
"name": "食品经营许可-餐饮服务",
"permit_file": {
"content_type": "",
"created_at": null,
"file_id": "",
"file_size": 0,
"filename": "",
"uploaded_by": ""
},
"permit_source": {
"source_detail": "",
"source_name": "",
"source_type": "",
"updated_at": null
},
"permit_status": "后置事项",
"responsible_contact": null,
"risks": [
{
"document_no": "2018年10月26日(第二次修正)",
"id": "538aff40-99fe-4436-923c-caf2df536537",
"legal_basis": "中华人民共和国大气污染防治法",
"risk_content": "1.禁止在居民住宅楼、未配套设立专用烟道的商住综合楼以及商住综合楼内与居住层相邻的商业楼层内新建、改建、扩建产生油烟、异味、废气的餐饮服务项目。",
"summary": "**第八十一条** 禁止在居民住宅楼、未配套设立专用烟道的商住综合楼以及商住综合楼内与居住层相邻的商业楼层内新建、改建、扩建产生油烟、异味、废气的餐饮服务项目。"
},
{
"document_no": "2018年12月29日第十三届全国人民代表大会常务委员会第七次会议《关于修改〈中华人民共和国劳动法〉等七部法律的决定》修正。",
"id": "9caaee46-0cd5-4c11-9909-4d7a2e8eb679",
"legal_basis": "中华人民共和国环境噪声污染防治法",
"risk_content": "2.从事营业性娱乐活动的酒吧经营管理者必须采取有效措施,使其边界噪声不超过国家规定的环境噪声排放标准。",
"summary": "**第四十三条** 新建营业性文化娱乐场所的边界噪声必须符合国家规定的环境噪声排放标准;不符合国家规定的环境噪声排放标准的,文化行政主管部门不得核发文化经营许可证,市场监督管理部门不得核发营业执照。"
},
{
"document_no": "食药监食监二2015228号",
"id": "2ebeccd1-fd4e-4b6f-82e7-369cba0d0444",
"legal_basis": "食品经营许可审查通则(试行)",
"risk_content": "3.食品经营场所和食品贮存场所距离粪坑、污水池、暴露垃圾场(站)、旱厕等污染源25米以上否则不予许可。",
"summary": "**第八条** 食品经营者应当具有与经营的食品品种、数量相适应的食品经营和贮存场所。食品经营场所和食品贮存场所不得设在易受到污染的区域距离粪坑、污水池、暴露垃圾场、旱厕等污染源25米以上。"
},
{
"document_no": "食药监食监二2015228号",
"id": "382a0426-8276-4062-b7be-bb6bece7004b",
"legal_basis": "食品经营许可审查通则(试行)",
"risk_content": "4.食品处理区内不得设置厕所,否则不予许可。",
"summary": "**第三十六条** 餐饮服务场所内设置厕所的,其出口附近应当设置洗手、消毒、烘干设施。食品处理区内不得设置厕所。"
},
{
"document_no": "2018年11月29日佛山市第十五届人民代表大会常务委员会第十六次会议通过 2019年3月28日广东省第十三届人民代表大会常务委员会第十一次会议批准",
"id": "a315d828-125e-44eb-ace0-47b04989c20c",
"legal_basis": "《佛山市排水管理条例》",
"risk_content": "5.各餐饮行业排水户在新建、改建、扩建排水设施时(包括装修、修缮等),必须建设隔油、隔渣等处理废水的设施。严禁将雨污水管道混接。",
"summary": "**第十二条** 我市实行雨水、污水分流排放制度,新建、改建、扩建排水设施应当按照排水规划建设雨水、污水分流排放设施,已经实行雨水、污水分流排放的%n区域不得将雨水管道和污水管道相互混接不得将污水排入雨水管网。"
},
{
"document_no": "国家食品药品监督管理总局令第37号",
"id": "36cd8b9a-18c2-4364-96d9-23a1e1842558",
"legal_basis": "《食品经营许可管理办法》",
"risk_content": "6.经营者在食品经营许可证有效期届满后还需继续经营的应当在该食品经营许可有效期届满30个工作日前提出延续申请否则许可证将被依法注销影响正常经营。",
"summary": "**第二十九条**%n食品经营者需要延续依法取得的食品经营许可的有效期的应当在该食品经营许可有效期届满30个工作日前向原发证的食品药品监督管理部门提出申请。%n**第三十七条**%n有下列情形之一食品经营者未按规定申请办理注销手续的原发证的食品药品监督管理部门应当依法办理食品经营许可注销手续%n- (一) 食品经营许可有效期届满未申请延续的;%n- (二) 食品经营者主体资格依法终止的;%n- (三) 食品经营许可依法被撤回、撤销或者食品经营许可证依法被吊销的;%n- (四) 因不可抗力导致食品经营许可事项无法实施的;%n- (五) 法律法规规定的应当注销食品经营许可的其他情形。 食品经营许可被注销的,许可证编号不得再次使用。"
},
{
"document_no": "国家食品药品监督管理总局令第37号",
"id": "56c724a9-a586-4d7b-b906-246e19409676",
"legal_basis": "《食品经营许可管理办法》",
"risk_content": "7.食品经营者应当妥善保管食品经营许可证,不得伪造、涂改、倒卖、出租、出借、转让。 食品经营者应当在经营场所的显著位置悬挂或者摆放食品经营许可证正本。",
"summary": "**第二十六条**%n食品经营者应当妥善保管食品经营许可证不得伪造、涂改、倒卖、出租、出借、转让。 食品经营者应当在经营场所的显著位置悬挂或者摆放食品经营许可证正本。"
},
{
"document_no": "中华人民共和国主席令第29号2021年二次修正",
"id": "b014e3b1-cc30-4563-bfcf-1d667ff22eab",
"legal_basis": "《中华人民共和国消防法》",
"risk_content": "饭店、酒吧等场所属于公众聚集场所的,未经消防救援机构许可的,不得投入使用、营业。",
"summary": "**第十五条** 公众聚集场所投入使用、营业前消防安全检查实行告知承诺管理。公众聚集场所在投入使用、营业前,建设单位或者使用单位应当向场所所在地的县级以上地方人民政府消防救援机构申请消防安全检查,作出场所符合消防技术标准和管理规定的承诺,提交规定的材料,并对其承诺和材料的真实性负责。%n消防救援机构对申请人提交的材料进行审查申请材料齐全、符合法定形式的应当予以许可。消防救援机构应当根据消防技术标准和管理规定及时对作出承诺的公众聚集场所进行核查。%n申请人选择不采用告知承诺方式办理的消防救援机构应当自受理申请之日起十个工作日内根据消防技术标准和管理规定对该场所进行检查。经检查符合消防安全要求的应当予以许可。%n公众聚集场所未经消防救援机构许可的不得投入使用、营业。"
}
],
"subitem_summary": "食品经营许可证核发、变更、延续、注销、补发",
"theme": {
"id": "b042fdb8-a996-4f32-bbe1-56c6cac8deed",
"name": "开办咖啡馆"
},
"themes": [
{
"id": "b042fdb8-a996-4f32-bbe1-56c6cac8deed",
"name": "开办咖啡馆"
}
]
}
],
"region": {
"id": "2c29ca08-efc6-4e2c-abc2-d73685e0bdd1",
"name": "市级"
},
"theme": {
"id": "b042fdb8-a996-4f32-bbe1-56c6cac8deed",
"name": "开办咖啡馆"
}
},
{
"display_name": "市级 · 开办咖啡馆/茶馆",
"id": "2c29ca08-efc6-4e2c-abc2-d73685e0bdd1:35f12ee5-3b8b-4119-91fd-f45e7b43c803",
"permits": [
{
"binds_all_themes": false,
"business_scopes": [],
"id": "a6b853b0-ce7c-4339-8f15-eb765b268be8",
"jurisdiction_scope": "禅城区的烟草专卖零售许可证由市烟草专卖局依法审批发放和管理。",
"name": "烟草专卖零售许可",
"permit_file": {
"content_type": "",
"created_at": null,
"file_id": "",
"file_size": 0,
"filename": "",
"uploaded_by": ""
},
"permit_source": {
"source_detail": "",
"source_name": "",
"source_type": "",
"updated_at": null
},
"permit_status": "后置事项",
"responsible_contact": null,
"risks": [
{
"document_no": "佛烟专202411号",
"id": "3a20aa56-9498-4387-94de-a4e5a34d3b36",
"legal_basis": "佛山市烟草制品零售点合理布局规定",
"risk_content": "1.市场单元内现有零售点总数达到或超过上限指导数量的,不再新增零售点。",
"summary": "**第八条** 市场单元内现有零售点总数达到或超过上限指导数量的,不再新增零售点,按照“先退后进、退一进一”和“行政许可受理在先”的原则进行轮候。轮候规则按照《广东省烟草专卖零售许可证办理排队轮候管理制度》执行。"
},
{
"document_no": "佛烟专202411号",
"id": "20b40aec-27b2-4f4f-aeb4-4c9efc19d953",
"legal_basis": "佛山市烟草制品零售点合理布局规定",
"risk_content": "10.烟草制品零售经营场所里应具备对外经营烟草制品的基本设施和条件,并应形成商品展卖区域。",
"summary": "**第十三条** 下列区域不予设置零售点:%n- (十二) 经营场所内未形成商品实际展卖区域或明显不具备对外经营烟草制品的基本设施和条件的;"
},
{
"document_no": "佛烟专202411号",
"id": "b2a3dd8f-40b6-4fa5-ba08-6b21622bd31e",
"legal_basis": "佛山市烟草制品零售点合理布局规定",
"risk_content": "11.同一经营场所已经办理烟草专卖零售许可证,且该许可证在有效期内的,不予设置烟草制品零售点。",
"summary": "**第十三条** 下列区域不予设置零售点:%n- (十三) 同一经营场所已经办理烟草专卖零售许可证,且该许可证在有效期内的;"
},
{
"document_no": "国烟法2020205号",
"id": "77bfdfa0-1812-474f-b897-2e9d79ac6d44",
"legal_basis": "烟草专卖许可证管理办法实施细则",
"risk_content": "11.同一经营场所已经办理烟草专卖零售许可证,且该许可证在有效期内的,不予设置烟草制品零售点。",
"summary": "**第四十条** 一个经营场所已经办理了烟草专卖零售许可证的,在许可证有效期内不再审批发放其他烟草专卖零售许可证。"
},
{
"document_no": "国烟法2020205号",
"id": "a9495605-88c4-4fe6-ab86-1dcd9248fba1",
"legal_basis": "烟草专卖许可证管理办法实施细则",
"risk_content": "12.外商投资的商业企业或者个体工商户不得从事烟草专卖品零售业务。",
"summary": "**第二十条** 设立外商投资的烟草专卖生产企业需经国家烟草专卖局审批。%n外商投资的商业企业或者个体工商户不得从事烟草专卖品批发业务。外商投资的商业企业或者个体工商户不得从事烟草专卖品零售业务不得以特许、吸纳加盟店及其他再投资等形式变相从事烟草专卖品经营。"
},
{
"document_no": "佛烟专202411号",
"id": "f91facf7-43f7-4097-aabc-ed2ed90cacff",
"legal_basis": "佛山市烟草制品零售点合理布局规定",
"risk_content": "12.外商投资的商业企业或者个体工商户不得从事烟草专卖品零售业务。",
"summary": "**第十二条** 具有下列情形之一的,不予发放烟草专卖零售许可证:%n……%n- (十) 外商投资的商业企业(包括中外合资企业、中外合作企业、外商独资企业、港澳台地区投资企业等)或者个体工商户。但以提供住宿、餐饮、休闲、娱乐为主要经营范围且烟草零售业态为娱乐服务类的宾馆、酒店等企业除外;%n……"
},
{
"document_no": "中华人民共和国工业和信息化部令第37号",
"id": "9febac28-e2fd-494b-8f41-64ffec79c51b",
"legal_basis": "烟草专卖许可证管理办法",
"risk_content": "12.外商投资的商业企业或者个体工商户不得从事烟草专卖品零售业务。",
"summary": "**第十七条** 外商投资的商业企业或者个体工商户不得从事烟草专卖品批发或者零售业务,不得以特许、吸纳加盟店及其他再投资等形式变相从事烟草专卖品经营业务。"
},
{
"document_no": "佛烟专202411号",
"id": "51f5ef45-8307-4a70-a776-d3c1d675e7c0",
"legal_basis": "佛山市烟草制品零售点合理布局规定",
"risk_content": "13.不得利用自动售货机或者其他自动售货形式,销售或者变相销售烟草制品。不得通过信息网络销售烟草专卖品。",
"summary": "**第十二条** 具有下列情形之一的,不予发放烟草专卖零售许可证:%n……%n- (七) 利用自动售货机(柜)或者其他自动售货形式销售烟草制品的;%n- (八) 利用游戏、博彩等设备或利用游戏、博彩等方式变相销售烟草制品的;%n- (九) 通过信息网络销售烟草制品的;%n……"
},
{
"document_no": "中华人民共和国工业和信息化部令第37号",
"id": "f1acba29-b502-4fe7-957f-fef6d76f0721",
"legal_basis": "烟草专卖许可证管理办法",
"risk_content": "13.不得利用自动售货机或者其他自动售货形式,销售或者变相销售烟草制品。不得通过信息网络销售烟草专卖品。",
"summary": "**第四十条** 公民、法人或者其他组织不得利用自动售货机销售烟草制品。%n除了取得烟草专卖生产企业许可证或者烟草专卖批发企业许可证的企业依法销售烟草专卖品外任何公民、法人或者其他组织不得通过信息网络销售烟草专卖品。"
},
{
"document_no": "国烟法2020205号",
"id": "4c72eb21-fbe0-4d6d-8f55-fa00c05d69ce",
"legal_basis": "烟草专卖许可证管理办法实施细则",
"risk_content": "13.不得利用自动售货机或者其他自动售货形式,销售或者变相销售烟草制品。不得通过信息网络销售烟草专卖品。",
"summary": "**第五十一条** 公民、法人或者其他组织不得利用自动售货机或者其他自动售货形式,销售或者变相销售烟草制品。%n除了取得烟草专卖生产企业许可证或者烟草专卖批发企业许可证的企业依法销售烟草专卖品外任何公民、法人或者其他组织不得通过信息网络销售烟草专卖品。"
},
{
"document_no": "中华人民共和国工业和信息化部令第37号",
"id": "5abf4c6e-67f6-402c-a642-9eb462465c4d",
"legal_basis": "烟草专卖许可证管理办法",
"risk_content": "14.未领取烟草专卖零售许可证经营烟草专卖品业务一年内被行政处罚两次以上或被追究刑事责任的,在三年内申请领取烟草专卖零售许可证的,不予发放烟草专卖零售许可证。",
"summary": "**第二十五条** 有下列情形之一的,不予发放烟草专卖零售许可证:%n ……%n- (六) 未领取烟草专卖零售许可证经营烟草专卖品业务,并且一年内被执法机关处罚两次以上,在三年内申请领取烟草专卖零售许可证的;%n- (七) 国家烟草专卖局规定的其他不予发证的情形。"
},
{
"document_no": "佛烟专202411号",
"id": "1a2fe432-014e-4c7f-a26d-bb2ea4e80bf4",
"legal_basis": "佛山市烟草制品零售点合理布局规定",
"risk_content": "14.未领取烟草专卖零售许可证经营烟草专卖品业务一年内被行政处罚两次以上或被追究刑事责任的,在三年内申请领取烟草专卖零售许可证的,不予发放烟草专卖零售许可证。",
"summary": "**第十二条** 具有下列情形之一的,不予发放烟草专卖零售许可证:%n- (五) 未领取烟草专卖零售许可证经营烟草专卖品业务,并且一年内被执法机关处罚两次以上,在三年内申请烟草专卖零售许可证的;%n- (六) 未领取烟草专卖零售许可证经营烟草专卖品业务被追究刑事责任,在三年内申请领取烟草专卖零售许可证的;"
},
{
"document_no": "国烟法2020205号",
"id": "bec0d6d4-6c35-4bde-9e78-e5144568b3fd",
"legal_basis": "烟草专卖许可证管理办法实施细则",
"risk_content": "14.未领取烟草专卖零售许可证经营烟草专卖品业务一年内被行政处罚两次以上或被追究刑事责任的,在三年内申请领取烟草专卖零售许可证的,不予发放烟草专卖零售许可证。",
"summary": "**第十九条** 未领取烟草专卖零售许可证经营烟草专卖品业务被追究刑事责任在3年内申请领取烟草专卖零售许可证的属于《烟草专卖许可证管理办法》%n**第二十五条**第七项规定的其他不予发证的情形。"
},
{
"document_no": "中华人民共和国工业和信息化部令第37号",
"id": "95f1dfa4-e7bf-4199-9eec-6e506ea4fd85",
"legal_basis": "烟草专卖许可证管理办法",
"risk_content": "15.因申请人隐瞒有关情况或者提供虚假材料,烟草专卖局作出不予受理或者不予发证决定后,申请人一年内再次提出申请的,不予发放烟草专卖零售许可证。",
"summary": "**第二十五条** 有下列情形之一的,不予发放烟草专卖零售许可证:%n……%n- (四) 因申请人隐瞒有关情况或者提供虚假材料,烟草专卖局作出不予受理或者不予发证决定后,申请人一年内再次提出申请的;"
},
{
"document_no": "佛烟专202411号",
"id": "ae6b7219-076b-4b55-9235-cea172f46126",
"legal_basis": "佛山市烟草制品零售点合理布局规定",
"risk_content": "15.因申请人隐瞒有关情况或者提供虚假材料,烟草专卖局作出不予受理或者不予发证决定后,申请人一年内再次提出申请的,不予发放烟草专卖零售许可证。",
"summary": "**第十二条** 具有下列情形之一的,不予发放烟草专卖零售许可证:%n- (三) 因申请人隐瞒有关情况或者提供虚假材料,烟草专卖局作出不予受理或者不予发证决定后,申请人一年内再次提出申请的;"
},
{
"document_no": "中华人民共和国工业和信息化部令第37号",
"id": "7ab0f3e7-c88d-48ae-9335-c589cc28a81d",
"legal_basis": "烟草专卖许可证管理办法",
"risk_content": "16.因申请人以欺骗、贿赂等不正当手段取得的烟草专卖许可证被撤销后,申请人三年内再次提出申请的,不予发放烟草专卖零售许可证。",
"summary": "**第二十五条** 有下列情形之一的,不予发放烟草专卖零售许可证:%n- (五) 因申请人以欺骗、贿赂等不正当手段取得的烟草专卖许可证被撤销后,申请人三年内再次提出申请的;"
},
{
"document_no": "佛烟专202411号",
"id": "8c4dbe03-27fb-4a48-b2bc-2ef53ebacfc5",
"legal_basis": "佛山市烟草制品零售点合理布局规定",
"risk_content": "16.因申请人以欺骗、贿赂等不正当手段取得的烟草专卖许可证被撤销后,申请人三年内再次提出申请的,不予发放烟草专卖零售许可证。",
"summary": "**第十二条** 具有下列情形之一的,不予发放烟草专卖零售许可证:%n- (四) 因申请人以欺骗、贿赂等不正当手段取得的烟草专卖许可证被撤销后,申请人三年内再次提出申请的;"
},
{
"document_no": "佛烟专202411号",
"id": "6dcc11ec-8608-46be-9a84-a0d006400d3f",
"legal_basis": "佛山市烟草制品零售点合理布局规定",
"risk_content": "17.被取消从事烟草专卖业务资格不满三年的,不予发放烟草专卖零售许可证。",
"summary": "**第十二条** 具有下列情形之一的,不予发放烟草专卖零售许可证:%n- (二) 取消从事烟草专卖业务资格不满三年的;"
},
{
"document_no": "中华人民共和国工业和信息化部令第37号",
"id": "079f4b6c-d0d7-4685-b297-9cf4b1074f89",
"legal_basis": "烟草专卖许可证管理办法",
"risk_content": "17.被取消从事烟草专卖业务资格不满三年的,不予发放烟草专卖零售许可证。",
"summary": "**第二十五条** 有下列情形之一的,不予发放烟草专卖零售许可证:%n……%n- (三) 取消从事烟草专卖业务资格不满三年的;"
},
{
"document_no": "佛烟专202411号",
"id": "caa3974b-692b-44f8-93a0-0eab8db5d0de",
"legal_basis": "佛山市烟草制品零售点合理布局规定",
"risk_content": "18.申请人为未成年人、限制民事行为能力人及无民事行为能力人的,不予发放烟草专卖零售许可证。",
"summary": "**第十二条** 具有下列情形之一的,不予发放烟草专卖零售许可证:%n- (一) 申请人为未成年人、限制民事行为能力人及无民事行为能力人的;"
},
{
"document_no": "中华人民共和国工业和信息化部令第37号",
"id": "a4ea03d2-7670-4ecc-8af4-ddc0335c2fd5",
"legal_basis": "烟草专卖许可证管理办法",
"risk_content": "19.连锁经营企业应当由各分店分别向所在地烟草专卖局提出许可申请",
"summary": "**第十六条** 连锁经营企业在申请烟草专卖零售许可证时,应当由各个分店分别向所在地烟草专卖局提出申请。"
},
{
"document_no": "佛烟专202411号",
"id": "14cb9c08-6773-456b-a5dd-c6c3c4effb49",
"legal_basis": "佛山市烟草制品零售点合理布局规定",
"risk_content": "2.不满足市场单元间距要求的,不予设置烟草制品零售点。",
"summary": "**第九条** 本市行政区域内新增零售点按以下间距标准设置:%n- (一) A类市场单元零售点间距不少于40米%n- (二) B类市场单元零售点间距不少于50米。"
},
{
"document_no": "中华人民共和国工业和信息化部令第37号",
"id": "2125984f-404b-44a2-b984-4636c01f416a",
"legal_basis": "烟草专卖许可证管理办法",
"risk_content": "20.经营者应当依法使用并妥善保管许可证,应当将取得的烟草专卖许可证正本摆放在经营场所的显著位置。不得买卖、出租、出借或者以其他形式非法转让烟草专卖许可证。",
"summary": "**第四十一条** 任何企业或者个人不得涂改、伪造、变造烟草专卖许可证。不得买卖、出租、出借或者以其他形式非法转让烟草专卖许可证。"
},
{
"document_no": "中华人民共和国工业和信息化部令第37号",
"id": "8179c8cb-4e97-4cb0-a157-0748341eebab",
"legal_basis": "烟草专卖许可证管理办法",
"risk_content": "20.经营者应当依法使用并妥善保管许可证,应当将取得的烟草专卖许可证正本摆放在经营场所的显著位置。不得买卖、出租、出借或者以其他形式非法转让烟草专卖许可证。",
"summary": "**第三十条** 烟草专卖许可证的持证人应当将取得的烟草专卖许可证正本摆放在经营场所的显著位置。"
},
{
"document_no": "中华人民共和国工业和信息化部令第37号",
"id": "95bae860-4e7c-43e7-8bd6-0eddb22302a6",
"legal_basis": "烟草专卖许可证管理办法",
"risk_content": "21.持证人改变经营地址(因道路规划、城市建设等客观原因除外)的,应当重新申领烟草专卖许可证;在许可证有效期内,许可证的其他登记事项发生改变的,应当及时提出变更申请。",
"summary": "**第三十一条** 烟草专卖许可证的持证人改变经营地址(因道路规划、城市建设等客观原因除外)或者具有国家烟草专卖局规定的其他情形的,应当重新申领烟草专卖许可证;所持有的烟草专卖许可证其他登记事项发生改变的,应当及时变更烟草专卖许可证。"
},
{
"document_no": "国烟法2020205号",
"id": "4514790c-564b-4512-a46b-7fdf774cd0bb",
"legal_basis": "烟草专卖许可证管理办法实施细则",
"risk_content": "21.持证人改变经营地址(因道路规划、城市建设等客观原因除外)的,应当重新申领烟草专卖许可证;在许可证有效期内,许可证的其他登记事项发生改变的,应当及时提出变更申请。",
"summary": "**第二十一条** ……%n 烟草专卖零售许可证有效期内,企业名称、个体工商户名称、法定代表人或其他组织负责人、经营者姓名以及经营地址名称等登记事项发生改变,以及企业类型发生改变但经营主体未变化的,持证人应当及时提出变更申请。%n 家庭经营的个体工商户,持证人在家庭成员间变化的,可以申请变更烟草专卖零售许可证。因道路规划、城市建设等客观原因造成从核定经营地址变更到原发证机关辖区内其他地址经营的,持证人应当提前提出变更申请。%n 变更许可范围的,持证人应当提前提出变更申请。"
},
{
"document_no": "中华人民共和国工业和信息化部令第37号",
"id": "8b50ced4-ab37-4030-a607-6031b6d4aefc",
"legal_basis": "烟草专卖许可证管理办法",
"risk_content": "22.发生变更事项的,持证人应当及时办理许可证变更申请,否则会被责令进行整顿,严重者将会面临罚款等处罚,影响正常经营。",
"summary": "**第四十四条** 有下列情形之一的,发证机关可以责令持证人暂停烟草专卖业务、进行整顿,直至依法取消其从事烟草专卖业务的资格:%n ……%n- (九) 登记事项发生改变,拒绝变更登记的;%n ……%n**第五十七条** 违反本办法规定不及时办理烟草专卖许可证变更、注销手续的由烟草专卖局责令改正拒不改正的处以1000元以下的罚款。"
},
{
"document_no": "中华人民共和国工业和信息化部令第37号",
"id": "31b07992-a5b0-46f7-b3bf-91d0aebca970",
"legal_basis": "烟草专卖许可证管理办法",
"risk_content": "23.持证人在烟草专卖许可证有效期届满后需要继续经营的,应当在有效期届满三十日前提出延续申请,否则许可证将被依法注销,影响正常经营。",
"summary": "**第三十二条** 烟草专卖许可证有效期届满需要继续生产经营的,应当在该烟草专卖许可证有效期届满三十日前向原发证机关提出延续申请。%n%n**第四十八条** 有下列情形之一的,发证机关应当依法注销烟草专卖许可证:%n- (一) 烟草专卖许可证有效期限届满未延续的;%n……"
},
{
"document_no": "中华人民共和国工业和信息化部令第37号",
"id": "e6af2345-0a22-4aeb-8b83-643128ca0a46",
"legal_basis": "烟草专卖许可证管理办法",
"risk_content": "24.持证人在烟草专卖许可证有效期届满后需要继续经营的,但因生产经营能力、条件发生重大变化导致不符合法定条件的或者有严重违法行为的,将不予延续。",
"summary": "**第三十三条** 烟草专卖许可证有效期届满需要继续生产经营的,因生产经营能力、条件发生重大变化导致不符合法定条件的或者有严重违法行为的,不予延续。"
},
{
"document_no": "中华人民共和国主席令%n(第五十七号)",
"id": "7dcfb931-06ea-43d9-9b41-fe62bc84205b",
"legal_basis": "中华人民共和国未成年人保护法",
"risk_content": "3.禁止向未成年人销售烟。",
"summary": "**第五十九条**学校、幼儿园周边不得设置烟、酒、彩票销售网点。禁止向未成年人销售烟、酒、彩票或者兑付彩票奖金。烟、酒和彩票经营者应当在显著位置设置不向未成年人销售烟、酒或者彩票的标志;对难以判明是不是未成年人的,应当要求其出示身份证件。%n  任何人不得在学校、幼儿园和其他未成年人集中活动的公共场所吸烟、饮酒。"
},
{
"document_no": "国烟法2020205号",
"id": "4d4d7134-602c-4525-ae28-4877679ab11d",
"legal_basis": "烟草专卖许可证管理办法实施细则",
"risk_content": "3.禁止向未成年人销售烟。",
"summary": "**第五十条** 烟草专卖零售许可证的持证人不得向未成年人销售烟草制品,对难以判明是否是未成年人的,应当要求其出示身份证件;经营场所显著位置应设置相关禁止销售标志。"
},
{
"document_no": "佛烟专202411号",
"id": "b8957c37-31af-41d3-9e9d-03c2d66306a9",
"legal_basis": "佛山市烟草制品零售点合理布局规定",
"risk_content": "4.烟草制品零售经营场所应为固定经营场所,且与住所相独立。",
"summary": "**第十三条** 下列区域不予设置零售点:%n- (一) 无固定经营场所的,包括但不限于流动摊点(车、棚、柜)、违章建筑、集装箱房、临时建筑或城市规划内待拆迁建筑等;%n- (二) 经营场所不与住所相互独立,无法明确划分的,包括但不限于经营场所为住所的客厅、餐厅、卧室、阳台、地下室、储藏室等的;"
},
{
"document_no": "中华人民共和国工业和信息化部令第37号",
"id": "4418a191-fe24-4f99-8715-bd6dfa9ca46a",
"legal_basis": "烟草专卖许可证管理办法",
"risk_content": "4.烟草制品零售经营场所应为固定经营场所,且与住所相独立。",
"summary": "**第十三条** 申请烟草专卖零售许可证,应当具备下列条件:%n- (一) 有与经营烟草制品零售业务相适应的资金;%n- (二) 有与住所相独立的固定经营场所;%n- (三) 符合当地烟草制品零售点合理布局的要求;%n- (四) 国家烟草专卖局规定的其他条件。"
},
{
"document_no": "1997年7月3日中华人民共和国国务院令第223号发布 根据2013年7月18日《国务院关于废止和修改部分行政法规的决定》第一次修订 根据2016年2月6日《国务院关于修改部分行政法规的决定》第二次修订 根据2021年11月10日《国务院关于修改〈中华人民共和国烟草专卖法实施条例〉的决定》第三次修订",
"id": "bc662e22-5501-42d2-b1f2-fc9afe372a21",
"legal_basis": "中华人民共和国烟草专卖法实施条例",
"risk_content": "4.烟草制品零售经营场所应为固定经营场所,且与住所相独立。",
"summary": "**第九条** 取得烟草专卖零售许可证,应当具备下列条件:%n- (一) 有与经营烟草制品零售业务相适应的资金;%n- (二) 有固定的经营场所;%n- (三) 符合烟草制品零售点合理布局的要求;%n- (四) 国务院烟草专卖行政主管部门规定的其他条件。"
},
{
"document_no": "佛烟专202411号",
"id": "56bcf7b6-e445-4c9e-b482-608627392731",
"legal_basis": "佛山市烟草制品零售点合理布局规定",
"risk_content": "5.烟草制品零售经营场所不得设立在中、小学校、幼儿园周边,经营场所的选址应当符合距离要求。",
"summary": "**第十三条** 下列区域不予设置零售点:%n- (七) 中小学校进出通道口100米距离以内中小学校包括普通中小学校、特殊教育学校、中等职业学校、专门学校等各类培训教育机构、托管班等除外%n- (八) 幼儿园进出通道口50米距离以内幼儿园是指经教育行政主管部门依法批准的公办和民办全日制、寄宿制、半日制幼儿园及小学附设的学前班、幼儿班。各类培训教育机构、托管班、早教班等除外"
},
{
"document_no": "中华人民共和国工业和信息化部令第37号",
"id": "08938103-bbad-43d3-b61d-bae0f62d8dc0",
"legal_basis": "烟草专卖许可证管理办法",
"risk_content": "5.烟草制品零售经营场所不得设立在中、小学校、幼儿园周边,经营场所的选址应当符合距离要求。",
"summary": "**第二十五条** 有下列情形之一的,不予发放烟草专卖零售许可证:%n……%n- (二) 中、小学校周围;%n……"
},
{
"document_no": "中华人民共和国工业和信息化部令第37号",
"id": "c8b6a7bf-2129-4c0b-86e2-2e5c816cc36a",
"legal_basis": "烟草专卖许可证管理办法",
"risk_content": "6.烟草制品零售经营场所不得为生产经营有毒、有害、易燃、易爆物品等存在安全隐患不适宜经营卷烟的场所。",
"summary": "**第二十五条** 有下列情形之一的,不予发放烟草专卖零售许可证:%n- (一) 经营场所基于安全因素不适宜经营卷烟的;%n……"
},
{
"document_no": "佛烟专202411号",
"id": "8ac929f3-cf68-4cc3-be09-7cb696346490",
"legal_basis": "佛山市烟草制品零售点合理布局规定",
"risk_content": "6.烟草制品零售经营场所不得为生产经营有毒、有害、易燃、易爆物品等存在安全隐患不适宜经营卷烟的场所。",
"summary": "**第十三条** 下列区域不予设置零售点:%n- (三) 经营场所存在安全隐患,且不具备安全措施保障,不适宜经营卷烟的,包括但不限于经营易燃易爆品、化工原料及产品、机油制品、天然气销售、建材装潢、废品回收、装饰材料、皮革及皮制品养护服务、书店、书画坊、服装销售、床上用品、家具家私、祭祀用品、塑料制品、手工榨油坊等的(具备安全措施保障的加油站便利店除外);%n- (四) 生产、销售、存储、运输有毒有害及容易造成烟草制品污染的物品的,包括但不限于主营油漆化工五金、农药、洗涤、自行车摩托车维修、家电汽配维修、汽车美容、生鲜蔬菜水果、美容美发、美甲、生鲜肉品、盐焗食品、海产品、散装酒类、家禽、兽医饲料、宠物及用品服务销售等"
},
{
"document_no": "佛烟专202411号",
"id": "16eb2ba4-124f-4f56-8027-a81ee474c556",
"legal_basis": "佛山市烟草制品零售点合理布局规定",
"risk_content": "7.烟草制品零售经营场所不得为服务对象主要为未成年人或经营场所以公众身体健康为目的设立的场所。",
"summary": "**第十三条** 下列区域不予设置零售点:%n- (五) 对于服务对象主要为未成年人或经营场所以公众身体健康为目的设立的,包括但不限于主营母婴用品、文具玩具、体育用品、医药用品、医疗保健、中药凉茶的经营场所及儿童游乐场、培训教育机构等;"
},
{
"document_no": "佛烟专202411号",
"id": "23e47f40-4fa3-4918-8cf2-484d9046cf35",
"legal_basis": "佛山市烟草制品零售点合理布局规定",
"risk_content": "8.烟草制品零售经营场所不得为经营的主业务及物品与烟草制品的物理特性明显不相符,与经营烟、酒、副食品无关的经营场所。",
"summary": "**第十三条** 下列区域不予设置零售点:%n- (六) 经营的主业务及物品与烟草制品的物理特性明显不相符,与经营烟、酒、副食品无关的经营场所,包括但不限于主营通信器材、电子商品、汽车租赁、中介劳务、文化体育、寄递服务、保安室、照相馆、打印店、培训机构、花店、金融证券、家私家电、实验仪器、金银珠宝、送水店(站)、房屋中介、钟表维修等;"
},
{
"document_no": "佛烟专202411号",
"id": "512a314f-4cc5-4795-9936-e9729a695c9b",
"legal_basis": "佛山市烟草制品零售点合理布局规定",
"risk_content": "9.不得在特定区域或场所设立烟草制品零售点",
"summary": "**第十三条** 下列区域不予设置零售点:%n- (九) 政府、行业规定禁止或不宜经营烟草制品类商品的区域,包括但不限于党政机关内部、医疗机构内部等;%n- (十) 专业商业办公用楼(写字楼),除平层全开放式门店外的其他场所,包括但不限于非公共楼层、天台、地下车库、消防通道等;%n- (十一) 无敞开式经营门面的经营场所或经营场所位于封闭式小区、住宅楼、厂房内等 (不含沿街店面)"
}
],
"subitem_summary": "烟草专卖零售许可证新办、变更、延续、停业、恢复营业、歇业、补办",
"theme": {
"id": "35f12ee5-3b8b-4119-91fd-f45e7b43c803",
"name": "开办咖啡馆/茶馆"
},
"themes": [
{
"id": "35f12ee5-3b8b-4119-91fd-f45e7b43c803",
"name": "开办咖啡馆/茶馆"
}
]
}
],
"region": {
"id": "2c29ca08-efc6-4e2c-abc2-d73685e0bdd1",
"name": "市级"
},
"theme": {
"id": "35f12ee5-3b8b-4119-91fd-f45e7b43c803",
"name": "开办咖啡馆/茶馆"
}
},
{
"display_name": "市级 · 开办咖啡馆、茶馆",
"id": "2c29ca08-efc6-4e2c-abc2-d73685e0bdd1:48af6f3f-d72e-4d24-a75b-cb742471a842",
"permits": [],
"region": {
"id": "2c29ca08-efc6-4e2c-abc2-d73685e0bdd1",
"name": "市级"
},
"theme": {
"id": "48af6f3f-d72e-4d24-a75b-cb742471a842",
"name": "开办咖啡馆、茶馆"
}
}
],
"roundNumber": 0,
"totalKnowledgeSources": 0,
"workflowStatus": "ok",
"workflowTrackingId": ""
},
"message": "OK",
"success": true
}

View File

@ -200,6 +200,7 @@ def _get_preset_questions_pool() -> List[str]:
SELECT DISTINCT t.name AS theme_name
FROM themes t
JOIN region_theme_permits rtp ON rtp.theme_id = t.id
WHERE t.name NOT IN ('不涉及', '', '所有主题事项')
ORDER BY t.name
"""

View File

@ -3247,7 +3247,7 @@ def load_permits_and_risks(
params: List[Any] = [region_id]
theme_filter = theme_id if (theme_id and not _is_all_theme_marker(theme_id)) else None
if theme_filter:
sql += " AND rtp.theme_id = %s"
sql += " AND (rtp.theme_id = %s OR t.name = '所有主题事项')"
params.append(theme_filter)
if permit_id is not None:
sql += " AND rtp.permit_id = %s"

View File

@ -1,5 +1,6 @@
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
@ -23,7 +24,7 @@
margin: 0 auto;
background: white;
border-radius: 12px;
box-shadow: 0 10px 40px rgba(0,0,0,0.2);
box-shadow: 0 10px 40px rgba(0, 0, 0, 0.2);
padding: 30px;
}
@ -116,6 +117,7 @@
opacity: 0;
transform: translateY(10px);
}
to {
opacity: 1;
transform: translateY(0);
@ -127,6 +129,7 @@
opacity: 0;
transform: translateX(100px);
}
to {
opacity: 1;
transform: translateX(0);
@ -138,6 +141,7 @@
opacity: 1;
transform: translateX(0);
}
to {
opacity: 0;
transform: translateX(100px);
@ -147,13 +151,12 @@
.user-bar {
position: absolute;
right: 24px;
top: 50%;
transform: translateY(-50%);
padding: 12px 16px;
border: 1px solid #e5e7eb;
border-radius: 16px;
background: rgba(255, 255, 255, 0.98);
box-shadow: 0 8px 24px rgba(0, 0, 0, 0.12);
top: 24px;
padding: 0;
border: none;
border-radius: 0;
background: transparent;
box-shadow: none;
display: flex;
align-items: center;
gap: 14px;
@ -161,8 +164,8 @@
}
.user-bar:hover {
box-shadow: 0 12px 32px rgba(0, 0, 0, 0.16);
border-color: #d1d5db;
box-shadow: none;
border-color: transparent;
}
.user-avatar {
@ -186,6 +189,7 @@
gap: 3px;
color: #1f2937;
font-size: 14px;
align-items: flex-end;
}
.user-name {
@ -806,7 +810,7 @@
border-radius: 6px;
padding: 10px 12px;
margin-bottom: 10px;
box-shadow: 0 1px 2px rgba(0,0,0,0.05);
box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);
}
.snapshot-detail-item:last-child {
@ -1149,6 +1153,7 @@
opacity: 0;
transform: translateY(-20px);
}
to {
opacity: 1;
transform: translateY(0);
@ -1286,9 +1291,12 @@
}
@keyframes pulse {
0%, 100% {
0%,
100% {
opacity: 0.3;
}
50% {
opacity: 0.5;
}
@ -1652,6 +1660,7 @@
align-items: center;
gap: 6px;
}
.theme-chip.all-theme {
border-color: #fcd34d;
background: #fffbeb;
@ -1763,7 +1772,7 @@
}
.checkpoint-toolbar .btn {
box-shadow: 0 2px 8px rgba(0,0,0,0.1);
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
}
.checkpoint-modal {
@ -2001,6 +2010,7 @@
opacity: 0;
transform: translateY(10px);
}
to {
opacity: 1;
transform: translateY(0);
@ -2012,6 +2022,7 @@
opacity: 0;
transform: translateX(100px);
}
to {
opacity: 1;
transform: translateX(0);
@ -2023,6 +2034,7 @@
opacity: 1;
transform: translateX(0);
}
to {
opacity: 0;
transform: translateX(100px);
@ -2177,8 +2189,13 @@
}
@keyframes spin {
0% { transform: rotate(0deg); }
100% { transform: rotate(360deg); }
0% {
transform: rotate(0deg);
}
100% {
transform: rotate(360deg);
}
}
.error {
@ -2232,6 +2249,7 @@
}
</style>
</head>
<body>
<div class="container">
<div class="header">
@ -2246,8 +2264,8 @@
<span class="user-role" id="userRole">UNAUTH</span>
<div class="user-time" id="userTime" style="display: none;">
<svg width="12" height="12" viewBox="0 0 12 12" fill="none" style="flex-shrink: 0;">
<circle cx="6" cy="6" r="5.5" stroke="#9ca3af" stroke-width="1"/>
<path d="M6 3.5V6.5L8 8" stroke="#9ca3af" stroke-width="1" stroke-linecap="round"/>
<circle cx="6" cy="6" r="5.5" stroke="#9ca3af" stroke-width="1" />
<path d="M6 3.5V6.5L8 8" stroke="#9ca3af" stroke-width="1" stroke-linecap="round" />
</svg>
<span id="loginTime">--</span>
</div>
@ -2263,17 +2281,17 @@
<div class="tabs-container">
<ul class="tabs-nav" id="tabsNav">
<li><button class="tab-button active" data-tab="permits-tab" onclick="switchTab('permits-tab')">
<span>📋</span> 许可事项管理
</button></li>
<span>📋</span> 许可事项管理
</button></li>
<li><button class="tab-button" data-tab="checkpoints-tab" onclick="switchTab('checkpoints-tab')">
<span>🔒</span> 检查点管理
</button></li>
<span>🔒</span> 检查点管理
</button></li>
<li><button class="tab-button" data-tab="files-tab" onclick="switchTab('files-tab')">
<span>📁</span> 文件管理
</button></li>
<span>📁</span> 文件管理
</button></li>
<li><button class="tab-button" data-tab="import-tab" onclick="switchTab('import-tab')">
<span>📥</span> 许可导入
</button></li>
<span>📥</span> 许可导入
</button></li>
</ul>
</div>
@ -2287,25 +2305,34 @@
<p style="color: #666; margin-bottom: 20px;">使用筛选器快速定位许可事项,支持多维度筛选、分页浏览、风险统计等功能。</p>
<!-- 筛选器区域 -->
<div style="background: #f8f9fa; border: 1px solid #e0e0e0; border-radius: 8px; padding: 20px; margin-bottom: 20px; position: relative;">
<div
style="background: #f8f9fa; border: 1px solid #e0e0e0; border-radius: 8px; padding: 20px; margin-bottom: 20px; position: relative;">
<!-- 筛选器加载状态 -->
<div id="filterOptionsLoading" style="display: none; position: absolute; top: 0; left: 0; right: 0; bottom: 0; background: rgba(255, 255, 255, 0.9); border-radius: 8px; z-index: 100; display: flex; flex-direction: column; align-items: center; justify-content: center;">
<div style="width: 50px; height: 50px; border: 4px solid #e0e0e0; border-top-color: #2c5282; border-radius: 50%; animation: spin 0.8s linear infinite; margin-bottom: 16px;"></div>
<div id="filterOptionsLoading"
style="display: none; position: absolute; top: 0; left: 0; right: 0; bottom: 0; background: rgba(255, 255, 255, 0.9); border-radius: 8px; z-index: 100; display: flex; flex-direction: column; align-items: center; justify-content: center;">
<div
style="width: 50px; height: 50px; border: 4px solid #e0e0e0; border-top-color: #2c5282; border-radius: 50%; animation: spin 0.8s linear infinite; margin-bottom: 16px;">
</div>
<div style="font-size: 14px; color: #666; font-weight: 600;">正在加载筛选选项...</div>
</div>
<div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); gap: 16px; margin-bottom: 16px;">
<div
style="display: grid; grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); gap: 16px; margin-bottom: 16px;">
<!-- 行政区域筛选 -->
<div style="display: flex; flex-direction: column; gap: 8px;">
<label style="font-size: 13px; font-weight: 600; color: #555;">行政区域 (可多选)</label>
<div style="position: relative;">
<div id="filterRegion" class="multi-select-dropdown" style="padding: 10px; border: 1px solid #ddd; border-radius: 6px; font-size: 14px; background: white; cursor: pointer;" onclick="toggleMultiSelect('regionOptions')">
<div id="filterRegion" class="multi-select-dropdown"
style="padding: 10px; border: 1px solid #ddd; border-radius: 6px; font-size: 14px; background: white; cursor: pointer;"
onclick="toggleMultiSelect('regionOptions')">
<span id="regionSelectedText">全部区域</span>
<span style="float: right; color: #999;"></span>
</div>
<div id="regionOptions" class="multi-select-options" style="position: absolute; top: 100%; left: 0; right: 0; background: white; border: 1px solid #ddd; border-radius: 6px; margin-top: 4px; max-height: 200px; overflow-y: auto; z-index: 1000; display: none; box-shadow: 0 2px 8px rgba(0,0,0,0.1);">
<div id="regionOptions" class="multi-select-options"
style="position: absolute; top: 100%; left: 0; right: 0; background: white; border: 1px solid #ddd; border-radius: 6px; margin-top: 4px; max-height: 200px; overflow-y: auto; z-index: 1000; display: none; box-shadow: 0 2px 8px rgba(0,0,0,0.1);">
<div style="padding: 8px; border-bottom: 1px solid #eee;">
<label style="display: flex; align-items: center; cursor: pointer;">
<input type="checkbox" id="regionSelectAll" onchange="selectAllRegions()" style="margin-right: 8px;">
<input type="checkbox" id="regionSelectAll" onchange="selectAllRegions()"
style="margin-right: 8px;">
<span style="font-weight: 600; color: #2c5282;">全选</span>
</label>
</div>
@ -2318,14 +2345,18 @@
<div style="display: flex; flex-direction: column; gap: 8px;">
<label style="font-size: 13px; font-weight: 600; color: #555;">主题 (可多选)</label>
<div style="position: relative;">
<div id="filterTheme" class="multi-select-dropdown" style="padding: 10px; border: 1px solid #ddd; border-radius: 6px; font-size: 14px; background: white; cursor: pointer;" onclick="toggleMultiSelect('themeOptions')">
<div id="filterTheme" class="multi-select-dropdown"
style="padding: 10px; border: 1px solid #ddd; border-radius: 6px; font-size: 14px; background: white; cursor: pointer;"
onclick="toggleMultiSelect('themeOptions')">
<span id="themeSelectedText">全部主题</span>
<span style="float: right; color: #999;"></span>
</div>
<div id="themeOptions" class="multi-select-options" style="position: absolute; top: 100%; left: 0; right: 0; background: white; border: 1px solid #ddd; border-radius: 6px; margin-top: 4px; max-height: 200px; overflow-y: auto; z-index: 1000; display: none; box-shadow: 0 2px 8px rgba(0,0,0,0.1);">
<div id="themeOptions" class="multi-select-options"
style="position: absolute; top: 100%; left: 0; right: 0; background: white; border: 1px solid #ddd; border-radius: 6px; margin-top: 4px; max-height: 200px; overflow-y: auto; z-index: 1000; display: none; box-shadow: 0 2px 8px rgba(0,0,0,0.1);">
<div style="padding: 8px; border-bottom: 1px solid #eee;">
<label style="display: flex; align-items: center; cursor: pointer;">
<input type="checkbox" id="themeSelectAll" onchange="selectAllThemes()" style="margin-right: 8px;">
<input type="checkbox" id="themeSelectAll" onchange="selectAllThemes()"
style="margin-right: 8px;">
<span style="font-weight: 600; color: #2c5282;">全选</span>
</label>
</div>
@ -2338,14 +2369,18 @@
<div style="display: flex; flex-direction: column; gap: 8px;">
<label style="font-size: 13px; font-weight: 600; color: #555;">关联部门 (可多选)</label>
<div style="position: relative;">
<div id="filterDepartment" class="multi-select-dropdown" style="padding: 10px; border: 1px solid #ddd; border-radius: 6px; font-size: 14px; background: white; cursor: pointer;" onclick="toggleMultiSelect('departmentOptions')">
<div id="filterDepartment" class="multi-select-dropdown"
style="padding: 10px; border: 1px solid #ddd; border-radius: 6px; font-size: 14px; background: white; cursor: pointer;"
onclick="toggleMultiSelect('departmentOptions')">
<span id="departmentSelectedText">全部部门</span>
<span style="float: right; color: #999;"></span>
</div>
<div id="departmentOptions" class="multi-select-options" style="position: absolute; top: 100%; left: 0; right: 0; background: white; border: 1px solid #ddd; border-radius: 6px; margin-top: 4px; max-height: 200px; overflow-y: auto; z-index: 1000; display: none; box-shadow: 0 2px 8px rgba(0,0,0,0.1);">
<div id="departmentOptions" class="multi-select-options"
style="position: absolute; top: 100%; left: 0; right: 0; background: white; border: 1px solid #ddd; border-radius: 6px; margin-top: 4px; max-height: 200px; overflow-y: auto; z-index: 1000; display: none; box-shadow: 0 2px 8px rgba(0,0,0,0.1);">
<div style="padding: 8px; border-bottom: 1px solid #eee;">
<label style="display: flex; align-items: center; cursor: pointer;">
<input type="checkbox" id="departmentSelectAll" onchange="selectAllDepartments()" style="margin-right: 8px;">
<input type="checkbox" id="departmentSelectAll"
onchange="selectAllDepartments()" style="margin-right: 8px;">
<span style="font-weight: 600; color: #2c5282;">全选</span>
</label>
</div>
@ -2357,16 +2392,19 @@
<!-- 搜索关键词 -->
<div style="display: flex; flex-direction: column; gap: 8px;">
<label style="font-size: 13px; font-weight: 600; color: #555;">搜索关键词</label>
<input type="text" id="filterSearchText" placeholder="输入许可名称关键词..." style="padding: 10px; border: 1px solid #ddd; border-radius: 6px; font-size: 14px;">
<input type="text" id="filterSearchText" placeholder="输入许可名称关键词..."
style="padding: 10px; border: 1px solid #ddd; border-radius: 6px; font-size: 14px;">
</div>
</div>
<!-- 筛选按钮 -->
<div style="display: flex; gap: 12px;">
<button id="applyFilterBtn" onclick="applyPermitFilter()" style="padding: 10px 20px; background: #2c5282; color: white; border: none; border-radius: 6px; font-weight: 600; cursor: pointer; font-size: 14px;">
<button id="applyFilterBtn" onclick="applyPermitFilter()"
style="padding: 10px 20px; background: #2c5282; color: white; border: none; border-radius: 6px; font-weight: 600; cursor: pointer; font-size: 14px;">
🔍 应用筛选
</button>
<button id="resetFilterBtn" onclick="resetPermitFilter()" style="padding: 10px 20px; background: #6b7280; color: white; border: none; border-radius: 6px; font-weight: 600; cursor: pointer; font-size: 14px;">
<button id="resetFilterBtn" onclick="resetPermitFilter()"
style="padding: 10px 20px; background: #6b7280; color: white; border: none; border-radius: 6px; font-weight: 600; cursor: pointer; font-size: 14px;">
↻ 重置筛选
</button>
</div>
@ -2376,22 +2414,27 @@
<div class="panel" style="margin-top: 0;">
<div style="display: flex; justify-content: space-between; align-items: center; margin-bottom: 20px;">
<h3 style="color: #333; margin: 0; font-size: 18px;">筛选结果</h3>
<div id="resultCount" style="color: #666; font-size: 14px;">共找到 <strong style="color: #2c5282;">0</strong> 个许可事项</div>
<div id="resultCount" style="color: #666; font-size: 14px;">共找到 <strong
style="color: #2c5282;">0</strong> 个许可事项</div>
</div>
<!-- 加载状态 -->
<div id="permitsLoading" style="display: none; text-align: center; padding: 40px; color: #999;">
<div style="display: inline-block; width: 40px; height: 40px; border: 4px solid #f3f4f6; border-top-color: #2c5282; border-radius: 50%; animation: spin 0.8s linear infinite; margin-bottom: 12px;"></div>
<div
style="display: inline-block; width: 40px; height: 40px; border: 4px solid #f3f4f6; border-top-color: #2c5282; border-radius: 50%; animation: spin 0.8s linear infinite; margin-bottom: 12px;">
</div>
<div>正在加载许可数据...</div>
</div>
<!-- 错误信息 -->
<div id="permitsError" style="display: none; background: #fee2e2; border: 1px solid #fecaca; color: #991b1b; padding: 16px; border-radius: 8px; margin-bottom: 20px;">
<div id="permitsError"
style="display: none; background: #fee2e2; border: 1px solid #fecaca; color: #991b1b; padding: 16px; border-radius: 8px; margin-bottom: 20px;">
<strong>加载失败:</strong><span id="permitsErrorMsg"></span>
</div>
<!-- 许可事项列表 -->
<div id="permitsList" style="background: white; border: 1px solid #e0e0e0; border-radius: 8px; overflow: hidden;">
<div id="permitsList"
style="background: white; border: 1px solid #e0e0e0; border-radius: 8px; overflow: hidden;">
<div style="text-align: center; padding: 60px 20px; color: #999;">
<div style="font-size: 48px; margin-bottom: 16px;">📋</div>
<div>请选择筛选条件并点击"应用筛选"</div>
@ -2399,11 +2442,14 @@
</div>
<!-- 分页控制 -->
<div id="permitsPagination" style="display: none; margin-top: 20px; display: flex; justify-content: space-between; align-items: center;">
<div id="permitsPagination"
style="display: none; margin-top: 20px; display: flex; justify-content: space-between; align-items: center;">
<div id="paginationInfo" style="color: #666; font-size: 14px;"></div>
<div style="display: flex; gap: 8px;">
<button id="prevPageBtn" onclick="previousPermitPage()" style="padding: 8px 16px; border: 1px solid #ddd; background: white; border-radius: 6px; cursor: pointer; font-size: 14px;">上一页</button>
<button id="nextPageBtn" onclick="nextPermitPage()" style="padding: 8px 16px; border: 1px solid #ddd; background: white; border-radius: 6px; cursor: pointer; font-size: 14px;">下一页</button>
<button id="prevPageBtn" onclick="previousPermitPage()"
style="padding: 8px 16px; border: 1px solid #ddd; background: white; border-radius: 6px; cursor: pointer; font-size: 14px;">上一页</button>
<button id="nextPageBtn" onclick="nextPermitPage()"
style="padding: 8px 16px; border: 1px solid #ddd; background: white; border-radius: 6px; cursor: pointer; font-size: 14px;">下一页</button>
</div>
</div>
</div>
@ -2467,7 +2513,8 @@
<span class="import-template-subtitle">打开完整导入流程</span>
</span>
</button>
<input type="file" id="dragDropFileInput" accept=".xlsx,.xlsm" style="display: none;" onchange="handleFileSelect(this.files)">
<input type="file" id="dragDropFileInput" accept=".xlsx,.xlsm" style="display: none;"
onchange="handleFileSelect(this.files)">
</div>
<div id="importPreview" style="margin-top: 20px;">
<p style="color: #999; text-align: center; padding: 20px;">支持拖拽上传,文件大小限制:≤ 500KB</p>
@ -2489,7 +2536,8 @@
</div>
<div class="modal-footer">
<button class="btn" onclick="closeDangerModal()">取消</button>
<button class="btn btn-danger" id="dangerModalConfirmBtn" onclick="confirmDangerOperation()">确认执行</button>
<button class="btn btn-danger" id="dangerModalConfirmBtn"
onclick="confirmDangerOperation()">确认执行</button>
</div>
</div>
</div>
@ -4787,11 +4835,11 @@
}
// 点击模态窗口外部关闭
document.getElementById('checkpointModal').addEventListener('click', function(e) {
if (e.target === this) {
closeCheckpointModal();
}
});
document.getElementById('checkpointModal').addEventListener('click', function (e) {
if (e.target === this) {
closeCheckpointModal();
}
});
// 加载检查点列表(保持兼容性)
async function loadCheckpoints() {
@ -6790,27 +6838,27 @@ document.getElementById('checkpointModal').addEventListener('click', function(e)
'Accept': 'application/json'
}
})
.then(response => response.json())
.then(data => {
if (data.success && data.data && data.data.files) {
renderFileList(data.data.files);
container.dataset.loaded = 'true';
} else {
container.innerHTML = `
.then(response => response.json())
.then(data => {
if (data.success && data.data && data.data.files) {
renderFileList(data.data.files);
container.dataset.loaded = 'true';
} else {
container.innerHTML = `
<div style="padding: 40px; text-align: center; color: #999;">
<p>暂无文件数据</p>
</div>
`;
}
})
.catch(error => {
container.innerHTML = `
}
})
.catch(error => {
container.innerHTML = `
<div style="padding: 40px; text-align: center; color: #dc2626;">
<p>加载文件列表失败</p>
<p style="font-size: 12px; color: #999;">${error.message}</p>
</div>
`;
});
});
}
// 渲染文件列表
@ -6995,10 +7043,10 @@ document.getElementById('checkpointModal').addEventListener('click', function(e)
method: 'POST',
body: formData,
})
.then(response => response.json())
.then(data => {
if (data.success) {
preview.innerHTML = `
.then(response => response.json())
.then(data => {
if (data.success) {
preview.innerHTML = `
<div style="padding: 20px; background: #d1fae5; border-radius: 8px; border: 1px solid #6ee7b7;">
<div style="display: flex; align-items: center; gap: 12px;">
<span style="font-size: 24px;"></span>
@ -7014,12 +7062,12 @@ document.getElementById('checkpointModal').addEventListener('click', function(e)
</div>
</div>
`;
} else {
throw new Error(data.message || '上传失败');
}
})
.catch(error => {
preview.innerHTML = `
} else {
throw new Error(data.message || '上传失败');
}
})
.catch(error => {
preview.innerHTML = `
<div style="padding: 20px; background: #fee2e2; border-radius: 8px; border: 1px solid #fca5a5;">
<div style="display: flex; align-items: center; gap: 12px;">
<span style="font-size: 24px;"></span>
@ -7030,7 +7078,7 @@ document.getElementById('checkpointModal').addEventListener('click', function(e)
</div>
</div>
`;
});
});
}
// 清除文件选择
@ -7067,19 +7115,19 @@ document.getElementById('checkpointModal').addEventListener('click', function(e)
'Accept': 'application/json'
}
})
.then(response => response.json())
.then(data => {
if (data.success) {
showAlert('success', '文件重新导入成功');
loadFileManager();
} else {
throw new Error(data.message || '重新导入失败');
}
})
.catch(error => {
showAlert('error', '重新导入失败:' + error.message);
container.innerHTML = originalContent;
});
.then(response => response.json())
.then(data => {
if (data.success) {
showAlert('success', '文件重新导入成功');
loadFileManager();
} else {
throw new Error(data.message || '重新导入失败');
}
})
.catch(error => {
showAlert('error', '重新导入失败:' + error.message);
container.innerHTML = originalContent;
});
}
// 删除文件
@ -7108,24 +7156,24 @@ document.getElementById('checkpointModal').addEventListener('click', function(e)
'Accept': 'application/json'
}
})
.then(response => response.json())
.then(data => {
if (data.success) {
showAlert('success', '文件删除成功');
// 重新加载文件列表
const container = document.getElementById('fileManagerContainer');
if (container) {
delete container.dataset.loaded;
loadFileManager();
.then(response => response.json())
.then(data => {
if (data.success) {
showAlert('success', '文件删除成功');
// 重新加载文件列表
const container = document.getElementById('fileManagerContainer');
if (container) {
delete container.dataset.loaded;
loadFileManager();
}
} else {
throw new Error(data.message || '删除失败');
}
} else {
throw new Error(data.message || '删除失败');
}
})
.catch(error => {
showAlert('error', '删除失败:' + error.message);
container.innerHTML = originalContent;
});
})
.catch(error => {
showAlert('error', '删除失败:' + error.message);
container.innerHTML = originalContent;
});
}
// 显示提示信息
@ -7194,13 +7242,13 @@ document.getElementById('checkpointModal').addEventListener('click', function(e)
const dragDropArea = document.getElementById('dragDropArea');
if (dragDropArea) {
// 阻止默认拖拽行为
dragDropArea.addEventListener('dragover', function(e) {
dragDropArea.addEventListener('dragover', function (e) {
e.preventDefault();
e.stopPropagation();
this.classList.add('drag-over');
});
dragDropArea.addEventListener('dragleave', function(e) {
dragDropArea.addEventListener('dragleave', function (e) {
e.preventDefault();
e.stopPropagation();
// 只有离开拖放区域本身时才移除样式
@ -7209,7 +7257,7 @@ document.getElementById('checkpointModal').addEventListener('click', function(e)
}
});
dragDropArea.addEventListener('drop', function(e) {
dragDropArea.addEventListener('drop', function (e) {
e.preventDefault();
e.stopPropagation();
this.classList.remove('drag-over');
@ -7229,4 +7277,5 @@ document.getElementById('checkpointModal').addEventListener('click', function(e)
});
</script>
</body>
</html>
</html>

View File

@ -44,45 +44,57 @@
}
.user-chip {
position: absolute;
top: 28px;
right: 28px;
padding: 16px 20px;
border-radius: 16px;
border: 1px solid #e5e7eb;
background: rgba(255,255,255,0.9);
box-shadow: 0 10px 30px rgba(17, 24, 39, 0.08);
top: 36px; /* Align vertically with title center approx */
right: 32px;
padding: 0;
background: transparent;
display: flex;
flex-direction: row;
align-items: center;
gap: 16px;
z-index: 10;
}
.user-info-text {
display: flex;
flex-direction: column;
min-width: 220px;
gap: 6px;
align-items: flex-end;
gap: 2px;
}
.user-name {
font-weight: 600;
font-size: 16px;
font-size: 15px;
display: flex;
justify-content: space-between;
align-items: center;
gap: 8px;
color: #1f2937;
}
.user-tag {
font-size: 12px;
padding: 2px 10px;
border-radius: 999px;
background: #eef2ff;
color: #2c5282;
font-size: 11px;
padding: 1px 6px;
border-radius: 4px;
background: rgba(255,255,255,0.6);
border: 1px solid rgba(0,0,0,0.05);
color: #4b5563;
}
.user-meta {
font-size: 12px;
color: #6b7280;
color: #64748b;
}
.logout-btn {
align-self: flex-start;
background: #ef4444;
color: #fff;
border: none;
border-radius: 999px;
padding: 6px 14px;
font-size: 13px;
background: #fff;
color: #ef4444;
border: 1px solid #fee2e2;
border-radius: 8px;
padding: 5px 12px;
font-size: 12px;
font-weight: 500;
cursor: pointer;
transition: all 0.2s;
box-shadow: 0 1px 2px rgba(0,0,0,0.05);
}
.logout-btn:hover {
background: #fef2f2;
border-color: #ef4444;
}
.grid {
display: grid;
@ -1129,11 +1141,13 @@
<p>超级管理员 · 用户、部门、主题与模板一站式管控</p>
</div>
<div class="user-chip" id="userChip">
<div class="user-name">
<span id="currentUserName">未登录</span>
<span class="user-tag" id="currentUserRole">role</span>
<div class="user-info-text">
<div class="user-name">
<span id="currentUserName">未登录</span>
<span class="user-tag" id="currentUserRole">role</span>
</div>
<div class="user-meta" id="currentUserDept"></div>
</div>
<div class="user-meta" id="currentUserDept"></div>
<button class="logout-btn" id="logoutBtn">退出登录</button>
</div>
</header>