diff --git a/ruoyi-admin/src/main/resources/application-druid.yml b/ruoyi-admin/src/main/resources/application-druid.yml index 324e59b..aa9a7af 100644 --- a/ruoyi-admin/src/main/resources/application-druid.yml +++ b/ruoyi-admin/src/main/resources/application-druid.yml @@ -58,6 +58,9 @@ spring: wall: config: multi-statement-allow: true +wechat: + appId: wxb74d6d2504dba5cf + secret: e9f0819eaafdaf8f7fe4f697f4af02f5 tenant: database: #mysql 用于连接数据库服务器以生成数据库,URL 不指定数据库 diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysUser.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysUser.java index 432ea56..6b38254 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysUser.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysUser.java @@ -47,6 +47,17 @@ public class SysUser extends BaseEntity @Excel(name = "手机号码") private String phonenumber; + /** 验证码 */ + private String code; + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + /** 用户性别 */ @Excel(name = "用户性别", readConverterExp = "0=男,1=女,2=未知") private String sex; diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/model/LoginUser.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/model/LoginUser.java index a1a6a92..e63eff4 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/model/LoginUser.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/model/LoginUser.java @@ -75,6 +75,24 @@ public class LoginUser implements UserDetails * 用户信息 */ private SysUser user; + /** + * + * 微信用户openId + */ + private String openid; + + + public String getOpenid() { + return openid; + } + + public void setOpenid(String openid) { + this.openid = openid; + } + + + + public Long getUserId() { diff --git a/ruoyi-crm/pom.xml b/ruoyi-crm/pom.xml index 00595f7..05783e3 100644 --- a/ruoyi-crm/pom.xml +++ b/ruoyi-crm/pom.xml @@ -14,6 +14,11 @@ + + org.springframework.boot + spring-boot-starter-data-redis + + com.ruoyi @@ -26,6 +31,10 @@ ruoyi-system 3.8.1 + + com.ruoyi + ruoyi-framework + org.projectlombok lombok diff --git a/ruoyi-crm/src/main/java/com/ruoyi/h5/controller/H5BusinessController.java b/ruoyi-crm/src/main/java/com/ruoyi/h5/controller/H5BusinessController.java new file mode 100644 index 0000000..a4500d6 --- /dev/null +++ b/ruoyi-crm/src/main/java/com/ruoyi/h5/controller/H5BusinessController.java @@ -0,0 +1,36 @@ +package com.ruoyi.h5.controller; + +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.page.TableDataInfo; +import com.ruoyi.crm.system.domain.Business; +import com.ruoyi.crm.system.service.IBusinessService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; +/** + * H5商机Controller + * + * @author ruoyi + * @date 2024-02-29 + */ +@RestController +@RequestMapping("/h5/business") +public class H5BusinessController extends BaseController { + + @Autowired + private IBusinessService businessService; + + /** + * 查询商机列表 + */ + @GetMapping("/list") + public TableDataInfo list(Business business) + { + startPage(); + List list = businessService.selectBusinessList(business); + return getDataTable(list); + } +} diff --git a/ruoyi-crm/src/main/java/com/ruoyi/h5/controller/H5CluesController.java b/ruoyi-crm/src/main/java/com/ruoyi/h5/controller/H5CluesController.java new file mode 100644 index 0000000..a5f2d01 --- /dev/null +++ b/ruoyi-crm/src/main/java/com/ruoyi/h5/controller/H5CluesController.java @@ -0,0 +1,74 @@ +package com.ruoyi.h5.controller; + +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.page.TableDataInfo; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.crm.domain.CrmCustomer; +import com.ruoyi.crm.domain.enums.CustomerFolder; +import com.ruoyi.crm.service.ICrmCustomerService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.UUID; + +/** + * 线索管理Controller + * + * @author devjd + * @date 2022-01-12 + */ +@RestController +@RequestMapping("/h5/clues") +public class H5CluesController extends BaseController{ + + @Autowired + private ICrmCustomerService cluesService; + + + + /** + * 查询我的线索列表 + */ + @GetMapping("/person-list") + public TableDataInfo personList(CrmCustomer crmCustomer) + { + startPage(); + crmCustomer.setStatus(CustomerFolder.CLUES.getCode()); + crmCustomer.setOwner(getUsername()); + List list = cluesService.selectCrmCustomerList(crmCustomer); + return getDataTable(list); + } + + /** + * 查询线索列表 + */ + @GetMapping("/list") + public TableDataInfo list(CrmCustomer crmCustomer) + { + startPage(); + crmCustomer.setStatus(CustomerFolder.CLUES.getCode()); + List list = cluesService.selectCrmCustomerList(crmCustomer); + return getDataTable(list); + } + + /** + * 新增线索 + */ + @Log(title = "线索", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@RequestBody CrmCustomer crmCustomer) + { + if (crmCustomer.getCode() == null){ + //uuid生成客户编号 + crmCustomer.setCode("zy_"+ UUID.randomUUID().toString().replace("-","").substring(0,12)); + } + crmCustomer.setStatus(CustomerFolder.CLUES.getCode()); + crmCustomer.setCreateBy(getUsername()); + crmCustomer.setOwner(getUsername()); + return toAjax(cluesService.insertCrmCustomer(crmCustomer)); + } +} diff --git a/ruoyi-crm/src/main/java/com/ruoyi/h5/controller/H5CustomerController.java b/ruoyi-crm/src/main/java/com/ruoyi/h5/controller/H5CustomerController.java new file mode 100644 index 0000000..dd27b02 --- /dev/null +++ b/ruoyi-crm/src/main/java/com/ruoyi/h5/controller/H5CustomerController.java @@ -0,0 +1,73 @@ +package com.ruoyi.h5.controller; + +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.page.TableDataInfo; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.crm.domain.CrmCustomer; +import com.ruoyi.crm.domain.enums.CustomerFolder; +import com.ruoyi.crm.service.ICrmCustomerService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.util.List; +import java.util.UUID; + +/** + * H5客户Controller + * + * @author ruoyi + * @date 2022-01-12 + */ +@RestController +@RequestMapping("/h5/customer") +public class H5CustomerController extends BaseController { + @Autowired + private ICrmCustomerService crmCustomerService; + /** + * 查询我的客户列表 + */ + @GetMapping("/person-list") + public TableDataInfo personList(CrmCustomer crmCustomer) + { + startPage(); + crmCustomer.setStatus(CustomerFolder.CUSTOMER.getCode()); + crmCustomer.setOwner(getUsername()); + List list = crmCustomerService.selectCrmCustomerList(crmCustomer); + return getDataTable(list); + } + /** + * 查询客户列表 + */ + @GetMapping("/list") + public TableDataInfo list(CrmCustomer crmCustomer) + { + startPage(); + crmCustomer.setStatus(CustomerFolder.CUSTOMER.getCode()); + List list = crmCustomerService.selectCrmCustomerList(crmCustomer); + return getDataTable(list); + } + + /** + * 新增客户 + */ + @Log(title = "客户", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@RequestBody CrmCustomer crmCustomer) + { + crmCustomer.setStatus(CustomerFolder.CUSTOMER.getCode()); + crmCustomer.setOwner(getUsername()); + crmCustomer.setCreateBy(getUsername()); + LocalDate currentDate = LocalDate.now(); + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMdd"); + String formattedDate = currentDate.format(formatter); + //根据当前时间生成客户编号 + crmCustomer.setCode("zy_"+formattedDate+ UUID.randomUUID().toString().replace("-","").substring(0,6)); + return toAjax(crmCustomerService.insertCrmCustomer(crmCustomer)); + } + +} diff --git a/ruoyi-crm/src/main/java/com/ruoyi/h5/controller/H5OrderController.java b/ruoyi-crm/src/main/java/com/ruoyi/h5/controller/H5OrderController.java new file mode 100644 index 0000000..5b2c207 --- /dev/null +++ b/ruoyi-crm/src/main/java/com/ruoyi/h5/controller/H5OrderController.java @@ -0,0 +1,58 @@ +package com.ruoyi.h5.controller; + +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.page.TableDataInfo; +import com.ruoyi.crm.domain.CrmOrder; +import com.ruoyi.crm.service.ICrmOrderService; +import com.ruoyi.crm.service.ICustomerOderService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +/** + * H5订单Controller + * + * @author ruoyi + * @date 2022-01-18 + */ +@RestController +@RequestMapping("/h5/order") +public class H5OrderController extends BaseController +{ + @Autowired + private ICrmOrderService crmOrderService; + + @Autowired + private ICustomerOderService customerOderService; + + + + /** + * 查询订单列表 + */ + @GetMapping("/list") + public TableDataInfo list(CrmOrder crmOrder) + { + startPage(); + List list = crmOrderService.selectCrmOrderList(crmOrder); + return getDataTable(list); + } + + /** + * 查询订单列表 + */ + @GetMapping("/person-list") + public TableDataInfo personList(CrmOrder crmOrder) + { + startPage(); + crmOrder.setOwner(getUsername()); + List list = crmOrderService.selectCrmOrderList(crmOrder); + return getDataTable(list); + } + + + +} diff --git a/ruoyi-crm/src/main/java/com/ruoyi/h5/controller/WxLoginController.java b/ruoyi-crm/src/main/java/com/ruoyi/h5/controller/WxLoginController.java new file mode 100644 index 0000000..bb6d65f --- /dev/null +++ b/ruoyi-crm/src/main/java/com/ruoyi/h5/controller/WxLoginController.java @@ -0,0 +1,60 @@ +package com.ruoyi.h5.controller; + +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.h5.service.WxUserService; +import org.springframework.beans.factory.annotation.Autowired; + + +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 java.util.Map; + + +/** + * 微信登录 + * + * @author devjd + * @date 2022-01-12 + */ +@RestController +@RequestMapping("/h5/login") +public class WxLoginController { + +// @Autowired +// private TokenService tokenService; + + @Autowired + private WxUserService wxUserService; + + /** + * 微信小程序登录 + * + * @param + * @return 结果 + */ + @PostMapping("/wxLogin") + public AjaxResult wxLogin(@RequestBody Map map) + { + String code = map.get("code"); + return AjaxResult.success(wxUserService.getSessionId(code)); + } + + /** + * h5登录 + * + * @param + * @return 结果 + */ + @PostMapping("/h5Login") + public AjaxResult h5Login(@RequestBody Map map) + { + String phonenumber = map.get("phonenumber"); + String password = map.get("password"); + String code = map.get("code"); + return AjaxResult.success(wxUserService.getH5(phonenumber,password,code)); + } + +} diff --git a/ruoyi-crm/src/main/java/com/ruoyi/h5/domain/RedisKey.java b/ruoyi-crm/src/main/java/com/ruoyi/h5/domain/RedisKey.java new file mode 100644 index 0000000..ff3b6c7 --- /dev/null +++ b/ruoyi-crm/src/main/java/com/ruoyi/h5/domain/RedisKey.java @@ -0,0 +1,8 @@ +package com.ruoyi.h5.domain; + +public class RedisKey { + public static final String WX_SESSION_ID = "wx_session_id_"; + public static final String H5_SESSION_ID = "h5_session_id_"; + public static final String ACCESS_TOKEN = "access_token_"; + public static final String TOKEN = "token_"; +} diff --git a/ruoyi-crm/src/main/java/com/ruoyi/h5/service/WxUserService.java b/ruoyi-crm/src/main/java/com/ruoyi/h5/service/WxUserService.java new file mode 100644 index 0000000..afb877c --- /dev/null +++ b/ruoyi-crm/src/main/java/com/ruoyi/h5/service/WxUserService.java @@ -0,0 +1,14 @@ +package com.ruoyi.h5.service; + +import com.ruoyi.common.core.domain.AjaxResult; + +/** + * 微信登录接口 + **/ + +public interface WxUserService { + String getSessionId(String code); + + String getH5(String phonenumber,String password,String code); + +} diff --git a/ruoyi-crm/src/main/java/com/ruoyi/h5/service/impl/WxUserServiceImpl.java b/ruoyi-crm/src/main/java/com/ruoyi/h5/service/impl/WxUserServiceImpl.java new file mode 100644 index 0000000..fd3ee86 --- /dev/null +++ b/ruoyi-crm/src/main/java/com/ruoyi/h5/service/impl/WxUserServiceImpl.java @@ -0,0 +1,90 @@ +package com.ruoyi.h5.service.impl; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.ruoyi.common.core.domain.entity.SysUser; +import com.ruoyi.common.core.domain.model.LoginUser; +import com.ruoyi.common.utils.http.HttpUtils; +import com.ruoyi.framework.web.service.TokenService; +import com.ruoyi.h5.domain.RedisKey; +import com.ruoyi.h5.service.WxUserService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.data.redis.core.RedisTemplate; + +import org.springframework.stereotype.Service; + +import java.util.UUID; +import java.util.concurrent.TimeUnit; + +@Service +@Slf4j +public class WxUserServiceImpl implements WxUserService { + @Value("${wechat.appId}") + private String appId; + + @Value("${wechat.secret}") + private String secret; +; + + @Autowired + public TokenService tokenService; + + @Autowired + public RedisTemplate redisTemplate; + + + @Override + public String getSessionId(String code) { + String url ="https://api.weixin.qq.com/sns/jscode2session?appid={0}&secret={1}&js_code={2}&grant_type=authorization_code"; + String replace = url.replace("{0}", appId).replace("{1}", secret).replace("{2}",code); + String res = HttpUtils.sendGet(replace); + JSONObject jsonObject = JSON.parseObject(res); + String openid =(String)jsonObject.get("openid"); + // 生成一个唯一的key,用于存储openid + String uuid = UUID.randomUUID().toString(); + // 将openid存入Redis,并设置过期时间为2小时 + redisTemplate.opsForValue().set(RedisKey.WX_SESSION_ID + uuid, openid, 2, TimeUnit.HOURS); + //设置登录用户信息 + LoginUser loginUser = new LoginUser(); + loginUser.setOpenid(openid); + //默认租户为zy_tenant + loginUser.setTenant("zy_tenant"); + loginUser.setUserId(1L); + //默认用户名 + SysUser sysUser = new SysUser(); + sysUser.setUserName("1"); + loginUser.setUser(sysUser); + //根据openid获取token + return tokenService.createToken(loginUser); + } + + @Override + public String getH5(String phonenumber, String password, String code) { + + if (phonenumber.isEmpty() || password.isEmpty() || code.isEmpty()) { + log.error("获取user accesstoken失败"); + return null; + } else { + // 生成一个唯一的key,用于存储phonenumber + String uuid = UUID.randomUUID().toString(); + // 将phonenumber存入Redis,并设置过期时间为2小时 + redisTemplate.opsForValue().set(RedisKey.H5_SESSION_ID + uuid, phonenumber, 2, TimeUnit.HOURS); + //设置登录用户信息 + LoginUser loginUser = new LoginUser(); + //默认租户为zy_tenant + loginUser.setTenant("zy_tenant"); + loginUser.setUserId(1L); + SysUser sysUser = new SysUser(); + sysUser.setUserName("1"); + sysUser.setPhonenumber(phonenumber); + sysUser.setPassword(password); + sysUser.setCode(code); + loginUser.setUser(sysUser); + //根据openid获取token + return tokenService.createToken(loginUser); + } + } + +} diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java index 1a08c23..818cce0 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java @@ -97,7 +97,9 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter // 过滤请求 .authorizeRequests() // 对于登录login 注册register 验证码captchaImage 允许匿名访问 - .antMatchers("/login", "/register", "/captchaImage","/intelligentForm/selectDynamicDataById","/intelligentForm/collectData").anonymous() + .antMatchers("/login", "/register", "/captchaImage", + "/intelligentForm/selectDynamicDataById","/intelligentForm/collectData", + "/h5/login/wxLogin","/h5/login/h5Login").anonymous() .antMatchers( HttpMethod.GET, "/", diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/interceptor/TenantInterceptor.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/interceptor/TenantInterceptor.java index 6280c09..fad69ed 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/interceptor/TenantInterceptor.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/interceptor/TenantInterceptor.java @@ -49,9 +49,11 @@ public class TenantInterceptor implements HandlerInterceptor { log.info("&&&&&&&&&&&&&&&& 租户拦截 &&&&&&&&&&&&&&&&"); Pattern pattern = Pattern.compile("^/profile.*"); Pattern patterns = Pattern.compile("^/intelligentForm.*"); + Pattern patternByWx = Pattern.compile("^/h5/login.*"); Matcher matcher = pattern.matcher(url); Matcher matchers = patterns.matcher(url); - if (matcher.find() || matchers.find()){ + Matcher matcherByWx = patternByWx.matcher(url); + if (matcher.find() || matchers.find() || matcherByWx.find()){ //使用正则表达式过滤以"/profile","/intelligentForm"开头的请求路径,直接放行 return true; }