一个Almost完整的电商项目后台+安卓客户端

一转眼就已经大三了,作为非CS专业的一个普通大学生,应该对自己的未来做规划了。于是,大三开始我就开始着手准备一个“大项目”。将前两年学习的知识做一个总结,归纳。于是就有了这个项目。项目的名字叫OscsMall,为什么叫这个名字我也不知道。至于Almost是因为整个项目缺少了支付部分的代码,原因是拿不到微信的key。整个项目分为后端和客户端,后端代码显得稚嫩,客户端代码也算拿的的出手。还恳请个位大佬轻喷。项目自然参考了其他大神的代码。这个项目我也会一直维护下去的,恳请大佬们star一下。

后台

后台其实没什么好介绍的,整个项目使用Spring+MyBatis+MySQL,项目采用MVC模式。包含前台和后台管理部分代码。是一个很普通的电商项目,包含了8大结构,6大模块。

项目结构

common

作用:用来处理公共的信息,包括Token,常量,全局异常,公共类等封装

controller

作用:包括前台和后台部分的controller代码

service

作用:项目中要到的service部分

dao

作用:负责dao

pojo

作用:数据库对象

vo

作用:view object前端对象

util

作用:一些简单的工具类

项目模块(详情见文档)

用户信息

包括:用户登录,注册,信息获取,注销等流程,管理登录

商品信息

商品增加删除更新,同时放置非管理员对商品的属性进行操作

商品分类信息

商品分类信息,包括子分类的信息获取

购物车

购物车添加,删除,选择,更新等管理

订单

订单生成,不同类型的订单查询等管理

地址

地址增加,删除,选择等功能

具体的内容在wiki

客户端

展示

  • 分类

  • 寻觅(混合开发,图中展示了js与java互相调用的场景)

  • 购物车(购物车每次点击都以为着网络请求,所以这里的请求是相对比较密集的)

  • 个人中心(我的,其中空白的是由于我直接更改数据库造成的)

客户端的整体架构

架构

网络模块(两种)
  1. 使用rxJava与retrofit2和okhttp3组成网络请求框架(有些时候Rxjava并不能按照预期给出结果,让我有点苦恼。水平不够,嘤嘤嘤)

  2. 未使用rxJava的网络框架,整个请求写法上类似于Velloy

App配置相关
  • 整个App的图标全部使用icon
  • 使用Builder设计模式来配置整个应用信息(使用什么icon,内置了iconify中给出的所有Icon)
代理Activity

作为整个程序唯一一个Activity,作为所有Fragment的代理

MVP相关

作为MVP模式的基类

UI相关

UI处理部分

App的整体流程
App的整体流程分为三部分

第一部分

流程:首页展示前,整个Activity作为Fragment的调度站,负责Fragment的跳转和信息传递。这样的好处是,避免跳转流程复杂,导致自己开发时候很晕。一般Fragment的跳转需要App的当前状态,用户的当前状态,通过这两状态去决定下一个Fragment是什么。

同时整个Activity代理了所有的toast信息的展示,和Loading加载。这样整个流程更加清晰。
第一部分

第二部分

首页展示后,整个Bottom Fragment作为调度站,负责在各个页面之间进行跳转。

第二部分

第三部分

不同首页需要其他额外的Fragment,由该Fragment自己掌控。
第三部分

目的:

App整体流程是我自己的一些小技巧的总结,让同级的Fragment之间的调用更加清楚,这样设计,如果App加入新的类型的启动页,我们就不用更改相关所有Fragment的代码,而只需要更改Activity的代码就可以了。

总结:

总结
整个App被分成4层,第一层是Activity,把握了第二层的Fragment的调用顺序,第二层Fragment把握了第三层的调用,以此类推。

使用到的依赖

