luodangjia
2024-11-25 86f2f7e0023bfc56b2c20f2c594dc6a935a41a9d
11.25
14个文件已修改
1个文件已删除
6个文件已添加
1054 ■■■■ 已修改文件
ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/domain/GoodsEvaluate.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/domain/Technician.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/dto/IndexConfigSetDto.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/factory/OrderFallbackFactory.java 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/feignClient/OrderClient.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/model/LoginUser.java 150 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/model/LoginUserApplet.java 57 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-auth/src/main/java/com/ruoyi/auth/service/SysLoginService.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-log/src/main/java/com/ruoyi/common/log/aspect/LogAspect.java 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-log/src/main/java/com/ruoyi/common/log/service/AsyncLogService.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/service/TokenService.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/utils/DictUtils.java 75 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-account/pom.xml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/AppUserController.java 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/filter/AuthFilter.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/service/TAppUserService.java 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/util/weChat/WeChatUtil.java 394 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/BannerController.java 44 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/GoodsCategoryController.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/SystemConfigController.java 37 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/TechnicianController.java 84 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/domain/GoodsEvaluate.java
@@ -10,6 +10,7 @@
import lombok.EqualsAndHashCode;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;
/**
@@ -39,10 +40,13 @@
    @ApiModelProperty(value = "用户id")
    @TableField("app_user_id")
    private Long appUserId;
    @ApiModelProperty(value = "订单id")
    @TableField("order_id")
    private Long orderId;
    @ApiModelProperty(value = "评分")
    @TableField("grade")
    private Integer grade;
    private BigDecimal grade;
    @ApiModelProperty(value = "评价内容")
    @TableField("comment")
ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/domain/Technician.java
@@ -7,6 +7,7 @@
import lombok.EqualsAndHashCode;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;
/**
@@ -69,6 +70,12 @@
    @ApiModelProperty(value = "添加时间")
    @TableField("create_time")
    private LocalDateTime createTime;
    @ApiModelProperty("服务次数")
    @TableField(exist = false)
    private Integer serveCount;
    @ApiModelProperty("平均分")
    @TableField(exist = false)
    private BigDecimal grade;
}
ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/dto/IndexConfigSetDto.java
New file
@@ -0,0 +1,23 @@
package com.ruoyi.other.api.dto;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@Data
public class IndexConfigSetDto {
    @ApiModelProperty("公司理念")
    private String companyWant;
    @ApiModelProperty("宣传图片1")
    private String pic1;
    @ApiModelProperty("跳转类型1 - 1无2外部链接3商品详情4秒杀商品详情5领卷中心")
    private Integer direct1;
    @ApiModelProperty("宣传图片2")
    private String pic2;
    @ApiModelProperty("跳转类型2 - 1无2外部链接3商品详情4秒杀商品详情5领卷中心")
    private String direct2;
    @ApiModelProperty("公司简介")
    private String companyInfo;
}
ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/factory/OrderFallbackFactory.java
New file
@@ -0,0 +1,39 @@
package com.ruoyi.other.api.factory;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.core.dto.ExchangeBackDto;
import com.ruoyi.common.core.dto.ExchangeDto;
import com.ruoyi.other.api.feignClient.OrderClient;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.cloud.openfeign.FallbackFactory;
import org.springframework.stereotype.Component;
import java.util.List;
/**
 * 充电订单服务降级处理
 *
 * @author ruoyi
 */
@Component
public class OrderFallbackFactory implements FallbackFactory<OrderClient>
{
    private static final Logger log = LoggerFactory.getLogger(OrderFallbackFactory.class);
    @Override
    public OrderClient create(Throwable cause) {
        log.error("商品订单调用失败:{}", cause.getMessage());
        return new OrderClient() {
            @Override
            public R getOrderIdsByTechId(Integer id) {
                return R.fail("根据技师id查订单ids失败:" + cause.getMessage());
            }
        };
    }
}
ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/feignClient/OrderClient.java
New file
@@ -0,0 +1,24 @@
package com.ruoyi.other.api.feignClient;
import com.ruoyi.common.core.constant.ServiceNameConstants;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.core.dto.ExchangeBackDto;
import com.ruoyi.common.core.dto.ExchangeDto;
import com.ruoyi.other.api.factory.OrderFallbackFactory;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.*;
import java.util.List;
/**
 * 后台订单服务
 * @author ruoyi
 */
