android安卓英语学习课设

一、关于这个项目ELAPP

该项目是一个基于java开发的服务器-客户端模式的安卓英语学习软件,主要功能点就是背单词,中英文翻译,OCR文字翻译。

服务器端使用springboot,mybatisplus,MySQL,mongodb,redis等技术,实现用户登录验证,token验证,以及返回客户端数据等功能。

客户端使用java开发安卓,也是首次使用了jackpet的部分组件进行开发,如ViewModel,LiveData,Navigation等组件


二、项目结构图:

在这里插入图片描述


三、前后端:

1.前后端交互逻辑:

Java端:

Controller 层有三个controller,负责接受安卓端发送来的请求,然后调用Service层的服务或者Dao层的服务(dao层有服务属于设计失误),然后服务处理完业务之后,就会将结果返回到controller中,最后controller发送结果到安卓端。

  • 一个简单的示例:

功能一:

​ 首先WordController接受到来自安卓客户端的请求,然后调用Dao层的MongodbMapperImpl,到Mongodb数据库查询,最后将结果序列化为json,返回到安卓端中。

功能二:

​ UserControler接受登录请求,然后调用LoginService ,LoginService使用Dao层的UserMapper 到Mysql数据库中查询验证,然后将验证结果返回到Usercontroller中,UserController再将数据返回到安卓客户端

2.服务端 Service_For_Android

1.1 主要功能简述

功能一:返回数据

首先,安卓端需要的数据有两种,来源分别是这个服务端、第三方接口(有道翻译,百度翻译)。这里介绍服务端的数据

  • 一种是用户数据,也就是用户的账号密码,用户记了的单词,用户没有记的单词,用户收藏的单词。这种数据使用MySQL进行保存。
  • 第二种是单词数据,也就是该App的词库,记录了每个单词的英文,中文,音频URL,示例图片,示例句子等信息。这种数据使用mongodb进行保存。

功能二:验证用户的登录,拦截访问
  • 验证用户的登录,这个功能就是获取到客户端发来的账号密码,然后到MySQL数据库中进行查询验证,验证失败则返回失败。验证成功,则使用用户的id为其生成一个token并返回;同时将用户对象序列化为json,存储到redis中,方便随取随用。
  • 拦截访问,服务端配置了一个拦截器,用来检查请求头中是否有携带token,拥有token才能访问除登录以外的接口。


1.2 结构简述

1.2.1 总的项目结构:

类图:

在这里插入图片描述


顺序图:

在这里插入图片描述


协作图:

在这里插入图片描述

如图所示:大概可以分为,控制controller,服务service,数据提供dao,数据实体类vo ,拦截器LoginInterceptor,工具类utils等多个功能模块。


结构图

在这里插入图片描述


组件图:

在这里插入图片描述

1.2.2 数据库:

  • MySQL

很简单的几个表,一个用户表,用来存储用户信息,其他的表都是用户表的关联表,记录用户背了的单词,用户没有背的单词,用户收藏的单词。

在这里插入图片描述


实体类图

在这里插入图片描述


  • MongoDB

只用来存储单词数据。只读,不进行修改。所有的数据格式都一样。

文档展示:

json类


实体类图:

在这里插入图片描述


1.2.3 数据层(dao):

dao层对MySQL,mongodb进行操作,向外提供服务(其实这里算是设计失误,dao层应该只提供数据库的增删查改操作,而不应该把服务也放置在这里。)。


mongodb

​ 因为mongodb只是存储单词数据的作用,所以mongodb部分的功能就只有随机查询单词而已。仅仅提供几个查询方法

  • interface QueryMapper

    • public List randomWords;

      根据参数返回指定数量的随机单词。

    • public int wordNumber;

      返回当前词库中的单词总数。

  • 类图如下

在这里插入图片描述


MySQL

​ MySQL负责对用户表User,记录单词表RememberedWord,ForgetWord,CollectionWord,进行操作,每个表对应一个Mapper,所以需要三个Mapper(collection表因为时间不足,没有什么操作)。同时因为使用的是mybatisplus,每个Mapper中已经内置了基本的增删改查方法,因此mapper类图就不画了。这里就只绘制service图:

  • UserService

  • public interface UserService {
        /**
         * 新增用户
         */
        Result AddNewUser(String userName, String userPassword);
    
        /**
         * 查询用户名密码
         * @param username
         * @param password
         * @return
         */
        User findUser(String username, String password);
    
        /**
         * 查询用户名是否有重复
         * @param username
         * @return
         */
        boolean isRepeatedUserName(String username);
    
        /**
         * 通过token获取用户信息
         * @param token
         * @return
         */
        Result getUserInfoByToken(String token);
    }
    
    • 类图如下:

