感悟:
认真撸了一遍,总算体会到了已经工作那些朋友说的,后端大部分就是写写接口的感觉了。
前端还是写好的模板,自己稍微改了一点接口的变量名。
前端(React)APP连接
链接:https://pan.baidu.com/s/1KD7WENDn-52NPpMTTFQy7g
提取码:xsdv
后端(SSM)连接
https://github.com/xiguanlezz/Comment
一、前端启动(已安装nodejs)
1、CD到对应的前端目录
2、webpack.config.js
里面配置数据接口地址
devServer: {
proxy: {
'/api': {
//改为自己的数据接口地址
target: 'https://localhost:8443/Comment',
secure: false
}
},
contentBase: "./public",
colors: true,
historyApiFallback: true,
inline: true,
hot: true // 热加载
}
3、开启代理,看到下图直接回车
start /b npm run mock
4、运行
npm start
已对接后台。
二、踩坑汇总
1、数据库相关
新建实体类的时候想试一下驼峰命名法,结果在mybatis配置文件中没有开启。。。裂开。<setting name="mapUnderscoreToCamelCase" value="true"/>
。在MyBatis的配置文件中开启驼峰命名法,这个只和默认的映射规则有关,和自定义封装规则没有半毛钱关系。具体MyBatis的底层原理不清楚,有空要去补补,不过列名映射实体类成员变量名底层好像用了SQL的as。
MyBatis模糊查询参数和两个百分号之间要有空格,否则是查不出来的。
不用修改任何配置,默认情况下MyBatis只要将SimpleDateFormat后的字符串传到POJO或者作为参数传入,就可以存入数据库时(datetime)就精确到秒。
SQL的update语句不能更新子查询出来的数据。
SQL查询语句中不能使用列的别名作为WHERE的条件。
SQL更新语句不写WHERE的话默认是全表更新。
MySQL的set语句是有顺序的,每次都是按照上半句结果来的。SQLServer是没有顺序的。然而MyBatis底层有点像SQLServer。。。
2、Servlet部分
后台写接口返回对象的时候报错。springmvc无法将对象直接转换为json对象,需要导入jar包以及配置Message对象转换器。
jsp默认会忽略el表达式,EL表达式取不出SpringMVC中隐含模型中的值,jsp头上加上isELIgnored="false"
。
SMM整合后,测试类的编写:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:/spring/spring-config.xml")
public class TestSSM {
@Autowired
private AdvertisementService advertisementService;
@Test
public void test01() {
Advertisement advertisement = advertisementService.QueryById(1);
System.out.println(advertisement);
}
}
百度出来SpringMVC和Spring是两个容器,Sping是父容器,SpringMVC是子容器。因此在Spring容器中加载的properties文件,在控制器里面用value注解会取不到值,需要在SpringMVC配置文件中重新声明配置文件。
Fuck,给表单埋隐藏域,Debug转换方法过滤器的源码才发现,_method只能设置DELETE、PUT、PATCH(局部更新)
,想变成get方法,直接改form的属性就好了,不用绕一圈。
Rest风格遇上文件上传,必须再配置一个过滤器。而且在tomcat7以上的版本,还需要在jsp页面上加上isErrorPage="true"
。
<!-- 必须在hiddenHttpMethodFilter之前提前解析出带文件的上传域-->
<filter>
<filter-name>MultipartFilter</filter-name>
<filter-class>org.springframework.web.multipart.support.MultipartFilter</filter-class>
<init-param>
<param-name>multipartResolverBeanName</param-name>
<param-value>multipartResolver</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>MultipartFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter>
<filter-name>hiddenHttpMethodFilter</filter-name>
<filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>hiddenHttpMethodFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
简单的ajax登录校验直接用原生的写好了,记得指定dataType为text,且用了ResponseBody注解在get请求的时候,返回给前端的中文会出现乱码。如果是复杂的用注解,指定dataType为json,并且在SpringMVC的配置文件中加上以下配置:
<mvc:annotation-driven>
<mvc:message-converters>
<bean class="org.springframework.http.converter.StringHttpMessageConverter">
<property name="supportedMediaTypes">
<list>
<value>application/json;charset=UTF-8</value>
</list>
</property>
</bean>
<bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"></bean>
</mvc:message-converters>
</mvc:annotation-driven>
JSTL语法不支持超过两层的级联属性,就是不可以用两次 . 来取值。而且forEach标签的items属性取得时候要加上"${}"。
SpringMVC的@RequestMapping注解不写的话,默认GET、POST都支持,并且会根据前端方式自动适应。
写拦截器的时候,没放行ajax。。。难怪APP出不来数据,ajax请求也被拦截了。。。配置文件放行ajax即可。
3、其他
jquery菜单列表拼接的时候,需要给参数带上引号,如果参数时数字可以省略。
网上资源有防盗链机制,请求该网上图片的时候必须请求头里带上诸如本站标志的东西才能成功响应,否则就是403错误。之前找bug的时候,本来还以为是访问某网站用的是http的请求,但却访问了https的资源,硬是将localhost请求改成了https,虽然浏览器上没有可用的证书。变为https的方法就是tomcat中server.xml中添加,tomcat.keystore是jdk自己生成的,具体可以百度。
<Connector port="8443" protocol="org.apache.coyote.http11.Http11Protocol"
maxThreads="150" SSLEnabled="true" scheme="https" secure="true"
keystoreFile="E:\apache-tomcat_key\tomcat.keystore" keystorePass="123456"
clientAuth="false" sslProtocol="TLS" />
这顿骚操作当然是失败了,问题的根源是防盗链啊!head标签加上<meta name="referrer" content="no-referrer" />
解决了。。。
三、设计
1、数据库表设计
2、功能明细(CRUD不说了)
具体后台订单统计界面用echarts以折线图的形式可视化上一天的数据。其实可以新建一张表去维护这写数据,每天定时刷新,懒得了。
SpringTask定时更新商户的评分以及已售数量,数据库要好好补补,一条语句一想就是一下午。。。
自定义了一个分页拦截器,只要dao层函数以ByPage结尾都可以分页。而且将分页标签封装了。
管理员密码通过MD5加密存入数据库。
接下来打算先学WebRTC,然后学SpringBoot。SpringBoot+WebRTC搭个可以视频互动的网页。