zoukankan      html  css  js  c++  java
  • 移动端疫情展示

    一、要求

    1、要求开发一款移动端的全世界疫情实时查询系统。

    2、要求将前两周的项目合并为一个完整的项目。 采用统一的数据库。(建议MySQL数据库)

    3、实现从数据采集、数据存储、数据查询(WEB端和移动端)一体全世界实时疫情查询系统。

    4、以本机数据库为服务器端,web端和移动端连接远程数据库实现数据共享,要求数据库表格式统一化。

    5、查询显示当前最新时间的数据,可以查询任一时间任一地点的数据。该系统要求在服务器端发布,可以通过IP地址访问。

    二、设计思路

    1、数据准备,使用python从网上爬取疫情各地的数据,并存入mysql数据库

    2、数据展示,遇到了很大的难题:(Android获取数据时,连不上数据库)按照老师要求我的解决方法是从Android发送http请求到web端web端在从数据库获取数据,以此来做到web端和我Android端公用一套数据。

     3、使用volley的stringrequest向web请求数据(json)

     4、使用Gson进行数据转换。

     5、使用MPAndroidChart的柱状图来进行数据可视化

    三、代码

    数据爬取:

    import requests
    import json
    from pymysql import *
    import requests
    from retrying import retry
    headers = {"User-Agent": "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Mobile Safari/537.36"
                ,"Referer": "https://wp.m.163.com/163/page/news/virus_report/index.html?_nw_=1&_anw_=1"}
    
    
    def _parse_url(url):
        response = requests.get(url,headers=headers,timeout=3) #3秒之后返回
        return response.content.decode()
    
    
    def parse_url(url):
        try:
            html_str = _parse_url(url)
        except:
            html_str = None
        return html_str
    
    
    class yiqing:
        f = 0
    
        url="https://c.m.163.com/ug/api/wuhan/app/data/list-total?t=316765429316"
    
        def getContent_list(self,html_str):
            dict_data = json.loads(html_str)
            #各省的数据
            content_list = dict_data["data"]
            
            return content_list
    
        
        def saveContent_list(self,i):
            # 打开数据库连接(ip/数据库用户名/登录密码/数据库名)
            con = connect("localhost", "root", "root", "text")
            # 使用 cursor() 方法创建一个游标对象 cursor
            cursors = con.cursor()
            # 使用 execute()  方法执行 SQL 查询 返回的是你影响的行数
            if self.f ==0 :
                cursors.execute("delete from world")
                self.f = self.f+1
            row = cursors.execute("insert into world values(%s,%s,%s,%s,%s,%s,%s,%s)",
                                  (i.get('id'),i.get('name'),i.get('total').get('confirm'),
                                   i.get('total').get('suspect'),i.get('total').get('heal'),
                                   i.get('total').get('dead'),i.get('total').get('severe'),
                                   i.get('lastUpdateTime')))
            
            con.commit()#提交事务
            con.close()# 关闭数据库连接
    
            
        def run(self): #实现主要逻辑
            #请求数据
            html_str = parse_url(self.url)
            #获取数据
            content_list = self.getContent_list(html_str)
            values = content_list["areaTree"]
            for i in values:
                self.saveContent_list(i)
    
    if __name__ == '__main__':
        yq = yiqing()
        yq.run()
        print('爬取,存储成功!!')
    package com.me.http;
    
    import com.github.mikephil.charting.components.AxisBase;
    import com.github.mikephil.charting.components.XAxis;
    import com.github.mikephil.charting.formatter.ValueFormatter;
    
    import java.text.DecimalFormat;
    
    public class MyValueFormatter extends ValueFormatter{
        private final DecimalFormat mFormat;
        private String suffix;
        private String [] str;
    
        public MyValueFormatter(String suffix,String [] str) {
            mFormat = new DecimalFormat("0000");
            this.suffix = suffix;
            this.str = str;
        }
    
        @Override
        public String getFormattedValue(float value) {
            return mFormat.format(value) + suffix;
        }
    
        @Override
        public String getAxisLabel(float value, AxisBase axis) {
            if (axis instanceof XAxis) {
                return str[(int)value];
            } else if (value > 0) {
                return mFormat.format(value) + suffix;
            } else {
                return mFormat.format(value);
            }
        }
    }
    viewModel = ViewModelProviders.of(requireActivity()).get(ViewModel.class);
            list = viewModel.getList();
            for (int i = 0; i < 7; i++) {
                str[i] = list.get(i).getName();
            }
    ArrayList<BarEntry> values = new ArrayList<>();
            for (int i = 0; i < 7; i++) {
                BarEntry barEntry = new BarEntry(i,Float.valueOf(list.get(i).getConfirm()));
                values.add(barEntry);
            }
    ValueFormatter custom = new MyValueFormatter(" 1",str);
    xAxis.setValueFormatter(custom);
  • 相关阅读:
    windows form之间传值方式
    .net几种页面传值得方式:
    .NET下的ORM框架介绍
    php+smarty批量生成静态文件
    Dedecms模块开发流程(一)
    php开启整站gzip(zlib)压缩最简单的方法
    coreseek实战(三):全文搜索在php中应用(使用api接口)
    coreseek实战(四):php接口的使用,完善php脚本代码
    php curl 多线程
    coreseek实战(一):windows下coreseek的安装与测试
  • 原文地址:https://www.cnblogs.com/charles-s/p/13088687.html
Copyright © 2011-2022 走看看