@FeignClient(contextId = "OrderClient", value = ServiceNameConstants.ORDER_SERVICE, fallbackFactory = OrderFallbackFactory.class)
public interface OrderClient {
    @PostMapping(value = "/management/give/vip")
    public R<List<Long>> getOrderIdsByTechId(@RequestParam("id") Integer id);
}
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/model/LoginUser.java
New file
@@ -0,0 +1,150 @@
package com.ruoyi.system.api.model;
import java.io.Serializable;
import java.util.Set;
/**
 * 用户信息
 *
 * @author ruoyi
 */
public class LoginUser implements Serializable
{
    private static final long serialVersionUID = 1L;
    /**
     * 用户唯一标识
     */
    private String token;
    /**
     * 用户名id
     */
    private Long userid;
    /**
     * 用户名
     */
    private String username;
    /**
     * 登录时间
     */
    private Long loginTime;
    /**
     * 过期时间
     */
    private Long expireTime;
    /**
     * 登录IP地址
     */
    private String ipaddr;
    /**
     * 权限列表
     */
    private Set<String> permissions;
    /**
     * 角色列表
     */
    private Set<String> roles;
    /**
     * 用户信息
     */
    private SysUser sysUser;
    public String getToken()
    {
        return token;
    }
    public void setToken(String token)
    {
        this.token = token;
    }
    public Long getUserid()
    {
        return userid;
    }
    public void setUserid(Long userid)
    {
        this.userid = userid;
    }
    public String getUsername()
    {
        return username;
    }
    public void setUsername(String username)
    {
        this.username = username;
    }
    public Long getLoginTime()
    {
        return loginTime;
    }
    public void setLoginTime(Long loginTime)
    {
        this.loginTime = loginTime;
    }
    public Long getExpireTime()
    {
        return expireTime;
    }
    public void setExpireTime(Long expireTime)
    {
        this.expireTime = expireTime;
    }
    public String getIpaddr()
    {
        return ipaddr;
    }
    public void setIpaddr(String ipaddr)
    {
        this.ipaddr = ipaddr;
    }
    public Set<String> getPermissions()
    {
        return permissions;
    }
    public void setPermissions(Set<String> permissions)
    {
        this.permissions = permissions;
    }
    public Set<String> getRoles()
    {
        return roles;
    }
    public void setRoles(Set<String> roles)
    {
        this.roles = roles;
    }
    public SysUser getSysUser()
    {
        return sysUser;
    }
    public void setSysUser(SysUser sysUser)
    {
        this.sysUser = sysUser;
    }
}
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/model/LoginUserApplet.java
New file
@@ -0,0 +1,57 @@
package com.ruoyi.system.api.model;
import lombok.Data;
import java.io.Serializable;
/**
 * 用户信息 小程序登录使用
 *
 * @author 无关风月
 */
