Commit 9f8e5c41 authored by trumansdo's avatar trumansdo
Browse files

完成全部用户管理功能,

同时完成Vue通用页面组件
完成Element-UI 的 ELCascader的重包装
parent 228ab959
...@@ -18,7 +18,6 @@ public class ConsoleApplication extends SpringBootServletInitializer { ...@@ -18,7 +18,6 @@ public class ConsoleApplication extends SpringBootServletInitializer {
} }
public static void main(String[] args) { public static void main(String[] args) {
SpringApplication.run(ConsoleApplication.class, args); SpringApplication.run(ConsoleApplication.class, args);
} }
} }
...@@ -40,6 +40,7 @@ public class UserConsoleService extends CoreBaseService<CoreUser> { ...@@ -40,6 +40,7 @@ public class UserConsoleService extends CoreBaseService<CoreUser> {
@Autowired FileService fileService; @Autowired FileService fileService;
@Autowired PasswordEncryptService passwordEncryptService; @Autowired PasswordEncryptService passwordEncryptService;
@Autowired CoreDictService dictService; @Autowired CoreDictService dictService;
@Autowired CorePlatformService platformService; @Autowired CorePlatformService platformService;
...@@ -175,9 +176,7 @@ public class UserConsoleService extends CoreBaseService<CoreUser> { ...@@ -175,9 +176,7 @@ public class UserConsoleService extends CoreBaseService<CoreUser> {
} }
public void saveUserRole(CoreUserRole userRole) { public void saveUserRole(CoreUserRole userRole) {
long queryCount = sqlManager.templateCount(userRole); long queryCount = sqlManager.templateCount(userRole);
if (queryCount > 0) { if (queryCount > 0) {
throw new PlatformException("已存在用户角色关系"); throw new PlatformException("已存在用户角色关系");
} }
......
...@@ -33,6 +33,7 @@ import org.springframework.beans.factory.annotation.Autowired; ...@@ -33,6 +33,7 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestBody;
...@@ -64,6 +65,13 @@ public class UserConsoleElController { ...@@ -64,6 +65,13 @@ public class UserConsoleElController {
return JsonResult.success(allUsers); return JsonResult.success(allUsers);
} }
@Function("user.query")
@GetMapping("/{id}")
public JsonResult<CoreUser> users(@PathVariable("id") Long id) {
CoreUser coreUser = userConsoleService.queryUserById(id);
return JsonResult.success(coreUser);
}
@Function("user.add") @Function("user.add")
@PostMapping @PostMapping
public JsonResult<Long> addUser(@Validated(ValidateConfig.ADD.class) @RequestBody CoreUser user) { public JsonResult<Long> addUser(@Validated(ValidateConfig.ADD.class) @RequestBody CoreUser user) {
...@@ -92,6 +100,7 @@ public class UserConsoleElController { ...@@ -92,6 +100,7 @@ public class UserConsoleElController {
userConsoleService.batchDelSysUser(Arrays.asList(ids)); userConsoleService.batchDelSysUser(Arrays.asList(ids));
return JsonResult.success(); return JsonResult.success();
} }
/** 用户所有授权角色列表 */ /** 用户所有授权角色列表 */
@GetMapping("/roles") @GetMapping("/roles")
@Function("user.role") @Function("user.role")
...@@ -109,8 +118,9 @@ public class UserConsoleElController { ...@@ -109,8 +118,9 @@ public class UserConsoleElController {
@PostMapping("/roles") @PostMapping("/roles")
@Function("user.role") @Function("user.role")
@ResponseBody @ResponseBody
public JsonResult saveUserRole(@Validated CoreUserRole userRole) { public JsonResult saveUserRole(@Validated @RequestBody CoreUserRole userRole) {
userRole.setCreateTime(new Date()); Date now = new Date();
userRole.setCreateTime(now);
this.userConsoleService.saveUserRole(userRole); this.userConsoleService.saveUserRole(userRole);
this.platformService.clearFunctionCache(); this.platformService.clearFunctionCache();
return JsonResult.success(userRole.getId()); return JsonResult.success(userRole.getId());
......
package com.ibeetl.admin.core.conf; package com.ibeetl.admin.core.conf;
import static cn.hutool.system.SystemUtil.LINE_SEPRATOR; import static cn.hutool.system.SystemUtil.LINE_SEPRATOR;
import static java.lang.String.format;
import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.convert.Convert; import cn.hutool.core.convert.Convert;
import cn.hutool.core.map.MapUtil;
import cn.hutool.core.util.BooleanUtil;
import cn.hutool.core.util.CharsetUtil; import cn.hutool.core.util.CharsetUtil;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import cn.hutool.system.SystemUtil; import cn.hutool.system.SystemUtil;
import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectMapper;
import com.ibeetl.admin.core.util.FormFieldException;
import com.ibeetl.admin.core.util.PlatformException; import com.ibeetl.admin.core.util.PlatformException;
import com.ibeetl.admin.core.web.JsonResult; import com.ibeetl.admin.core.web.JsonResult;
import java.io.IOException; import java.io.IOException;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Optional;
import java.util.Set; import java.util.Set;
import javax.servlet.ServletException; import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
...@@ -33,15 +25,11 @@ import org.slf4j.LoggerFactory; ...@@ -33,15 +25,11 @@ import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.web.servlet.error.AbstractErrorController; import org.springframework.boot.autoconfigure.web.servlet.error.AbstractErrorController;
import org.springframework.boot.web.servlet.error.DefaultErrorAttributes; import org.springframework.boot.web.servlet.error.DefaultErrorAttributes;
import org.springframework.boot.web.servlet.error.ErrorAttributes;
import org.springframework.http.HttpHeaders; import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus; import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Controller; import org.springframework.stereotype.Controller;
import org.springframework.util.MimeType;
import org.springframework.util.MimeTypeUtils; import org.springframework.util.MimeTypeUtils;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.context.request.WebRequest;
import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.ModelAndView;
/** /**
......
...@@ -7,7 +7,6 @@ import com.fasterxml.jackson.databind.ObjectMapper; ...@@ -7,7 +7,6 @@ import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.PropertyNamingStrategy; import com.fasterxml.jackson.databind.PropertyNamingStrategy;
import com.fasterxml.jackson.databind.SerializationFeature; import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.databind.module.SimpleModule; import com.fasterxml.jackson.databind.module.SimpleModule;
import com.fasterxml.jackson.databind.ser.std.DateSerializer;
import com.ibeetl.admin.core.conf.jackson.serializer.CustomJsonResultSerializer; import com.ibeetl.admin.core.conf.jackson.serializer.CustomJsonResultSerializer;
import com.ibeetl.admin.core.conf.jackson.serializer.CustomLongSerializer; import com.ibeetl.admin.core.conf.jackson.serializer.CustomLongSerializer;
import com.ibeetl.admin.core.conf.jackson.serializer.DateToTimestampSerializer; import com.ibeetl.admin.core.conf.jackson.serializer.DateToTimestampSerializer;
...@@ -44,6 +43,11 @@ public class JacksonConfig { ...@@ -44,6 +43,11 @@ public class JacksonConfig {
simpleModule.addSerializer(JsonResult.class, new CustomJsonResultSerializer()); simpleModule.addSerializer(JsonResult.class, new CustomJsonResultSerializer());
simpleModule.addSerializer(DictTypeEnum.class, new DictTypeEnumSerializer()); simpleModule.addSerializer(DictTypeEnum.class, new DictTypeEnumSerializer());
simpleModule.addSerializer(Date.class, new DateToTimestampSerializer()); simpleModule.addSerializer(Date.class, new DateToTimestampSerializer());
/**
* todo 关于jackson对于枚举的反序列化,只能通过注解完成了。。
* 这些序列化接口配置都是无用的。自有一个{@link com.fasterxml.jackson.databind.deser.std.EnumDeserializer}
* */
// simpleModule.addDeserializer(DictTypeEnum.class, new DictTypeEnumDeserializer());
CustomLongSerializer longSerializer = new CustomLongSerializer(); CustomLongSerializer longSerializer = new CustomLongSerializer();
simpleModule.addSerializer(Long.class, longSerializer); simpleModule.addSerializer(Long.class, longSerializer);
...@@ -53,4 +57,3 @@ public class JacksonConfig { ...@@ -53,4 +57,3 @@ public class JacksonConfig {
return objectMapper; return objectMapper;
} }
} }
...@@ -7,28 +7,20 @@ import static org.springframework.http.HttpMethod.POST; ...@@ -7,28 +7,20 @@ import static org.springframework.http.HttpMethod.POST;
import static org.springframework.http.HttpMethod.PUT; import static org.springframework.http.HttpMethod.PUT;
import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.convert.Convert;
import cn.hutool.core.date.DateUtil;
import com.ibeetl.admin.core.conf.springmvc.convert.DateConditionalGenericConverter; import com.ibeetl.admin.core.conf.springmvc.convert.DateConditionalGenericConverter;
import com.ibeetl.admin.core.conf.springmvc.convert.StringToDictTypeEnumConverFactory; import com.ibeetl.admin.core.conf.springmvc.convert.StringToDictTypeEnumConverterFactory;
import com.ibeetl.admin.core.conf.springmvc.interceptor.HttpRequestInterceptor; import com.ibeetl.admin.core.conf.springmvc.interceptor.HttpRequestInterceptor;
import com.ibeetl.admin.core.conf.springmvc.interceptor.SessionInterceptor; import com.ibeetl.admin.core.conf.springmvc.interceptor.SessionInterceptor;
import com.ibeetl.admin.core.conf.springmvc.resolve.RequestBodyPlusProcessor; import com.ibeetl.admin.core.conf.springmvc.resolve.RequestBodyPlusProcessor;
import com.ibeetl.admin.core.service.CoreUserService; import com.ibeetl.admin.core.service.CoreUserService;
import java.util.Date;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Optional;
import java.util.Set;
import org.beetl.core.GroupTemplate; import org.beetl.core.GroupTemplate;
import org.beetl.ext.spring.BeetlGroupUtilConfiguration; import org.beetl.ext.spring.BeetlGroupUtilConfiguration;
import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
import org.springframework.core.ResolvableType;
import org.springframework.core.convert.TypeDescriptor;
import org.springframework.core.convert.converter.ConditionalGenericConverter;
import org.springframework.core.env.Environment; import org.springframework.core.env.Environment;
import org.springframework.format.FormatterRegistry; import org.springframework.format.FormatterRegistry;
import org.springframework.format.datetime.DateFormatter; import org.springframework.format.datetime.DateFormatter;
...@@ -101,7 +93,7 @@ public class SpringWebMvcConfigurer implements WebMvcConfigurer, InitializingBea ...@@ -101,7 +93,7 @@ public class SpringWebMvcConfigurer implements WebMvcConfigurer, InitializingBea
registry.addFormatter(new DateFormatter("yyyy-MM-dd HH:mm:ss")); registry.addFormatter(new DateFormatter("yyyy-MM-dd HH:mm:ss"));
registry.addFormatter(new DateFormatter("yyyy-MM-dd")); registry.addFormatter(new DateFormatter("yyyy-MM-dd"));
/*converter 在json传参时无效*/ /*converter 在json传参时无效*/
registry.addConverterFactory(new StringToDictTypeEnumConverFactory()); registry.addConverterFactory(new StringToDictTypeEnumConverterFactory());
registry.addConverter(new DateConditionalGenericConverter()); registry.addConverter(new DateConditionalGenericConverter());
} }
......
...@@ -195,11 +195,12 @@ public class BeetlConf { ...@@ -195,11 +195,12 @@ public class BeetlConf {
*/ */
@Override @Override
protected boolean isSimple(String sqlId) { protected boolean isSimple(String sqlId) {
if (sqlId.indexOf("_gen_") != -1) { // if (sqlId.indexOf("_gen_") != -1) {
return true; // return true;
} else { // } else {
return false; // return false;
} // }
return super.isSimple(sqlId);
} }
} }
} }
......
...@@ -3,6 +3,7 @@ package com.ibeetl.admin.core.conf.beetl.processor; ...@@ -3,6 +3,7 @@ package com.ibeetl.admin.core.conf.beetl.processor;
import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.convert.Convert; import cn.hutool.core.convert.Convert;
import cn.hutool.core.map.MapUtil; import cn.hutool.core.map.MapUtil;
import cn.hutool.core.util.StrUtil;
import com.ibeetl.admin.core.conf.beetl.resultmap.DBColumnProperty; import com.ibeetl.admin.core.conf.beetl.resultmap.DBColumnProperty;
import com.ibeetl.admin.core.conf.beetl.resultmap.GridCell; import com.ibeetl.admin.core.conf.beetl.resultmap.GridCell;
import com.ibeetl.admin.core.conf.beetl.resultmap.GridHeader; import com.ibeetl.admin.core.conf.beetl.resultmap.GridHeader;
...@@ -90,11 +91,15 @@ public class JsonBeanProcessor extends BeanProcessor { ...@@ -90,11 +91,15 @@ public class JsonBeanProcessor extends BeanProcessor {
ResultSetMetaData rsmd = rs.getMetaData(); ResultSetMetaData rsmd = rs.getMetaData();
int[] columnToProperty = this.mapColumnsToProperties(type, rsmd, props); int[] columnToProperty = this.mapColumnsToProperties(type, rsmd, props);
GridMapping mapping = (GridMapping) CacheUtil.get(sqlId); GridMapping mapping = null;
if (null == mapping) { if (StrUtil.isNotBlank(sqlId)) {
mapping = (GridMapping) CacheUtil.get(sqlId);
}
if (mapping == null) {
/*无映射的情况下使用beetlsql默认自带的映射*/ /*无映射的情况下使用beetlsql默认自带的映射*/
do { do {
super.createBean(sqlId, rs, type, props, columnToProperty); T bean = super.createBean(sqlId, rs, type, props, columnToProperty);
results.add(bean);
} while (rs.next()); } while (rs.next());
} else { } else {
/*复杂结果集映射,取消TailBean的便利性*/ /*复杂结果集映射,取消TailBean的便利性*/
...@@ -131,7 +136,8 @@ public class JsonBeanProcessor extends BeanProcessor { ...@@ -131,7 +136,8 @@ public class JsonBeanProcessor extends BeanProcessor {
if (null == mapping) { if (null == mapping) {
/*无映射的情况下使用beetlsql默认自带的映射*/ /*无映射的情况下使用beetlsql默认自带的映射*/
do { do {
results.add(super.createBean(sqlId, rs, type, props, columnToProperty)); T bean = super.createBean(sqlId, rs, type, props, columnToProperty);
results.add(bean);
} while (rs.next()); } while (rs.next());
} else { } else {
/*复杂结果集映射,取消TailBean的便利性*/ /*复杂结果集映射,取消TailBean的便利性*/
......
package com.ibeetl.admin.core.conf.jackson.serializer;
import cn.hutool.core.util.ReflectUtil;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
import com.ibeetl.admin.core.util.enums.DictTypeEnum;
import java.io.IOException;
public class DictTypeEnumDeserializer extends JsonDeserializer<DictTypeEnum> {
@Override
public DictTypeEnum deserialize(JsonParser p, DeserializationContext ctxt)
throws IOException, JsonProcessingException {
return null;
}
}
...@@ -6,7 +6,13 @@ import java.util.Map; ...@@ -6,7 +6,13 @@ import java.util.Map;
import org.springframework.core.convert.converter.Converter; import org.springframework.core.convert.converter.Converter;
import org.springframework.core.convert.converter.ConverterFactory; import org.springframework.core.convert.converter.ConverterFactory;
public class StringToDictTypeEnumConverFactory implements ConverterFactory<String, DictTypeEnum> { /**
* 描述:request参数转换分为两种:body传值和非body。这个转换工厂是非body,也就是不加注解{@link
* org.springframework.web.bind.annotation.RequestBody}
*
* @author 一日看尽长安花
*/
public class StringToDictTypeEnumConverterFactory implements ConverterFactory<String, DictTypeEnum> {
private static final Map<Class, Converter> CONVERTERS = MapUtil.newHashMap(); private static final Map<Class, Converter> CONVERTERS = MapUtil.newHashMap();
/** /**
......
package com.ibeetl.admin.core.entity; package com.ibeetl.admin.core.entity;
import java.time.LocalDateTime;
import java.time.ZonedDateTime;
import java.util.Date; import java.util.Date;
import javax.validation.constraints.NotNull; import javax.validation.constraints.NotNull;
import lombok.Data;
import org.beetl.sql.core.annotatoin.AutoID; import org.beetl.sql.core.annotatoin.AutoID;
import org.beetl.sql.core.annotatoin.SeqID; import org.beetl.sql.core.annotatoin.SeqID;
...@@ -13,6 +10,7 @@ import org.beetl.sql.core.annotatoin.SeqID; ...@@ -13,6 +10,7 @@ import org.beetl.sql.core.annotatoin.SeqID;
* 用户角色关系 * 用户角色关系
* gen by beetlsql 2016-11-22 * gen by beetlsql 2016-11-22
*/ */
@Data
public class CoreUserRole extends BaseEntity { public class CoreUserRole extends BaseEntity {
// 自增id // 自增id
...@@ -30,54 +28,4 @@ public class CoreUserRole extends BaseEntity { ...@@ -30,54 +28,4 @@ public class CoreUserRole extends BaseEntity {
private Long userId; private Long userId;
protected Date createTime; protected Date createTime;
protected ZonedDateTime updateTime;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public Long getOrgId() {
return orgId;
}
public void setOrgId(Long orgId) {
this.orgId = orgId;
}
public Long getRoleId() {
return roleId;
}
public void setRoleId(Long roleId) {
this.roleId = roleId;
}
public Long getUserId() {
return userId;
}
public void setUserId(Long userId) {
this.userId = userId;
}
public Date getCreateTime() {
return createTime;
}
public void setCreateTime(Date createTime) {
this.createTime = createTime;
}
public ZonedDateTime getUpdateTime() {
return updateTime;
}
public void setUpdateTime(ZonedDateTime updateTime) {
this.updateTime = updateTime;
}
} }
/* /*
* @Author: 一日看尽长安花 * @Author: 一日看尽长安花
* @since: 2019-09-04 20:55:14 * @since: 2019-09-04 20:55:14
* @LastEditTime: 2020-03-15 10:59:27 * @LastEditTime: 2020-04-25 19:50:39
* @LastEditors: 一日看尽长安花 * @LastEditors: 一日看尽长安花
* @Description: * @Description:
*/ */
...@@ -14,7 +14,7 @@ export function login(data) { ...@@ -14,7 +14,7 @@ export function login(data) {
data data
}); });
} }
/*用于vue-store中使用,获取当前用户的信息*/
export function getInfo(token) { export function getInfo(token) {
return request({ return request({
url: '/user/info', url: '/user/info',
...@@ -30,6 +30,10 @@ export function logout() { ...@@ -30,6 +30,10 @@ export function logout() {
}); });
} }
/**
* 用户管理页的数据
* @param {*} params
*/
export function users(params) { export function users(params) {
return request({ return request({
url: '/users', url: '/users',
...@@ -37,6 +41,16 @@ export function users(params) { ...@@ -37,6 +41,16 @@ export function users(params) {
params params
}); });
} }
/**
* 通过用户id获取指定用户数据
* @param {*} params
*/
export function getUserById(params) {
return request({
url: `/users/${params.id}`,
method: 'get'
});
}
export function usersMetadata() { export function usersMetadata() {
return request({ return request({
...@@ -60,7 +74,10 @@ export function updateUserData(data) { ...@@ -60,7 +74,10 @@ export function updateUserData(data) {
data data
}); });
} }
/**
* 删除用户管理页面的数据
* @param {*} data
*/
export function deleteUserData(data) { export function deleteUserData(data) {
return request({ return request({
url: '/users', url: '/users',
...@@ -68,7 +85,10 @@ export function deleteUserData(data) { ...@@ -68,7 +85,10 @@ export function deleteUserData(data) {
data data
}); });
} }
/**
* 导出用户管理页面中符合当前查询条件的数据Excel表格
* @param {*} data
*/
export function exportExcelUserData(data) { export function exportExcelUserData(data) {
return request({ return request({
url: '/users/excel/export', url: '/users/excel/export',
...@@ -76,7 +96,10 @@ export function exportExcelUserData(data) { ...@@ -76,7 +96,10 @@ export function exportExcelUserData(data) {
data data
}); });
} }
/**
* 获取用户管理-操作角色页面的数据
* @param {*} params
*/
export function getUserRoles(params) { export function getUserRoles(params) {
return request({ return request({
url: '/users/roles', url: '/users/roles',
...@@ -84,3 +107,14 @@ export function getUserRoles(params) { ...@@ -84,3 +107,14 @@ export function getUserRoles(params) {
params params
}); });
} }
/**
* 用户操作角色授权
* @param {Object} data
*/
export function addUserRoles(data) {
return request({
url: '/users/roles',
method: 'post',
data
});
}
<!-- <!--
* @Author: 一日看尽长安花 * @Author: 一日看尽长安花
* @since: 2019-10-12 16:14:37 * @since: 2019-10-12 16:14:37
* @LastEditTime: 2020-03-31 16:31:49 * @LastEditTime: 2020-04-10 20:47:33
* @LastEditors: 一日看尽长安花 * @LastEditors: 一日看尽长安花
* @Description: * @Description:
--> -->
...@@ -11,7 +11,7 @@ ...@@ -11,7 +11,7 @@
<el-form <el-form
ref="filterForm" ref="filterForm"
:size="size" :size="size"
:model="filterData" :model="slots.filterData"
@submit.native.prevent @submit.native.prevent
> >
<!-- 循环元数据构建搜索面板:除了下拉框 --> <!-- 循环元数据构建搜索面板:除了下拉框 -->
...@@ -23,7 +23,7 @@ ...@@ -23,7 +23,7 @@
<el-form-item> <el-form-item>
<el-input <el-input
v-if="judgeType(val.type, 'string')" v-if="judgeType(val.type, 'string')"
v-model="filterData[key]" v-model="slots.filterData[key]"
:placeholder="val.name" :placeholder="val.name"
:clearable="true" :clearable="true"
style="width: 200px;" style="width: 200px;"
...@@ -34,7 +34,7 @@ ...@@ -34,7 +34,7 @@
style="display: inline-block;position: relative;top: -0.3rem;" style="display: inline-block;position: relative;top: -0.3rem;"
> >
<el-date-picker <el-date-picker
v-model="filterData[key + '_start']" v-model="slots.filterData[key + '_start']"
type="datetime" type="datetime"
value-format="timestamp" value-format="timestamp"
:placeholder="val.name + '开始时间'" :placeholder="val.name + '开始时间'"
...@@ -42,7 +42,7 @@ ...@@ -42,7 +42,7 @@
</el-date-picker> </el-date-picker>
<el-date-picker <el-date-picker
v-model="filterData[key + '_end']" v-model="slots.filterData[key + '_end']"
type="datetime" type="datetime"
value-format="timestamp" value-format="timestamp"
:placeholder="val.name + '结束时间'" :placeholder="val.name + '结束时间'"
...@@ -52,7 +52,7 @@ ...@@ -52,7 +52,7 @@
</el-form-item> </el-form-item>
</div> </div>
<!-- 用于面板中的自定义表单,例如级联选择器,并通过作用域插槽的方式将数据传递给自定义表单 --> <!-- 用于面板中的自定义表单,例如级联选择器,并通过作用域插槽的方式将数据传递给自定义表单 -->
<slot name="filter-condition" :filter-data="filterData"> </slot> <slot name="filter-condition" :filter-data="slots"> </slot>
<div class="sp-search-btn-container"> <div class="sp-search-btn-container">
<el-button <el-button
ref="searchButton" ref="searchButton"
...@@ -79,7 +79,7 @@ ...@@ -79,7 +79,7 @@
添加 添加
</el-button> </el-button>
<!-- 用于面板中的自定义功能按钮,例如导入导出按钮等,并通过作用域插槽的方式将数据传递给自定义表单 --> <!-- 用于面板中的自定义功能按钮,例如导入导出按钮等,并通过作用域插槽的方式将数据传递给自定义表单 -->
<slot name="operation-btn-group" :filter-data="filterData"> </slot> <slot name="operation-btn-group" :filter-data="slots"> </slot>
</div> </div>
</div> </div>
</template> </template>
...@@ -100,7 +100,9 @@ export default { ...@@ -100,7 +100,9 @@ export default {
data() { data() {
return { return {
size: 'mini', size: 'mini',
filterData: {} slots: {
filterData: {}
}
}; };
}, },
computed: { computed: {
...@@ -122,10 +124,10 @@ export default { ...@@ -122,10 +124,10 @@ export default {
judgeType(str1, type) { judgeType(str1, type) {
return equalsIgnoreCase(str1, type); return equalsIgnoreCase(str1, type);
}, },
filterSearch(filterData) { filterSearch(event) {
this.$refs['filterForm'].validate(valid => { this.$refs['filterForm'].validate(valid => {
if (valid) { if (valid) {
this.$emit('filter-search', this.filterData); this.$emit('filter-search', this.slots.filterData);
} else { } else {
this.$notify({ this.$notify({
title: 'Faild', title: 'Faild',
......
<!-- <!--
* @Author: 一日看尽长安花 * @Author: 一日看尽长安花
* @since: 2019-10-12 16:14:37 * @since: 2019-10-12 16:14:37
* @LastEditTime: 2020-03-23 14:24:32 * @LastEditTime: 2020-04-16 20:45:56
* @LastEditors: 一日看尽长安花 * @LastEditors: 一日看尽长安花
* @Description: * @Description:
--> -->
...@@ -24,7 +24,7 @@ ...@@ -24,7 +24,7 @@
<el-form <el-form
ref="editFormGP" ref="editFormGP"
:rules="rules" :rules="rules"
:model="dialogData" :model="slots.dialogData"
label-position="right" label-position="right"
label-width="10vw" label-width="10vw"
class="sp-form" class="sp-form"
...@@ -37,7 +37,7 @@ ...@@ -37,7 +37,7 @@
> >
<el-input <el-input
v-if="judgeType(val.type, 'string')" v-if="judgeType(val.type, 'string')"
v-model="dialogData[key]" v-model="slots.dialogData[key]"
:placeholder="val.name" :placeholder="val.name"
:clearable="true" :clearable="true"
class="sp-form-item" class="sp-form-item"
...@@ -45,7 +45,7 @@ ...@@ -45,7 +45,7 @@
<el-date-picker <el-date-picker
v-else-if="judgeType(val.type, 'date')" v-else-if="judgeType(val.type, 'date')"
v-model="dialogData[key]" v-model="slots.dialogData[key]"
type="datetime" type="datetime"
value-format="timestamp" value-format="timestamp"
:placeholder="val.name + '时间'" :placeholder="val.name + '时间'"
...@@ -54,7 +54,7 @@ ...@@ -54,7 +54,7 @@
</el-date-picker> </el-date-picker>
</el-form-item> </el-form-item>
<!-- 用于面板中的自定义表单元素,例如级联选择器,并通过作用域插槽的方式将数据传递给自定义表单 --> <!-- 用于面板中的自定义表单元素,例如级联选择器,并通过作用域插槽的方式将数据传递给自定义表单 -->
<slot :dialog-data="dialogData" name="dialog-form-item"></slot> <slot :dialog-data="slots" name="dialog-form-item"></slot>
</el-form> </el-form>
</div> </div>
<template v-slot:footer> <template v-slot:footer>
...@@ -111,7 +111,11 @@ export default { ...@@ -111,7 +111,11 @@ export default {
} }
}, },
data() { data() {
return {}; return {
slots: {
dialogData: {}
}
};
}, },
computed: { computed: {
// 计算属性的 getter // 计算属性的 getter
...@@ -127,6 +131,11 @@ export default { ...@@ -127,6 +131,11 @@ export default {
return _metadata; return _metadata;
} }
}, },
watch: {
dialogData: function(newVal, oldVal) {
this.slots.dialogData = newVal;
}
},
methods: { methods: {
judgeType(str1, type) { judgeType(str1, type) {
return equalsIgnoreCase(str1, type); return equalsIgnoreCase(str1, type);
...@@ -134,8 +143,11 @@ export default { ...@@ -134,8 +143,11 @@ export default {
createData() { createData() {
this.$refs['editFormGP'].validate(valid => { this.$refs['editFormGP'].validate(valid => {
if (valid) { if (valid) {
this.$emit('create-data', this.dialogData); this.$emit('create-data', this.slots.dialogData);
this.$emit('update:dialogVisible', false); this.$emit('update:dialogVisible', false);
this.$nextTick(() => {
this.slots.dialogData = {};
});
} else { } else {
this.$notify({ this.$notify({
title: '失败', title: '失败',
...@@ -149,8 +161,11 @@ export default { ...@@ -149,8 +161,11 @@ export default {
updateData() { updateData() {
this.$refs['editFormGP'].validate(valid => { this.$refs['editFormGP'].validate(valid => {
if (valid) { if (valid) {
this.$emit('update-data', this.dialogData); this.$emit('update-data', this.slots.dialogData);
this.$emit('update:dialogVisible', false); this.$emit('update:dialogVisible', false);
this.$nextTick(() => {
this.slots.dialogData = {};
});
} else { } else {
this.$notify({ this.$notify({
title: '失败', title: '失败',
...@@ -162,7 +177,7 @@ export default { ...@@ -162,7 +177,7 @@ export default {
}); });
}, },
openDialog() { openDialog() {
/* 参照vue中 .sync 修饰符章节,方便的刷新父组件的dialogVisible值*/ /** 参照vue中 .sync 修饰符章节,方便的刷新父组件的dialogVisible值 */
this.$emit('update:dialogVisible', true); this.$emit('update:dialogVisible', true);
}, },
closeDialog() { closeDialog() {
......
<!-- <!--
* @Author: 一日看尽长安花 * @Author: 一日看尽长安花
* @since: 2019-10-12 15:43:18 * @since: 2019-10-12 15:43:18
* @LastEditTime: 2020-03-31 16:55:00 * @LastEditTime: 2020-04-11 19:55:13
* @LastEditors: 一日看尽长安花 * @LastEditors: 一日看尽长安花
* @Description: 后台管理页面的自动生成, * @Description: 后台管理页面的自动生成,
* 主要暴露了分页方法、数据表格搜索方法、条件查询方法、增删改方法 * 主要暴露了分页方法、数据表格搜索方法、条件查询方法、增删改方法
...@@ -15,8 +15,8 @@ ...@@ -15,8 +15,8 @@
@filter-search="filterSearch" @filter-search="filterSearch"
@handle-create="handleCreate" @handle-create="handleCreate"
> >
<template #filter-condition="{filterData:filterData}"> <template #filter-condition="{filterData:slots}">
<slot name="filter-condition" :filter-data="filterData"> </slot> <slot name="filter-condition" :filter-data="slots"> </slot>
</template> </template>
<template #operation-btn-group> <template #operation-btn-group>
<slot name="operation-btn-group"> </slot> <slot name="operation-btn-group"> </slot>
...@@ -45,8 +45,8 @@ ...@@ -45,8 +45,8 @@
> >
<!-- #dialog-form-item等价v-slot:dialog-form-item 语法 <!-- #dialog-form-item等价v-slot:dialog-form-item 语法
详情参照 解构插槽 Prop 章节 --> 详情参照 解构插槽 Prop 章节 -->
<template #dialog-form-item="{dialogData:dialogData}"> <template #dialog-form-item="{dialogData:slots}">
<slot :dialog-data="dialogData" name="dialog-form-item"></slot> <slot :dialog-data="slots" name="dialog-form-item"></slot>
</template> </template>
</detail-page> </detail-page>
</div> </div>
...@@ -99,7 +99,8 @@ export default { ...@@ -99,7 +99,8 @@ export default {
// 对话框标题 // 对话框标题
dialogTitle: '创建', dialogTitle: '创建',
// 对话框操作类型 // 对话框操作类型
operationType: 'create' operationType: 'create',
testData: {}
}; };
}, },
methods: { methods: {
......
<!--
* @Author: 一日看尽长安花
* @since: 2020-04-06 19:31:15
* @LastEditTime: 2020-04-26 12:40:27
* @LastEditors: 一日看尽长安花
* @Description: 使用时,必须指定一个key。不然多个组件之间会共用生命周期
* 请保持jsonPaths和labels数组的长度一致,同时保持和级联器的层级个数一致
* 如果jsonPaths是一个元素在其中,会提取出来作为唯一选中值。
* 对于级联器的handleChange事件,会同时修改jsonPaths和labels中的节点值,
* 确保级联器的效果和labels指定的传值参数
-->
<template>
<el-cascader
:key="Math.random()"
v-model="selectedValue"
:props="props"
:options="options"
:clearable="true"
:show-all-levels="false"
:placeholder="placeholder"
@change="handleChange"
></el-cascader>
</template>
<script>
export default {
name: 'SpCascader',
model: {
prop: 'model',
event: 'updateModel'
},
props: {
/**
* 因为插槽的传值是无法修改的,绕过这个机制
* 插槽传值时往上加一层root节点就行了
*/
model: {
type: Object,
required: true,
default: function() {
return {};
}
},
/** 在model中表示级联器选中值的json path数组,参考job_type的使用 */
jsonPaths: {
type: Array,
required: true,
default: function() {
return undefined;
}
},
props: {
type: Object,
required: true,
default: function() {
return null;
}
},
options: {
type: Array,
required: true,
default: function() {
return null;
}
},
placeholder: {
type: String,
default: function() {
return undefined;
}
},
/**
* 每一级对应的传值参数名,请按照顺序书写
* */
labels: {
type: Array,
required: true,
default: function() {
return null;
}
}
},
data() {
return {
selectedValue: []
};
},
mounted() {
this.init();
},
methods: {
init() {
for (let i = 0; i < this.jsonPaths.length; i++) {
const jsonPath = this.jsonPaths[i];
const val = this.$lodash.get(this.model, jsonPath);
this.selectedValue.push(val);
}
if (this.selectedValue.length === 1) {
this.selectedValue = this.selectedValue[0];
}
},
handleChange() {
let convertedValueObj = this.handleCascaderValue();
let sp_cascader = this.model['sp_cascader'];
convertedValueObj['sp_cascader'] = {
...convertedValueObj['sp_cascader'],
...sp_cascader
};
const updatedModel = this.$lodash.assignIn(
{},
this.model,
convertedValueObj
);
this.$emit('updateModel', updatedModel);
},
handleCascaderValue() {
const keyNames = this.labels;
let selValArray = this.selectedValue || [];
const index =
selValArray.length - keyNames.length <= 0
? 0
: selValArray.length - keyNames.length;
let resObj = {};
for (let i = index, j = 0; i < selValArray.length; i++, j++) {
this.$lodash.set(resObj, 'sp_cascader.' + keyNames[j], selValArray[i]);
this.$lodash.set(resObj, this.jsonPaths[j], selValArray[i]);
}
return resObj;
}
}
};
</script>
/* /*
* @Author: 一日看尽长安花 * @Author: 一日看尽长安花
* @since: 2020-01-13 23:12:07 * @since: 2020-01-13 23:12:07
* @LastEditTime: 2020-03-09 19:32:36 * @LastEditTime: 2020-04-19 20:32:05
* @LastEditors: 一日看尽长安花 * @LastEditors: 一日看尽长安花
* @Description: 与业务有关的非纯api的js * @Description: 与业务有关的非纯api的js
*/ */
import { layzyLoadDicts, immaditeLoadDicts } from '@/api/dict'; import { layzyLoadDicts, immaditeLoadDicts } from '@/api/dict';
import { assignIn, get, omit } from 'lodash';
/** /**
* @description: 异步载入级联器的数据 * @description: 异步载入级联器的数据
...@@ -36,22 +37,22 @@ export function layzyLoadDictTree(node, resolve, type) { ...@@ -36,22 +37,22 @@ export function layzyLoadDictTree(node, resolve, type) {
} }
/** /**
* @description: 将json中一个key值为数组的每个值转成指定的key-value,主要用于el中的级联选择器 * @description: 用sp-cascader组件,其所有的参数值挂在sp_cascader节点下。
* @param {obj} 包含选中值的对象 * @param keyNames 级联属性key
* @param {arrayKey} 数组的key * @returns {Object}
* @param {keyNames} 转换后的 key 名称级,必须按照数组中每个值的顺序对应
* @returns {Object} 包含转换后的 key-value 值
*/ */
export function handleCascaderValue(obj, arrayKey, keyNames) { export function handleCascaderValue(obj, keyNames = []) {
let selValArray = obj[arrayKey] || []; const sp_cascader = obj['sp_cascader'];
let resObj = {}; assignIn(obj, sp_cascader);
for (var i in selValArray) { delete obj['sp_cascader'];
if (keyNames.length === 1) { delete obj['spCascader'];
resObj[keyNames[0]] = selValArray[i]; for (let i in keyNames) {
} else { const path = keyNames[i];
resObj[keyNames[i]] = selValArray[i]; const node = get(obj, path);
const node_type = Object.prototype.toString.call(node);
if (node_type !== '[object String]') {
obj = omit(obj, path);
} }
} }
delete obj[arrayKey]; return obj;
return Object.assign({}, obj, resObj);
} }
<!-- <!--
* @Author: 一日看尽长安花 * @Author: 一日看尽长安花
* @since: 2020-04-05 13:21:44 * @since: 2020-04-05 13:21:44
* @LastEditTime: 2020-04-06 11:52:20 * @LastEditTime: 2020-04-26 18:32:27
* @LastEditors: 一日看尽长安花 * @LastEditors: 一日看尽长安花
* @Description: * @Description:
--> -->
...@@ -10,33 +10,48 @@ ...@@ -10,33 +10,48 @@
<el-dialog <el-dialog
:fullscreen="true" :fullscreen="true"
:center="true" :center="true"
:destroy-on-close="false" :destroy-on-close="true"
:show-close="false" :show-close="false"
:title="title" :title="title"
:visible="visible" :visible="visible"
:close-on-click-modal="false" :close-on-click-modal="false"
@open="openDialog"
@close="closeDialog" @close="closeDialog"
> >
<div class="dialog-container"> <div class="sp-dialog-container">
<el-form <el-form
ref="editFormGP" ref="editForm"
:model="dialogData" :model="dialogData_"
label-position="right" label-position="right"
label-width="10vw" label-width="10vw"
class="sp-form" class="sp-form"
> >
<el-form-item label="用户名"> <el-form-item label="用户名">
<el-input v-model="model"></el-input> <el-input v-model="dialogData_['name']" :disabled="true"></el-input>
</el-form-item> </el-form-item>
<el-form-item label="用户账号"> <el-form-item label="用户账号">
<el-input v-model="model"></el-input> <el-input v-model="dialogData_['code']" :disabled="true"></el-input>
</el-form-item> </el-form-item>
<el-form-item label="选择部门"> <el-form-item label="选择部门">
<el-cascader v-model="" :options="" @change=""> </el-cascader> <sp-cascader
:key="Math.random()"
v-model="dialogData_"
:json-paths="['org_id']"
:labels="['org_id']"
:props="orgIdCascaderProps"
:options="orgIdCascaderProps.options"
placeholder="选择部门"
></sp-cascader>
</el-form-item> </el-form-item>
<el-form-item label="选择角色"> <el-form-item label="选择角色">
<el-cascader v-model="" :options="" @change=""> </el-cascader> <sp-cascader
:key="Math.random()"
v-model="dialogData_"
:json-paths="['role_id']"
:labels="['role_id']"
:props="roleIdCascaderProps"
:options="roleIdCascaderProps.options"
placeholder="选择角色"
></sp-cascader>
</el-form-item> </el-form-item>
</el-form> </el-form>
</div> </div>
...@@ -54,29 +69,79 @@ ...@@ -54,29 +69,79 @@
</div> </div>
</template> </template>
<script> <script>
import SpCascader from '@/components/Wrapper/SpCascader';
import { addUserRoles } from '@/api/user';
import { handleCascaderValue } from '@/services/dict';
export default { export default {
name: 'AddUserRole', name: 'AddUserRole',
components: { SpCascader },
props: { props: {
dialogData: {
type: Object,
default: function() {
return {};
}
},
visible: {
type: Boolean,
default: false
},
title: { title: {
type: String, type: String,
default: '添加角色' default: '添加角色'
},
orgIdCascaderProps: {
type: Object,
default: function() {
return {};
}
},
roleIdCascaderProps: {
type: Object,
default: function() {
return {};
}
} }
}, },
data() { data() {
return { return {
visible: false, dialogData_: { ...this.dialogData }
dialogData: {}
}; };
}, },
methods: { methods: {
openDialog() { init() {
this.visible = true; this.$emit('update:visible', false);
}, },
closeDialog() { closeDialog() {
this.visible = false; this.init();
}, },
createUserRole() {} createUserRole() {
debugger;
const Vue = this;
handleCascaderValue(Vue.dialogData_, ['orgId', 'roleId']);
let params = {
user_id: Vue.dialogData_.id,
name: Vue.dialogData_.name,
code: Vue.dialogData_.code,
org_id: Vue.dialogData_.org_id,
role_id: Vue.dialogData_.role_id
};
addUserRoles(params).then(response => {
const { code, message, data } = { ...response };
Vue.$nextTick(() => {
Vue.init();
});
});
}
} }
}; };
</script> </script>
<style scoped></style> <style scoped>
.sp-dialog-container {
margin: 0 auto;
width: 50%;
}
.el-cascader {
width: 100%;
}
</style>
<!-- <!--
* @Author: 一日看尽长安花 * @Author: 一日看尽长安花
* @since: 2019-10-12 15:43:18 * @since: 2019-10-12 15:43:18
* @LastEditTime: 2020-04-03 20:52:21 * @LastEditTime: 2020-04-26 18:31:56
* @LastEditors: 一日看尽长安花 * @LastEditors: 一日看尽长安花
* @Description: * @Description:
--> -->
...@@ -19,39 +19,44 @@ ...@@ -19,39 +19,44 @@
@update-data="updateData" @update-data="updateData"
> >
<!-- 往搜索栏中添加搜索条件 --> <!-- 往搜索栏中添加搜索条件 -->
<template #filter-condition="{filterData:filterData}"> <template #filter-condition="{filterData:slots}">
<div class="filter-item-container"> <div class="filter-item-container">
<el-form-item> <el-form-item>
<el-cascader <sp-cascader
v-model="filterData['orgId']" :key="Math.random()"
v-model="slots.filterData"
:json-paths="['org.id']"
:labels="['org_id']"
:props="orgIdCascaderProps" :props="orgIdCascaderProps"
:options="orgIdCascaderProps.options" :options="orgIdCascaderProps.options"
:show-all-levels="false"
clearable
placeholder="部门" placeholder="部门"
></el-cascader> ></sp-cascader>
</el-form-item> </el-form-item>
</div> </div>
<div class="filter-item-container"> <div class="filter-item-container">
<el-form-item> <el-form-item>
<el-cascader <sp-cascader
v-model="filterData['jobType']" :key="Math.random()"
v-model="slots.filterData"
:json-paths="['job_type0.value', 'job_type1.value']"
:labels="['job_type0', 'job_type1']"
:props="jobTypeCascaderProps" :props="jobTypeCascaderProps"
:options="jobTypeCascaderProps.options" :options="jobTypeCascaderProps.options"
clearable
placeholder="岗位/职务" placeholder="岗位/职务"
></el-cascader> ></sp-cascader>
</el-form-item> </el-form-item>
</div> </div>
<div class="filter-item-container"> <div class="filter-item-container">
<el-form-item> <el-form-item>
<el-cascader <sp-cascader
v-model="filterData['state']" :key="Math.random()"
v-model="slots.filterData"
:json-paths="['state.value']"
:labels="['state']"
:props="stateCascaderProps" :props="stateCascaderProps"
:options="stateCascaderProps.options" :options="stateCascaderProps.options"
clearable
placeholder="状态" placeholder="状态"
></el-cascader> ></sp-cascader>
</el-form-item> </el-form-item>
</div> </div>
</template> </template>
...@@ -79,45 +84,49 @@ ...@@ -79,45 +84,49 @@
</el-button> </el-button>
</template> </template>
<!-- 编辑弹窗的插槽 --> <!-- 编辑弹窗的插槽 -->
<template #dialog-form-item="{dialogData:dialogData}"> <template #dialog-form-item="{dialogData:slots}">
<el-form-item key="orgIdKey" label="所在机构" prop="org_id"> <el-form-item key="orgIdKey" label="所在机构" prop="org_id">
<el-cascader <sp-cascader
v-model="dialogData['org_id_value']" :key="Math.random()"
v-model="slots.dialogData"
:json-paths="['org.id']"
:labels="['org_id']"
:props="orgIdCascaderProps" :props="orgIdCascaderProps"
:options="orgIdCascaderProps.options" :options="orgIdCascaderProps.options"
:show-all-levels="false"
clearable
placeholder="所在机构" placeholder="所在机构"
class="sp-form-item" class="sp-form-item"
></el-cascader> ></sp-cascader>
</el-form-item> </el-form-item>
<el-form-item key="jobTypeKey" label="岗位职务" prop="job_type"> <el-form-item key="jobTypeKey" label="岗位职务" prop="job_type">
<el-cascader <sp-cascader
v-model="dialogData['job_type_value']" :key="Math.random()"
v-model="slots.dialogData"
:json-paths="['job_type0.value', 'job_type1.value']"
:labels="['job_type0', 'job_type1']"
:props="jobTypeCascaderProps" :props="jobTypeCascaderProps"
:options="jobTypeCascaderProps.options" :options="jobTypeCascaderProps.options"
:show-all-levels="false"
clearable
placeholder="岗位职务" placeholder="岗位职务"
class="sp-form-item" class="sp-form-item"
></el-cascader> ></sp-cascader>
</el-form-item> </el-form-item>
<el-form-item key="stateKey" label="用户状态" prop="state"> <el-form-item key="stateKey" label="用户状态" prop="state">
<el-cascader <sp-cascader
v-model="dialogData['state_value']" :key="Math.random()"
v-model="slots.dialogData"
:json-paths="['state.value']"
:labels="['state']"
:props="stateCascaderProps" :props="stateCascaderProps"
:options="stateCascaderProps.options" :options="stateCascaderProps.options"
:show-all-levels="false"
clearable
placeholder="用户状态" placeholder="用户状态"
class="sp-form-item" class="sp-form-item"
></el-cascader> ></sp-cascader>
</el-form-item> </el-form-item>
<el-form-item key="fileKey" label="上传文档" prop="file"> <el-form-item key="fileKey" label="上传文档" prop="file">
<file-upload <file-upload
:key="Math.random()"
ref="fileUpload" ref="fileUpload"
:file-batch-id="dialogData.attachment_id" :file-batch-id="slots.dialogData.attachment_id"
:on-success="onUploadSuccess" :on-success="onUploadSuccess"
> >
<el-button slot="trigger" size="small" type="primary"> <el-button slot="trigger" size="small" type="primary">
...@@ -132,7 +141,7 @@ ...@@ -132,7 +141,7 @@
上传到服务器 上传到服务器
</el-button> </el-button>
<div slot="tip" class="el-upload__tip"> <div slot="tip" class="el-upload__tip">
只能上传jpg/png文件,且不超过500kb 只能上传word/pdf文档,且不超过2MB
</div> </div>
</file-upload> </file-upload>
</el-form-item> </el-form-item>
...@@ -144,6 +153,7 @@ ...@@ -144,6 +153,7 @@
<script> <script>
import GeneralPage from '@/components/GeneralPage'; import GeneralPage from '@/components/GeneralPage';
import FileUpload from '@/components/Upload/FileUpload'; import FileUpload from '@/components/Upload/FileUpload';
import SpCascader from '@/components/Wrapper/SpCascader';
import { import {
users, users,
...@@ -161,7 +171,7 @@ import { layzyLoadOrgTree } from '@/services/org'; ...@@ -161,7 +171,7 @@ import { layzyLoadOrgTree } from '@/services/org';
export default { export default {
name: 'CoreUsersView', name: 'CoreUsersView',
components: { GeneralPage, FileUpload }, components: { GeneralPage, FileUpload, SpCascader },
props: {}, props: {},
data() { data() {
return { return {
...@@ -226,32 +236,16 @@ export default { ...@@ -226,32 +236,16 @@ export default {
}); });
}, },
obtainData(queryParams) { obtainData(queryParams) {
this.loading = true; queryParams = handleCascaderValue(queryParams, [
queryParams = handleCascaderValue(queryParams, 'orgId', ['org_id']); 'state',
queryParams = handleCascaderValue(queryParams, 'jobType', [
'job_type0', 'job_type0',
'job_type1' 'job_type1'
]); ]);
queryParams = handleCascaderValue(queryParams, 'state', ['state']); this.loading = true;
const _lodash = this.$lodash; const _lodash = this.$lodash;
users(queryParams) users(queryParams)
.then(result => { .then(result => {
const { code, data } = { ...result }; const { code, data } = { ...result };
/**
* 这一步是因为编辑弹窗在创建时,v-model不能使用json多级获取,不然会报错;
* 所以将其处理为一级节点
*/
for (let i in result.data) {
let item = result.data[i];
item['org_id_value'] = _lodash.get(item, 'org.id');
item['state_value'] = _lodash.get(item, 'state.value');
if (item['job_type0']) {
item['job_type_value'] = _lodash.get(item, 'job_type0.value');
}
if (item['job_type1']) {
item['job_type_value'] = _lodash.get(item, 'job_type1.value');
}
}
this.tabledata = Object.assign({}, result); this.tabledata = Object.assign({}, result);
}) })
.catch(err => {}) .catch(err => {})
...@@ -271,16 +265,11 @@ export default { ...@@ -271,16 +265,11 @@ export default {
this.obtainData(Object.assign({ page: 1, limit: 10 }, queryParams)); this.obtainData(Object.assign({ page: 1, limit: 10 }, queryParams));
}, },
createData(dialogData) { createData(dialogData) {
dialogData = this.handleEditorDataObject(dialogData, 'org_id_value', { dialogData = handleCascaderValue(dialogData, [
org_id: 'org.id' 'state',
}); 'job_type0',
dialogData = this.handleEditorDataObject(dialogData, 'state_value', { 'job_type1'
state: 'state.value' ]);
});
dialogData = this.handleEditorDataObject(dialogData, 'job_type_value', {
job_type0: 'job_type0.value',
job_type1: 'job_type1.value'
});
const Vue = this; const Vue = this;
saveUserData(dialogData) saveUserData(dialogData)
.then(result => { .then(result => {
...@@ -306,16 +295,11 @@ export default { ...@@ -306,16 +295,11 @@ export default {
}); });
}, },
updateData(dialogData) { updateData(dialogData) {
dialogData = this.handleEditorDataObject(dialogData, 'org_id_value', { dialogData = handleCascaderValue(dialogData, [
org_id: 'org.id' 'state',
}); 'job_type0',
dialogData = this.handleEditorDataObject(dialogData, 'state_value', { 'job_type1'
state: 'state.value' ]);
});
dialogData = this.handleEditorDataObject(dialogData, 'job_type_value', {
job_type0: 'job_type0.value',
job_type1: 'job_type1.value'
});
const Vue = this; const Vue = this;
updateUserData(dialogData) updateUserData(dialogData)
.then(result => { .then(result => {
...@@ -325,8 +309,8 @@ export default { ...@@ -325,8 +309,8 @@ export default {
* 将回调延迟到下次 DOM 更新循环之后执行。 * 将回调延迟到下次 DOM 更新循环之后执行。
* 而数据更新就代表dom更新,所以如果创建成功,数据就会更新 * 而数据更新就代表dom更新,所以如果创建成功,数据就会更新
*/ */
this.$nextTick(() => { thVueis.$nextTick(() => {
this.$notify({ Vue.$notify({
title: '成功', title: '成功',
message: '修改成功1', message: '修改成功1',
type: 'success', type: 'success',
...@@ -335,8 +319,8 @@ export default { ...@@ -335,8 +319,8 @@ export default {
}); });
}) })
.catch(err => { .catch(err => {
this.$nextTick(() => { Vue.$nextTick(() => {
this.$notify({ Vue.$notify({
title: '失败', title: '失败',
message: '修改用户失败', message: '修改用户失败',
type: 'error', type: 'error',
...@@ -405,12 +389,6 @@ export default { ...@@ -405,12 +389,6 @@ export default {
let queryParams = this.$lodash.mapValues( let queryParams = this.$lodash.mapValues(
this.$children[0].$refs.searchPaneGP.$data.filterData this.$children[0].$refs.searchPaneGP.$data.filterData
); );
queryParams = handleCascaderValue(queryParams, 'orgId', ['org_id']);
queryParams = handleCascaderValue(queryParams, 'jobType', [
'job_type0',
'job_type1'
]);
queryParams = handleCascaderValue(queryParams, 'state', ['state']);
/** /**
* 导出Excel文件的两步: * 导出Excel文件的两步:
* 1、通过查询条件由后台生成Excel临时文件,返回临时文件path * 1、通过查询条件由后台生成Excel临时文件,返回临时文件path
...@@ -423,8 +401,18 @@ export default { ...@@ -423,8 +401,18 @@ export default {
}); });
}, },
editUserRoles() { editUserRoles() {
const _table = this.$children[0].$refs.dataTableGP.$refs.dataTable;
const isSelection = _table.selection.length > 0 ? true : false;
if (!isSelection) {
this.$message({
type: 'warning',
message: '请选择一行数据'
});
return;
}
const _selected = _table.selection[0];
const _router = this.$router; const _router = this.$router;
_router.push({ name: 'ManagerUserRole', params: { id: 1 } }); _router.push({ name: 'ManagerUserRole', params: { id: _selected.id } });
} }
} }
}; };
......
<!-- <!--
* @Author: 一日看尽长安花 * @Author: 一日看尽长安花
* @since: 2020-03-29 16:00:50 * @since: 2020-03-29 16:00:50
* @LastEditTime: 2020-04-05 18:17:17 * @LastEditTime: 2020-04-23 14:06:39
* @LastEditors: 一日看尽长安花 * @LastEditors: 一日看尽长安花
* @Description: * @Description:
--> -->
...@@ -93,14 +93,23 @@ ...@@ -93,14 +93,23 @@
:limit.sync="queryParams.limit" :limit.sync="queryParams.limit"
@pagination="pagination" @pagination="pagination"
/> />
<add-user-role ref="editDialog" :title="dialogTitle"> </add-user-role> <add-user-role
:key="Math.random()"
ref="editDialog"
:dialog-data="dialogData"
:title="dialogTitle"
:visible.sync="visible"
:org-id-cascader-props="orgIdCascaderProps"
:role-id-cascader-props="roleIdCascaderProps"
>
</add-user-role>
</div> </div>
</template> </template>
<script> <script>
import Pagination from '@/components/Pagination'; import Pagination from '@/components/Pagination';
import { immaditeLoadRoles } from '@/api/role'; import { immaditeLoadRoles } from '@/api/role';
import { immaditeLoadOrgs } from '@/api/org'; import { immaditeLoadOrgs } from '@/api/org';
import { getUserRoles } from '@/api/user'; import { getUserRoles, getUserById } from '@/api/user';
import AddUserRole from './add-user-role'; import AddUserRole from './add-user-role';
export default { export default {
...@@ -124,7 +133,9 @@ export default { ...@@ -124,7 +133,9 @@ export default {
page: 1, page: 1,
limit: 10 limit: 10
}, },
dialogTitle: '' dialogTitle: '',
dialogData: {},
visible: false
}; };
}, },
mounted() { mounted() {
...@@ -146,12 +157,17 @@ export default { ...@@ -146,12 +157,17 @@ export default {
const { code, data } = { ...result }; const { code, data } = { ...result };
this.tableData = data; this.tableData = data;
}); });
getUserById({ id: this.id }).then(result => {
const { code, data } = { ...result };
this.dialogData = data;
});
}, },
methods: { methods: {
filterSearch() {}, filterSearch() {},
pagination(pageParams) {}, pagination(pageParams) {},
showDialog() { showDialog() {
this.$refs.editDialog.openDialog(); this.dialogTitle = '创建角色';
this.visible = true;
}, },
deleteUserRole() { deleteUserRole() {
const _table = this.$refs.dataTable; const _table = this.$refs.dataTable;
...@@ -165,7 +181,6 @@ export default { ...@@ -165,7 +181,6 @@ export default {
} }
const _selList = _table.selection; const _selList = _table.selection;
const ids = _selList.map(item => item.id); const ids = _selList.map(item => item.id);
debugger;
} }
} }
}; };
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment