• 疫情分布图移动端


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

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

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

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

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

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

    思路:安卓客户端远程访问数据库得到数据后进行展示

    源程序代码:

    dao层:

    复制代码
    package com.itheima.worldepidemic.db;
    
    import android.util.Log;
    
    import com.alibaba.fastjson.JSONArray;
    import com.alibaba.fastjson.JSONObject;
    
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    
    /**
     * 数据库工具类:连接数据库用、获取数据库数据用
     * 相关操作数据库的方法均可写在该类
     */
    public class DBUtil {
    
    
        private static String driver = "com.mysql.jdbc.Driver";// MySql驱动
    
    //    private static String url = "jdbc:mysql://localhost:3306/map_designer_test_db";
        private static String user = "root";// 用户名
    
        private static String password = "123";// 密码
    
    
    
        private static Connection getConn(String dbName){
    
    
            Connection connection = null;
            try{
                Class.forName(driver);// 动态加载类
                String ip = "49.235.116.180";// 写成本机地址,不能写成localhost,同时手机和电脑连接的网络必须是同一个
    
                // 尝试建立到给定数据库URL的连接
                connection = DriverManager.getConnection("jdbc:mysql://" + ip + ":3306/" + dbName,
                        user, password);
    
            }catch (Exception e){
                e.printStackTrace();
            }
    
            return connection;
        }
    
        public static String getInfoByName(String time,String country){
            JSONArray jsonArray=new JSONArray();
            // 根据数据库名称,建立连接
            Connection connection = getConn("epidemic");
    
            try {
                // mysql简单的查询语句。这里是根据MD_CHARGER表的NAME字段来查询某条记录
                String sql = "select * from world where date_format(Date,'%Y-%m-%d') = ? and country = ? and child !='2' order by Confirmed_num desc";
    //            String sql = "select * from MD_CHARGER";
                if (connection != null){// connection不为null表示与数据库建立了连接
                    PreparedStatement ps = connection.prepareStatement(sql);
                    if (ps != null){
                        // 设置上面的sql语句中的?的值为name
                        ps.setString(1, time);
                        ps.setString(2,country);
                        // 执行sql查询语句并返回结果集
                        ResultSet rs = ps.executeQuery();
                        if (rs != null){
    
                            while (rs.next()){
                                JSONObject json=new JSONObject();
                                String place=rs.getString("Country");
                                String province=rs.getString("Province");
                                if(province==null||province.equals(""))
                                    province="";
                                String confirmed_num=""+rs.getInt("Confirmed_num");
                                String yisi_num=rs.getString("Yisi_num");
                                String cured_num=rs.getString("Cured_num");
                                String dead_num=rs.getString("Dead_num");
                                json.put("country",place);
                                json.put("province", province);
                                json.put("confirmed_num", confirmed_num);
                                json.put("yisi_num", yisi_num);
                                json.put("cured_num", cured_num);
                                json.put("dead_num", dead_num);
                                jsonArray.add(json);
                            }
    
                        }else {
                            return null;
                        }
                    }else {
                        return  null;
                    }
                }else {
                    return  null;
                }
            }catch (Exception e){
                e.printStackTrace();
                Log.e("DBUtils","异常:" + e.getMessage());
                return null;
            }
            return jsonArray.toString();
        }
    
    }
    复制代码

    显示数据:

    复制代码
    package com.itheima.worldepidemic;
    
    import android.annotation.SuppressLint;
    import android.os.Bundle;
    import android.os.Handler;
    import android.os.Message;
    import android.text.method.ScrollingMovementMethod;
    import android.view.View;
    import android.widget.Button;
    import android.widget.TextView;
    
    import androidx.appcompat.app.AppCompatActivity;
    
    import com.alibaba.fastjson.JSON;
    import com.alibaba.fastjson.JSONArray;
    import com.alibaba.fastjson.JSONObject;
    import com.itheima.worldepidemic.db.DBUtil;
    
    public class MainActivity extends AppCompatActivity {
        private TextView date;
        private TextView country;
        private Button btn;
        private TextView tv_data;
        private String str;
        @SuppressLint("HandlerLeak")
        private Handler handler = new Handler( ) {
            @Override
            public void handleMessage(Message msg) {
                tv_data=findViewById(R.id.tv_data);
                tv_data.setMovementMethod(ScrollingMovementMethod.getInstance());
                switch (msg.what) {
                    case 0x11:
                        str= (String) msg.obj;
                        tv_data.setText(str);
                        break;
    
                    case 0x12:
                        String str1 = (String) msg.obj;
                        tv_data.setText(str1);
                        break;
                    default:
                        throw new IllegalStateException("Unexpected value: " + msg.what);
                }
    
            }
        };
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            date = findViewById(R.id.time);
            country = findViewById(R.id.country);
            country.setText("伊朗");
            btn = findViewById(R.id.btn);
            query( );
    
        }
    
    
        public void query() {
    
            btn.setOnClickListener(new View.OnClickListener( ) {
                @Override
                public void onClick(View v) {
                    // 创建一个线程来连接数据库并获取数据库中对应表的数据
                    new Thread(new Runnable( ) {
                        @Override
                        public void run() {
                            // 调用数据库工具类DBUtils的getInfoByName方法获取数据库表中数据
                            String result = DBUtil.getInfoByName(date.getText( ).toString( ), country.getText( ).toString( ));
                            JSONArray jsonArray= (JSONArray) JSON.parse(result);
                            Message message = handler.obtainMessage( );
                            if (jsonArray!= null) {
                                String s = "";
                                for(int i=0;i<jsonArray.size();i++) {
                                    JSONObject json = jsonArray.getJSONObject(i);
                                    s = s + json.getString("country") + " " + json.getString("province") + " "
                                            + "确诊:" + json.getString("confirmed_num") + "疑似:" + json.getString("yisi_num") + "治愈:"
                                            + json.getString("cured_num") + "死亡:" + json.getString("dead_num") + "
    ";
                                }
                                message.what = 0x12;
                                message.obj = s;
                            } else {
                                message.what = 0x11;
                                message.obj = "查询结果为空";
                            }
                            // 发消息通知主线程更新UI
                            handler.sendMessage(message);
                        }
                    }).start( );
    
    
                }
            });
        }
    
    
    }
    复制代码

    界面代码:

    复制代码
    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout  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"
        android:orientation="vertical"
        tools:context=".MainActivity">
        <LinearLayout
            android:orientation="horizontal"
            android:layout_width="match_parent"
            android:layout_height="wrap_content">
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="时间:"
            android:textSize="16sp"
            android:textColor="@color/colorAccent"
            />
        <EditText
            android:id="@+id/time"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:hint="例如2020-03-22"
            android:inputType="text"
            android:maxLines="1"
            />
    
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="地区:"
            android:textSize="16sp"
            android:textColor="@color/colorAccent"
            />
        <EditText
            android:id="@+id/country"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:hint="例如中国"
            android:maxLines="1"
            android:inputType="text"
            />
        </LinearLayout>
        <Button
            android:id="@+id/btn"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="查询"
            android:layout_gravity="center_horizontal"
            android:textSize="16sp"
            />
        <TextView
            android:id="@+id/tv_data"
            android:padding="10dp"
            android:textSize="16sp"
            android:gravity="center"
            android:text="结果显示区"
            android:scrollbars="vertical"
            android:layout_width="match_parent"
            android:layout_height="300dp" />
    </LinearLayout>
    复制代码

    运行结果截图:

  • 相关阅读:
    服务器文档下载zip格式
    关于精度,模运算和高精的问题//19/07/14
    Luogu P2010 回文日期 // 暴力
    树形DP水题集合 6/18
    普通背包水题集合 2019/6/17
    因为时间少
    重学树状数组6/14(P3368 【模板】树状数组 2)
    Luogu P1291 [SHOI2002]百事世界杯之旅 // 易错的期望
    Luogu P4316 绿豆蛙的归宿//期望
    树剖
  • 原文地址:https://www.cnblogs.com/wwbzuiku/p/13089864.html
Copyright © 2020-2023  润新知