Merge remote-tracking branch 'origin/master'

master
星期八 4 years ago
commit b0dc2aaea0
  1. 98
      README.md
  2. 7
      pom.xml
  3. 15
      src/main/java/com/lq/cms/web/sys/OssController.java
  4. 11
      src/main/java/com/lq/cms/web/sys/UserController.java
  5. 148
      src/main/java/com/lq/code/util/MinUtil.java
  6. 7
      src/main/profile/dev/file.properties
  7. 2
      src/main/profile/dev/jdbc.properties
  8. 4
      src/main/profile/dev/redis.properties
  9. 3
      src/main/resources/spring-mybatis-config.xml

@ -1,36 +1,72 @@
# ssm项目 # ssm项目
## ssm 介绍 ## ssm 介绍
```java
一个基于spring mvc+mybatis的框架。页面是采用aceAdmin+easyUI. ***一个基于spring mvc+mybatis的框架。页面是采用aceAdmin+easyUI.
使用shiro作为安全框架,做权限控制 使用shiro作为安全框架,做权限控制***
```
## ssm开发环境 ## ssm开发环境
```java
1. jdk 1.8 * jdk1.8
2. maven 3 * Maven 3
3. mysql 5.6 * Mysql 5.6
4. redis * tomcat 8
5. tomcat 8 * Redis
```
## 技术栈
| 技术 | git地址 | 说明 |
| -------------- | ------------------------------------------------- | :-------------------------------- |
| Spring | | |
| spring mvc | | |
| Apache Shiro | | 安全框架 |
| Mybatis-plus | https://gitee.com/baomidou/mybatis-plus | 数据持久层框架 |
| spring session | https://github.com/spring-projects/spring-session | 在集群环境下,解决session同步问题 |
| Minio | https://github.com/minio/minio-java | 文件服务系统 |
| hutool | https://gitee.com/loolly/hutool | 国产工具类 |
| jmockdata | https://github.com/jsonzou/jmockdata | 测试工具类 |
| Durid | https://github.com/alibaba/druid | 数据库连接池 |
| zxing | https://github.com/zxing/zxing | 二维码生成工具类 |
| jsoup | | 爬虫工具 |
## ssm 使用说明 ## ssm 使用说明
```java
1. 菜单目录采用设计模式中的容器模式,理论上是可以实现三级甚至四级的菜单目录(参考代码:com.lq.cms.mode.MenusComposite). + 菜单目录采用设计模式中的容器模式,理论上是可以实现三级甚至四级的菜单目录(参考代码:com.lq.cms.mode.MenusComposite).
2. 自定义一个mybatis的xml生成插件(CreateMapperFileUtil),配合BaseDao一起使用.基本实现单表的CURD操作功能
3. 自定义实体同步数据库表结构插件(com.lq.code.executor.processor.InstantiationTracingBeanPostProcessor) + 自定义一个mybatis的xml生成插件(CreateMapperFileUtil),配合BaseDao一起使用.基本实现单表的CURD操作功能
4. AdminBaseDao,AdminBaseServer,AdminBaseController.三层类结构的继承。可以实现简单模块基本管理功能。
5. 使用spring session整合redis实现在集群中session共享的效果 + 自定义实体同步数据库表结构插件(com.lq.code.executor.processor.InstantiationTracingBeanPostProcessor)
6. 微信公众号相关开发代码(com.lq.wechat),其中客服消息采用了建造者模式(com.lq.wechat.mode.template)。
``` + AdminBaseDao,AdminBaseServer,AdminBaseController.三层类结构的继承。可以实现简单模块基本管理功能。
## 三层架构理念:
```java + 使用spring session整合redis实现在集群中session共享的效果
1. 数据库表与mapping.xml一一对应。
2. dao层代码密度低,dao层代码尽量通用,以工具类形式使用。便于代码重用 + 微信公众号相关开发代码(com.lq.wechat),其中客服消息采用了建造者模式(com.lq.wechat.mode.template)。
3. service层代码密度高 通过组合复用原则使用dao层工具类,实现业务逻辑
4. controller层代码密度低 只负责简单的数据接受和转发。以及页面跳转的控制
``` ## 三层架构理念
- 数据库表与mapping.xml一一对应。
- dao层代码密度低,dao层代码尽量通用,以工具类形式使用。便于代码重用
- service层代码密度高 通过组合复用原则使用dao层工具类,实现业务逻辑
- controller层代码密度低 只负责简单的数据接受和转发。以及页面跳转的控制
## 示例 ## 示例
```java
1. 项目案例:http://106.12.122.216:8080/ssm/cms/ * www.000oo1.com/ssm/cms/
2. 默认账号/密码:admin/123 * 默认账号/密码:admin/123
```

