Ver código fonte

Merge remote-tracking branch 'origin/dev' into dev

dzx142631 1 ano atrás
pai
commit
6fc6909fc1
35 arquivos alterados com 956 adições e 397 exclusões
  1. 1 1
      Makefile
  2. 5 1
      src/main/java/com/xjrsoft/common/utils/WeChatUtil.java
  3. 119 0
      src/main/java/com/xjrsoft/module/app/controller/BaseAppFunctionController.java
  4. 0 113
      src/main/java/com/xjrsoft/module/app/controller/BaseAppWorkflowConfigController.java
  5. 73 0
      src/main/java/com/xjrsoft/module/app/dto/AddBaseAppFunctionDto.java
  6. 0 43
      src/main/java/com/xjrsoft/module/app/dto/AddBaseAppWorkflowConfigDto.java
  7. 29 0
      src/main/java/com/xjrsoft/module/app/dto/BaseAppFunctionListDto.java
  8. 4 4
      src/main/java/com/xjrsoft/module/app/dto/BaseAppFunctionPageDto.java
  9. 3 3
      src/main/java/com/xjrsoft/module/app/dto/UpdateBaseAppFunctionDto.java
  10. 123 0
      src/main/java/com/xjrsoft/module/app/entity/BaseAppFunction.java
  11. 0 62
      src/main/java/com/xjrsoft/module/app/entity/BaseAppWorkflowConfig.java
  12. 4 4
      src/main/java/com/xjrsoft/module/app/mapper/BaseAppFunctionMapper.java
  13. 4 4
      src/main/java/com/xjrsoft/module/app/service/IBaseAppFunctionService.java
  14. 6 6
      src/main/java/com/xjrsoft/module/app/service/impl/BaseAppFunctionServiceImpl.java
  15. 74 0
      src/main/java/com/xjrsoft/module/app/vo/BaseAppFunctionListVo.java
  16. 104 0
      src/main/java/com/xjrsoft/module/app/vo/BaseAppFunctionPageVo.java
  17. 74 0
      src/main/java/com/xjrsoft/module/app/vo/BaseAppFunctionVo.java
  18. 0 49
      src/main/java/com/xjrsoft/module/app/vo/BaseAppWorkflowConfigListVo.java
  19. 0 44
      src/main/java/com/xjrsoft/module/app/vo/BaseAppWorkflowConfigVo.java
  20. 1 0
      src/main/java/com/xjrsoft/module/form/utils/FormDataTransUtil.java
  21. 11 4
      src/main/java/com/xjrsoft/module/system/controller/DictionarydetailController.java
  22. 7 0
      src/main/java/com/xjrsoft/module/system/controller/LoginController.java
  23. 47 36
      src/main/java/com/xjrsoft/module/system/controller/Oauth2Controller.java
  24. 3 0
      src/main/java/com/xjrsoft/module/system/dto/DictionaryDetailListDto.java
  25. 111 0
      src/main/java/com/xjrsoft/module/system/entity/OauthClientDetails.java
  26. 17 0
      src/main/java/com/xjrsoft/module/system/mapper/OauthClientDetailsMapper.java
  27. 3 0
      src/main/java/com/xjrsoft/module/system/service/ILoginService.java
  28. 17 0
      src/main/java/com/xjrsoft/module/system/service/IOauthClientDetailsService.java
  29. 13 0
      src/main/java/com/xjrsoft/module/system/service/impl/LoginServiceImpl.java
  30. 25 0
      src/main/java/com/xjrsoft/module/system/service/impl/OauthClientDetailsServiceImpl.java
  31. 23 9
      src/main/java/com/xjrsoft/module/system/service/impl/SaOAuth2TemplateImpl.java
  32. 5 4
      src/main/resources/application-dev.yml
  33. 1 0
      src/main/resources/application-prod.yml
  34. 18 7
      src/main/resources/sqlScript/init_sql.sql
  35. 31 3
      src/test/java/com/xjrsoft/xjrsoftboot/FreeMarkerGeneratorTest.java

+ 1 - 1
Makefile

@@ -2,7 +2,7 @@ merge:
 	git checkout master;git merge dev;git push;git checkout dev;
 
 create-tag:
-	git checkout master;git tag v1.0.9;git push origin --tags;git checkout dev;
+	git checkout master;git tag v1.1.3;git push origin --tags;git checkout dev;
 
 remove-tag:
 	git tag -d v1.0.1;git push origin :refs/tags/v1.0.1;

+ 5 - 1
src/main/java/com/xjrsoft/common/utils/WeChatUtil.java

@@ -53,7 +53,11 @@ public class WeChatUtil {
             return null;
         }
         String openId = jsonObject.get("openid").toString();
-        String[] arrayRefVar = { openId,""};
+        String unionid = "";
+        if (jsonObject.containsKey("unionid")) {
+            unionid = jsonObject.get("unionid").toString();
+        }
+        String[] arrayRefVar = {openId, unionid};
         return arrayRefVar;
     }
 

+ 119 - 0
src/main/java/com/xjrsoft/module/app/controller/BaseAppFunctionController.java

@@ -0,0 +1,119 @@
+package com.xjrsoft.module.app.controller;
+
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.xjrsoft.common.constant.GlobalConstant;
+import com.baomidou.mybatisplus.core.toolkit.StringPool;
+import com.xjrsoft.common.page.ConventPage;
+import com.xjrsoft.common.page.PageOutput;
+import com.xjrsoft.common.model.result.RT;
+import com.xjrsoft.common.utils.VoToColumnUtil;
+import com.xjrsoft.module.app.dto.AddBaseAppFunctionDto;
+import com.xjrsoft.module.app.dto.BaseAppFunctionPageDto;
+import com.xjrsoft.module.app.dto.UpdateBaseAppFunctionDto;
+import cn.dev33.satoken.annotation.SaCheckPermission;
+
+import com.xjrsoft.module.app.dto.BaseAppFunctionListDto;
+import com.xjrsoft.module.app.entity.BaseAppFunction;
+import com.xjrsoft.module.app.service.IBaseAppFunctionService;
+import com.xjrsoft.module.app.vo.BaseAppFunctionListVo;
+
+import com.xjrsoft.module.app.vo.BaseAppFunctionPageVo;
+import com.xjrsoft.module.app.vo.BaseAppFunctionVo;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.AllArgsConstructor;
+import org.springframework.web.bind.annotation.*;
+
+import javax.validation.Valid;
+import javax.validation.constraints.NotNull;
+import java.util.List;
+
+/**
+* @title: APP端功能模块管理
+* @Author fanxp
+* @Date: 2023-11-07
+* @Version 1.0
+*/
+@RestController
+@RequestMapping("/app" + "/baseappfunction")
+@Api(value = "/app"  + "/baseappfunction",tags = "APP端功能模块管理代码")
+@AllArgsConstructor
+public class BaseAppFunctionController {
+
+
+    private final IBaseAppFunctionService baseAppFunctionService;
+
+    @GetMapping(value = "/page")
+    @ApiOperation(value="APP端功能模块管理列表(分页)")
+    @SaCheckPermission("baseappfunction:detail")
+    public RT<PageOutput<BaseAppFunctionPageVo>> page(@Valid BaseAppFunctionPageDto dto){
+
+        LambdaQueryWrapper<BaseAppFunction> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper
+                .orderByDesc(BaseAppFunction::getId)
+                .select(BaseAppFunction.class,x -> VoToColumnUtil.fieldsToColumns(BaseAppFunctionPageVo.class).contains(x.getProperty()));
+        IPage<BaseAppFunction> page = baseAppFunctionService.page(ConventPage.getPage(dto), queryWrapper);
+        PageOutput<BaseAppFunctionPageVo> pageOutput = ConventPage.getPageOutput(page, BaseAppFunctionPageVo.class);
+        return RT.ok(pageOutput);
+    }
+    @GetMapping(value = "/list")
+    @ApiOperation(value="根据Type返回模块")
+    @SaCheckPermission("baseappfunction:detail")
+    public RT<List<BaseAppFunctionListVo>> list(@Valid BaseAppFunctionListDto dto) {
+
+        LambdaQueryWrapper<BaseAppFunction> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper
+                .orderByDesc(BaseAppFunction::getSortCode)
+                .eq(BaseAppFunction::getType, dto.getType())
+                .select(BaseAppFunction.class, x -> VoToColumnUtil.fieldsToColumns(BaseAppFunctionListVo.class).contains(x.getProperty()));
+
+        List<BaseAppFunction> list = baseAppFunctionService.list(queryWrapper);
+        List<BaseAppFunctionListVo> listVos = BeanUtil.copyToList(list, BaseAppFunctionListVo.class);
+        return RT.ok(listVos);
+    }
+
+    @GetMapping(value = "/info")
+    @ApiOperation(value="根据id查询APP端功能模块管理信息")
+    @SaCheckPermission("baseappfunction:detail")
+    public RT<BaseAppFunctionVo> info(@RequestParam Long id){
+        BaseAppFunction baseAppFunction = baseAppFunctionService.getById(id);
+        if (baseAppFunction == null) {
+           return RT.error("找不到此数据!");
+        }
+        return RT.ok(BeanUtil.toBean(baseAppFunction, BaseAppFunctionVo.class));
+    }
+
+
+    @PostMapping
+    @ApiOperation(value = "新增APP端功能模块管理")
+    @SaCheckPermission("baseappfunction:add")
+    public RT<Boolean> add(@Valid @RequestBody AddBaseAppFunctionDto dto){
+        BaseAppFunction baseAppFunction = BeanUtil.toBean(dto, BaseAppFunction.class);
+        boolean isSuccess = baseAppFunctionService.save(baseAppFunction);
+    return RT.ok(isSuccess);
+    }
+
+    @PutMapping
+    @ApiOperation(value = "修改APP端功能模块管理")
+    @SaCheckPermission("baseappfunction:edit")
+    public RT<Boolean> update(@Valid @RequestBody UpdateBaseAppFunctionDto dto){
+
+        BaseAppFunction baseAppFunction = BeanUtil.toBean(dto, BaseAppFunction.class);
+        return RT.ok(baseAppFunctionService.updateById(baseAppFunction));
+
+    }
+
+    @DeleteMapping
+    @ApiOperation(value = "删除APP端功能模块管理")
+    @SaCheckPermission("baseappfunction:delete")
+    public RT<Boolean> delete(@Valid @RequestBody List<Long> ids){
+        return RT.ok(baseAppFunctionService.removeBatchByIds(ids));
+
+    }
+
+}