在这里插入图片描述

  • WordService

    public interface WordService {
    
        /**
         * 对RememberList进行操作
         * @param idlist
         * @return
         */
        Result insertRemember(String token,List<String> idlist);
    
        /**
         * 对ForgetWordList进行操作
         * @param token
         * @param idlist
         * @return
         */
        Result insertForget(String token,List<String> idlist);
    }
    
    • 类图如下(不完整,LoginService可以到Service层查看。):

在这里插入图片描述


1.2.4 业务层(service):

接受控制层的调用,返回处理好的数据。该层只有一个LoginServiceImpl,提供用户的登录功能。(这里算是设计失误,很多的service都分散到了dao层当中。)

在这里插入图片描述


1.2.5 控制层(controller):

  • WordsController,负责随机返回mongodb里的单词数据。
  • 提供的接口:
    • findwords/randWord/{num}
    • findwords/wordNums

在这里插入图片描述


  • UserController,负责对用户进行验证
  • 提供的接口:
    • user/addUser,注册用户接口
    • user/login,登录用户接口
    • user/currentUser,获取当前用户接口

在这里插入图片描述


  • InsertController:,负责对用户单词进行插入操作。

  • 提供的接口:

    • userinsert/rember,对RememberWord表进行操作
    • userinsert/forget,对ForgetWord表进行操作。

1.3 数据VO简述:


2 客户端 ELAPP

这个安卓客户端的功能也不是很多,就只有记单词(就所谓的展示单词,然后有图片和发音),和文本翻译(单词和句子都可以,使用有道翻译的接口),图片翻译(也是使用有道翻译的接口)

在这里插入图片描述


2.1 主要功能概述:

功能零:登录

就一个登录功能,使用token进行认证,非登录者拦截除登录以外的功能。

功能一:展示单词,单词和句子都可以点击发音

如图所示:

功能二:翻译,提供文字和图片翻译


功能三:数据图表(没有实现)

按道理说这个功能应该可以简单实现,但是没有太多时间了,所以放弃掉。

2.2 结构简述:

  • 界面简述

这个安卓应用使用了单Activity,多fragment的模式(就是应用的三个tab,共享Activity的ViewModel),来设计整个应用。

同时使用Navigation来对每个Fragment进行管理。

  • 业务

    • 业务一,展示单词
    • 业务二,提供文本翻译和图片翻译

    这些业务一句话概括,其实就是发送请求,然后收到请求,将收到的请求渲染到界面中。所以安卓端的业务就只有请求的发送和接收(所以实际上写界面的时间要比业务的时间要久)。 好了,废话不多说,安卓的业务就是请求的发送和接收,所以花费了很大的精力,去搭建了一个网络模块,方便后面的请求发送和接受(后面的开发也证明,这个网络模块所耗费的时间是完全值得的)。下面的篇幅来详细介绍这个网络模块。

2.3 网络模块

网络模块使用了Okhttp和Retrofit,同时还使用了依赖注入框架Hilt,可以在整个安卓应用内随时注入使用,非常的方便。

  • 首先编写Hilt的模块类,相当于spring的xml配置,定义好需要实例化的类。
package com.wong.elapp.hilt;

import android.media.MediaPlayer;

import com.wong.elapp.hilt.types.BaiduRetrofit;
import com.wong.elapp.hilt.types.LocalMapper;
import com.wong.elapp.hilt.types.LocalRetrofit;
import com.wong.elapp.hilt.types.YoudaoMapper;
import com.wong.elapp.hilt.types.YoudaoRetrofit;
import com.wong.elapp.network.TokenIncepter;
import com.wong.elapp.network.mapper.BaiduService;
import com.wong.elapp.network.mapper.LocalService;
import com.wong.elapp.network.mapper.YoudaoService;

import java.util.concurrent.TimeUnit;

import javax.inject.Inject;
import javax.inject.Singleton;

