【大型项目-电商平台】1.0|【大型项目-电商平台】1.0 互联网以及电商行业分析、项目搭建及运行
本项目Gitee地址:https://gitee.com/bobokaka/pinyougou
项目依赖资料gitee地址:https://gitee.com/bobokaka/pinyougou-data
1.0 IT行业发展
近年来,IT行业发展趋向互联网化,传统项目(比如桌面应用)目前也就国企等单位有此需求。
互联网化趋向于视频、直播、金融、保险、医疗、房地产等等。
2.0 互联网特点
3.0 互联网项目开发架构
- 高并发访问(访问量大)
- 大数据量
主备 nginx负载均衡:实现高可用。
- 前端页面必须美观、大气、上档次。
- 系统必须具有流畅的运行效果——必须对项目进行一系列优化。
- (1) 数据层优化
- 1> 数据库集群(主备,读写分离),分表、分库存储(大数据:500w'条即换表),开启索引、缓存,数据库设计优化,sql语句优化。
- 2> 缓存优化(把频繁读取数据,放入缓存,减轻数据库压力)
- 3> 搜索优化(使用专业的搜索工具进行搜索:solr等)
- (2) 项目层优化
- 1> 必须使用集群
- 2> 必须使用分布式
- 3> JVM:tomcat服务器优化
- (3) 应用层优化
- 1> 页面缓存
- 2> 页面静态化
- 3> nginx负载均衡(用来分发请求)
- 4> F5负载均衡
文章图片
image.png 4.0 b2bc类型电商项目——品优购。
- 把传统的项目拆分成面向服务分布式架构:SOA
- ssm框架分布式项目搭建
- 分布式项目测试通过
- 前端开发组件——angularJS——重前端轻后端——使运行速度更快
- 商品列表查询、添加、更新
- 商品相关的业务
- 首页广告内容加载——redis缓存
- 搜索——solr搜索
- 同步索引库(activeMQ消息中间件)
- 商品详情页静态化
- 发短信登录
- 单点登录(查收,spring security)
- 购物车
- 订单
- 微信支付
- 集群上线部署(zookeeper集群、redis集群、项目集群、solr集群、acitive集群、nginx集群)
- 集群
- docker容器部署
采用商家入驻模式,商家入驻平台提交申请,平台进行资质审核、审核通过后,商家拥有独立的管理后台录入商品信息,商品经过平台审核后即可通过。
品优购网上商城主要分为网站前台、运营商后台、商家管理后台三个子系统。
4.1 网站前台 主要包括网站首页、商家首页、商品详细页、、搜索页、会员中心、订单与支付相关页面、
秒杀频道等。
文章图片
image.png 4.2 运营商后台 是运营商的运营人员的管理后台。 主要包括商家审核、品牌管理、规格管理、模板管理、
商品分类管理、商品审核、广告类型管理、广告管理、订单查询、商家结算等。
文章图片
image.png 4.3 商家管理后台 入驻的商家进行管理的后台,主要功能是对商品的管理以及订单查询统计、资金结算等功能。
文章图片
image.png 5.0 系统架构 5.1 什么是SOA架构 SOA是service-Oriented Architecture的首字母简称,面向服务分布式架构。支持面向服务的框架样式。
5.2 什么叫面向服务 service就是服务,web就是服务消费者,web层面向service,即面向服务架构。
5.3 为什么使用SOA架构? 解决并发压力,大数据场景。
能够解决:
传统项目框架:
- 分担服务器压力
- 提高项目并发能力
- 提高访问速度
只有一个war包,所有业务集中一个项目中进行开发。
并发量:(5+-)
初步分布式部署:
缺点:
- 项目和数据库进行拆分分布式
- 项目开发采用mvc框架开发
- 项目采用分层开发
并发量:(500+-)
- 容错性差(不具有高可用性)
- 并发量不能满足互联网需求
文章图片
image.png
所以,采用集群分布式部署。
集群方式部署:
优点:
- 项目采用集群部署
- 数据库采用集群部署
缺点:
- 容错能力提高(具有高可用性)
- 并发能力提升
- 并发能力不能满足需求(10w?)
- 请求分发问题。分发给哪个服务器
- seession如何共享?
- (1) tomcat集群session复制功能,把用户的身份信息直接广播给每一个集群服务器。——用户太多,无法实现
- (2) 第三方服务器,存储session
使用redis服务器存储用户身份信息。
文章图片
image.png 6.0 实现SOA 6.1 思路 1. 把service拆分成一个单独的项目(war) 2. 把web拆分成一个单独项目(war) web和service是远程调用关系,这个架构叫做面向服务架构。
6.2 实现远程调用技术
- webservice
- dubbox(dubbo)——轻量级的服务治理框架
- spring cloud——重量级服务治理框架
- 并发能力提升(10w+-)
- 分布式项目采用集群部署(高可用性)
- 网络抖动
- 进程繁忙
以上2种情况都会导致项目性能下降。
- 提升带宽(钱钱钱)
- 使用dubbox框架
dubbox服务治理中间件
- rpc 远程调用hessain2 二进制序列化
- nio 异步通讯 netty
服务层:service项目(war)
文章图片
image.png
7.0 数据库环境准备 下面开始项目的搭建。
项目搭建可分为3个步骤:
- 数据库环境
- 开发搭建zookeeper注册中心
- 搭建项目结构
表名称 | 含义 |
---|---|
tb_brand | 品牌 |
tb_specification | 规格 |
tb_specification_option | 规格选项 |
tb_type_template | 类型模板:用于关联品牌和规格 |
tb_item_cat | 商品分类 |
tb_seller | 商家 |
tb_goods | 商品 |
tb_goods_desc | 商品详情 |
tb_item | 商品明细 |
tb_content | 内容(广告) |
tb_content_category | 内容(广告)类型 |
tb_user | 用户 |
tb_order | 订单 |
tb_order_item | 订单明细 |
tb_pay_log | 支付日志 |
文章图片
image.png
文章图片
image.png 数据库sql语句:https://gitee.com/bobokaka/pinyougou-data/blob/master/%E5%BB%BA%E5%BA%93%E8%AF%AD%E5%8F%A5/pinyougoudb.sql
品优购采用当前流行的前后端编程架构。
后端框架采用 Spring +SpringMVC+mybatis +Dubbox。前端采用 angularJS + Bootstrap。
8.0 zokepper安装 8.1 下载zookeeper 可参考如下链接:
Zookeeper本地安装配置(入门)https://blog.csdn.net/nangu0673/article/details/82587014
首先,下载一个zookeeper。
现在服务器大都是linux系统,配置安装教程如下:
zookeeper安装文档.docx
8.2 修改配置文件 解压后,进入目录中的conf目录,有一个zoo_sample.cfg文件,将其重命名为zoo.cfg,然后打开,在最后添加
dataDir=D:/acm/zookeeper-3.4.5/data
dataDirLog=D:/acm/zookeeper-3.4.5/log
完整的zoo.cfg文件配置:
# The number of milliseconds of each tick
tickTime=2000
# The number of ticks that the initial
# synchronization phase can take
initLimit=10
# The number of ticks that can pass between
# sending a request and getting an acknowledgement
syncLimit=5
# the directory where the snapshot is stored.
# do not use /tmp for storage, /tmp here is just
# example sakes.
dataDir=D:/acm/zookeeper-3.4.5
# the port at which the clients will connect
clientPort=2181
#
# Be sure to read the maintenance section of the
# administrator guide before turning on autopurge.
#
# http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance
#
# The number of snapshots to retain in dataDir
#autopurge.snapRetainCount=3
# Purge task interval in hours
# Set to "0" to disable auto purge feature
#autopurge.purgeInterval=1
dataDir=D:/acm/zookeeper-3.4.5/datadataDirLog=D:/acm/zookeeper-3.4.5/log
将解压后的文件放到想要放的位置
文章图片
image.png 8.3 启动zookeeper 进入bin目录双击zkServer.cmd即可开启zookeeper本地服务,当出现如图所示信息时,表示服务开启成功。
文章图片
image.png 8.4 配置环境变量 新建系统变量变量名ZOOKEEPER_HOME,变量值D:/acm/zookeeper-3.4.5 【zooleeper安装/解压路径】
在path环境变量中添加 %ZOOKEEPER_HOME%\bin 以及 %ZOOKEEPER_HOME\conf
win+R输入cmd进入命令行窗口,输入zkServer回车,信息如图所示即为配置成功。
文章图片
image.png 到此,配置完成。
9.0 项目结构
文章图片
image.png 10.0 新建maven项目 10.1 设置eclipse后面的new菜单 建议参考如下设置:
文章图片
image.png
文章图片
image.png
文章图片
image.png
文章图片
image.png
文章图片
image.png
文章图片
image.png
最后的效果:
文章图片
image.png 10.2 新建
pyg-parent
父项目
新建一个maven project。本项目所有maven项目创建都跳过框架模板。
文章图片
image.png
文章图片
image.png
文章图片
image.png
这里我之前创建了一个项目pyg-html-utils ,后期会创建。此处可以忽略。
10.3 创建
pyg-common
项目
因为和pyg-parent
父项目是继承而不是聚合,使用应该创建一个maven project,如果是聚合关系,就创建maven Module项目。文章图片
image.png
文章图片
image.png
文章图片
image.png
10.4 同样的步骤创建项目
pyg-pojo
项目、pyg-dao
项目 文章图片
image.png 到此,3个公共工程创建完毕。
10.5 创建后台聚合父工程
文章图片
image.png 10.6 创建聚合后台的其他工程项目
文章图片
image.png
文章图片
image.png
文章图片
image.png
文章图片
image.png
同理,创建后台服务工程项目
文章图片
image.png
文章图片
image.png
文章图片
image.png
到此,服务层搞定。 10.6 表现层 表现层(web层)调用服务层。
我们用两个表现层项目,一个是商家,一个是运营商。
new一个maven project,创建运营商表现层工程。。
文章图片
image.png
同理,创建商家表现层工程。
文章图片
image.png 至此,项目结构为(忽略pyg-html-utils):
文章图片
image.png 11.0 完善pom.xml 在大型项目中,这一般由产品经理或者项目架构师完成,所以作为一般开发人员只需要复制粘贴即可。
11.1 父项目pyg-parent的pom.xml配置
4.0.0
com.pinyougou
pyg-parent
0.0.1-SNAPSHOT pom4.1
4.2.4.RELEASE4.0.0
2.5
2.8.4
3.4.7
0.1
3.2.8
1.2.2
1.2.15
5.1.48
1.0.9
1.3.1
2.3.23
5.11.2
3.2.3.RELEASE
4.10.3
2012_u6
org.springframework
spring-context
${spring.version}
org.springframework
spring-beans
${spring.version}
org.springframework
spring-webmvc
${spring.version}
org.springframework
spring-jdbc
${spring.version}
org.springframework
spring-aspects
${spring.version}
org.springframework
spring-jms
${spring.version}
org.springframework
spring-context-support
${spring.version}
org.springframework
spring-test
${spring.version}
com.alibaba
dubbo
${dubbo.version}
org.apache.zookeeper
zookeeper
${zookeeper.version}
com.github.sgroschupf
zkclient
${zkclient.version}
junit
junit
4.9
com.alibaba
fastjson
1.2.28
javassist
javassist
3.11.0.GA
commons-codec
commons-codec
1.10
javax.servlet
servlet-api
2.5
provided
com.github.pagehelper
pagehelper
${pagehelper.version}
org.mybatis
mybatis
${mybatis.version}
org.mybatis
mybatis-spring
${mybatis.spring.version}
com.github.miemiedev
mybatis-paginator
${mybatis.paginator.version}
mysql
mysql-connector-java
${mysql.version}
com.alibaba
druid
${druid.version}
org.csource.fastdfs
fastdfs
1.2
commons-fileupload
commons-fileupload
${commons-fileupload.version}
redis.clients
jedis
2.8.1
org.springframework.data
spring-data-redis
1.7.2.RELEASE
org.freemarker
freemarker
${freemarker.version}
org.apache.activemq
activemq-all
${activemq.version}
org.springframework.security
spring-security-web
4.1.0.RELEASE
org.springframework.security
spring-security-config
4.1.0.RELEASE
com.github.penggle
kaptcha
2.3.2
javax.servlet
javax.servlet-api
org.springframework.security
spring-security-cas
4.1.0.RELEASE
org.jasig.cas.client
cas-client-core
3.3.3
org.slf4j
log4j-over-slf4j
org.apache.solr
solr-solrj
${solrj.version}
com.janeluo
ikanalyzer
${ik.version}
org.apache.httpcomponents
httpcore
4.4.4
org.apache.httpcomponents
httpclient
4.5.3
dom4j
dom4j
1.6.1
xml-apis
xml-apis
1.4.01
${project.artifactId} org.apache.maven.plugins
maven-compiler-plugin
3.2
1.7
1.7
UTF-8
org.apache.tomcat.maven
tomcat7-maven-plugin
2.2
11.2 工具类pyg-common的pom文件配置
4.0.0 com.pinyougou
pyg-parent
0.0.1-SNAPSHOT
pyg-common
junit
junit
com.alibaba
fastjson
javassist
javassist
commons-codec
commons-codec
commons-fileupload
commons-fileupload
org.apache.httpcomponents
httpcore
org.apache.httpcomponents
httpclient
dom4j
dom4j
xml-apis
xml-apis
update maven后,可以看到依赖包都已经被maven自动导入:
文章图片
image.png 11.3 dao层pyg-dao的pom文件配置 /pyg-dao/pom.xml
4.0.0 com.pinyougou
pyg-parent
0.0.1-SNAPSHOT
pyg-dao
org.mybatis
mybatis
org.mybatis
mybatis-spring
com.github.miemiedev
mybatis-paginator
com.github.pagehelper
pagehelper
mysql
mysql-connector-java
com.alibaba
druid
com.pinyougou
pyg-pojo
0.0.1-SNAPSHOT
com.pinyougou
pyg-common
0.0.1-SNAPSHOT
11.4 后台管理的聚合父工程pyg-manager的pom.xml配置 pyg-manager工程原则上不需要坐标依赖,但是它的聚合子工程需要。
4.0.0 com.pinyougou
pyg-parent
0.0.1-SNAPSHOT
pyg-managerpom
pyg-manager-interface
pyg-manager-service
com.pinyougou
pyg-dao
0.0.1-SNAPSHOT
org.apache.tomcat.maven
tomcat7-maven-plugin9000/
10.5 pyg-manager-interface的pom.xml配置 不用配置。
/pyg-manager-interface/pom.xml
4.0.0 com.pinyougou
pyg-manager
0.0.1-SNAPSHOT
pyg-manager-interface
10.6 pyg-manager-service需要管理spring事务,配置pom.xml文件。 /pyg-manager-service/pom.xml
4.0.0 com.pinyougou
pyg-manager
0.0.1-SNAPSHOT
pyg-manager-servicewar
org.springframework
spring-context
org.springframework
spring-beans
org.springframework
spring-webmvc
org.springframework
spring-jdbc
org.springframework
spring-aspects
org.springframework
spring-jms
org.springframework
spring-context-support
org.springframework
spring-test
com.alibaba
dubbo
org.apache.zookeeper
zookeeper
com.github.sgroschupf
zkclient
com.pinyougou
pyg-manager-interface
0.0.1-SNAPSHOT
org.apache.maven.plugins
maven-war-plugin
2.3
false
org.apache.maven.plugins
maven-war-plugin
2.3
false
11.7 运营商表现层pyg-manager-web的pom.xml
4.0.0 com.pinyougou
pyg-parent
0.0.1-SNAPSHOT
pyg-manager-webwar
org.springframework
spring-context
org.springframework
spring-beans
org.springframework
spring-webmvc
org.springframework
spring-jdbc
org.springframework
spring-aspects
org.springframework
spring-jms
org.springframework
spring-context-support
org.springframework
spring-test
com.alibaba
dubbo
org.apache.zookeeper
zookeeper
com.github.sgroschupf
zkclient
com.pinyougou
pyg-manager-interface
0.0.1-SNAPSHOT
javax.servlet
servlet-api
provided
11.8 商家表现层pyg-shop-web的pom.xml配置 商家表现层pyg-shop-web的配置和运营商表现层一模一样。
4.0.0 com.pinyougou
pyg-parent
0.0.1-SNAPSHOT
pyg-shop-webwar
org.springframework
spring-context
org.springframework
spring-beans
org.springframework
spring-webmvc
org.springframework
spring-jdbc
org.springframework
spring-aspects
org.springframework
spring-jms
org.springframework
spring-context-support
org.springframework
spring-test
com.alibaba
dubbo
org.apache.zookeeper
zookeeper
com.github.sgroschupf
zkclient
com.pinyougou
pyg-manager-interface
0.0.1-SNAPSHOT
javax.servlet
servlet-api
provided
12.0 Dao层 从Dao层开始,Dao层主要负责访问数据库。
12.1 添加数据源
文章图片
image.png
/pyg-dao/src/main/resources/prop/db.properties
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/pinyougoudb?characterEncoding=utf-8
jdbc.username=root
jdbc.password=bywwcnll57
12.2 mybatis配置文件 /pyg-dao/src/main/resources/config/SqlMapConfig.xml
12.3 数据源工厂扫描接口的配置。 /pyg-dao/src/main/resources/spring/applicationContext-dao.xml
13.0 逆向工程生成接口 在12.3中
接口代理并不存在。我们可以通过反射来实现接口类生成。这时候需要mybatis generator的插件。
文章图片
image.png 安装说明:
配置好后,重启eclipse。配置逆向工程配置文件/pyg-dao/src/main/resources/generatorConfig.xml
- 把plugins中的所有jar拷贝到eclipse的plugins文件夹之中
- 把features中的所有文件夹拷贝到eclipse的features文件夹之中
- 重启eclipse,ok
文章图片
image.png
执行‘’蝙蝠“:
文章图片
image.png 等待完成,打开pyg-dao,可见:
文章图片
image.png
打开pyg-pojo,可见:
文章图片
image.png 但是在我们的com.pyg.mapper目录下,只能编译.java的文件,xml配置文件无法编译执行,这时候需要调整一下:
在src/main/resources目录下新建com.pyg.mapper包目录,把xml文件移动到该目录下:
文章图片
image.png
这种模式,也满足我们的接口代理开发。
14.0 服务层配置 14.1 service配置文件 pyg-manager-service项目负责管理事务,配置其配置文件:
文章图片
image.png
/pyg-manager-service/src/main/resources/spring/applicationContext-service.xml
14.2 WEB-INF /pyg-manager-service/src/main/webapp/WEB-INF/web.xml
contextConfigLocationclasspath*:spring/applicationContext*.xml
org.springframework.web.context.ContextLoaderListener
15.0 web工程pyg-manager-web
文章图片
image.png 一些常量保存在application.properties文件中。目前为空。
/pyg-manager-web/src/main/resources/spring/springmvc.xml
WriteMapNullValue
WriteDateUseDateFormat
web.xml中配置编码过滤器、加载DispatcherServlet(前端控制器)、springmvc文件。
/pyg-manager-web/src/main/webapp/WEB-INF/web.xml
CharacterEncodingFilter
org.springframework.web.filter.CharacterEncodingFilter
encodingutf-8
forceEncodingtrue
CharacterEncodingFilter
/*
springmvc
org.springframework.web.servlet.DispatcherServletcontextConfigLocationclasspath:spring/springmvc.xml
springmvc
/
16.0 web工程pyg-shop-web 同15.0 配置一样。
/pyg-shop-web/src/main/resources/config/application.properties为空。
/pyg-shop-web/src/main/resources/spring/springmvc.xml
WriteMapNullValue
WriteDateUseDateFormat
/pyg-shop-web/src/main/webapp/WEB-INF/web.xml
CharacterEncodingFilter
org.springframework.web.filter.CharacterEncodingFilter
encodingutf-8
forceEncodingtrue
CharacterEncodingFilter
/*
springmvc
org.springframework.web.servlet.DispatcherServletcontextConfigLocationclasspath:spring/springmvc.xml
springmvc
/
17.0 集成测试 17.1 新建一个查询所有品牌的接口
文章图片
image.png
/pyg-manager-interface/src/main/java/com/pyg/manager/service/BrandService.java
package com.pyg.manager.service;
import java.util.List;
import com.pyg.pojo.TbBrand;
/**
* 查询品牌的接口
*
* @author EdPeng
*
*/
public interface BrandService {/**
* 查询所有的品牌数据
*/
public List findAll();
}
17.2 在service项目中实现该接口。
文章图片
image.png /pyg-manager-service/src/main/java/com/pyg/manager/service/impl/BrandServiceImpl.java
package com.pyg.manager.service.impl;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import com.alibaba.dubbo.config.annotation.Service;
import com.pyg.manager.service.BrandService;
import com.pyg.mapper.TbBrandMapper;
import com.pyg.pojo.TbBrand;
import com.pyg.pojo.TbBrandExample;
//必须使用dubbo的@Service才能发布到zookeeper的注册中心里。
@Service
public class BrandServiceImpl implements BrandService{
//注入mapper接口代理对象
@Autowired
private TbBrandMapper brandMapper;
@Override
public List findAll() {
//创建example对象
TbBrandExample example = new TbBrandExample();
// 查询所有
List list = brandMapper.selectByExample(example);
return list;
}}
17.3 编写表现层代码
文章图片
image.png
/pyg-manager-web/src/main/java/com/pyg/manager/controller/BrandController.java
package com.pyg.manager.controller;
import java.util.List;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.alibaba.dubbo.config.annotation.Reference;
import com.pyg.manager.service.BrandService;
import com.pyg.pojo.TbBrand;
//@RestController是@Controller和@ResponseBody的集合体
@RestController
public class BrandController {// 注入远程服务的对象,alibaba.dubbo的注解来实现
@Reference
private BrandService brandService;
// 查询所有品牌数据
@RequestMapping("/finAll")
public List findAll() {
// 调用远程服务对象方法
List list = brandService.findAll();
return list;
}
}
为了执行项目,需要在pyg-manager-web工程中植入tomcat插件,修改pom.xml文件。
/pyg-manager-web/pom.xml
4.0.0 com.pinyougou
pyg-parent
0.0.1-SNAPSHOT
pyg-shop-webwar…………org.apache.maven.plugins
maven-war-plugin
2.3
false
org.apache.tomcat.maven
tomcat7-maven-plugin8084/
同时也修改好pyg-shop-web项目的pom.xml文件。
/pyg-shop-web/pom.xml
4.0.0 com.pinyougou
pyg-parent
0.0.1-SNAPSHOT
pyg-shop-webwar…………org.apache.maven.plugins
maven-war-plugin
2.3
false
org.apache.tomcat.maven
tomcat7-maven-plugin8084/
17.4 安装项目 首先是pyg-parent项目安装,没安装找不到包。
文章图片
image.png
见下图,安装成功:
文章图片
image.png 同样的方法,依次安装pyg-common、pyg-pojo、pyg-dao、pyg-manager、pyg-manager-web
如果没有出现
BUILD SUCCESS
字样,并提示如下界面:文章图片
image.png
在window-Preferences-Java-Installed JREs中,设置:
文章图片
image.png
文章图片
image.png
文章图片
image.png
勾选,保存,再一次运行maven install即可。
为了方便调试,载入log4j文件。
文章图片
image.png
/pyg-manager-web/src/main/resources/log4j.properties
### direct log messages to stdout ###
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n### direct messages to file mylog.log ###
log4j.appender.file=org.apache.log4j.FileAppender
log4j.appender.file.File=c:/mylog.log
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n### set log levels - for more verbose logging change 'info' to 'debug' ###log4j.rootLogger=debug, stdout
开启zookeeper。win+R键,输入cmd,再输入"
zkServer
"因为是第一次启动,并且在我们的pyg-manager-web配置了tomcat插件,使用通过如下操作启动该项目。
文章图片
image.png
【【大型项目-电商平台】1.0|【大型项目-电商平台】1.0 互联网以及电商行业分析、项目搭建及运行】未完待续。
原因:没有服务器。
推荐阅读
- 宽容谁
- 我要做大厨
- 增长黑客的海盗法则
- 画画吗()
- 2019-02-13——今天谈梦想()
- 远去的风筝
- 三十年后的广场舞大爷
- 叙述作文
- 20190302|20190302 复盘翻盘
- 学无止境,人生还很长