NEU 校园信息发布平台
功能描述:
信息发布平台,设置角色权限(官方账号,社团账号,个人账号),按照发布时间排序,可以通过类别筛选,类别有(官方,社团,失物招领,二手交易,表白墙,(可以设置匿名),其他)六个类别。
2天完成,5.5—5.7
目前需要解决:
- 第一版第一张图(孙做)
- 微信获取用户登录消息(微信登录),获取用户信息(谢做)(绑定学号待定)
- 找图标(谢做)
- 数据库(韬韬)
- 后台(生做)
- 和孙联调,传json(我和韬韬)ajax,from
git
-
先pull再push
-
有冲突先解决冲突
三张表,用户表(user)、消息表(information)、类型消息关联表(type_info)。用户表和消息表一对多关联,类型消息关联表和消息表一对多关联。具体数据库中属性和表设计图在数据库设计文件夹中。
新增behavior表记录用户行为,info_fav_read中间表用于记录用户与消息之间的收藏查看关系,更新用户表中头像链接字段和性别字段,更新数据库设计文件夹中属性和表设计图。
使用SSM框架
前后台交互举例
增删改查使用Restful风格
url | Method | Type |
---|---|---|
/user | RequestMethod.POST | 增加 |
/user/{id} | RequestMethod.GET | 查询 |
/user/{id} | RequestMethod.DELETE | 删除 |
/user | RequestMethod.PUT | 更新 |
url | Method | Type |
---|---|---|
/typeInfo | RequestMethod.POST | 增加 |
/typeInfo/{id} | RequestMethod.GET | 查询 |
/typeInfo/{id} | RequestMethod.DELETE | 删除 |
/typeInfo | RequestMethod.PUT | 更新 |
url | Method | Type |
---|---|---|
/information | RequestMethod.POST | 增加 |
/information/{id} | RequestMethod.GET | 查询 |
/information/{id} | RequestMethod.DELETE | 删除 |
/information | RequestMethod.PUT | 更新 |
https://github.com/abel533/Mapper
分页:
物理分页(就是直接通过SQL进行在数据库中直接分页,得到的数据就是我们想要分页之后的数据)
拦截器:
拦截器在流行的开源框架中很常见,其依赖的技术就是Java的动态代理。
- 业务组件:被代理和被拦截的对象
- 代理处理器:实现了InvocationHandler接口的一个对象
- 代理对象:Proxy对象
- 拦截器:普通的JavaBean,在调用业务方法之前或者之后自动拦截并执行自己的一些方法
- 客户端:执行业务处理的入口
实践:通过pageHelper实现分页
1. pom.xml添加依赖
<!--分页插件-->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>5.1.2</version>
</dependency>
2. 配置spring-mybatis.xml文件
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<!-- 自动扫描mapping.xml文件 -->
<!--<property name="mapperLocations" value="classpath:mapping/*.xml"></property>-->
<property name="configLocation" value="classpath:sqlMapConfig.xml"/>
<property name="plugins">
<array>
<!-- 分页拦截器 -->
<bean class="com.github.pagehelper.PageInterceptor">
<!-- 这里的几个配置主要演示如何使用,如果不理解,一定要去掉下面的配置 -->
<property name="properties">
<value>
helperDialect=mysql
reasonable=true
supportMethodsArguments=true
params=count=countSql
autoRuntimeDialect=true
</value>
</property>
</bean>
<!-- 打印日志拦截器 -->
<bean class="com.sun.interceptor.MybatisInterceptor"></bean>
</array>
</property>
</bean>
3. 在想要分页的serviceImpl调用mapper的语句前加入分页
@Override
public List<User> getUsersByCondition(UserExample example,int pageNum,int pageSize) {
PageHelper.startPage(pageNum,pageSize);
return userMapper.selectByExample(example);
}
- 上传图片有两种方式:
(1)通过服务器,将文件上传到服务端,由服务端上传到七牛云
(2)通过前端js,将文件直接上传到七牛云
两种方式都可以完成上传,但是前者还需占用服务端的带宽来上传文件,然后再由服务端上传;而后者仅占用客户端的资源,这样可以减轻服务端的压力。
Qiniu-wxapp-SDK 为客户端 SDK,没有包含 token 生成实现,为了安全,token 建议通过网络从服务端获取,具体生成代码可以参考以下服务端 SDK 的文档。SDK Demo中暂时没有包含这部分。
知识补充:
身份验证
第一次用户登录,服务端生成一个token,然后将token保存到session中,并返回生成的token。客户端保存在cookie中
以后每次用户登录,会将用户的cookie中token一起提交,服务端检测时间是否超时和是否匹配。
调用wx.chooseImage()成功后,会返回选择的图片的地址
可以看到地址是在生成了一个临时文件
配置CNAME
待总结,出一篇博客
一些网址
https://portal.qiniu.com/certificate/ssl#cert
https://portal.qiniu.com/cdn/domain/create?ref=developer.qiniu.com
https://developer.qiniu.com/fusion/kb/1319/test-domain-access-restriction-rules
统计本小程序的男女比例
统计本小程序使用的人的城市
0 login(登录)、 1 brower (浏览)、2 search(搜索)、 3 collect (收藏){"user_id":"1111,"behavior":"{"type":1}"}
行为信息还需要加一个,用户登录记录一次,用户登离记录一次,记录用户停留时间
未使用Redis之前1907ms 使用Redis之后461ms
Q: mybaits缓存和redis缓存的区别
mybatis的缓存:分为一级缓存和二级缓存,一级缓存的作用范围为session,所以当session commit或close后,缓存就会被清空 ,二级缓存的作用范围为sqlsessionfactory,映射语句文件中的所有select语句都会被缓存,所有CRUD的操作都会刷新缓存,缓存会存储1024个对象,缓存容易造成脏毒数据,影响真实数据的准确性,实际开发业务中会放弃二级缓存。
redis的缓存:可控制的后端缓存服务,通常用来缓存后端数据,当程序第二次访问数据库的时候,命中redis,大大减少数据库的负担,减少访问数据库的链接时间,实际开发过程中都会采用这种缓存方式,达到访问速度和效率的解决方案。
Q: mybatis有二级缓存,为什么还要用redis,原因是什么?
Mybatis一级缓存作用域是session,session commit之后缓存就失效了
Mybatis二级缓存作用域是sessionfactory,该缓存是以namespace为单位的(也就是一个Mapper.xml文件),不同namespace下的操作互不影响。所有对数据表的改变操作都会刷新缓存。但是一般不要用二级缓存,例如在UserMapper.xml中有大多数针对user表的操作。但是在另一个XXXMapper.xml中,还有针对user单表的操作。这会导致user在两个命名空间下的数据不一致。如果在UserMapper.xml中做了刷新缓存的操作,在XXXMapper.xml中缓存仍然有效,如果有针对user的单表查询,使用缓存的结果可能会不正确,读到脏数据。
Redis比之一、二级缓存的好处很多,Redis可以搭建在其他服务器上,缓存容量可扩展。Redis可以灵活的使用在需要缓存的数据上,比如一些热点数据。
git status # 查看add的文件
git reset HEAD # 撤销add的所有文件
git reset HEAD XXX # 撤销add的XXX文件
-- 根据id查询消息信息和查看数收藏数
SELECT
i.id,
i.user_id,
i.type_id,
i.location,
i.topic,
i.is_anony,
i.activity_time,
i.contact_id,
i.phone_num,
i.content,
i.yn,
i.ts,
i.createDate,
i.deleteDate,
i.pic_url,
res.readNum,
res.favNum
FROM
information i
LEFT JOIN (
SELECT
t.info_id,
t.readNum,
r.favNum
FROM
(
SELECT
info_id,
count(*) AS readNum
FROM
info_fav_read
GROUP BY
info_id
) t
INNER JOIN (
SELECT
info_id,
count(*) AS favNum
FROM
info_fav_read
WHERE
is_fav = 1
GROUP BY
info_id
) r ON t.info_id = r.info_id
) res ON i.id = res.info_id
WHERE
i.id = '111313149'