+ 0 - 113
src/main/java/com/xjrsoft/module/app/controller/BaseAppWorkflowConfigController.java

@@ -1,113 +0,0 @@
-package com.xjrsoft.module.app.controller;
-
-import cn.hutool.core.bean.BeanUtil;
-import cn.hutool.core.util.ObjectUtil;
-import cn.hutool.core.util.StrUtil;
-import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
-import com.baomidou.mybatisplus.core.metadata.IPage;
-import com.baomidou.mybatisplus.core.toolkit.Wrappers;
-import com.xjrsoft.common.constant.GlobalConstant;
-import com.baomidou.mybatisplus.core.toolkit.StringPool;
-import com.xjrsoft.common.page.ConventPage;
-import com.xjrsoft.common.page.PageOutput;
-import com.xjrsoft.common.model.result.RT;
-import com.xjrsoft.common.utils.VoToColumnUtil;
-import com.xjrsoft.module.app.dto.AddBaseAppWorkflowConfigDto;
-import com.xjrsoft.module.app.dto.UpdateBaseAppWorkflowConfigDto;
-import cn.dev33.satoken.annotation.SaCheckPermission;
-
-import com.xjrsoft.module.app.dto.BaseAppWorkflowConfigListDto;
-import com.xjrsoft.module.app.entity.BaseAppWorkflowConfig;
-import com.xjrsoft.module.app.service.IBaseAppWorkflowConfigService;
-import com.xjrsoft.module.app.vo.BaseAppWorkflowConfigListVo;
-
-import com.xjrsoft.module.app.vo.BaseAppWorkflowConfigVo;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
-import lombok.AllArgsConstructor;
-import org.springframework.web.bind.annotation.*;
-
-import javax.validation.Valid;
-import javax.validation.constraints.NotNull;
-import java.util.List;
-
-/**
-* @title: APP 流程单独配置
-* @Author fanxp
-* @Date: 2023-11-06
-* @Version 1.0
-*/
-@RestController
-@RequestMapping("/app" + "/baseappworkflowconfig")
-@Api(value = "/app"  + "/baseappworkflowconfig",tags = "APP 流程单独配置代码")
-@AllArgsConstructor
-public class BaseAppWorkflowConfigController {
-
-
-    private final IBaseAppWorkflowConfigService baseAppWorkflowConfigService;
-
-    @GetMapping(value = "/list")
-    @ApiOperation(value="APP 流程单独配置列表(不分页)")
-    @SaCheckPermission("baseappworkflowconfig:detail")
-    public RT<List<BaseAppWorkflowConfigListVo>> list(@Valid BaseAppWorkflowConfigListDto dto){
-
-        LambdaQueryWrapper<BaseAppWorkflowConfig> queryWrapper = new LambdaQueryWrapper<>();
-        queryWrapper
-                    .orderByDesc(BaseAppWorkflowConfig::getId)
-                    .select(BaseAppWorkflowConfig.class,x -> VoToColumnUtil.fieldsToColumns(BaseAppWorkflowConfigListVo.class).contains(x.getProperty()));
-
-        List<BaseAppWorkflowConfig> list = baseAppWorkflowConfigService.list(queryWrapper);
-        List<BaseAppWorkflowConfigListVo> listVos = BeanUtil.copyToList(list, BaseAppWorkflowConfigListVo.class);
-        return RT.ok(listVos);
-    }
-
-    @GetMapping(value = "/info")
-    @ApiOperation(value="根据id查询APP 流程单独配置信息")
-    @SaCheckPermission("baseappworkflowconfig:detail")
-    public RT<BaseAppWorkflowConfigVo> info(@RequestParam Long id){
-        BaseAppWorkflowConfig baseAppWorkflowConfig = baseAppWorkflowConfigService.getById(id);
-        if (baseAppWorkflowConfig == null) {
-           return RT.error("找不到此数据!");
-        }
-        return RT.ok(BeanUtil.toBean(baseAppWorkflowConfig, BaseAppWorkflowConfigVo.class));
-    }
-
-    @GetMapping(value = "/detail")
-    @ApiOperation(value="根据Code查询APP 流程单独配置信息")
-    public RT<BaseAppWorkflowConfigVo> detail(@RequestParam String code) {
-        BaseAppWorkflowConfig baseAppWorkflowConfig = baseAppWorkflowConfigService.getOne(Wrappers.lambdaQuery(BaseAppWorkflowConfig.class).eq(BaseAppWorkflowConfig::getCode, code));
-        if (baseAppWorkflowConfig == null) {
-            return RT.error("找不到此数据!");
-        }
-        return RT.ok(BeanUtil.toBean(baseAppWorkflowConfig, BaseAppWorkflowConfigVo.class));
-    }
-
-
-    @PostMapping
-    @ApiOperation(value = "新增APP 流程单独配置")
-    @SaCheckPermission("baseappworkflowconfig:add")
-    public RT<Boolean> add(@Valid @RequestBody AddBaseAppWorkflowConfigDto dto){
-        BaseAppWorkflowConfig baseAppWorkflowConfig = BeanUtil.toBean(dto, BaseAppWorkflowConfig.class);
-        boolean isSuccess = baseAppWorkflowConfigService.save(baseAppWorkflowConfig);
-    return RT.ok(isSuccess);
-    }
-
-    @PutMapping
-    @ApiOperation(value = "修改APP 流程单独配置")
-    @SaCheckPermission("baseappworkflowconfig:edit")
-    public RT<Boolean> update(@Valid @RequestBody UpdateBaseAppWorkflowConfigDto dto){
-
-        BaseAppWorkflowConfig baseAppWorkflowConfig = BeanUtil.toBean(dto, BaseAppWorkflowConfig.class);
-        return RT.ok(baseAppWorkflowConfigService.updateById(baseAppWorkflowConfig));
-
-    }
-
-    @DeleteMapping
-    @ApiOperation(value = "删除APP 流程单独配置")
-    @SaCheckPermission("baseappworkflowconfig:delete")
-    public RT<Boolean> delete(@Valid @RequestBody List<Long> ids){
-        return RT.ok(baseAppWorkflowConfigService.removeBatchByIds(ids));
-
-    }
-
-}

