校园跑腿、校园脱单、代理、帮忙拿快递的微信小程序 基于SpringBoot、Mybatis-plus、mysql实现

news2024/12/23 14:29:25

一、文件夹说明

代码下载 地址:校园跑腿、校园脱单、代理、帮忙拿快递的微信小程序

  • 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})
        public class App {
        public static void main(String[] args) {
                SpringApplication.run(App.class, args);
           }
        }
      

      支持 Minio和fasdfs 、本地方式上传,对应的配置文件:application-upload.yml

         
       ##############  mino分布式图片存储 ####################
       file:
         upload-type: 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
           point1: http://thisforyou.cn:9004
         accessKey: minioadmin
         secretKey: 123456
         bucket: cbd-dev
       
       
       
       ##############  fastdfs 配置  ####################
       fastdfs:
         connect_timeout_in_seconds: 60
         network_timeout_in_seconds: 60
         charset: UTF-8
         http_tracker_http_port: 80
         http_anti_steal_token: false
         http_secret_key: 123456
         tracker_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
        @EnableCheckMethodParams
        public class App {
        public static void main(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"}))
          @Override
          public R publish(TaskVo task) {
                // ...
          }
      

      KeyValue-type:当前接口的校验类,name:当前类的要校验非空的字段

       public boolean agreeComment(@Require String commentNo, @Require String userCode) {
            // ....
       }
      

      @Require 校验非空状态

    • 分页组件工具

      该主件事基于pageHelper的包装,不影响原有的pageHelper的使用

      <dependency>
          <groupId>cn.yj</groupId>
          <artifactId>annotation-pagehelper</artifactId>
          <version>${annotation-pagehelper}</version>
      </dependency>
      

      1、在mapper接口上加上注解:@StartPage
      例如:

        @StartPage
        List<ArticleVo> findList(@Param("map") Map<String, Object> map, @Param("page") Page<? extends Article> page);
      

      mapper接口上必须要有入参:Page 对象。

      service上使用:

      @Override
      public Page<ArticleVo> listPage(Map<String, Object> params, Page<ArticleVo> page) {
          baseMapper.findList(params, page);
        return page;
      }
      

      2、也可以不使用注解的形式

      @Override
      public Page<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)
      public class App {
      public static void main(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
     */
    public class PropertiesUtils extends ConfigRead
    {
        /**
         * 加载文件
         * <p>
         * 系统路径写法:系统路径:/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);
                    }
                }
            }
        }
    
    
        /**
         * 获取属性值
         * <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 值
         */
        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 <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);
            }
            return null;
        }
    
        public static Map<String, Object> getMap(String key)
        {
            Object value = getObjectValue(key);
            String vl = "";
            if (value != null)
            {
                vl = value.toString();
                return changeMap(vl);
            }
            return null;
        }
    
        private static Map<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 = 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解密 获取获取用户信息等

    <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.javaselectImports(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图片的ip
      accessKey: minioadmin
      secretKey: 123456
  • 启动盲盒支付
    • 在 service-wx-pay 模块中的配置文件 application-wxPay.yml。 wechat.pay.start:true 开启盲盒支付。默认不开启
    • 引用微信支付模块需 注册 PayAutoConfig.class
  #  微信
  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 (没有修改权限)

在这里插入图片描述

小程序

  • 小程序

    在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

代码下载 地址:校园跑腿、校园脱单、代理、帮忙拿快递的微信小程序

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/154969.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

RK3399平台开发系列讲解(CPU篇)CPUFreq 中央处理器频率调节技术

🚀返回专栏总目录 文章目录 一、CPUFreq组成二、设备树配置沉淀、分享、成长,让自己和他人都能有所收获!😄 📢中央处理器频率调节(Central Processing Unit frequency,CPUFreq)技术可以降低ARM芯片的功耗,例如在系统对任务压力较小时,通过调整处理器工作频率与输入…

Javascript判断点是否在多边型内

射线法Ray-casting Algorithm算法检查点point是否在多边形里面。用法&#xff1a;insidePolygon([[x1,y1],[x2,y2],[x3,y3]...], [x , y])参数说明&#xff1a;polygon多边形坐标集合&#xff0c;格式为[[x1,y1],[x2,y2],[x3,y3]...]。point 测试点坐标, 格式为[x , y]。返回tr…

技术分享| 视频监控融合方案

视频监控系统在各行业应用广泛&#xff0c;从早期的只是简单的实现通过视频记录监控区域的情况&#xff0c;到现在的监控侦测、智能报警、融合通信等功能&#xff0c;视频监控的作用已经不是简单的记录&#xff0c;分布在各地的视频监控摄像头可以通过复杂的软件算法实现更多智…

数据分析的尽头不是可视化,而是行动!行动!行动!

Kyligence Zen 联动飞书&#xff0c;支持一键推送指标&#xff0c;在飞书就能追踪关键指标的最新动态&#xff1b;指标对齐目标&#xff0c;目标拆解为飞书任务&#xff0c;实现从指标洞察到行动的丝滑闭环&#xff01; 指标是衡量目标的量化参数&#xff0c;也是企业将战略目标…

PC端网页特效:轮播图

轮播图 功能需求&#xff1a; 鼠标经过轮播图模块&#xff0c;左右按钮显示&#xff0c;离开隐藏左右按钮。点击右侧按钮一次&#xff0c;图片往左播放一张&#xff0c; 左侧按钮同理。图片播放的同时&#xff0c;下面小圆圈模块跟随一起变化。点击小圆圈&#xff0c;可以播放…

2023年系统集成项目管理工程师报考条件及时间安排

一、报考条件 二、考试时间安排 集成考试一年会考2次&#xff0c;上半年一次、下半年一次 考试内容&#xff1a; 三、考试知识点分布&#xff1a; 给出一点点中项备考攻略 中级我敢说是好考的&#xff0c;题目也不难&#xff0c;主要弄清楚47个过程的输入输出&#xff0c;还有…

Github每日精选(第87期):轻量级图表lightweight-charts

lightweight-charts TradingView 轻量级图表是最小和最快的金融 HTML5 图表之一。 如果您想在网页上将财务数据显示为交互式图表而不影响网页加载速度和性能&#xff0c;轻量级图表库是您的最佳选择。 如果您想用交互式图表替换静态图像图表&#xff0c;它是您的最佳选择。该…

2000亿补贴申请倒计时!维视智造院校实验室建设攻略来了(六)!

#千亿政策贴息助力院校设备升级#近期&#xff0c;关于高校教育信息化的利好政策密集出台。9月7日&#xff0c;国务院常务会议提出对高校、职业院校和实训基地等10大领域设备购置和更新改造新增贷款&#xff0c;实施阶段性鼓励政策&#xff0c;中央财政贴息2.5个百分点&#xff…

电脑重装系统后文件还能恢复吗?恢复文件的详细图文教程

电脑重装系统&#xff0c;简单来说就是重新安装电脑的操作系统。一般选择重新安装电脑的系统&#xff0c;无非是电脑蓝屏、系统运行速度慢、崩溃死机等问题。 很多人会有疑惑&#xff0c;电脑重装系统后文件还能恢复吗&#xff1f;重装系统会造成数据全部被清空的情况&#xf…

js性能优化小技巧(已更新)

1、if多条件判断如果if里面包含多个判断条件&#xff0c;可以把判断条件存到一个数组&#xff0c;然后在去这个数组中检索”输入的值“是否满足条件&#xff1b;function testIf(x) {// 冗余if (x a || x b || x c || x d) {console.log(x)}// 简洁if ([a, b, c, d].includ…

前端vue3+typescript搭建vite项目(初识vite+项目配置完善+屏幕适配)

一、文章引导 #mermaid-svg-zCCPryl8cvuE0QpI {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-zCCPryl8cvuE0QpI .error-icon{fill:#552222;}#mermaid-svg-zCCPryl8cvuE0QpI .error-text{fill:#552222;stroke:#55222…

MySQL (五)------多表查询练习

我们在开发中&#xff0c;根据不同的业务需求往往需要通过2张及以上的表中去查询需要的数据。所以我们有必要学习2张及以上的表的查询。其实不管是几张表的查询&#xff0c;都是有规律可循的。 1.1 准备数据 -- 部门表 CREATE TABLE dept (id INT PRIMARY KEY PRIMARY KEY, --…

Databend 开源周报 第 75 期

Databend 是一款强大的云数仓。专为弹性和高效设计。自由且开源。即刻体验云服务&#xff1a;https://app.databend.com 。 What’s New 探索 Databend 本周新进展&#xff0c;遇到更贴近你心意的 Databend 。 Features & Improvements ✨ Format 实现 JSON 输出格式 …

C++模板进阶(非类型模板参数 + 模板特化)

我们另一篇模板初阶介绍链接&#xff1a;http://t.csdn.cn/Ox8Dm 目录 一、非类型模板参数 1.1 非类型模板参数概念 1.2 模板类型的静态数组 二、模板特化 2.1 函数模板特化 2.2 类模板特化 2.2.1 类模板全特化 2.2.2 类模板半特化&#xff08;偏特化&#xff09; 2.2.…

Facebook运营主页需要注意的几个问题

Facebook运营主页需要注意的几个问题主页的权重和流量都是决定流量的关键因素&#xff0c;也就是我们常说的引流&#xff0c;而流量又是需要转化的&#xff0c;因为只有用户认可你&#xff0c;才会有更多的点击、收藏、分享和主页的链接。在社交媒体时代要想更好地推广品牌产品…

openssl 编译动态库 win11 vs2022

官网 openssl官网 安装perl activestate_perl_官网 需要下载cli_installer 下载后双击下载好的exe 一般就是下面这个执行文件 state-remote-installer.exe 需要按照提示在powershell中执行网页提示的命令。 安装nasm nasm官网 以管理员方式运行安装 并加入环境变量中…

《MySQL高级篇》十、数据库其他调优策略

文章目录1.数据库调优的措施1.1调优的目标1.2 如何定位调优问题1.3 调优的维度和步骤第1步&#xff1a;选择适合的DBMS第2步:优化表设计第3步:优化逻辑查询第4步:优化物理查询第5步:使用Redis或 Memcached 作为缓存第6步&#xff1a;库级优化2. 优化MySQL服务器2.1 优化服务器硬…

定时任务、cron表达式、springBoot整合定时任务和异步任务-59

一&#xff1a;定时任务 1.1 官网地址 http://www.quartz-scheduler.org/documentation/quartz-2.3.0/tutorials/crontrigger.html 1.2 cron表达式 Cron表达式是一个字符串&#xff0c;字符串以5或6个空格隔开&#xff0c;分为6或7个域&#xff0c;每一个域代表一个含义&am…

【Nacos】一文为你揭露它的强大

注&#xff1a;为什么要使用nacos作为注册中心呢&#xff1f;这样的好处在哪呢&#xff1f;一、 什么是nacosNacos 是 Dynamic Naming and Configuration Service 的首字母简称&#xff1b;一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。Nacos 致力于帮助您…

java 方法看这一篇文章就够了

第一章 方法概念 1实现特定功能的一段代码,可反复被调用计算机 — 模拟现实 — 通过软件控制硬件 比如豆浆机 — 里面的微控制器 — 控制豆浆机 右图面板上有很多种模式 每一种模式对应不同的搅拌次数、搅拌时间、烧水温度等… 这些硬件的动作都需要软件的控制 硬件的每一种模式…