forked from wangjiadong/comp
Merge branch 'main' of http://182.92.169.222:3000/zhc077/hnjd_comp
commit
f97967a920
33 changed files with 4436 additions and 856 deletions
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,351 @@ |
||||
package org.jeecg.modules.demo.seteacher.controller; |
||||
|
||||
import java.util.*; |
||||
import java.util.stream.Collectors; |
||||
import java.io.IOException; |
||||
import java.io.UnsupportedEncodingException; |
||||
import java.net.URLDecoder; |
||||
import javax.servlet.http.HttpServletRequest; |
||||
import javax.servlet.http.HttpServletResponse; |
||||
|
||||
import com.alibaba.fastjson.JSONObject; |
||||
import org.apache.shiro.SecurityUtils; |
||||
import org.jeecg.common.api.vo.Result; |
||||
import org.jeecg.common.constant.CommonConstant; |
||||
import org.jeecg.common.system.query.QueryGenerator; |
||||
import org.jeecg.common.system.vo.LoginUser; |
||||
import org.jeecg.common.util.PasswordUtil; |
||||
import org.jeecg.common.util.oConvertUtils; |
||||
import org.jeecg.modules.base.service.BaseCommonService; |
||||
import org.jeecg.modules.demo.compexp.entity.CompExp; |
||||
import org.jeecg.modules.demo.expert.entity.Expert; |
||||
import org.jeecg.modules.demo.seteacher.entity.Seteacher; |
||||
import org.jeecg.modules.demo.seteacher.service.ISeteacherService; |
||||
|
||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; |
||||
import com.baomidou.mybatisplus.core.metadata.IPage; |
||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; |
||||
import lombok.extern.slf4j.Slf4j; |
||||
|
||||
import org.jeecg.modules.system.entity.*; |
||||
import org.jeecg.modules.system.service.ISysDictService; |
||||
import org.jeecg.modules.system.service.ISysRoleService; |
||||
import org.jeecg.modules.system.service.ISysUserRoleService; |
||||
import org.jeecg.modules.system.service.ISysUserService; |
||||
import org.jeecgframework.poi.excel.ExcelImportUtil; |
||||
import org.jeecgframework.poi.excel.def.NormalExcelConstants; |
||||
import org.jeecgframework.poi.excel.entity.ExportParams; |
||||
import org.jeecgframework.poi.excel.entity.ImportParams; |
||||
import org.jeecgframework.poi.excel.view.JeecgEntityExcelView; |
||||
import org.jeecg.common.system.base.controller.JeecgController; |
||||
import org.springframework.beans.factory.annotation.Autowired; |
||||
import org.springframework.web.bind.annotation.*; |
||||
import org.springframework.web.multipart.MultipartFile; |
||||
import org.springframework.web.multipart.MultipartHttpServletRequest; |
||||
import org.springframework.web.servlet.ModelAndView; |
||||
import com.alibaba.fastjson.JSON; |
||||
import io.swagger.annotations.Api; |
||||
import io.swagger.annotations.ApiOperation; |
||||
import org.jeecg.common.aspect.annotation.AutoLog; |
||||
import org.apache.shiro.authz.annotation.RequiresPermissions; |
||||
|
||||
/** |
||||
* @Description: seteacher |
||||
* @Author: jeecg-boot |
||||
* @Date: 2024-08-23 |
||||
* @Version: V1.0 |
||||
*/ |
||||
@Api(tags="seteacher") |
||||
@RestController |
||||
@RequestMapping("/seteacher/seteacher") |
||||
@Slf4j |
||||
public class SeteacherController extends JeecgController<Seteacher, ISeteacherService> { |
||||
@Autowired |
||||
private ISeteacherService seteacherService; |
||||
@Autowired |
||||
private BaseCommonService baseCommonService; |
||||
@Autowired |
||||
private ISysUserService sysUserService; |
||||
@Autowired |
||||
private ISysUserRoleService sysUserRoleService; |
||||
@Autowired |
||||
private ISysRoleService sysRoleService; |
||||
@Autowired |
||||
private ISysDictService sysDictService; |
||||
|
||||
/** |
||||
* 分页列表查询 |
||||
* |
||||
* @param seteacher |
||||
* @param pageNo |
||||
* @param pageSize |
||||
* @param req |
||||
* @return |
||||
*/ |
||||
//@AutoLog(value = "seteacher-分页列表查询")
|
||||
@ApiOperation(value="seteacher-分页列表查询", notes="seteacher-分页列表查询") |
||||
@GetMapping(value = "/list") |
||||
public Result<IPage<Seteacher>> queryPageList(Seteacher seteacher, |
||||
@RequestParam(name="pageNo", defaultValue="1") Integer pageNo, |
||||
@RequestParam(name="pageSize", defaultValue="10") Integer pageSize, |
||||
HttpServletRequest req) { |
||||
QueryWrapper<Seteacher> queryWrapper = QueryGenerator.initQueryWrapper(seteacher, req.getParameterMap()); |
||||
Page<Seteacher> page = new Page<Seteacher>(pageNo, pageSize); |
||||
IPage<Seteacher> pageList = seteacherService.page(page, queryWrapper); |
||||
return Result.OK(pageList); |
||||
} |
||||
|
||||
/** |
||||
* 添加教师信息 |
||||
* |
||||
* @param seteacher |
||||
* @return |
||||
*/ |
||||
@AutoLog(value = "seteacher-添加") |
||||
@ApiOperation(value="seteacher-添加", notes="seteacher-添加") |
||||
@RequiresPermissions("seteacher:seteacher:add") |
||||
@PostMapping(value = "/add") |
||||
public Result<String> add(@RequestBody Seteacher seteacher) { |
||||
seteacherService.save(seteacher); |
||||
return Result.OK("添加成功!"); |
||||
} |
||||
|
||||
@RequestMapping(value = "/addTEA", method = RequestMethod.POST) |
||||
public Result<SysUser> addZJ(@RequestBody JSONObject jsonObject) { |
||||
LoginUser userss= (LoginUser) SecurityUtils.getSubject().getPrincipal(); |
||||
//设置部门
|
||||
String selectedDeparts =""; |
||||
//根据user查找角色
|
||||
String roles = getRoleByUserId(userss.getId()); |
||||
//如果是学校管理员就就找到当前设置的院系,如果是院系管理员就直接获取所在院系
|
||||
if (roles.equals("superAdmin")){ |
||||
selectedDeparts = jsonObject.getString("selecteddeparts"); |
||||
}else{ |
||||
String roleid =findroles(userss); |
||||
selectedDeparts = roleid; |
||||
} |
||||
Result<SysUser> result = new Result<SysUser>(); |
||||
// String selectedRoles = jsonObject.getString("selectedroles");
|
||||
String selectedRoles = "1731948288626339844"; |
||||
String expSc = jsonObject.getString("expSc"); |
||||
String expResume = jsonObject.getString("expResume");//简介
|
||||
String expTitle = jsonObject.getString("expTitle"); |
||||
String teamajor = jsonObject.getString("teamajor");//专业
|
||||
String expXw = jsonObject.getString("expXw");//学位
|
||||
String expZc = jsonObject.getString("expZc");//职称
|
||||
String expYjfx = jsonObject.getString("expYjfx");//研究方向
|
||||
String expCsgz = jsonObject.getString("expCsgz");//从事工作
|
||||
try { |
||||
SysUser user = JSON.parseObject(jsonObject.toJSONString(), SysUser.class); |
||||
user.setCreateTime(new Date());//设置创建时间
|
||||
String salt = oConvertUtils.randomGen(8); |
||||
user.setSalt(salt); |
||||
String passwordEncode = PasswordUtil.encrypt(user.getUsername(), user.getPassword(), salt); |
||||
user.setPassword(passwordEncode); |
||||
user.setStatus(1); |
||||
user.setDelFlag(CommonConstant.DEL_FLAG_0); |
||||
//用户表字段org_code不能在这里设置他的值
|
||||
user.setOrgCode(null); |
||||
// 保存用户走一个service 保证事务
|
||||
//获取租户ids
|
||||
String relTenantIds = jsonObject.getString("relTenantIds"); |
||||
sysUserService.saveUser(user, selectedRoles, selectedDeparts, relTenantIds); |
||||
baseCommonService.addLog("添加专家用户,username: " +user.getUsername() ,CommonConstant.LOG_TYPE_2, 2); |
||||
Seteacher expert = new Seteacher(); |
||||
expert.setUserId(user.getId()); |
||||
expert.setExpImg(user.getAvatar()); |
||||
expert.setExpSc(expSc); |
||||
expert.setExpResume(expResume); |
||||
expert.setExpTitle(expTitle); |
||||
expert.setName(user.getRealname()); |
||||
expert.setExpXw(expXw);//学位
|
||||
expert.setExpZc(expZc);//职称
|
||||
expert.setExpYjfx(expYjfx);//研究方向
|
||||
expert.setExpCsgz(expCsgz);//从事工作
|
||||
expert.setTeamajor(teamajor);//专业
|
||||
seteacherService.save(expert); |
||||
result.success("添加成功!"); |
||||
} catch (Exception e) { |
||||
log.error(e.getMessage(), e); |
||||
result.error500("操作失败"); |
||||
} |
||||
return result; |
||||
} |
||||
|
||||
//用于当前登录信息的部门设置
|
||||
private String findroles(LoginUser userss) { |
||||
SysDict sysDict = sysDictService.query().eq("org_code",userss.getOrgCode()).one(); |
||||
return sysDict.getId(); |
||||
|
||||
} |
||||
|
||||
|
||||
/** |
||||
* 1.2根据用户id获取用户角色信息 |
||||
* |
||||
* @param userId |
||||
* @return |
||||
*/ |
||||
public String getRoleByUserId(String userId) { |
||||
SysUserRole userRoleList = sysUserRoleService.query().eq("user_id", userId).one(); |
||||
SysRole sysRole = sysRoleService.getById(userRoleList.getRoleId()); |
||||
|
||||
return sysRole.getRoleCode(); |
||||
} |
||||
|
||||
@RequestMapping(value = "/editTEA", method = {RequestMethod.PUT,RequestMethod.POST}) |
||||
public Result<SysUser> editZJ(@RequestBody JSONObject jsonObject,HttpServletRequest req) { |
||||
Result<SysUser> result = new Result<SysUser>(); |
||||
try { |
||||
SysUser sysUser = sysUserService.getById(jsonObject.getString("id")); |
||||
baseCommonService.addLog("编辑用户,username: " +sysUser.getUsername() ,CommonConstant.LOG_TYPE_2, 2); |
||||
if(sysUser==null) { |
||||
result.error500("未找到对应实体"); |
||||
}else { |
||||
SysUser user = JSON.parseObject(jsonObject.toJSONString(), SysUser.class); |
||||
user.setUpdateTime(new Date()); |
||||
//String passwordEncode = PasswordUtil.encrypt(user.getUsername(), user.getPassword(), sysUser.getSalt());
|
||||
user.setPassword(sysUser.getPassword()); |
||||
String roles = "1731948288626339844"; |
||||
String departs = jsonObject.getString("selecteddeparts"); |
||||
String expSc = jsonObject.getString("expSc"); |
||||
String expResume = jsonObject.getString("expResume"); |
||||
String expTitle = jsonObject.getString("expTitle"); |
||||
String teamajor =jsonObject.getString("teamajor"); |
||||
String expXw = jsonObject.getString("expXw");//学位
|
||||
String expZc = jsonObject.getString("expZc");//职称
|
||||
String expYjfx = jsonObject.getString("expYjfx");//研究方向
|
||||
String expCsgz = jsonObject.getString("expCsgz");//从事工作
|
||||
|
||||
if(oConvertUtils.isEmpty(departs)){ |
||||
//vue3.0前端只传递了departIds
|
||||
departs=user.getDepartIds(); |
||||
} |
||||
//用户表字段org_code不能在这里设置他的值
|
||||
user.setOrgCode(null); |
||||
// 修改用户走一个service 保证事务
|
||||
//获取租户ids
|
||||
String relTenantIds = jsonObject.getString("relTenantIds"); |
||||
sysUserService.editUser(user, roles, departs, relTenantIds); |
||||
Seteacher expert = new Seteacher(); |
||||
QueryWrapper<Seteacher> queryWrapper = QueryGenerator.initQueryWrapper(expert, req.getParameterMap()); |
||||
queryWrapper.eq("user_id",user.getId()); |
||||
List<Seteacher> listex = seteacherService.list(queryWrapper); |
||||
expert = listex.get(0); |
||||
expert.setUserId(user.getId()); |
||||
expert.setExpImg(user.getAvatar()); |
||||
expert.setExpSc(expSc); |
||||
expert.setExpResume(expResume); |
||||
expert.setExpTitle(expTitle); |
||||
expert.setName(user.getRealname()); |
||||
expert.setExpXw(expXw);//学位
|
||||
expert.setTeamajor(teamajor);//专业
|
||||
expert.setExpZc(expZc);//职称
|
||||
expert.setExpYjfx(expYjfx);//研究方向
|
||||
expert.setExpCsgz(expCsgz);//从事工作
|
||||
|
||||
seteacherService.updateById(expert); |
||||
result.success("修改成功!"); |
||||
} |
||||
} catch (Exception e) { |
||||
log.error(e.getMessage(), e); |
||||
result.error500("操作失败"); |
||||
} |
||||
return result; |
||||
} |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/** |
||||
* 编辑 |
||||
* |
||||
* @param seteacher |
||||
* @return |
||||
*/ |
||||
@AutoLog(value = "seteacher-编辑") |
||||
@ApiOperation(value="seteacher-编辑", notes="seteacher-编辑") |
||||
@RequiresPermissions("seteacher:seteacher:edit") |
||||
@RequestMapping(value = "/edit", method = {RequestMethod.PUT,RequestMethod.POST}) |
||||
public Result<String> edit(@RequestBody Seteacher seteacher) { |
||||
seteacherService.updateById(seteacher); |
||||
return Result.OK("编辑成功!"); |
||||
} |
||||
|
||||
/** |
||||
* 通过id删除 |
||||
* |
||||
* @param id |
||||
* @return |
||||
*/ |
||||
@AutoLog(value = "seteacher-通过id删除") |
||||
@ApiOperation(value="seteacher-通过id删除", notes="seteacher-通过id删除") |
||||
@RequiresPermissions("seteacher:seteacher:delete") |
||||
@DeleteMapping(value = "/delete") |
||||
public Result<String> delete(@RequestParam(name="id",required=true) String id) { |
||||
seteacherService.removeById(id); |
||||
return Result.OK("删除成功!"); |
||||
} |
||||
|
||||
/** |
||||
* 批量删除 |
||||
* |
||||
* @param ids |
||||
* @return |
||||
*/ |
||||
@AutoLog(value = "seteacher-批量删除") |
||||
@ApiOperation(value="seteacher-批量删除", notes="seteacher-批量删除") |
||||
@RequiresPermissions("seteacher:seteacher:deleteBatch") |
||||
@DeleteMapping(value = "/deleteBatch") |
||||
public Result<String> deleteBatch(@RequestParam(name="ids",required=true) String ids) { |
||||
this.seteacherService.removeByIds(Arrays.asList(ids.split(","))); |
||||
return Result.OK("批量删除成功!"); |
||||
} |
||||
|
||||
/** |
||||
* 通过id查询 |
||||
* |
||||
* @param id |
||||
* @return |
||||
*/ |
||||
//@AutoLog(value = "seteacher-通过id查询")
|
||||
@ApiOperation(value="seteacher-通过id查询", notes="seteacher-通过id查询") |
||||
@GetMapping(value = "/queryById") |
||||
public Result<Seteacher> queryById(@RequestParam(name="id",required=true) String id,HttpServletRequest req) { |
||||
Seteacher seteacher = new Seteacher(); |
||||
QueryWrapper<Seteacher> queryWrapper = QueryGenerator.initQueryWrapper(seteacher, req.getParameterMap()); |
||||
queryWrapper.eq("user_id",id); |
||||
seteacher=seteacherService.getOne(queryWrapper); |
||||
if(seteacher==null) { |
||||
return Result.error("未找到对应数据"); |
||||
} |
||||
return Result.OK(seteacher); |
||||
} |
||||
|
||||
/** |
||||
* 导出excel |
||||
* |
||||
* @param request |
||||
* @param seteacher |
||||
*/ |
||||
@RequiresPermissions("seteacher:seteacher:exportXls") |
||||
@RequestMapping(value = "/exportXls") |
||||
public ModelAndView exportXls(HttpServletRequest request, Seteacher seteacher) { |
||||
return super.exportXls(request, seteacher, Seteacher.class, "seteacher"); |
||||
} |
||||
|
||||
/** |
||||
* 通过excel导入数据 |
||||
* |
||||
* @param request |
||||
* @param response |
||||
* @return |
||||
*/ |
||||
@RequiresPermissions("seteacher:seteacher:importExcel") |
||||
@RequestMapping(value = "/importExcel", method = RequestMethod.POST) |
||||
public Result<?> importExcel(HttpServletRequest request, HttpServletResponse response) { |
||||
return super.importExcel(request, response, Seteacher.class); |
||||
} |
||||
|
||||
} |
@ -0,0 +1,102 @@ |
||||
package org.jeecg.modules.demo.seteacher.entity; |
||||
|
||||
import java.io.Serializable; |
||||
import java.io.UnsupportedEncodingException; |
||||
import java.util.Date; |
||||
import java.math.BigDecimal; |
||||
import com.baomidou.mybatisplus.annotation.IdType; |
||||
import com.baomidou.mybatisplus.annotation.TableId; |
||||
import com.baomidou.mybatisplus.annotation.TableName; |
||||
import com.baomidou.mybatisplus.annotation.TableLogic; |
||||
import lombok.Data; |
||||
import com.fasterxml.jackson.annotation.JsonFormat; |
||||
import org.springframework.format.annotation.DateTimeFormat; |
||||
import org.jeecgframework.poi.excel.annotation.Excel; |
||||
import org.jeecg.common.aspect.annotation.Dict; |
||||
import io.swagger.annotations.ApiModel; |
||||
import io.swagger.annotations.ApiModelProperty; |
||||
import lombok.EqualsAndHashCode; |
||||
import lombok.experimental.Accessors; |
||||
|
||||
/** |
||||
* @Description: seteacher |
||||
* @Author: jeecg-boot |
||||
* @Date: 2024-08-23 |
||||
* @Version: V1.0 |
||||
*/ |
||||
@Data |
||||
@TableName("seteacher") |
||||
@Accessors(chain = true) |
||||
@EqualsAndHashCode(callSuper = false) |
||||
@ApiModel(value="seteacher对象", description="seteacher") |
||||
public class Seteacher implements Serializable { |
||||
private static final long serialVersionUID = 1L; |
||||
|
||||
/**id*/ |
||||
@TableId(type = IdType.ASSIGN_ID) |
||||
@ApiModelProperty(value = "id") |
||||
private String id; |
||||
/**创建人*/ |
||||
@ApiModelProperty(value = "创建人") |
||||
private String createBy; |
||||
/**创建日期*/ |
||||
@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss") |
||||
@DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") |
||||
@ApiModelProperty(value = "创建日期") |
||||
private Date createTime; |
||||
/**更新人*/ |
||||
@ApiModelProperty(value = "更新人") |
||||
private String updateBy; |
||||
/**更新日期*/ |
||||
@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss") |
||||
@DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") |
||||
@ApiModelProperty(value = "更新日期") |
||||
private Date updateTime; |
||||
/**所属部门*/ |
||||
@ApiModelProperty(value = "所属部门") |
||||
private String sysOrgCode; |
||||
/**用户id*/ |
||||
@Excel(name = "用户id", width = 15) |
||||
@ApiModelProperty(value = "用户id") |
||||
private String userId; |
||||
/**专家照片*/ |
||||
@Excel(name = "专家照片", width = 15) |
||||
@ApiModelProperty(value = "专家照片") |
||||
private String expImg; |
||||
/**专家毕业院校*/ |
||||
@Excel(name = "专家毕业院校", width = 15) |
||||
@ApiModelProperty(value = "专家毕业院校") |
||||
private String expSc; |
||||
/**简介*/ |
||||
@Excel(name = "简介", width = 15) |
||||
@ApiModelProperty(value = "简介") |
||||
private String expResume; |
||||
/**专家学历*/ |
||||
@Excel(name = "专家学历", width = 15) |
||||
@ApiModelProperty(value = "专家学历") |
||||
private String expTitle; |
||||
/**学位*/ |
||||
@Excel(name = "学位", width = 15) |
||||
@ApiModelProperty(value = "学位") |
||||
private String expXw; |
||||
/**职称*/ |
||||
@Excel(name = "职称", width = 15) |
||||
@ApiModelProperty(value = "职称") |
||||
private String expZc; |
||||
/**研究方向*/ |
||||
@Excel(name = "研究方向", width = 15) |
||||
@ApiModelProperty(value = "研究方向") |
||||
private String expYjfx; |
||||
/**从事工作*/ |
||||
@Excel(name = "从事工作", width = 15) |
||||
@ApiModelProperty(value = "从事工作") |
||||
private String expCsgz; |
||||
/**专家名称*/ |
||||
@Excel(name = "专家名称", width = 15) |
||||
@ApiModelProperty(value = "专家名称") |
||||
private String name; |
||||
/**专业*/ |
||||
@Excel(name = "专业", width = 15) |
||||
@ApiModelProperty(value = "专业") |
||||
private String teamajor; |
||||
} |
@ -0,0 +1,17 @@ |
||||
package org.jeecg.modules.demo.seteacher.mapper; |
||||
|
||||
import java.util.List; |
||||
|
||||
import org.apache.ibatis.annotations.Param; |
||||
import org.jeecg.modules.demo.seteacher.entity.Seteacher; |
||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper; |
||||
|
||||
/** |
||||
* @Description: seteacher |
||||
* @Author: jeecg-boot |
||||
* @Date: 2024-08-23 |
||||
* @Version: V1.0 |
||||
*/ |
||||
public interface SeteacherMapper extends BaseMapper<Seteacher> { |
||||
|
||||
} |
@ -0,0 +1,5 @@ |
||||
<?xml version="1.0" encoding="UTF-8"?> |
||||
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> |
||||
<mapper namespace="org.jeecg.modules.demo.seteacher.mapper.SeteacherMapper"> |
||||
|
||||
</mapper> |
@ -0,0 +1,14 @@ |
||||
package org.jeecg.modules.demo.seteacher.service; |
||||
|
||||
import org.jeecg.modules.demo.seteacher.entity.Seteacher; |
||||
import com.baomidou.mybatisplus.extension.service.IService; |
||||
|
||||
/** |
||||
* @Description: seteacher |
||||
* @Author: jeecg-boot |
||||
* @Date: 2024-08-23 |
||||
* @Version: V1.0 |
||||
*/ |
||||
public interface ISeteacherService extends IService<Seteacher> { |
||||
|
||||
} |
@ -0,0 +1,19 @@ |
||||
package org.jeecg.modules.demo.seteacher.service.impl; |
||||
|
||||
import org.jeecg.modules.demo.seteacher.entity.Seteacher; |
||||
import org.jeecg.modules.demo.seteacher.mapper.SeteacherMapper; |
||||
import org.jeecg.modules.demo.seteacher.service.ISeteacherService; |
||||
import org.springframework.stereotype.Service; |
||||
|
||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; |
||||
|
||||
/** |
||||
* @Description: seteacher |
||||
* @Author: jeecg-boot |
||||
* @Date: 2024-08-23 |
||||
* @Version: V1.0 |
||||
*/ |
||||
@Service |
||||
public class SeteacherServiceImpl extends ServiceImpl<SeteacherMapper, Seteacher> implements ISeteacherService { |
||||
|
||||
} |
@ -0,0 +1,42 @@ |
||||
<template> |
||||
<BasicModal v-bind="$attrs" @register="registerModal" title="修改密码" @ok="handleSubmit"> |
||||
<BasicForm @register="registerForm" /> |
||||
</BasicModal> |
||||
</template> |
||||
<script lang="ts" name="PassWordModal" setup> |
||||
import { ref, computed, unref } from 'vue'; |
||||
import { BasicModal, useModalInner } from '/src/components/Modal'; |
||||
import { BasicForm, useForm } from '/src/components/Form'; |
||||
import { formPasswordSchema } from './user.data'; |
||||
import { changePassword } from './user.api'; |
||||
// 声明Emits |
||||
const emit = defineEmits(['success', 'register']); |
||||
//表单配置 |
||||
const [registerForm, { resetFields, setFieldsValue, validate }] = useForm({ |
||||
schemas: formPasswordSchema, |
||||
showActionButtonGroup: false, |
||||
}); |
||||
//表单赋值 |
||||
const [registerModal, { setModalProps, closeModal }] = useModalInner(async (data) => { |
||||
//重置表单 |
||||
await resetFields(); |
||||
setModalProps({ confirmLoading: false }); |
||||
//表单赋值 |
||||
await setFieldsValue({ ...data }); |
||||
}); |
||||
//表单提交事件 |
||||
async function handleSubmit() { |
||||
try { |
||||
const values = await validate(); |
||||
setModalProps({ confirmLoading: true }); |
||||
//提交表单 |
||||
await changePassword(values); |
||||
//关闭弹窗 |
||||
closeModal(); |
||||
//刷新列表 |
||||
emit('success'); |
||||
} finally { |
||||
setModalProps({ confirmLoading: false }); |
||||
} |
||||
} |
||||
</script> |
@ -0,0 +1,45 @@ |
||||
<template> |
||||
<BasicModal v-bind="$attrs" @register="registerModal" :width="800" title="用户代理" @ok="handleSubmit"> |
||||
<BasicForm @register="registerForm" /> |
||||
</BasicModal> |
||||
</template> |
||||
<script lang="ts" setup> |
||||
import { ref, computed, unref } from 'vue'; |
||||
import { BasicModal, useModalInner } from '/src/components/Modal'; |
||||
import { BasicForm, useForm } from '/src/components/Form'; |
||||
import { formAgentSchema } from './user.data'; |
||||
import { getUserAgent, saveOrUpdateAgent } from './user.api'; |
||||
// 声明Emits |
||||
const emit = defineEmits(['success', 'register']); |
||||
//表单配置 |
||||
const [registerForm, { resetFields, setFieldsValue, validate }] = useForm({ |
||||
schemas: formAgentSchema, |
||||
showActionButtonGroup: false, |
||||
}); |
||||
//表单赋值 |
||||
const [registerModal, { setModalProps, closeModal }] = useModalInner(async (data) => { |
||||
//重置表单 |
||||
await resetFields(); |
||||
setModalProps({ confirmLoading: false }); |
||||
//查询获取表单数据 |
||||
const res = await getUserAgent({ userName: data.userName }); |
||||
data = res.result ? res.result : data; |
||||
//表单赋值 |
||||
await setFieldsValue({ ...data }); |
||||
}); |
||||
//表单提交事件 |
||||
async function handleSubmit() { |
||||
try { |
||||
const values = await validate(); |
||||
setModalProps({ confirmLoading: true }); |
||||
//提交表单 |
||||
await saveOrUpdateAgent(values); |
||||
//关闭弹窗 |
||||
closeModal(); |
||||
//刷新列表 |
||||
emit('success'); |
||||
} finally { |
||||
setModalProps({ confirmLoading: false }); |
||||
} |
||||
} |
||||
</script> |
@ -0,0 +1,184 @@ |
||||
<template> |
||||
<BasicDrawer |
||||
v-bind="$attrs" |
||||
@register="registerDrawer" |
||||
:title="getTitle" |
||||
:width="adaptiveWidth" |
||||
@ok="handleSubmit" |
||||
:showFooter="showFooter" |
||||
destroyOnClose |
||||
> |
||||
<BasicForm @register="registerForm" /> |
||||
</BasicDrawer> |
||||
</template> |
||||
<script lang="ts" setup> |
||||
import { defineComponent, ref, computed, unref, useAttrs } from 'vue'; |
||||
import { BasicForm, useForm } from '/src/components/Form'; |
||||
import { formSchema } from './user.data'; |
||||
import { BasicDrawer, useDrawerInner } from '/src/components/Drawer'; |
||||
import { saveOrUpdateUser, getUserRoles, getUserDepartList, getAllRolesListNoByExcludeTenant, getAllRolesList } from './user.api'; |
||||
import { useDrawerAdaptiveWidth } from '/src/hooks/jeecg/useAdaptiveWidth'; |
||||
import { getTenantId } from "/src/utils/auth"; |
||||
import {saveOrUpdateUserZJ} from "./userZJ.api"; |
||||
import {queryExpertById} from "./userZJ.api"; |
||||
|
||||
// 声明Emits |
||||
const emit = defineEmits(['success', 'register']); |
||||
const attrs = useAttrs(); |
||||
const isUpdate = ref(true); |
||||
const rowId = ref(''); |
||||
const departOptions = ref([]); |
||||
//表单配置 |
||||
const [registerForm, { setProps, resetFields, setFieldsValue, validate, updateSchema }] = useForm({ |
||||
labelWidth: 90, |
||||
schemas: formSchema, |
||||
showActionButtonGroup: false, |
||||
}); |
||||
// TODO [VUEN-527] https://www.teambition.com/task/6239beb894b358003fe93626 |
||||
const showFooter = ref(true); |
||||
//表单赋值 |
||||
const [registerDrawer, { setDrawerProps, closeDrawer }] = useDrawerInner(async (data) => { |
||||
await resetFields(); |
||||
showFooter.value = data?.showFooter ?? true; |
||||
setDrawerProps({ confirmLoading: false, showFooter: showFooter.value }); |
||||
isUpdate.value = !!data?.isUpdate; |
||||
if (unref(isUpdate)) { |
||||
rowId.value = data.record.id; |
||||
//租户信息定义成数组 |
||||
if (data.record.relTenantIds && !Array.isArray(data.record.relTenantIds)) { |
||||
data.record.relTenantIds = data.record.relTenantIds.split(','); |
||||
} else { |
||||
//【issues/I56C5I】用户管理中连续点两次编辑租户配置就丢失了 |
||||
//data.record.relTenantIds = []; |
||||
} |
||||
|
||||
//查角色/赋值/try catch 处理,不然编辑有问题 |
||||
try { |
||||
const userRoles = await getUserRoles({ userid: data.record.id }); |
||||
if (userRoles && userRoles.length > 0) { |
||||
data.record.selectedroles = userRoles; |
||||
} |
||||
} catch (error) {} |
||||
|
||||
try { |
||||
const Expert = await queryExpertById({ id: data.record.id }); |
||||
console.log(Expert); |
||||
if (Expert!=null) { |
||||
data.record.expSc = Expert.expSc; |
||||
data.record.expResume = Expert.expResume; |
||||
data.record.expTitle = Expert.expTitle; |
||||
data.record.compid = Expert.compid; |
||||
data.record.compName = Expert.compName; |
||||
data.record.stat = Expert.stat; |
||||
data.record.teamajor = Expert.teamajor; |
||||
data.record.expXw = Expert.expXw; |
||||
data.record.expZc = Expert.expZc; |
||||
data.record.expYjfx = Expert.expYjfx; |
||||
data.record.expCsgz = Expert.expCsgz; |
||||
|
||||
|
||||
} |
||||
} catch (error) {} |
||||
|
||||
|
||||
//查所属部门/赋值 |
||||
const userDepart = await getUserDepartList({ userId: data.record.id }); |
||||
if (userDepart && userDepart.length > 0) { |
||||
data.record.selecteddeparts = userDepart; |
||||
let selectDepartKeys = Array.from(userDepart, ({ key }) => key); |
||||
data.record.selecteddeparts = selectDepartKeys.join(','); |
||||
departOptions.value = userDepart.map((item) => { |
||||
return { label: item.title, value: item.key }; |
||||
}); |
||||
} |
||||
//负责部门/赋值 |
||||
data.record.departIds && !Array.isArray(data.record.departIds) && (data.record.departIds = data.record.departIds.split(',')); |
||||
//update-begin---author:zyf Date:20211210 for:避免空值显示异常------------ |
||||
data.record.departIds = data.record.departIds == '' ? [] : data.record.departIds; |
||||
//update-begin---author:zyf Date:20211210 for:避免空值显示异常------------ |
||||
} |
||||
//处理角色用户列表情况(和角色列表有关系) |
||||
data.selectedroles && (await setFieldsValue({ selectedroles: data.selectedroles })); |
||||
//编辑时隐藏密码/角色列表隐藏角色信息/我的部门时隐藏所属部门 |
||||
updateSchema([ |
||||
{ |
||||
field: 'password', |
||||
show: !unref(isUpdate), |
||||
}, |
||||
{ |
||||
field: 'confirmPassword', |
||||
ifShow: !unref(isUpdate), |
||||
}, |
||||
// { |
||||
// field: 'selectedroles', |
||||
// show: !data.isRole, |
||||
// }, |
||||
{ |
||||
field: 'departIds', |
||||
componentProps: { options: departOptions }, |
||||
}, |
||||
{ |
||||
field: 'selecteddeparts', |
||||
show: !data?.departDisabled ?? false, |
||||
}, |
||||
// { |
||||
// field: 'selectedroles', |
||||
// show:false, |
||||
// }, |
||||
{ |
||||
field: 'selectedroles', |
||||
show: !data?.departDisabled ?? false, |
||||
//update-begin---author:wangshuai ---date:20230424 for:【issues/4844】多租户模式下,新增或编辑用户,选择角色一栏,角色选项没有做租户隔离------------ |
||||
//判断是否为多租户模式 |
||||
componentProps:{ |
||||
api: data.tenantSaas?getAllRolesList:getAllRolesListNoByExcludeTenant |
||||
} |
||||
//update-end---author:wangshuai ---date:20230424 for:【issues/4844】多租户模式下,新增或编辑用户,选择角色一栏,角色选项没有做租户隔离------------ |
||||
}, |
||||
//update-begin---author:wangshuai ---date:20230522 for:【issues/4935】租户用户编辑界面中租户下拉框未过滤,显示当前系统所有的租户------------ |
||||
{ |
||||
field: 'relTenantIds', |
||||
componentProps:{ |
||||
disabled: !!data.tenantSaas, |
||||
}, |
||||
}, |
||||
//update-end---author:wangshuai ---date:20230522 for:【issues/4935】租户用户编辑界面中租户下拉框未过滤,显示当前系统所有的租户------------ |
||||
]); |
||||
//update-begin---author:wangshuai ---date:20230522 for:【issues/4935】租户用户编辑界面中租户下拉框未过滤,显示当前系统所有的租户------------ |
||||
if(!unref(isUpdate) && data.tenantSaas){ |
||||
await setFieldsValue({ relTenantIds: getTenantId().toString() }) |
||||
} |
||||
//update-end---author:wangshuai ---date:20230522 for:【issues/4935】租户用户编辑界面中租户下拉框未过滤,显示当前系统所有的租户------------ |
||||
// 无论新增还是编辑,都可以设置表单值 |
||||
if (typeof data.record === 'object') { |
||||
setFieldsValue({ |
||||
...data.record, |
||||
}); |
||||
} |
||||
// 隐藏底部时禁用整个表单 |
||||
//update-begin-author:taoyan date:2022-5-24 for: VUEN-1117【issue】0523周开源问题 |
||||
setProps({ disabled: !showFooter.value }); |
||||
//update-end-author:taoyan date:2022-5-24 for: VUEN-1117【issue】0523周开源问题 |
||||
}); |
||||
//获取标题 |
||||
const getTitle = computed(() => (!unref(isUpdate) ? '新增用户' : '编辑用户')); |
||||
const { adaptiveWidth } = useDrawerAdaptiveWidth(); |
||||
|
||||
//提交事件 |
||||
async function handleSubmit() { |
||||
try { |
||||
let values = await validate(); |
||||
setDrawerProps({ confirmLoading: true }); |
||||
values.userIdentity === 1 && (values.departIds = ''); |
||||
let isUpdateVal = unref(isUpdate); |
||||
//提交表单 |
||||
await saveOrUpdateUserZJ(values, isUpdateVal); |
||||
//关闭弹窗 |
||||
closeDrawer(); |
||||
//刷新列表 |
||||
emit('success',{isUpdateVal ,values}); |
||||
} finally { |
||||
setDrawerProps({ confirmLoading: false }); |
||||
} |
||||
} |
||||
</script> |
@ -0,0 +1,68 @@ |
||||
<template> |
||||
<BasicModal v-bind="$attrs" @register="registerModal" :width="800" title="离职交接" @ok="handleSubmit"> |
||||
<BasicForm @register="registerForm" /> |
||||
</BasicModal> |
||||
</template> |
||||
<script lang="ts" setup name="user-quit-agent-modal"> |
||||
import { BasicModal, useModalInner } from '/src/components/Modal'; |
||||
import { BasicForm, useForm } from '/src/components/Form'; |
||||
import { formQuitAgentSchema } from './user.data'; |
||||
import { getUserAgent, userQuitAgent } from './user.api'; |
||||
import dayjs from 'dayjs'; |
||||
// 声明Emits |
||||
const emit = defineEmits(['success', 'register']); |
||||
//表单配置 |
||||
const [registerForm, { resetFields, setFieldsValue, validate, clearValidate }] = useForm({ |
||||
schemas: formQuitAgentSchema, |
||||
showActionButtonGroup: false, |
||||
}); |
||||
//表单赋值 |
||||
const [registerModal, { setModalProps, closeModal }] = useModalInner(async (data) => { |
||||
//重置表单 |
||||
await resetFields(); |
||||
setModalProps({ confirmLoading: false }); |
||||
setModalProps({ confirmLoading: false }); |
||||
//查询获取表单数据 |
||||
const res = await getUserAgent({ userName: data.userName }); |
||||
data = res.result ? res.result : data; |
||||
let date = new Date(); |
||||
if (!data.startTime) { |
||||
data.startTime = dayjs(date).format('YYYY-MM-DD HH:mm:ss'); |
||||
} |
||||
if (!data.endTime) { |
||||
data.endTime = getYear(date); |
||||
} |
||||
//表单赋值 |
||||
await setFieldsValue({ ...data }); |
||||
}); |
||||
//表单提交事件 |
||||
async function handleSubmit() { |
||||
try { |
||||
const values = await validate(); |
||||
setModalProps({ confirmLoading: true }); |
||||
//提交表单 |
||||
await userQuitAgent(values); |
||||
//关闭弹窗 |
||||
closeModal(); |
||||
//刷新列表 |
||||
emit('success'); |
||||
} finally { |
||||
setModalProps({ confirmLoading: false }); |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* 获取后30年 |
||||
*/ |
||||
function getYear(date) { |
||||
//update-begin---author:wangshuai ---date:20221207 for:[QQYUN-3285]交接人设置 结束时间有问题------------ |
||||
//这是一个数值 |
||||
let y = date.getFullYear() + 30; |
||||
let m = dayjs(date).format('MM'); |
||||
let d = dayjs(date).format('DD'); |
||||
let hour = dayjs(date).format('HH:mm:ss'); |
||||
console.log('年月日', y + '-' + m + '-' + d); |
||||
return dayjs(y + '-' + m + '-' + d + ' ' + hour).format('YYYY-MM-DD HH:mm:ss'); |
||||
//update-end---author:wangshuai ---date:20221207 for:[QQYUN-3285]交接人设置 结束时间有问题-------------- |
||||
} |
||||
</script> |
@ -0,0 +1,110 @@ |
||||
<template> |
||||
<BasicModal v-bind="$attrs" @register="registerModal" title="离职人员信息" :showOkBtn="false" width="1000px" destroyOnClose> |
||||
<BasicTable @register="registerTable" :rowSelection="rowSelection"> |
||||
<!--插槽:table标题--> |
||||
<template #tableTitle> |
||||
<a-dropdown v-if="selectedRowKeys.length > 0"> |
||||
<template #overlay> |
||||
<a-menu> |
||||
<a-menu-item key="1" @click="batchHandleRevert"> |
||||
<Icon icon="ant-design:redo-outlined"></Icon> |
||||
批量取消 |
||||
</a-menu-item> |
||||
</a-menu> |
||||
</template> |
||||
<a-button |
||||
>批量操作 |
||||
<Icon icon="ant-design:down-outlined"></Icon> |
||||
</a-button> |
||||
</a-dropdown> |
||||
</template> |
||||
<!--操作栏--> |
||||
<template #action="{ record }"> |
||||
<TableAction :actions="getTableAction(record)" /> |
||||
</template> |
||||
</BasicTable> |
||||
</BasicModal> |
||||
</template> |
||||
|
||||
<script lang="ts" setup name="user-quit-modal"> |
||||
import { ref, toRaw, unref } from 'vue'; |
||||
import { BasicModal, useModalInner } from '/src/components/Modal'; |
||||
import { BasicTable, useTable, TableAction } from '/src/components/Table'; |
||||
import { recycleColumns } from './user.data'; |
||||
import { getQuitList, putCancelQuit, deleteRecycleBin } from './user.api'; |
||||
import { useMessage } from '/src/hooks/web/useMessage'; |
||||
import { useListPage } from '/src/hooks/system/useListPage'; |
||||
import { Modal } from 'ant-design-vue'; |
||||
import { defHttp } from '/src/utils/http/axios'; |
||||
|
||||
const { createConfirm } = useMessage(); |
||||
// 声明Emits |
||||
const emit = defineEmits(['success', 'register']); |
||||
const checkedKeys = ref<Array<string | number>>([]); |
||||
const [registerModal] = useModalInner(() => { |
||||
checkedKeys.value = []; |
||||
}); |
||||
//注册table数据 |
||||
const { prefixCls, tableContext } = useListPage({ |
||||
tableProps: { |
||||
api: getQuitList, |
||||
columns: recycleColumns, |
||||
rowKey: 'id', |
||||
canResize: false, |
||||
useSearchForm: false, |
||||
actionColumn: { |
||||
width: 120, |
||||
}, |
||||
}, |
||||
}); |
||||
//注册table数据 |
||||
const [registerTable, { reload }, { rowSelection, selectedRowKeys, selectedRows }] = tableContext; |
||||
|
||||
/** |
||||
* 取消离职事件 |
||||
* @param record |
||||
*/ |
||||
async function handleCancelQuit(record) { |
||||
await putCancelQuit({ userIds: record.id, usernames: record.username }, reload); |
||||
emit('success'); |
||||
} |
||||
/** |
||||
* 批量取消离职事件 |
||||
*/ |
||||
function batchHandleRevert() { |
||||
Modal.confirm({ |
||||
title: '取消离职', |
||||
content: '取消离职交接人也会清空', |
||||
okText: '确认', |
||||
cancelText: '取消', |
||||
onOk: () => { |
||||
let rowValue = selectedRows.value; |
||||
let rowData: any = []; |
||||
for (const value of rowValue) { |
||||
rowData.push(value.username); |
||||
} |
||||
handleCancelQuit({ id: toRaw(unref(selectedRowKeys)).join(','), username: rowData.join(',') }); |
||||
}, |
||||
}); |
||||
} |
||||
|
||||
//获取操作栏事件 |
||||
function getTableAction(record) { |
||||
return [ |
||||
{ |
||||
label: '取消离职', |
||||
icon: 'ant-design:redo-outlined', |
||||
popConfirm: { |
||||
title: '是否取消离职,取消离职交接人也会清空', |
||||
confirm: handleCancelQuit.bind(null, record), |
||||
}, |
||||
}, |
||||
]; |
||||
} |
||||
</script> |
||||
|
||||
<style scoped lang="less"> |
||||
:deep(.ant-popover-inner-content){ |
||||
width: 185px !important; |
||||
} |
||||
</style> |
@ -0,0 +1,138 @@ |
||||
<template> |
||||
<BasicModal v-bind="$attrs" @register="registerModal" title="用户回收站" :showOkBtn="false" width="1000px" destroyOnClose> |
||||
<BasicTable @register="registerTable" :rowSelection="rowSelection"> |
||||
<!--插槽:table标题--> |
||||
<template #tableTitle> |
||||
<a-dropdown v-if="checkedKeys.length > 0"> |
||||
<template #overlay> |
||||
<a-menu> |
||||
<a-menu-item key="1" @click="batchHandleDelete"> |
||||
<Icon icon="ant-design:delete-outlined"></Icon> |
||||
批量删除 |
||||
</a-menu-item> |
||||
<a-menu-item key="1" @click="batchHandleRevert"> |
||||
<Icon icon="ant-design:redo-outlined"></Icon> |
||||
批量还原 |
||||
</a-menu-item> |
||||
</a-menu> |
||||
</template> |
||||
<a-button |
||||
>批量操作 |
||||
<Icon icon="ant-design:down-outlined"></Icon> |
||||
</a-button> |
||||
</a-dropdown> |
||||
</template> |
||||
<!--操作栏--> |
||||
<template #bodyCell="{ column, record }"> |
||||
<template v-if="column.key === 'action'"> |
||||
<TableAction :actions="getTableAction(record)" /> |
||||
</template> |
||||
</template> |
||||
</BasicTable> |
||||
</BasicModal> |
||||
</template> |
||||
<script lang="ts" setup> |
||||
import { ref, toRaw, unref } from 'vue'; |
||||
import { BasicModal, useModalInner } from '/src/components/Modal'; |
||||
import { BasicTable, useTable, TableAction } from '/src/components/Table'; |
||||
import { recycleColumns } from './user.data'; |
||||
import { getRecycleBinList, putRecycleBin, deleteRecycleBin } from './user.api'; |
||||
import { useMessage } from '/src/hooks/web/useMessage'; |
||||
|
||||
const { createConfirm } = useMessage(); |
||||
// 声明Emits |
||||
const emit = defineEmits(['success', 'register']); |
||||
const checkedKeys = ref<Array<string | number>>([]); |
||||
const [registerModal] = useModalInner(() => { |
||||
checkedKeys.value = []; |
||||
}); |
||||
//注册table数据 |
||||
const [registerTable, { reload }] = useTable({ |
||||
api: getRecycleBinList, |
||||
columns: recycleColumns, |
||||
rowKey: 'id', |
||||
striped: true, |
||||
useSearchForm: false, |
||||
showTableSetting: false, |
||||
clickToRowSelect: false, |
||||
bordered: true, |
||||
showIndexColumn: false, |
||||
pagination: true, |
||||
tableSetting: { fullScreen: true }, |
||||
canResize: false, |
||||
actionColumn: { |
||||
width: 150, |
||||
title: '操作', |
||||
dataIndex: 'action', |
||||
// slots: { customRender: 'action' }, |
||||
fixed: undefined, |
||||
}, |
||||
}); |
||||
/** |
||||
* 选择列配置 |
||||
*/ |
||||
const rowSelection = { |
||||
type: 'checkbox', |
||||
columnWidth: 50, |
||||
selectedRowKeys: checkedKeys, |
||||
onChange: onSelectChange, |
||||
}; |
||||
/** |
||||
* 选择事件 |
||||
*/ |
||||
function onSelectChange(selectedRowKeys: (string | number)[]) { |
||||
checkedKeys.value = selectedRowKeys; |
||||
} |
||||
/** |
||||
* 还原事件 |
||||
*/ |
||||
async function handleRevert(record) { |
||||
await putRecycleBin({ userIds: record.id }, reload); |
||||
emit('success'); |
||||
} |
||||
/** |
||||
* 批量还原事件 |
||||
*/ |
||||
function batchHandleRevert() { |
||||
handleRevert({ id: toRaw(unref(checkedKeys)).join(',') }); |
||||
} |
||||
/** |
||||
* 删除事件 |
||||
*/ |
||||
async function handleDelete(record) { |
||||
await deleteRecycleBin({ userIds: record.id }, reload); |
||||
} |
||||
/** |
||||
* 批量删除事件 |
||||
*/ |
||||
function batchHandleDelete() { |
||||
createConfirm({ |
||||
iconType: 'warning', |
||||
title: '删除', |
||||
content: '确定要永久删除吗?删除后将不可恢复!', |
||||
onOk: () => handleDelete({ id: toRaw(unref(checkedKeys)).join(',') }), |
||||
onCancel() {}, |
||||
}); |
||||
} |
||||
//获取操作栏事件 |
||||
function getTableAction(record) { |
||||
return [ |
||||
{ |
||||
label: '取回', |
||||
icon: 'ant-design:redo-outlined', |
||||
popConfirm: { |
||||
title: '是否确认还原', |
||||
confirm: handleRevert.bind(null, record), |
||||
}, |
||||
}, |
||||
{ |
||||
label: '彻底删除', |
||||
icon: 'ant-design:scissor-outlined', |
||||
popConfirm: { |
||||
title: '是否确认删除', |
||||
confirm: handleDelete.bind(null, record), |
||||
}, |
||||
}, |
||||
]; |
||||
} |
||||
</script> |
@ -0,0 +1,277 @@ |
||||
<template> |
||||
<div> |
||||
<!--引用表格--> |
||||
<BasicTable @register="registerTable" :rowSelection="rowSelection"> |
||||
<!--插槽:table标题--> |
||||
<template #tableTitle> |
||||
<a-button type="primary" preIcon="ant-design:plus-outlined" @click="handleCreate"> 新增</a-button> |
||||
|
||||
<a-button type="primary" preIcon="ant-design:export-outlined" @click="onExportXls"> 导出</a-button> |
||||
<j-upload-button type="primary" preIcon="ant-design:import-outlined" @click="onImportXls" >导入</j-upload-button> |
||||
<a-button type="primary" preIcon="ant-design:export-outlined" @click="onExportXlsMb"> 导入模板</a-button> |
||||
<JThirdAppButton biz-type="user" :selected-row-keys="selectedRowKeys" syncToApp syncToLocal @sync-finally="onSyncFinally" /> |
||||
<a-dropdown v-if="selectedRowKeys.length > 0"> |
||||
<template #overlay> |
||||
<a-menu> |
||||
<a-menu-item key="1" @click="batchHandleDelete"> |
||||
<Icon icon="ant-design:delete-outlined"></Icon> |
||||
删除 |
||||
</a-menu-item> |
||||
<a-menu-item key="2" @click="batchFrozen(2)"> |
||||
<Icon icon="ant-design:lock-outlined"></Icon> |
||||
冻结 |
||||
</a-menu-item> |
||||
<a-menu-item key="3" @click="batchFrozen(1)"> |
||||
<Icon icon="ant-design:unlock-outlined"></Icon> |
||||
解冻 |
||||
</a-menu-item> |
||||
</a-menu> |
||||
</template> |
||||
<a-button |
||||
>批量操作 |
||||
<Icon icon="mdi:chevron-down"></Icon> |
||||
</a-button> |
||||
</a-dropdown> |
||||
</template> |
||||
<!--操作栏--> |
||||
<template #action="{ record }"> |
||||
<TableAction :actions="getTableAction(record)" :dropDownActions="getDropDownAction(record)" /> |
||||
</template> |
||||
</BasicTable> |
||||
<!--用户抽屉--> |
||||
<UserDrawer @register="registerDrawer" @success="handleSuccess" /> |
||||
|
||||
<!--修改密码--> |
||||
<PasswordModal @register="registerPasswordModal" @success="reload" /> |
||||
|
||||
</div> |
||||
</template> |
||||
|
||||
<script lang="ts" name="system-user" setup> |
||||
//ts语法 |
||||
import { ref, computed, unref } from 'vue'; |
||||
import { BasicTable, TableAction, ActionItem } from '/src/components/Table'; |
||||
import UserDrawer from './UserDrawer.vue'; |
||||
import UserRecycleBinModal from './UserRecycleBinModal.vue'; |
||||
import PasswordModal from './PasswordModal.vue'; |
||||
import JThirdAppButton from '/src/components/jeecg/thirdApp/JThirdAppButton.vue'; |
||||
|
||||
import { useDrawer } from '/src/components/Drawer'; |
||||
|
||||
import { useListPage } from '/src/hooks/system/useListPage'; |
||||
import { useModal } from '/src/components/Modal'; |
||||
import { useMessage } from '/src/hooks/web/useMessage'; |
||||
import { columns, searchFormSchema } from './user.data'; |
||||
import { listZjNoCareTenant, deleteUser, batchDeleteUser, getZjImportUrl, getExportZjUrl, frozenBatch, syncUser,queryByUserId,getExportZjUrlMb } from './user.api'; |
||||
import {usePermission} from "/src/hooks/web/usePermission"; |
||||
import {defHttp} from "../../../utils/http/axios"; |
||||
|
||||
const { createMessage, createConfirm } = useMessage(); |
||||
const { isDisabledAuth } = usePermission(); |
||||
//注册drawer |
||||
const [registerDrawer, { openDrawer }] = useDrawer(); |
||||
|
||||
//密码model |
||||
const [registerPasswordModal, { openModal: openPasswordModal }] = useModal(); |
||||
|
||||
|
||||
// 列表页面公共参数、方法 |
||||
const { prefixCls, tableContext, onExportXls, onImportXls,onExportXlsMb } = useListPage({ |
||||
designScope: 'user-list', |
||||
tableProps: { |
||||
title: '用户列表', |
||||
api: listZjNoCareTenant, |
||||
columns: columns, |
||||
size: 'small', |
||||
formConfig: { |
||||
// labelWidth: 200, |
||||
schemas: searchFormSchema, |
||||
}, |
||||
actionColumn: { |
||||
width: 120, |
||||
}, |
||||
beforeFetch: (params) => { |
||||
return Object.assign({ column: 'createTime', order: 'desc' }, params); |
||||
}, |
||||
}, |
||||
exportConfig: { |
||||
name: '专家列表', |
||||
url: getExportZjUrl, |
||||
}, |
||||
/* exportConfigMb: { |
||||
name: "导入模板", |
||||
url: getExportZjUrlMb, |
||||
params: null, |
||||
},*/ |
||||
importConfig: { |
||||
url: getZjImportUrl, |
||||
}, |
||||
}); |
||||
|
||||
//注册table数据 |
||||
const [registerTable, { reload, updateTableDataRecord }, { rowSelection, selectedRows, selectedRowKeys }] = tableContext; |
||||
|
||||
/** |
||||
* 新增事件 |
||||
*/ |
||||
function handleCreate() { |
||||
openDrawer(true, { |
||||
isUpdate: false, |
||||
showFooter: true, |
||||
tenantSaas: false, |
||||
}); |
||||
} |
||||
|
||||
/** |
||||
* 编辑事件 |
||||
*/ |
||||
async function handleEdit(record: Recordable) { |
||||
await queryByUserId({ id: record.id }).then(res => { |
||||
openDrawer(true, { |
||||
record, |
||||
isUpdate: true, |
||||
showFooter: true, |
||||
tenantSaas: false, |
||||
}); |
||||
|
||||
}); |
||||
} |
||||
/** |
||||
* 详情 |
||||
*/ |
||||
async function handleDetail(record: Recordable) { |
||||
await queryByUserId({ id: record.id }).then(res => { |
||||
|
||||
openDrawer(true, { |
||||
record, |
||||
isUpdate: true, |
||||
showFooter: false, |
||||
tenantSaas: false, |
||||
}); |
||||
|
||||
}); |
||||
} |
||||
/** |
||||
* 删除事件 |
||||
*/ |
||||
async function handleDelete(record) { |
||||
if ('admin' == record.username) { |
||||
createMessage.warning('管理员账号不允许此操作!'); |
||||
return; |
||||
} |
||||
await deleteUser({ id: record.id }, reload); |
||||
} |
||||
/** |
||||
* 批量删除事件 |
||||
*/ |
||||
async function batchHandleDelete() { |
||||
let hasAdmin = unref(selectedRows).filter((item) => item.username == 'admin'); |
||||
if (unref(hasAdmin).length > 0) { |
||||
createMessage.warning('管理员账号不允许此操作!'); |
||||
return; |
||||
} |
||||
await batchDeleteUser({ ids: selectedRowKeys.value }, () => { |
||||
selectedRowKeys.value = []; |
||||
reload(); |
||||
}); |
||||
} |
||||
/** |
||||
* 成功回调 |
||||
*/ |
||||
function handleSuccess() { |
||||
reload(); |
||||
} |
||||
|
||||
/** |
||||
* 打开修改密码弹窗 |
||||
*/ |
||||
function handleChangePassword(username) { |
||||
openPasswordModal(true, { username }); |
||||
} |
||||
|
||||
/** |
||||
* 冻结解冻 |
||||
*/ |
||||
async function handleFrozen(record, status) { |
||||
if ('admin' == record.username) { |
||||
createMessage.warning('管理员账号不允许此操作!'); |
||||
return; |
||||
} |
||||
await frozenBatch({ ids: record.id, status: status }, reload); |
||||
} |
||||
/** |
||||
* 批量冻结解冻 |
||||
*/ |
||||
function batchFrozen(status) { |
||||
let hasAdmin = selectedRows.value.filter((item) => item.username == 'admin'); |
||||
if (unref(hasAdmin).length > 0) { |
||||
createMessage.warning('管理员账号不允许此操作!'); |
||||
return; |
||||
} |
||||
createConfirm({ |
||||
iconType: 'warning', |
||||
title: '确认操作', |
||||
content: '是否' + (status == 1 ? '解冻' : '冻结') + '选中账号?', |
||||
onOk: async () => { |
||||
await frozenBatch({ ids: unref(selectedRowKeys).join(','), status: status }, reload); |
||||
}, |
||||
}); |
||||
} |
||||
|
||||
|
||||
/** |
||||
* 操作栏 |
||||
*/ |
||||
function getTableAction(record): ActionItem[] { |
||||
return [ |
||||
{ |
||||
label: '编辑', |
||||
onClick: handleEdit.bind(null, record), |
||||
// ifShow: () => hasPermission('system:user:edit'), |
||||
}, |
||||
]; |
||||
} |
||||
/** |
||||
* 下拉操作栏 |
||||
*/ |
||||
function getDropDownAction(record): ActionItem[] { |
||||
return [ |
||||
{ |
||||
label: '详情', |
||||
onClick: handleDetail.bind(null, record), |
||||
}, |
||||
{ |
||||
label: '密码', |
||||
//auth: 'user:changepwd', |
||||
onClick: handleChangePassword.bind(null, record.username), |
||||
}, |
||||
{ |
||||
label: '删除', |
||||
popConfirm: { |
||||
title: '是否确认删除', |
||||
confirm: handleDelete.bind(null, record), |
||||
}, |
||||
}, |
||||
{ |
||||
label: '冻结', |
||||
ifShow: record.status == 1, |
||||
popConfirm: { |
||||
title: '确定冻结吗?', |
||||
confirm: handleFrozen.bind(null, record, 2), |
||||
}, |
||||
}, |
||||
{ |
||||
label: '解冻', |
||||
ifShow: record.status == 2, |
||||
popConfirm: { |
||||
title: '确定解冻吗?', |
||||
confirm: handleFrozen.bind(null, record, 1), |
||||
}, |
||||
}, |
||||
|
||||
]; |
||||
} |
||||
|
||||
</script> |
||||
|
||||
<style scoped></style> |
@ -0,0 +1,301 @@ |
||||
import { defHttp } from '/src/utils/http/axios'; |
||||
import { Modal } from 'ant-design-vue'; |
||||
|
||||
enum Api { |
||||
listNoCareTenant = '/sys/user/listAll', |
||||
listZjNoCareTenant = '/sys/user/listTEAAll', |
||||
listzdzx = '/sys/user/listzdzx', |
||||
list = '/sys/user/list', |
||||
save = '/sys/user/add', |
||||
edit = '/sys/user/edit', |
||||
saveZJ = '/seteacher/seteacher/addTEA', |
||||
editZJ = '/expert/expert/editZJ', |
||||
queryExpertById = '/expert/expert/queryById', |
||||
agentSave = '/sys/sysUserAgent/add', |
||||
agentEdit = '/sys/sysUserAgent/edit', |
||||
getUserRole = '/sys/user/queryUserRole', |
||||
duplicateCheck = '/sys/duplicate/check', |
||||
deleteUser = '/sys/user/delete', |
||||
deleteBatch = '/sys/user/deleteBatch', |
||||
importExcel = '/sys/user/importExcel', |
||||
exportXls = '/sys/user/exportXls', |
||||
|
||||
recycleBinList = '/sys/user/recycleBin', |
||||
putRecycleBin = '/sys/user/putRecycleBin', |
||||
deleteRecycleBin = '/sys/user/deleteRecycleBin', |
||||
allRolesList = '/sys/role/queryall', |
||||
allRolesListNoByTenant = '/sys/role/queryallNoByTenant', |
||||
allRolesListExcludeByTenant = '/sys/role/queryallExcludeByTenant', |
||||
allTenantList = '/sys/tenant/queryList', |
||||
allPostList = '/sys/position/list', |
||||
userDepartList = '/sys/user/userDepartList', |
||||
changePassword = '/sys/user/changePassword', |
||||
frozenBatch = '/sys/user/frozenBatch', |
||||
getUserAgent = '/sys/sysUserAgent/queryByUserName', |
||||
syncUser = '/act/process/extActProcess/doSyncUser', |
||||
userQuitAgent = '/sys/user/userQuitAgent', |
||||
getQuitList = '/sys/user/getQuitList', |
||||
putCancelQuit = '/sys/user/putCancelQuit', |
||||
updateUserTenantStatus='/sys/tenant/updateUserTenantStatus', |
||||
getUserTenantPageList='/sys/tenant/getUserTenantPageList', |
||||
exportXlsMb = '/sys/user/exportXlsMb', |
||||
//导出专家
|
||||
exportZjXls = '/expert/expert/exportXls', |
||||
//导出专家模板
|
||||
exportZjXlsMb = '/expert/expert/exportXlsMb', |
||||
//导入专家
|
||||
getZjImportUrl = '/expert/expert/importExcel', |
||||
|
||||
queryByUserId = '/expert/expert/queryByUserId', |
||||
} |
||||
/** |
||||
* 根据userid判断是否为专家 |
||||
* @param params |
||||
*/ |
||||
export const queryByUserId = (params) => { |
||||
return defHttp.get({ url: Api.queryByUserId, params },{ successMessageMode: 'none' }); |
||||
}; |
||||
/** |
||||
* 导出api |
||||
* @param params |
||||
*/ |
||||
export const getExportUrl = Api.exportXls; |
||||
|
||||
export const getExportUrlMb = Api.exportXlsMb; |
||||
|
||||
/** |
||||
* 导出 专家 |
||||
*/ |
||||
export const getExportZjUrl = Api.exportZjXls; |
||||
/** |
||||
* 导出 专家模板 |
||||
*/ |
||||
export const getExportZjUrlMb = Api.exportZjXlsMb; |
||||
/** |
||||
* 导入 专家 |
||||
*/ |
||||
export const getZjImportUrl = Api.getZjImportUrl; |
||||
/** |
||||
* 导入api |
||||
*/ |
||||
export const getImportUrl = Api.importExcel; |
||||
/** |
||||
* 列表接口(查询用户,通过租户隔离) |
||||
* @param params |
||||
*/ |
||||
export const list = (params) => defHttp.get({ url: Api.list, params }); |
||||
|
||||
/** |
||||
* 列表接口(查询全部用户,不通过租户隔离) |
||||
* @param params |
||||
*/ |
||||
export const listNoCareTenant = (params) => defHttp.get({ url: Api.listNoCareTenant, params }); |
||||
|
||||
/** |
||||
* 列表接口(查询角色为“专家”,不通过租户隔离) |
||||
* @param params |
||||
*/ |
||||
export const listZjNoCareTenant = (params) => defHttp.get({ url: Api.listZjNoCareTenant, params }); |
||||
|
||||
|
||||
/** |
||||
* 列表接口(查询全部用户,不通过租户隔离) |
||||
* 适用于专家、学生、组委会查看自己的信息 |
||||
* @param params |
||||
*/ |
||||
export const listzdzx = (params) => defHttp.get({ url: Api.listzdzx, params }); |
||||
|
||||
/** |
||||
* 用户角色接口 |
||||
* @param params |
||||
*/ |
||||
export const getUserRoles = (params) => defHttp.get({ url: Api.getUserRole, params }, { errorMessageMode: 'none' }); |
||||
/** |
||||
* 专家信息接口 |
||||
* @param params |
||||
*/ |
||||
export const queryExpertById = (params) => defHttp.get({ url: Api.queryExpertById, params }, { successMessageMode: 'none' }); |
||||
|
||||
|
||||
/** |
||||
* 删除用户 |
||||
*/ |
||||
export const deleteUser = (params, handleSuccess) => { |
||||
return defHttp.delete({ url: Api.deleteUser, params }, { joinParamsToUrl: true }).then(() => { |
||||
handleSuccess(); |
||||
}); |
||||
}; |
||||
/** |
||||
* 批量删除用户 |
||||
* @param params |
||||
*/ |
||||
export const batchDeleteUser = (params, handleSuccess) => { |
||||
Modal.confirm({ |
||||
title: '确认删除', |
||||
content: '是否删除选中数据', |
||||
okText: '确认', |
||||
cancelText: '取消', |
||||
onOk: () => { |
||||
return defHttp.delete({ url: Api.deleteBatch, data: params }, { joinParamsToUrl: true }).then(() => { |
||||
handleSuccess(); |
||||
}); |
||||
}, |
||||
}); |
||||
}; |
||||
/** |
||||
* 保存或者更新用户 |
||||
* @param params |
||||
*/ |
||||
export const saveOrUpdateUser = (params, isUpdate) => { |
||||
let url = isUpdate ? Api.edit : Api.save; |
||||
return defHttp.post({ url: url, params }); |
||||
}; |
||||
/** |
||||
* 保存或者更新专家用户 |
||||
* @param params |
||||
*/ |
||||
export const saveOrUpdateUserZJ = (params, isUpdate) => { |
||||
let url = isUpdate ? Api.editZJ : Api.saveZJ; |
||||
return defHttp.post({ url: url, params }); |
||||
}; |
||||
/** |
||||
* 唯一校验 |
||||
* @param params |
||||
*/ |
||||
export const duplicateCheck = (params) => defHttp.get({ url: Api.duplicateCheck, params }, { isTransformResponse: false }); |
||||
/** |
||||
* 获取全部角色(租户隔离) |
||||
* @param params |
||||
*/ |
||||
export const getAllRolesList = (params) => defHttp.get({ url: Api.allRolesList, params }); |
||||
/** |
||||
* 获取全部角色(不租户隔离) |
||||
* @param params |
||||
*/ |
||||
export const getAllRolesListNoByTenant = (params) => defHttp.get({ url: Api.allRolesListNoByTenant, params }); |
||||
|
||||
|
||||
/** |
||||
* 获取角色(排除:总管理) |
||||
* @param params |
||||
*/ |
||||
export const getAllRolesListNoByExcludeTenant = (params) => defHttp.get({ url: Api.allRolesListExcludeByTenant, params }); |
||||
|
||||
|
||||
/** |
||||
* 获取全部租户 |
||||
*/ |
||||
export const getAllTenantList = (params) => defHttp.get({ url: Api.allTenantList, params }); |
||||
/** |
||||
* 获取指定用户负责部门 |
||||
*/ |
||||
export const getUserDepartList = (params) => defHttp.get({ url: Api.userDepartList, params }, { successMessageMode: 'none' }); |
||||
/** |
||||
* 获取全部职务 |
||||
*/ |
||||
export const getAllPostList = (params) => { |
||||
return new Promise((resolve) => { |
||||
defHttp.get({ url: Api.allPostList, params }).then((res) => { |
||||
resolve(res.records); |
||||
}); |
||||
}); |
||||
}; |
||||
/** |
||||
* 回收站列表 |
||||
* @param params |
||||
*/ |
||||
export const getRecycleBinList = (params) => defHttp.get({ url: Api.recycleBinList, params }); |
||||
/** |
||||
* 回收站还原 |
||||
* @param params |
||||
*/ |
||||
export const putRecycleBin = (params, handleSuccess) => { |
||||
return defHttp.put({ url: Api.putRecycleBin, params }).then(() => { |
||||
handleSuccess(); |
||||
}); |
||||
}; |
||||
/** |
||||
* 回收站删除 |
||||
* @param params |
||||
*/ |
||||
export const deleteRecycleBin = (params, handleSuccess) => { |
||||
return defHttp.delete({ url: Api.deleteRecycleBin, params }, { joinParamsToUrl: true }).then(() => { |
||||
handleSuccess(); |
||||
}); |
||||
}; |
||||
/** |
||||
* 修改密码 |
||||
* @param params |
||||
*/ |
||||
export const changePassword = (params) => { |
||||
return defHttp.put({ url: Api.changePassword, params }); |
||||
}; |
||||
/** |
||||
* 冻结解冻 |
||||
* @param params |
||||
*/ |
||||
export const frozenBatch = (params, handleSuccess) => { |
||||
return defHttp.put({ url: Api.frozenBatch, params }).then(() => { |
||||
handleSuccess(); |
||||
}); |
||||
}; |
||||
/** |
||||
* 获取用户代理 |
||||
* @param params |
||||
*/ |
||||
export const getUserAgent = (params) => defHttp.get({ url: Api.getUserAgent, params }, { isTransformResponse: false }); |
||||
/** |
||||
* 保存或者更新用户代理 |
||||
* @param params |
||||
*/ |
||||
export const saveOrUpdateAgent = (params) => { |
||||
let url = params.id ? Api.agentEdit : Api.agentSave; |
||||
return defHttp.post({ url: url, params }); |
||||
}; |
||||
|
||||
/** |
||||
* 用户同步流程 |
||||
* @param params |
||||
*/ |
||||
export const syncUser = () => defHttp.put({ url: Api.syncUser }); |
||||
|
||||
/** |
||||
* 用户离职(新增代理人和用户状态变更操作) |
||||
* @param params |
||||
*/ |
||||
export const userQuitAgent = (params) => { |
||||
return defHttp.put({ url: Api.userQuitAgent, params }); |
||||
}; |
||||
|
||||
/** |
||||
* 用户离职列表 |
||||
* @param params |
||||
*/ |
||||
export const getQuitList = (params) => { |
||||
return defHttp.get({ url: Api.getQuitList, params }); |
||||
}; |
||||
|
||||
/** |
||||
* 取消离职 |
||||
* @param params |
||||
*/ |
||||
export const putCancelQuit = (params, handleSuccess) => { |
||||
return defHttp.put({ url: Api.putCancelQuit, params }, { joinParamsToUrl: true }).then(() => { |
||||
handleSuccess(); |
||||
}); |
||||
}; |
||||
|
||||
/** |
||||
* 待审批获取列表数据 |
||||
*/ |
||||
export const getUserTenantPageList = (params)=>{ |
||||
return defHttp.get({url:Api.getUserTenantPageList,params}) |
||||
} |
||||
|
||||
/** |
||||
* 更新租户状态 |
||||
* @param params |
||||
*/ |
||||
export const updateUserTenantStatus = (params)=>{ |
||||
return defHttp.put({ url: Api.updateUserTenantStatus, params }, { joinParamsToUrl: true,isTransformResponse: false }); |
||||
} |
@ -0,0 +1,604 @@ |
||||
import { BasicColumn } from '/src/components/Table'; |
||||
import { FormSchema } from '/src/components/Table'; |
||||
import { getAllRolesListNoByTenant,getAllRolesListNoByExcludeTenant, getAllTenantList } from './user.api'; |
||||
import { rules } from '/src/utils/helper/validator'; |
||||
import { render } from '/src/utils/common/renderUtils'; |
||||
export const columns: BasicColumn[] = [ |
||||
{ |
||||
title: '用户账号', |
||||
dataIndex: 'username', |
||||
width: 120, |
||||
}, |
||||
{ |
||||
title: '用户姓名', |
||||
dataIndex: 'realname', |
||||
width: 100, |
||||
}, |
||||
{ |
||||
title: '头像', |
||||
dataIndex: 'avatar', |
||||
width: 120, |
||||
customRender: render.renderAvatar, |
||||
}, |
||||
/*{ |
||||
title: '性别', |
||||
dataIndex: 'sex', |
||||
width: 80, |
||||
sorter: true, |
||||
customRender: ({ text }) => { |
||||
return render.renderDict(text, 'sex'); |
||||
}, |
||||
}, |
||||
{ |
||||
title: '生日', |
||||
dataIndex: 'birthday', |
||||
width: 100, |
||||
},*/ |
||||
{ |
||||
title: '手机号', |
||||
dataIndex: 'phone', |
||||
width: 100, |
||||
}, |
||||
{ |
||||
title: '院系/部门', |
||||
width: 150, |
||||
dataIndex: 'orgCodeTxt', |
||||
}, |
||||
/* { |
||||
title: '负责部门', |
||||
width: 150, |
||||
dataIndex: 'departIds_dictText', |
||||
},*/ |
||||
{ |
||||
title: '状态', |
||||
dataIndex: 'status_dictText', |
||||
width: 80, |
||||
}, |
||||
]; |
||||
|
||||
export const recycleColumns: BasicColumn[] = [ |
||||
{ |
||||
title: '用户账号', |
||||
dataIndex: 'username', |
||||
width: 100, |
||||
}, |
||||
{ |
||||
title: '用户姓名', |
||||
dataIndex: 'realname', |
||||
width: 100, |
||||
}, |
||||
{ |
||||
title: '头像', |
||||
dataIndex: 'avatar', |
||||
width: 80, |
||||
customRender: render.renderAvatar, |
||||
}, |
||||
{ |
||||
title: '性别', |
||||
dataIndex: 'sex', |
||||
width: 80, |
||||
sorter: true, |
||||
customRender: ({ text }) => { |
||||
return render.renderDict(text, 'sex'); |
||||
}, |
||||
}, |
||||
]; |
||||
|
||||
export const searchFormSchema: FormSchema[] = [ |
||||
/* { |
||||
label: '账号', |
||||
field: 'username', |
||||
component: 'JInput', |
||||
colProps: { span: 6 }, |
||||
},*/ |
||||
{ |
||||
label: '名字', |
||||
field: 'realname', |
||||
component: 'JInput', |
||||
colProps: { span: 6 }, |
||||
}, |
||||
/*{ |
||||
label: '性别', |
||||
field: 'sex', |
||||
component: 'JDictSelectTag', |
||||
componentProps: { |
||||
dictCode: 'sex', |
||||
placeholder: '请选择性别', |
||||
stringToNumber: true, |
||||
}, |
||||
colProps: { span: 6 }, |
||||
},*/ |
||||
{ |
||||
label: '手机号码', |
||||
field: 'phone', |
||||
component: 'Input', |
||||
colProps: { span: 6 }, |
||||
}, |
||||
{ |
||||
label: '用户状态', |
||||
field: 'status', |
||||
component: 'JDictSelectTag', |
||||
componentProps: { |
||||
dictCode: 'user_status', |
||||
placeholder: '请选择状态', |
||||
stringToNumber: true, |
||||
}, |
||||
colProps: { span: 6 }, |
||||
}, |
||||
]; |
||||
export const formSchema: FormSchema[] = [ |
||||
{ |
||||
label: '', |
||||
field: 'id', |
||||
component: 'Input', |
||||
show: false, |
||||
}, |
||||
{ |
||||
label: '专家账号', |
||||
field: 'username', |
||||
component: 'Input', |
||||
dynamicDisabled: ({ values }) => { |
||||
return !!values.id; |
||||
}, |
||||
dynamicRules: ({ model, schema }) => rules.duplicateCheckRule('sys_user', 'username', model, schema, true), |
||||
}, |
||||
{ |
||||
label: '登录密码', |
||||
field: 'password', |
||||
component: 'StrengthMeter', |
||||
rules: [ |
||||
{ |
||||
required: true, |
||||
message: '请输入登录密码', |
||||
}, |
||||
], |
||||
}, |
||||
{ |
||||
label: '确认密码', |
||||
field: 'confirmPassword', |
||||
component: 'InputPassword', |
||||
dynamicRules: ({ values }) => rules.confirmPassword(values, true), |
||||
}, |
||||
{ |
||||
label: '用户姓名', |
||||
field: 'realname', |
||||
required: true, |
||||
component: 'Input', |
||||
}, |
||||
{ |
||||
label: '工号', |
||||
field: 'workNo', |
||||
required: true, |
||||
component: 'Input', |
||||
dynamicRules: ({ model, schema }) => rules.duplicateCheckRule('sys_user', 'work_no', model, schema, true), |
||||
}, |
||||
/*{ |
||||
label: '职务', |
||||
field: 'post', |
||||
required: false, |
||||
component: 'JSelectPosition', |
||||
componentProps: { |
||||
rowKey: 'code', |
||||
labelKey: 'name', |
||||
}, |
||||
},*/ |
||||
/* { |
||||
label: '角色', |
||||
field: 'selectedroles', |
||||
dynamicDisabled: ({ values }) => { |
||||
return !!values.id; |
||||
}, |
||||
component: 'ApiSelect', |
||||
componentProps: { |
||||
api: getAllRolesListNoByExcludeTenant, |
||||
labelField: 'roleName', |
||||
valueField: 'id', |
||||
}, |
||||
},*/ |
||||
{ |
||||
label: '所属部门', |
||||
field: 'selecteddeparts', |
||||
component: 'JSelectDept', |
||||
componentProps: ({ formActionType, formModel }) => { |
||||
return { |
||||
sync: false, |
||||
checkStrictly: true, |
||||
defaultExpandLevel: 2, |
||||
multiple:false, |
||||
onSelect: (options, values) => { |
||||
const { updateSchema } = formActionType; |
||||
//所属部门修改后更新负责部门下拉框数据
|
||||
updateSchema([ |
||||
{ |
||||
field: 'departIds', |
||||
componentProps: { options }, |
||||
}, |
||||
]); |
||||
//所属部门修改后更新负责部门数据
|
||||
formModel.departIds && (formModel.departIds = formModel.departIds.filter((item) => values.value.indexOf(item) > -1)); |
||||
}, |
||||
}; |
||||
}, |
||||
}, |
||||
/*{ |
||||
label: '租户', |
||||
field: 'relTenantIds', |
||||
component: 'ApiSelect', |
||||
componentProps: { |
||||
mode: 'multiple', |
||||
api: getAllTenantList, |
||||
numberToString: true, |
||||
labelField: 'name', |
||||
valueField: 'id', |
||||
}, |
||||
},*/ |
||||
/*{ |
||||
label: '身份', |
||||
field: 'userIdentity', |
||||
component: 'RadioGroup', |
||||
defaultValue: 1, |
||||
componentProps: ({ formModel }) => { |
||||
return { |
||||
options: [ |
||||
{ label: '普通用户', value: 1, key: '1' }, |
||||
{ label: '上级', value: 2, key: '2' }, |
||||
], |
||||
onChange: () => { |
||||
formModel.userIdentity == 1 && (formModel.departIds = []); |
||||
}, |
||||
}; |
||||
}, |
||||
},*/ |
||||
/* { |
||||
label: '负责部门', |
||||
field: 'departIds', |
||||
component: 'Select', |
||||
componentProps: { |
||||
mode: 'multiple', |
||||
}, |
||||
ifShow: ({ values }) => values.userIdentity == 2, |
||||
},*/ |
||||
{ |
||||
label: '头像', |
||||
field: 'avatar', |
||||
component: 'JImageUpload', |
||||
componentProps: { |
||||
fileMax: 1, |
||||
}, |
||||
}, |
||||
{ |
||||
label: '生日', |
||||
field: 'birthday', |
||||
component: 'DatePicker', |
||||
}, |
||||
{ |
||||
label: '性别', |
||||
field: 'sex', |
||||
component: 'JDictSelectTag', |
||||
componentProps: { |
||||
dictCode: 'sex', |
||||
placeholder: '请选择性别', |
||||
stringToNumber: true, |
||||
}, |
||||
}, |
||||
{ |
||||
label: '邮箱', |
||||
field: 'email', |
||||
component: 'Input', |
||||
}, |
||||
{ |
||||
label: '手机号码', |
||||
field: 'phone', |
||||
component: 'Input', |
||||
}, |
||||
/*{ |
||||
label: '座机', |
||||
field: 'telephone', |
||||
component: 'Input', |
||||
rules: [{ pattern: /^0\d{2,3}-[1-9]\d{6,7}$/, message: '请输入正确的座机号码' }], |
||||
}, |
||||
{ |
||||
label: '工作流引擎', |
||||
field: 'activitiSync', |
||||
defaultValue: 1, |
||||
component: 'JDictSelectTag', |
||||
componentProps: { |
||||
dictCode: 'activiti_sync', |
||||
type: 'radio', |
||||
stringToNumber: true, |
||||
}, |
||||
},*/ |
||||
{ |
||||
label: '学历', |
||||
field: 'expTitle', |
||||
component: 'Input', |
||||
}, |
||||
|
||||
{ |
||||
label: '专业', |
||||
field: 'teamajor', |
||||
component: 'Input', |
||||
}, |
||||
{ |
||||
label: '学位', |
||||
field: 'expXw', |
||||
component: 'Input', |
||||
}, |
||||
{ |
||||
label: '职称', |
||||
field: 'expZc', |
||||
component: 'Input', |
||||
}, |
||||
{ |
||||
label: '研究方向', |
||||
field: 'expYjfx', |
||||
component: 'Input', |
||||
}, |
||||
{ |
||||
label: '从事工作', |
||||
field: 'expCsgz', |
||||
component: 'Input', |
||||
}, |
||||
{ |
||||
label: '毕业院校', |
||||
field: 'expSc', |
||||
component: 'Input', |
||||
}, |
||||
{ |
||||
label: '简介', |
||||
field: 'expResume', |
||||
component: 'InputTextArea', |
||||
}, |
||||
/*{ |
||||
label: '比赛', |
||||
field: 'compid', |
||||
component: 'Input', |
||||
show: false, |
||||
},*/ |
||||
/*{ |
||||
label: '比赛名称', |
||||
field: 'compName', |
||||
component: 'JPopup', |
||||
componentProps: ({ formActionType }) => { |
||||
const {setFieldsValue} = formActionType; |
||||
return{ |
||||
setFieldsValue:setFieldsValue, |
||||
code:"comp_select", |
||||
fieldConfig: [ |
||||
{ source: 'id', target: 'compid' }, |
||||
{ source: 'comp_name', target: 'compName' }, |
||||
], |
||||
multi:true |
||||
} |
||||
}, |
||||
},*/ |
||||
/* { |
||||
label: '比赛状态', |
||||
field: 'stat', |
||||
component: 'JSwitch', |
||||
defaultValue: 'Y', |
||||
componentProps: {}, |
||||
},*/ |
||||
]; |
||||
export const formPasswordSchema: FormSchema[] = [ |
||||
{ |
||||
label: '用户账号', |
||||
field: 'username', |
||||
component: 'Input', |
||||
componentProps: { readOnly: true }, |
||||
}, |
||||
{ |
||||
label: '登录密码', |
||||
field: 'password', |
||||
component: 'StrengthMeter', |
||||
componentProps: { |
||||
placeholder: '请输入登录密码', |
||||
}, |
||||
rules: [ |
||||
{ |
||||
required: true, |
||||
message: '请输入登录密码', |
||||
}, |
||||
], |
||||
}, |
||||
{ |
||||
label: '确认密码', |
||||
field: 'confirmPassword', |
||||
component: 'InputPassword', |
||||
dynamicRules: ({ values }) => rules.confirmPassword(values, true), |
||||
}, |
||||
]; |
||||
|
||||
export const formAgentSchema: FormSchema[] = [ |
||||
{ |
||||
label: '', |
||||
field: 'id', |
||||
component: 'Input', |
||||
show: false, |
||||
}, |
||||
{ |
||||
field: 'userName', |
||||
label: '用户名', |
||||
component: 'Input', |
||||
componentProps: { |
||||
readOnly: true, |
||||
allowClear: false, |
||||
}, |
||||
}, |
||||
{ |
||||
field: 'agentUserName', |
||||
label: '代理人用户名', |
||||
required: true, |
||||
component: 'JSelectUser', |
||||
componentProps: { |
||||
rowKey: 'username', |
||||
labelKey: 'realname', |
||||
maxSelectCount: 10, |
||||
}, |
||||
}, |
||||
{ |
||||
field: 'startTime', |
||||
label: '代理开始时间', |
||||
component: 'DatePicker', |
||||
required: true, |
||||
componentProps: { |
||||
showTime: true, |
||||
valueFormat: 'YYYY-MM-DD HH:mm:ss', |
||||
placeholder: '请选择代理开始时间', |
||||
}, |
||||
}, |
||||
{ |
||||
field: 'endTime', |
||||
label: '代理结束时间', |
||||
component: 'DatePicker', |
||||
required: true, |
||||
componentProps: { |
||||
showTime: true, |
||||
valueFormat: 'YYYY-MM-DD HH:mm:ss', |
||||
placeholder: '请选择代理结束时间', |
||||
}, |
||||
}, |
||||
{ |
||||
field: 'status', |
||||
label: '状态', |
||||
component: 'JDictSelectTag', |
||||
defaultValue: '1', |
||||
componentProps: { |
||||
dictCode: 'valid_status', |
||||
type: 'radioButton', |
||||
}, |
||||
}, |
||||
]; |
||||
export const formQuitAgentSchema: FormSchema[] = [ |
||||
{ |
||||
label: '', |
||||
field: 'id', |
||||
component: 'Input', |
||||
show: false, |
||||
}, |
||||
{ |
||||
field: 'userName', |
||||
label: '用户名', |
||||
component: 'Input', |
||||
componentProps: { |
||||
readOnly: true, |
||||
allowClear: false, |
||||
}, |
||||
}, |
||||
{ |
||||
field: 'agentUserName', |
||||
label: '交接人员', |
||||
required: true, |
||||
component: 'JSelectUser', |
||||
componentProps: { |
||||
rowKey: 'username', |
||||
labelKey: 'realname', |
||||
maxSelectCount: 1, |
||||
}, |
||||
}, |
||||
{ |
||||
field: 'startTime', |
||||
label: '交接开始时间', |
||||
component: 'DatePicker', |
||||
required: true, |
||||
componentProps: { |
||||
showTime: true, |
||||
valueFormat: 'YYYY-MM-DD HH:mm:ss', |
||||
placeholder: '请选择交接开始时间', |
||||
getPopupContainer: () => document.body, |
||||
}, |
||||
}, |
||||
{ |
||||
field: 'endTime', |
||||
label: '交接结束时间', |
||||
component: 'DatePicker', |
||||
required: true, |
||||
componentProps: { |
||||
showTime: true, |
||||
valueFormat: 'YYYY-MM-DD HH:mm:ss', |
||||
placeholder: '请选择交接结束时间', |
||||
getPopupContainer: () => document.body, |
||||
}, |
||||
}, |
||||
{ |
||||
field: 'status', |
||||
label: '状态', |
||||
component: 'JDictSelectTag', |
||||
defaultValue: '1', |
||||
componentProps: { |
||||
dictCode: 'valid_status', |
||||
type: 'radioButton', |
||||
}, |
||||
}, |
||||
]; |
||||
|
||||
//租户用户列表
|
||||
export const userTenantColumns: BasicColumn[] = [ |
||||
{ |
||||
title: '用户账号', |
||||
dataIndex: 'username', |
||||
width: 120, |
||||
}, |
||||
{ |
||||
title: '用户姓名', |
||||
dataIndex: 'realname', |
||||
width: 100, |
||||
}, |
||||
{ |
||||
title: '头像', |
||||
dataIndex: 'avatar', |
||||
width: 120, |
||||
customRender: render.renderAvatar, |
||||
}, |
||||
{ |
||||
title: '手机号', |
||||
dataIndex: 'phone', |
||||
width: 100, |
||||
}, |
||||
{ |
||||
title: '部门', |
||||
width: 150, |
||||
dataIndex: 'orgCodeTxt', |
||||
}, |
||||
{ |
||||
title: '状态', |
||||
dataIndex: 'status', |
||||
width: 80, |
||||
customRender: ({ text }) => { |
||||
if (text === '1') { |
||||
return '正常'; |
||||
} else if (text === '3') { |
||||
return '审批中'; |
||||
} else { |
||||
return '已拒绝'; |
||||
} |
||||
}, |
||||
}, |
||||
]; |
||||
|
||||
//用户租户搜索表单
|
||||
export const userTenantFormSchema: FormSchema[] = [ |
||||
{ |
||||
label: '账号', |
||||
field: 'username', |
||||
component: 'Input', |
||||
colProps: { span: 6 }, |
||||
}, |
||||
{ |
||||
label: '名字', |
||||
field: 'realname', |
||||
component: 'Input', |
||||
colProps: { span: 6 }, |
||||
}, |
||||
{ |
||||
label: '性别', |
||||
field: 'sex', |
||||
component: 'JDictSelectTag', |
||||
componentProps: { |
||||
dictCode: 'sex', |
||||
placeholder: '请选择性别', |
||||
stringToNumber: true, |
||||
}, |
||||
colProps: { span: 6 }, |
||||
}, |
||||
]; |
@ -0,0 +1,54 @@ |
||||
<template> |
||||
<Description @register="register" class="mt-4" /> |
||||
</template> |
||||
<script lang="ts"> |
||||
import { defineComponent } from 'vue'; |
||||
import { Description, DescItem, useDescription } from '/src/components/Description'; |
||||
const mockData = { |
||||
username: 'test', |
||||
nickName: 'VB', |
||||
age: '123', |
||||
phone: '15695909xxx', |
||||
email: '190848757@qq.com', |
||||
addr: '厦门市思明区', |
||||
sex: '男', |
||||
certy: '3504256199xxxxxxxxx', |
||||
tag: 'orange', |
||||
}; |
||||
const schema: DescItem[] = [ |
||||
{ |
||||
field: 'username', |
||||
label: '用户名', |
||||
}, |
||||
{ |
||||
field: 'nickName', |
||||
label: '昵称', |
||||
render: (curVal, data) => { |
||||
return `${data.username}-${curVal}`; |
||||
}, |
||||
}, |
||||
{ |
||||
field: 'phone', |
||||
label: '联系电话', |
||||
}, |
||||
{ |
||||
field: 'email', |
||||
label: '邮箱', |
||||
}, |
||||
{ |
||||
field: 'addr', |
||||
label: '地址', |
||||
}, |
||||
]; |
||||
export default defineComponent({ |
||||
components: { Description }, |
||||
setup() { |
||||
const [register] = useDescription({ |
||||
title: 'useDescription', |
||||
data: mockData, |
||||
schema: schema, |
||||
}); |
||||
return { mockData, schema, register }; |
||||
}, |
||||
}); |
||||
</script> |
@ -0,0 +1,272 @@ |
||||
import { defHttp } from '/src/utils/http/axios'; |
||||
import { Modal } from 'ant-design-vue'; |
||||
|
||||
enum Api { |
||||
listNoCareTenant = '/sys/user/listAll', |
||||
listzdzx = '/sys/user/listzdzx', |
||||
list = '/sys/user/list', |
||||
save = '/sys/user/add', |
||||
edit = '/sys/user/edit', |
||||
saveZJ = '/seteacher/seteacher/addTEA', |
||||
editZJ = '/seteacher/seteacher/editTEA', |
||||
queryExpertById = '/seteacher/seteacher/queryById', |
||||
agentSave = '/sys/sysUserAgent/add', |
||||
agentEdit = '/sys/sysUserAgent/edit', |
||||
getUserRole = '/sys/user/queryUserRole', |
||||
duplicateCheck = '/sys/duplicate/check', |
||||
deleteUser = '/sys/user/delete', |
||||
deleteBatch = '/sys/user/deleteBatch', |
||||
importExcel = '/sys/user/importExcel', |
||||
exportXls = '/sys/user/exportXls', |
||||
recycleBinList = '/sys/user/recycleBin', |
||||
putRecycleBin = '/sys/user/putRecycleBin', |
||||
deleteRecycleBin = '/sys/user/deleteRecycleBin', |
||||
allRolesList = '/sys/role/queryall', |
||||
allRolesListNoByTenant = '/sys/role/queryallNoByTenant', |
||||
allRolesListExcludeByTenant = '/sys/role/queryallExcludeByTenant', |
||||
allTenantList = '/sys/tenant/queryList', |
||||
allPostList = '/sys/position/list', |
||||
userDepartList = '/sys/user/userDepartList', |
||||
changePassword = '/sys/user/changePassword', |
||||
frozenBatch = '/sys/user/frozenBatch', |
||||
getUserAgent = '/sys/sysUserAgent/queryByUserName', |
||||
syncUser = '/act/process/extActProcess/doSyncUser', |
||||
userQuitAgent = '/sys/user/userQuitAgent', |
||||
getQuitList = '/sys/user/getQuitList', |
||||
putCancelQuit = '/sys/user/putCancelQuit', |
||||
updateUserTenantStatus='/sys/tenant/updateUserTenantStatus', |
||||
getUserTenantPageList='/sys/tenant/getUserTenantPageList', |
||||
exportXlsMb = '/sys/user/exportXlsMb', |
||||
queryByUserId = '/expert/expert/queryByUserId', |
||||
} |
||||
/** |
||||
* 根据userid判断是否为专家 |
||||
* @param params |
||||
*/ |
||||
export const queryByUserId = (params) => { |
||||
return defHttp.get({ url: Api.queryByUserId, params },{ successMessageMode: 'none' }); |
||||
}; |
||||
/** |
||||
* 导出api |
||||
* @param params |
||||
*/ |
||||
export const getExportUrl = Api.exportXls; |
||||
|
||||
export const getExportUrlMb = Api.exportXlsMb; |
||||
/** |
||||
* 导入api |
||||
*/ |
||||
export const getImportUrl = Api.importExcel; |
||||
/** |
||||
* 列表接口(查询用户,通过租户隔离) |
||||
* @param params |
||||
*/ |
||||
export const list = (params) => defHttp.get({ url: Api.list, params }); |
||||
|
||||
/** |
||||
* 列表接口(查询全部用户,不通过租户隔离) |
||||
* @param params |
||||
*/ |
||||
export const listNoCareTenant = (params) => defHttp.get({ url: Api.listNoCareTenant, params }); |
||||
|
||||
/** |
||||
* 列表接口(查询全部用户,不通过租户隔离) |
||||
* 适用于专家、学生、组委会查看自己的信息 |
||||
* @param params |
||||
*/ |
||||
export const listzdzx = (params) => defHttp.get({ url: Api.listzdzx, params }); |
||||
|
||||
/** |
||||
* 用户角色接口 |
||||
* @param params |
||||
*/ |
||||
export const getUserRoles = (params) => defHttp.get({ url: Api.getUserRole, params }, { errorMessageMode: 'none' }); |
||||
/** |
||||
* 专家信息接口 |
||||
* @param params |
||||
*/ |
||||
export const queryExpertById = (params) => defHttp.get({ url: Api.queryExpertById, params }, { successMessageMode: 'none' }); |
||||
|
||||
|
||||
/** |
||||
* 删除用户 |
||||
*/ |
||||
export const deleteUser = (params, handleSuccess) => { |
||||
return defHttp.delete({ url: Api.deleteUser, params }, { joinParamsToUrl: true }).then(() => { |
||||
handleSuccess(); |
||||
}); |
||||
}; |
||||
/** |
||||
* 批量删除用户 |
||||
* @param params |
||||
*/ |
||||
export const batchDeleteUser = (params, handleSuccess) => { |
||||
Modal.confirm({ |
||||
title: '确认删除', |
||||
content: '是否删除选中数据', |
||||
okText: '确认', |
||||
cancelText: '取消', |
||||
onOk: () => { |
||||
return defHttp.delete({ url: Api.deleteBatch, data: params }, { joinParamsToUrl: true }).then(() => { |
||||
handleSuccess(); |
||||
}); |
||||
}, |
||||
}); |
||||
}; |
||||
/** |
||||
* 保存或者更新用户 |
||||
* @param params |
||||
*/ |
||||
export const saveOrUpdateUser = (params, isUpdate) => { |
||||
let url = isUpdate ? Api.edit : Api.save; |
||||
return defHttp.post({ url: url, params }); |
||||
}; |
||||
/** |
||||
* 保存或者更新专家用户 |
||||
* @param params |
||||
*/ |
||||
export const saveOrUpdateUserZJ = (params, isUpdate) => { |
||||
let url = isUpdate ? Api.editZJ : Api.saveZJ; |
||||
return defHttp.post({ url: url, params }); |
||||
}; |
||||
/** |
||||
* 唯一校验 |
||||
* @param params |
||||
*/ |
||||
export const duplicateCheck = (params) => defHttp.get({ url: Api.duplicateCheck, params }, { isTransformResponse: false }); |
||||
/** |
||||
* 获取全部角色(租户隔离) |
||||
* @param params |
||||
*/ |
||||
export const getAllRolesList = (params) => defHttp.get({ url: Api.allRolesList, params }); |
||||
/** |
||||
* 获取全部角色(不租户隔离) |
||||
* @param params |
||||
*/ |
||||
export const getAllRolesListNoByTenant = (params) => defHttp.get({ url: Api.allRolesListNoByTenant, params }); |
||||
|
||||
|
||||
/** |
||||
* 获取角色(排除:总管理) |
||||
* @param params |
||||
*/ |
||||
export const getAllRolesListNoByExcludeTenant = (params) => defHttp.get({ url: Api.allRolesListExcludeByTenant, params }); |
||||
|
||||
|
||||
/** |
||||
* 获取全部租户 |
||||
*/ |
||||
export const getAllTenantList = (params) => defHttp.get({ url: Api.allTenantList, params }); |
||||
/** |
||||
* 获取指定用户负责部门 |
||||
*/ |
||||
export const getUserDepartList = (params) => defHttp.get({ url: Api.userDepartList, params }, { successMessageMode: 'none' }); |
||||
/** |
||||
* 获取全部职务 |
||||
*/ |
||||
export const getAllPostList = (params) => { |
||||
return new Promise((resolve) => { |
||||
defHttp.get({ url: Api.allPostList, params }).then((res) => { |
||||
resolve(res.records); |
||||
}); |
||||
}); |
||||
}; |
||||
/** |
||||
* 回收站列表 |
||||
* @param params |
||||
*/ |
||||
export const getRecycleBinList = (params) => defHttp.get({ url: Api.recycleBinList, params }); |
||||
/** |
||||
* 回收站还原 |
||||
* @param params |
||||
*/ |
||||
export const putRecycleBin = (params, handleSuccess) => { |
||||
return defHttp.put({ url: Api.putRecycleBin, params }).then(() => { |
||||
handleSuccess(); |
||||
}); |
||||
}; |
||||
/** |
||||
* 回收站删除 |
||||
* @param params |
||||
*/ |
||||
export const deleteRecycleBin = (params, handleSuccess) => { |
||||
return defHttp.delete({ url: Api.deleteRecycleBin, params }, { joinParamsToUrl: true }).then(() => { |
||||
handleSuccess(); |
||||
}); |
||||
}; |
||||
/** |
||||
* 修改密码 |
||||
* @param params |
||||
*/ |
||||
export const changePassword = (params) => { |
||||
return defHttp.put({ url: Api.changePassword, params }); |
||||
}; |
||||
/** |
||||
* 冻结解冻 |
||||
* @param params |
||||
*/ |
||||
export const frozenBatch = (params, handleSuccess) => { |
||||
return defHttp.put({ url: Api.frozenBatch, params }).then(() => { |
||||
handleSuccess(); |
||||
}); |
||||
}; |
||||
/** |
||||
* 获取用户代理 |
||||
* @param params |
||||
*/ |
||||
export const getUserAgent = (params) => defHttp.get({ url: Api.getUserAgent, params }, { isTransformResponse: false }); |
||||
/** |
||||
* 保存或者更新用户代理 |
||||
* @param params |
||||
*/ |
||||
export const saveOrUpdateAgent = (params) => { |
||||
let url = params.id ? Api.agentEdit : Api.agentSave; |
||||
return defHttp.post({ url: url, params }); |
||||
}; |
||||
|
||||
/** |
||||
* 用户同步流程 |
||||
* @param params |
||||
*/ |
||||
export const syncUser = () => defHttp.put({ url: Api.syncUser }); |
||||
|
||||
/** |
||||
* 用户离职(新增代理人和用户状态变更操作) |
||||
* @param params |
||||
*/ |
||||
export const userQuitAgent = (params) => { |
||||
return defHttp.put({ url: Api.userQuitAgent, params }); |
||||
}; |
||||
|
||||
/** |
||||
* 用户离职列表 |
||||
* @param params |
||||
*/ |
||||
export const getQuitList = (params) => { |
||||
return defHttp.get({ url: Api.getQuitList, params }); |
||||
}; |
||||
|
||||
/** |
||||
* 取消离职 |
||||
* @param params |
||||
*/ |
||||
export const putCancelQuit = (params, handleSuccess) => { |
||||
return defHttp.put({ url: Api.putCancelQuit, params }, { joinParamsToUrl: true }).then(() => { |
||||
handleSuccess(); |
||||
}); |
||||
}; |
||||
|
||||
/** |
||||
* 待审批获取列表数据 |
||||
*/ |
||||
export const getUserTenantPageList = (params)=>{ |
||||
return defHttp.get({url:Api.getUserTenantPageList,params}) |
||||
} |
||||
|
||||
/** |
||||
* 更新租户状态 |
||||
* @param params |
||||
*/ |
||||
export const updateUserTenantStatus = (params)=>{ |
||||
return defHttp.put({ url: Api.updateUserTenantStatus, params }, { joinParamsToUrl: true,isTransformResponse: false }); |
||||
} |
@ -0,0 +1,771 @@ |
||||
import { BasicColumn } from '/src/components/Table'; |
||||
import { FormSchema } from '/src/components/Table'; |
||||
import { getAllRolesListNoByTenant,getAllRolesListNoByExcludeTenant, getAllTenantList } from './userZJ.api'; |
||||
import { rules } from '/src/utils/helper/validator'; |
||||
import { render } from '/src/utils/common/renderUtils'; |
||||
export const columns: BasicColumn[] = [ |
||||
{ |
||||
title: '用户账号', |
||||
dataIndex: 'username', |
||||
width: 120, |
||||
}, |
||||
{ |
||||
title: '用户姓名', |
||||
dataIndex: 'realname', |
||||
width: 100, |
||||
}, |
||||
{ |
||||
title: '头像', |
||||
dataIndex: 'avatar', |
||||
width: 120, |
||||
customRender: render.renderAvatar, |
||||
}, |
||||
/* { |
||||
title: '性别', |
||||
dataIndex: 'sex', |
||||
width: 80, |
||||
sorter: true, |
||||
customRender: ({ text }) => { |
||||
return render.renderDict(text, 'sex'); |
||||
}, |
||||
}, |
||||
{ |
||||
title: '生日', |
||||
dataIndex: 'birthday', |
||||
width: 100, |
||||
},*/ |
||||
{ |
||||
title: '手机号', |
||||
dataIndex: 'phone', |
||||
width: 100, |
||||
}, |
||||
{ |
||||
title: '部门', |
||||
width: 150, |
||||
dataIndex: 'orgCodeTxt', |
||||
}, |
||||
{ |
||||
title: '负责部门', |
||||
width: 150, |
||||
dataIndex: 'departIds_dictText', |
||||
}, |
||||
{ |
||||
title: '状态', |
||||
dataIndex: 'status_dictText', |
||||
width: 80, |
||||
}, |
||||
]; |
||||
|
||||
export const recycleColumns: BasicColumn[] = [ |
||||
{ |
||||
title: '用户账号', |
||||
dataIndex: 'username', |
||||
width: 100, |
||||
}, |
||||
{ |
||||
title: '用户姓名', |
||||
dataIndex: 'realname', |
||||
width: 100, |
||||
}, |
||||
{ |
||||
title: '头像', |
||||
dataIndex: 'avatar', |
||||
width: 80, |
||||
customRender: render.renderAvatar, |
||||
}, |
||||
{ |
||||
title: '性别', |
||||
dataIndex: 'sex', |
||||
width: 80, |
||||
sorter: true, |
||||
customRender: ({ text }) => { |
||||
return render.renderDict(text, 'sex'); |
||||
}, |
||||
}, |
||||
]; |
||||
|
||||
export const searchFormSchema: FormSchema[] = [ |
||||
{ |
||||
label: '账号', |
||||
field: 'username', |
||||
component: 'JInput', |
||||
colProps: { span: 6 }, |
||||
}, |
||||
{ |
||||
label: '名字', |
||||
field: 'realname', |
||||
component: 'JInput', |
||||
colProps: { span: 6 }, |
||||
}, |
||||
{ |
||||
label: '性别', |
||||
field: 'sex', |
||||
component: 'JDictSelectTag', |
||||
componentProps: { |
||||
dictCode: 'sex', |
||||
placeholder: '请选择性别', |
||||
stringToNumber: true, |
||||
}, |
||||
colProps: { span: 6 }, |
||||
}, |
||||
{ |
||||
label: '手机号码', |
||||
field: 'phone', |
||||
component: 'Input', |
||||
colProps: { span: 6 }, |
||||
}, |
||||
{ |
||||
label: '用户状态', |
||||
field: 'status', |
||||
component: 'JDictSelectTag', |
||||
componentProps: { |
||||
dictCode: 'user_status', |
||||
placeholder: '请选择状态', |
||||
stringToNumber: true, |
||||
}, |
||||
colProps: { span: 6 }, |
||||
}, |
||||
]; |
||||
export const formSchemaZJ: FormSchema[] = [ |
||||
{ |
||||
label: '', |
||||
field: 'id', |
||||
component: 'Input', |
||||
show: false, |
||||
}, |
||||
{ |
||||
label: '专家账号', |
||||
field: 'username', |
||||
component: 'Input', |
||||
dynamicDisabled: ({ values }) => { |
||||
return !!values.id; |
||||
}, |
||||
dynamicRules: ({ model, schema }) => rules.duplicateCheckRule('sys_user', 'username', model, schema, true), |
||||
}, |
||||
{ |
||||
label: '登录密码', |
||||
field: 'password', |
||||
component: 'StrengthMeter', |
||||
rules: [ |
||||
{ |
||||
required: true, |
||||
message: '请输入登录密码', |
||||
}, |
||||
], |
||||
}, |
||||
{ |
||||
label: '确认密码', |
||||
field: 'confirmPassword', |
||||
component: 'InputPassword', |
||||
dynamicRules: ({ values }) => rules.confirmPassword(values, true), |
||||
}, |
||||
{ |
||||
label: '用户姓名', |
||||
field: 'realname', |
||||
required: true, |
||||
component: 'Input', |
||||
}, |
||||
{ |
||||
label: '工号', |
||||
field: 'workNo', |
||||
required: true, |
||||
component: 'Input', |
||||
dynamicRules: ({ model, schema }) => rules.duplicateCheckRule('sys_user', 'work_no', model, schema, true), |
||||
}, |
||||
/*{ |
||||
label: '职务', |
||||
field: 'post', |
||||
required: false, |
||||
component: 'JSelectPosition', |
||||
componentProps: { |
||||
rowKey: 'code', |
||||
labelKey: 'name', |
||||
}, |
||||
},*/ |
||||
{ |
||||
label: '角色', |
||||
field: 'selectedroles', |
||||
component: 'ApiSelect', |
||||
componentProps: { |
||||
api: getAllRolesListNoByExcludeTenant, |
||||
labelField: 'roleName', |
||||
valueField: 'id', |
||||
}, |
||||
}, |
||||
{ |
||||
label: '所属部门', |
||||
field: 'selecteddeparts', |
||||
component: 'JSelectDept', |
||||
componentProps: ({ formActionType, formModel }) => { |
||||
return { |
||||
sync: false, |
||||
checkStrictly: true, |
||||
defaultExpandLevel: 2, |
||||
|
||||
onSelect: (options, values) => { |
||||
const { updateSchema } = formActionType; |
||||
//所属部门修改后更新负责部门下拉框数据
|
||||
updateSchema([ |
||||
{ |
||||
field: 'departIds', |
||||
componentProps: { options }, |
||||
}, |
||||
]); |
||||
//所属部门修改后更新负责部门数据
|
||||
formModel.departIds && (formModel.departIds = formModel.departIds.filter((item) => values.value.indexOf(item) > -1)); |
||||
}, |
||||
}; |
||||
}, |
||||
}, |
||||
/*{ |
||||
label: '租户', |
||||
field: 'relTenantIds', |
||||
component: 'ApiSelect', |
||||
componentProps: { |
||||
mode: 'multiple', |
||||
api: getAllTenantList, |
||||
numberToString: true, |
||||
labelField: 'name', |
||||
valueField: 'id', |
||||
}, |
||||
},*/ |
||||
/*{ |
||||
label: '身份', |
||||
field: 'userIdentity', |
||||
component: 'RadioGroup', |
||||
defaultValue: 1, |
||||
componentProps: ({ formModel }) => { |
||||
return { |
||||
options: [ |
||||
{ label: '普通用户', value: 1, key: '1' }, |
||||
{ label: '上级', value: 2, key: '2' }, |
||||
], |
||||
onChange: () => { |
||||
formModel.userIdentity == 1 && (formModel.departIds = []); |
||||
}, |
||||
}; |
||||
}, |
||||
},*/ |
||||
/* { |
||||
label: '负责部门', |
||||
field: 'departIds', |
||||
component: 'Select', |
||||
componentProps: { |
||||
mode: 'multiple', |
||||
}, |
||||
ifShow: ({ values }) => values.userIdentity == 2, |
||||
},*/ |
||||
{ |
||||
label: '头像', |
||||
field: 'avatar', |
||||
component: 'JImageUpload', |
||||
componentProps: { |
||||
fileMax: 1, |
||||
}, |
||||
}, |
||||
{ |
||||
label: '生日', |
||||
field: 'birthday', |
||||
component: 'DatePicker', |
||||
}, |
||||
{ |
||||
label: '性别', |
||||
field: 'sex', |
||||
component: 'JDictSelectTag', |
||||
componentProps: { |
||||
dictCode: 'sex', |
||||
placeholder: '请选择性别', |
||||
stringToNumber: true, |
||||
}, |
||||
}, |
||||
{ |
||||
label: '邮箱', |
||||
field: 'email', |
||||
component: 'Input', |
||||
}, |
||||
{ |
||||
label: '手机号码', |
||||
field: 'phone', |
||||
component: 'Input', |
||||
}, |
||||
/*{ |
||||
label: '座机', |
||||
field: 'telephone', |
||||
component: 'Input', |
||||
rules: [{ pattern: /^0\d{2,3}-[1-9]\d{6,7}$/, message: '请输入正确的座机号码' }], |
||||
}, |
||||
{ |
||||
label: '工作流引擎', |
||||
field: 'activitiSync', |
||||
defaultValue: 1, |
||||
component: 'JDictSelectTag', |
||||
componentProps: { |
||||
dictCode: 'activiti_sync', |
||||
type: 'radio', |
||||
stringToNumber: true, |
||||
}, |
||||
},*/ |
||||
{ |
||||
label: '专家毕业院校', |
||||
field: 'expSc', |
||||
component: 'Input', |
||||
}, |
||||
{ |
||||
label: '专家履历', |
||||
field: 'expResume', |
||||
component: 'InputTextArea', |
||||
}, |
||||
{ |
||||
label: '专家学历', |
||||
field: 'expTitle', |
||||
component: 'Input', |
||||
}, |
||||
{ |
||||
label: '比赛', |
||||
field: 'compid', |
||||
component: 'Input', |
||||
show: false, |
||||
}, |
||||
{ |
||||
label: '比赛名称', |
||||
field: 'compName', |
||||
component: 'JPopup', |
||||
componentProps: ({ formActionType }) => { |
||||
const {setFieldsValue} = formActionType; |
||||
return{ |
||||
setFieldsValue:setFieldsValue, |
||||
code:"comp_select", |
||||
fieldConfig: [ |
||||
{ source: 'id', target: 'compid' }, |
||||
{ source: 'comp_name', target: 'compName' }, |
||||
], |
||||
multi:true |
||||
} |
||||
}, |
||||
}, |
||||
{ |
||||
label: '状态', |
||||
field: 'stat', |
||||
component: 'JSwitch', |
||||
componentProps:{ |
||||
}, |
||||
}, |
||||
]; |
||||
|
||||
export const formSchema: FormSchema[] = [ |
||||
{ |
||||
label: '', |
||||
field: 'id', |
||||
component: 'Input', |
||||
show: false, |
||||
}, |
||||
{ |
||||
label: '用户账号', |
||||
field: 'username', |
||||
component: 'Input', |
||||
dynamicDisabled: ({ values }) => { |
||||
return !!values.id; |
||||
}, |
||||
dynamicRules: ({ model, schema }) => rules.duplicateCheckRule('sys_user', 'username', model, schema, true), |
||||
}, |
||||
{ |
||||
label: '登录密码', |
||||
field: 'password', |
||||
component: 'StrengthMeter', |
||||
rules: [ |
||||
{ |
||||
required: true, |
||||
message: '请输入登录密码', |
||||
}, |
||||
], |
||||
}, |
||||
{ |
||||
label: '确认密码', |
||||
field: 'confirmPassword', |
||||
component: 'InputPassword', |
||||
dynamicRules: ({ values }) => rules.confirmPassword(values, true), |
||||
}, |
||||
{ |
||||
label: '用户姓名', |
||||
field: 'realname', |
||||
required: true, |
||||
component: 'Input', |
||||
}, |
||||
{ |
||||
label: '工号', |
||||
field: 'workNo', |
||||
required: true, |
||||
component: 'Input', |
||||
dynamicRules: ({ model, schema }) => rules.duplicateCheckRule('sys_user', 'work_no', model, schema, true), |
||||
}, |
||||
{ |
||||
label: '职务', |
||||
field: 'post', |
||||
required: false, |
||||
component: 'JSelectPosition', |
||||
componentProps: { |
||||
rowKey: 'code', |
||||
labelKey: 'name', |
||||
}, |
||||
}, |
||||
{ |
||||
label: '角色', |
||||
field: 'selectedroles', |
||||
component: 'ApiSelect', |
||||
componentProps: { |
||||
mode: 'multiple', |
||||
api: getAllRolesListNoByTenant, |
||||
labelField: 'roleName', |
||||
valueField: 'id', |
||||
}, |
||||
}, |
||||
{ |
||||
label: '所属部门', |
||||
field: 'selecteddeparts', |
||||
component: 'JSelectDept', |
||||
componentProps: ({ formActionType, formModel }) => { |
||||
return { |
||||
sync: false, |
||||
checkStrictly: true, |
||||
defaultExpandLevel: 2, |
||||
|
||||
onSelect: (options, values) => { |
||||
const { updateSchema } = formActionType; |
||||
//所属部门修改后更新负责部门下拉框数据
|
||||
updateSchema([ |
||||
{ |
||||
field: 'departIds', |
||||
componentProps: { options }, |
||||
}, |
||||
]); |
||||
//所属部门修改后更新负责部门数据
|
||||
formModel.departIds && (formModel.departIds = formModel.departIds.filter((item) => values.value.indexOf(item) > -1)); |
||||
}, |
||||
}; |
||||
}, |
||||
}, |
||||
{ |
||||
label: '租户', |
||||
field: 'relTenantIds', |
||||
component: 'ApiSelect', |
||||
componentProps: { |
||||
mode: 'multiple', |
||||
api: getAllTenantList, |
||||
numberToString: true, |
||||
labelField: 'name', |
||||
valueField: 'id', |
||||
}, |
||||
}, |
||||
{ |
||||
label: '身份', |
||||
field: 'userIdentity', |
||||
component: 'RadioGroup', |
||||
defaultValue: 1, |
||||
componentProps: ({ formModel }) => { |
||||
return { |
||||
options: [ |
||||
{ label: '普通用户', value: 1, key: '1' }, |
||||
{ label: '上级', value: 2, key: '2' }, |
||||
], |
||||
onChange: () => { |
||||
formModel.userIdentity == 1 && (formModel.departIds = []); |
||||
}, |
||||
}; |
||||
}, |
||||
}, |
||||
{ |
||||
label: '负责部门', |
||||
field: 'departIds', |
||||
component: 'Select', |
||||
componentProps: { |
||||
mode: 'multiple', |
||||
}, |
||||
ifShow: ({ values }) => values.userIdentity == 2, |
||||
}, |
||||
{ |
||||
label: '头像', |
||||
field: 'avatar', |
||||
component: 'JImageUpload', |
||||
componentProps: { |
||||
fileMax: 1, |
||||
}, |
||||
}, |
||||
{ |
||||
label: '生日', |
||||
field: 'birthday', |
||||
component: 'DatePicker', |
||||
}, |
||||
{ |
||||
label: '性别', |
||||
field: 'sex', |
||||
component: 'JDictSelectTag', |
||||
componentProps: { |
||||
dictCode: 'sex', |
||||
placeholder: '请选择性别', |
||||
stringToNumber: true, |
||||
}, |
||||
}, |
||||
{ |
||||
label: '邮箱', |
||||
field: 'email', |
||||
component: 'Input', |
||||
dynamicRules: ({ model, schema }) => { |
||||
return [ |
||||
{ ...rules.duplicateCheckRule('sys_user', 'email', model, schema, true)[0] }, |
||||
{ ...rules.rule('email', false)[0] }, |
||||
]; |
||||
}, |
||||
}, |
||||
{ |
||||
label: '手机号码', |
||||
field: 'phone', |
||||
component: 'Input', |
||||
dynamicRules: ({ model, schema }) => { |
||||
return [ |
||||
{ ...rules.duplicateCheckRule('sys_user', 'phone', model, schema, true)[0] }, |
||||
{ pattern: /^1[3456789]\d{9}$/, message: '手机号码格式有误' }, |
||||
]; |
||||
}, |
||||
}, |
||||
{ |
||||
label: '座机', |
||||
field: 'telephone', |
||||
component: 'Input', |
||||
rules: [{ pattern: /^0\d{2,3}-[1-9]\d{6,7}$/, message: '请输入正确的座机号码' }], |
||||
}, |
||||
// {
|
||||
// label: '工作流引擎',
|
||||
// field: 'activitiSync',
|
||||
// defaultValue: 1,
|
||||
// component: 'JDictSelectTag',
|
||||
// componentProps: {
|
||||
// dictCode: 'activiti_sync',
|
||||
// type: 'radio',
|
||||
// stringToNumber: true,
|
||||
// },
|
||||
// },
|
||||
]; |
||||
|
||||
export const formPasswordSchema: FormSchema[] = [ |
||||
{ |
||||
label: '用户账号', |
||||
field: 'username', |
||||
component: 'Input', |
||||
componentProps: { readOnly: true }, |
||||
}, |
||||
{ |
||||
label: '登录密码', |
||||
field: 'password', |
||||
component: 'StrengthMeter', |
||||
componentProps: { |
||||
placeholder: '请输入登录密码', |
||||
}, |
||||
rules: [ |
||||
{ |
||||
required: true, |
||||
message: '请输入登录密码', |
||||
}, |
||||
], |
||||
}, |
||||
{ |
||||
label: '确认密码', |
||||
field: 'confirmPassword', |
||||
component: 'InputPassword', |
||||
dynamicRules: ({ values }) => rules.confirmPassword(values, true), |
||||
}, |
||||
]; |
||||
|
||||
export const formAgentSchema: FormSchema[] = [ |
||||
{ |
||||
label: '', |
||||
field: 'id', |
||||
component: 'Input', |
||||
show: false, |
||||
}, |
||||
{ |
||||
field: 'userName', |
||||
label: '用户名', |
||||
component: 'Input', |
||||
componentProps: { |
||||
readOnly: true, |
||||
allowClear: false, |
||||
}, |
||||
}, |
||||
{ |
||||
field: 'agentUserName', |
||||
label: '代理人用户名', |
||||
required: true, |
||||
component: 'JSelectUser', |
||||
componentProps: { |
||||
rowKey: 'username', |
||||
labelKey: 'realname', |
||||
maxSelectCount: 10, |
||||
}, |
||||
}, |
||||
{ |
||||
field: 'startTime', |
||||
label: '代理开始时间', |
||||
component: 'DatePicker', |
||||
required: true, |
||||
componentProps: { |
||||
showTime: true, |
||||
valueFormat: 'YYYY-MM-DD HH:mm:ss', |
||||
placeholder: '请选择代理开始时间', |
||||
}, |
||||
}, |
||||
{ |
||||
field: 'endTime', |
||||
label: '代理结束时间', |
||||
component: 'DatePicker', |
||||
required: true, |
||||
componentProps: { |
||||
showTime: true, |
||||
valueFormat: 'YYYY-MM-DD HH:mm:ss', |
||||
placeholder: '请选择代理结束时间', |
||||
}, |
||||
}, |
||||
{ |
||||
field: 'status', |
||||
label: '状态', |
||||
component: 'JDictSelectTag', |
||||
defaultValue: '1', |
||||
componentProps: { |
||||
dictCode: 'valid_status', |
||||
type: 'radioButton', |
||||
}, |
||||
}, |
||||
]; |
||||
|
||||
export const formQuitAgentSchema: FormSchema[] = [ |
||||
{ |
||||
label: '', |
||||
field: 'id', |
||||
component: 'Input', |
||||
show: false, |
||||
}, |
||||
{ |
||||
field: 'userName', |
||||
label: '用户名', |
||||
component: 'Input', |
||||
componentProps: { |
||||
readOnly: true, |
||||
allowClear: false, |
||||
}, |
||||
}, |
||||
{ |
||||
field: 'agentUserName', |
||||
label: '交接人员', |
||||
required: true, |
||||
component: 'JSelectUser', |
||||
componentProps: { |
||||
rowKey: 'username', |
||||
labelKey: 'realname', |
||||
maxSelectCount: 1, |
||||
}, |
||||
}, |
||||
{ |
||||
field: 'startTime', |
||||
label: '交接开始时间', |
||||
component: 'DatePicker', |
||||
required: true, |
||||
componentProps: { |
||||
showTime: true, |
||||
valueFormat: 'YYYY-MM-DD HH:mm:ss', |
||||
placeholder: '请选择交接开始时间', |
||||
getPopupContainer: () => document.body, |
||||
}, |
||||
}, |
||||
{ |
||||
field: 'endTime', |
||||
label: '交接结束时间', |
||||
component: 'DatePicker', |
||||
required: true, |
||||
componentProps: { |
||||
showTime: true, |
||||
valueFormat: 'YYYY-MM-DD HH:mm:ss', |
||||
placeholder: '请选择交接结束时间', |
||||
getPopupContainer: () => document.body, |
||||
}, |
||||
}, |
||||
{ |
||||
field: 'status', |
||||
label: '状态', |
||||
component: 'JDictSelectTag', |
||||
defaultValue: '1', |
||||
componentProps: { |
||||
dictCode: 'valid_status', |
||||
type: 'radioButton', |
||||
}, |
||||
}, |
||||
]; |
||||
|
||||
//租户用户列表
|
||||
export const userTenantColumns: BasicColumn[] = [ |
||||
{ |
||||
title: '用户账号', |
||||
dataIndex: 'username', |
||||
width: 120, |
||||
}, |
||||
{ |
||||
title: '用户姓名', |
||||
dataIndex: 'realname', |
||||
width: 100, |
||||
}, |
||||
{ |
||||
title: '头像', |
||||
dataIndex: 'avatar', |
||||
width: 120, |
||||
customRender: render.renderAvatar, |
||||
}, |
||||
{ |
||||
title: '手机号', |
||||
dataIndex: 'phone', |
||||
width: 100, |
||||
}, |
||||
{ |
||||
title: '部门', |
||||
width: 150, |
||||
dataIndex: 'orgCodeTxt', |
||||
}, |
||||
{ |
||||
title: '状态', |
||||
dataIndex: 'status', |
||||
width: 80, |
||||
customRender: ({ text }) => { |
||||
if (text === '1') { |
||||
return '正常'; |
||||
} else if (text === '3') { |
||||
return '审批中'; |
||||
} else { |
||||
return '已拒绝'; |
||||
} |
||||
}, |
||||
}, |
||||
]; |
||||
|
||||
//用户租户搜索表单
|
||||
export const userTenantFormSchema: FormSchema[] = [ |
||||
{ |
||||
label: '账号', |
||||
field: 'username', |
||||
component: 'Input', |
||||
colProps: { span: 6 }, |
||||
}, |
||||
{ |
||||
label: '名字', |
||||
field: 'realname', |
||||
component: 'Input', |
||||
colProps: { span: 6 }, |
||||
}, |
||||
{ |
||||
label: '性别', |
||||
field: 'sex', |
||||
component: 'JDictSelectTag', |
||||
componentProps: { |
||||
dictCode: 'sex', |
||||
placeholder: '请选择性别', |
||||
stringToNumber: true, |
||||
}, |
||||
colProps: { span: 6 }, |
||||
}, |
||||
]; |
Loading…
Reference in new issue