@ -547,6 +547,13 @@
<scope>compile</scope> <scope>compile</scope>
</dependency> </dependency>
<!-- minio -->
<dependency>
<groupId>io.minio</groupId>
<artifactId>minio</artifactId>
<version>7.1.2</version>
</dependency>
</dependencies> </dependencies>

@ -0,0 +1,15 @@
package com.lq.cms.web.sys;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
/**
* oss 控制类
* @author qi
*/
@Controller
@RequestMapping("/sys/oss")
public class OssController {
}

@ -55,6 +55,9 @@ public class UserController {
@Autowired @Autowired
private SysUserRoleService sysUserRoleService; private SysUserRoleService sysUserRoleService;
@Autowired
private MinUtil minUtil;
@Value("${file.upload}") @Value("${file.upload}")
private String fileLoadPath; private String fileLoadPath;
@ -108,13 +111,19 @@ public class UserController {
@RequiresPermissions(INDEX_URL+ Constant.PERSSION_MARK+Constant.PERMISSION_UPDATE) @RequiresPermissions(INDEX_URL+ Constant.PERSSION_MARK+Constant.PERMISSION_UPDATE)
@ResponseBody @ResponseBody
@RequestMapping("/update") @RequestMapping("/update")
public Object update(SysUserVo vo,@RequestParam(value = "file",required = false) MultipartFile file){ public Object update(SysUserVo vo,@RequestParam(value = "file",required = false) MultipartFile file) throws IOException {
Date nowTime = new Date(); Date nowTime = new Date();
AjaxResult ajaxResult = new AjaxResult(); AjaxResult ajaxResult = new AjaxResult();
if (vo!=null&&vo.getId()!=null){ if (vo!=null&&vo.getId()!=null){
SysUser sysUser = sysUserService.findOne(vo.getId()); SysUser sysUser = sysUserService.findOne(vo.getId());
BeanUtil.copyNotNull(sysUser,vo); BeanUtil.copyNotNull(sysUser,vo);
sysUser.setUpdateTime(nowTime); sysUser.setUpdateTime(nowTime);
UUID uuid = UUID.randomUUID();
String fileType = FileUtil.fileFormat(file.getOriginalFilename());
String newFileName = "wechat/"+uuid.toString()+"."+fileType;
minUtil.uploadFile(newFileName,file.getInputStream());
String uploadFileName =upLoadFile(file); String uploadFileName =upLoadFile(file);
sysUser.setImgUrl(uploadFileName); sysUser.setImgUrl(uploadFileName);
sysUserService.update(sysUser); sysUserService.update(sysUser);

@ -0,0 +1,148 @@
package com.lq.code.util;
import io.minio.BucketExistsArgs;
import io.minio.MakeBucketArgs;
import io.minio.MinioClient;
import io.minio.PutObjectArgs;
import io.minio.errors.*;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
/**
* minio 客户端
* @author qi
*/
@Component
public class MinUtil {
/**
* minio服务地址
*/
@Value("minio.server.url")
private String serverUrl;
/**
* 存储桶名称
*/
@Value("minio.bucket.name")
private String bucketName;
/**
* minio账号
*/
@Value("minio.accesskey")
private String accessKey;
/**
* minio密码
*/
@Value("minio.secretkey")
private String secretKey;
/**
* 上传图片
* @param inputStream
* @return
*/
public String uploadFile(InputStream inputStream){
String fileName = "timg.jpeg";
//初始化客户端
MinioClient minioClient = MinioClient.builder()
.endpoint(serverUrl)
.credentials(accessKey,secretKey)
.build();
try {
int size = inputStream.available();
BucketExistsArgs bucketExistsArgs = BucketExistsArgs.builder().bucket(bucketName).build();
//判断桶是否存在
boolean isExist = minioClient.bucketExists(bucketExistsArgs);
if (!isExist){
minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucketName).build());
}
PutObjectArgs putObjectArgs = PutObjectArgs.builder().bucket(bucketName).object(fileName).stream(inputStream,size,-1).build();
minioClient.putObject(putObjectArgs);
} catch (ErrorResponseException e) {
e.printStackTrace();
} catch (InsufficientDataException e) {
e.printStackTrace();
} catch (InternalException e) {
e.printStackTrace();
} catch (InvalidBucketNameException e) {
e.printStackTrace();
} catch (InvalidKeyException e) {
e.printStackTrace();
} catch (InvalidResponseException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (ServerException e) {
e.printStackTrace();
} catch (XmlParserException e) {
e.printStackTrace();
} catch (RegionConflictException e) {
e.printStackTrace();
}
return fileName;
}
public static void main(String[] args) {
String fileName = "timg.jpeg";
//初始化客户端
MinioClient minioClient = MinioClient.builder()
.endpoint("http://192.168.31.19:9000")
.credentials("minioadmin","minioadmin")
.build();
try {
File file = new File("/Users/liangqi/Downloads/timg.jpeg");
InputStream inputStream = new FileInputStream(file);
if (file.exists()){
System.out.println("========文件存在=======");
}
BucketExistsArgs bucketExistsArgs = BucketExistsArgs.builder().bucket("ssm").build();
//判断桶是否存在
boolean isExist = minioClient.bucketExists(bucketExistsArgs);
if (!isExist){
minioClient.makeBucket(MakeBucketArgs.builder().bucket("ssm").build());
}
PutObjectArgs putObjectArgs = PutObjectArgs.builder().bucket("ssm").object(fileName).stream(inputStream,inputStream.available(),-1).build();
minioClient.putObject(putObjectArgs);
} catch (ErrorResponseException e) {
e.printStackTrace();
} catch (InsufficientDataException e) {
e.printStackTrace();
} catch (InternalException e) {
e.printStackTrace();
} catch (InvalidBucketNameException e) {
e.printStackTrace();
} catch (InvalidKeyException e) {
e.printStackTrace();
} catch (InvalidResponseException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (ServerException e) {
e.printStackTrace();
} catch (XmlParserException e) {
e.printStackTrace();
} catch (RegionConflictException e) {
e.printStackTrace();
}
System.out.println("===============文件上传成功!!");
}
}

@ -1 +1,6 @@
file.upload=/Users/qi/java/fileManger/ file.upload=/Users/liangqi/java/fileManger
minio.server.url=
minio.bucket.name=
minio.accesskey=
minio.secretkey=

@ -2,7 +2,7 @@
jdbc.driver=com.mysql.jdbc.Driver jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://192.168.31.111:3306/ssm?useUnicode=true&characterEncoding=UTF-8&characterSetResults=UTF-8 jdbc.url=jdbc:mysql://192.168.31.111:3306/ssm?useUnicode=true&characterEncoding=UTF-8&characterSetResults=UTF-8
jdbc.user=root jdbc.user=root
jdbc.password=mysql jdbc.password=liangqi@mysql
#--------数据库连接池配置 ------- #--------数据库连接池配置 -------
durid.pool.initialSize=5 durid.pool.initialSize=5
durid.pool.maxActive=5 durid.pool.maxActive=5

@ -1,6 +1,6 @@
redis.host=192.168.31.110 redis.host=192.168.31.111
redis.port=6379 redis.port=6379
redis.pass= redis.pass=liangqi@redis
redis.timeout=-1 redis.timeout=-1
redis.maxTotal=15 redis.maxTotal=15

@ -14,6 +14,9 @@
<context:component-scan base-package="com.lq.dao" /> <context:component-scan base-package="com.lq.dao" />
<context:component-scan base-package="com.lq.*.service" /> <context:component-scan base-package="com.lq.*.service" />
<context:component-scan base-package="com.lq.wechat.util"/> <context:component-scan base-package="com.lq.wechat.util"/>
<bean class="com.lq.code.util.MinUtil"/>
<context:property-placeholder location="classpath:jdbc.properties" ignore-unresolvable="true" /> <context:property-placeholder location="classpath:jdbc.properties" ignore-unresolvable="true" />
<!-- 扫描实体类,并创建表--> <!-- 扫描实体类,并创建表-->
<bean class="com.lq.code.executor.processor.InstantiationTracingBeanPostProcessor"> <bean class="com.lq.code.executor.processor.InstantiationTracingBeanPostProcessor">

Loading…
Cancel
Save