page) {
page.startPage();
page.setRows(baseMapper.findList(params, page));
return page;
}
```
该工具包事SpringBoot的starter自动配置包。引入即可使用。
- 部分基础异常类包装
```xml
cn.yj
tools-exception
${tools-exception}
```
- 部分公共基础工具
```xml
cn.yj.tools
tools-common-utils
${tools-utils-v}
```
- yml文件读取工具包
```xml
cn.yj.tools
tools-read-config
${read-config}
```
该工具类事主要提供静态方法读取 yaml,properties文件的工具。启用该工具:
```java
@SpringBootApplication
@EnableReadConfig(classLoader = App.class)
public class App {
public static void main(String[] args) {
SpringApplication.run(App.class, args);
}
}
```
工具类:
```java
/**
*
*
* 该工具类 只做读取资源文件的功能操作。 基于SpringBoot使用
*
*
*
* 1、工具类加载会默认读取:
*
*
*
* 开发环境:resources/config 目录下的资源文件 其次是 resources/
* jar包环境:jar包同级目录下的 config 资源文件每其次是 jar同级的资源文件,其次是 jar包内 config资源文件,其次是 jar包内的 资源文件。
*
* resources/config -> resources/
* jar=config --> jar/ --> jar内的resources/config --> jar包内的resources/
*
*
* 1、默认优先加载 application.yml 资源文件 其次是yml文件。这一点与SpringBoot相似
* 2、文件加载顺序 非jar包环境 开发环境下:
* 优先读取 resources/config 资源目录下的 application.yml 和 config.yml/config.properties 文件,如果读取成功,就不会继续加载 resources 下的其他配置文件。
* 默认会加载 application application-dev/application-prod application-test 这三个。
* dev test prod 会取决于 application 文件下的 active配置:假如是 dev 就会加载对应的 application-dev 文件。
* config.yml优先于config.properties
* 3、jar包读取:
* 优先读取与jar包同级下的 config目录下的资源文件,其次是与jar包同级的资源文件 其次就是读取 jar包内的资源文件。
*
* 4、自定义资源文件加载:
* 支持文件 yml 和 properties 两种后缀的文件。不支持 xml文件。自定义文件的加载顺序,在前面者优先加载。
*
*
* 5、关于相同文件名:如果存在相同的文件名(包含路径不同)后者不会被加载。
*
* 6、取值问题:取值的顺序是 先加载的文件,后取值。会先取后面加载的资源文件的先,如果存在相同的key 后面的文件优先。
*
* * 暂时不支持直接读取 map 和 list 的配置
* *
* * 例如:
* * user:
* * lists:
* * - 张三
* * - 李四
* * - 王五
* 但是可以自定义格式:lists:[张三,李四,王五] or lists:张三,李四,王五
*
* map格式: map:{name:tom,age:18} //
* *
*
*
*
* 7、自定义加载文件问题:加载系统资源文件务必上上 `classpath:`
* 例如:classpath: user.config
* 加载系统资源文件: 例如:/Users/yongjian/work/shell/config.properties
*
* @author 永健
* @since 2020-09-17 13:46
*/
public class PropertiesUtils extends ConfigRead
{
/**
* 加载文件
*
* 系统路径写法:系统路径:/Users/yongjian/application.yml
* 类路径:classpath:application.yml 或者 classpath:spring/application.yml
*
* @param path 文件路径
*/
private static void load(String... path)
{
if (path != null && path.length != 0)
{
for (int i = 0; i < path.length; i++)
{
String filePath = path[i].trim();
if (filePath.length() > 0)
{
System.out.println("加载资源文件:"+filePath);
}
}
}
}
/**
* 获取属性值
*
*
* 加载顺序冲从上往下,读取顺序从下网上。
* application.yml
* application-dev.yml
* application-prod.yml
* application-test.yml
* config.yml
* 自定义加载的文件
*
*
* 获取顺序: 自定义加载的/config.yml/config.properties->prod/dev/test->application
* 如果有重复的key,会优先于读取后面加载的文件key。
*
* @param key key
* @return 值
*/
public static String getStringValue(String key, String defaultValue)
{
Object value = getObjectValue(key);
return value == null ? defaultValue : String.valueOf(value);
}
public static String getStringValue(String key)
{
Object value = getObjectValue(key);
return value == null ? null : String.valueOf(value);
}
public static int getIntValue(String key, Integer defaultValue)
{
Object value = getObjectValue(key);
return value == null ? defaultValue : Integer.valueOf(value.toString());
}
public static int getIntValue(String key)
{
Object value = getObjectValue(key);
return value == null ? 0 : Integer.valueOf(value.toString());
}
public static boolean getBooleanValue(String key, boolean defaultValue)
{
Object value = getObjectValue(key);
return value == null ? defaultValue : Boolean.valueOf(value.toString());
}
public static boolean getBooleanValue(String key)
{
Object value = getObjectValue(key);
return value == null ? false : Boolean.valueOf(value.toString());
}
public static List getList(String key)
{
Object value = getObjectValue(key);
String vl = "";
if (value != null)
{
vl = value.toString().replaceAll(" ", "");
vl = vl.replace("[", "").replace("]", "");
String[] split = vl.split(",");
return (List) Arrays.asList(split);
}
return null;
}
public static Map getMap(String key)
{
Object value = getObjectValue(key);
String vl = "";
if (value != null)
{
vl = value.toString();
return changeMap(vl);
}
return null;
}
private static Map changeMap(String vl)
{
Map map = null;
vl = vl.replaceAll(" ", "");
if (vl.startsWith("{") && vl.endsWith("}"))
{
vl = vl.replace("{", "").replace("}", "");
String[] split = vl.split(",");
map = new HashMap<>();
for (String item : split)
{
if (!item.contains(":"))
{
throw new RuntimeException("解析数据出错,请按照格式配置,例如:{name:tom,age:18}");
}
String[] keyValues = item.split(":");
if (keyValues.length != 2 || "".equals(keyValues[0]))
{
throw new RuntimeException("解析数据出错,请按照格式配置,例如:{name:tom,age:18}");
}
map.put(keyValues[0], keyValues[1]);
}
}
return map;
}
}
```
- 微信小程序相关接口包装工具;小程序获取Token解密 获取获取用户信息等
```xml
cn.yj.wechat
wechat
0.0.1
```
# 三、 项目配置说明
好像没有多少事需要特别注意的。不懂的可以私我。
- 高德key需要替换成自己的
```yaml
applications:
geoKey: 085f5a65cd254be133e74cbd5ee160c0456
```
- 小程序需要替换成自己的
```yaml
applications:
wechat:
mini:
appId: wx53c2168b5ad5c0a525
secret: ded80da4f198338a061e1ae31480e1cc21
```
- 文件上传(自己封装的工具只实现了 本地图片上传和minio文件服务器上传,其它需要自己实现)
- 提供了上传文件接口 FileUpload.java
- 增加实现的话,需要重写 `InitUploadImportSelector.java` 的 `selectImports(AnnotationMetadata annotationMetadata)` 方法,按需加载
。然后App启动类上替换成自己的
`@Import(value = {InitUploadImportSelector.class})` 将 `InitUploadImportSelector` 替换成自己的即可。
- file.upload-type: 指定系统实例化上传实现
```yaml
file:
upload-type: LOCAL # MINIO(minio服务器)、LOCAL(本地上传)
local:
path: /Users/yongjian/work/file/ # 本地上传文件到目录 文件默认要加上 /。否则文件无法映射
host: http://127.0.0.1:${server.port}/${server.servlet.context-path}/localFile # 资源访问前缀
minio:
end:
point: http://thisforyou.cn:9004 # 两个填写一致就行了。这个是上传文件ip。内网的时候可以填写不一致
point1: http://thisforyou.cn:9004 # 这个是外网访问minio图片的ip
accessKey: minioadmin
secretKey: 123456
```
- 启动盲盒支付
- 在 service-wx-pay 模块中的配置文件 application-wxPay.yml。 wechat.pay.start:true 开启盲盒支付。默认不开启
- 引用微信支付模块需 注册 PayAutoConfig.class
```yaml
# 微信
wechat:
pay:
start: true
appId: wx8944343 #小程序id
mchId: 12313123131 #商户id
mchSerialNo: 11
apiV3Key: 1
key-path: classpath:apiclient_key.pem
# 支付成功回调
pay-notice-url: https://aliyun.thisforyou.cn/api/pay/wxPayNotice
refund-notice-url: https://aliyun.thisforyou.cn/api/pay/wxRefundNotice
```
- 个人开发者在小程序授权的时候会失败,无法获取手机号(需要自行更改)
- 邮件配置(请查看application.email.yml)进行修改成自己的账号
# 四、项目演示地址:
请各位进入如后台的时候,不要删除必要数据,谢谢各位。
## 1、后台管理
- PC后台管理
第一次访问可能有点慢,访问地址: https://aliyun.thisforyou.cn/server-view/#/login
账号:test/123456 (没有修改权限)

## 扫码进入小程序
- 小程序
- 微信搜索:校园CBD中心
- 或扫码进入:

- 小程序截图:













# 五、推荐一个去抖音、火山、快手、微视的平台水印小程序
- 没有广告、清爽。 微信搜索:去抖视频水印工具

# 六、接入支付宝支付: 封装统一下单接口
- 微信扫码支付

- 微信JSAPI支付

- 支付宝手机网站支付

- 支付宝电脑网站支付

- 支付宝App支付