+ 73 - 0
src/main/java/com/xjrsoft/module/app/dto/AddBaseAppFunctionDto.java

@@ -0,0 +1,73 @@
+package com.xjrsoft.module.app.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import java.io.Serializable;
+import com.fasterxml.jackson.annotation.JsonFormat;
+
+import java.time.LocalTime;
+import java.time.LocalDateTime;
+import java.math.BigDecimal;
+import java.util.List;
+import java.util.Date;
+
+
+
+/**
+* @title: APP端功能模块管理
+* @Author fanxp
+* @Date: 2023-11-07
+* @Version 1.0
+*/
+@Data
+public class AddBaseAppFunctionDto implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+    * 功能分类(xjr_dictionary_item[APPFUNC])
+    */
+    @ApiModelProperty("功能分类(xjr_dictionary_item[APPFUNC])")
+    private String type;
+    /**
+    * 名称
+    */
+    @ApiModelProperty("名称")
+    private String name;
+    /**
+    * 图标
+    */
+    @ApiModelProperty("图标")
+    private String icon;
+    /**
+    * 图标前缀
+    */
+    @ApiModelProperty("图标前缀")
+    private String prefix;
+    /**
+    * 图标颜色
+    */
+    @ApiModelProperty("图标颜色")
+    private String color;
+    /**
+    * 模板ID
+    */
+    @ApiModelProperty("模板ID")
+    private Long schemaId;
+    /**
+    * 排序
+    */
+    @ApiModelProperty("排序")
+    private Integer sortCode;
+    /**
+    * 菜单类型 0=菜单 1=目录
+    */
+    @ApiModelProperty("菜单类型 0=菜单 1=目录")
+    private Integer isDirectory;
+    /**
+    * 功能地址
+    */
+    @ApiModelProperty("功能地址")
+    private String url;
+
+}

+ 0 - 43
src/main/java/com/xjrsoft/module/app/dto/AddBaseAppWorkflowConfigDto.java

@@ -1,43 +0,0 @@
-package com.xjrsoft.module.app.dto;
-
-import io.swagger.annotations.ApiModelProperty;
-import lombok.Data;
-import java.io.Serializable;
-import com.fasterxml.jackson.annotation.JsonFormat;
-
-import java.time.LocalTime;
-import java.time.LocalDateTime;
-import java.math.BigDecimal;
-import java.util.List;
-import java.util.Date;
-
-
-
-/**
-* @title: APP 流程单独配置
-* @Author fanxp
-* @Date: 2023-11-06
-* @Version 1.0
-*/
-@Data
-public class AddBaseAppWorkflowConfigDto implements Serializable {
-
-    private static final long serialVersionUID = 1L;
-
-    /**
-    * 名称
-    */
-    @ApiModelProperty("名称")
-    private String name;
-    /**
-    * 编号 统一标识,手机端根据标识查询
-    */
-    @ApiModelProperty("编号 统一标识,手机端根据标识查询")
-    private String code;
-    /**
-    * 流程ID
-    */
-    @ApiModelProperty("流程ID")
-    private Long workflowId;
-
-}

+ 29 - 0
src/main/java/com/xjrsoft/module/app/dto/BaseAppFunctionListDto.java

@@ -0,0 +1,29 @@
+package com.xjrsoft.module.app.dto;
+
+import com.xjrsoft.common.page.ListInput;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.time.LocalTime;
+import java.time.LocalDateTime;
+import java.math.BigDecimal;
+import java.util.Date;
+
+
+/**
+* @title: APP端功能模块管理列表查询入参
+* @Author fanxp
+* @Date: 2023-11-07
+* @Version 1.0
+*/
+@Data
+@EqualsAndHashCode(callSuper = false)
+public class BaseAppFunctionListDto extends ListInput {
+    /**
+     * 功能分类(xjr_dictionary_item[APPFUNC])
+     */
+    @ApiModelProperty("功能分类(xjr_dictionary_item[APPFUNC])")
+    private String type;
+}

+ 4 - 4
src/main/java/com/xjrsoft/module/app/dto/BaseAppWorkflowConfigListDto.java → src/main/java/com/xjrsoft/module/app/dto/BaseAppFunctionPageDto.java

@@ -1,6 +1,6 @@
 package com.xjrsoft.module.app.dto;
 
-import com.xjrsoft.common.page.ListInput;
+import com.xjrsoft.common.page.PageInput;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
@@ -13,14 +13,14 @@ import java.util.Date;
 
 
 /**
-* @title: APP 流程单独配置列表查询入参
+* @title: APP端功能模块管理分页查询入参
 * @Author fanxp
-* @Date: 2023-11-06
+* @Date: 2023-11-07
 * @Version 1.0
 */
 @Data
 @EqualsAndHashCode(callSuper = false)