import dagger.Module;
import dagger.Provides;
import dagger.hilt.InstallIn;
import dagger.hilt.android.components.ApplicationComponent;
import okhttp3.OkHttpClient;
import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;
import retrofit2.converter.scalars.ScalarsConverterFactory;

@Module
@InstallIn(ApplicationComponent.class)
public class NetworkModule {
    /**
     * 此类为网络模块
     */

    /**
     * 配置okhttp,
     * 这个okhttp是为连接本地的java服务器提供的。
     */

    @Singleton
    @Provides
    OkHttpClient provideOkhttpForLocalService(){
        OkHttpClient okHttpClient = new OkHttpClient.Builder()
                .connectTimeout(10, TimeUnit.SECONDS)
                .addInterceptor(new TokenIncepter())
                .build();
        return okHttpClient;
    }

    /**
     * 配置第二个okhttp
     * 这个okhttp是位有道翻译准备的。
     */
//    @Singleton
//    @Provides
//    OkHttpClient provideOkhttpForYoudao(){
//        OkHttpClient okHttpClient = new OkHttpClient.Builder()
//                .connectTimeout(10, TimeUnit.SECONDS)
                .addInterceptor(new TokenIncepter())
//                .build();
//        return okHttpClient;
//    }

    /**
     * 配置Retrofit,
     * 这个retrofit是为本地java服务器提供的
     */
    @LocalRetrofit
    @Singleton
    @Provides
    Retrofit provideRetrofit(OkHttpClient okHttpClient){
        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl("http://www.wingloong.top/")
//                .baseUrl("http://172.31.129.139:8888/")
                .client(okHttpClient)
                .addConverterFactory(GsonConverterFactory.create())
//                .addConverterFactory(ScalarsConverterFactory.create())
                .build();
        return retrofit;
    }

    /**
     * 配置第二个retrofit,
     * 这个retrofit是为有道翻译准备的
     */
    @YoudaoRetrofit
    @Singleton
    @Provides
    Retrofit provideRetrofitForYoudao(){
        Retrofit retrofit2 = new Retrofit.Builder()
                .baseUrl("https://openapi.youdao.com/")
                .addConverterFactory(GsonConverterFactory.create())
                .build();
        return retrofit2;
    }

    /**
     * 配置第三个Retrofit,
     * 这个Retrofit是为百度翻译准备的
     */
    @BaiduRetrofit
    @Singleton
    @Provides
    Retrofit provideRetrofitForBaidu(){
        Retrofit retrofit3 = new Retrofit.Builder()
                .baseUrl("https://aip.baidubce.com/")
                .addConverterFactory(GsonConverterFactory.create())
                .build();
        return retrofit3;
    }

    /**
     * 配置Service,
     * 这个是为Java服务器准备的。
     */
    @Singleton
    @Provides
    LocalService provideLocalService(@LocalRetrofit Retrofit retrofit){
       return retrofit.create(LocalService.class);
    }

    /**
     * 配置Service
     * 这个是为有道翻译准备的
     */
    @Singleton
    @Provides
    YoudaoService provideYoudaoService(@YoudaoRetrofit Retrofit retrofit2){
        return retrofit2.create(YoudaoService.class);
    }

    /**
     * 配置Service
     * 这个是为百度翻译准备的。
     * @param retrofit3
     * @return
     */
    @Singleton
    @Provides
    BaiduService provideBaiduService(@BaiduRetrofit Retrofit retrofit3){
        return retrofit3.create(BaiduService.class);
    }


}

  • 然后配置Retrofit的服务提供接口,这些定义好的接口可以直接使用:
package com.wong.elapp.network.mapper;

import com.wong.elapp.pojo.RandomList;
import com.wong.elapp.pojo.vo.LoginParam;
import com.wong.elapp.pojo.vo.Result;

import java.util.List;

import retrofit2.Call;
import retrofit2.http.Body;
import retrofit2.http.GET;
import retrofit2.http.POST;
import retrofit2.http.Path;

public interface LocalService {
    /**
     * 这个接口是连接到本地的服务器中的,
     * 本地服务器主要提供mongodb的查询服务
     * MySQL的增删改操作
     *
     */

    @GET("findwords/randWord/10")
    Call<Result<List<RandomList>>> getRandomWords();

    @GET("findwords/test")
    Call<String> getTest();

