• 团队项目-第一阶段冲刺-8


    一、说在前面

    1、昨天完成了:

    1)实现用户对新闻评论的存储,和回显。

    2、今天完成了:

    1)整合登入界面

    3、明天的计划:

    1)整合欢迎界面、个人信息界面。

    4、遇到的问题:

    (mob)开发,第三方qq、微信等登录时,需要公司信息填写、app上线。(未解决)

    二、冲刺成果:

     

     

     三、代码

    1、环境配置

    // 注册MobSDK
            classpath "com.mob.sdk:MobSDK:2018.0319.1724"

    apply plugin: 'com.mob.sdk'
    
    MobSDK {
    //    appKey "2eba0c469d8ae"
    //    appSecret "d90df5782b1f05c1e08cecbb181686b4"
        appKey "2eba0c469d8ae"
        appSecret "d90df5782b1f05c1e08cecbb181686b4"
        SMSSDK {}
        ShareSDK {
            //平台配置信息
            devInfo {
                Wechat {
                    appId "wx4868b35061f87885"
                    appSecret "64020361b8ec4c99936c0e3999a9f249"
    
                }
                QQ {
                    appId "100371282"
                    appKey "aed9b0303e3ed1e27bae87c33761161d"
                    shareByAppClient true
                }
                Facebook {
                    appKey "1412473428822331"
                    appSecret "a42f4f3f867dc947b9ed6020c2e93558"
                    callbackUri "https://mob.com"
                }
                SinaWeibo {
                    appKey "568898243"
                    appSecret "38a4f8204cc784f81f9f0daaf31e02e3"
                    callbackUri "http://www.sharesdk.cn"
                    shareByAppClient true
                }
            }
        }
    }

    2、UI界面

    <?xml version="1.0" encoding="utf-8"?>
    <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".MainActivity">
    
        <EditText
            android:id="@+id/editTextPhoneNum"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:ems="10"
            android:hint="手机号"
            android:inputType="textPersonName"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintHorizontal_bias="0.161"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintVertical_bias="0.11" />
    
        <Button
            android:id="@+id/buttonCode"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:hint="获取验证码"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintHorizontal_bias="0.914"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintVertical_bias="0.105"
            tools:text="获取验证码" />
    
        <EditText
            android:id="@+id/editTextCode"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:ems="10"
            android:hint="验证码"
            android:importantForAutofill="no"
            android:inputType="textPersonName"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintHorizontal_bias="0.161"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintVertical_bias="0.215" />
    
        <Button
            android:id="@+id/buttonLogin"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:hint="登录"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintHorizontal_bias="0.897"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintVertical_bias="0.21" />
    
        <androidx.constraintlayout.widget.Guideline
            android:id="@+id/guideline3"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="horizontal"
            app:layout_constraintGuide_begin="568dp"
            app:layout_constraintGuide_percent="0.85" />
    
        <ImageView
            android:id="@+id/imageView2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintHorizontal_bias="0.193"
            app:layout_constraintStart_toStartOf="parent"
            app:srcCompat="@drawable/wx_" />
    
        <ImageView
            android:id="@+id/imageView3"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintHorizontal_bias="0.793"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="@+id/guideline3"
            app:layout_constraintVertical_bias="1.0"
            app:srcCompat="@drawable/qq" />
    
        <androidx.constraintlayout.widget.Guideline
            android:id="@+id/guideline4"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="horizontal"
            app:layout_constraintGuide_begin="578dp"
            app:layout_constraintGuide_percent="0.75" />
    
        <TextView
            android:id="@+id/textView"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="-----------其它方式-----------"
            android:textSize="18sp"
            app:layout_constraintBottom_toTopOf="@+id/guideline3"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="@+id/guideline4" />
    
    </androidx.constraintlayout.widget.ConstraintLayout>
    View Code

    3、逻辑代码

    package com.me.news_2;
    
    import android.content.Intent;
    import android.os.AsyncTask;
    import android.os.Bundle;
    import android.os.CountDownTimer;
    import android.text.TextUtils;
    import android.util.Log;
    import android.view.View;
    import android.widget.Button;
    import android.widget.EditText;
    import android.widget.Toast;
    
    import androidx.annotation.NonNull;
    import androidx.appcompat.app.AppCompatActivity;
    
    import com.google.gson.Gson;
    import com.google.gson.reflect.TypeToken;
    import com.me.domain.News;
    import com.me.fragment.ListFragment;
    import com.me.util.Check;
    import com.me.util.HttpUtil;
    
    import org.json.JSONException;
    import org.json.JSONObject;
    
    import java.util.List;
    
    import cn.smssdk.EventHandler;
    import cn.smssdk.SMSSDK;
    
    public class LoginActivity extends AppCompatActivity {
        private Button buttonCode,buttonLogin;
        private EditText editTextPhoneNum,editTextCode;
        private String phoneNum,code;
        private EventHandler eh;
        private MyCountDownTimer myCountDownTimer = new MyCountDownTimer(30000,1000);
        private SentUrlTask sentUrlTask ;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_login);
            buttonCode = findViewById(R.id.buttonCode);
            buttonLogin = findViewById(R.id.buttonLogin);
            editTextCode = findViewById(R.id.editTextCode);
            editTextPhoneNum = findViewById(R.id.editTextPhoneNum);
    
            buttonCode.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    phoneNum = editTextPhoneNum.getText().toString();
                    if(!phoneNum.isEmpty()){
                        if(Check.checkTel(phoneNum)){ //利用正则表达式获取检验手机号
                            // 获取验证码
                            SMSSDK.getVerificationCode("86", phoneNum);
                            myCountDownTimer.start();
                        }else{
                            Toast.makeText(getApplicationContext(),"请输入有效的手机号",Toast.LENGTH_LONG).show();
                        }
                    }else {
                        Toast.makeText(getApplicationContext(),"请输入手机号",Toast.LENGTH_LONG).show();
                        return;
                    }
                    phoneNum = editTextPhoneNum.getText().toString();
                }
            });
            buttonLogin.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    code = editTextCode.getText().toString();
                    if(!code.isEmpty()){
                        //提交验证码
                        SMSSDK.submitVerificationCode("86", phoneNum, code);
                    }else{
                        Toast.makeText(getApplicationContext(),"请输入验证码",Toast.LENGTH_LONG).show();
                        return;
                    }
                }
            });
    
            eh = new EventHandler() {
    
                @Override
                public void afterEvent(int event, int result, Object data) {
    
    
    
                    if (result == SMSSDK.RESULT_COMPLETE){
                        //回调完成
                        if (event == SMSSDK.EVENT_SUBMIT_VERIFICATION_CODE) {
                            //提交验证码成功
                            runOnUiThread(new Runnable() {
                                @Override
                                public void run() {
                                    success(phoneNum);
                                    Toast.makeText(LoginActivity.this,"登录成功",Toast.LENGTH_SHORT).show();
                                    Intent intent = new Intent(LoginActivity.this, BottomNavigationActivity.class);
                                    startActivity(intent);
                                }
                            });
                        }else if (event == SMSSDK.EVENT_GET_VOICE_VERIFICATION_CODE){
                            runOnUiThread(new Runnable() {
                                @Override
                                public void run() {
                                    Toast.makeText(LoginActivity.this,"语音验证发送",Toast.LENGTH_SHORT).show();
                                }
                            });
                        }
                        else if (event == SMSSDK.EVENT_GET_VERIFICATION_CODE){
                            //获取验证码成功
                            runOnUiThread(new Runnable() {
                                @Override
                                public void run() {
                                    Toast.makeText(LoginActivity.this,"验证码已发送",Toast.LENGTH_SHORT).show();
                                }
                            });
                        }else if (event == SMSSDK.EVENT_GET_SUPPORTED_COUNTRIES){
                        }
                    }else{
                        ((Throwable)data).printStackTrace();
                        Throwable throwable = (Throwable) data;
                        throwable.printStackTrace();
                        try {
                            JSONObject obj = new JSONObject(throwable.getMessage());
                            final String des = obj.optString("detail");
                            if (!TextUtils.isEmpty(des)){
                                runOnUiThread(new Runnable() {
                                    @Override
                                    public void run() {
                                        Toast.makeText(LoginActivity.this,des,Toast.LENGTH_SHORT).show();
                                    }
                                });
                            }
                        } catch (JSONException e) {
                            e.printStackTrace();
                        }
                    }
                }
            };
    
            //注册一个事件回调监听,用于处理SMSSDK接口请求的结果
            SMSSDK.registerEventHandler(eh);
    
        }
        // 使用完EventHandler需注销,否则可能出现内存泄漏
        @Override
        protected void onDestroy() {
            super.onDestroy();
            SMSSDK.unregisterEventHandler(eh);
        }
        //倒计时类
        private class MyCountDownTimer extends CountDownTimer {
    
            public MyCountDownTimer(long millisInFuture, long countDownInterval) {
                super(millisInFuture, countDownInterval);
            }
    
            //计时过程
            @Override
            public void onTick(long l) {
                //防止计时过程中重复点击
                buttonCode.setClickable(false);
                buttonCode.setText(l/1000+"秒");
    
            }
    
            //计时完毕的方法
            @Override
            public void onFinish() {
                //重新给Button设置文字
                buttonCode.setText("重新获取");
                //设置可点击
                buttonCode.setClickable(true);
            }
        }
        public void success(String username){
            sentUrlTask = new SentUrlTask("http://192.168.1.17:8080/NewsApi/news?method=addUser&username="+username);
    //        sentUrlTask = new ListFragment.SentUrlTask("http://192.168.43.243:8080/NewsApi/news?method=allnews");
            sentUrlTask.execute();
        }
    
        private class SentUrlTask extends AsyncTask<Void,Void,String> {
    
            private  String url;
    
            public SentUrlTask(String url) {
                this.url = url;
            }
    
            @Override
            protected String doInBackground(Void... voids) {
                return HttpUtil.setUrl(url);
            }
    
            @Override
            protected void onPostExecute(@NonNull String s) {
                super.onPostExecute(s);
            }
        }
    
    }
    View Code

    4、web端-servlet

    package com.me.servlet;
    
    import java.io.IOException;
    import java.sql.SQLException;
    import java.util.ArrayList;
    import java.util.List;
    
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import com.google.gson.Gson;
    import com.me.dao.NewsDao;
    import com.me.domain.Comment;
    import com.me.domain.News;
    
    
    @WebServlet("/news")
    public class NewsServlet_ extends HttpServlet {
        private static final long serialVersionUID = 1L;
        private NewsDao dao = new NewsDao();
        public NewsServlet_() {
            super();
        }
    
    
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
             response.setHeader("content-type", "text/html;charset=UTF-8");
             request.setCharacterEncoding("UTF-8");
    
                String method = request.getParameter("method");
    
                if (method.equals("allnews")){
                    allnews(request,response);
                }else if (method.equals("search")){
                    search(request,response);
                }else if (method.equals("addUser")){
                    addUser(request,response);
                }else if (method.equals("addComment")){
                    addComment(request,response);
                }else if (method.equals("commentList")){
                    commentList(request,response);
                }
        }
    
        
        /**
         * @param request
         * @param response
         * @throws IOException 
         */
        private void commentList(HttpServletRequest request, HttpServletResponse response) throws IOException {
             List<Comment> news = new ArrayList<Comment>();
             String nid = request.getParameter("nid");
             System.out.println(nid);
                try {
                    news = dao.commentList(Integer.valueOf(nid));
                } catch (SQLException e) {
                    e.printStackTrace();
                }
    
                Gson gson = new Gson();
                String s = gson.toJson(news);
                response.getWriter().write(s);
            
        }
    
    
        private void addComment(HttpServletRequest request, HttpServletResponse response) {
            String name = request.getParameter("name");
            String content = request.getParameter("content");
            String nid = request.getParameter("nid");
            Comment comment = new Comment();
            comment.setContent(content);
            comment.setName(name);
            comment.setNid(Integer.valueOf(nid));
            System.out.println(comment.toString());
            try {
                boolean f = dao.addComment(comment);
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    
    
        private void addUser(HttpServletRequest request, HttpServletResponse response) {
            String username = request.getParameter("username");
            try {
                boolean f = dao.addUser(username);
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    
    
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            doGet(request, response);
        }
        private void search(HttpServletRequest request, HttpServletResponse response) throws IOException {
            String word = request.getParameter("word");
            List<News> news = new ArrayList<News>();
            try {
                news = dao.search(word);
            } catch (SQLException e) {
                e.printStackTrace();
            }
            Gson gson = new Gson();
            String s = gson.toJson(news);
            response.getWriter().write(s);
        }
    
        private void allnews(HttpServletRequest request, HttpServletResponse response) throws IOException {
            List<News> news = new ArrayList<News>();
            try {
                news = dao.newsList();
            } catch (SQLException e) {
                e.printStackTrace();
            }
    
            Gson gson = new Gson();
            String s = gson.toJson(news);
            response.getWriter().write(s);
        }
    
    }
    View Code

    5、web端-dao

    package com.me.dao;
    
    import com.me.domain.News;
    import com.me.utils.DBUtils;
    import org.apache.commons.dbutils.QueryRunner;
    import org.apache.commons.dbutils.handlers.BeanListHandler;
    
    import java.sql.SQLException;
    import java.util.List;
    
    public class NewsDao {
    
    
    
        public boolean deleteBad() throws SQLException {
            QueryRunner qr =new QueryRunner(DBUtils.getDataSource());
            String sql="delete from newslist  where zw = null or zw=?";
            int n = qr.update(sql,"");
            if (n > 0) {
                return true;
            } else {
                return false;
            }
        }
    
        public boolean deleteAll() throws SQLException {
            QueryRunner qr =new QueryRunner(DBUtils.getDataSource());
            String sql="delete from newslist  ";
            int n = qr.update(sql);
            if (n > 0) {
                return true;
            } else {
                return false;
            }
        }
    
        /**
         *
         * @param zw
         * @param id
         * @return
         * @throws SQLException
         */
        public boolean zw(String zw,int id) throws SQLException {
    
            QueryRunner qr = new QueryRunner(DBUtils.getDataSource());
            String sql = "update newslist set zw = ?   where id=? ";
            int n = qr.update(sql, zw,id);
            if (n > 0) {
                return true;
            } else {
                return false;
            }
        }
    
        /**
         *
         * @return List<News>
         * @throws SQLException
         */
        public List<News> newsList() throws SQLException {
            QueryRunner qr = new QueryRunner(DBUtils.getDataSource());
            String sql = "select * from newslist where url != null  or url != '17KK0006|2145432'or url != ?";
            List<News> query = qr.query(sql, new BeanListHandler<News>(News.class),"");
            return query;
        }
    
        /**
         *
         * @param world
         * @return
         * @throws SQLException
         */
        public List<News> search(String world) throws SQLException {
            QueryRunner qr = new QueryRunner(DBUtils.getDataSource());
            String sql = "select * from newslist where  title like '%"+world+"%' limit 0 , 5";
            System.out.println(sql);
            List<News> query = qr.query(sql, new BeanListHandler<News>(News.class));
            return query;
        }
    
        /**
         *
         * @param news
         * @return
         * @throws SQLException
         */
        public boolean add(News news) throws SQLException {
            QueryRunner qr = new QueryRunner(DBUtils.getDataSource());
            String sql = "insert into newslist (source,title,priority,url,commentCount,digest,imgsrc,ptime,type) " +
                    "values(?,?,?,?,?,?,?,?,?)";
            int update = qr.update(sql,news.getSource(),news.getTitle(),news.getPriority(),news.getUrl(),news.getCommentCount(),
                    news.getDigest(),news.getImgsrc(),news.getPtime(),news.getType());
            if (update > 0) {
                return true;
            } else {
                return false;
            }
        }
    
    }
    View Code 
  • 相关阅读:
    搭建中文分词工具——递归方法
    (五)django上传文件并读取相应数据存入数据库
    (四)django上传文件并读取存入数据库
    Django中的外键赋值
    (二)Django连接本地mysql异常
    (一)环境搭建——Django
    论文阅读笔记:《Interconnected Question Generation with Coreference Alignment and Conversion Flow Modeling》
    AWS EC2 CentOS release 6.5 部署redis
    2016年简直一晃而过
    Android开发学习之路--性能优化之布局优化
  • 原文地址:https://www.cnblogs.com/20183544-wangzhengshuai/p/12749531.html
Copyright © 2020-2023  润新知