-public class BaseAppWorkflowConfigListDto extends ListInput {
+public class BaseAppFunctionPageDto extends PageInput {
 
 
 }

+ 3 - 3
src/main/java/com/xjrsoft/module/app/dto/UpdateBaseAppWorkflowConfigDto.java → src/main/java/com/xjrsoft/module/app/dto/UpdateBaseAppFunctionDto.java

@@ -14,13 +14,13 @@ import java.util.Date;
 
 
 /**
-* @title: APP 流程单独配置
+* @title: APP端功能模块管理
 * @Author fanxp
-* @Date: 2023-11-06
+* @Date: 2023-11-07
 * @Version 1.0
 */
 @Data
-public class UpdateBaseAppWorkflowConfigDto extends AddBaseAppWorkflowConfigDto {
+public class UpdateBaseAppFunctionDto extends AddBaseAppFunctionDto {
 
     private static final long serialVersionUID = 1L;
 

+ 123 - 0
src/main/java/com/xjrsoft/module/app/entity/BaseAppFunction.java

@@ -0,0 +1,123 @@
+package com.xjrsoft.module.app.entity;
+
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.github.yulichang.annotation.EntityMapping;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import java.io.Serializable;
+import java.time.LocalTime;
+import java.time.LocalDateTime;
+import java.math.BigDecimal;
+import java.util.List;
+import java.util.Date;
+
+
+/**
+* @title: APP端功能模块管理
+* @Author fanxp
+* @Date: 2023-11-07
+* @Version 1.0
+*/
+@Data
+@TableName("base_app_function")
+@ApiModel(value = "APP端功能模块管理对象", description = "APP端功能模块管理")
+public class BaseAppFunction implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+    * 主键编号
+    */
+    @ApiModelProperty("主键编号")
+    @TableId
+    private Long id;
+    /**
+    * 创建人
+    */
+    @ApiModelProperty("创建人")
+    @TableField(fill = FieldFill.INSERT)
+    private Long createUserId;
+    /**
+    * 创建时间
+    */
+    @ApiModelProperty("创建时间")
+    @TableField(fill = FieldFill.INSERT)
+    private Date createDate;
+    /**
+    * 修改人
+    */
+    @ApiModelProperty("修改人")
+    @TableField(fill = FieldFill.UPDATE)
+    private Long modifyUserId;
+    /**
+    * 修改时间
+    */
+    @ApiModelProperty("修改时间")
+    @TableField(fill = FieldFill.UPDATE)
+    private Date modifyDate;
+    /**
+    * 删除标记
+    */
+    @ApiModelProperty("删除标记")
+    @TableField(fill = FieldFill.INSERT)
+    @TableLogic
+    private Integer deleteMark;
+    /**
+    * 有效标志
+    */
+    @ApiModelProperty("有效标志")
+    @TableField(fill = FieldFill.INSERT)
+    private Integer enabledMark;
+    /**
+    * 功能分类(xjr_dictionary_item[APPFUNC])
+    */
+    @ApiModelProperty("功能分类(xjr_dictionary_item[APPFUNC])")
+    private String type;
+    /**
+    * 名称
+    */
+    @ApiModelProperty("名称")
+    private String name;
+    /**
+    * 图标
+    */
+    @ApiModelProperty("图标")
+    private String icon;
+    /**
+    * 图标前缀
+    */
+    @ApiModelProperty("图标前缀")
+    private String prefix;
+    /**
+    * 图标颜色
+    */
+    @ApiModelProperty("图标颜色")
+    private String color;
+    /**
+    * 模板ID
+    */
+    @ApiModelProperty("模板ID")
+    private Long schemaId;
+    /**
+    * 排序
+    */
+    @ApiModelProperty("排序")
+    private Integer sortCode;
+    /**
+    * 菜单类型 0=菜单 1=目录
+    */
+    @ApiModelProperty("菜单类型 0=菜单 1=目录")
+    private Integer isDirectory;
+    /**
+    * 功能地址
+    */
+    @ApiModelProperty("功能地址")
+    private String url;
+
+
+}

+ 0 - 62
src/main/java/com/xjrsoft/module/app/entity/BaseAppWorkflowConfig.java

@@ -1,62 +0,0 @@
-package com.xjrsoft.module.app.entity;
-
-import com.baomidou.mybatisplus.annotation.FieldFill;
-import com.baomidou.mybatisplus.annotation.TableField;
-import com.baomidou.mybatisplus.annotation.TableLogic;
-import com.baomidou.mybatisplus.annotation.TableName;
-import com.baomidou.mybatisplus.annotation.TableId;
-import com.github.yulichang.annotation.EntityMapping;
-import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
-import lombok.Data;
-import java.io.Serializable;
-import java.time.LocalTime;
-import java.time.LocalDateTime;
-import java.math.BigDecimal;
-import java.util.List;
-import java.util.Date;
-
-
-/**
-* @title: APP 流程单独配置
-* @Author fanxp
-* @Date: 2023-11-06
-* @Version 1.0
-*/
-@Data
-@TableName("base_app_workflow_config")
-@ApiModel(value = "APP 流程单独配置对象", description = "APP 流程单独配置")
-public class BaseAppWorkflowConfig implements Serializable {
-
-    private static final long serialVersionUID = 1L;
-
-    /**
-    * 主键编号
-    */
-    @ApiModelProperty("主键编号")
-    @TableId
-    private Long id;
-    /**
-    * 名称
-    */
-    @ApiModelProperty("名称")
-    private String name;
-    /**
-    * 编号 统一标识,手机端根据标识查询
-    */
-    @ApiModelProperty("编号 统一标识,手机端根据标识查询")
-    private String code;
-    /**
-    * 流程ID
-    */
-    @ApiModelProperty("流程ID")
-    private Long workflowId;
-    /**
-    * 创建时间
-    */
-    @ApiModelProperty("创建时间")
-    @TableField(fill = FieldFill.INSERT)
-    private Date createDate;
-
-
-}

+ 4 - 4
src/main/java/com/xjrsoft/module/app/mapper/BaseAppWorkflowConfigMapper.java → src/main/java/com/xjrsoft/module/app/mapper/BaseAppFunctionMapper.java

@@ -2,16 +2,16 @@ package com.xjrsoft.module.app.mapper;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.github.yulichang.base.MPJBaseMapper;
-import com.xjrsoft.module.app.entity.BaseAppWorkflowConfig;
+import com.xjrsoft.module.app.entity.BaseAppFunction;
 import org.apache.ibatis.annotations.Mapper;
 
 /**
-* @title: APP 流程单独配置
+* @title: APP端功能模块管理
 * @Author fanxp
-* @Date: 2023-11-06
+* @Date: 2023-11-07
 * @Version 1.0
 */
 @Mapper
-public interface BaseAppWorkflowConfigMapper extends BaseMapper<BaseAppWorkflowConfig> {
+public interface BaseAppFunctionMapper extends BaseMapper<BaseAppFunction> {
 
 }

+ 4 - 4
src/main/java/com/xjrsoft/module/app/service/IBaseAppWorkflowConfigService.java → src/main/java/com/xjrsoft/module/app/service/IBaseAppFunctionService.java

@@ -2,16 +2,16 @@ package com.xjrsoft.module.app.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.github.yulichang.base.MPJBaseService;
-import com.xjrsoft.module.app.entity.BaseAppWorkflowConfig;
+import com.xjrsoft.module.app.entity.BaseAppFunction;
 import lombok.Data;
 import java.util.List;
 
 /**
-* @title: APP 流程单独配置
+* @title: APP端功能模块管理
 * @Author fanxp
-* @Date: 2023-11-06
+* @Date: 2023-11-07
 * @Version 1.0
 */
 
-public interface IBaseAppWorkflowConfigService extends IService<BaseAppWorkflowConfig> {
+public interface IBaseAppFunctionService extends IService<BaseAppFunction> {
 }

+ 6 - 6
src/main/java/com/xjrsoft/module/app/service/impl/BaseAppWorkflowConfigServiceImpl.java → src/main/java/com/xjrsoft/module/app/service/impl/BaseAppFunctionServiceImpl.java

@@ -2,9 +2,9 @@ package com.xjrsoft.module.app.service.impl;
 
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.github.yulichang.base.MPJBaseServiceImpl;
-import com.xjrsoft.module.app.entity.BaseAppWorkflowConfig;
-import com.xjrsoft.module.app.mapper.BaseAppWorkflowConfigMapper;
-import com.xjrsoft.module.app.service.IBaseAppWorkflowConfigService;
+import com.xjrsoft.module.app.entity.BaseAppFunction;
+import com.xjrsoft.module.app.mapper.BaseAppFunctionMapper;
+import com.xjrsoft.module.app.service.IBaseAppFunctionService;
 import lombok.AllArgsConstructor;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -14,12 +14,12 @@ import java.util.stream.Collectors;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 
 /**
-* @title: APP 流程单独配置
+* @title: APP端功能模块管理
 * @Author fanxp
-* @Date: 2023-11-06
+* @Date: 2023-11-07
 * @Version 1.0
 */
 @Service
 @AllArgsConstructor
-public class BaseAppWorkflowConfigServiceImpl extends ServiceImpl<BaseAppWorkflowConfigMapper, BaseAppWorkflowConfig> implements IBaseAppWorkflowConfigService {
+public class BaseAppFunctionServiceImpl extends ServiceImpl<BaseAppFunctionMapper, BaseAppFunction> implements IBaseAppFunctionService {
 }

+ 74 - 0
src/main/java/com/xjrsoft/module/app/vo/BaseAppFunctionListVo.java

@@ -0,0 +1,74 @@
+package com.xjrsoft.module.app.vo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import com.xjrsoft.common.annotation.Trans;
+import com.xjrsoft.common.enums.TransType;
+import java.time.LocalTime;
+import java.time.LocalDateTime;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+* @title: APP端功能模块管理列表列表入参
+* @Author fanxp
+* @Date: 2023-11-07
+* @Version 1.0
+*/
+@Data
+public class BaseAppFunctionListVo {
+
+    /**
+    * 主键编号
+    */
+    @ApiModelProperty("主键编号")
+    private String id;
+    /**
+    * 功能分类(xjr_dictionary_item[APPFUNC])
+    */
+    @ApiModelProperty("功能分类(xjr_dictionary_item[APPFUNC])")
+    private String type;
+    /**
+    * 名称
+    */
+    @ApiModelProperty("名称")
+    private String name;
+    /**
+    * 图标
+    */
+    @ApiModelProperty("图标")
+    private String icon;
+    /**
+    * 图标前缀
+    */
+    @ApiModelProperty("图标前缀")
+    private String prefix;
+    /**
+    * 图标颜色
+    */
+    @ApiModelProperty("图标颜色")
+    private String color;
+    /**
+    * 模板ID
+    */
+    @ApiModelProperty("模板ID")
+    private Long schemaId;
+    /**
+    * 排序
+    */
+    @ApiModelProperty("排序")
+    private Integer sortCode;
+    /**
+    * 菜单类型 0=菜单 1=目录
+    */
+    @ApiModelProperty("菜单类型 0=菜单 1=目录")
+    private Integer isDirectory;
+    /**
+    * 功能地址
+    */
+    @ApiModelProperty("功能地址")
+    private String url;
+
+}

+ 104 - 0
src/main/java/com/xjrsoft/module/app/vo/BaseAppFunctionPageVo.java

@@ -0,0 +1,104 @@
+package com.xjrsoft.module.app.vo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import com.xjrsoft.common.annotation.Trans;
+import com.xjrsoft.common.enums.TransType;
+import java.time.LocalTime;
+import java.time.LocalDateTime;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+* @title: APP端功能模块管理分页列表出参
+* @Author fanxp
+* @Date: 2023-11-07
+* @Version 1.0
+*/
+@Data
+public class BaseAppFunctionPageVo {
+
+    /**
+    * 主键编号
+    */
+    @ApiModelProperty("主键编号")
+    private String id;
+    /**
+    * 创建人
+    */
+    @ApiModelProperty("创建人")
+    private Long createUserId;
+    /**
+    * 创建时间
+    */
+    @ApiModelProperty("创建时间")
+    private Date createDate;
+    /**
+    * 修改人
+    */
+    @ApiModelProperty("修改人")
+    private Long modifyUserId;
+    /**
+    * 修改时间
+    */
+    @ApiModelProperty("修改时间")
+    private Date modifyDate;
+    /**
+    * 删除标记
+    */
+    @ApiModelProperty("删除标记")
+    private Integer deleteMark;
+    /**
+    * 有效标志
+    */
+    @ApiModelProperty("有效标志")
+    private Integer enabledMark;
+    /**
+    * 功能分类(xjr_dictionary_item[APPFUNC])
+    */
+    @ApiModelProperty("功能分类(xjr_dictionary_item[APPFUNC])")
+    private String type;
+    /**
+    * 名称
+    */
+    @ApiModelProperty("名称")
+    private String name;
+    /**
+    * 图标
+    */
+    @ApiModelProperty("图标")
+    private String icon;
+    /**
+    * 图标前缀
+    */
+    @ApiModelProperty("图标前缀")
+    private String prefix;
+    /**
+    * 图标颜色
+    */
+    @ApiModelProperty("图标颜色")
+    private String color;
+    /**
+    * 模板ID
+    */
+    @ApiModelProperty("模板ID")
+    private Long schemaId;
+    /**
+    * 排序
+    */
+    @ApiModelProperty("排序")
+    private Integer sortCode;
+    /**
+    * 菜单类型 0=菜单 1=目录
+    */
+    @ApiModelProperty("菜单类型 0=菜单 1=目录")
+    private Integer isDirectory;
+    /**
+    * 功能地址
+    */
+    @ApiModelProperty("功能地址")
+    private String url;
+
+}

+ 74 - 0
src/main/java/com/xjrsoft/module/app/vo/BaseAppFunctionVo.java

@@ -0,0 +1,74 @@
+package com.xjrsoft.module.app.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.time.LocalTime;
+import java.time.LocalDateTime;
+import java.math.BigDecimal;
+import java.util.List;
+import java.util.Date;
+
+/**
+* @title: APP端功能模块管理表单出参
+* @Author fanxp
+* @Date: 2023-11-07
+* @Version 1.0
+*/
+@Data
+public class BaseAppFunctionVo {
+
+    /**
+    * 主键编号
+    */
+    @ApiModelProperty("主键编号")
+    private Long id;
+    /**
+    * 功能分类(xjr_dictionary_item[APPFUNC])
+    */
+    @ApiModelProperty("功能分类(xjr_dictionary_item[APPFUNC])")
+    private String type;
+    /**
+    * 名称
+    */
+    @ApiModelProperty("名称")
+    private String name;
+    /**
+    * 图标
+    */
+    @ApiModelProperty("图标")
+    private String icon;
+    /**
+    * 图标前缀
+    */
+    @ApiModelProperty("图标前缀")
+    private String prefix;
+    /**
+    * 图标颜色
+    */
+    @ApiModelProperty("图标颜色")
+    private String color;
+    /**
+    * 模板ID
+    */
+    @ApiModelProperty("模板ID")
+    private Long schemaId;
+    /**
+    * 排序
+    */
+    @ApiModelProperty("排序")
+    private Integer sortCode;
+    /**
+    * 菜单类型 0=菜单 1=目录
+    */
+    @ApiModelProperty("菜单类型 0=菜单 1=目录")
+    private Integer isDirectory;
+    /**
+    * 功能地址
+    */
+    @ApiModelProperty("功能地址")
+    private String url;
+
+
+
+}

+ 0 - 49
src/main/java/com/xjrsoft/module/app/vo/BaseAppWorkflowConfigListVo.java

@@ -1,49 +0,0 @@
-package com.xjrsoft.module.app.vo;
-
-import com.fasterxml.jackson.annotation.JsonFormat;
-import io.swagger.annotations.ApiModelProperty;
-import lombok.Data;
-
-import com.xjrsoft.common.annotation.Trans;
-import com.xjrsoft.common.enums.TransType;
-import java.time.LocalTime;
-import java.time.LocalDateTime;
-import java.math.BigDecimal;
-import java.util.Date;
-
-/**
-* @title: APP 流程单独配置列表列表入参
-* @Author fanxp
-* @Date: 2023-11-06
-* @Version 1.0
-*/
-@Data
-public class BaseAppWorkflowConfigListVo {
-
-    /**
-    * 主键编号
-    */
-    @ApiModelProperty("主键编号")
-    private String id;
-    /**
-    * 名称
-    */
-    @ApiModelProperty("名称")
-    private String name;
-    /**
-    * 编号 统一标识,手机端根据标识查询
-    */
-    @ApiModelProperty("编号 统一标识,手机端根据标识查询")
-    private String code;
-    /**
-    * 流程ID
-    */
-    @ApiModelProperty("流程ID")
-    private Long workflowId;
-    /**
-    * 创建时间
-    */
-    @ApiModelProperty("创建时间")
-    private Date createDate;
-
-}

+ 0 - 44
src/main/java/com/xjrsoft/module/app/vo/BaseAppWorkflowConfigVo.java

@@ -1,44 +0,0 @@
-package com.xjrsoft.module.app.vo;
-
-import io.swagger.annotations.ApiModelProperty;
-import lombok.Data;
-
-import java.time.LocalTime;
-import java.time.LocalDateTime;
-import java.math.BigDecimal;
-import java.util.List;
-import java.util.Date;
-
-/**
-* @title: APP 流程单独配置表单出参
-* @Author fanxp
-* @Date: 2023-11-06
-* @Version 1.0
-*/
-@Data
-public class BaseAppWorkflowConfigVo {
-
-    /**
-    * 主键编号
-    */
-    @ApiModelProperty("主键编号")
-    private Long id;
-    /**
-    * 名称
-    */
-    @ApiModelProperty("名称")
-    private String name;
-    /**
-    * 编号 统一标识,手机端根据标识查询
-    */
-    @ApiModelProperty("编号 统一标识,手机端根据标识查询")
-    private String code;
-    /**
-    * 流程ID
-    */
-    @ApiModelProperty("流程ID")
-    private Long workflowId;
-
-
-
-}

+ 1 - 0
src/main/java/com/xjrsoft/module/form/utils/FormDataTransUtil.java

@@ -150,6 +150,7 @@ public final class FormDataTransUtil {
                     deptMap = departmentList.stream().collect(Collectors.toMap(department -> department.getId().toString(), Department::getName, (e1, e2) -> e1));
                 }
                 fieldValuesMap.put(bindField, deptMap);
+                multiFieldMap.put(bindField, null);
             } else if (StrUtil.equalsIgnoreCase(ComponentTypeConstant.USER, type)
                     || (StrUtil.equalsIgnoreCase(ComponentTypeConstant.INFO, type) && infoType.equals(0))) {
                 if (userMap == null) {

+ 11 - 4
src/main/java/com/xjrsoft/module/system/controller/DictionarydetailController.java

@@ -46,11 +46,18 @@ public class DictionarydetailController {
 
     @GetMapping
     @ApiOperation(value = "获取当前数据字典详情(不分页)")
-    public R list(DictionaryDetailListDto dto){
+    public R list(DictionaryDetailListDto dto) {
         LambdaQueryWrapper<DictionaryDetail> queryWrapper = new LambdaQueryWrapper<>();
-        queryWrapper.eq(StrUtil.isNotEmpty(dto.getName()),DictionaryDetail::getName,dto.getName());
-        queryWrapper.eq(StrUtil.isNotEmpty(dto.getCode()),DictionaryDetail::getCode,dto.getCode());
-        queryWrapper.eq(ObjectUtil.isNotEmpty(dto.getItemId()) && dto.getItemId() != 0,DictionaryDetail::getItemId,dto.getItemId());
+        queryWrapper.eq(StrUtil.isNotEmpty(dto.getName()), DictionaryDetail::getName, dto.getName());
+        queryWrapper.eq(StrUtil.isNotEmpty(dto.getCode()), DictionaryDetail::getCode, dto.getCode());
+        if (StrUtil.isNotEmpty(dto.getPCode())) {
+            DictionaryDetail dictionaryDetail = dictionarydetailService.getOne(Wrappers.lambdaQuery(DictionaryDetail.class).eq(DictionaryDetail::getCode, dto.getPCode()));
+            if (dictionaryDetail != null) {
+                queryWrapper.eq(DictionaryDetail::getPId, dictionaryDetail.getId());
+            }
+        }
+
+        queryWrapper.eq(ObjectUtil.isNotEmpty(dto.getItemId()) && dto.getItemId() != 0, DictionaryDetail::getItemId, dto.getItemId());
         queryWrapper.select(DictionaryDetail.class, x -> VoToColumnUtil.fieldsToColumns(DictionaryDetailListVo.class).contains(x.getProperty()));
         queryWrapper.orderByAsc(DictionaryDetail::getSortCode);
         List<DictionaryDetail> list = dictionarydetailService.list(queryWrapper);

+ 7 - 0
src/main/java/com/xjrsoft/module/system/controller/LoginController.java

@@ -81,6 +81,13 @@ public class LoginController {
         return R.ok(loginService.loginByCode(dto));
     }
 
+    @PostMapping("/bindOpenid")
+    @ApiOperation(value = "登录", notes = "code")
+    @XjrLog(value = "code换Openid并绑定")
+    public R bindOpenid(@RequestBody @Valid LoginByCodeDto dto) throws Exception {
+        return R.ok(loginService.bindOpenid(dto));
+    }
+
     @GetMapping("/imgcaptcha")
     @ApiOperation(value = "图形验证码", notes = "图形验证码")
     public R imgCaptcha() {

+ 47 - 36
src/main/java/com/xjrsoft/module/system/controller/Oauth2Controller.java

@@ -11,15 +11,22 @@ import cn.dev33.satoken.spring.SpringMVCUtil;
 import cn.dev33.satoken.stp.StpLogic;
 import cn.dev33.satoken.stp.StpUtil;
 import cn.dev33.satoken.util.SaResult;
+import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.util.IdUtil;
 import com.xjrsoft.common.annotation.XjrLog;
 import com.xjrsoft.common.constant.GlobalConstant;
+import com.xjrsoft.common.model.result.R;
+import com.xjrsoft.common.model.result.RT;
 import com.xjrsoft.common.utils.RedisUtil;
 import com.xjrsoft.config.CommonPropertiesConfig;
+import com.xjrsoft.module.organization.entity.User;
+import com.xjrsoft.module.organization.service.IUserService;
+import com.xjrsoft.module.organization.vo.UserVo;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.AllArgsConstructor;
 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 org.springframework.web.servlet.ModelAndView;
@@ -44,55 +51,59 @@ public class Oauth2Controller {
 
     private final RedisUtil redisUtil;
 
-    // 处理所有OAuth相关请求
+    private final IUserService userService;
+
     @RequestMapping("/oauth2/*")
-    @ApiOperation(value = "oauth2", notes = "处理所有OAuth相关请求")
-    @XjrLog(value = "处理所有OAuth相关请求")
+    @ApiOperation(value = "处理所有OAuth相关请求")
     public Object request() {
         return SaOAuth2Handle.serverRequest();
     }
 
+    @GetMapping("/oauth2/user/info")
+    @ApiOperation(value = "获取当前用户信息")
+    public RT<UserVo> userInfo() {
+        //获取用户id
+        Long userId =  StpUtil.getLoginIdAsLong();
+        User user = userService.getById(userId);
+        if (user == null) {
+            return RT.error("找不到此用户!");
+        }
+        return RT.ok(BeanUtil.toBean(user, UserVo.class));
+    }
+
     // Sa-OAuth2 定制化配置
     @Autowired
     public void setSaOAuth2Config(SaOAuth2Config cfg) {
         // 配置:未登录时返回的View
         cfg.setNotLoginView(() -> {
-                    SaRequest req = SaHolder.getRequest();
-                    Map<String, String> paramMap = req.getParamMap();
-                    StringBuilder param = new StringBuilder();
-                    paramMap.forEach((k, v) -> {
-                        param.append("&").append(k).append("=").append(v);
-                    });
-                    param.deleteCharAt(0);
-                    String callBackUrl = String.format("%s/oauth2/authorize?%s", commonPropertiesConfig.getDomainApi(), param);
+                SaRequest req = SaHolder.getRequest();
+                Map<String, String> paramMap = req.getParamMap();
+                StringBuilder param = new StringBuilder();
+                paramMap.forEach((k, v) -> {
+                    param.append("&").append(k).append("=").append(v);
+                });
+                param.deleteCharAt(0);
+                String callBackUrl = String.format("%s/oauth2/authorize?%s", commonPropertiesConfig.getDomainApi(), param);
 
-                    String key = GlobalConstant.OAUTH2 + IdUtil.simpleUUID();
-                    redisUtil.set(key, callBackUrl, 86400);
+                String key = GlobalConstant.OAUTH2 + IdUtil.simpleUUID();
+                redisUtil.set(key, callBackUrl, 86400);
 
-                    SaResponse res = SaHolder.getResponse();
-                    SaCookie cookie = new SaCookie()
-                            .setName("Oauth2Info")
-                            .setValue(key);
+                SaResponse res = SaHolder.getResponse();
+                SaCookie cookie = new SaCookie()
+                        .setName("Oauth2Info")
+                        .setValue(key);
 
-                    res.addCookie(cookie);
+                res.addCookie(cookie);
 
-                    res.redirect(String.format("%s/#/login", commonPropertiesConfig.getDomainWeb()));
-                    return null;
-                }).
-                // 配置:登录处理函数
-                setDoLoginHandle((name, pwd) -> {
-                    if ("sa".equals(name) && "123456".equals(pwd)) {
-                        StpUtil.login(10001);
-                        return SaResult.ok();
-                    }
-                    return SaResult.error("账号名或密码错误");
-                }).
-                // 配置:确认授权时返回的View
-                setConfirmView((clientId, scope) -> {
-                    Map<String, Object> map = new HashMap<>();
-                    map.put("clientId", clientId);
-                    map.put("scope", scope);
-                    return new ModelAndView("confirm.html", map);
-                });
+                res.redirect(String.format("%s/#/login", commonPropertiesConfig.getDomainWeb()));
+                return null;
+            }).
+            // 配置:确认授权时返回的View
+            setConfirmView((clientId, scope) -> {
+                Map<String, Object> map = new HashMap<>();
+                map.put("clientId", clientId);
+                map.put("scope", scope);
+                return new ModelAndView("confirm.html", map);
+        });
     }
 }

+ 3 - 0
src/main/java/com/xjrsoft/module/system/dto/DictionaryDetailListDto.java

@@ -1,5 +1,6 @@
 package com.xjrsoft.module.system.dto;
 
+import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import org.hibernate.validator.constraints.Length;
 
@@ -17,4 +18,6 @@ public class DictionaryDetailListDto {
     private String code;
 
     private Long itemId;
+
+    private String pCode;
 }

+ 111 - 0
src/main/java/com/xjrsoft/module/system/entity/OauthClientDetails.java

@@ -0,0 +1,111 @@
+package com.xjrsoft.module.system.entity;
+
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.github.yulichang.annotation.EntityMapping;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import java.io.Serializable;
+import java.time.LocalTime;
+import java.time.LocalDateTime;
+import java.math.BigDecimal;
+import java.util.List;
+import java.util.Date;
+
+
+/**
+* @title: oauth用户列表
+* @Author fanxp
+* @Date: 2023-11-08
+* @Version 1.0
+*/
+@Data
+@TableName("oauth_client_details")
+@ApiModel(value = "oauth用户列表对象", description = "oauth用户列表")
+public class OauthClientDetails implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+    * 主键编号
+    */
+    @ApiModelProperty("主键编号")
+    @TableId
+    private Long id;
+    /**
+    * 应用标识
+    */
+    @ApiModelProperty("应用标识")
+    private String clientId;
+    /**
+    * 应用名称
+    */
+    @ApiModelProperty("应用名称")
+    private String clientName;
+    /**
+    * 应用密钥
+    */
+    @ApiModelProperty("应用密钥")
+    private String clientSecret;
+    /**
+    * 应用允许授权的所有URL, 多个用逗号隔开
+    */
+    @ApiModelProperty("应用允许授权的所有URL, 多个用逗号隔开")
+    private String allowUrl;
+    /**
+    * 应用签约的所有权限, 多个用逗号隔开
+    */
+    @ApiModelProperty("应用签约的所有权限, 多个用逗号隔开")
+    private String scope;
+    /**
+    * 令牌时效(s)
+    */
+    @ApiModelProperty("令牌时效(s)")
+    private Long accessTokenTimeout;
+    /**
+    * 刷新时效(s)
+    */
+    @ApiModelProperty("刷新时效(s)")
+    private Long refreshTokenValiditySeconds;
+    /**
+    * 授权模式
+    */
+    @ApiModelProperty("授权模式")
+    private String authorizedGrantTypes;
+    /**
+    * 状态 1=启用 2=禁用
+    */
+    @ApiModelProperty("状态 1=启用 2=禁用")
+    private Integer status;
+    /**
+    * 创建时间
+    */
+    @ApiModelProperty("创建时间")
+    @TableField(fill = FieldFill.INSERT)
+    private Date createDate;
+    /**
+    * 修改时间
+    */
+    @ApiModelProperty("修改时间")
+    @TableField(fill = FieldFill.UPDATE)
+    private Date modifyDate;
+    /**
+    * 删除标记
+    */
+    @ApiModelProperty("删除标记")
+    @TableField(fill = FieldFill.INSERT)
+    @TableLogic
+    private Integer deleteMark;
+    /**
+    * 有效标志
+    */
+    @ApiModelProperty("有效标志")
+    @TableField(fill = FieldFill.INSERT)
+    private Integer enabledMark;
+
+
+}

+ 17 - 0
src/main/java/com/xjrsoft/module/system/mapper/OauthClientDetailsMapper.java

@@ -0,0 +1,17 @@
+package com.xjrsoft.module.system.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.github.yulichang.base.MPJBaseMapper;
+import com.xjrsoft.module.system.entity.OauthClientDetails;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+* @title: oauth用户列表
+* @Author fanxp
+* @Date: 2023-11-08
+* @Version 1.0
+*/
+@Mapper
+public interface OauthClientDetailsMapper extends BaseMapper<OauthClientDetails> {
+
+}

+ 3 - 0
src/main/java/com/xjrsoft/module/system/service/ILoginService.java

@@ -6,6 +6,7 @@ import com.xjrsoft.module.system.dto.LoginCaptchaDto;
 import com.xjrsoft.module.system.dto.LoginDto;
 import com.xjrsoft.module.system.vo.CreateTokenVo;
 import com.xjrsoft.module.system.vo.ImgCaptchaVo;
+import com.xjrsoft.module.system.vo.LoginByCodeVo;
 import com.xjrsoft.module.system.vo.LoginVo;
 import org.springframework.stereotype.Service;
 
@@ -19,6 +20,8 @@ public interface ILoginService {
 
     LoginVo loginByCode(LoginByCodeDto dto) throws Exception;
 
+    LoginByCodeVo bindOpenid(LoginByCodeDto dto) throws Exception;
+
     LoginVo loginByCaptcha(LoginCaptchaDto dto) throws Exception;
 
     CreateTokenVo createToken(CreateTokenDto dto);

+ 17 - 0
src/main/java/com/xjrsoft/module/system/service/IOauthClientDetailsService.java

@@ -0,0 +1,17 @@
+package com.xjrsoft.module.system.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.github.yulichang.base.MPJBaseService;
+import com.xjrsoft.module.system.entity.OauthClientDetails;
+import lombok.Data;
+import java.util.List;
+
+/**
+* @title: oauth用户列表
+* @Author fanxp
+* @Date: 2023-11-08
+* @Version 1.0
+*/
+
+public interface IOauthClientDetailsService extends IService<OauthClientDetails> {
+}

+ 13 - 0
src/main/java/com/xjrsoft/module/system/service/impl/LoginServiceImpl.java

@@ -142,6 +142,19 @@ public class LoginServiceImpl implements ILoginService {
         return result;
     }
 
+    @Override
+    public LoginByCodeVo bindOpenid(LoginByCodeDto dto) throws Exception {
+        LoginByCodeVo result = new LoginByCodeVo();
+        String[] ids = weChatUtil.getMpOpenid(dto.getCode());
+        if (ids == null) throw new MyException("code无效");
+        User user = userService.getOne(Wrappers.lambdaQuery(User.class).eq(User::getUnionId, ids[1]));
+        if (user == null) throw new MyException("code无效");
+        user.setOpenId(ids[0]);
+        userService.updateById(user);
+        result.setToken(ids[0]);
+        return result;
+    }
+
     /**
      * 手机验证码登录
      *

+ 25 - 0
src/main/java/com/xjrsoft/module/system/service/impl/OauthClientDetailsServiceImpl.java

@@ -0,0 +1,25 @@
+package com.xjrsoft.module.system.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.github.yulichang.base.MPJBaseServiceImpl;
+import com.xjrsoft.module.system.entity.OauthClientDetails;
+import com.xjrsoft.module.system.mapper.OauthClientDetailsMapper;
+import com.xjrsoft.module.system.service.IOauthClientDetailsService;
+import lombok.AllArgsConstructor;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import java.util.List;
+import java.util.Objects;
+import java.util.stream.Collectors;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+
+/**
+* @title: oauth用户列表
+* @Author fanxp
+* @Date: 2023-11-08
+* @Version 1.0
+*/
+@Service
+@AllArgsConstructor
+public class OauthClientDetailsServiceImpl extends ServiceImpl<OauthClientDetailsMapper, OauthClientDetails> implements IOauthClientDetailsService {
+}

+ 23 - 9
src/main/java/com/xjrsoft/module/system/service/impl/SaOAuth2TemplateImpl.java

@@ -3,6 +3,13 @@ package com.xjrsoft.module.system.service.impl;
 import cn.dev33.satoken.oauth2.logic.SaOAuth2Template;
 import cn.dev33.satoken.oauth2.model.SaClientModel;
 import cn.dev33.satoken.stp.StpUtil;
+import com.baomidou.mybatisplus.core.conditions.Wrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.xjrsoft.common.exception.MyException;
+import com.xjrsoft.module.system.entity.Datasource;
+import com.xjrsoft.module.system.entity.OauthClientDetails;
+import com.xjrsoft.module.system.service.IOauthClientDetailsService;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
 /**
@@ -10,19 +17,26 @@ import org.springframework.stereotype.Component;
  */
 @Component
 public class SaOAuth2TemplateImpl extends SaOAuth2Template {
+
+    @Autowired
+    private IOauthClientDetailsService oauthClientDetailsService;
+
     // 根据 id 获取 Client 信息
     @Override
     public SaClientModel getClientModel(String clientId) {
-        // 此为模拟数据,真实环境需要从数据库查询
-        if("1001".equals(clientId)) {
-            return new SaClientModel()
-                    .setClientId("1001")
-                    .setClientSecret("aaaa-bbbb-cccc-dddd-eeee")
-                    .setAllowUrl("https://sa-token.cc")
-                    .setContractScope("userinfo")
-                    .setIsAutoMode(true);
+        OauthClientDetails oauthClientDetails = oauthClientDetailsService.getOne(Wrappers.<OauthClientDetails>query().lambda()
+                .eq(OauthClientDetails::getClientId, clientId)
+                .eq(OauthClientDetails::getStatus, 1));
+
+        if (oauthClientDetails == null) {
+            throw new MyException("找不到此数据");
         }
-        return null;
+        return new SaClientModel()
+                .setClientId(oauthClientDetails.getClientId())
+                .setClientSecret(oauthClientDetails.getClientSecret())
+                .setAllowUrl(oauthClientDetails.getAllowUrl())
+                .setContractScope(oauthClientDetails.getScope())
+                .setIsAutoMode(true);
     }
 
     // 根据ClientId 和 LoginId 获取openid

+ 5 - 4
src/main/resources/application-dev.yml

@@ -61,10 +61,10 @@ xjrsoft:
     druid-account: admin # druid 监控账户
     druid-password: admin # druid 监控密码
     default-password: "000000" #默认密码(用户重置密码后为该密码)
-    domain-api: https://test.tl.web.yingcaibx.com/api #api域名地址
-    domain-web: https://test.tl.web.yingcaibx.com #web域名地址
-#    domain-api: http://127.0.0.1:9000/api #api域名地址
-#    domain-web: http://127.0.0.1:9000 #web域名地址
+#    domain-api: https://test.tl.web.yingcaibx.com/api #api域名地址
+#    domain-web: https://test.tl.web.yingcaibx.com #web域名地址
+    domain-api: http://127.0.0.1:9000/api #api域名地址
+    domain-web: http://127.0.0.1:9000 #web域名地址
     white-list:
       - 192.168.0.139
     exclude-urls:
@@ -88,6 +88,7 @@ xjrsoft:
       - /system/loginByCode #编号登录
       - /organization/user/register # 注册
       - /oauth2/* # oauth2
+      - /system/bindOpenid # 绑定openid
   email:
     host:  #邮件服务器的SMTP地址,可选,默认为smtp.<发件人邮箱后缀>
     port:  # 邮件服务器的SMTP端口,可选,默认25

+ 1 - 0
src/main/resources/application-prod.yml

@@ -86,6 +86,7 @@ xjrsoft:
       - /system/loginByCode #编号登录
       - /organization/user/register # 注册
       - /oauth2/* # oauth2
+      - /system/bindOpenid # 绑定openid
   email:
     host:  #邮件服务器的SMTP地址,可选,默认为smtp.<发件人邮箱后缀>
     port:  # 邮件服务器的SMTP端口,可选,默认25

+ 18 - 7
src/main/resources/sqlScript/init_sql.sql

@@ -1065,17 +1065,28 @@ create table file_receive
 ) engine=innodb default charset=utf8mb4 COLLATE = utf8mb4_0900_ai_ci comment '文件接收管理';
 
 -- ----------------------------
--- APP 流程单独配置
+-- APP端功能模块管理
 -- ----------------------------
-drop table if exists base_app_workflow_config;
-create table base_app_workflow_config
+drop table if exists base_app_function;
+create table base_app_function
 (
     id bigint not null comment '主键编号',
-    `name` varchar(100) NULL DEFAULT NULL COMMENT '名称',
-    `code` varchar(20) NULL DEFAULT NULL COMMENT '编号 统一标识,手机端根据标识查询',
-    `workflow_id`  bigint NULL DEFAULT NULL COMMENT '流程ID',
+    `create_user_id` bigint NULL DEFAULT NULL COMMENT '创建人',
     `create_date` date NULL DEFAULT NULL COMMENT '创建时间',
+    `modify_user_id` bigint NULL DEFAULT NULL COMMENT '修改人',
+    `modify_date` date NULL DEFAULT NULL COMMENT '修改时间',
+    `delete_mark` int NOT NULL COMMENT '删除标记',
+    `enabled_mark` int NOT NULL COMMENT '有效标志',
+    `type` varchar(20) NULL DEFAULT NULL COMMENT '功能分类(xjr_dictionary_item[APPFUNC])',
+    `name` varchar(100) NULL DEFAULT NULL COMMENT '名称',
+    `icon` varchar(100) NULL DEFAULT NULL COMMENT '图标',
+    `prefix` varchar(50) NULL DEFAULT NULL COMMENT '图标前缀',
+    `color` varchar(10) NULL DEFAULT NULL COMMENT '图标颜色',
+    `schema_id` bigint NULL DEFAULT NULL COMMENT '模板ID',
+    `sort_code` int NULL DEFAULT NULL COMMENT '排序',
+    `is_directory`  int NULL DEFAULT NULL COMMENT '菜单类型 0=菜单 1=目录',
+    `url` varchar(100) NULL DEFAULT NULL COMMENT '功能地址',
     primary key (`id`)
-) engine=innodb default charset=utf8mb4 COLLATE = utf8mb4_0900_ai_ci comment 'APP 流程单独配置';
+) engine=innodb default charset=utf8mb4 COLLATE = utf8mb4_0900_ai_ci comment 'APP端功能模块管理';
 
 SET FOREIGN_KEY_CHECKS = 1;

+ 31 - 3
src/test/java/com/xjrsoft/xjrsoftboot/FreeMarkerGeneratorTest.java

@@ -81,7 +81,7 @@ public class FreeMarkerGeneratorTest {
         params.setPage(true);
         params.setImport(true);
         params.setExport(true);
-        params.setOutMainDir(true);
+        params.setOutMainDir(false);
         params.setDs(ds);
 
 
@@ -328,10 +328,10 @@ public class FreeMarkerGeneratorTest {
 
 
     @Test
-    public void gcAppWorkflowConfig() throws IOException {
+    public void gcAppFunction() throws IOException {
         List<TableConfig> tableConfigs = new ArrayList<>();
         TableConfig mainTable = new TableConfig();
-        mainTable.setTableName("base_app_workflow_config");
+        mainTable.setTableName("base_app_function");
         mainTable.setIsMain(true);
         mainTable.setPkField(GlobalConstant.DEFAULT_PK);
         mainTable.setPkType(GlobalConstant.DEFAULT_PK_TYPE);
@@ -342,6 +342,33 @@ public class FreeMarkerGeneratorTest {
         params.setAuthor("fanxp");
         params.setPackageName("app");
         params.setTableConfigs(tableConfigs);
+        params.setPage(true);
+        params.setImport(false);
+        params.setExport(false);
+        params.setOutMainDir(false);
+        params.setDs(ds);
+
+
+        IApiGeneratorService apiGeneratorService = new ApiGeneratorServiceImpl();
+
+        apiGeneratorService.generateCodes(params);
+    }
+
+    @Test
+    public void gcOauthFunction() throws IOException {
+        List<TableConfig> tableConfigs = new ArrayList<>();
+        TableConfig mainTable = new TableConfig();
+        mainTable.setTableName("oauth_client_details");
+        mainTable.setIsMain(true);
+        mainTable.setPkField(GlobalConstant.DEFAULT_PK);
+        mainTable.setPkType(GlobalConstant.DEFAULT_PK_TYPE);
+
+        tableConfigs.add(mainTable);
+
+        ApiGenerateCodesDto params = new ApiGenerateCodesDto();
+        params.setAuthor("fanxp");
+        params.setPackageName("system");
+        params.setTableConfigs(tableConfigs);
         params.setPage(false);
         params.setImport(false);
         params.setExport(false);
@@ -353,4 +380,5 @@ public class FreeMarkerGeneratorTest {
 
         apiGeneratorService.generateCodes(params);
     }
+
 }