    /**
     * 配置用户注册接口
     */
    @POST("user/addUser")
    Call<Result> registe(@Body LoginParam loginParam);

    /**
     * 配置用户登录接口
     * @param loginParam
     * @return
     */
    @POST("user/login")
    Call<Result<String>> login(@Body LoginParam loginParam);

    /**
     * 配置插入记录单词接口
     * @param ids
     * @return
     */
    @POST("userinsert/rember")
    Call<Result<String>> insertRember(@Body List<String> ids);

    @POST("userinsert/forget")
    Call<Result<String>> insertForget(@Body List<String> ids);
}

  • 最后就是注入这些网络服务对象,发送请求。

四、联系与交流

q:969060742 完整代码、报告

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/502513.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Solo 开发者周刊 (第9期):Dawwin首位人工智能编程师或将改变未来?

这里会整合 Solo 社区每周推广内容、产品模块或活动投稿&#xff0c;每周五发布。在这期周刊中&#xff0c;我们将深入探讨开源软件产品的开发旅程&#xff0c;分享来自一线独立开发者的经验和见解。本杂志开源&#xff0c;欢迎投稿。 好文推荐 Dawwin首位人工智能编程师&#…

企业数据被新型.rmallox勒索病毒加密,应该如何还原?

.rmallox勒索病毒为什么难以解密&#xff1f; .rmallox勒索病毒难以解密的主要原因在于其采用了高强度的加密算法&#xff0c;并且这些算法被有效地实施在了病毒程序中。具体来说&#xff0c;.rmallox勒索病毒使用了RSA和AES这两种非常成熟的加密算法。RSA是一种非对称加密算法…

linux安装Tomcat

linux安装Tomcat 下载地址&#xff1a;https://archive.apache.org/dist/tomcat/tomcat-8/v8.5.87/bin/apache-tomcat-8.5.87.tar.gz 将下载的安装包传到该文件夹 解压安装包 tar -zxvf apache-tomcat-8.5.87.tar.gz 配置环境变量 vim /etc/profile 添加指定文件最下方 expo…

【编程笔记】学会使用 Git

目录 一、介绍 Git二、安装 Git三、 常用 linux 目录四、Git 的必要配置(1) 查看和删除之前的配置(2) 配置 Git 五、Git 基本理论六、Git 项目搭建七、Git 文件操作八、分支Git 笔记 ❀❀❀(1) 常规使用(2) 分支 一、介绍 Git &#x1f4d6; VCS&#xff1a;Version Control S…

第六讲 B+树索引

1 B树大家庭 有一种称为 B 树的特定数据结构&#xff0c;人们还使用该术语来泛指一类平衡树数据结构&#xff1a; B-Tree (1971)BTree (1973)B*Tree (1977?)B link-Tree (1981)Bε-Tree (2003)Bw-Tree (2013) 2 B树 BTree 是一种自平衡【self-balance】、有序【ordered】的…

JavaEE 初阶篇-深入了解多线程安全问题(出现线程不安全的原因与解决线程不安全的方法)

&#x1f525;博客主页&#xff1a; 【小扳_-CSDN博客】 ❤感谢大家点赞&#x1f44d;收藏⭐评论✍ 文章目录 1.0 多线程安全问题概述 1.1 线程不安全的实际例子 2.0 出现线程不安全的原因 2.1 线程在系统中是随机调度且抢占式执行的模式 2.2 多个线程同时修改同一个变量 2.3 线…

C语言-编译和链接

目录 1.前言2.编译2.1预处理&#xff08;预编译&#xff09;2.1.1 #define 定义常量2.1.2 #define 定义宏2.1.3带有副作用的宏参数2.1.4宏替换规则2.1.5 #和##2.1.5.1 #运算符2.1.5.2 ## 运算符 2.1.6 命名约定2.1.7 #undef2.1.8 条件编译2.1.9 头文件的包含2.1.9.1 本地文件包…

基于RIP的MGRE综合实验

实验拓扑&#xff1a; 实验要求&#xff1a; 1、R5为ISP&#xff0c;只能进行IP地址配置&#xff0c;其所有地址均配为公有Ip地址; 2、R1和R5间使用PPP的PAP认证&#xff0c;R5为主认证方&#xff1b; R2与R5之间使用ppp的cHAP认证&#xff0c;R5为主认证方; R3与R5之间使用H…

Clip算法解读

