commit
b0dc2aaea0
9 changed files with 259 additions and 36 deletions
@ -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 |
||||||
``` |
|
||||||
|
|
||||||
|
|
||||||
|
@ -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 { |
||||||
|
|
||||||
|
|
||||||
|
} |
@ -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= |
Loading…
Reference in new issue