一、文件夹说明
代码下载 地址:校园跑腿、校园脱单、代理、帮忙拿快递的微信小程序
- server 后端项目 - project: 项目 - CBD: 校园跑腿服务(校园CBD中心) - server-app: 小程序api- server-pc: 小程序后台管理- service-cgs-base-service: 项目mapper公共包
- web_pc: vue+elementUI: 后台管理页面
- wechat_app: 小程序
- service-admin: 后台管理的公共模块(定时任务,系统日志) - 后台系统用户- 登陆- 权限- 部门- 角色
- service-common: 系统一些公共类
- service-email: 邮件
- service-syslog: 系统日志
- service-wx-pay: 微信支付
二、有部分是自己造的轮子(需要找我要jar包)
- 根 pom.xml- 上传工具类
<dependency><groupId>cn.yj</groupId><artifactId>tools-upload</artifactId><version>1.0-SNAPSHOT</version></dependency>
启用方法: App启动累加上注解:@SpringBootApplication@Import(value ={InitUploadImportSelector.class})publicclassApp{publicstaticvoidmain(String[] args){SpringApplication.run(App.class, args);}}
支持 Minio和fasdfs 、本地方式上传,对应的配置文件:application-upload.yml``````############## mino分布式图片存储 ####################file:upload-type: MINIO # MINIO、LOCALlocal:path: /Users/yongjian/work/file/ # 本地上传文件到目录host: http://127.0.0.1:${server.port}/${server.servlet.context-path}/localFile # 资源访问前缀minio:end:point: http://thisforyou.cn:9004point1: http://thisforyou.cn:9004accessKey: minioadmin secretKey:123456bucket: cbd-dev ############## fastdfs 配置 ####################fastdfs:connect_timeout_in_seconds:60network_timeout_in_seconds:60charset: UTF-8http_tracker_http_port:80http_anti_steal_token:falsehttp_secret_key:123456tracker_servers: memoryoverflow.cn\:22122
- HTTP工具类<dependency><groupId>cn.yj.tools</groupId><artifactId>tools-http</artifactId><version>${http-utils}</version></dependency>
- Service 类的接口的参数非空校验包<dependency><groupId>cn.yj</groupId><artifactId>service-params-check</artifactId><version>${service-params-check}</version></dependency>
启用校验:启动累加上注解:@EnableCheckMethodParams@SpringBootApplication@EnableCheckMethodParamspublicclassApp{publicstaticvoidmain(String[] args){SpringApplication.run(App.class, args);}}
使用方式:有两个注解@CheckObjectValue(keyValue = @KeyValue(type = Map.class, name = {"articleNo"}))
,@Require
例如:@CheckObjectValue(keyValue =@KeyValue(type =Task.class, name ={"effectivTime","userCode","content","urgentState"}))@OverridepublicRpublish(TaskVo task){// ...}
KeyValue-type:当前接口的校验类,name:当前类的要校验非空的字段publicbooleanagreeComment(@RequireString commentNo,@RequireString userCode){// ....}
@Require 校验非空状态- 分页组件工具该主件事基于pageHelper的包装,不影响原有的pageHelper的使用<dependency><groupId>cn.yj</groupId><artifactId>annotation-pagehelper</artifactId><version>${annotation-pagehelper}</version></dependency>
1、在mapper接口上加上注解:@StartPage
例如:@StartPageList<ArticleVo>findList(@Param("map")Map<String,Object> map,@Param("page")Page<?extendsArticle> page);
mapper接口上必须要有入参:Page 对象。service上使用:@OverridepublicPage<ArticleVo>listPage(Map<String,Object> params,Page<ArticleVo> page){ baseMapper.findList(params, page);return page;}
2、也可以不使用注解的形式@OverridepublicPage<ArticleVo>listPage(Map<String,Object> params,Page<ArticleVo> page){ page.startPage(); page.setRows(baseMapper.findList(params, page));return page;}
该工具包事SpringBoot的starter自动配置包。引入即可使用。 - 部分基础异常类包装
<dependency><groupId>cn.yj</groupId><artifactId>tools-exception</artifactId><version>${tools-exception}</version></dependency>
- 部分公共基础工具
<dependency><groupId>cn.yj.tools</groupId><artifactId>tools-common-utils</artifactId><version>${tools-utils-v}</version></dependency>
- yml文件读取工具包
<dependency><groupId>cn.yj.tools</groupId><artifactId>tools-read-config</artifactId><version>${read-config}</version></dependency>
该工具类事主要提供静态方法读取 yaml,properties文件的工具。启用该工具:@SpringBootApplication@EnableReadConfig(classLoader =App.class)publicclassApp{publicstaticvoidmain(String[] args){SpringApplication.run(App.class, args);}}
工具类:/** * <br> * <p> * 该工具类 只做读取资源文件的功能操作。 基于SpringBoot使用 * <p> * <p> * <p> * 1、工具类加载会默认读取: * <p> * <p> * <p> * 开发环境:resources/config 目录下的资源文件 其次是 resources/ * jar包环境:jar包同级目录下的 config 资源文件每其次是 jar同级的资源文件,其次是 jar包内 config资源文件,其次是 jar包内的 资源文件。 * <p> * resources/config -> resources/ * jar=config --> jar/ --> jar内的resources/config --> jar包内的resources/ * <p> * <p> * 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包内的资源文件。 * <p> * 4、自定义资源文件加载: * 支持文件 yml 和 properties 两种后缀的文件。不支持 xml文件。自定义文件的加载顺序,在前面者优先加载。 * <p> * <p> * 5、关于相同文件名:如果存在相同的文件名(包含路径不同)后者不会被加载。 * <p> * 6、取值问题:取值的顺序是 先加载的文件,后取值。会先取后面加载的资源文件的先,如果存在相同的key 后面的文件优先。 * <p> * * 暂时不支持直接读取 map 和 list 的配置 * * * * 例如: * * user: * * lists: * * - 张三 * * - 李四 * * - 王五 * 但是可以自定义格式:lists:[张三,李四,王五] or lists:张三,李四,王五 * * map格式: map:{name:tom,age:18} // * * * <p> * <p> * <p> * 7、自定义加载文件问题:加载系统资源文件务必上上 `classpath:` * 例如:classpath: user.config * 加载系统资源文件: 例如:/Users/yongjian/work/shell/config.properties * * @author 永健 * @since 2020-09-17 13:46 */publicclassPropertiesUtilsextendsConfigRead{/** * 加载文件 * <p> * 系统路径写法:系统路径:/Users/yongjian/application.yml * 类路径:classpath:application.yml 或者 classpath:spring/application.yml * * @param path 文件路径 */privatestaticvoidload(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);}}}}/** * 获取属性值 * <p> * <p> * 加载顺序冲从上往下,读取顺序从下网上。 * application.yml * application-dev.yml * application-prod.yml * application-test.yml * config.yml * 自定义加载的文件 * * <p> * 获取顺序: 自定义加载的/config.yml/config.properties->prod/dev/test->application * 如果有重复的key,会优先于读取后面加载的文件key。 * * @param key key * @return 值 */publicstaticStringgetStringValue(String key,String defaultValue){Object value =getObjectValue(key);return value ==null? defaultValue :String.valueOf(value);}publicstaticStringgetStringValue(String key){Object value =getObjectValue(key);return value ==null?null:String.valueOf(value);}publicstaticintgetIntValue(String key,Integer defaultValue){Object value =getObjectValue(key);return value ==null? defaultValue :Integer.valueOf(value.toString());}publicstaticintgetIntValue(String key){Object value =getObjectValue(key);return value ==null?0:Integer.valueOf(value.toString());}publicstaticbooleangetBooleanValue(String key,boolean defaultValue){Object value =getObjectValue(key);return value ==null? defaultValue :Boolean.valueOf(value.toString());}publicstaticbooleangetBooleanValue(String key){Object value =getObjectValue(key);return value ==null?false:Boolean.valueOf(value.toString());}publicstatic<T>List<T>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<T>)Arrays.asList(split);}returnnull;}publicstaticMap<String,Object>getMap(String key){Object value =getObjectValue(key);String vl ="";if(value !=null){ vl = value.toString();returnchangeMap(vl);}returnnull;}privatestaticMap<String,Object>changeMap(String vl){Map<String,Object> map =null; vl = vl.replaceAll(" ","");if(vl.startsWith("{")&& vl.endsWith("}")){ vl = vl.replace("{","").replace("}","");String[] split = vl.split(","); map =newHashMap<>();for(String item : split){if(!item.contains(":")){thrownewRuntimeException("解析数据出错,请按照格式配置,例如:{name:tom,age:18}");}String[] keyValues = item.split(":");if(keyValues.length !=2||"".equals(keyValues[0])){thrownewRuntimeException("解析数据出错,请按照格式配置,例如:{name:tom,age:18}");} map.put(keyValues[0], keyValues[1]);}}return map;}}
- 微信小程序相关接口包装工具;小程序获取Token解密 获取获取用户信息等
<dependency><groupId>cn.yj.wechat</groupId><artifactId>wechat</artifactId><version>0.0.1</version></dependency>
三、 项目配置说明
好像没有多少事需要特别注意的。不懂的可以私我。
- 高德key需要替换成自己的
applications:geoKey: 085f5a65cd254be133e74cbd5ee160c0456
- 小程序需要替换成自己的
applications:wechat:mini:appId: wx53c2168b5ad5c0a525
secret: ded80da4f198338a061e1ae31480e1cc21
- 文件上传(自己封装的工具只实现了 本地图片上传和minio文件服务器上传,其它需要自己实现) - 提供了上传文件接口 FileUpload.java- 增加实现的话,需要重写
InitUploadImportSelector.java
的selectImports(AnnotationMetadata annotationMetadata)
方法,按需加载 。然后App启动类上替换成自己的@Import(value = {InitUploadImportSelector.class})
将InitUploadImportSelector
替换成自己的即可。- file.upload-type: 指定系统实例化上传实现
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图片的ipaccessKey: minioadmin
secretKey:123456
- 启动盲盒支付 - 在 service-wx-pay 模块中的配置文件 application-wxPay.yml。 wechat.pay.start:true 开启盲盒支付。默认不开启- 引用微信支付模块需 注册 PayAutoConfig.class
# 微信wechat:pay:start:trueappId: wx8944343 #小程序idmchId:12313123131#商户idmchSerialNo:11apiV3Key:1key-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 (没有修改权限)
小程序
- 小程序
代码下载 地址:校园跑腿、校园脱单、代理、帮忙拿快递的微信小程序
本文转载自: https://blog.csdn.net/weixin_42756970/article/details/128640470
版权归原作者 Python代码大全 所有, 如有侵权,请联系我们删除。
版权归原作者 Python代码大全 所有, 如有侵权,请联系我们删除。