论文地址&#xff1a;https://arxiv.org/pdf/2103.00020.pdf 代码地址&#xff1a;https://github.com/OpenAI/CLIPz 中文clip代码&#xff1a;https://gitcode.com/OFA-Sys/Chinese-CLIP/overview 一、动机 主要解决的问题&#xff1a; 超大规模的文本集合训练出的 NLP 模…

pbrt-v4 windows编译失败指南

cpu下编译成功很容易&#xff0c;但是gpu有点麻烦&#xff0c;主要有下面几个坑 安装optix 7&#xff0c;cmake build 要加上PBRT_OPTIX_PATH cmake cuda 版本要对应&#xff0c;不然会出现 cuda not found&#xff0c;或者generate的时候报错&#xff0c;导致最后pbrt.exe --…

FANUC机器人故障诊断—报警代码更新(三)

FANUC机器人故障诊断中&#xff0c;有些报警代码&#xff0c;继续更新如下。 一、报警代码&#xff08;SRVO-348&#xff09; SRVO-348DCS MCC关闭报警a&#xff0c;b [原因]向电磁接触器发出了关闭指令&#xff0c;而电磁接触器尚未关闭。 [对策] 1.当急停单元上连接了CRMA…

在react项目用echarts绘制中国地图

文章目录 一、引入echarts二、下载地图json数据三、编写react组件四、组件使用 一、引入echarts 安装&#xff1a;npm i echarts --save 二、下载地图json数据 由于echarts内部不再支持地图数据&#xff0c;所以要绘制地图需要自己去下载数据。建议使用阿里云的。 地址&…

接口自动化框架搭建(四):pytest的使用

1&#xff0c;使用说明 网上资料比较多&#xff0c;我这边就简单写下 1&#xff0c;目录结构 2&#xff0c;test_1.py创建两条测试用例 def test_1():print(test1)def test_2():print(test2)3&#xff0c;在pycharm中执行 4&#xff0c;执行结果&#xff1a; 2&#xff0…

Mysql连接报错:1130-host ... is not allowed to connect to this MySql server如何处理

我用navicat连接我的阿里云服务器的mysql服务器的时候,出现了1130的报错。&#xff08;mysql Server version: 5.7.42-0ubuntu0.18.04.1 (Ubuntu)&#xff09; 我来记录一下这个原因&#xff0c;以及修改过程&#xff01; 1.首先进入mysql -u root -p&#xff0c; mysql客户端…

车载电子与软件架构

车载电子与软件架构 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师 (Wechat:gongkenan2013)。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 本就是小人物,输了就是输了,不要在意别人怎么看自己。江湖一碗茶,喝完再挣扎,出门靠自己,四…

Unity LineRenderer的基本了解

在Unity中&#xff0c;LineRenderer组件用于在场景中绘制简单的线条。它通常用于绘制轨迹、路径、激光等效果。 下面来了解下它的基本信息。 1、创建 法1&#xff1a;通过代码创建 using UnityEngine;public class CreateLineRenderer : MonoBehaviour {void Start(){// 创…

排序算法超详细代码和知识点整理(java版)

排序 1、冒泡排序 ​ 两层循环&#xff0c;相邻两个进行比较&#xff0c;大的推到后面去&#xff0c;一共比较“数组长度”轮&#xff0c;每一轮都是从第一个元素开始比较&#xff0c;每一轮比较都会将一个元素固定到数组最后的一个位置。【其实就是不停的把元素往后堆&#…

LLaMA-Factory参数的解答

打开LLaMA-Factory的web页面会有一堆参数 &#xff0c;但不知道怎么选&#xff0c;选哪个&#xff0c;这个文章详细解读一下&#xff0c;每个参数到底是什么含义这是个人写的参数解读&#xff0c;我并非该领域的人如果那个大佬看到有参数不对请反馈一下&#xff0c;或者有补充的…

我于窗中窥月光,恰如仰头见“链表”(Java篇)

本篇会加入个人的所谓‘鱼式疯言’ ❤️❤️❤️鱼式疯言:❤️❤️❤️此疯言非彼疯言 而是理解过并总结出来通俗易懂的大白话, 小编会尽可能的在每个概念后插入鱼式疯言,帮助大家理解的. &#x1f92d;&#x1f92d;&#x1f92d;可能说的不是那么严谨.但小编初心是能让更多人…