99精品久久精品一区二区-亚洲熟妇无码?v在线播放-日本国产精品无码字幕在线观看-久久久亚洲永夜AV-亚洲一级无码一区二区一-免费国产成高清人在线视频-中文字幕乱码免费观看-国产毛片精品妇女久久久

ARTICLE DETAIL

資訊詳情

深耕商務(wù)建站與企業(yè)官網(wǎng)運(yùn)營的一線實(shí)戰(zhàn)洞察。

Django+MySQL實(shí)現(xiàn)PM2.5可視化:從數(shù)據(jù)導(dǎo)入到ECharts圖表完整實(shí)戰(zhàn)

Django+MySQL實(shí)現(xiàn)PM2.5可視化:從數(shù)據(jù)導(dǎo)入到ECharts圖表完整實(shí)戰(zhàn) 簡介這是一份基于DjangoMySQL實(shí)現(xiàn)的城市PM2.5空氣質(zhì)量數(shù)據(jù)可視化分析項(xiàng)目源碼適合Python初學(xué)者、Web開發(fā)學(xué)習(xí)者及數(shù)據(jù)分析愛好者參考使用。項(xiàng)目整合了宏觀空氣質(zhì)量數(shù)據(jù)的采集入庫、查詢統(tǒng)計(jì)與可視化展示全流程可幫助理解Django框架的MTV架構(gòu)、ORM數(shù)據(jù)庫操作以及前后端數(shù)據(jù)交互方式。壓縮包共66個文件約12.38MB包含17個Python源碼文件、24個CSV數(shù)據(jù)文件、4個XML配置、3個HTML模板、SQL數(shù)據(jù)庫腳本及部署文檔等。CSV數(shù)據(jù)覆蓋北上廣成沈等多座城市六年間PM2.5濃度變化以及PM2.5與溫度、濕度、大氣壓、風(fēng)向、露點(diǎn)等環(huán)境因素的關(guān)系數(shù)據(jù)SQL腳本與Django配置可直接還原數(shù)據(jù)庫表結(jié)構(gòu)。代碼按項(xiàng)目目錄、數(shù)據(jù)目錄、模板目錄組織結(jié)構(gòu)清晰。資源當(dāng)前已有145人學(xué)習(xí)下載。隨包附部署文檔、requirements依賴清單及README替換本地?cái)?shù)據(jù)即可直接運(yùn)行。通過源碼可掌握數(shù)據(jù)預(yù)處理、MySQL讀寫、圖表可視化等關(guān)鍵環(huán)節(jié)適合畢業(yè)設(shè)計(jì)或課程項(xiàng)目二次開發(fā)。1. 這套 DjangoMySQL 的 PM2.5 可視化項(xiàng)目到底能拿來做什么如果你手里有一份城市空氣質(zhì)量監(jiān)測的 CSV 數(shù)據(jù)想把它變成能在瀏覽器里交互查看的趨勢圖、小時對比圖、污染排行最直接的路徑就是 Django 做后端、MySQL 存數(shù)據(jù)、ECharts 出圖表。這個方向的項(xiàng)目在 Python 求職作品集里出現(xiàn)頻率極高核心價值在于它覆蓋了從數(shù)據(jù)清洗、關(guān)系建模到 Web 接口和前端渲染的完整鏈路不是那種只調(diào)個庫就出圖的玩具。適合的人群很明確剛學(xué)完 Django 基礎(chǔ)但不知道怎么寫第一個像樣項(xiàng)目的人想給簡歷補(bǔ)一個有數(shù)據(jù)庫、有部署文檔的完整案例的轉(zhuǎn)行者以及需要快速搭建內(nèi)部空氣質(zhì)量看板的運(yùn)維或環(huán)境相關(guān)從業(yè)者。本文按實(shí)際落地順序把模型設(shè)計(jì)、數(shù)據(jù)導(dǎo)入、聚合查詢、圖表對接和部署驗(yàn)證逐個拆開講你會看到每個環(huán)節(jié)的參數(shù)設(shè)置和翻車點(diǎn)。2. 把數(shù)據(jù)落進(jìn) MySQLDjango 模型設(shè)計(jì)與環(huán)境準(zhǔn)備2.1 先定表結(jié)構(gòu)監(jiān)測記錄、監(jiān)測站點(diǎn)、污染物維度拿到 PM2.5 數(shù)據(jù)后第一件事不是寫視圖而是想清楚表和表之間的關(guān)系。大多數(shù)公開數(shù)據(jù)集長這樣每一行是一條監(jiān)測記錄包含站點(diǎn)名、時間、PM2.5 濃度、PM10、SO2、NO2、CO、O3。如果把全部字段塞進(jìn)一張表后續(xù)按站點(diǎn)、按天做統(tǒng)計(jì)時會反復(fù)出現(xiàn)冗余和慢查詢。常見做法是拆成三張表監(jiān)測站點(diǎn)表存站點(diǎn)名稱和經(jīng)緯度污染物維度表存污染物代碼和名稱監(jiān)測事實(shí)表存時間和各污染物數(shù)值。Django 里對應(yīng)的模型可以這樣寫from django.db import models class Station(models.Model): name models.CharField(max_length64, uniqueTrue, verbose_name站點(diǎn)名稱) longitude models.FloatField(verbose_name經(jīng)度) latitude models.FloatField(verbose_name緯度) city models.CharField(max_length32, verbose_name所屬城市) class Meta: db_table station class Pollutant(models.Model): code models.CharField(max_length16, uniqueTrue, verbose_name污染物代碼) name models.CharField(max_length32, verbose_name污染物名稱) class Meta: db_table pollutant class AirQualityRecord(models.Model): station models.ForeignKey(Station, on_deletemodels.CASCADE, verbose_name站點(diǎn)) pollutant models.ForeignKey(Pollutant, on_deletemodels.CASCADE, verbose_name污染物) record_time models.DateTimeField(verbose_name監(jiān)測時間) value models.FloatField(verbose_name濃度值) unit models.CharField(max_length16, defaultug/m3, verbose_name單位) class Meta: db_table air_quality_record indexes [ models.Index(fields[record_time, station], nameidx_time_station), ]這里最關(guān)鍵的決定是把每種污染物拆成獨(dú)立的記錄行而不是把 PM2.5、PM10 作為字段并列。原因有兩個一是數(shù)據(jù)導(dǎo)入時 CSV 里列的順序經(jīng)常變化拆成行就不會被表結(jié)構(gòu)綁死二是后續(xù)做某一天各污染物對比只需要按時間和站點(diǎn)過濾SQL 寫起來清爽。如果你拿到的是已經(jīng)清洗好的一行一條記錄的數(shù)據(jù)那直接用這個模型。表名通過db_table指定避免 Django 默認(rèn)生成的appname_modelname式名字在部署遷移時引起混淆。idx_time_station聯(lián)合索引是為后面高頻的某一時間范圍 某個站點(diǎn)查詢準(zhǔn)備的實(shí)測在百萬行數(shù)據(jù)量下不加這個索引查詢耗時能從秒級降到毫秒級。2.2 數(shù)據(jù)導(dǎo)入腳本用 bulk_create 而不是循環(huán) insertCSV 數(shù)據(jù)導(dǎo)庫是第一個分水嶺。很多新手用for row in reader: Model.objects.create(...)數(shù)據(jù)量幾千行時還能忍幾萬行時直接卡到懷疑人生。正確做法是把解析和入庫分開用bulk_create批量寫入。import csv from datetime import datetime from django.utils.timezone import make_aware from .models import Station, Pollutant, AirQualityRecord def import_csv(file_path): station_cache {} pollutant_cache {} with open(file_path, encodingutf-8-sig) as f: reader csv.DictReader(f) batch [] batch_size 2000 for row in reader: station_name row[station] if station_name not in station_cache: station, _ Station.objects.get_or_create( namestation_name, defaults{longitude: float(row[lon]), latitude: float(row[lat]), city: row.get(city, )} ) station_cache[station_name] station for code in [pm25, pm10, so2, no2, co, o3]: val row.get(code) if val in (None, , NA): continue if code not in pollutant_cache: pollutant, _ Pollutant.objects.get_or_create(codecode) pollutant_cache[code] pollutant record_time make_aware(datetime.strptime(row[time], %Y-%m-%d %H:%M:%S)) batch.append(AirQualityRecord( stationstation_cache[station_name], pollutantpollutant_cache[code], record_timerecord_time, valuefloat(val), )) if len(batch) batch_size: AirQualityRecord.objects.bulk_create(batch, batch_sizebatch_size) batch.clear() if batch: AirQualityRecord.objects.bulk_create(batch, batch_sizebatch_size)這段腳本里有兩個容易被忽略的點(diǎn)encodingutf-8-sig是因?yàn)楹芏?CSV 文件從 Excel 導(dǎo)出來時帶 BOM 頭用普通utf-8讀會把\ufeff帶進(jìn)第一個列名導(dǎo)致解析失敗get_or_create配合本地緩存是為了避免每行都查一次數(shù)據(jù)庫站點(diǎn)表和污染物表的記錄數(shù)是有限的查一次存進(jìn) dict 后面直接用就行。make_aware是把 naive 的 datetime 變成帶時區(qū)的對象Django 的USE_TZTrue時會強(qiáng)制要求 aware datetime否則寫入報(bào)錯。實(shí)測下來10 萬行原始記錄約 60 萬條事實(shí)記錄用bulk_create寫入 MySQL 大約需要 20 到 40 秒如果你仍然逐條 create同樣的數(shù)據(jù)可能要跑十幾分鐘而且中間任何一條失敗都得重來。2.3 settings 里 MySQL 的 4 個必配參數(shù)與編碼坑Django 默認(rèn)連 SQLite切換到 MySQL 需要裝驅(qū)動并在 settings 里改一段配置。常見驅(qū)動有mysqlclient和pymysql我的建議是直接用pymysql因?yàn)樗惭b不需要編譯本地 C 擴(kuò)展Windows 和 Linux 上都不容易踩坑。import pymysql pymysql.install_as_MySQLdb() DATABASES { default: { ENGINE: django.db.backends.mysql, NAME: air_quality_db, USER: root, PASSWORD: your_password, HOST: 127.0.0.1, PORT: 3306, CONN_MAX_AGE: 60, OPTIONS: { charset: utf8mb4, init_command: SET sql_modeSTRICT_TRANS_TABLES, }, } }四個必配參數(shù)CONN_MAX_AGE設(shè)為 60表示一個連接在一分鐘內(nèi)可復(fù)用避免每次請求都重新握手charset必須配utf8mb4不是utf8因?yàn)閡tf8在 MySQL 里最多支持 3 字節(jié)編碼存不了特殊字符和生僻字init_command里的sql_mode設(shè)置讓 MySQL 在寫入超長字段時拋異常而不是靜默截?cái)噙@個直接影響數(shù)據(jù)完整性HOST寫127.0.0.1而不是localhost有些系統(tǒng)上 localhost 會被解析成 socket 文件Django 連不上。另外創(chuàng)建數(shù)據(jù)庫時就要指定字符集這一步很多人忘記導(dǎo)致后面遷移建表全是 latin1 編碼中文亂碼滿屏飛。命令行里這樣建庫mysql -u root -p -e CREATE DATABASE air_quality_db DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;然后執(zhí)行python manage.py makemigrations和python manage.py migrate。如果遷移時報(bào)django.db.utils.OperationalError: (1130, Host ... is not allowed to connect)說明 MySQL 沒開遠(yuǎn)程權(quán)限在 MySQL 里執(zhí)行GRANT ALL PRIVILEGES ON air_quality_db.* TO root% IDENTIFIED BY 密碼; FLUSH PRIVILEGES;就能解決。運(yùn)行起來后確認(rèn)一下數(shù)據(jù)是否真的進(jìn)去了用SELECT COUNT(*) FROM air_quality_record;對數(shù)量然后抽查一條記錄看record_time和value是否為預(yù)期值。數(shù)據(jù)入庫這步做得越扎實(shí)后面可視化接口翻車的概率越低。3. 可視化接口背后的查詢邏輯聚合、分組與時間粒度3.1 按小時/天/月聚合的 ORM 寫法與對應(yīng) SQL前端圖表要展示的通常不是原始記錄而是聚合后的趨勢線。按天算日均 PM2.5、按月算月均、按小時看污染突變這些需求都對應(yīng) SQL 里的GROUP BY加時間函數(shù)。Django ORM 里做這件事用annotate但時間的截?cái)嘈枰柚鶷runc系列表達(dá)式。from django.db.models import Avg, F from django.db.models.functions import TruncDay, TruncHour from .models import AirQualityRecord def daily_average(station_id, start_date, end_date): rows ( AirQualityRecord.objects .filter( station_idstation_id, pollutant__codepm25, record_time__date__gtestart_date, record_time__date__lteend_date, ) .annotate(dayTruncDay(record_time)) .values(day) .annotate(avg_valueAvg(value)) .order_by(day) ) return list(rows)這段代碼生成的 SQL 大致是SELECT DATE(record_time) AS day, AVG(value) AS avg_value FROM air_quality_record WHERE station_id 1 AND pollutant_id 2 AND DATE(record_time) BETWEEN 2025-01-01 AND 2025-01-31 GROUP BY DATE(record_time) ORDER BY day;TruncDay(record_time)的作用是把 datetime 截?cái)嗟教煜喈?dāng)于 MySQL 里的DATE()函數(shù)換成TruncHour就是按小時分組。這里有一個性能細(xì)節(jié)record_time__date__gte會隱式地對record_time調(diào)用DATE()函數(shù)導(dǎo)致索引失效數(shù)據(jù)量大時全表掃描。正確寫法是直接用record_time__gtedatetime(2025,1,1)配合record_time__ltdatetime(2025,2,1)讓范圍過濾直接命中前面建的聯(lián)合索引。這個差別在百萬行數(shù)據(jù)上是 0.1 秒和 3 秒的區(qū)別。values(day)和annotate(avg_valueAvg(value))的順序是有講究的先values指定分組字段再annotate聚合Django 才會按day分組如果反過來聚合結(jié)果就不是你想要的分組粒度。這個順序錯了不會報(bào)錯但返回的數(shù)據(jù)會讓人摸不著頭腦是常見的隱蔽 bug。3.2 城市對比與均值計(jì)算annotate values 的組合除了單站點(diǎn)趨勢PM2.5 項(xiàng)目里最常見的還有城市維度對比比如同一天北京、上海、廣州的 PM2.5 均值分別是多少做成柱狀圖拍出污染排行。這需要跨站點(diǎn)點(diǎn)按城市分組如果你的站點(diǎn)表里已經(jīng)存了city字段Django 的 ORM 可以順著外鍵直接分組。from django.db.models import Avg from django.db.models.functions import TruncDay from .models import AirQualityRecord def city_daily_average(date): rows ( AirQualityRecord.objects .filter(record_time__datedate, pollutant__codepm25) .values(station__city, record_time__date) # 先分組再聚合 .annotate(city_avgAvg(value)) .order_by(-city_avg) ) return rows注意這里values(station__city, record_time__date)里用了跨表字段station__cityDjango 會自動做 JOIN。如果Pollutant表里的 code 有唯一索引這里過濾pollutant__codepm25會比先查出污染物 ID 再過濾更快。實(shí)際執(zhí)行時可以用connection.queries查看 ORM 生成的 SQL 來驗(yàn)證如果看到 JOIN 了兩張不相關(guān)的表說明模型關(guān)系的related_name設(shè)置有問題。有時候現(xiàn)實(shí)需求是對比一組城市某時間段的達(dá)標(biāo)率而不是均值這在 SQL 里就是AVG(CASE WHEN value 75 THEN 1 ELSE 0 END)ORM 中用Avg(Case(When(value__lt75, then1.0), default0.0))實(shí)現(xiàn)。PM2.5 的 24 小時均值限值是 75 微克/立方米達(dá)標(biāo)率數(shù)據(jù)在可視化看板里比絕對值更有說服力。3.3 查詢性能索引設(shè)計(jì)與大表分頁數(shù)據(jù)量上了幾十萬行后接口響應(yīng)變慢幾乎都是索引問題。Django 的模型定義里已經(jīng)加了record_time station的聯(lián)合索引但如果你頻繁按污染物和時間過濾這個索引的字段順序需要重新考量。MySQL 索引遵循最左前綴原則查詢條件里如果只給pollutant_id和record_time聯(lián)合索引(record_time, station)就用不上。常見做法是把索引拆成兩個(pollutant_id, record_time)和(station_id, record_time)分別應(yīng)對某污染物全站點(diǎn)時序和某站點(diǎn)全污染物時序兩類高頻查詢。class Meta: db_table air_quality_record indexes [ models.Index(fields[pollutant, record_time], nameidx_pollutant_time), models.Index(fields[station, record_time], nameidx_station_time), ]加了索引后別忘了跑一下EXPLAIN驗(yàn)證EXPLAIN SELECT station_id, AVG(value) FROM air_quality_record WHERE pollutant_id 2 AND record_time BETWEEN 2025-01-01 AND 2025-01-31 GROUP BY station_id;看到type是range、key是idx_pollutant_time就說明索引生效了。如果還是ALL全表掃描檢查字段類型是否不一致——station_id是 int 而查詢里傳了字符串MySQL 會做隱式類型轉(zhuǎn)換然后放棄索引。另一個坑是圖表接口返回的數(shù)據(jù)量。如果你做的是整年逐小時曲線一年有 8760 個點(diǎn)一次性全返回會讓前端渲染卡死。常見的解法不是分頁圖表不適合頁碼翻動而是后端限制采樣點(diǎn)數(shù)量。我的做法是超過 2000 個點(diǎn)時自動把時間粒度從小時升到按天聚合這個邏輯放在視圖層判斷def trend_data(request, station_id): start request.GET.get(start) end request.GET.get(end) points AirQualityRecord.objects.filter( station_idstation_id, record_time__range(start, end) ).count() if points 2000: granularity day else: granularity hour # 按 granularity 走不同聚合分支接口層做一次粗粒度計(jì)數(shù)通常很快用COUNT(*)配合索引命中幾乎無感。用戶看到的圖表永遠(yuǎn)有數(shù)據(jù)只是縮放范圍大時顯示日線、小時范圍時顯示小時線體驗(yàn)上比轉(zhuǎn)圈圈等加載好很多。4. 把查詢結(jié)果渲染成圖表ECharts 的 JSON 對接方案4.1 返回 JSON 的視圖函數(shù)時間序列格式是關(guān)鍵Django 后端和 ECharts 前端的數(shù)據(jù)交接痛點(diǎn)從來不是怎么渲染圖形而是 JSON 格式的約定。ECharts 的折線圖需要 x 軸數(shù)據(jù)和 y 軸數(shù)據(jù)熱力圖需要三維數(shù)組儀表盤只需要一個數(shù)值。后端視圖的核心職責(zé)就是把聚合結(jié)果整理成 ECharts 能直接消費(fèi)的結(jié)構(gòu)。import json from django.http import JsonResponse from django.views.decorators.http import require_GET from django.utils.dateparse import parse_datetime from .query import daily_average require_GET def api_daily_trend(request): station_id request.GET.get(station_id) start parse_datetime(request.GET.get(start)) end parse_datetime(request.GET.get(end)) if not all([station_id, start, end]): return JsonResponse({code: 400, msg: 缺少 station_id/start/end 參數(shù)}, status400) rows daily_average(station_id, start, end) result { code: 0, data: { dates: [r[day].strftime(%Y-%m-%d) for r in rows], values: [round(r[avg_value], 1) for r in rows], unit: ug/m3, } } return JsonResponse(result)這個接口把日期格式化成了%Y-%m-%d字符串再放進(jìn) JSON。不要直接把 datetime 對象交給json.dumpsDjango 的JsonResponse遇到 datetime 會報(bào)TypeError: Object of type datetime is not JSON serializable到時候你還得返工加 default 參數(shù)不如一開始就格式化。require_GET裝飾器限制了這個接口不接受 POST因?yàn)椴樵冾惤涌诒举|(zhì)上沒有副作用。前端如果拿不到數(shù)據(jù)第一件事是看瀏覽器 Network 面板確認(rèn)請求是否真的發(fā)出去了以及響應(yīng)的code是不是 0。狀態(tài)碼 200 但業(yè)務(wù)碼 400 的情況在這類項(xiàng)目里很常見后端和前端對異常的定義一致是順利聯(lián)調(diào)的前提。4.2 折線圖、熱力圖、儀表盤的 ECharts 配置參數(shù)拿到 JSON 數(shù)據(jù)后ECharts 的配置就是照著官方示例改。折線圖展示日均 PM2.5 趨勢xAxis的type建議用category配合字符串日期不要用time類型再傳時間戳因?yàn)?category 在數(shù)據(jù)點(diǎn)不多時縮放更順滑也不用管時區(qū)。div idchart stylewidth: 100%; height: 420px;/div script fetch(/api/daily_trend?station_id1start2025-01-01end2025-01-31) .then(res res.json()) .then(res { if (res.code ! 0) return; const chart echarts.init(document.getElementById(chart)); chart.setOption({ title: { text: PM2.5 日均濃度 }, tooltip: { trigger: axis }, grid: { left: 60, right: 30, top: 40, bottom: 40 }, xAxis: { type: category, data: res.data.dates }, yAxis: { type: value, name: res.data.unit, splitLine: { lineStyle: { type: dashed } } }, series: [{ type: line, data: res.data.values, smooth: true, areaStyle: { opacity: 0.2 }, markLine: { silent: true, data: [{ yAxis: 75 }] } }] }); window.addEventListener(resize, () chart.resize()); }); /scriptmarkLine在 y 軸 75 處畫一條警戒線這是 PM2.5 日均濃度國家二級標(biāo)準(zhǔn)的限值有這條線用戶一眼就能看出哪些日期超標(biāo)了。areaStyle的透明度調(diào)到 0.2 會讓曲線下方有淡色填充視覺上更直觀。別忘了window.addEventListener(resize, () chart.resize())否則刷新瀏覽器窗口時圖表會溢出容器。如果需要做小時級熱力圖橫軸是 24 小時縱軸是日期顏色深度代表濃度ECharts 用visualMap分段顏色option { tooltip: {}, grid: { left: 80 }, xAxis: { type: category, data: hours }, // [00:00, 01:00, ...] yAxis: { type: category, data: days }, // [2025-01-01, ...] visualMap: { min: 0, max: 200, calculable: true, inRange: { color: [#dcebff, #8ec8ff, #ffd666, #ff7875] } }, series: [{ type: heatmap, data: data3d, // [[dateIndex, hourIndex, value], ...] label: { show: false } }] };熱力圖的數(shù)據(jù)格式是三維數(shù)組[dayIndex, hourIndex, value]不是平鋪的數(shù)值列表后端接口要按索引組裝。這種圖適合展示某站點(diǎn)一周里每個小時污染濃度分布能看出早晚高峰的規(guī)律性波動。4.3 定時刷新與后端緩存讓頁面不卡死PM2.5 數(shù)據(jù)的更新頻率通常是小時級但用戶不會手動刷新頁面前端做個 30 分鐘自動請求是常規(guī)操作。定時拉取的實(shí)現(xiàn)簡單但要注意兩個問題一是用戶切換了站點(diǎn)或時間范圍之后要重置計(jì)時器二是如果每次拉取都打全量接口MySQL 撐不住高并發(fā)訪問。解決方案是給查詢接口加一層文件緩存或內(nèi)存緩存。數(shù)據(jù)的時間跨度決定了它的語義——對于已經(jīng)過去的日期聚合結(jié)果是不會變的可以放心緩存只有今天的數(shù)據(jù)會隨著新的監(jiān)測記錄寫入而變化from django.core.cache import cache def api_daily_trend(request): station_id request.GET.get(station_id) start request.GET.get(start) end request.GET.get(end) cache_key fdaily_trend_{station_id}_{start}_{end} result cache.get(cache_key) if result is None: rows daily_average(station_id, parse_datetime(start), parse_datetime(end)) # ... 組裝 result cache.set(cache_key, result, timeout1800) # 半小時過期 return JsonResponse(result)cache.set的 timeout 設(shè)成 1800 秒正好和前端 30 分鐘定時刷新同步緩存還是熱的時候前端請求會被直接命中MySQL 這層基本沒有壓力。如果你用的是 Django 默認(rèn)的 LocMemCache 緩存要注意它是進(jìn)程內(nèi)緩存多進(jìn)程部署時各進(jìn)程各存一份命中率會打折但開發(fā)和小規(guī)模使用完全夠用。生產(chǎn)環(huán)境可以考慮換成 Redis配置差異只在 settings 里增加一段 CACHES 配置代碼不用改。前端定時刷新的完整寫法是let timer null; function loadChart(params) { fetch(/api/daily_trend? new URLSearchParams(params)) .then(res res.json()) .then(res { if (res.code ! 0) return; chart.setOption({ xAxis: { data: res.data.dates }, series: [{ data: res.data.values }] }); }); } function startAutoRefresh(params) { if (timer) clearInterval(timer); timer setInterval(() loadChart(params), 30 * 60 * 1000); }注意setOption第二次調(diào)用時只需要傳變化的xAxis.data和series.dataECharts 會做 diff 合并不需要把完整配置重寫一遍。這個細(xì)節(jié)能讓圖表在刷新時保持縮放的視圖狀態(tài)用戶不會覺得頁面在閃。5. DjangoMySQL 可視化項(xiàng)目避坑手冊5 個高頻翻車點(diǎn)5.1 坑位一MySQL 驅(qū)動裝不上Django 一直報(bào) Did you install mysqlclient?現(xiàn)象python manage.py migrate時報(bào)錯說找不到 MySQL 驅(qū)動或者pip install mysqlclient編譯報(bào)錯提示缺少mysql_config。原因mysqlclient依賴本地 MySQL C 庫的 header 文件Windows 上最常見的問題是缺少 Visual C 編譯器Linux 上則需要libmysqlclient-dev系統(tǒng)包。解決直接換pymysql。在項(xiàng)目__init__.py里寫兩行代碼就能讓 Django 認(rèn)出 pymysqlimport pymysql pymysql.install_as_MySQLdb()這個操作是把 pymysql 偽裝成 MySQLdbDjango 的 MySQL 后端在 import 時會自動調(diào)用它。相比下載預(yù)編譯的 mysqlclient wheel 包pymysql 是純 Python 實(shí)現(xiàn)安裝就是pip install pymysql一條命令沒有任何編譯依賴。5.2 坑位二中文顯示亂碼curl 接口返回 UTF-8 字符變成問號現(xiàn)象前端圖表里的站點(diǎn)名、城市名變成???或者寫進(jìn) MySQL 的中文讀出來是一串亂碼。原因數(shù)據(jù)庫建的字符集不是 utf8mb4。MySQL 5.7 及以下版本默認(rèn)字符集是 latin1Django 表結(jié)構(gòu)里的vachar字段跟著繼承了這個字符集中文字符被截?cái)啻娉闪藛柼枴=鉀Q建庫語句顯式指定字符集寫入時在連接里也指定ALTER DATABASE air_quality_db DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; ALTER TABLE station CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;ALTER TABLE ... CONVERT TO CHARACTER SET會重寫表里已有的數(shù)據(jù)如果數(shù)據(jù)已經(jīng)是亂碼重寫完還是亂碼需要重新導(dǎo)庫。所以最穩(wěn)妥的做法是在導(dǎo)入數(shù)據(jù)之前就把庫、表、連接三處字符集統(tǒng)一用第 2 章里的建庫語句不要等到看見亂碼再補(bǔ)救。5.3 坑位三數(shù)據(jù)庫表已經(jīng)有數(shù)據(jù)想加索引卻卡到超時現(xiàn)象往百萬行數(shù)據(jù)的表上加索引命令執(zhí)行半天沒完開發(fā)環(huán)境的 MySQL 直接報(bào) lock wait timeout。原因MySQL 5.6 之前的版本加索引會鎖表即使在 5.7 上用ALTER TABLE ADD INDEX也是在線 DDL但如果你用的 MySQL 版本較老或者有長事務(wù)在執(zhí)行加索引還是會阻塞讀寫。解決用pt-online-schema-change工具做無鎖變更或者分兩步處理先創(chuàng)建一張新表帶上索引再INSERT ... SELECT拷數(shù)據(jù)最后RENAME TABLE。對于數(shù)據(jù)量在幾十萬級別的場景最簡單的辦法是確認(rèn)沒有別的連接在跑長事務(wù)后直接把lock_wait_timeout調(diào)大SET SESSION lock_wait_timeout 3600; ALTER TABLE air_quality_record ADD INDEX idx_pollutant_time (pollutant_id, record_time);如果索引加不上去影響到了整個接口的響應(yīng)時間這時候可行的路線是先把數(shù)據(jù)導(dǎo)入腳本跑完再一次性加上所有索引避免反復(fù) ALTER。5.4 坑位四Django 的 DateTimeField 寫入報(bào) ValueError: time data ... does not match format現(xiàn)象用datetime.strptime解析 CSV 里的一行時間字段報(bào)格式不匹配但肉眼看著數(shù)據(jù)格式明明一樣。原因CSV 里的時間精度可能不統(tǒng)一比如大部分是2025-01-01 00:00:00但偶爾有幾行是2025-01-01 0:00:00或2025/01/01 00:00:00strptime 的格式串只要對不上就拋異常。解決不要用死格式解析用dateutil.parser.parse做模糊解析from dateutil.parser import parse raw_time row[time] try: parsed_time parse(raw_time) except (ValueError, OverflowError): print(f無法解析的時間: {raw_time}) continuedateutil能識別多種常見格式省去你寫一堆try/except的邏輯。但要注意它解析2025/01/01時會按美式日期處理如果你有中文格式的2025年1月1日最好在導(dǎo)入前統(tǒng)一預(yù)處理成標(biāo)準(zhǔn)格式。5.5 坑位五接口偶發(fā) 500日志顯示 MySQL server has gone away現(xiàn)象圖表頁面剛打開時正常點(diǎn)了幾次切換條件之后突然報(bào)錯重啟服務(wù)之后又恢復(fù)。原因MySQL 的wait_timeout默認(rèn)是 8 小時Django 這邊CONN_MAX_AGE設(shè)為 60 后連接在 8 小時內(nèi)空閑會被 MySQL 服務(wù)端主動斷開Django 復(fù)用這條已失效的連接時就報(bào) gone away。這個坑在你開發(fā)調(diào)試時幾乎不會出現(xiàn)部署上線后流量低峰期最容易遇到。解決在 settings 里把CONN_MAX_AGE調(diào)小一些或者加一段連接校驗(yàn)的重試邏輯from django.db import close_old_connections # 在視圖入口處調(diào)用放棄已斷開的連接 close_old_connections()常見做法是每處理完一個請求就調(diào)用一次close_old_connectionsDjango 的 signal 機(jī)制會自動做這件事但如果你用了多線程或異步任務(wù)就需要手動加。另一個思路是改 MySQL 的wait_timeout為 28800 以上看能不能避開但治標(biāo)不治本還是建議在代碼層容忍失效連接。6. 部署后第一天就該做的驗(yàn)證數(shù)據(jù)一致性、告警線與壓測技巧6.1 一致性校驗(yàn)圖表數(shù)據(jù)對不上原始 CSV 的問題排查部署完成、頁面能出圖之后先別急著收工花十分鐘做一致性校驗(yàn)。抽查一個站點(diǎn)、一個時間范圍的聚合結(jié)果用 SQL 手算一遍對比前端展示的數(shù)值是否一致SELECT station_id, DATE(record_time) AS day, ROUND(AVG(value), 1) AS avg_pm25 FROM air_quality_record WHERE pollutant_id (SELECT id FROM pollutant WHERE codepm25) AND record_time BETWEEN 2025-01-01 AND 2025-01-07 GROUP BY station_id, DAY(record_time);把 SQL 結(jié)果和圖表上顯示的數(shù)字對一下如果差得多先從數(shù)據(jù)導(dǎo)入環(huán)節(jié)查。有幾個容易忽略的點(diǎn)CSV 里有的行是NA或者空值導(dǎo)入腳本里continue跳過之后日均值的分母會變導(dǎo)致濃度整體偏高或偏低同一時間同一站點(diǎn)有重復(fù)記錄導(dǎo)致聚合時被算了兩遍。用SELECT COUNT(*) FROM air_quality_record WHERE station_id1 AND record_time2025-01-01 00:00:00;可以快速驗(yàn)證有沒有重復(fù)有的話在導(dǎo)入腳本里加get_or_create或去重邏輯。我一般會在導(dǎo)入時額外輸出一份統(tǒng)計(jì)日志包括總行數(shù)、跳過行數(shù)、時間范圍起止、站點(diǎn)數(shù)量這樣將來數(shù)據(jù)對不上時能直接對照日志排查而不是等用戶發(fā)現(xiàn)圖表異常再回頭查。6.2 loadtest 壓測確認(rèn)你的可視化接口撐得住多看板同時在線部署完成后用django-extension的runserver_plus或者直接用abApache Bench壓一下接口底數(shù)。測試腳本只打最核心的聚合接口命令很簡單ab -n 100 -c 10 http://127.0.0.1:8000/api/daily_trend?station_id1start2025-01-01end2025-01-31-n 100表示總共發(fā) 100 個請求-c 10表示同時 10 個并發(fā)。看兩個值Time per request和Failed requests。如果平均響應(yīng)時間超過 2 秒先檢查視圖里有沒有count()做粗粒度判斷、有沒有緩存命中如果 Failed 不為 0往 MySQL 慢查詢?nèi)罩究匆谎塾袥]有全表掃描出現(xiàn)。壓測結(jié)束后把 Django 的DEBUG設(shè)為False再測一遍DEBUG 模式下 Django 會為每個 SQL 查詢記錄執(zhí)行計(jì)劃開銷很大很多人上線后忘了關(guān)接口莫名變慢。6.3 一個小習(xí)慣把看板的數(shù)據(jù)刷新頻率和緩存過期時間寫進(jìn)配置我吃過大意虧之后養(yǎng)成了寫配置注釋的習(xí)慣。項(xiàng)目的settings.py里會有這樣一段# 數(shù)據(jù)更新頻率外部數(shù)據(jù)源每 30 分鐘更新一次 DATA_REFRESH_INTERVAL_SECONDS 30 * 60 # 緩存時間略大于數(shù)據(jù)更新間隔避免邊緣請求打穿緩存 CACHE_TIMEOUT DATA_REFRESH_INTERVAL_SECONDS 60所有和數(shù)據(jù)新鮮度相關(guān)的值集中在一個文件中定版后不分散在各個視圖里。這樣做的好處是將來數(shù)據(jù)源的更新頻率變了只改一個常量前端定時刷新的間隔也可以動態(tài)暴露成接口字段不用每次改完再發(fā)一次前端代碼。可視化項(xiàng)目看著不難上線后真正消耗精力的永遠(yuǎn)是數(shù)據(jù)對不上和慢查詢把這兩個問題在部署頭一天解決掉后面就是省心的看板了。這個方向項(xiàng)目還有一個容易被忽略的優(yōu)勢它天然適合你在求職時講性能優(yōu)化的故事——從慢查詢到加索引、從逐條插入到批量寫入、從無緩存到帶超時的緩存層每一個點(diǎn)都是能展開講十分鐘的真實(shí)經(jīng)歷。希望你在自己動手跑通數(shù)據(jù)鏈路的過程中也能收獲同樣的底氣和判斷力。希望幫到你。本文還有配套的精品資源點(diǎn)擊獲取
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
五月婷婷综合激情| 激情五月天色网站| 国产探花一片区| 亚洲丁香五月| 婷婷黄色五月| 婷婷丁香五月激情| 色综合性视频| 九月停停| 色五月激情综合| 丁香婷婷午夜| 九九Av| VA色婷婷| 99国产在线精品视频| 婷婷五月天天| 婷婷色一二三区波多野结衣| 五月婷婷啪| 亚洲综合九九| 综合AV网| 激情婷婷五月| 五月天激情美女久久| 久久婷婷色丁香| 深夜婷婷 丁香| 这里只有精品免费观看网占| 一起草无码| 国产无套精品一区二区| 色性五月天| 午夜福利成人AV91| 99热在线观看精品| 牛牛碰免费| 六月激情丁香一道本7777| 变态另类9| 五月天丁香啪啪综合| 亚洲V国产V欧美V久久久久久| 亚洲一区二区无码蜜乳av| 国产91在线视频| 色婷婷视频综合| 一操久久| 天天干,天天日| 婷婷五月天干干| 9久操| 色婷丁香| 武汉美女啪啪视频免费一级片| 九九精品婷| 啪啪婷婷五月天激情| 婷婷五月深情丁香深爱日韩| 任你搞在线观看视频| 99婷婷国产最新视频| 这里只有精品热| 性爱激情久久| www.五月丁香| 色色色激情网| 久久久性爱视频| 2w在线视频| 99草视频在线观看| 久久色大香蕉| 婷婷五月天成人网| 亚洲激情综合免费| 5月婷婷六月丁香| 影音先锋秋秋五月婷婷| 丁香五月婷婷基地| 欧美五月婷婷| 五月天社区狠狠| 99在线视频精品| 午夜亚洲AV日韩无码| 色色色色色色综合| 天堂婷婷五月在线| 丁香久久五月婷综合| 色综合五月天| 亚洲AVwwwwwww| 五月天久久成人| 五月婷婷六月丁香激情| 五月天婷婷色小说| 女人被男人吃奶到高潮| 大香蕉婷婷婷| 婷婷五月婷婷| 99久久婷| 另类综合激情| 99久久www| 超级碰碰碰碰视频| 婷婷五月天黄色| 中文精品在| 丁香五月亚洲激情婷婷射| 2017狠狠干| 色噜噜狠狠色综无码久久合欧美| 色婷婷88| 国产亚洲精久久久久| 久久影视婷婷五月| 激情综合五| 99色在线| 天天舔天天操| 亚洲五月婷婷在线| 综合久久婷婷五月丁香| 99热自拍| 色丁香久久| 色婷婷AV久久| 91干视频| 久久精品一区二区三区四区| 日日综合网| 亚洲婷婷免费| 天天搞天天色综合| 久久这里只有精品16| 操一区| 伊人喵咪a V| 成人做爰高潮A片免费视频| 性色99| 六月婷婷成人| 婷婷偷拍网| 9久热在线精品| 国产日产亚系列精品版优势| a久久| 婷婷五月在线观看| 久久久这里有精品| 五月天播播中文字幕| 玖玖福利视频资源| 日韩少妇内射免费播放| 99国产精品久久久久久久久久久| 婷婷精品视频| 成人做爰A片免费看网站找不到了| 99热免费| 欧美成人性爱网| 久久九精品| 婷婷久久夜| xxxx五月| 丁香五月激情婷婷激情| 久久亚洲婷婷| 婷婷久久视频| 五月天激情综合10p| 97激情五月天| 99久热| 精品导航在线x不卡| 丁香五月五月婷婷| 五月丁香六月激情| 九九综合影音先锋| www.99热国产| 五月激情天| 五月丁香综合啪啪| 日韩AV免费看| 色婷婷激情视频| 深夜男女福利刺激影院一区| 五月婷婷丁香婷婷| 丁香激情婷婷网| 色综合久久88色综合天天人守婷| 五月婷婷久久网| 天天插夜夜爽| 国产五月天欧美色| 久久精品婷婷| 丁香六月婷婷| 成人在线视频网| 精品人妻在线| 夜夜大香蕉婷婷丁香| 久久大香蕉同僚| 97色片| 偷偷狠狠久久婷婷五月天| 日韩成人综合网| 99久久亚洲精品视频| 婷婷五月花丁香| 日本一级淫| 大地9中文在线观看免费高清| 午夜天堂一区人妻| 超碰京东热av男人的天堂| 日日噜噜久久婷婷五月天| 北条麻妃伊人| 国产综合81p| 黄色成人网站在线播放| 激情五月六月婷婷综合啪啪| 五月婷久久在线| 综合色色色| 九九久热| 噜噜噜噜综合在线| 久久久久丁香婷婷五月天| 伍月婷丁香花全集| 人人人舔人人人操人人人摸人人人97 | 五月色导航| 五月婷婷丁香五月婷婷| 国产精品视频免费看| 久久99精品久久久久久三级| 婷婷五月天基地| 亚洲岛国电影| 91人人爽狠狠狠| 国产免费一区二区在线A片视频| 久久99婷婷| 精品久久人妻热| 久久婷婷综合国产| 3p日韩网站视频| 久久精品只有这| 99热超碰在线| 九九色插| 久久丁香五月婷婷激情综合网| 激情综合色婷婷啪啪六月天| 亚洲综合激情五月久久| www,久久久人人| 久久99综合| 99热这里只有精品69| 五月婷婷六月天| 天天做夜夜爽| 欧美va亚洲va| 中文字幕激情综合| 久热久69| 天天激情5月天亚洲| 99精品无码网站| 五月婷六月丁香| 色99热| 免费看欧美成人A片无码| 青青日韩| 99er免费在线观看| 大香蕉啪啪| 激情五月天福利| 天天插天天爽| 夜夜操加勒比| 色五月婷婷综合在线| 天天干天天玩天天夜天天射天天操天天日蜜臀少妇 | 99热这里只有精彩| 操操日韩| 色五月aV| 亚洲愉拍99热成人精品| 亚洲无码九九九| 婷婷五月色花丁香社区| 97干97色| 99re热在线视频观看| www久| 丁香五月婷婷手机| 亚洲亚洲人成综合网络| 爆乳熟女一区二区三区爆乳| 日日噜狠狠色综合久久| 极品少妇XXXX精品少妇偷拍| 秋霞性爱AV| 五月天天爽| 久久思思99| 超碰狠狠干99| 久色网址| 在线只有精品| 久久久国产精品黄毛片| 色色色色欧洲| 久久99视频| 国产亚洲成人综合| 精品久久婷婷| 色色日本| 国产XXXX搡XXXXX搡麻豆| 日韩性视频| www.久久66| 婷婷五月丁香综合| 99热大香蕉| 久久免费婷婷视频| 熟妇人妻中文字幕无码老熟妇 | 天天久久狠狠色综合| 在线中文字幕免费视频| 五月色导航| 99视频在线精品| 九九99在线| 丁香五月婷婷激情中文| 美女久久天堂| 特级片神马电影| 五月丁香久久| 五月六月丁香激情视频| 五月丁香综合激情网| 天天肏在线观看| 五月天狠狠干| 久久综合五月天激情小说网站 | 操逼福利视频| 亚洲字幕AV一区二区三区四区| 性爱网五月天| 日韩成人无码人妻| 日韩啪啪视频| 九九99久久| 久操热| 91精品久久久久久久久| 亚洲乱码在线观看| 国产免费AV网站| 五月久久婷婷成人网| 99碰碰碰| 五月婷婷开心亚州在线| 人妻在线观看视频| 人人摸人人| 人人叉久| 久久狼人天堂| 五月综合亚洲色| 久久精品人妻| 婷婷 激情 五月| 天天综合色| 五月天日日操夜夜操 | 日韩一级片| 伊人五月天97| www.超碰在线| 日韩久热| 丁香五月成人| 婷婷舔| 无码激情AAAAA片-区区| 婷婷丁香视频在线观看免费| 日韩性爱AV| 99热这里只有精品一区| 97婷婷五月丁香| 五月综合色播播丁香婷婷| 五月婷天堂视频| 久久久精品人妻录| 色激情五月| 婷婷久久色| 综合视频久久| 午夜69成人做爰视频| 五月丁香婷婷五月色| 密着浓厚中出乚交尾GvG935| 天天色视频| 先锋资源91| 97资源碰碰| 色色99色色| 丁香婷婷天堂| 欧美狠狠色| 色五月综合网| 精品热青草| 26UUU精品一区二区| 狼友超碰| 欧美成人精品A片免费一区99| 五月天艹天天| 欧美五月婷婷| 欧美三级巜人妻互换| 激情五月丁香五月| 丁香五月婷婷六月婷婷| 久综合九综合99| www.yw色| 天天插天天干天天舔| 久久丁香社| 超碰国产在线| 逼里香不卡| 99热这里只有精品1025| 成人无码免费一区二区中文| 99热综合网| 天天噜天天爱| 欧美大道不卡| 五月天激情综合| 综合色色婷婷| 任你爽免费视频| 色婷婷成人做爰A片免费看网站| 丁香六月天婷婷开心综合| 五月婷婷综合性爱噜噜| 成人片黄网站色大片免费毛片| 五月婷天天搞视频| 久久五月天综合视频网站| 变天就操逼婷婷五月| 九九AV| 婷婷五月丁香网| 97狠狠色| 美女被肏网站在线看| 99综合视频一体| 99久久精品视频女神1| 色婷婷伊人| 激情婷婷五月丁香啪啪啪| 欧美三级欧美一级| 这里只有精彩视| 综合网色| 丁香五月婷婷天堂大香蕉| 91啪啪视频| 这里只有精品在线看| 成人婷99最新| 黄色毛片精品| 免费视频WWW在线观看网站| 99只有这里有精品在线视频| 婷婷色丁香五月| 99激情网| 百度4399有码精品V在线观看| 国产日韩欧美| 九九视频这里只有精品| 激情啪啪五月| 六月婷婷狠狠做| 碰碰女| 婷婷五月综合丁香久久| 欧美内射AAAAAAXXXXX| 婷婷色色丁香五月天| 99爱免费视频在线观看| 99热 免费| 91精品综合久久婷婷九色| seav天堂| 嫩BBB搡BBBB榛BBBB| 成人 视频免费观看网站| 婷婷丁香五月天中文字幕| 婷婷欧美激情综合| 五月色综合| 色婷久| 激情综合五月丁香六月婷婷| 丰满少妇乱A片无码| 99在线精品视频| 国产精品电影网| 日日舔夜夜操| 国产精品色一哟哟| 亚洲XX日本| 五月天婷a在线| 激情性爱五月天| 1024欧美日韩精品久久久| 狠狠色色色| 欧美三级A做爰在线观看| 我爱大香蕉| 婷婷色五月开心五月| 99久久6| 狠狠五月天婷婷激情网。| 丁香五月丐人妻| 婷婷丁香在线| jiqingtaose五月天| 婷婷97碰碰| 九九色院| 人人九色| 久久精典| 99色婷婷| 俺也去婷婷五月天第五色| 99热人人| 婷婷六月激情小说网| 九九九九毛片| 热99国产精品| 玖月婷婷爱丁香| 狠狠香蕉| 五月丁香色色综合| 天天人人天天爽| 99热99热在线观看| 日本va欧美va精品发布视频| 日韩无码人妻一区二区三区综合| 欧美综合激情五月| 五月天色婷婷伊人网| 国产日日操夜夜操的肉棒视频| 国产又黄又爽又激情不遮挡视频在线观看| 五月激情综合五月| 五月丁香花激情综合网| 婷婷六月久久综合导航| 99成人在线观看| 久久五月丁香| 2017狠狠干| 亚洲无线视频| 夜夜撸夜夜骑| 日本少妇裸体做爰高潮片| 亚洲激情综合| 婷婷五月丁香基| 乱岳熟女50岁| 96精品国产综合久久久久久| www.综合久久.com| www,五月天com| 久久五月天综合视频网站| 激情播丁香| 天天射天天射一道本日本社区| 婷婷五月天电影在线| 久久99性爱| 激情五月色婷婷| 婷婷五月天Av| 自拍偷窥99热| 成人做爰高潮A片免费视频| 综合AV网| 精品久热69| 久久99综合| 五月综合激情图片| 日本操B视频| 久久伦乱| 天天干天天做| 中文字幕中文有码在线| 97自拍99| 婷婷丁香六月| 丁香五月婷婷成人网| 五月婷婷六月丁香综合| 成人短视频在线观看| 成人精品视频99在线观看免费| 九九99精品视品| 色九月国产| 国产日产成人亚洲欧美国产VA| 六月婷婷色五月| 色婷婷精品| 亚洲色综合| 国产毛片精品一区二区色欲黄A片| 久久丁香婷婷色情综合| 日本人妻A片成人免费看片| 管管補管管紱| 五月婷婷,狠狠操| 操操碰| 久9热在线免费观看| 欧美丁香五月97色| 99精品久久久久久久婷婷久久| 99精品久久久久| 欧美韩国日本| 激情婷婷在线中文字幕| 婷婷丁香五月天狠狠| 国产精品美女| 大香蕉色婷婷伊人在线| 超碰免费成人| 逼里香不卡| 婷婷基地爱| 成人免费超碰| 精品国产va久久久久| 六月天无码网址| 激情久久丁香| 男人大jjc女人免费视频| 五月婷婷色影院| 思思热再线视频| 996er热| 99久久婷婷国产综合精品电影| 中文精品在| 婷婷六月网| 另类A片| 99精日本久久| 亚洲一色色色色色色色色| 激情五月天天狠狠久久| 综合久久五| 五月丁香六月色婷| 秋霞AV淫| 黄色AAAAAAA| 777影视理论片大全在线观看| 精品成人在线| 91色综合网| 久热A| 五月婷婷六月色| 婷婷丁香www视频日本韩国| 99热这里只有精品国产免费| 91干| 92国产福利| 五月天色婷婷网| 久久九九色| 99ri视频在线播放| 深爱激情网五月天| 婷婷五月在线影院| 日本在线免费中文com.| 色欲天天综合| 在线观看亚洲AV| 婷婷四色成人综合色视| 任你躁XXXXX麻豆精品| 啪啪啪大香蕉| 9久久精品| 97丁香五月| 亚洲无码九九| www.99色在线| 99热最新网址| 开心五月深爱五月| 丁香五月色色色色| 开心五月网| 久热一本| av久热| 日本久草福利| 十一月婷婷激情四射| www。五月,com| 四色 爱 婷婷 精品 亚洲 五月天| 丁香色五月天| 五月天激情四射| 日本三久久| CAOBIBI| .comwww在线观看免费操| 色五月婷婷开心| 国产亚洲色婷婷久久99精品91| 狠狠色婷婷综合开心影视| 亚洲 在线 性爱 | 五月天激情国产综合婷婷婷| 99熟女| 色五月婷婷基地| 欧美日韩成人免费在线| 丁香六月婷婷综合缴| 丁香五月天大香蕉啪啪| 五月婷色啪| 色六月 婷婷| 五月丁香久久久| 日韩精品无码一区二区| 综合久久五月| 日本玖玖在线| 色99在线| 99热这里只有精品1025| 天天玩夜夜操| 99丁香五月婷 | 五月天婷五月天综合网在线观| 五月丁香激情啪啪| 亚洲婷婷丁香五月在线| 免费无码毛片一区二区A片| 色婷婷欧美在线| 国产乱子轮XXX农村| 丁香激情六月天婷婷| 中文字幕视频色婷婷| 五月综亚洲| 五月天丁香久久综合| 色五婷婷| 亚洲AV第二区国产精品| 天天精品视频免费观看| 久久99最新| 亚洲精品久久久久久久久久飞鱼| 丁香五月大片| 色色色丁香| 激情五月婷婷综合| 99热日韩| 99只有精品| 99色在线观看| 亚州综合色| AAA久久| 久久这里面只有精品视频| 久久久久亚洲AV综合| 色婷婷五月天不卡| 丁香五月天网站| 亚洲av日韩无码| 女人天堂AV| 激情丁香五月激情婷婷| 久久久精品99| 婷婷操超碰| 五月天天天操天天爽夜夜操| 玖玖婷婷色欲| 婷婷婷久久久| 亚洲欧洲色色| 96色婷婷| 色五月婷婷中文字幕| www.色窝| 亚洲操B视频| 夜夜骑夜夜撸| 秋霞三及片| 久9热视频在线观看| 91丨九色丨东北熟女| 五月婷婷精品无在线| www.五月婷| 九九热视频精品| 五月色俺婷婷| 99ri精品| 天天干人人奸97| 色九亚洲| 3pAV| 91色干| www.五月婷婷| 99在线精品免费视频| 五月好婷婷| 色欧美影院| 开心五月天激情网| 无码动漫av| 天天上天天爽| 激情五月综合第一页| 婷婷色在线播放| 伊人九九综合| 久9热| 精品草原久久视频| 人妻久久久久| 综合超碰熟| 婷婷六月色| 色婷婷日本| 天天色天天爱天天舔| 婷婷丁香综合| 国产FREESEXVIDEOS性中国| 午夜激情五月天| 思思色播| 在线观看亚洲视频影院| 婷婷综合仓库中文| 天天做夜夜爽| 99亚洲视频| www.俺去也com| 久草婷婷| 久久精品91视频| 色欲操| 色爱99| 99热久久这里只有精品| 99在线播放视频| 亚洲AAA| 亚洲色色色色色色色色色| 婷婷视频在线| 天天日天天插| 丁香五月天堂| 国产偷人妻精品一区| 森林影视大全,最好看的2019年视频 | 激情碰碰碰| 99热| 久青草影院| 亚洲色五月婷婷| 思思热再线视频| 开心丁五月| 丁香色五月 97干| 日韩精品一区二区刘| 免费三级黄色| 日韩精品AV一区二区三区| 婷婷久久五月| 色婷婷久久综合中文久久一本| 久热这里只有精品99re,久热这里只有精品7| 丁香九月婷| 91啪啪网| 91在线日本| 超级碰碰碰久久网站| 欧美大片免费观看| 1000部毛片A片免费观看| 99久久综合| 日本一级一级一级一级| 婷婷丁香五月激情| 色吧五月| 99热综合| 怡红院AV亚洲一区二区三区H| 久久久国产精品黄毛片| 一级片操逼视频| 狠狠婷婷色| 万月丁香狠狠爱| 99久99久| 日本三级色| 一区无码| 伊人婷婷福利网| 大色鬼综合| 免费观看全黄做爰的视频| 五月激情影视| 亚洲午夜av| 亚洲天堂色色| 99色色网| 国产美女无遮挡裸体毛片A片| 99色在线| 综合色播| 国产无套精品一区二区| 琪琪色五月婷婷老师| 无码人妻少妇色欲AV一区二区| 五月婷婷啪啪| 亚洲第一成人无码A片| 天天色综网| 少妇性按摩无码中文A片| 中文字幕无码人妻少妇免费视频| 三级黄色大片视频| 曰韩少妇内射免费播放| www婷婷色| 人妻在线观看视频| 婷婷五月激情在线| 激情婷婷综合| 色婷婷综合网| 久热免费| 国产肥白大熟妇BBBB视频| 99婷婷精品推荐在线视频| 麻豆观看夏晴子| 五月久久丁香| 91色干| 五月停停色色丁香| 噜综合| 狠狠狠人妻| 五月婷婷五月天亚洲无码| www一起操在线观看| 超碰不卡在线| 综合狠狠伊人| www.五月天。com| 五月婷婷久久综合| 九九色大香蕉| 天天干夜夜b| 五月丁香综合激情网| 日本无码专区| 色屌丝中文字幕| 激情五月丁香亭亭| 99热精这里只有精品| 91人人操人人| 超碰97色| www.久久久久久久| 日韩小视频在线99| 久久99操| 欧美十二区| 精品成人在线观看| 欧美Va在线| 日本三级中文字幕| 2025神马午夜福利| 中文字幕视频在线播放| 五月婷婷无码专区| 1024国产| 超碰国产一区| 久久久妻人人人| 无码人妻一区| 色婷五月天| 色欲婷婷五月天丁香| 激情六月五月婷婷综合网| 天天天天操| 成人做爰高潮A片免费视频| 色噜噜五月天| 丁香六月天婷婷开心综合| 久久婷色| 婷婷丁香五月天熟女丝袜| 精品婷婷五月视| 色婷婷五月天成人网| 五月婷婷综合在线亚洲视频| 国产激情久久久| 日本熟女二区| 欧洲电影在线观看免费版英语版 | 欧美A级网站| 99免费| 国产成人精品一区二区三区视频| 99自拍视频网站| 天天色色天天| www.色五月| 另类视频一区| 99热综合| 丁香五月激情综合久久| 成人精品一区二区三区四区五区| 99狠狠| 亚洲成人AV一区在线观看| 亚洲性图一区二区三区| www.99久| 69色婷婷| 丁香五月停停av| 青青青在线视频国产| 99热日韩| 九月av| www.com在线操视频免费观看| 久热免费| 99在线资源| 五月天综合在线观看| 女人被躁到高潮嗷嗷叫小| 色婷婷XXXXX| 欧美99视频| 冬月かえでAV无码播放| 96五月丁香熟女| 久久综合99综合| 天天操中文字幕| 国产乱妇乱子伦| 天天干天天做| 久久青草国| 思思久日精品视频| 1024在线一区| 天干天天干天天天天天| 五月婷丁香| 九九色逼| 日本久久高清| 97色欧美| 91婷婷搞| 国产精品成人AV在线| 天天做天天爱| 任你干嘛免费视频播放| 99'无码| 婷婷五月综合体验看| 亚洲最大视频网站| 五月丁香六月婷婷视频| 中文字幕91,综合| av人人操| 97婷婷五月丁香| 五月丁香婷婷俺| 狠狠色综合图片| 色五月婷婷五月丁香五月| 日韩在线观看网址| 国产免费一区二区三区三州老师F1F1.CC | 亚洲综合视频天天精品| 五月婷在线观看| 五月天久草| 玖玖资源在线视频| 91久久九九| 色吧五月婷婷| 亚洲第二AV| 日日操夜夜爽| 丁香六月狠狠干| 色婷| 久久丁香五月综合六月激情红杏视频 | 99操视频| 日日日日日| 亚洲人人96@| 全部老头和老太XXXXX| 99热这里只有精品23| 97日本在线播放| 狠狠色综合网站久久久久| 婷婷 丁香 久久| 久热99热| 无码se| 成人视频网| 综合综合网| 91久久精品视频| 久久看婷婷| 婷婷五月天激情四射| 另类天堂| 久久aaaa片一区二区| 国产操逼网站| 婷婷五月情| 天天爱天天日| 婷婷伊人五月天| 精a品a| 成人版视频在线观看| 久久人人妻| 国内自拍97在线| 婷婷综合五月天亚洲综合| 五月天停停日日| 五月婷婷激情综合网| 激情五月天综合图片小说网站| 99视频这里有精品| 日婷婷久久开心| 中文字幕在线播放视频| 最近中文字幕在线中文视频| 丁香婷婷色情社区成人小说| 在线观看亚洲视频影院| 欧美操人| 这里只有久久精99| 激情四射五月天| 香蕉久久国产AV一区二区| 五月天涩涩| 91热爆在线| 久久久国产精品黄毛片| 六月激情久久| 噜一噜免费视频| 99天堂在线观看免费视频| 狠狠爱五月婷婷| 激情99。| 五月天婷婷久草丁香| 亚州操人在线视频| 国产色五月婷婷| 丁香五月91| 日本英国美国欧美亚洲国产精亚洲日韩精品在线观看 | 久久久18| 97操操操| 五月婷婷中文字幕| 午夜丁香 婷婷| 都市激情小说婷婷| 国产露脸150部国语对白| 色噜噜狠狠色综| WWW免费视频碰碰碰碰| 九九美女视频| 五月天激情av| 99久操视频| 99成人精品| 无码激情AAAAA片-区区| 激情五月婷婷免费视频| 久99| 国产精典视频在线观看| A1片久久久| 91久久色| 成人短视频在线免费观看| 熟女国产在线一区二区三区四区| 欧美3AaAa大片| 91婷婷视频| 特级片神马电影| 亚洲午夜成人av电影网| 婷婷六月插屄激情| 国产肥白大熟妇BBBB视频| 永久思思热在线| 伊人婷婷99热精品| 99这里只有精品视频| 开心网五月色婷婷| 桃色激情婷婷伊人网| 一起草无码| 91在线观看九区| 久青草影院| 国产日韩欧美性爱| 一区二区三区四区无码| 六月婷婷深深爱| 99久久99视频| 色婷婷av综合网| 五月天激情婷婷| A级毛片高清免费不卡播放谢谢谢谢| 国产乱人偷精品人妻A片| 996热re视频精品视频| 这里只有免费的精品| 婷婷久久午夜网| 鲁鲁色五月| 五月天色影院| 日韩av在线免费观看| 五月天婷婷人妻| 色五月婷婷、老熟女| 91啪啪视频| 大香蕉大香蕉在线影院| 色婷婷狠狠18yy| 丁香五月花| 激情五月婷婷| 九九色影院| 玖玖五月丁香| 丁香五月婷中字幕| 开心激情站婷婷五月天| 婷婷五月激情基地| WWW,色五月| 亚洲第一成人无码A片| 大香蕉75线| 波多野结衣成人作品在线| 亚洲愉拍99热成人精品| 色五月婷婷五月天| 99热综合网| 日本片日本片祼观看网站在线看中文版网页在线看 | 一级片无码| 天天日天天久久青青| 99无码| 婷婷五月天影院| 99热在线观看精品| av网址在线| 8区视频在线| 97色天堂| 97色97干| 五月丁香网站| 99视频在线观看网址| xxx.色婷婷| 亚洲亚洲永久无码777777| 欧美天天干天天草| 婷婷色五月激情| 玖玖99免费视频| 99在线免费视| 大香久久综合网| 深夜男女福利刺激影院一区完整| 色婷婷成人影片| 伊人激情网| 五月丁香婷婷六月| 久久久久人妻精选| 激情综合网五月丁香| 亚洲亚洲人成综合网络| 五月婷婷色| 婷婷五月丁香狠狠| 色噜久| 国产av天堂| 婷婷六月色开 | 欧美日本VA| 欧美图片丁香五月天| 久久婷婷国产| 狠狠香蕉| 丁香五月婷婷无码AV| 婷婷丁香色五月天久久88| 婷久看人爽| 九九久久99| av人人操| 成人开心五月天| 超碰在线综合| 色综合色婷婷色伊人| 99精品这里只有免费视频 | 五月丁香好婷婷姑娘综合网| 色视五月天婷婷| m色激情网| 激情www| 婷婷五月天综合久久| 午夜丁香婷婷| 亚洲成人在线播放| 91人人人人人| 婷婷丁香黄色| 午夜九九九九九九九九九九九九九| 九九九色综合| 欧美色色色色色色色色色色影视| 婷婷亚洲丁香五月| 日日噜狠狠色| 婷婷五月综激情| 天天狠狠夜夜狠狠2023| 精品亚洲国产成人A片在线鸭王| 日本V在线观看不卡视频网站| 天天视频精品9| 激情五月天的婷婷| 激情丁香五月天综合| 六月丁香婷婷色综合| 国产精品久久7777777精品无码| 俺去也综合| 超碰久热| 日本乱子人伦在线视频| 亚洲成人av在线观看| 91色综合网| 精品婷婷五月天| 九九色综合视频| 4399在线日本A片| 狠狠五月天| 91九色 熟| 超碰九九热| 狠狠人人| 人妻精品一区二区三区| 五月激情六月宗合| 婷婷色色综合| 五月丁香综合成人社区| 五月丁香久久综合| 情婷婷五月天| www.99在线| 五月天综合在线网| 欧美色色干| 丁香五月婷婷色综合基地| 噜噜五月天综合| 五月亭亭直播| 久久性都花花世界成人免费视频| 人妻激情在线| 婷婷丁香人妻| 丁香婷婷色情| 日韩丰满少妇无码内射| 182tv992tv人之初午夜免费观看| 五月天婷婷在线视频| 欧美日韩成人在线| 国产亚洲99久久精品| 丁香九月婷| 99色在线| 久久综合五月天| 开心婷婷五月| 婷婷五月花| 九九久久综合| 麻豆AV一区二区三区| 无码激情AAAAA片-区区| 国产成人片| 99干日日干| 亚洲xx在线| 伊人超碰在线| 99视频91| 五月 成人 婷婷| 粉嫩av蜜桃av蜜臀av| 婷婷伊人网| 久久婷婷五月综合97色一本| 丁香六月婷婷综合激情欧美| 色色永久| 热99久久这里只有精品| 丁香六月爱综合| 成人日韩欧美| 丁香花操逼| 日日干日日s| 综合色色网| 日韩AV中文字幕在线| 婷婷六月丁香1| 亚洲AV网站| 开心五月激情婷婷| 开心激情站| 热五月婷婷| 天堂草在线看www| 2018国产大陆天天弄| 久久婷婷成人| 丁香五月天AV| 免费无码毛片一区二区A片| 欧美久久婷婷| 26UUU精品一区二区| 小香蕉av| 丁香六月 婷婷六月| 9精品在线| 五月丁香婷婷99| 思思热在线视频99| 啪啪91| 九九色精品| 国产成人高清| 日本 色综合| 国产高清精品色| 风流少妇A片一区二区蜜桃| 婷婷丁香五月综合| 丁香狠狠色婷婷| 久久久久久久久久婷婷| 就爱射中文字幕资源网| 久久精品99国产精品日本| 激情五月天色色| 9999三级片| 天堂网色色| 欧美一级操逼视频| 色婷婷很很十八禁| 久久久婷丁香五月| 色色色综合网| 精品视频这里只有精品| 亚洲网视屏| 日本一毛片| 99看片| 日本久久极品| 热思思| 激情婷婷护士激情| 婷婷五月天亚洲丁香| 亚洲中文字幕AV在线| 五月丁香狠狠爱婷婷综合| 婷婷久久综合久| 伍月婷丁香婷| 99国产在线| 亚洲另类在线观看| 亚洲综合在线视频| 亚洲九区| 人妻AV在线| 成人短视频在线观看| 九九久久综合| 激情综合网五月婷婷| 97色在线视频| 色综合激情| 色婷婷小说| 色色日韩网| www.狠狠| 激情五月图| 九九热精品| 激情五月天开心网丁香无码| 国产99久久久国产精品免费看| 日本本土色网第一区| 大香蕉手机视频| 久久这里只有精品07 | 2015好吊操| 开心五月激情网| 婷婷激情五月天天天开心| 婷婷五月色| 天干干夜夜操| 成人 在线观看国产| 欧美激情凹凸丁香网| 亚洲精品视频在线播放| 欧美成人一区二区三区在线视频| 丁香五月综合婷婷| 欧美婷婷成人| 大香蕉 婷婷| 久久成人性爱| 色五月激情综合网| 综合色婷婷| 婷婷精品性性性性性性性| 婷婷伊人| 这里只有精品免费在线视频| 婷婷五月天基地| 亚洲成人网址在线观看| 干一干xxxx| 色99网| 91大神操美女| 日韩色五月| 丰滿爆乳一区二区三区| 玖玖福利视频资源| 人妻免费网站| 九九在线精点品| 五月丁香久人妻中文| 538在线精品| 5月婷婷六月丁香| 精品婷婷丁香五| 六月激情网| 精品久久99码| 国产午夜成人AV在线播放| www.亭亭五月天| 婷婷亚洲久久| 色婷婷久久| 五月的婷婷六月丁香| 九九99视频精品| 久久五月天视频| 丁香五月综合激情久久潮喷| 五月J香蕉婷婷| 九九视频在线| 亚洲免费看片| 五月丁久久| 性综合网| 婷婷五月综合色中文字幕| 婷婷丁香中文字幕| 亚洲激情综合| 婷激情五月天视频导航| 大香蕉久久综合网| www.99热在线| 激情五月第四色| 996re热精品视频| 亚洲啪啪啪啪| 色婷婷五月网| av无码电影| 五月天激情视频| 成人综合伍月天| 97久久久久| 亚洲欧洲另类图片| 丁香五月先锋| 亚洲婷婷五月草久| 9热在线视频精品| 久久久久9999| 色色射| 色六月丁香婷婷啪啪啪| 97午夜一区二区| 无码人妻电影| 九月色婷婷综合| 大香蕉九操| 啪啪日热| 99亚洲天堂| 天天做 天天爱| 五月婷婷激情综合| 激情玖玖综合网| www夜夜操| 女高怪谈在线观看| 天天操夜夜啊| 月色色综合婷婷网| 777精品久无码人妻蜜桃| 人人操av| 婷婷开心青青草| 9精品视频在线观看| 无码少妇高潮喷水A片免费| yellow视频在线观看91| 99视频这里只有久久精品| 丁香五月区| 在线不卡AC| 天天日天天插| 无码色| 热久久视频99| 欧美情月伍月天| 操b视频在线观看一区二区| 欧美成人精品A片免费一区99 | 九九久热| 九九99热| 色婷婷六月天| 台湾佬天天日丁香婷婷五月天| 欧美超碰亚洲| 久久停停超碰| 五月丁香六月婷婷在线小说视频| 香港九九六区八区99| 超碰资源在线| 5月婷婷综合| 夜色爱爱亚洲| 涩五月婷婷| 欧美视频在线观看噜噜| 色综合色色色色| 综合色色网| 熟妇内谢69XXXXXA片| 狠狠狠夜夜夜| 国产精品久久..4399| 成人精品视频99在线观看免费| 精品乱码久久久久| 九九国产精视频| 无语停婷丁香网| 色情五月婷婷| 热成人网| 五月婷久久| 日韩日比视频在线| 日本人妻A片成人免费看片| 日日操日日射| 国产激情AV| 婷婷不卡基地| 婷婷五月天伊人| 99热激情| 五月婷婷和六月|