report-generation
npx skills add https://github.com/apconw/aix-db --skill report-generation
Agent 安装分布
Skill 文档
éç¨æ¥åçææè½
使¶ä½¿ç¨æ¤æè½
å½ç¨æ·éè¦çæä»»ä½ç±»åçæ¥åæ¶ä½¿ç¨æ¤æè½ï¼å æ¬ä½ä¸éäºï¼
- ä¸å¡æ¥åï¼é宿¥åãæ¶å ¥åæãä¸ç»©ç»è®¡ãè´¢å¡æ¥è¡¨
- æ°æ®åææ¥åï¼è¶å¿åæã对æ¯åæãåå¸åæãç¸å ³æ§åæ
- ç»è®¡æ¥åï¼æ±æ»ç»è®¡ãæåæ¥åãå æ¯åæãå¼å¸¸æ£æµ
- è¿è¥æ¥åï¼ç¨æ·è¡ä¸ºåæã产å使ç¨ç»è®¡ãç³»ç»çæ§æ¥åãè¿è¥ææ
- èªå®ä¹æ¥åï¼æ ¹æ®ç¨æ·å ·ä½éæ±å®å¶ç任使¥å
å ³é®ç¹å¾ï¼
- è½å¤çè§£ç¨æ·çèªç¶è¯è¨è¯æ±
- èªå¨è¯å«æ¥åç±»ååæ°æ®éæ±
- çæä¸ä¸çå¯è§åæ¥å
- æ¯æå¤ç§æ¥åæ ¼å¼åå¾è¡¨ç±»å
â ï¸ éè¦çº¦æï¼
- ç¦æ¢åå ¥æ¬å°æä»¶ – ä¸å 许使ç¨ä»»ä½æä»¶ç³»ç»å·¥å ·ä¿åå°æ¬å°
- ç¦æ¢è°ç¨ä»»ä½ä¸ä¼ å·¥å
· – ä¸ä½¿ç¨
upload_html_report_to_minioæupload_html_file_to_minio - HTML æ¥åå¿ é¡»ç´æ¥è¾åºå°å¯¹è¯ä¸ – 使ç¨ç¹å®åé符å 裹ï¼å端ä¼èªå¨è¯å«å¹¶æä¾é¢è§åä¸è½½åè½
工使µç¨
1. çè§£ç¨æ·è¯æ±
ä»ç»åæç¨æ·çæ¥åéæ±ï¼è¯å«ä»¥ä¸å ³é®ä¿¡æ¯ï¼
- æ¥åç±»åï¼ç¨æ·æ³è¦ä»ä¹ç±»åçæ¥åï¼ï¼éå®ãç¨æ·ã产åãè¿è¥ãè´¢å¡çï¼
- æ°æ®ç»´åº¦ï¼éè¦æä»ä¹ç»´åº¦åæï¼ï¼æ¶é´ãå°åºãç±»å«ãç¨æ·ã产åçï¼
- å ³é®ææ ï¼ç¨æ·å ³æ³¨åªäºææ ï¼ï¼æ»éãå¹³åå¼ãå¢é¿çãæåãå æ¯çï¼
- æ¶é´èå´ï¼éè¦åæåªä¸ªæ¶é´æ®µçæ°æ®ï¼ï¼æè¿ä¸å¨ãä¸ä¸ªæãä¸å¹´çï¼
- 对æ¯éæ±ï¼æ¯å¦éè¦å¯¹æ¯åæï¼ï¼åæ¯ãç¯æ¯ãä¸åç±»å«å¯¹æ¯çï¼
- å¯è§åéæ±ï¼ç¨æ·å¸æçå°ä»ä¹ç±»åçå¾è¡¨ï¼ï¼è¶å¿å¾ã对æ¯å¾ãåå¸å¾ãæåå¾çï¼
- æ¥åæ ¼å¼ï¼æ¯å¦éè¦æè¦ãè¯¦ç»æ°æ®ãå¾è¡¨ãç»è®ºã建议ç
å¸¸è§æ¥åè¯æ±ç¤ºä¾ï¼
- “çæä¸ä»½é宿¥åï¼æ¾ç¤ºè¿å»ä¸å¹´çæåº¦éå®è¶å¿”
- “åæç¨æ·æ´»è·åº¦ï¼æå°åºç»è®¡ç¨æ·æ°éå¹¶çæå¯è§åæ¥å”
- “çæäº§ååºåæ¥åï¼æ¾ç¤ºå产åçåºåç¶æåé¢è¦”
- “å建ä¸ä¸ªæ¶å ¥åææ¥åï¼å¯¹æ¯ä¸åæ¸ éçæ¶å ¥å æ¯”
- “çæä¸ä»½å®¢æ·æ»¡æåº¦æ¥åï¼ææä»½ç»è®¡è¯åè¶å¿”
- “åæç½ç«è®¿é®æ°æ®ï¼çæç¨æ·è¡ä¸ºåææ¥å”
- “çæåå·¥ç»©ææ¥åï¼æé¨é¨ç»è®¡ä¸ç»©æå”
2. æ¢ç´¢æ°æ®åºæ¶æ
æ ¹æ®ç¨æ·è¯æ±ï¼ä½¿ç¨ sql_db_list_tables å sql_db_schema æ¥æ¾ç¸å
³è¡¨ï¼
-
è¯å«ç¸å ³è¡¨ï¼æ ¹æ®æ¥åç±»åæ¾å°å¯¹åºçæ°æ®è¡¨
- é宿¥å â 订å表ãå票表ã产å表
- ç¨æ·æ¥å â ç¨æ·è¡¨ãæ´»å¨è¡¨ãç»å½è¡¨
- äº§åæ¥å â 产å表ãåºå表ã订åæç»è¡¨
- è¿è¥æ¥å â æ¥å¿è¡¨ãäºä»¶è¡¨ãææ è¡¨
-
æ¥æ¾å ³é®å段ï¼
- æ¥æ/æ¶é´åï¼ç¨äºæ¶é´åºååæï¼created_at, updated_at, date, timestamp çï¼
- æ°å¼åï¼ç¨äºèå计ç®ï¼éé¢ãæ°éãè¯åã计æ°çï¼
- åç±»åï¼ç¨äºåç»åæï¼å°åºãç±»å«ãç¶æãç±»åçï¼
- æ è¯åï¼ç¨äºå ³èåå±ç¤ºï¼IDãåç§°ã代ç çï¼
-
æ å°è¡¨å ³ç³»ï¼ç解表ä¹é´çå¤é®å ³ç³»ï¼ç¡®å®å¦ä½ JOIN å¤ä¸ªè¡¨
3. 设计æ¥è¯¢çç¥
æ ¹æ®æ¥åéæ±è®¾è®¡ SQL æ¥è¯¢ï¼
-
è¿æ»¤æ¡ä»¶ï¼ç¡®å® WHERE åå¥ï¼æ¶é´èå´ãç¶æãç±»å«ãæ¡ä»¶çï¼
-
èå彿°ï¼éæ©åéçèå彿°
- SUM – æ±åï¼éé¢ãæ°éï¼
- COUNT – 计æ°ï¼è®°å½æ°ãç¨æ·æ°ï¼
- AVG – å¹³åå¼ï¼è¯åãä»·æ ¼ï¼
- MAX/MIN – æå¼ï¼æå¤§å¼ãæå°å¼ï¼
- STDDEV – æ åå·®ï¼æ°æ®åå¸ï¼
- PERCENTILE – ç¾å使°ï¼ä¸ä½æ°ãå使°ï¼
-
åç»ç»´åº¦ï¼ç¡®å® GROUP BY åæ®µï¼æ¶é´ãå°åºãç±»å«ãç¨æ·çï¼
-
æåºè§åï¼ç¡®å® ORDER BY åæ®µï¼ææ°å¼éåºãææ¶é´ååºçï¼
-
计ç®å段ï¼éè¦æ¶è®¡ç®ç¾åæ¯ãå¢é¿çãå æ¯çè¡çææ
-
æ°æ®éå¶ï¼åçä½¿ç¨ LIMITï¼é»è®¤æ¾ç¤ºå N æ¡ï¼é¤éç¨æ·è¦æ±å ¨é¨ï¼
æ¥è¯¢è®¾è®¡ååï¼
- åªæ¥è¯¢å¿ è¦çåï¼é¿å SELECT *
- 使ç¨è¡¨å«åæé«å¯è¯»æ§
- 对äºå¤ææ¥è¯¢ï¼å
ç¨
write_todosè§åæ¥éª¤ - ç¡®ä¿ææ JOIN 齿æç¡®çè¿æ¥æ¡ä»¶
- éªè¯ GROUP BY å 嫿æéèåå
- 使ç¨éå½çæ¥æå½æ°å¤çæ¶é´ç»´åº¦
4. çæå¸¦å¾è¡¨ç HTML æ¥å
æ ¹æ®æ¥åç±»ååç¨æ·éæ±ï¼çæä¸ä¸ç HTML æ¥åãHTML æ¥ååºå å«ï¼
æ¥åç»æï¼
-
æ¥åæ é¢ – æ¸ æ°æè¿°æ¥åå 容忶é´èå´
-
æè¦ç»è®¡å¡ç – é¡¶é¨å±ç¤ºå ³é®ææ ï¼KPIï¼ï¼å¦æ»è®¡ãå¹³åå¼ãæå¤§å¼ãå¢é¿çç
-
å¯è§åå¾è¡¨ – ä½¿ç¨ Chart.js åºå建交äºå¼å¾è¡¨ï¼
- æçº¿å¾ – ç¨äºæ¶é´è¶å¿åæï¼æåº¦è¶å¿ã年度è¶å¿ãæ¥è¶å¿çï¼
- æ±ç¶å¾ – ç¨äºç±»å«å¯¹æ¯ï¼å°åºå¯¹æ¯ã产å对æ¯ãé¨é¨å¯¹æ¯çï¼
- 饼å¾/ç¯å½¢å¾ – ç¨äºå æ¯åå¸ï¼å¸åºä»½é¢ãç±»å«å æ¯ãç¶æåå¸çï¼
- é¢ç§¯å¾ – ç¨äºç´¯ç§¯æ°æ®å±ç¤º
- ç»åå¾ – å¤ä¸ªææ å¨åä¸å¾è¡¨ä¸å±ç¤ºï¼æ±ç¶å¾+æçº¿å¾ï¼
- æ£ç¹å¾ – ç¨äºç¸å ³æ§åæ
- é·è¾¾å¾ – ç¨äºå¤ç»´åº¦å¯¹æ¯
-
è¯¦ç»æ°æ®è¡¨æ ¼ – 宿´çæ°æ®åè¡¨ï¼æ¯ææåºåçé
-
åæç»è®º – ç®è¦çæ°æ®æ´å¯ååç°ï¼å¯éï¼æ ¹æ®ç¨æ·éæ±ï¼
å¾è¡¨ç±»åéæ©æåï¼
- æ¶é´åºåæ°æ® â æçº¿å¾æé¢ç§¯å¾
- ç±»å«å¯¹æ¯ â æ±ç¶å¾ï¼åç´ææ°´å¹³ï¼
- å æ¯åæ â 饼徿ç¯å½¢å¾
- 夿æ å¯¹æ¯ â ç»åå¾ï¼æ±ç¶å¾+æçº¿å¾ï¼
- æåå±ç¤º â æ°´å¹³æ±ç¶å¾
- ç¸å ³æ§åæ â æ£ç¹å¾
- å¤ç»´åº¦å¯¹æ¯ â é·è¾¾å¾
å ³äº HTML çæçéè¦è¯´æï¼
- ç´æ¥çæå®æ´ç HTML å 容
- åºç¨ UI/UX æä½³å®è·µï¼å æ¬ä¸ä¸çé è²æ¹æ¡åä¼é çæç
- æ ¹æ®æ¥åç±»åéæ©åéçé è²æ¹æ¡ï¼ä¸å¡æ¥åç¨ä¸ä¸è²è°ï¼æ°æ®æ¥åç¨æ¸ æ°å¯¹æ¯è²ï¼
- ç¦æ¢åå ¥æ¬å°æä»¶
- HTML å å®¹å¿ é¡»ä½¿ç¨åé符å 裹åç´æ¥è¾åºå°å¯¹è¯ä¸ï¼è§æ¥éª¤ 5ï¼
5. ç´æ¥è¾åº HTML æ¥åå°å¯¹è¯
éè¦ï¼ çæ HTML æ¥ååï¼å¿ é¡»ç´æ¥å¨å¯¹è¯ä¸è¾åºå®æ´ç HTML å 容ï¼ä½¿ç¨ç¹å®åé符å 裹ãå端ä¼èªå¨è¯å«å¹¶æä¾é¢è§åä¸è½½åè½ã
â ï¸ ä¸¥æ ¼ç¦æ¢ï¼
- ç¦æ¢è°ç¨
upload_html_report_to_minio– ä¸åä½¿ç¨æ¤å·¥å · - ç¦æ¢è°ç¨
upload_html_file_to_minio– ä¸åä½¿ç¨æ¤å·¥å · - ç¦æ¢ä½¿ç¨ä»»ä½æä»¶ç³»ç»å·¥å ·åå ¥æ¬å°æä»¶
- ç¦æ¢å° HTML å 容ä¿åå°æ¬å°æä»¶ç³»ç»æä¸ä¼ å°ä»»ä½å卿å¡
å¯ä¸å 许çè¾åºæ¹æ³ï¼ä½¿ç¨åéç¬¦ç´æ¥è¾åº
çæå®æ´ HTML åï¼ä½¿ç¨ <!-- REPORT_HTML_START --> å <!-- REPORT_HTML_END --> åé符å
裹è¾åºï¼
<!-- REPORT_HTML_START -->
<!DOCTYPE html>
<html lang="zh-CN">
<head>...</head>
<body>...</body>
</html>
<!-- REPORT_HTML_END -->
æ å工使µç¨ï¼å¿ é¡»éµå¾ªï¼ï¼
- æ¥è¯¢æ°æ®ãåæç»æï¼ç¨ Markdown åç¨æ·è¯´æåæè¿ç¨
- çæå®æ´ç HTML æ¥åå 容
- 使ç¨
<!-- REPORT_HTML_START -->å<!-- REPORT_HTML_END -->åé符å 裹 HTML å 容ï¼ç´æ¥è¾åºå°å¯¹è¯ä¸ - å¨ HTML è¾åºåï¼ç®è¦æ»ç»æ¥åå 容
è¾åºæ ¼å¼ç¤ºä¾ï¼
æ ¹æ®æ¥è¯¢ç»æï¼æä¸ºæ¨çæäºæ°æ®åææ¥åã
<!-- REPORT_HTML_START -->
<!DOCTYPE html>
<html lang="zh-CN">
...宿´ HTML æ¥åå
容...
</html>
<!-- REPORT_HTML_END -->
**æ¥åå·²çæå®æ¯**ï¼å
å«ï¼
- æ°æ®ç»è®¡åæ
- å¯è§åå¾è¡¨
- è¯¦ç»æ°æ®è¡¨æ ¼
æ¨å¯ä»¥å¨ä¸æ¹ç¹å»ãé¢è§æ¥åã卿°çªå£æ¥çï¼æç¹å»ãä¸è½½æ¥åãä¿åå°æ¬å°ã
å ³é®è¦ç¹ï¼
- åé符å¿
é¡»ç¬å ä¸è¡ –
<!-- REPORT_HTML_START -->å<!-- REPORT_HTML_END -->åå ä¸è¡ - HTML å¿
须宿´ – å
å«
<!DOCTYPE html>ã<html>ã<head>ã<body>宿´ç»æ - å端èªå¨å¤ç – å端ä¼èªå¨æ£æµåéç¬¦ï¼æå HTML å 容ï¼å¹¶æä¾é¢è§åä¸è½½æé®
- ä¸éè¦æä¾é¾æ¥ – å端ä¼èªå¨çæé¢è§åä¸è½½åè½ï¼æ éè¿å URL
- HTML å 容ä¼å®æ¶æµå¼ä¼ è¾ – ç¨æ·å¯ä»¥çå°æ¥åæ£å¨çæçè¿åº¦
6. åºç¨ UI/UX Pro Max 设计åå
éè¦ï¼ çæ HTML æ¶ï¼åºç¨ UI/UX Pro Max 设计åå以è·å¾ä¸ä¸ãç¾è§çè¾åºã
è¦åºç¨ç设计ååï¼
- 使ç¨ä¸ä¸çé è²æ¹æ¡åä¼é çæç
- ç¡®ä¿ååºå¼è®¾è®¡åå¯è®¿é®æ§
- çæç产就绪ç HTML 代ç
- åè
ui-ux-pro-maxæè½è·å设计æå¯¼
è¦ä½¿ç¨å代çï¼
- 使ç¨
taskå·¥å ·ï¼è®¾ç½®agent: "html_generator" - 为 HTML å 容æä¾æ¸ æ°çè¦æ±
- å代çå¤çææè®¾è®¡åå®ç°ç»è
7. UI/UX 设计ååï¼ç±å代çèªå¨åºç¨ï¼
html_generator å代çèªå¨åºç¨è¿äºååãä¾åèï¼
-
é è²æ¹æ¡ – æ ¹æ®æ¥åç±»åéæ©åéçé è²æ¹æ¡
- ä¸å¡æ¥åï¼ä½¿ç¨ä¸ä¸è²è°ï¼slate/gray/blueï¼
- æ°æ®æ¥åï¼ä½¿ç¨æ¸ æ°å¯¹æ¯è²ï¼blue/green/purpleï¼
- è´¢å¡æ¥åï¼ä½¿ç¨ä¿å®è²è°ï¼navy/grayï¼
- è¿è¥æ¥åï¼ä½¿ç¨æ´»åè²è°ï¼blue/teal/orangeï¼
-
æç – éæ©ä¼é ãå¯è¯»çåä½é 对ï¼Google Fontsï¼
- æ é¢ï¼Playfair Display, Merriweather, Lora
- æ£æï¼Inter, Roboto, Open Sans
-
å¸å±åé´è· – éå½çå¡«å ãè¾¹è·åååºå¼è®¾è®¡
-
è§è§å±æ¬¡ – æ¸ æ°çé¨ååéãåºäºå¡ççå¸å±
-
æ·±è²/æµ è²æ¨¡å¼ – æ¯æä¸¤ç§æ¨¡å¼ï¼å ·æéå½ç对æ¯åº¦
-
å¯è®¿é®æ§ – ç¡®ä¿è¶³å¤çé¢è²å¯¹æ¯åº¦ãå¯è¯»åä½
æ¥åçå ³é® UI/UX æåï¼
- 使ç¨åºäºå¡ççå¸å±ï¼å¸¦æå¾®å¦çé´å½±åè¾¹æ¡
- åºç¨ä¸è´çé´è·ï¼ä½¿ç¨ Tailwind é´è·æ¯ä¾ï¼p-4, p-6, p-8ï¼
- 使ç¨ä¸ä¸çé è²æ¹æ¡ – é¿å æäº®/éè¹è²
- ç¡®ä¿ææ¬çé«å¯¹æ¯åº¦ï¼æå° 4.5:1 æ¯ä¾ï¼
- 为æ¬åç¶ææ·»å å¹³æ»è¿æ¸¡ï¼150-300msï¼
- 使å¾è¡¨ååºå¼ – 使ç¨å®¹å¨æ¥è¯¢æç¾åæ¯å®½åº¦
- å¦ææ°æ®é大ï¼ä¸ºå¾è¡¨å å«å è½½ç¶æ
- 使ç¨ä¸è´ç徿 éï¼Heroicons, Lucideï¼- ä¸ä½¿ç¨è¡¨æ 符å·ä½ä¸ºå¾æ
- 为ææäº¤äºå ç´ æ·»å cursor-pointer
示ä¾ï¼åºç¨ UI/UX åå
1. æ ¹æ®æ¥åç±»åéæ©ä¸ä¸çé
è²æ¹æ¡
2. éæ©ä¼é
çæçï¼Google Fontsï¼
3. 使ç¨å
·æéå½é´è·çåºäºå¡ççå¸å±
4. ç¡®ä¿ååºå¼è®¾è®¡ï¼ç§»å¨ä¼å
æ¹æ³ï¼
5. æ·»å å¹³æ»è¿æ¸¡åæ¬åææ
6. æ¯ææµ
è²åæ·±è²æ¨¡å¼
8. HTML å¾è¡¨æ ¼å¼
éè¿ CDN ä½¿ç¨ Chart.js å建交äºå¼å¾è¡¨ãHTML åºè¯¥ï¼
- ä» CDN å å« Chart.js åº
- 为æ¯ä¸ªå¾è¡¨å建 canvas å ç´
- å°æ°æ®æ ¼å¼å为 JavaScript æ°ç»
- æ ¹æ®æ°æ®ä½¿ç¨éå½çå¾è¡¨ç±»å
- å 嫿 ç¾ãé¢è²åå¾ä¾
- 使å¾è¡¨ååºå¼ä¸è§è§ä¸å¸å¼äºº
- åºç¨ UI/UX Pro Max é è²æ¹æ¡ – 使ç¨ä¸ä¸ãå¯è®¿é®çé¢è²
- ç¡®ä¿å¾è¡¨å¯è®¿é®æ§ – é«å¯¹æ¯åº¦ãå¯è¯»æ ç¾
示ä¾ï¼ç¨æ·æ´»è·åº¦åææ¥å
æ¥éª¤ 1ï¼ çè§£ç¨æ·è¯æ± ç¨æ·è¦æ±ï¼”åæç¨æ·æ´»è·åº¦ï¼æå°åºç»è®¡ç¨æ·æ°éï¼å¹¶çæå¯è§åæ¥å”
æ¥éª¤ 2ï¼ æ¢ç´¢æ°æ®åºæ¶æ
-- æ¥æ¾ç¨æ·ç¸å
³è¡¨
sql_db_list_tables
sql_db_schema(table_name="users")
sql_db_schema(table_name="user_activities")
æ¥éª¤ 3ï¼ æ¥è¯¢ç¨æ·æ´»è·åº¦æ°æ®
SELECT
u.region,
COUNT(DISTINCT u.user_id) as total_users,
COUNT(DISTINCT ua.activity_id) as total_activities,
AVG(ua.activity_count) as avg_activities_per_user,
MAX(ua.last_active_date) as last_active_date
FROM users u
LEFT JOIN user_activities ua ON u.user_id = ua.user_id
WHERE ua.last_active_date >= DATE_SUB(NOW(), INTERVAL 30 DAY)
GROUP BY u.region
ORDER BY total_users DESC;
æ¥éª¤ 4ï¼ çæå¸¦å¾è¡¨ç HTML æ¥åå¹¶ç´æ¥è¾åº
å¨çæ HTML ä¹åï¼åºç¨ UI/UX Pro Max ååï¼
- 使ç¨ä¸ä¸çé è²æ¹æ¡ï¼æ ¹æ®æ¥åç±»åéæ©åéçè²è°ï¼
- åºç¨ä¼é çæçï¼Google Fonts: Inter + Playfair Displayï¼
- 使ç¨å ·æéå½é´è·çåºäºå¡ççå¸å±
- ç¡®ä¿ååºå¼è®¾è®¡
- æ¯ææµ è²/æ·±è²æ¨¡å¼
- æ·»å å¹³æ»è¿æ¸¡
é¦å ï¼ä½¿ç¨ UI/UX Pro Max æ ·å¼å建 HTML å 容ï¼
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>ç¨æ·æ´»è·åº¦åææ¥å</title>
<!-- Google Fonts - ä¸ä¸æç -->
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=Playfair+Display:wght@600;700&display=swap" rel="stylesheet">
<!-- Chart.js -->
<script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
<style>
:root {
/* ä¸ä¸é
è²æ¹æ¡ - æµ
è²æ¨¡å¼ */
--bg-primary: #ffffff;
--bg-secondary: #f8fafc;
--text-primary: #0f172a;
--text-secondary: #475569;
--border-color: #e2e8f0;
--accent-color: #3b82f6;
--accent-hover: #2563eb;
--card-shadow: 0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1);
--card-shadow-hover: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1);
}
@media (prefers-color-scheme: dark) {
:root {
/* æ·±è²æ¨¡å¼é¢è² */
--bg-primary: #0f172a;
--bg-secondary: #1e293b;
--text-primary: #f1f5f9;
--text-secondary: #cbd5e1;
--border-color: #334155;
--accent-color: #60a5fa;
--accent-hover: #3b82f6;
}
}
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
background: var(--bg-secondary);
color: var(--text-primary);
line-height: 1.6;
padding: 2rem 1rem;
transition: background-color 0.3s ease, color 0.3s ease;
}
.container {
max-width: 1200px;
margin: 0 auto;
}
/* åºäºå¡ççå¸å± */
.card {
background: var(--bg-primary);
border: 1px solid var(--border-color);
border-radius: 12px;
padding: 2rem;
margin-bottom: 2rem;
box-shadow: var(--card-shadow);
transition: box-shadow 0.3s ease, transform 0.2s ease;
}
.card:hover {
box-shadow: var(--card-shadow-hover);
}
/* æ¥åæ é¢ */
.report-header {
text-align: center;
margin-bottom: 3rem;
}
.report-header h1 {
font-family: 'Playfair Display', serif;
font-size: 2.5rem;
font-weight: 700;
color: var(--text-primary);
margin-bottom: 0.5rem;
}
.report-header p {
font-size: 1.125rem;
color: var(--text-secondary);
}
/* æè¦ç»è®¡å¡ç */
.stats-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
gap: 1.5rem;
margin-bottom: 2rem;
}
.stat-card {
background: var(--bg-primary);
border: 1px solid var(--border-color);
border-radius: 8px;
padding: 1.5rem;
text-align: center;
transition: transform 0.2s ease, box-shadow 0.2s ease;
}
.stat-card:hover {
transform: translateY(-2px);
box-shadow: var(--card-shadow-hover);
}
.stat-value {
font-size: 2rem;
font-weight: 700;
color: var(--accent-color);
margin-bottom: 0.5rem;
}
.stat-label {
font-size: 0.875rem;
color: var(--text-secondary);
text-transform: uppercase;
letter-spacing: 0.05em;
}
/* å¾è¡¨å®¹å¨ */
.chart-container {
width: 100%;
height: 400px;
margin: 2rem 0;
position: relative;
}
.chart-title {
font-size: 1.25rem;
font-weight: 600;
color: var(--text-primary);
margin-bottom: 1rem;
}
/* è¡¨æ ¼æ ·å¼ */
.table-wrapper {
overflow-x: auto;
border-radius: 8px;
}
table {
width: 100%;
border-collapse: collapse;
background: var(--bg-primary);
}
th {
background: var(--accent-color);
color: white;
padding: 1rem;
text-align: left;
font-weight: 600;
font-size: 0.875rem;
text-transform: uppercase;
letter-spacing: 0.05em;
}
td {
padding: 1rem;
border-bottom: 1px solid var(--border-color);
color: var(--text-primary);
}
tr:hover {
background: var(--bg-secondary);
transition: background-color 0.2s ease;
}
/* ååºå¼è®¾è®¡ */
@media (max-width: 768px) {
body {
padding: 1rem 0.5rem;
}
.card {
padding: 1.5rem;
}
.report-header h1 {
font-size: 2rem;
}
.chart-container {
height: 300px;
}
.stats-grid {
grid-template-columns: 1fr;
}
}
/* å¯è®¿é®æ§ */
@media (prefers-reduced-motion: reduce) {
* {
animation-duration: 0.01ms !important;
animation-iteration-count: 1 !important;
transition-duration: 0.01ms !important;
}
}
</style>
</head>
<body>
<div class="container">
<!-- æ¥åæ é¢å¡ç -->
<div class="card report-header">
<h1>ç¨æ·æ´»è·åº¦åææ¥å</h1>
<p>æé´ï¼2024å¹´1æ - 2024å¹´12æ</p>
</div>
<!-- æè¦ç»è®¡å¡ç -->
<div class="card">
<div class="stats-grid">
<div class="stat-card">
<div class="stat-value">15,234</div>
<div class="stat-label">æ»ç¨æ·æ°</div>
</div>
<div class="stat-card">
<div class="stat-value">89,456</div>
<div class="stat-label">æ»æ´»å¨æ°</div>
</div>
<div class="stat-card">
<div class="stat-value">5.87</div>
<div class="stat-label">平忴»è·åº¦</div>
</div>
</div>
</div>
<!-- å¾è¡¨å¡ç - æ±ç¶å¾ -->
<div class="card">
<div class="chart-title">æå°åºç¨æ·æ°éåå¸</div>
<div class="chart-container">
<canvas id="barChart"></canvas>
</div>
</div>
<!-- å¾è¡¨å¡ç - é¥¼å¾ -->
<div class="card">
<div class="chart-title">åå°åºç¨æ·å æ¯</div>
<div class="chart-container">
<canvas id="pieChart"></canvas>
</div>
</div>
<!-- æ°æ®è¡¨æ ¼å¡ç -->
<div class="card">
<div class="table-wrapper">
<table>
<thead>
<tr>
<th>å°åº</th>
<th>ç¨æ·æ°</th>
<th>æ´»å¨æ°</th>
<th>平忴»è·åº¦</th>
<th>æåæ´»è·æ¥æ</th>
</tr>
</thead>
<tbody>
<!-- æ°æ®è¡å¨è¿é -->
<tr>
<td>åä¸</td>
<td>5,234</td>
<td>32,456</td>
<td>6.2</td>
<td>2024-12-25</td>
</tr>
<tr>
<td>åå</td>
<td>4,567</td>
<td>28,123</td>
<td>6.1</td>
<td>2024-12-24</td>
</tr>
<tr>
<td>åå</td>
<td>3,890</td>
<td>21,234</td>
<td>5.5</td>
<td>2024-12-23</td>
</tr>
<tr>
<td>西å</td>
<td>1,543</td>
<td>7,643</td>
<td>5.0</td>
<td>2024-12-22</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<script>
// æ£æµé¢è²æ¹æ¡å好
const isDarkMode = window.matchMedia('(prefers-color-scheme: dark)').matches;
// ä¸ä¸é
è²æ¹æ¡
const colors = {
light: {
primary: '#3b82f6',
secondary: '#8b5cf6',
accent: '#10b981',
warning: '#f59e0b',
danger: '#ef4444',
background: 'rgba(59, 130, 246, 0.1)'
},
dark: {
primary: '#60a5fa',
secondary: '#a78bfa',
accent: '#34d399',
warning: '#fbbf24',
danger: '#f87171',
background: 'rgba(96, 165, 250, 0.1)'
}
};
const palette = isDarkMode ? colors.dark : colors.light;
// æ±ç¶å¾é
ç½®
const barCtx = document.getElementById('barChart').getContext('2d');
new Chart(barCtx, {
type: 'bar',
data: {
labels: ['åä¸', 'åå', 'åå', '西å', 'ä¸å', '西å'],
datasets: [{
label: 'ç¨æ·æ°é',
data: [5234, 4567, 3890, 1543, 890, 110],
backgroundColor: palette.primary,
borderColor: palette.primary,
borderWidth: 2,
borderRadius: 8
}]
},
options: {
responsive: true,
maintainAspectRatio: false,
plugins: {
title: {
display: false
},
legend: {
display: false
}
},
scales: {
x: {
grid: {
color: isDarkMode ? 'rgba(203, 213, 225, 0.1)' : 'rgba(226, 232, 240, 0.5)',
display: false
},
ticks: {
color: isDarkMode ? '#cbd5e1' : '#475569',
font: {
family: 'Inter',
size: 12
}
}
},
y: {
beginAtZero: true,
grid: {
color: isDarkMode ? 'rgba(203, 213, 225, 0.1)' : 'rgba(226, 232, 240, 0.5)',
display: true
},
ticks: {
color: isDarkMode ? '#cbd5e1' : '#475569',
font: {
family: 'Inter',
size: 12
}
}
}
}
}
});
// 饼å¾é
ç½®
const pieCtx = document.getElementById('pieChart').getContext('2d');
new Chart(pieCtx, {
type: 'pie',
data: {
labels: ['åä¸', 'åå', 'åå', '西å', 'ä¸å', '西å'],
datasets: [{
data: [5234, 4567, 3890, 1543, 890, 110],
backgroundColor: [
palette.primary,
palette.secondary,
palette.accent,
palette.warning,
'#a78bfa',
'#f472b6'
],
borderWidth: 2,
borderColor: isDarkMode ? '#1e293b' : '#ffffff'
}]
},
options: {
responsive: true,
maintainAspectRatio: false,
plugins: {
title: {
display: false
},
legend: {
display: true,
position: 'right',
labels: {
font: {
family: 'Inter',
size: 12
},
color: isDarkMode ? '#cbd5e1' : '#475569',
usePointStyle: true,
padding: 15
}
}
}
}
});
</script>
</body>
</html>
æçº¿å¾ç¤ºä¾ï¼ç¨äºæ¶é´è¶å¿åæï¼ï¼
<!-- æçº¿å¾å¡ç -->
<div class="card">
<div class="chart-title">æåº¦æ´»è·åº¦è¶å¿</div>
<div class="chart-container">
<canvas id="lineChart"></canvas>
</div>
</div>
<script>
// æçº¿å¾é
ç½®
const lineCtx = document.getElementById('lineChart').getContext('2d');
new Chart(lineCtx, {
type: 'line',
data: {
labels: ['1æ', '2æ', '3æ', '4æ', '5æ', '6æ', '7æ', '8æ', '9æ', '10æ', '11æ', '12æ'],
datasets: [{
label: 'æ´»è·ç¨æ·æ°',
data: [12000, 13500, 14200, 15800, 16500, 17200, 18000, 17500, 18200, 19000, 19500, 20000],
borderColor: palette.primary,
backgroundColor: palette.background,
tension: 0.4,
fill: true,
borderWidth: 3,
pointRadius: 5,
pointHoverRadius: 7,
pointBackgroundColor: palette.primary,
pointBorderColor: '#ffffff',
pointBorderWidth: 2
}]
},
options: {
responsive: true,
maintainAspectRatio: false,
plugins: {
title: {
display: false
},
legend: {
display: true,
position: 'top',
labels: {
font: {
family: 'Inter',
size: 12
},
color: isDarkMode ? '#cbd5e1' : '#475569',
usePointStyle: true,
padding: 15
}
}
},
scales: {
x: {
grid: {
color: isDarkMode ? 'rgba(203, 213, 225, 0.1)' : 'rgba(226, 232, 240, 0.5)',
display: true
},
ticks: {
color: isDarkMode ? '#cbd5e1' : '#475569',
font: {
family: 'Inter',
size: 12
}
}
},
y: {
beginAtZero: true,
grid: {
color: isDarkMode ? 'rgba(203, 213, 225, 0.1)' : 'rgba(226, 232, 240, 0.5)',
display: true
},
ticks: {
color: isDarkMode ? '#cbd5e1' : '#475569',
font: {
family: 'Inter',
size: 12
}
}
}
}
}
});
</script>
ç»åå¾ç¤ºä¾ï¼æ±ç¶å¾+æçº¿å¾ï¼ç¨äºå¤ææ 对æ¯ï¼ï¼
<!-- ç»åå¾å¡ç -->
<div class="card">
<div class="chart-title">æ¶å
¥ä¸å¢é¿ç对æ¯</div>
<div class="chart-container">
<canvas id="comboChart"></canvas>
</div>
</div>
<script>
// ç»åå¾é
ç½®
const comboCtx = document.getElementById('comboChart').getContext('2d');
new Chart(comboCtx, {
type: 'bar',
data: {
labels: ['1æ', '2æ', '3æ', '4æ', '5æ', '6æ'],
datasets: [
{
type: 'bar',
label: 'æ¶å
¥ï¼ä¸å
ï¼',
data: [120, 150, 180, 200, 220, 250],
backgroundColor: palette.primary,
borderColor: palette.primary,
borderWidth: 2,
borderRadius: 8,
yAxisID: 'y'
},
{
type: 'line',
label: 'å¢é¿çï¼%ï¼',
data: [0, 25, 20, 11, 10, 14],
borderColor: palette.accent,
backgroundColor: 'transparent',
borderWidth: 3,
tension: 0.4,
pointRadius: 5,
pointHoverRadius: 7,
yAxisID: 'y1'
}
]
},
options: {
responsive: true,
maintainAspectRatio: false,
plugins: {
title: {
display: false
},
legend: {
display: true,
position: 'top',
labels: {
font: {
family: 'Inter',
size: 12
},
color: isDarkMode ? '#cbd5e1' : '#475569',
usePointStyle: true,
padding: 15
}
}
},
scales: {
x: {
grid: {
color: isDarkMode ? 'rgba(203, 213, 225, 0.1)' : 'rgba(226, 232, 240, 0.5)',
display: false
},
ticks: {
color: isDarkMode ? '#cbd5e1' : '#475569',
font: {
family: 'Inter',
size: 12
}
}
},
y: {
type: 'linear',
display: true,
position: 'left',
beginAtZero: true,
grid: {
color: isDarkMode ? 'rgba(203, 213, 225, 0.1)' : 'rgba(226, 232, 240, 0.5)',
display: true
},
ticks: {
color: isDarkMode ? '#cbd5e1' : '#475569',
font: {
family: 'Inter',
size: 12
}
}
},
y1: {
type: 'linear',
display: true,
position: 'right',
beginAtZero: true,
grid: {
drawOnChartArea: false
},
ticks: {
color: isDarkMode ? '#cbd5e1' : '#475569',
font: {
family: 'Inter',
size: 12
},
callback: function(value) {
return value + '%';
}
}
}
}
}
});
</script>
ç¶å使ç¨åéç¬¦ç´æ¥è¾åº HTML æ¥åï¼
<!-- REPORT_HTML_START -->
<!DOCTYPE html>
<html lang="zh-CN">
...ä¸é¢çæç宿´ HTML å
容...
</html>
<!-- REPORT_HTML_END -->
**æ¥åå·²çæå®æ¯**ï¼å
å«ï¼
- æå°åºç¨æ·æ°éå叿±ç¶å¾
- åå°åºç¨æ·å æ¯é¥¼å¾
- è¯¦ç»æ°æ®è¡¨æ ¼
æ¨å¯ä»¥å¨ä¸æ¹ç¹å»ãé¢è§æ¥åã卿°çªå£æ¥çï¼æç¹å»ãä¸è½½æ¥åãä¿åå°æ¬å°ã
å¾è¡¨ç±»åéæ©æå
æçº¿å¾ – ç¨äºï¼
- æ¶é´è¶å¿
- æ¯è¾å¤ä¸ªæ¶é´åºå
- æ¾ç¤ºåå忍¡å¼
- 颿µè¶å¿
æ±ç¶å¾ – ç¨äºï¼
- æ¯è¾ç±»å«
- æå项ç®
- æ¾ç¤ºç»é´å·®å¼
- 对æ¯ä¸å维度
é¥¼å¾ – ç¨äºï¼
- æ¾ç¤ºæ¯ä¾/ç¾åæ¯
- æ´ä½çåå¸
- 彿¨æ 2-7 ä¸ªç±»å«æ¶
- å±ç¤ºå æ¯å ³ç³»
é¢ç§¯å¾ – ç¨äºï¼
- æ¶é´ä¸ç累积å¼
- æ¾ç¤ºæ°é/ä½ç§¯è¶å¿
- å å æ¯è¾
- å±ç¤ºç´¯ç§¯åå
ç»åå¾ – ç¨äºï¼
- å¤ä¸ªææ å¨åä¸å¾è¡¨ä¸å±ç¤º
- ä¸åéçº§çææ 对æ¯
- è¶å¿åæ»éçç»åå±ç¤º
è´¨éæå
å¯¹äº SQL æ¥è¯¢ï¼
- å§ç»ä½¿ç¨éå½çæ¥æè¿æ»¤å¨
- å 嫿æä¹çèå
- æç¸å ³ç»´åº¦åç»
- é»è¾å°æåºç»æ
- éå¶ä¸ºåççè¡æ°ï¼é¤éç¨æ·æå®ï¼
- 使ç¨éå½çæ¥æå½æ°å¤çæ¶é´ç»´åº¦
- éªè¯ JOIN æ¡ä»¶å GROUP BY åå¥
å¯¹äº HTML æ¥åï¼
éè¦ï¼å¨çæ HTML æ¥åæ¶ï¼å¿ é¡»ä¸¥æ ¼éµå¾ªä»¥ä¸ UI/UX Pro Max 设计ååã
æ ¸å¿ UI/UX 设计ååï¼åºäº ui-ux-pro-max æè½ï¼ï¼
-
é è²æ¹æ¡ï¼
- 使ç¨ä¸ä¸çé
è²æ¹æ¡ï¼æ ¹æ®æ¥åç±»åéæ©ï¼
- æ°æ®åææ¥åï¼èè²ç³»ï¼#3B82F6, #1E40AFï¼ä¸ºä¸»ï¼è¾ 以绿è²ï¼#10B981ï¼è¡¨ç¤ºå¢é¿
- ä¸å¡æ¥åï¼æ·±è/ç´«è²ç³»ï¼#6366F1, #8B5CF6ï¼ä¸ºä¸»ï¼ä½ç°ä¸ä¸æ§
- è´¢å¡æ¥åï¼æ·±è²èæ¯ï¼#1F2937ï¼é éè²/绿è²å¼ºè°ï¼#F59E0B, #10B981ï¼
- ç¡®ä¿ææ¬å¯¹æ¯åº¦è³å° 4.5:1ï¼WCAG AA æ åï¼
- 使ç¨è¯ä¹åé¢è²ï¼æå=绿è²ï¼è¦å=é»è²ï¼é误=红è²ï¼ä¿¡æ¯=èè²
- 使ç¨ä¸ä¸çé
è²æ¹æ¡ï¼æ ¹æ®æ¥åç±»åéæ©ï¼
-
æçååä½ï¼
- ä½¿ç¨ Google Fontsï¼æ¨èåä½é
对ï¼
- æ é¢ï¼Inter, Playfair Display, Poppinsï¼ç²ä½ 600-700ï¼
- æ£æï¼Inter, Roboto, Open Sansï¼å¸¸è§ 400ï¼
- åä½å¤§å°ï¼æ é¢ 24-32pxï¼å¯æ é¢ 18-20pxï¼æ£æ 16pxï¼å°å 14px
- è¡é«ï¼æ é¢ 1.2ï¼æ£æ 1.6-1.8
- åé´è·ï¼æ é¢ 0.5pxï¼æ£ææ£å¸¸
- ä½¿ç¨ Google Fontsï¼æ¨èåä½é
对ï¼
-
å¸å±åé´è·ï¼
- 使ç¨åºäºå¡ççå¸å±ï¼å¡çé´è· 16-24px
- å¡çå è¾¹è·ï¼16-24px
- ä½¿ç¨ Tailwind CSS çé´è·ç³»ç»ï¼4px åºåï¼
- æå¤§å 容宽度ï¼1200pxï¼å± 䏿¾ç¤º
- 使ç¨ç½æ ¼ç³»ç»ï¼12 åæ Flexbox
-
ååºå¼è®¾è®¡ï¼
- ç§»å¨ä¼å æ¹æ³
- æç¹ï¼320pxï¼ææºï¼ï¼768pxï¼å¹³æ¿ï¼ï¼1024pxï¼æ¡é¢ï¼
- ä½¿ç¨ CSS Grid å Flexbox å®ç°ååºå¼å¸å±
- å¾è¡¨åè¡¨æ ¼å¨å°å±å¹ä¸å¯æ¨ªåæ»å¨
-
æ·±è²/æµ è²æ¨¡å¼ï¼
- ä½¿ç¨ CSS åéå®ä¹é¢è²ä¸»é¢
- æ¯æ
prefers-color-scheme: darkåªä½æ¥è¯¢ - æä¾æå¨åæ¢æé®ï¼å¯éï¼
- ç¡®ä¿ä¸¤ç§æ¨¡å¼ä¸é½æè¶³å¤ç对æ¯åº¦
-
交äºåå¨ç»ï¼
- æ¬åç¶æè¿æ¸¡ï¼150-300ms ease-in-out
- å¡çæ¬åææï¼è½»å¾®é´å½±å¢å ï¼shadow-md â shadow-lgï¼
- æé®æ¬åï¼é¢è²å æ·± 10%ï¼è½»å¾®ç¼©æ¾ï¼scale-105ï¼
- é¿å è¿åº¦å¨ç»ï¼ä¿æä¸ä¸æ
-
徿 åè§è§å ç´ ï¼
- 使ç¨ä¸è´ç徿 åºï¼Heroicons æ Lucide
- ç¦æ¢ä½¿ç¨è¡¨æ 符å·ä½ä¸ºå¾æ
- 徿 大å°ï¼16pxï¼å°ï¼ï¼20pxï¼ä¸ï¼ï¼24pxï¼å¤§ï¼
- 徿 é¢è²ï¼ä½¿ç¨ä¸»é¢è²ï¼ä¿æä¸è´æ§
-
å¾è¡¨è®¾è®¡ï¼
- ä½¿ç¨ Chart.js æ ECharts çä¸ä¸å¾è¡¨åº
- å¾è¡¨ç±»åéæ©ï¼
- è¶å¿æ°æ®ï¼æçº¿å¾æé¢ç§¯å¾
- å类对æ¯ï¼æ±ç¶å¾ææ¡å½¢å¾
- å æ¯æ°æ®ï¼é¥¼å¾æç¯å½¢å¾
- å叿°æ®ï¼æ£ç¹å¾æç´æ¹å¾
- å¾è¡¨é¢è²ï¼ä½¿ç¨é è²æ¹æ¡ä¸çé¢è²ï¼ä¿æä¸è´æ§
- æ·»å å¾ä¾ãåæ è½´æ ç¾ãæ°æ®æ ç¾
- ç¡®ä¿å¾è¡¨å¯è®¿é®æ§ï¼ARIA æ ç¾ï¼
-
æ°æ®è¡¨æ ¼ï¼
- ä½¿ç¨æ¸ æ°ç表头ï¼èæ¯è²åºåï¼
- 交æ¿è¡é¢è²ï¼zebra stripingï¼æé«å¯è¯»æ§
- æ¬åé«äº®å½åè¡
- éè¦æ°æ®ä½¿ç¨ç²ä½æé¢è²å¼ºè°
- æ°åå³å¯¹é½ï¼ææ¬å·¦å¯¹é½
- æ¯ææåºåçéï¼å¦éè¦ï¼
-
æ¥åç»æï¼
- æ é¢åºåï¼æ¥ååç§°ãæ¥æèå´ãçææ¶é´
- æè¦ç»è®¡å¡çï¼å ³é®ææ ï¼KPIï¼çªåºæ¾ç¤º
- å¾è¡¨åºåï¼ä¸»è¦å¯è§åå 容
- è¯¦ç»æ°æ®è¡¨æ ¼ï¼å®æ´æ°æ®è§å¾
- ç»è®ºåå»ºè®®ï¼æåæ»ç»ï¼å¦éè¦ï¼
-
ææ¯å®ç°ï¼
- ä½¿ç¨ Tailwind CSS è¿è¡æ ·å¼è®¾è®¡
- ä½¿ç¨ CDN å¼å ¥ Google Fonts
- ä½¿ç¨ CDN å¼å ¥å¾è¡¨åºï¼Chart.js, ECharts çï¼
- ç¡®ä¿ HTML æä»¶å¯ä»¥ç¬ç«è¿è¡ï¼å 嫿æä¾èµï¼
- ä¼åå è½½æ§è½ï¼å缩 CSSï¼ä½¿ç¨ CDN
-
æ¥åè¾åºï¼
- 使ç¨
<!-- REPORT_HTML_START -->å<!-- REPORT_HTML_END -->åé符å 裹 HTML å å®¹ç´æ¥è¾åº - å端ä¼èªå¨æ£æµåéç¬¦ï¼æä¾é¢è§åä¸è½½åè½
- å¨ HTML è¾åºåç®è¦æ»ç»æ¥åå 容
- 使ç¨
对äºç»è®¡åæï¼
- è®¡ç®æ»è®¡ãå¹³åå¼ã计æ°
- ç¸å ³æ¶æ¾ç¤ºç¾åæ¯
- æ¯è¾æ¶é´æ®µæç±»å«
- çªåºè¶å¿å模å¼
- è¯å«è¡¨ç°æä½³/æå·®è
- 计ç®å¢é¿çåååç
å¸¸è§æ¥å模å¼
æ¨¡å¼ 1ï¼æ¶é´åºåæ¥å
“æ¾ç¤ºè¿å»ä¸å¹´çæåº¦éå®è¶å¿” â ä½¿ç¨ DATE_TRUNC æ¥è¯¢ï¼ææä»½ GROUP BYï¼ææä»½ ORDER BY â ä½¿ç¨æçº¿å¾ææ±ç¶å¾
æ¨¡å¼ 2ï¼ç±»å«æ¯è¾
“æå°åºæ¯è¾ç¨æ·æ°é” â ä½¿ç¨ GROUP BY region æ¥è¯¢ â ä½¿ç¨æ±ç¶å¾æé¥¼å¾
æ¨¡å¼ 3ï¼è¡¨ç°æä½³è
“æ¾ç¤ºéå®é¢æåå 10 çäº§å” â ä½¿ç¨ ORDER BY sales DESC LIMIT 10 æ¥è¯¢ â ä½¿ç¨æ±ç¶å¾ï¼æ°´å¹³ï¼
æ¨¡å¼ 4ï¼è¶å¿åæ
“æ¾ç¤ºæåº¦ç¯æ¯å¢é¿ç” â 使ç¨çªå£å½æ°æèªè¿æ¥æ¥è¯¢ â 使ç¨å¸¦ç¾åæ¯è®¡ç®çæçº¿å¾
æ¨¡å¼ 5ï¼å æ¯åæ
“åæåæ¸ éçæ¶å ¥å æ¯” â ä½¿ç¨ GROUP BY åç¾åæ¯è®¡ç® â 使ç¨é¥¼å¾æç¯å½¢å¾
æ¨¡å¼ 6ï¼å¤ç»´åº¦åæ
“åæç¨æ·è¡ä¸ºï¼æå°åºå年龿®µç»è®¡” â 使ç¨å¤ç»´åº¦ GROUP BY â 使ç¨ç»å徿åç»æ±ç¶å¾
æç¤º
- æ§è¡åå§ç»éªè¯ SQL æ¥è¯¢
- å¨ SQL ä¸ä½¿ç¨éå½çæ¥ææ ¼å¼
- å¨ HTML ä¸ä½¿ç¨éå·åè´§å¸ç¬¦å·æ ¼å¼åæ°å
- çæ HTML ä¹åï¼å¨è¯¢
ui-ux-pro-maxæè½è·å设计æä½³å®è·µ - éæ©å¯è®¿é®ä¸ä¸ä¸çå¾è¡¨é¢è²ï¼ä½¿ç¨ UI/UX Pro Max é è²æ¹æ¡ï¼
- ä¸ºå®æ´æ§å å«å¯è§åå¾è¡¨åæ°æ®è¡¨æ ¼
- 卿¥åæ é¢ä¸æ·»å ç®è¦åææè§è§£
- 使ç¨ååºå¼è®¾è®¡ä»¥å¨ä¸åå±å¹ä¸æ´å¥½å°æ¾ç¤º
- 卿ç»ç¡®å® HTML ä¹ååºç¨ UI/UX Pro Max æ£æ¥æ¸
åï¼
- åºç¨äºä¸ä¸é è²æ¹æ¡
- ä¼é çæçï¼Google Fontsï¼
- å ·æéå½é´è·çåºäºå¡ççå¸å±
- 卿ææç¹ååºå¼
- æ¯ææµ è²/æ·±è²æ¨¡å¼
- é«å¯¹æ¯åº¦ä»¥ç¡®ä¿å¯è®¿é®æ§
- å¹³æ»è¿æ¸¡ï¼150-300msï¼
- ä¸ä½¿ç¨è¡¨æ 符å·ä½ä¸ºå¾æ
- ä¸è´ç徿 éï¼Heroicons/Lucideï¼
- è®°ä½ä½¿ç¨åé符è¾åº HTML æ¥å – 使ç¨
<!-- REPORT_HTML_START -->å<!-- REPORT_HTML_END -->å 裹 - ç¦æ¢è°ç¨ä»»ä½ä¸ä¼ å·¥å
· – ä¸ä½¿ç¨
upload_html_report_to_minioæupload_html_file_to_minio - ç¦æ¢åå ¥æ¬å°æä»¶ – ä¸ä½¿ç¨ä»»ä½æä»¶ç³»ç»å·¥å ·
- å端ä¼èªå¨æ£æµåéç¬¦ï¼æä¾é¢è§åä¸è½½æé®
- æ ¹æ®ç¨æ·è¯æ±çµæ´»è°æ´æ¥åå å®¹åæ ¼å¼
- å¦æç¨æ·éæ±ä¸æç¡®ï¼ä¸»å¨è¯¢é®æ¾æ¸ å ³é®ä¿¡æ¯