@Data
public class LoginUserApplet implements Serializable {
    private static final long serialVersionUID = 1L;
    /**
     * 用户唯一标识
     */
    private String token;
    /**
     * 用户姓名
     */
    private String name;
    /**
     * 用户名id
     */
    private Long userId;
    private String userIdStr;
    /**
     * 用户手机号
     */
    private String phone;
    /**
     * 登录时间
     */
    private Long loginTime;
    /**
     * 过期时间
     */
    private Long expireTime;
    /**
     * 登录IP地址
     */
    private String ipaddr;
    /**
     * 头像
     */
    private String avatar;
    /**
     * 地址
     */
    private String address;
}
ruoyi-auth/src/main/java/com/ruoyi/auth/service/SysLoginService.java
@@ -14,7 +14,6 @@
import com.ruoyi.common.core.utils.ip.IpUtils;
import com.ruoyi.common.redis.service.RedisService;
import com.ruoyi.common.security.utils.SecurityUtils;
import com.ruoyi.system.api.RemoteUserService;
import com.ruoyi.system.api.domain.SysUser;
import com.ruoyi.system.api.model.LoginUser;
ruoyi-common/ruoyi-common-log/src/main/java/com/ruoyi/common/log/aspect/LogAspect.java
@@ -4,6 +4,8 @@
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.ruoyi.system.api.model.SysOperLog;
import org.apache.commons.lang3.ArrayUtils;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
@@ -27,7 +29,7 @@
import com.ruoyi.common.log.filter.PropertyPreExcludeFilter;
import com.ruoyi.common.log.service.AsyncLogService;
import com.ruoyi.common.security.utils.SecurityUtils;
import com.ruoyi.system.api.domain.SysOperLog;
/**
 * 操作日志记录处理
ruoyi-common/ruoyi-common-log/src/main/java/com/ruoyi/common/log/service/AsyncLogService.java
@@ -1,11 +1,10 @@
package com.ruoyi.common.log.service;
import org.springframework.beans.factory.annotation.Autowired;
import com.ruoyi.system.api.model.SysOperLog;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
import com.ruoyi.common.core.constant.SecurityConstants;
import com.ruoyi.system.api.RemoteLogService;
import com.ruoyi.system.api.domain.SysOperLog;
import javax.annotation.Resource;
ruoyi-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/service/TokenService.java
@@ -6,6 +6,7 @@
import javax.servlet.http.HttpServletRequest;
import com.ruoyi.common.core.exception.user.UserAppletException;
import com.ruoyi.system.api.model.LoginUser;
import com.ruoyi.system.api.model.LoginUserApplet;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@@ -18,7 +19,6 @@
import com.ruoyi.common.core.utils.uuid.IdUtils;
import com.ruoyi.common.redis.service.RedisService;
import com.ruoyi.common.security.utils.SecurityUtils;
import com.ruoyi.system.api.model.LoginUser;
/**
 * token验证处理
ruoyi-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/utils/DictUtils.java
File was deleted
ruoyi-service/ruoyi-account/pom.xml
@@ -117,6 +117,10 @@
            <version>2.6</version>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
        </dependency>
    </dependencies>
    <build>
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/AppUserController.java
@@ -1,8 +1,20 @@
package com.ruoyi.account.controller;
import com.ruoyi.account.api.model.AppUser;
import com.ruoyi.account.service.AppUserService;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.security.service.TokenService;
import org.junit.Test;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import javax.annotation.Resource;
import java.util.List;
/**
 * <p>
@@ -15,6 +27,27 @@
@RestController
@RequestMapping("/app-user")
public class AppUserController {
    @Resource
    private TokenService tokenService;
    @Resource
    private AppUserService appUserService;
    @PostMapping("/index")
    @ApiOperation(value = "个人中心首页", tags = {"小程序-个人中心首页"})
    @Test
    public void index(){
        System.err.println("=-====");
//        Long userId = tokenService.getLoginUserApplet().getUserId();
     }
      public  void test(Long userId,Integer count){
          List<AppUser> list = appUserService.lambdaQuery().eq(AppUser::getInviteUserId, userId).list();
          count = count + list.size();
          for (AppUser appUser : list) {
              test(appUser.getId(),count);
          }
      }
}
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/filter/AuthFilter.java
@@ -2,11 +2,9 @@
import com.alibaba.fastjson.JSON;
import com.ruoyi.account.api.model.AppUser;
import com.ruoyi.account.service.IAppUserService;
import com.ruoyi.common.core.constant.TokenConstants;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.core.utils.StringUtils;
import com.ruoyi.system.api.domain.SysUser;
import org.apache.logging.log4j.core.config.Order;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/service/TAppUserService.java
New file
@@ -0,0 +1,44 @@
package com.ruoyi.account.service;
import com.baomidou.mybatisplus.extension.service.IService;
import java.util.Map;
/**
 * <p>
 *  服务类
 * </p>
 *
 * @author luodangjia
 * @since 2024-08-06
 */
public interface TAppUserService extends IService<TAppUser> {
    /**
     * 微信小程序登录用户封装
     * @param appletUserDecodeData
     * @return
     */
    Map<String, Object> wxLogin(AppletUserDecodeData appletUserDecodeData,Long inviteUserId);
    /**
     * 支付宝小程序登录用户封装
     * @param response
     * @return
     */
//    Map<String, Object> aliLogin(AlipaySystemOauthTokenResponse response, AlipayUserInfoShareResponse userInfo);
    Map<String, Object> aliLogin(AlipaySystemOauthTokenResponse response,String phone,Long inviteUserId);
    /**
     * 封装用户信息和token
     * @param appUser
     * @return
     */
    Map<String, Object> getUserInfo(TAppUser appUser);
    /**
     * 账号判断
     * @param status
     */
    public void throwInfo(Integer status);
}
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/util/weChat/WeChatUtil.java
@@ -1,203 +1,203 @@
package com.ruoyi.account.util.weChat;
import cn.hutool.http.HttpRequest;
import cn.hutool.http.HttpResponse;
import cn.hutool.http.HttpUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import java.util.HashMap;
import java.util.Map;
/**
 * 微信工具类
 */
