From 3bf0d22d47ded88063ac4469a16915f54ded045a Mon Sep 17 00:00:00 2001 From: HuangHai <10402852@qq.com> Date: Wed, 10 Sep 2025 20:36:43 +0800 Subject: [PATCH] 'commit' --- Controller/RuYuanZaiYuanCountController.py | 11 +- ...YuanZaiYuanCountController.cpython-310.pyc | Bin 1448 -> 936 bytes Model/RenkouModel.py | 129 ------------------ Model/__pycache__/RenkouModel.cpython-310.pyc | Bin 4299 -> 0 bytes .../RuYuanZaiYuanCountModel.cpython-310.pyc | Bin 0 -> 6081 bytes ...education.html => RuYuanZaiYuanCount.html} | 0 static/T1_Bar.html | 49 ------- 7 files changed, 1 insertion(+), 188 deletions(-) delete mode 100644 Model/RenkouModel.py delete mode 100644 Model/__pycache__/RenkouModel.cpython-310.pyc create mode 100644 Model/__pycache__/RuYuanZaiYuanCountModel.cpython-310.pyc rename static/{preschool_education.html => RuYuanZaiYuanCount.html} (100%) delete mode 100644 static/T1_Bar.html diff --git a/Controller/RuYuanZaiYuanCountController.py b/Controller/RuYuanZaiYuanCountController.py index e1e286c..e618d7c 100644 --- a/Controller/RuYuanZaiYuanCountController.py +++ b/Controller/RuYuanZaiYuanCountController.py @@ -1,6 +1,5 @@ from fastapi import APIRouter -import json -from Model.RenkouModel import RenkouModel + from Model.RuYuanZaiYuanCountModel import RuYuanZaiYuanModel # 创建APIRouter实例 @@ -11,14 +10,6 @@ router = APIRouter(prefix="/bigscreen", tags=["大屏展示"]) async def root(): return {"message": "Welcome to YunNan Education World!"} -@router.get("/population/chart/{year}") -async def get_population_chart_config(year: str = "2024"): - return RenkouModel.generate_population_chart_config(year) - -@router.get("/population/urbanization") -async def get_urbanization_rate_chart_config(): - return RenkouModel.generate_urbanization_rate_chart_config() - @router.get("/school/preschool/chart") async def get_preschool_education_chart_config(): return RuYuanZaiYuanModel.generate_preschool_education_config() diff --git a/Controller/__pycache__/RuYuanZaiYuanCountController.cpython-310.pyc b/Controller/__pycache__/RuYuanZaiYuanCountController.cpython-310.pyc index df7da5557852bc80787d96b8f3bdedcf5f3f3913..a36ab6071afc95537ee641357a9275845a9bfff3 100644 GIT binary patch delta 464 zcmZvZJx{|h5QgvUwE0d80}=xh3trgR5FcVivZ+vwwFN&r4pu)Yi#oJbpANymX> z0s{;Yl_m)p(2yd;$SF5^$ZL-zG-6{`IEzMo zA>R+eomR@@WWSSN=Fu>W`f58%^I@jBpz=&r7kaXa_To&awndu`|r XJc*AGw&hoBO6Gw_0%}nQmlohJo>P`GFa+M;Ud$K3roBc|$6~PHJ^FHRi_j_;NL=*~H0^@k+>((!wknhOE zM*^6~F#Q8q7-7^U9cogFwB~B22D|R+9m6z~%y1K(q?x3IQTF&~ra>~pt|>`DNoGMZ$L5u! z$h0+5S@;PkNrgt4C#x^&A`G~!0hg-KTrFys#TApb+xG8BbTitZpzAZWT z!aVpmJ^Fll^6~WK(~qMs6)j43C2u*eA|tTc{yDAM7$-h7V7|fhv7CF9QKmT*5b3oj z)#1KxwRvxGox8T^@Nyu^8=+UTyz+Av+E(BQue>g#%WfSLnE?mm<^1Wh2My+fcBj#| zS(Rd&+d*SRc!3nI%Vpz2J}V;hg0XU`yBir&hya0|8L(*Y(wfWx(VMS!MK^R6fU3P^ z$)Ngrms|2}WGvrXz8@LL*c6Tq2hz|c{Zz3|do&;i^bI+LWRGdBqDfSn=Yv;y87 zM`)@DOa zQ)oLtjD;|7j}VW1H2JWl29>@P?HyI;VcfV4cEP}M7Q-pL(}=hHCtk<isXp{t*2Ro*&5LzY6uV zBvw93O7(Y%bSR{HOp)#fQgx-eU5O==82-{U(hoa=g)V=D56Zs@OP-`@9=@WU*0VIN Lmtf+Kvq*mfCE0kN diff --git a/Model/RenkouModel.py b/Model/RenkouModel.py deleted file mode 100644 index 6fc2a16..0000000 --- a/Model/RenkouModel.py +++ /dev/null @@ -1,129 +0,0 @@ -import json - -from pyecharts import options as opts -from pyecharts.charts import Bar, Line -from pyecharts.globals import CurrentConfig - -from Config.Config import ONLINE_HOST -CurrentConfig.ONLINE_HOST = ONLINE_HOST - -class RenkouModel: - @staticmethod - def load_population_data(): - try: - # 获取当前文件所在目录的父目录,然后找到Data文件夹 - data_path = "./Data/RenKou.json" - - with open(data_path, "r", encoding="utf-8") as f: - data = json.load(f) - return data - except Exception as e: - print(f"读取人口数据出错: {e}") - return [] - - @staticmethod - def generate_population_chart_config(year="2024"): - # 加载人口数据 - population_data = RenkouModel.load_population_data() - # 筛选出州市级数据 - cities = [item for item in population_data if len(item["area_code"]) == 9 and item["area_code"].endswith("000") and item["area_code"][4:6] == "00" and item["area_code"][2:8] != "000000"] - # 提取城市名称和人口数据 - city_names = [city["area_name"] for city in cities] - total_populations = [city["total_population"].get(year, 0) for city in cities] - urban_populations = [city["urban_population"].get(year, 0) for city in cities] - rural_populations = [city["rural_population"].get(year, 0) for city in cities] - - # 创建柱状图 - c = ( - Bar() - .add_xaxis(city_names) - .add_yaxis("总人口", total_populations, stack="stack1") - .add_yaxis("城镇人口", urban_populations, stack="stack1") - .add_yaxis("农村人口", rural_populations, stack="stack1") - .set_global_opts( - title_opts=opts.TitleOpts( - title=f"云南省各州市人口分布图({year}年)", - pos_top="1%", - pos_left="center" - ), - tooltip_opts=opts.TooltipOpts( - trigger="axis", - axis_pointer_type="shadow" - ), - legend_opts=opts.LegendOpts( - pos_top="8%", - pos_right="5%" - ), - datazoom_opts=[opts.DataZoomOpts()], - xaxis_opts=opts.AxisOpts( - axislabel_opts=opts.LabelOpts(rotate=45) - ), - yaxis_opts=opts.AxisOpts( - name="人口数量(万人)", - name_location="middle", - name_gap=40 - ) - ) - .set_series_opts( - label_opts=opts.LabelOpts(is_show=False), - markline_opts=opts.MarkLineOpts( - data=[opts.MarkLineItem(type_="average", name="平均值")] - ) - ) - ) - - # 获取图表的选项配置 - options_str = c.dump_options_with_quotes() - return json.loads(options_str) - - @staticmethod - def generate_urbanization_rate_chart_config(): - # 加载人口数据 - population_data = RenkouModel.load_population_data() - - # 筛选出州市级数据 - cities = [item for item in population_data if len(item["area_code"]) == 9 and item["area_code"].endswith("000") and item["area_code"][4:6] == "00" and item["area_code"][2:8] != "000000"] - - # 提取城市名称 - city_names = [city["area_name"] for city in cities] - - # 创建折线图 - line = ( - Line() - .add_xaxis(city_names) - ) - - # 添加各年份的城镇化率数据 - years = ["2020", "2021", "2022", "2023", "2024"] - for year in years: - urbanization_rates = [city["urbanization_rate"].get(year, 0) for city in cities] - line.add_yaxis(f"{year}年", urbanization_rates, - markpoint_opts=opts.MarkPointOpts(data=[opts.MarkPointItem(type_="max")])) - - line.set_global_opts( - title_opts=opts.TitleOpts( - title="云南省各州市城镇化率变化趋势", - pos_top="1%", - pos_left="center" - ), - tooltip_opts=opts.TooltipOpts(trigger="axis"), - legend_opts=opts.LegendOpts( - pos_top="8%", - pos_right="5%" - ), - datazoom_opts=[opts.DataZoomOpts()], - xaxis_opts=opts.AxisOpts( - axislabel_opts=opts.LabelOpts(rotate=45) - ), - yaxis_opts=opts.AxisOpts( - name="城镇化率(%)", - name_location="middle", - name_gap=40, - min_=0, - max_=100 - ) - ) - - # 获取图表的选项配置 - options_str = line.dump_options_with_quotes() - return json.loads(options_str) \ No newline at end of file diff --git a/Model/__pycache__/RenkouModel.cpython-310.pyc b/Model/__pycache__/RenkouModel.cpython-310.pyc deleted file mode 100644 index 7346ab34e1aebcae3b867e3cf5706a044ab01a0c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4299 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 - - - - - 云南教育决策研究服务系统 - - - - - -
-

云南教育决策研究服务系统

-

数据可视化展示平台

-
- -
-
-
人口数据图表
-
城镇化率图表
-
- -
-

云南省各州市人口分布

-
- -
-
-
- -
-

云南省各州市城镇化率变化趋势

-
-
-
-
-
- - - - - - \ No newline at end of file