一、说在前面
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>
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); } } }
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); } }
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; } } }