问题修改 11.09

master
zhc077 2 weeks ago
parent 5002adaa4b
commit 9882772f86
  1. 90
      jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/LoginController.java
  2. 1136
      jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/controller/SysDepartController.java
  3. 3
      jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/entity/SysUser.java
  4. 20
      jeecgboot-vue3/src/views/declarant/user.data.ts
  5. 7
      jeecgboot-vue3/src/views/declarantUnit/declarantUnitList.vue
  6. 17
      jeecgboot-vue3/src/views/system/depart/components/DepartLeftTree.vue
  7. 4
      jeecgboot-vue3/src/views/system/depart/depart.api.ts
  8. 9
      jeecgboot-vue3/src/views/system/depart/depart.data.ts
  9. 9
      jeecgboot-vue3/src/views/system/departUser/depart.user.data.ts
  10. 1
      jeecgboot-vue3/types/store.d.ts

@ -4,10 +4,12 @@ import cn.hutool.core.util.RandomUtil;
import com.alibaba.fastjson.JSONObject;
import com.aliyuncs.exceptions.ClientException;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.IdWorker;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.ObjectUtils;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authz.annotation.RequiresRoles;
import org.jeecg.common.api.vo.Result;
@ -21,10 +23,7 @@ import org.jeecg.common.util.*;
import org.jeecg.common.util.encryption.EncryptedString;
import org.jeecg.config.JeecgBaseConfig;
import org.jeecg.modules.base.service.BaseCommonService;
import org.jeecg.modules.system.entity.SysDepart;
import org.jeecg.modules.system.entity.SysRoleIndex;
import org.jeecg.modules.system.entity.SysTenant;
import org.jeecg.modules.system.entity.SysUser;
import org.jeecg.modules.system.entity.*;
import org.jeecg.modules.system.model.SysLoginModel;
import org.jeecg.modules.system.service.*;
import org.jeecg.modules.system.service.impl.SysBaseApiImpl;
@ -38,7 +37,6 @@ import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.*;
import java.util.stream.Collectors;
/**
* @Author scott
@ -68,6 +66,12 @@ public class LoginController {
@Autowired
private JeecgBaseConfig jeecgBaseConfig;
@Autowired
private ISysUserRoleService sysUserRoleService;
@Autowired
private ISysRoleService sysRoleService;
private final String BASE_CHECK_CODES = "qwertyuiplkjhgfdsazxcvbnmQWERTYUPLKJHGFDSAZXCVBNM1234567890";
@ApiOperation("登录接口")
@ -99,7 +103,7 @@ public class LoginController {
result.setCode(HttpStatus.PRECONDITION_FAILED.value());
return result;
}
// step.2 校验用户是否存在且有效
LambdaQueryWrapper<SysUser> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(SysUser::getUsername,username);
@ -161,11 +165,19 @@ public class LoginController {
//update-begin---author:liusq ---date:2022-06-29 for:接口返回值修改,同步修改这里的判断逻辑-----------
//update-end---author:scott ---date::2022-06-20 for:vue3前端,支持自定义首页--------------
log.info("2 获取用户信息耗时 (首页面配置)" + (System.currentTimeMillis() - start) + "毫秒");
List<SysUserRole> userRole = sysUserRoleService.list(new QueryWrapper<SysUserRole>().lambda().eq(SysUserRole::getUserId, sysUser.getId()));
if(ObjectUtils.isNotEmpty(userRole)){
String rollId = userRole.get(0).getRoleId();
SysRole sysRole = sysRoleService.getById(rollId);
if(ObjectUtils.isNotEmpty(sysRole)){
sysUser.setRoleCode(sysRole.getRoleCode());
}
}
obj.put("userInfo",sysUser);
obj.put("sysAllDictItems", sysDictService.queryAllDictItems());
log.info("3 获取用户信息耗时 (字典数据)" + (System.currentTimeMillis() - start) + "毫秒");
result.setResult(obj);
result.success("");
}
@ -173,7 +185,7 @@ public class LoginController {
return result;
}
/**
* 退出登录
* @param request
@ -207,7 +219,7 @@ public class LoginController {
return Result.error("Token无效!");
}
}
/**
* 获取访问量
* @return
@ -238,7 +250,7 @@ public class LoginController {
result.success("登录成功");
return result;
}
/**
* 获取访问量
* @return
@ -259,8 +271,8 @@ public class LoginController {
result.setResult(oConvertUtils.toLowerCasePageList(list));
return result;
}
/**
* 登陆成功选择用户当前部门
* @param user
@ -274,7 +286,7 @@ public class LoginController {
LoginUser sysUser = (LoginUser)SecurityUtils.getSubject().getPrincipal();
username = sysUser.getUsername();
}
//获取登录部门
String orgCode= user.getOrgCode();
//获取登录租户
@ -290,7 +302,7 @@ public class LoginController {
/**
* 短信登录接口
*
*
* @param jsonObject
* @return
*/
@ -302,18 +314,18 @@ public class LoginController {
//手机号模式 登录模式: "2" 注册模式: "1"
String smsmode=jsonObject.get("smsmode").toString();
log.info("-------- IP:{}, 手机号:{},获取绑定验证码", clientIp, mobile);
if(oConvertUtils.isEmpty(mobile)){
result.setMessage("手机号不允许为空!");
result.setSuccess(false);
return result;
}
//update-begin-author:taoyan date:2022-9-13 for: VUEN-2245 【漏洞】发现新漏洞待处理20220906
String redisKey = CommonConstant.PHONE_REDIS_KEY_PRE+mobile;
Object object = redisUtil.get(redisKey);
//update-end-author:taoyan date:2022-9-13 for: VUEN-2245 【漏洞】发现新漏洞待处理20220906
if (object != null) {
result.setMessage("验证码10分钟内,仍然有效!");
result.setSuccess(false);
@ -358,7 +370,7 @@ public class LoginController {
}
return result;
}
/**
* smsmode 短信模板方式 0 .登录模板1.注册模板2.忘记密码模板
*/
@ -376,12 +388,12 @@ public class LoginController {
result.setSuccess(false);
return result;
}
//update-begin-author:taoyan date:2022-9-13 for: VUEN-2245 【漏洞】发现新漏洞待处理20220906
//验证码10分钟内有效
redisUtil.set(redisKey, captcha, 600);
//update-end-author:taoyan date:2022-9-13 for: VUEN-2245 【漏洞】发现新漏洞待处理20220906
//update-begin--Author:scott Date:20190812 for:issues#391
//result.setResult(captcha);
//update-end--Author:scott Date:20190812 for:issues#391
@ -394,11 +406,11 @@ public class LoginController {
}
return result;
}
/**
* 手机号登录接口
*
*
* @param jsonObject
* @return
*/
@ -418,7 +430,7 @@ public class LoginController {
if(!result.isSuccess()) {
return result;
}
String smscode = jsonObject.getString("captcha");
//update-begin-author:taoyan date:2022-9-13 for: VUEN-2245 【漏洞】发现新漏洞待处理20220906
@ -469,7 +481,7 @@ public class LoginController {
//3.设置登录用户信息
obj.put("userInfo", sysUser);
//4.设置登录部门
List<SysDepart> departs = sysDepartService.queryUserDeparts(sysUser.getId());
obj.put("departs", departs);
@ -496,7 +508,7 @@ public class LoginController {
obj.put("sysAllDictItems", sysDictService.queryAllDictItems());
}
//end-begin---author:scott ---date:2024-01-05 for:【QQYUN-7802】前端在登录时加载了两次数据字典,建议优化下,避免数据字典太多时可能产生的性能问题 #956---
result.setResult(obj);
result.success("登录成功");
return result;
@ -530,13 +542,13 @@ public class LoginController {
String code = RandomUtil.randomString(BASE_CHECK_CODES,4);
//存到redis中
String lowerCaseCode = code.toLowerCase();
//update-begin-author:taoyan date:2022-9-13 for: VUEN-2245 【漏洞】发现新漏洞待处理20220906
// 加入密钥作为混淆,避免简单的拼接,被外部利用,用户自定义该密钥即可
String origin = lowerCaseCode+key+jeecgBaseConfig.getSignatureSecret();
String realKey = Md5Util.md5Encode(origin, "utf-8");
//update-end-author:taoyan date:2022-9-13 for: VUEN-2245 【漏洞】发现新漏洞待处理20220906
redisUtil.set(realKey, lowerCaseCode, 60);
log.info("获取验证码,Redis key = {},checkCode = {}", realKey, code);
//返回前端
@ -557,11 +569,11 @@ public class LoginController {
@RequiresRoles({"admin"})
@GetMapping(value = "/switchVue3Menu")
public Result<String> switchVue3Menu(HttpServletResponse response) {
Result<String> res = new Result<String>();
Result<String> res = new Result<String>();
sysPermissionService.switchVue3Menu();
return res;
}
/**
* app登录
* @param sysLoginModel
@ -574,7 +586,7 @@ public class LoginController {
String username = sysLoginModel.getUsername();
String password = sysLoginModel.getPassword();
JSONObject obj = new JSONObject();
//update-begin-author:taoyan date:2022-11-7 for: issues/4109 平台用户登录失败锁定用户
if(isLoginFailOvertimes(username)){
return result.error500("该用户登录失败次数过多,请于10分钟后再次登录!");
@ -586,7 +598,7 @@ public class LoginController {
if(!result.isSuccess()) {
return result;
}
//2. 校验用户名或密码是否正确
String userpassword = PasswordUtil.encrypt(username, password, sysUser.getSalt());
String syspassword = sysUser.getPassword();
@ -597,17 +609,17 @@ public class LoginController {
result.error500("用户名或密码错误");
return result;
}
//3.设置登录部门
String orgCode = sysUser.getOrgCode();
if(oConvertUtils.isEmpty(orgCode)) {
//如果当前用户无选择部门 查看部门关联信息
List<SysDepart> departs = sysDepartService.queryUserDeparts(sysUser.getId());
//update-begin-author:taoyan date:20220117 for: JTC-1068【app】新建用户,没有设置部门及角色,点击登录提示暂未归属部,一直在登录页面 使用手机号登录 可正常
if (departs == null || departs.size() == 0) {
/*result.error500("用户暂未归属部门,不可登录!");
return result;*/
}else{
orgCode = departs.get(0).getOrgCode();
@ -625,7 +637,7 @@ public class LoginController {
//5. 设置登录用户信息
obj.put("userInfo", sysUser);
//6. 生成token
String token = JwtUtil.sign(username, syspassword);
// 设置超时时间
@ -799,7 +811,7 @@ public class LoginController {
return result;
}
/**
* 图形验证码
* @param sysLoginModel
@ -824,5 +836,5 @@ public class LoginController {
redisUtil.removeAll(realKey);
return Result.ok();
}
}
}

@ -222,4 +222,7 @@ public class SysUser implements Serializable {
*/
@TableField(exist = false)
private boolean izBindThird;
@TableField(exist = false)
private String roleCode;
}

@ -175,7 +175,7 @@ export const formSchema: FormSchema[] = [
required: true,
component: 'Input',
},
{
/*{
label: '工号',
field: 'workNo',
required: true,
@ -190,7 +190,7 @@ export const formSchema: FormSchema[] = [
componentProps: {
labelKey: 'name',
},
},
},*/
{
label: '角色',
field: 'selectedroles',
@ -234,7 +234,7 @@ export const formSchema: FormSchema[] = [
};
},
},
{
/*{
label: '租户',
field: 'relTenantIds',
component: 'ApiSelect',
@ -263,8 +263,8 @@ export const formSchema: FormSchema[] = [
},
};
},
},
{
},*/
/*{
label: '负责部门',
field: 'departIds',
component: 'Select',
@ -272,7 +272,7 @@ export const formSchema: FormSchema[] = [
mode: 'multiple',
},
ifShow: ({ values }) => values.userIdentity == 2,
},
},*/
{
label: '头像',
field: 'avatar',
@ -320,13 +320,13 @@ export const formSchema: FormSchema[] = [
];
},
},
{
/*{
label: '座机',
field: 'telephone',
component: 'Input',
rules: [{ pattern: /^0\d{2,3}-[1-9]\d{6,7}$/, message: '请输入正确的座机号码' }],
},
{
},*/
/*{
label: '工作流引擎',
field: 'activitiSync',
defaultValue: 1,
@ -336,7 +336,7 @@ export const formSchema: FormSchema[] = [
type: 'radio',
stringToNumber: true,
},
},
},*/
];
export const formPasswordSchema: FormSchema[] = [

@ -58,6 +58,8 @@ import {useMessage} from "@/hooks/web/useMessage";
const queryParam = reactive<any>({});
const checkedKeys = ref<Array<string | number>>([]);
const userStore = useUserStore();
// console.log("userStore.getUserInfo---",JSON.stringify(userStore.getUserInfo))
// console.log("userStore.getRoleList---",userStore.getRoleList)
const {createMessage, createConfirm} = useMessage();
//model
@ -180,7 +182,7 @@ function getTableAction(record) {
// },
{
label: '驳回',
ifShow: record.status == 1,
ifShow: userStore.getUserInfo.roleCode !='faren_admin' && record.status == 1,
popConfirm: {
title: '确定驳回吗?',
confirm: handleFrozen.bind(null, record, 0),
@ -188,7 +190,7 @@ function getTableAction(record) {
},
{
label: '通过',
ifShow: record.status == 0,
ifShow: userStore.getUserInfo.roleCode !='faren_admin' && record.status == 0,
popConfirm: {
title: '确定通过吗?',
confirm: handleFrozen.bind(null, record, 1),
@ -196,6 +198,7 @@ function getTableAction(record) {
},
{
label: '删除',
ifShow: userStore.getUserInfo.roleCode !='faren_admin',
popConfirm: {
title: '是否确认删除',
confirm: handleDelete.bind(null, record),

@ -3,9 +3,9 @@
<div class="j-table-operator" style="width: 100%">
<a-button type="primary" preIcon="ant-design:plus-outlined" @click="onAddDepart">新增</a-button>
<a-button type="primary" preIcon="ant-design:plus-outlined" @click="onAddChildDepart()">添加下级</a-button>
<a-upload name="file" :showUploadList="false" :customRequest="onImportXls">
<!-- <a-upload name="file" :showUploadList="false" :customRequest="onImportXls">
<a-button type="primary" preIcon="ant-design:import-outlined">导入</a-button>
</a-upload>
</a-upload>-->
<a-button type="primary" preIcon="ant-design:export-outlined" @click="onExportXls">导出</a-button>
<!-- <a-button type="primary" preIcon="ant-design:sync-outlined">同步企微?</a-button>
<a-button type="primary" preIcon="ant-design:sync-outlined">同步钉钉?</a-button>-->
@ -92,10 +92,11 @@
import { useModal } from '/@/components/Modal';
import { useMessage } from '/@/hooks/web/useMessage';
import { useMethods } from '/@/hooks/system/useMethods';
import { Api, deleteBatchDepart, queryDepartTreeSync } from '../depart.api';
import { Api, deleteBatchDepart, queryDepartTreeSync4ZhuGuanBuMen } from '../depart.api';
import { searchByKeywords } from '/@/views/system/departUser/depart.user.api';
import DepartFormModal from '/@/views/system/depart/components/DepartFormModal.vue';
import { Popconfirm } from 'ant-design-vue';
import {useUserStore} from "@/store/modules/user";
const prefixCls = inject('prefixCls');
const emit = defineEmits(['select', 'rootTreeData']);
@ -124,13 +125,16 @@
// modal
const [registerModal, { openModal }] = useModal();
const userStore = useUserStore();
//
async function loadRootTreeData() {
try {
loading.value = true;
treeData.value = [];
const result = await queryDepartTreeSync();
const result = await queryDepartTreeSync4ZhuGuanBuMen({
parentOrgCode: userStore.getUserInfo.orgCode,
});
if (Array.isArray(result)) {
treeData.value = result;
}
@ -158,8 +162,9 @@
//
async function loadChildrenTreeData(treeNode) {
try {
const result = await queryDepartTreeSync({
pid: treeNode.dataRef.id,
const result = await queryDepartTreeSync4ZhuGuanBuMen({
// pid: treeNode.dataRef.id,
parentOrgCode: treeNode.dataRef.orgCode,
});
if (result.length == 0) {
treeNode.dataRef.isLeaf = true;

@ -6,6 +6,7 @@ const { createConfirm } = useMessage();
export enum Api {
queryDepartTreeSync = '/sys/sysDepart/queryDepartTreeSync',
queryDepartTreeSync4ZhuGuanBuMen = '/sys/sysDepart/queryDepartTreeSync4ZhuGuanBuMen',
save = '/sys/sysDepart/add',
edit = '/sys/sysDepart/edit',
delete = '/sys/sysDepart/delete',
@ -31,6 +32,9 @@ export enum Api {
*/
export const queryDepartTreeSync = (params?) => defHttp.get({ url: Api.queryDepartTreeSync, params });
// add by zhc 11.09
export const queryDepartTreeSync4ZhuGuanBuMen = (params?) => defHttp.get({ url: Api.queryDepartTreeSync4ZhuGuanBuMen, params });
/**
* 保存或者更新部门角色
*/

@ -81,10 +81,13 @@ export function useBasicFormSchema() {
//
export const orgCategoryOptions = {
//
root: [{ value: '1', label: '公司' }],
// root: [{ value: '1', label: '' }],
root: [{ value: '1', label: '管理单位' }],
//
child: [
{ value: '2', label: '部门' },
{ value: '3', label: '岗位' },
// { value: '2', label: '' },
{ value: '2', label: '直属法人单位' },
// { value: '3', label: '' },
{ value: '3', label: '县区法人单位' },
],
};

@ -163,11 +163,14 @@ export function useBaseInfoForm(treeData: Ref<any[]>) {
label: '机构类型',
render(val) {
if (val === '1') {
return '公司';
// return '';
return '管理单位';
} else if (val === '2') {
return '部门';
// return '';
return '直属法人单位';
} else if (val === '3') {
return '岗位';
// return '';
return '县区法人单位';
}
return val;
},

@ -40,6 +40,7 @@ export interface UserInfo {
homePath?: string;
tenantid?: string | number;
roles: RoleInfo[];
roleCode: string;
orgCode?: string;
}

Loading…
Cancel
Save