//iconify icon图标库
compile 'com.joanzapata.iconify:android-iconify:2.2.2'
compile 'com.joanzapata.iconify:android-iconify-fontawesome:2.2.2'
// (v4.5)
compile 'com.joanzapata.iconify:android-iconify-entypo:2.2.2'
// (v3,2015)
compile 'com.joanzapata.iconify:android-iconify-typicons:2.2.2'
// (v2.0.7)
compile 'com.joanzapata.iconify:android-iconify-material:2.2.2'
// (v2.0.0)
compile 'com.joanzapata.iconify:android-iconify-material-community:2.2.2'
// (v1.4.57)
compile 'com.joanzapata.iconify:android-iconify-meteocons:2.2.2'
// (latest)
compile 'com.joanzapata.iconify:android-iconify-weathericons:2.2.2'
// (v2.0)
compile 'com.joanzapata.iconify:android-iconify-simplelineicons:2.2.2'
// (v1.0.0)
compile 'com.joanzapata.iconify:android-iconify-ionicons:2.2.2'
// (v2.0.1)
//AndroidUtilCode安卓工具类
compile 'com.blankj:utilcode:1.9.8'
//logger
compile 'com.orhanobut:logger:2.1.1'
//网络请求依赖
compile 'com.squareup.okio:okio:1.13.0'
compile 'com.squareup.okhttp3:okhttp:3.8.1'
compile 'com.squareup.retrofit2:retrofit:2.3.0'
compile 'com.squareup.retrofit2:converter-scalars:2.3.0'
//rx全家桶
compile 'io.reactivex.rxjava2:rxjava:2.1.6'
compile 'io.reactivex.rxjava2:rxandroid:2.0.1'
compile 'com.squareup.retrofit2:adapter-rxjava2:2.3.0'
//JSON依赖Android版
compile 'com.alibaba:fastjson:1.1.57.android'
//AVLoadIndicatorView 加载
compile 'com.wang.avi:library:2.1.3'
// fragmentation Fragment
compile 'me.yokeyword:fragmentation:1.1.8'
compile 'me.yokeyword:fragmentation-swipeback:1.1.8'
//ButterKnife依赖
compile 'com.jakewharton:butterknife:8.6.0'
annotationProcessor 'com.jakewharton:butterknife-compiler:8.6.0'
//Banner依赖
compile 'com.bigkoo:convenientbanner:2.0.5'
compile 'com.ToxicBakery.viewpager.transforms:view-pager-transforms:1.2.32@aar'
//RecyclerView依赖
compile 'com.github.CymChad:BaseRecyclerViewAdapterHelper:2.9.32'
//RecyclerView分割线
compile 'com.choices.divider:RecyclerView_Divider:1.0.0'
//StatusBarCompat
dependencies {
    compile('com.github.niorgai:StatusBarCompat:2.1.4', {
        exclude group: 'com.android.support'
    })
}
//Google AutoValue provided代表只在编译期间,产生作用,最后在源码中是不存在的
provided 'com.google.auto.value:auto-value:1.4.1'
annotationProcessor "com.google.auto.value:auto-value:1.4.1"
//图片加载
compile 'com.github.bumptech.glide:glide:4.0.0-RC0'
compile 'com.github.bumptech.glide:okhttp3-integration:4.0.0-RC0@aar'
annotationProcessor 'com.github.bumptech.glide:compiler:4.0.0-RC0'
//circleimageview 圆形头像
compile 'de.hdodenhof:circleimageview:2.2.0'
//数据库依赖
compile 'org.greenrobot:greendao-generator:3.2.2'
compile 'org.greenrobot:greendao:3.2.2'
//图片裁剪
compile 'com.github.yalantis:ucrop:2.2.1-native'
//permissionsdispatcher
compile("com.github.hotchemi:permissionsdispatcher:3.0.1") {
    exclude module: "support-v13"
}
annotationProcessor "com.github.hotchemi:permissionsdispatcher-processor:3.0.1"
//富文本
compile 'com.zzhoujay.richtext:richtext:2.5.4'
//二维码扫描
compile 'me.dm7.barcodescanner:zbar:1.9.3'
### 回答1: 我可以给你一些关于如何使用Verilog编写一个异步FIFO的指导方针: 1.使用Verilog的状态机模块,定义FIFO的状态,并设置输入和输出信号; 2.使用Verilog的模拟模块,定义FIFO的读写操作; 3.使用Verilog的时序模块,定义FIFO的时序控制,实现异步FIFO功能; 4.使用Verilog的测试模块,定义FIFO的测试代码,验证FIFO的正确性。 ### 回答2: 在Verilog中,可以使用信号的上升边沿来实现一个简单的异步FIFO(First-In First-Out)。 首先,我们需要定义FIFO的一些参数,如数据宽度、深度等。假设我们定义FIFO的数据宽度为8位,深度为16。 接下来,我们可以定义FIFO的输入和输出端口。输入包括数据输入d_in和写入使能信号wr_en。输出包括数据输出d_out和读取使能信号rd_en。 然后,我们需要定义一个数据存储区域,用于存储来自输入端口的数据。这可以通过定义一个大小为深度乘以数据宽度的数组来实现。 接着,我们可以开始编写模块中的逻辑。首先,我们需要实现写操作。当wr_en为1时,将数据d_in写入数组的下一个可用位置。 然后,我们需要实现读操作。当rd_en为1时,从数组的下一个可读位置输出数据d_out,并将该位置的数据清零。 最后,我们需要处理一些边界情况。当FIFO已满时,写操作应该被忽略。同样,当FIFO为空时,读操作应该被忽略。 需要注意的是,异步FIFO的实现需要考虑时序问题。Verilog提供了多种方法来处理时序逻辑,如使用always块或者使用非阻塞赋值语句。具体的实现方式可以根据需求和个人喜好选择。 总之,通过编写适当的逻辑代码,我们可以实现一个简单的异步FIFO模块。这个模块可以接收并存储来自输入端口的数据,并按照先进先出的顺序将数据输出到输出端口。 ### 回答3: 异步 FIFO 是一种常用的数字电路设计,用于解决不同速度的数据传输问题。下面我会用300字的篇幅来回答如何用 Verilog 语言编写一个异步 FIFO。 异步 FIFO 由读指针、写指针和存储器组成。我们首先需要定义这三部分在 Verilog 中的描述。读指针和写指针由计数器实现,存储器可以使用 Verilog 中的 reg 数组来表示。 module fifo (input wire c1, c2, reset, // 输入时钟信号 input wire d, // 输入数据信号 output reg r, // 读信号 output wire almost_empty, // 非完全空状态信号 output wire almost_full); // 非完全满状态信号 reg [7:0] FIFO [0:255]; // 存储器,这里假设容量为256,每个存储单元8位 reg [7:0] read_ptr, write_ptr, count; // 读写指针和计数器 always @(posedge c1 or posedge reset) begin // 对读指针、写指针和计数器进行操作 if (reset) begin // 复位 read_ptr <= 8'b0; write_ptr <= 8'b0; count <= 0; end else if (c1) begin // 在时钟上升沿进行操作 if (r == 1'b1) read_ptr <= read_ptr + 8'b1; // 读指针1 if (count < 255 && d == 1'b1) begin // 如果计数器小于255且有数据输入,则写入存储器 FIFO[write_ptr] <= d; write_ptr <= write_ptr + 8'b1; // 写指针1 count <= count + 1; // 计数器1 end end end always @(posedge c2 or posedge reset) begin // 计算非完全空状态和非完全满状态信号 if (reset) begin almost_empty <= 1'bz; almost_full <= 1'bz; end else if (c2) begin almost_empty <= (count <= 0) ? 1'b1 : 1'b0; almost_full <= (count >= 255) ? 1'b1 : 1'b0; end end assign r = (count > 0) ? 1'b1 : 1'b0; // 根据计数器判断是否有可读数据 endmodule 上述 Verilog 代码中的异步 FIFO 模块实现了读信号的输出、非完全空状态和非完全满状态的计算,并在 c1 和 c2 时钟信号上升沿时对读写指针以及计数器进行操作,实现了异步 FIFO 的功能。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值