@Slf4j
@Component
public class WeChatUtil {
    @Value("${wx.appletsAppid}")
    private String wxAppletsAppid;
    @Value("${wx.appletsAppSecret}")
    private String wxAppletsAppSecret;
    @Value("{wx.officialAccountAppSecret}")
    private String officialAccountAppSecret;
    @Value("${wx.appid}")
    private String webAppId;
    @Value("${wx.appSecret}")
    private String webAppSecret;
    /**
     * 小程序使用jscode获取openid
     * @param jscode
     * @return
     */
    public Map<String, Object> code2Session(String jscode) throws Exception{
        String url = "https://api.weixin.qq.com/sns/jscode2session?appid=" + wxAppletsAppid + "&secret=" + wxAppletsAppSecret
                + "&js_code=" + jscode + "&grant_type=authorization_code";
        HttpRequest get = HttpUtil.createGet(url);
        HttpResponse response = get.execute();
        int status = response.getStatus();
        if(200 != status){
            throw new RuntimeException(response.body());
        }
        JSONObject jsonObject = JSON.parseObject(response.body());
        int errcode = jsonObject.getIntValue("errcode");
        Map<String, Object> map = new HashMap<>();
        map.put("errcode", errcode);
        if(errcode == 0){//成功
            map.put("openid", jsonObject.getString("openid"));
            map.put("sessionKey", jsonObject.getString("session_key"));
            map.put("unionid", jsonObject.getString("unionid"));
            return map;
        }
        if(errcode == -1){//系统繁忙,此时请开发者稍候再试
            map.put("msg", jsonObject.getString("errmsg"));
            return map;
        }
        if(errcode == 40029){//code 无效
            map.put("msg", jsonObject.getString("errmsg"));
            return map;
        }
        if(errcode == 45011){//频率限制,每个用户每分钟100次
            map.put("msg", jsonObject.getString("errmsg"));
            return map;
        }
        return null;
    }
    /**
     * 获取微信小程序token
     * @return
     */
    public String getWxAppletsAccessToken() throws Exception{
        String url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + wxAppletsAppid + "&secret=" + wxAppletsAppSecret;
        HttpRequest get = HttpUtil.createGet(url);
        HttpResponse response = get.execute();
        if(response.getStatus() != 200){
            return "";
        }
        JSONObject jsonObject = JSON.parseObject(response.body());
        return jsonObject.getString("access_token");
    }
    /**
     * 网站应用登录
     * @param code
     * @return
     */
    public Map<String, String> webAccessToken(String code) throws Exception{
        String url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=" + webAppId + "&secret=" + webAppSecret + "&code=" + code + "&grant_type=authorization_code";
        HttpRequest get = HttpUtil.createGet(url);
        HttpResponse response = get.execute();
        if(response.getStatus() != 200){
            return null;
        }
        JSONObject jsonObject = JSON.parseObject(response.body());
        int errcode = jsonObject.getIntValue("errcode");
        Map<String, String> map = new HashMap<>();
        if(errcode == 0){//成功
            map.put("access_token", jsonObject.getString("access_token"));
            map.put("openid", jsonObject.getString("openid"));
            map.put("refresh_token", jsonObject.getString("refresh_token"));
            map.put("unionid", jsonObject.getString("unionid"));
            return map;
        }
        if(errcode == -1){//系统繁忙,此时请开发者稍候再试
            map.put("msg", jsonObject.getString("errmsg"));
            return map;
        }
        if(errcode == 40029){//code 无效
            map.put("msg", jsonObject.getString("errmsg"));
            return map;
        }
        if(errcode == 45011){//频率限制,每个用户每分钟100次
            map.put("msg", jsonObject.getString("errmsg"));
            return map;
        }
        return map;
    }
    /**
     * 获取微信个人信息
     * @param access_token
     * @param openid
     * @return
     */
    public Map<String, Object> getUserInfo(String access_token, String openid) throws Exception{
        String url = "https://api.weixin.qq.com/sns/userinfo?access_token=" + access_token + "&openid=" + openid;
        HttpRequest get = HttpUtil.createGet(url);
        HttpResponse response = get.execute();
        if(response.getStatus() != 200){
            return null;
        }
        JSONObject jsonObject = JSON.parseObject(response.body());
        int errcode = jsonObject.getIntValue("errcode");
        Map<String, Object> map = new HashMap<>();
        if(errcode == 0){//成功
            map.put("nickname", jsonObject.getString("nickname"));
            map.put("openid", jsonObject.getString("openid"));
            map.put("sex", jsonObject.getString("sex"));
            map.put("headimgurl", jsonObject.getString("headimgurl"));
            return map;
        }
        if(errcode == -1){//系统繁忙,此时请开发者稍候再试
            map.put("msg", jsonObject.getString("errmsg"));
            return map;
        }
        if(errcode == 40029){//code 无效
            map.put("msg", jsonObject.getString("errmsg"));
            return map;
        }
        if(errcode == 45011){//频率限制,每个用户每分钟100次
            map.put("msg", jsonObject.getString("errmsg"));
            return map;
        }
        return map;
    }
//package com.ruoyi.account.util.weChat;
//
//import cn.hutool.http.HttpRequest;
//import cn.hutool.http.HttpResponse;
//import cn.hutool.http.HttpUtil;
//import com.alibaba.fastjson.JSON;
//import com.alibaba.fastjson.JSONObject;
//import lombok.extern.slf4j.Slf4j;
//import org.springframework.beans.factory.annotation.Value;
//import org.springframework.stereotype.Component;
//import java.util.HashMap;
//import java.util.Map;
//
//    /**
//     * 获取小程序二维码
//     * @param page      跳转页 例如 pages/index/index
//     * @param scene     参数 a=1&b=2
// * 微信工具类
//     */
//    public InputStream getwxacodeunlimit(String page, String scene){
//        try {
//            String token = getWxAppletsAccessToken();
//            if(StringUtils.isEmpty(token)){
//                System.err.println("获取接口调用凭证失败");
//@Slf4j
//@Component
//public class WeChatUtil {
//
//    @Value("${wx.appletsAppid}")
//    private String wxAppletsAppid;
//
//    @Value("${wx.appletsAppSecret}")
//    private String wxAppletsAppSecret;
//
//    @Value("{wx.officialAccountAppSecret}")
//    private String officialAccountAppSecret;
//
//    @Value("${wx.appid}")
//    private String webAppId;
//
//    @Value("${wx.appSecret}")
//    private String webAppSecret;
//
//
//    /**
//     * 小程序使用jscode获取openid
//     * @param jscode
//     * @return
//     */
//    public Map<String, Object> code2Session(String jscode) throws Exception{
//        String url = "https://api.weixin.qq.com/sns/jscode2session?appid=" + wxAppletsAppid + "&secret=" + wxAppletsAppSecret
//                + "&js_code=" + jscode + "&grant_type=authorization_code";
//        HttpRequest get = HttpUtil.createGet(url);
//        HttpResponse response = get.execute();
//        int status = response.getStatus();
//        if(200 != status){
//            throw new RuntimeException(response.body());
//            }
//            String url = "https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token=" + token;
//            Map<String, Object> param = new HashMap<>();
//            param.put("scene", scene);
//            param.put("page", page);
//            HttpHeaders httpHeaders = new HttpHeaders();
//            MediaType type=MediaType.parseMediaType("application/json;charset=UTF-8");
//            httpHeaders.setContentType(type);
//            HttpEntity<Map<String, Object>> requestEntity = new HttpEntity<>(param, httpHeaders);
//            ResponseEntity<String> exchange = restTemplate.exchange(url, HttpMethod.POST, requestEntity, String.class, new Object[0]);
//            String body1 = exchange.getBody();
////            System.err.println(body1);
//            ResponseEntity<byte[]> entity  = restTemplate.exchange(url, HttpMethod.POST, requestEntity, byte[].class, new Object[0]);
//            byte[] body = entity.getBody();
////            System.err.println(Base64.encodeBase64String(body));
//            return new ByteArrayInputStream(body);
//        }catch (Exception e){
//            e.printStackTrace();
//        JSONObject jsonObject = JSON.parseObject(response.body());
//        int errcode = jsonObject.getIntValue("errcode");
//        Map<String, Object> map = new HashMap<>();
//        map.put("errcode", errcode);
//        if(errcode == 0){//成功
//            map.put("openid", jsonObject.getString("openid"));
//            map.put("sessionKey", jsonObject.getString("session_key"));
//            map.put("unionid", jsonObject.getString("unionid"));
//            return map;
//        }
//        if(errcode == -1){//系统繁忙,此时请开发者稍候再试
//            map.put("msg", jsonObject.getString("errmsg"));
//            return map;
//        }
//        if(errcode == 40029){//code 无效
//            map.put("msg", jsonObject.getString("errmsg"));
//            return map;
//        }
//        if(errcode == 45011){//频率限制,每个用户每分钟100次
//            map.put("msg", jsonObject.getString("errmsg"));
//            return map;
//        }
//        return null;
//    }
}
//
//
//    /**
//     * 获取微信小程序token
//     * @return
//     */
//    public String getWxAppletsAccessToken() throws Exception{
//        String url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + wxAppletsAppid + "&secret=" + wxAppletsAppSecret;
//        HttpRequest get = HttpUtil.createGet(url);
//        HttpResponse response = get.execute();
//        if(response.getStatus() != 200){
//            return "";
//        }
//        JSONObject jsonObject = JSON.parseObject(response.body());
//        return jsonObject.getString("access_token");
//    }
//
//
//    /**
//     * 网站应用登录
//     * @param code
//     * @return
//     */
//    public Map<String, String> webAccessToken(String code) throws Exception{
//        String url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=" + webAppId + "&secret=" + webAppSecret + "&code=" + code + "&grant_type=authorization_code";
//        HttpRequest get = HttpUtil.createGet(url);
//        HttpResponse response = get.execute();
//        if(response.getStatus() != 200){
//            return null;
//        }
//        JSONObject jsonObject = JSON.parseObject(response.body());
//        int errcode = jsonObject.getIntValue("errcode");
//        Map<String, String> map = new HashMap<>();
//        if(errcode == 0){//成功
//            map.put("access_token", jsonObject.getString("access_token"));
//            map.put("openid", jsonObject.getString("openid"));
//            map.put("refresh_token", jsonObject.getString("refresh_token"));
//            map.put("unionid", jsonObject.getString("unionid"));
//            return map;
//        }
//        if(errcode == -1){//系统繁忙,此时请开发者稍候再试
//            map.put("msg", jsonObject.getString("errmsg"));
//            return map;
//        }
//        if(errcode == 40029){//code 无效
//            map.put("msg", jsonObject.getString("errmsg"));
//            return map;
//        }
//        if(errcode == 45011){//频率限制,每个用户每分钟100次
//            map.put("msg", jsonObject.getString("errmsg"));
//            return map;
//        }
//        return map;
//    }
//
//
//    /**
//     * 获取微信个人信息
//     * @param access_token
//     * @param openid
//     * @return
//     */
//    public Map<String, Object> getUserInfo(String access_token, String openid) throws Exception{
//        String url = "https://api.weixin.qq.com/sns/userinfo?access_token=" + access_token + "&openid=" + openid;
//        HttpRequest get = HttpUtil.createGet(url);
//        HttpResponse response = get.execute();
//        if(response.getStatus() != 200){
//            return null;
//        }
//        JSONObject jsonObject = JSON.parseObject(response.body());
//        int errcode = jsonObject.getIntValue("errcode");
//        Map<String, Object> map = new HashMap<>();
//        if(errcode == 0){//成功
//            map.put("nickname", jsonObject.getString("nickname"));
//            map.put("openid", jsonObject.getString("openid"));
//            map.put("sex", jsonObject.getString("sex"));
//            map.put("headimgurl", jsonObject.getString("headimgurl"));
//            return map;
//        }
//        if(errcode == -1){//系统繁忙,此时请开发者稍候再试
//            map.put("msg", jsonObject.getString("errmsg"));
//            return map;
//        }
//        if(errcode == 40029){//code 无效
//            map.put("msg", jsonObject.getString("errmsg"));
//            return map;
//        }
//        if(errcode == 45011){//频率限制,每个用户每分钟100次
//            map.put("msg", jsonObject.getString("errmsg"));
//            return map;
//        }
//        return map;
//    }
//
//
//
//
////    /**
////     * 获取小程序二维码
////     * @param page      跳转页 例如 pages/index/index
////     * @param scene     参数 a=1&b=2
////     */
////    public InputStream getwxacodeunlimit(String page, String scene){
////        try {
////            String token = getWxAppletsAccessToken();
////            if(StringUtils.isEmpty(token)){
////                System.err.println("获取接口调用凭证失败");
////            }
////            String url = "https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token=" + token;
////            Map<String, Object> param = new HashMap<>();
////            param.put("scene", scene);
////            param.put("page", page);
////            HttpHeaders httpHeaders = new HttpHeaders();
////            MediaType type=MediaType.parseMediaType("application/json;charset=UTF-8");
////            httpHeaders.setContentType(type);
////            HttpEntity<Map<String, Object>> requestEntity = new HttpEntity<>(param, httpHeaders);
////            ResponseEntity<String> exchange = restTemplate.exchange(url, HttpMethod.POST, requestEntity, String.class, new Object[0]);
////            String body1 = exchange.getBody();
//////            System.err.println(body1);
////            ResponseEntity<byte[]> entity  = restTemplate.exchange(url, HttpMethod.POST, requestEntity, byte[].class, new Object[0]);
////            byte[] body = entity.getBody();
//////            System.err.println(Base64.encodeBase64String(body));
////            return new ByteArrayInputStream(body);
////        }catch (Exception e){
////            e.printStackTrace();
////        }
////        return null;
////    }
//}
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/BannerController.java
@@ -1,6 +1,7 @@
package com.ruoyi.other.controller;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.core.utils.StringUtils;
import com.ruoyi.other.api.domain.Banner;
@@ -8,10 +9,7 @@
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.apache.ibatis.annotations.Param;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import java.util.List;
@@ -30,8 +28,8 @@
public class BannerController {
    @Resource
    private BannerService bannerService;
    @GetMapping("/list")
    @ApiOperation(value = "列表", tags = {"小程序-banner"})
    @PostMapping("/index/list")
    @ApiOperation(value = "banner列表", tags = {"小程序-首页"})
    public R<List<Banner>> list(String name, Integer jumpType, Integer position){
        List<Banner> list = bannerService.lambdaQuery().like(StringUtils.isNotEmpty(name), Banner::getName, name)
                .eq(Banner::getJumpType, jumpType)
@@ -39,6 +37,40 @@
                .list();
        return R.ok(list);
    }
    @PostMapping("/add")
    @ApiOperation(value = "添加", tags = {"后台-广告管理-banner管理"})
    public R add(@RequestBody Banner banner){
            bannerService.save(banner);
            return R.ok();
      }
      @PostMapping("/delete")
    @ApiOperation(value = "删除", tags = {"后台-广告管理-banner管理"})
    public R delete(@RequestParam Integer id){
            bannerService.removeById(id);
            return R.ok();
      }
      @PostMapping("/edit")
    @ApiOperation(value = "修改", tags = {"后台-广告管理-banner管理"})
    public R edit(@RequestBody Banner banner){
            bannerService.updateById(banner);
            return R.ok();
      }
      @PostMapping("/detail")
    @ApiOperation(value = "详情", tags = {"后台-广告管理-banner管理"})
    public R detail(@RequestParam Integer id){
          Banner byId = bannerService.getById(id);
          return R.ok(byId);
      }
      @PostMapping("/page/list")
    @ApiOperation(value = "列表", tags = {"后台-广告管理--banner"})
    public R<Page<Banner>> pagelist(String name, Integer jumpType, Integer position,Integer pageNum,Integer pageSize){
          Page<Banner> page = bannerService.lambdaQuery().like(StringUtils.isNotEmpty(name), Banner::getName, name)
                  .eq(Banner::getJumpType, jumpType)
                  .eq(Banner::getPosition, position)
                  .page(Page.of(pageNum, pageSize));
          return R.ok(page);
    }
}
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/GoodsCategoryController.java
@@ -1,10 +1,16 @@
package com.ruoyi.other.controller;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.other.api.domain.GoodsCategory;
import com.ruoyi.other.service.GoodsCategoryService;
import io.swagger.annotations.ApiOperation;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import java.util.List;
/**
 * <p>
@@ -17,7 +23,18 @@
@RestController
@RequestMapping("/goods-category")
public class GoodsCategoryController {
    @Resource
    private GoodsCategoryService goodsCategoryService;
    @PostMapping("/index/list")
    @ApiOperation(value = "商品分类", tags = {"小程序-首页"})
    public R<List<GoodsCategory>> list(){
        List<GoodsCategory> list = goodsCategoryService.lambdaQuery()
                .orderByDesc(GoodsCategory::getCreateTime)
                .last("limit 8")
                .list()
                ;
        return R.ok(list);
    }
}
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/SystemConfigController.java
@@ -1,16 +1,17 @@
package com.ruoyi.other.controller;
import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONObject;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.other.api.domain.SystemConfig;
import com.ruoyi.other.api.dto.IndexConfigSetDto;
import com.ruoyi.other.service.SystemConfigService;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import io.swagger.annotations.Api;
import org.springframework.web.bind.annotation.*;
import io.swagger.annotations.ApiOperation;
import javax.annotation.Resource;
import java.util.List;
/**
 * <p>
@@ -25,11 +26,29 @@
public class SystemConfigController {
    @Resource
    private SystemConfigService systemConfigService;
    @GetMapping("/byType")
    @ApiOperation(value = "1=启动页管理,2=首页配置,3=订单包邮设置", tags = {"小程序-启动页面","小程序-首页","订单包邮配置"})
    public R<SystemConfig> byType(Integer type){
        SystemConfig one = systemConfigService.lambdaQuery().eq(SystemConfig::getType, type).last("limit 1").one();
        return R.ok(one);
    @PostMapping("/index/add")
    @ApiOperation(value = "添加", tags = {"后台-广告管理-首页配置"})
    public R add(@RequestBody IndexConfigSetDto indexConfigSetDto){
        //先删除type=2的数据
        List<SystemConfig> list = systemConfigService.lambdaQuery().eq(SystemConfig::getType, 2).list();
        systemConfigService.removeBatchByIds(list);
        SystemConfig  systemConfig = new SystemConfig();
        systemConfig.setType(2);
        systemConfig.setContent(JSON.toJSONString(indexConfigSetDto));
        systemConfigService.save(systemConfig);
        return R.ok();
    }
    @PostMapping("/index/detail")
    @ApiOperation(value = "宣传图片-公司简介", tags = {"后台-广告管理-首页配置","小程序-首页"})
    public R<IndexConfigSetDto> detail(){
        SystemConfig one = systemConfigService.lambdaQuery().eq(SystemConfig::getType, 2).one();
        if (one==null){
            return R.ok();
        }
        IndexConfigSetDto indexConfigSetDto = JSONObject.parseObject(one.getContent(), IndexConfigSetDto.class);
        return R.ok(indexConfigSetDto);
    }
}
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/TechnicianController.java
@@ -1,9 +1,23 @@
package com.ruoyi.other.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.security.service.TokenService;
import com.ruoyi.other.api.domain.GoodsEvaluate;
import com.ruoyi.other.api.domain.Technician;
import com.ruoyi.other.api.domain.TechnicianSubscribe;
import com.ruoyi.other.api.feignClient.OrderClient;
import com.ruoyi.other.service.GoodsEvaluateService;
import com.ruoyi.other.service.TechnicianService;
import com.ruoyi.other.service.TechnicianSubscribeService;
import io.swagger.annotations.ApiOperation;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.List;
/**
 * <p>
@@ -16,6 +30,72 @@
@RestController
@RequestMapping("/technician")
public class TechnicianController {
    @Resource
    private TechnicianService technicianService;
    @Resource
    private GoodsEvaluateService goodsEvaluateService;
    @Resource
    private OrderClient orderClient;
    @Resource
    private TechnicianSubscribeService technicianSubscribeService;
    @Resource
    private TokenService tokenService;
        @PostMapping("/shop/list")
    @ApiOperation(value = "获取门店的技师列表", tags = {"小程序-门店详情-技师预约"})
    public R<Page<Technician>> shoplist(@RequestParam Integer shopId,@RequestParam Integer pageNum,@RequestParam Integer pageSize){
            //查出技师列表
            Page<Technician> page = technicianService.lambdaQuery().eq(Technician::getShopId, shopId).eq(Technician::getStatus, 2).page(Page.of(pageNum, pageSize));
            for (Technician technician : page.getRecords()) {
            //查出技师订单
                R<List<Long>> orderIdsByTechId = orderClient.getOrderIdsByTechId(technician.getId());
                if (orderIdsByTechId.getData().isEmpty()){
                    technician.setGrade(new BigDecimal(0));
                    technician.setServeCount(0);
                    continue;
                }
                //查出技师评价
                List<GoodsEvaluate> list = goodsEvaluateService.lambdaQuery().in(GoodsEvaluate::getOrderId, orderIdsByTechId.getData()).list();
                //算出平均分并保留一位小数
                BigDecimal avg = list.stream().map(GoodsEvaluate::getGrade).reduce(BigDecimal.ZERO, BigDecimal::add).divide(new BigDecimal(list.size()), 1, BigDecimal.ROUND_HALF_UP);
                technician.setGrade(avg);
                technician.setServeCount(orderIdsByTechId.getData().size());
                 }
            return R.ok(page);
        }
                @PostMapping("/shop/detail")
                @ApiOperation(value = "获取门店的技师详情", tags = {"小程序-门店详情-技师预约"})
                public R<Technician> shopdetail(@RequestParam Integer techId){
                //查出技师列表
                   Technician technician = technicianService.getById(techId);
                 //查出技师订单
                R<List<Long>> orderIdsByTechId = orderClient.getOrderIdsByTechId(technician.getId());
                if (orderIdsByTechId.getData().isEmpty()){
                    technician.setGrade(new BigDecimal(0));
                    technician.setServeCount(0);
                    return R.ok(technician);
                }
                //查出技师评价
                List<GoodsEvaluate> list = goodsEvaluateService.lambdaQuery().in(GoodsEvaluate::getOrderId, orderIdsByTechId.getData()).list();
                //算出平均分并保留一位小数
                BigDecimal avg = list.stream().map(GoodsEvaluate::getGrade).reduce(BigDecimal.ZERO, BigDecimal::add).divide(new BigDecimal(list.size()), 1, BigDecimal.ROUND_HALF_UP);
                technician.setGrade(avg);
                technician.setServeCount(orderIdsByTechId.getData().size());
                    return R.ok(technician);
                 }
           @PostMapping("/shop/tech")
          @ApiOperation(value = "预约操作", tags = {"小程序-门店详情-技师预约"})
          public R<Technician> shoptech(@RequestBody TechnicianSubscribe subscribe){
               Long userId = tokenService.getLoginUserApplet().getUserId();
                subscribe.setAppUserId(userId);
                technicianSubscribeService.save(subscribe);
                return R.ok();
           }
}