• 安卓疫情


    07移动端疫情展示

    要求

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

    要求将前两周的项目合并为一个完整的项目。

    采用统一的数据库。(建议MySQL数据库)

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

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

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

    设计思路

    1.数据准备,使用python从网上爬取世界疫情的数据,并存入mysql数据库

    2.数据展示,从Android发送http请求到web端web端在从数据库获取数据

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

    4.使用Gson进行数据转换

     

    代码:

    import requests

    import time, json

    import sys;

    import pymysql

    def get_wangyi_request():

        url = 'https://c.m.163.com/ug/api/wuhan/app/data/list-total'

        headers = {

            'accept': '*/*',

            'accept-encoding': 'gzip,deflate,br',

            'accept-language': 'en-US,en;q=0.9,zh-CN;q = 0.8,zh;q = 0.7',

            'origin': 'https://wp.m.163.com',

            'referer': 'https://wp.m.163.com/',

            'sec-fetch-dest': 'empty',

            'sec-fetch-mode': 'cors',

            'sec-fetch-site': 'same-ite',

            'user-agent': 'Mozilla/5.0(WindowsNT10.0;Win64;x64) AppleWebKit/37.36 (KHTML, likeGecko) Chrome/82.0.4056.0 Safari/537.36 Edg/82.0.432.3'

        }

        result = requests.get(url, headers=headers)

        return result

    def print_mess1(string: str, dict1total: dict):

        sys.stdout.write(string + '确诊: ' + str(dict1total['confirm'] if dict1total['confirm'] != None else 0))

        sys.stdout.write(' ')

        sys.stdout.write(string + '疑似: ' + str(dict1total['suspect'] if dict1total['suspect'] != None else 0))

        sys.stdout.write(' ')

        sys.stdout.write(string + '治愈: ' + str(dict1total['heal'] if dict1total['heal'] != None else 0))

        sys.stdout.write(' ')

        sys.stdout.write(string + '死亡: ' + str(dict1total['dead'] if dict1total['dead'] != None else 0))

    if __name__ == '__main__':

        result = get_wangyi_request()

        json_str = json.loads(result.text)['data']

        # print(json_str.keys())

        # dict_keys(['chinaTotal', 'chinaDayList', 'lastUpdateTime', 'areaTree'])

        print(json_str['lastUpdateTime'])

        countryname_list = json_str['areaTree']

        # 每个省份包含如下的键

        # dict_keys(['today', 'total', 'extData', 'name', 'id', 'lastUpdateTime', 'children'])

        conn = pymysql.connect(

            host='localhost',  # 我的IP地址

            port=3306,  # 不是字符串不需要加引号。

            user='root',

            password='123456',

            db='test',

            charset='utf8'

        )

        cursor = conn.cursor()  # 获取一个光标

        confirmed_total = 0

        suspected_total = 0

        dead_total = 0

        healed_total = 0

        id = 0;

        for dict in countryname_list:

            sql = 'insert into yiqing_world (countryname,confirmed,suspected,dead,healed,lastUpdateTime,id) values (%s,%s,%s,%s,%s,%s,%s);'

            countryname = dict['name']

            confirmed = dict['total']['confirm']

            confirmed_total += confirmed

            suspected = dict['total']['suspect']

            suspected_total += suspected

            healed = dict['total']['heal']

            dead_total += healed

            dead = dict['total']['dead']

            dead_total += dead

            lastUpdateTime = dict['lastUpdateTime']

            id=id+1

            sys.stdout.write( dict['name'] + '  ')

            cursor.execute(sql, [countryname,confirmed,suspected,dead,healed,lastUpdateTime,id])

        print()

        conn.commit()

        cursor.close()

    conn.close()

    import android.annotation.SuppressLint;

    import android.app.Activity;

    import android.os.Bundle;

    import android.os.Handler;

    import android.os.Message;

    import android.view.View;

    import android.widget.Button;

    import android.widget.EditText;

    import android.widget.RadioButton;

    import android.widget.RadioGroup;

    import android.widget.TextView;

    import java.util.List;

    public class MainActivity extends Activity {

        private EditText et_name;

        private Button btn_get_data;

        private TextView tv_data;

        private RadioGroup rg_check;

        private RadioButton rb_date;

        private RadioButton rb_country;

        private String condition;

        @SuppressLint("HandlerLeak")

        private Handler handler = new Handler(){

            @Override

            public void handleMessage(Message msg) {

                switch (msg.what){

                    case 0x11:

                        String s = (String) msg.obj;

                        tv_data.setText(s);

                        break;

                    case 0x12:

                        String ss = (String) msg.obj;

                        tv_data.setText(ss);

                        break;

                }

            }

        };

        @Override

        protected void onCreate(Bundle savedInstanceState) {

            super.onCreate(savedInstanceState);

            setContentView(R.layout.activity_main);

            // 控件的初始化

            btn_get_data = findViewById(R.id.btn_get_data);

            tv_data = findViewById(R.id.tv_data);

            et_name = findViewById(R.id.et_name);

            rb_date = findViewById(R.id.rb_date);

            rb_country = findViewById(R.id.rb_country);

            rg_check = findViewById(R.id.rg_select);

            rg_check.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {

                public void onCheckedChanged(RadioGroup group, int checkedId) {

                    //如果时间这个单选按钮被选中了

                    if(rb_date.getId()==checkedId){

                        //弹出吐司通知

                        //Toast.makeText(MainActivity.this, rb_date.getText().toString(), Toast.LENGTH_LONG).show();

                        //获取选中按钮对应的文本信息

                        condition = rb_date.getText().toString().trim();

                    }else if(rb_country.getId()==checkedId){

                        //Toast.makeText(MainActivity.this, rb_country.getText().toString(), Toast.LENGTH_LONG).show();

                        condition = rb_country.getText().toString().trim();

                    }

                }

            });

            //如果没有选择默认按时间查询

            if (condition == null){

                condition = rb_date.getText().toString().trim();

            }

            setListener();

        }

        /**

         * 设置监听

         */

        private void setListener() {

            // 按钮点击事件

            btn_get_data.setOnClickListener(new View.OnClickListener() {

                @Override

                public void onClick(View v) {

                    // 创建一个线程来连接数据库并获取数据库中对应表的数据

                    new Thread(new Runnable() {

                        @Override

                        public void run() {

                            String name = et_name.getText().toString().trim();

                            //调用数据库帮助类中的方法取数据

                            List<information> list = DBUtils.search(condition,name);

                            Message message = handler.obtainMessage();

                            if (list != null) {

                                String s = "";

                                for (int i = 0; i < list.size(); i++) {

                                    s += "国家:" + list.get(i).getCountryname() + " ";

                                    s += "最新更新时间:" + list.get(i).getLastUpdateTime() + " ";

                                    s += "确诊人数为:  " + list.get(i).getConfirmed() + " ";

                                    s += "治愈人数为:  " + list.get(i).getHealed() + " ";

                                    s += "死亡人数为:  " + list.get(i).getDead() + " " + " ";

                                }

                                //0x110x12消息的定位标志

                                message.what = 0x12;

                                message.obj = s;

                            } else {

                                message.what = 0x11;

                                message.obj = "查询结果为空";

                            }

                            handler.sendMessage(message);

                            // 发消息通知主线程更新UI

                        }

                    }).start();

                }

            });

         }

    }

    import java.sql.Connection;

    import java.sql.DriverManager;

    import java.sql.PreparedStatement;

    import java.sql.ResultSet;

    import java.sql.SQLException;

    import java.util.ArrayList;

    import java.util.List;

    /**

     * 数据库工具类:连接数据库用、获取数据库数据用

     * 相关操作数据库的方法均可写在该类

     */

    public class DBUtils {

        private static String driver = "com.mysql.jdbc.Driver";// MySql驱动

        private static String user = "root";// 用户名

        private static String password = "123456";// 密码

        private static Connection getConn(String dbName) {

            Connection connection = null;

            try {

                Class.forName(driver);// 动态加载类

                String ip = "192.168.1.6";// 写成本机地址,不能写成localhost,同时手机和电脑连接的网络必须是同一个

                // 尝试建立到给定数据库URL的连接

                connection = DriverManager.getConnection("jdbc:mysql://" + ip + ":3306/" + dbName,

                        user, password);

            } catch (Exception e) {

                e.printStackTrace();

            }

            return connection;

        }

        public static List<information>  search(String condition, String country_name){

            List<information> list = new ArrayList<>();

            Connection connection = getConn("test");

            String sql = "";

            //System.out.println(condition);

            //选择条件

            if(condition.equals("国家")){

                //模糊查询

                sql = "select * from yiqing_world where countryname like ?";

            }

            if(condition.equals("时间")){

                sql = "select * from yiqing_world where lastUpdateTime like ?";

            }

            System.out.println(country_name);

            if(connection !=null){

                try {

                    PreparedStatement ps = connection.prepareStatement(sql);

                    if(ps!=null){

                        ps.setString(1,"%"+country_name+"%");

                        ResultSet rs = ps.executeQuery();

                        if(rs!=null){

                            while(rs.next()){

                                information worldData = new information();

                                worldData.setId(rs.getInt("id"));

                                worldData.setCountryname(rs.getString("countryname"));

                                worldData.setConfirmed(rs.getString("confirmed"));

                                worldData.setSuspected(rs.getString("suspected"));

                                worldData.setDead(rs.getString("dead"));

                                worldData.setHealed(rs.getString("healed"));

                                worldData.setLastUpdateTime(rs.getString("lastUpdateTime"));

                                list.add(worldData);

                            }

                            connection.close();

                            ps.close();

                            return list;

                        }else{

                            return null;

                        }

                    }else{

                        return null;

                    }

                } catch (SQLException e) {

                    e.printStackTrace();

                    return null;

                }

            }else{

                return null;

            }

        }

    }

    public class information {

        private int id;

        private String countryname;

        private String confirmed;

        private String suspected;

        private String dead;

        private String healed;

        private String lastUpdateTime;

        public int getId() {

            return id;

        }

        public void setId(int id) {

            this.id = id;

        }

        public String getCountryname() {

            return countryname;

        }

        public void setCountryname(String countryname) {

            this.countryname = countryname;

        }

        public String getConfirmed() {

            return confirmed;

        }

        public void setConfirmed(String confirmed) {

            this.confirmed = confirmed;

        }

        public String getSuspected() {

            return suspected;

        }

        public void setSuspected(String suspected) {

            this.suspected = suspected;

        }

        public String getDead() {

            return dead;

        }

        public void setDead(String dead) {

            this.dead = dead;

        }

        public String getHealed() {

            return healed;

        }

        public void setHealed(String healed) {

            this.healed = healed;

        }

        public String getLastUpdateTime() {

            return lastUpdateTime;

        }

        public void setLastUpdateTime(String lastUpdateTime) {

            this.lastUpdateTime = lastUpdateTime;

        }

    }

    <?xml version="1.0" encoding="utf-8"?>

    <ScrollView xmlns:android="http://schemas.android.com/apk/res/android"

        xmlns:tools="http://schemas.android.com/tools"

        android:layout_width="match_parent"

        android:layout_height="match_parent"

        tools:context=".MainActivity"

        android:padding="15dp">

        <RelativeLayout

            android:layout_width="match_parent"

            android:layout_height="match_parent">

            <RadioGroup

                android:id="@+id/rg_select"

                android:layout_width="wrap_content"

                android:layout_height="wrap_content"

                android:orientation="horizontal"

                android:paddingLeft="20dp"

                android:layout_marginTop="20dp">

                <RadioButton

                    android:id="@+id/rb_date"

                    android:layout_width="wrap_content"

                    android:layout_height="wrap_content"

                    android:text="时间"

                    android:textSize="20sp"

                    android:checked="true"/>

                <RadioButton

                    android:id="@+id/rb_country"

                    android:layout_width="wrap_content"

                    android:layout_height="wrap_content"

                    android:text="国家"

                    android:textSize="20sp"/>

            </RadioGroup>

            <EditText

                android:id="@+id/et_name"

                android:padding="10dp"

                android:textSize="16sp"

                android:gravity="center"

                android:hint="输入要查询的内容"

                android:layout_below="@id/rg_select"

                android:layout_width="match_parent"

                android:layout_height="wrap_content" />

            <Button

                android:id="@+id/btn_get_data"

                android:layout_margin="15dp"

                android:textSize="16sp"

                android:text="查询"

                android:layout_below="@id/et_name"

                android:layout_width="match_parent"

                android:layout_height="wrap_content" />

            <TextView

                android:id="@+id/tv_data"

                android:padding="10dp"

                android:textSize="16sp"

                android:gravity="center"

                android:text="内容"

                android:layout_below="@+id/btn_get_data"

                android:layout_width="match_parent"

                android:layout_height="wrap_content" />

        </RelativeLayout>

    </ScrollView>

  • 相关阅读:
    【渗透攻防Web篇】SQL注入攻击高级
    【在线渗透】中关村--德宇
    [深入学习Web安全](5)详解MySQL注射
    【安全播报】微信突然变静音要谨慎,多人银行卡内余额被转走
    安全圈玩起了直播,"学霸”带你玩转CTF
    2016 安全圈玩起了直播,“学霸”带你玩转CTF_i春秋学院
    对症下药 – 疑难杂症之提权技术
    木马编程-手把手带你进入木马的世界之木马编程
    【LeetCode-面试算法经典-Java实现】【033-Search in Rotated Sorted Array(在旋转数组中搜索)】
    升级后开机就提示“android.process.acore”停止执行 --分析 解决方式
  • 原文地址:https://www.cnblogs.com/yanwenhui/p/13087037.html
Copyright © 2020-2023  润新知