Merge branch 'master' of https://github.com/YunaiV/ruoyi-vue-pro into feature/1.6.2

plp
YunaiV 4 years ago
commit ed847ac2ee

@ -0,0 +1,26 @@
### 基本信息
- ruoyi-vue-pro 版本:
- 操作系统:
- 数据库:
### 复现步骤
第一步,
第二步,
第三步,
### 报错信息
[截图]
[截图]
---
建议:项目不是很难,碰到问题时,建议先花 2-4 小时的时间进行自查。
Issue 中如果带上自己的分析,可以被更快更高效的解决。

@ -0,0 +1,34 @@
---
name: 问题反馈
about: 请详细描述,以便更高快的获得到解决
title: ''
labels: ''
assignees: ''
---
### 基本信息
- ruoyi-vue-pro 版本:
- 操作系统:
- 数据库:
### 复现步骤
第一步,
第二步,
第三步,
### 报错信息
[截图]
[截图]
---
建议:项目不是很难,碰到问题时,建议先花 2-4 小时的时间进行自查。
Issue 中如果带上自己的分析,可以被更快更高效的解决。

@ -1797,7 +1797,7 @@ CREATE TABLE `system_oauth2_client` (
-- Records of system_oauth2_client -- Records of system_oauth2_client
-- ---------------------------- -- ----------------------------
BEGIN; BEGIN;
INSERT INTO `system_oauth2_client` (`id`, `client_id`, `secret`, `name`, `logo`, `description`, `status`, `access_token_validity_seconds`, `refresh_token_validity_seconds`, `redirect_uris`, `auto_approve`, `authorized_grant_types`, `scopes`, `authorities`, `resource_ids`, `additional_information`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1, 'default', 'admin123', '芋道源码', 'http://test.yudao.iocoder.cn/a5e2e244368878a366b516805a4aabf1.png', '我是描述', 0, 180, 8640, '[\"https://www.iocoder.cn\",\"https://doc.iocoder.cn\"]', b'1', '[\"password\",\"authorization_code\",\"implicit\",\"refresh_token\"]', '[\"user_info\"]', '[\"system:user:query\"]', '[]', '{}', '1', '2022-05-11 21:47:12', '1', '2022-05-12 01:00:20', b'0'); INSERT INTO `system_oauth2_client` (`id`, `client_id`, `secret`, `name`, `logo`, `description`, `status`, `access_token_validity_seconds`, `refresh_token_validity_seconds`, `redirect_uris`, `auto_approve`, `authorized_grant_types`, `scopes`, `authorities`, `resource_ids`, `additional_information`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (1, 'default', 'admin123', '芋道源码', 'http://test.yudao.iocoder.cn/a5e2e244368878a366b516805a4aabf1.png', '我是描述', 0, 999999999, 8640, '[\"https://www.iocoder.cn\",\"https://doc.iocoder.cn\"]', b'1', '[\"password\",\"authorization_code\",\"implicit\",\"refresh_token\"]', '[\"user_info\"]', '[\"system:user:query\"]', '[]', '{}', '1', '2022-05-11 21:47:12', '1', '2022-05-12 01:00:20', b'0');
INSERT INTO `system_oauth2_client` (`id`, `client_id`, `secret`, `name`, `logo`, `description`, `status`, `access_token_validity_seconds`, `refresh_token_validity_seconds`, `redirect_uris`, `auto_approve`, `authorized_grant_types`, `scopes`, `authorities`, `resource_ids`, `additional_information`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (40, 'test', 'test2', 'biubiu', 'http://test.yudao.iocoder.cn/277a899d573723f1fcdfb57340f00379.png', NULL, 0, 1800, 43200, '[\"https://www.iocoder.cn\"]', b'1', '[\"password\",\"authorization_code\",\"implicit\"]', '[]', '[]', '[]', '{}', '1', '2022-05-12 00:28:20', '1', '2022-05-12 00:59:53', b'0'); INSERT INTO `system_oauth2_client` (`id`, `client_id`, `secret`, `name`, `logo`, `description`, `status`, `access_token_validity_seconds`, `refresh_token_validity_seconds`, `redirect_uris`, `auto_approve`, `authorized_grant_types`, `scopes`, `authorities`, `resource_ids`, `additional_information`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES (40, 'test', 'test2', 'biubiu', 'http://test.yudao.iocoder.cn/277a899d573723f1fcdfb57340f00379.png', NULL, 0, 1800, 43200, '[\"https://www.iocoder.cn\"]', b'1', '[\"password\",\"authorization_code\",\"implicit\"]', '[]', '[]', '[]', '{}', '1', '2022-05-12 00:28:20', '1', '2022-05-12 00:59:53', b'0');
COMMIT; COMMIT;

@ -3153,7 +3153,7 @@ COMMENT ON TABLE "SYSTEM_OAUTH2_CLIENT" IS 'OAuth2 客户端表';
-- Records of SYSTEM_OAUTH2_CLIENT -- Records of SYSTEM_OAUTH2_CLIENT
-- ---------------------------- -- ----------------------------
INSERT INTO "SYSTEM_OAUTH2_CLIENT" ("ID", "CLIENT_ID", "SECRET", "NAME", "LOGO", "DESCRIPTION", "STATUS", "ACCESS_TOKEN_VALIDITY_SECONDS", "REFRESH_TOKEN_VALIDITY_SECONDS", "REDIRECT_URIS", "AUTO_APPROVE", "AUTHORIZED_GRANT_TYPES", "SCOPES", "AUTHORITIES", "RESOURCE_IDS", "ADDITIONAL_INFORMATION", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1', 'default', 'admin123', '芋道源码', 'http://test.yudao.iocoder.cn/a5e2e244368878a366b516805a4aabf1.png', '我是描述', '0', '180', '8640', '["https://www.iocoder.cn","https://doc.iocoder.cn"]', '1', '["password","authorization_code","implicit","refresh_token"]', '["user_info"]', '["system:user:query"]', '[]', '{}', '1', TO_DATE('2022-05-11 21:47:12', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-05-12 01:00:20', 'SYYYY-MM-DD HH24:MI:SS'), '0'); INSERT INTO "SYSTEM_OAUTH2_CLIENT" ("ID", "CLIENT_ID", "SECRET", "NAME", "LOGO", "DESCRIPTION", "STATUS", "ACCESS_TOKEN_VALIDITY_SECONDS", "REFRESH_TOKEN_VALIDITY_SECONDS", "REDIRECT_URIS", "AUTO_APPROVE", "AUTHORIZED_GRANT_TYPES", "SCOPES", "AUTHORITIES", "RESOURCE_IDS", "ADDITIONAL_INFORMATION", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('1', 'default', 'admin123', '芋道源码', 'http://test.yudao.iocoder.cn/a5e2e244368878a366b516805a4aabf1.png', '我是描述', '0', '180', '8640', '["https://www.iocoder.cn","https://doc.iocoder.cn"]', '1', '["password","authorization_code","implicit","refresh_token"]', '["user_info"]', '["system:user:query"]', '[]', '{}', '1', TO_DATE('2022-05-11 21:47:12', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-05-12 01:00:20', 'SYYYY-MM-DD HH24:MI:SS'), '0');
INSERT INTO "SYSTEM_OAUTH2_CLIENT" ("ID", "CLIENT_ID", "SECRET", "NAME", "LOGO", "DESCRIPTION", "STATUS", "ACCESS_TOKEN_VALIDITY_SECONDS", "REFRESH_TOKEN_VALIDITY_SECONDS", "REDIRECT_URIS", "AUTO_APPROVE", "AUTHORIZED_GRANT_TYPES", "SCOPES", "AUTHORITIES", "RESOURCE_IDS", "ADDITIONAL_INFORMATION", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('40', 'test', 'test2', 'biubiu', 'http://test.yudao.iocoder.cn/277a899d573723f1fcdfb57340f00379.png', NULL, '0', '1800', '43200', '["https://www.iocoder.cn"]', '1', '["password","authorization_code","implicit"]', '[]', '[]', '[]', '{}', '1', TO_DATE('2022-05-12 00:28:20', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-05-13 09:41:21', 'SYYYY-MM-DD HH24:MI:SS'), '0'); INSERT INTO "SYSTEM_OAUTH2_CLIENT" ("ID", "CLIENT_ID", "SECRET", "NAME", "LOGO", "DESCRIPTION", "STATUS", "ACCESS_TOKEN_VALIDITY_SECONDS", "REFRESH_TOKEN_VALIDITY_SECONDS", "REDIRECT_URIS", "AUTO_APPROVE", "AUTHORIZED_GRANT_TYPES", "SCOPES", "AUTHORITIES", "RESOURCE_IDS", "ADDITIONAL_INFORMATION", "CREATOR", "CREATE_TIME", "UPDATER", "UPDATE_TIME", "DELETED") VALUES ('40', 'test', 'test2', 'biubiu', 'http://test.yudao.iocoder.cn/277a899d573723f1fcdfb57340f00379.png', NULL, '0', '999999999', '43200', '["https://www.iocoder.cn"]', '1', '["password","authorization_code","implicit"]', '[]', '[]', '[]', '{}', '1', TO_DATE('2022-05-12 00:28:20', 'SYYYY-MM-DD HH24:MI:SS'), '1', TO_DATE('2022-05-13 09:41:21', 'SYYYY-MM-DD HH24:MI:SS'), '0');
COMMIT; COMMIT;
COMMIT; COMMIT;

@ -3470,7 +3470,7 @@ COMMENT ON TABLE "system_oauth2_client" IS 'OAuth2 客户端表';
-- Records of system_oauth2_client -- Records of system_oauth2_client
-- ---------------------------- -- ----------------------------
BEGIN; BEGIN;
INSERT INTO "system_oauth2_client" ("id", "client_id", "secret", "name", "logo", "description", "status", "access_token_validity_seconds", "refresh_token_validity_seconds", "redirect_uris", "auto_approve", "authorized_grant_types", "scopes", "authorities", "resource_ids", "additional_information", "creator", "create_time", "updater", "update_time", "deleted") VALUES (1, 'default', 'admin123', '芋道源码', 'http://test.yudao.iocoder.cn/a5e2e244368878a366b516805a4aabf1.png', '我是描述', 0, 180, 8640, '["https://www.iocoder.cn","https://doc.iocoder.cn"]', '1', '["password","authorization_code","implicit","refresh_token"]', '["user_info"]', '["system:user:query"]', '[]', '{}', '1', '2022-05-11 21:47:12', '1', '2022-05-12 01:00:20', 0); INSERT INTO "system_oauth2_client" ("id", "client_id", "secret", "name", "logo", "description", "status", "access_token_validity_seconds", "refresh_token_validity_seconds", "redirect_uris", "auto_approve", "authorized_grant_types", "scopes", "authorities", "resource_ids", "additional_information", "creator", "create_time", "updater", "update_time", "deleted") VALUES (1, 'default', 'admin123', '芋道源码', 'http://test.yudao.iocoder.cn/a5e2e244368878a366b516805a4aabf1.png', '我是描述', 0, 999999999, 8640, '["https://www.iocoder.cn","https://doc.iocoder.cn"]', '1', '["password","authorization_code","implicit","refresh_token"]', '["user_info"]', '["system:user:query"]', '[]', '{}', '1', '2022-05-11 21:47:12', '1', '2022-05-12 01:00:20', 0);
INSERT INTO "system_oauth2_client" ("id", "client_id", "secret", "name", "logo", "description", "status", "access_token_validity_seconds", "refresh_token_validity_seconds", "redirect_uris", "auto_approve", "authorized_grant_types", "scopes", "authorities", "resource_ids", "additional_information", "creator", "create_time", "updater", "update_time", "deleted") VALUES (40, 'test', 'test2', 'biubiu', 'http://test.yudao.iocoder.cn/277a899d573723f1fcdfb57340f00379.png', NULL, 0, 1800, 43200, '["https://www.iocoder.cn"]', 'true', '["password","authorization_code","implicit"]', '[]', '[]', '[]', '{}', '1', '2022-05-12 00:28:20', '1', '2022-05-13 01:04:21.023', 0); INSERT INTO "system_oauth2_client" ("id", "client_id", "secret", "name", "logo", "description", "status", "access_token_validity_seconds", "refresh_token_validity_seconds", "redirect_uris", "auto_approve", "authorized_grant_types", "scopes", "authorities", "resource_ids", "additional_information", "creator", "create_time", "updater", "update_time", "deleted") VALUES (40, 'test', 'test2', 'biubiu', 'http://test.yudao.iocoder.cn/277a899d573723f1fcdfb57340f00379.png', NULL, 0, 1800, 43200, '["https://www.iocoder.cn"]', 'true', '["password","authorization_code","implicit"]', '[]', '[]', '[]', '{}', '1', '2022-05-12 00:28:20', '1', '2022-05-13 01:04:21.023', 0);
COMMIT; COMMIT;

File diff suppressed because it is too large Load Diff

@ -58,6 +58,14 @@
<groupId>com.baomidou</groupId> <groupId>com.baomidou</groupId>
<artifactId>dynamic-datasource-spring-boot-starter</artifactId> <!-- 多数据源 --> <artifactId>dynamic-datasource-spring-boot-starter</artifactId> <!-- 多数据源 -->
</dependency> </dependency>
<!-- 工具类相关 -->
<dependency>
<groupId>com.github.ulisesbocchio</groupId>
<artifactId>jasypt-spring-boot-starter</artifactId> <!-- 加解密 -->
<optional>true</optional>
</dependency>
</dependencies> </dependencies>
</project> </project>

@ -0,0 +1,70 @@
package cn.iocoder.yudao.framework.mybatis.core.type;
import cn.hutool.core.lang.Assert;
import cn.hutool.extra.spring.SpringUtil;
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
import org.jasypt.encryption.StringEncryptor;
import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
/**
* TypeHandler {@link StringEncryptor}
* jasypt.encryptor.password
*
* @author
*/
public class EncryptTypeHandler extends BaseTypeHandler<String> {
private static StringEncryptor encryptor;
@Override
public void setNonNullParameter(PreparedStatement ps, int i, String parameter, JdbcType jdbcType) throws SQLException {
ps.setString(i, getEncryptor().encrypt(parameter));
}
@Override
public String getNullableResult(ResultSet rs, String columnName) throws SQLException {
String value = rs.getString(columnName);
return decrypt(value);
}
@Override
public String getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
String value = rs.getString(columnIndex);
return decrypt(value);
}
@Override
public String getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
String value = cs.getString(columnIndex);
return decrypt(value);
}
private static String decrypt(String value) {
if (value == null) {
return null;
}
return getEncryptor().decrypt(value);
}
public static String encrypt(String rawValue) {
if (rawValue == null) {
return null;
}
return getEncryptor().encrypt(rawValue);
}
private static StringEncryptor getEncryptor() {
if (encryptor != null) {
return encryptor;
}
encryptor = SpringUtil.getBean(StringEncryptor.class);
Assert.notNull(encryptor, "StringEncryptor 不能为空");
return encryptor;
}
}

@ -21,7 +21,7 @@ import java.util.List;
*/ */
@MappedJdbcTypes(JdbcType.VARCHAR) @MappedJdbcTypes(JdbcType.VARCHAR)
@MappedTypes(List.class) @MappedTypes(List.class)
public class StringLiSTTypeHandler implements TypeHandler<List<String>> { public class StringListTypeHandler implements TypeHandler<List<String>> {
private static final String COMMA = ","; private static final String COMMA = ",";

@ -1,7 +1,9 @@
package cn.iocoder.yudao.module.infra.dal.dataobject.db; package cn.iocoder.yudao.module.infra.dal.dataobject.db;
import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
import cn.iocoder.yudao.framework.mybatis.core.type.EncryptTypeHandler;
import com.baomidou.mybatisplus.annotation.KeySequence; import com.baomidou.mybatisplus.annotation.KeySequence;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data; import lombok.Data;
@ -10,7 +12,7 @@ import lombok.Data;
* *
* @author * @author
*/ */
@TableName("infra_data_source_config") @TableName(value = "infra_data_source_config", autoResultMap = true)
@KeySequence("infra_data_source_config_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 @KeySequence("infra_data_source_config_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
@Data @Data
public class DataSourceConfigDO extends BaseDO { public class DataSourceConfigDO extends BaseDO {
@ -40,6 +42,7 @@ public class DataSourceConfigDO extends BaseDO {
/** /**
* *
*/ */
@TableField(typeHandler = EncryptTypeHandler.class)
private String password; private String password;
} }

@ -8,7 +8,6 @@ import cn.iocoder.yudao.module.infra.dal.dataobject.db.DataSourceConfigDO;
import cn.iocoder.yudao.module.infra.dal.mysql.db.DataSourceConfigMapper; import cn.iocoder.yudao.module.infra.dal.mysql.db.DataSourceConfigMapper;
import com.baomidou.dynamic.datasource.spring.boot.autoconfigure.DataSourceProperty; import com.baomidou.dynamic.datasource.spring.boot.autoconfigure.DataSourceProperty;
import com.baomidou.dynamic.datasource.spring.boot.autoconfigure.DynamicDataSourceProperties; import com.baomidou.dynamic.datasource.spring.boot.autoconfigure.DynamicDataSourceProperties;
import org.jasypt.encryption.StringEncryptor;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
@ -32,9 +31,6 @@ public class DataSourceConfigServiceImpl implements DataSourceConfigService {
@Resource @Resource
private DataSourceConfigMapper dataSourceConfigMapper; private DataSourceConfigMapper dataSourceConfigMapper;
@Resource
private StringEncryptor stringEncryptor;
@Resource @Resource
private DynamicDataSourceProperties dynamicDataSourceProperties; private DynamicDataSourceProperties dynamicDataSourceProperties;
@ -44,7 +40,6 @@ public class DataSourceConfigServiceImpl implements DataSourceConfigService {
checkConnectionOK(dataSourceConfig); checkConnectionOK(dataSourceConfig);
// 插入 // 插入
dataSourceConfig.setPassword(stringEncryptor.encrypt(createReqVO.getPassword()));
dataSourceConfigMapper.insert(dataSourceConfig); dataSourceConfigMapper.insert(dataSourceConfig);
// 返回 // 返回
return dataSourceConfig.getId(); return dataSourceConfig.getId();
@ -58,7 +53,6 @@ public class DataSourceConfigServiceImpl implements DataSourceConfigService {
checkConnectionOK(updateObj); checkConnectionOK(updateObj);
// 更新 // 更新
updateObj.setPassword(stringEncryptor.encrypt(updateObj.getPassword()));
dataSourceConfigMapper.updateById(updateObj); dataSourceConfigMapper.updateById(updateObj);
} }
@ -83,12 +77,7 @@ public class DataSourceConfigServiceImpl implements DataSourceConfigService {
return buildMasterDataSourceConfig(); return buildMasterDataSourceConfig();
} }
// 从 DB 中读取 // 从 DB 中读取
DataSourceConfigDO dataSourceConfig = dataSourceConfigMapper.selectById(id); return dataSourceConfigMapper.selectById(id);
try {
dataSourceConfig.setPassword(stringEncryptor.decrypt(dataSourceConfig.getPassword()));
} catch (Exception ignore) { // 解码失败,则不解码
}
return dataSourceConfig;
} }
@Override @Override

@ -1,5 +1,7 @@
package cn.iocoder.yudao.module.infra.service.db; package cn.iocoder.yudao.module.infra.service.db;
import cn.hutool.core.util.ReflectUtil;
import cn.iocoder.yudao.framework.mybatis.core.type.EncryptTypeHandler;
import cn.iocoder.yudao.framework.mybatis.core.util.JdbcUtils; import cn.iocoder.yudao.framework.mybatis.core.util.JdbcUtils;
import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest; import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest;
import cn.iocoder.yudao.module.infra.controller.admin.db.vo.DataSourceConfigCreateReqVO; import cn.iocoder.yudao.module.infra.controller.admin.db.vo.DataSourceConfigCreateReqVO;
@ -8,8 +10,10 @@ import cn.iocoder.yudao.module.infra.dal.dataobject.db.DataSourceConfigDO;
import cn.iocoder.yudao.module.infra.dal.mysql.db.DataSourceConfigMapper; import cn.iocoder.yudao.module.infra.dal.mysql.db.DataSourceConfigMapper;
import com.baomidou.dynamic.datasource.spring.boot.autoconfigure.DynamicDataSourceProperties; import com.baomidou.dynamic.datasource.spring.boot.autoconfigure.DynamicDataSourceProperties;
import org.jasypt.encryption.StringEncryptor; import org.jasypt.encryption.StringEncryptor;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import org.mockito.MockedStatic; import org.mockito.MockedStatic;
import org.mockito.stubbing.Answer;
import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.boot.test.mock.mockito.MockBean;
import org.springframework.context.annotation.Import; import org.springframework.context.annotation.Import;
@ -21,7 +25,10 @@ import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomLongId
import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomPojo; import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomPojo;
import static cn.iocoder.yudao.module.infra.enums.ErrorCodeConstants.DATA_SOURCE_CONFIG_NOT_EXISTS; import static cn.iocoder.yudao.module.infra.enums.ErrorCodeConstants.DATA_SOURCE_CONFIG_NOT_EXISTS;
import static org.junit.jupiter.api.Assertions.*; import static org.junit.jupiter.api.Assertions.*;
import static org.mockito.Mockito.*; import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.mockStatic;
import static org.mockito.Mockito.when;
/** /**
* {@link DataSourceConfigServiceImpl} * {@link DataSourceConfigServiceImpl}
@ -43,13 +50,20 @@ public class DataSourceConfigServiceImplTest extends BaseDbUnitTest {
@MockBean @MockBean
private DynamicDataSourceProperties dynamicDataSourceProperties; private DynamicDataSourceProperties dynamicDataSourceProperties;
@BeforeEach
public void setUp() {
// mock 一个空实现的 StringEncryptor避免 EncryptTypeHandler 报错
ReflectUtil.setFieldValue(EncryptTypeHandler.class, "encryptor", stringEncryptor);
when(stringEncryptor.encrypt(anyString())).then((Answer<String>) invocation -> invocation.getArgument(0));
when(stringEncryptor.decrypt(anyString())).then((Answer<String>) invocation -> invocation.getArgument(0));
}
@Test @Test
public void testCreateDataSourceConfig_success() { public void testCreateDataSourceConfig_success() {
try (MockedStatic<JdbcUtils> databaseUtilsMock = mockStatic(JdbcUtils.class)) { try (MockedStatic<JdbcUtils> databaseUtilsMock = mockStatic(JdbcUtils.class)) {
// 准备参数 // 准备参数
DataSourceConfigCreateReqVO reqVO = randomPojo(DataSourceConfigCreateReqVO.class); DataSourceConfigCreateReqVO reqVO = randomPojo(DataSourceConfigCreateReqVO.class);
// mock 方法 // mock 方法
when(stringEncryptor.encrypt(eq(reqVO.getPassword()))).thenReturn("123456");
databaseUtilsMock.when(() -> JdbcUtils.isConnectionOK(eq(reqVO.getUrl()), databaseUtilsMock.when(() -> JdbcUtils.isConnectionOK(eq(reqVO.getUrl()),
eq(reqVO.getUsername()), eq(reqVO.getPassword()))).thenReturn(true); eq(reqVO.getUsername()), eq(reqVO.getPassword()))).thenReturn(true);
@ -59,8 +73,7 @@ public class DataSourceConfigServiceImplTest extends BaseDbUnitTest {
assertNotNull(dataSourceConfigId); assertNotNull(dataSourceConfigId);
// 校验记录的属性是否正确 // 校验记录的属性是否正确
DataSourceConfigDO dataSourceConfig = dataSourceConfigMapper.selectById(dataSourceConfigId); DataSourceConfigDO dataSourceConfig = dataSourceConfigMapper.selectById(dataSourceConfigId);
assertPojoEquals(reqVO, dataSourceConfig, "password"); assertPojoEquals(reqVO, dataSourceConfig);
assertEquals("123456", dataSourceConfig.getPassword());
} }
} }
@ -75,7 +88,7 @@ public class DataSourceConfigServiceImplTest extends BaseDbUnitTest {
o.setId(dbDataSourceConfig.getId()); // 设置更新的 ID o.setId(dbDataSourceConfig.getId()); // 设置更新的 ID
}); });
// mock 方法 // mock 方法
when(stringEncryptor.encrypt(eq(reqVO.getPassword()))).thenReturn("123456"); // when(stringEncryptor.encrypt(eq(reqVO.getPassword()))).thenReturn("123456");
databaseUtilsMock.when(() -> JdbcUtils.isConnectionOK(eq(reqVO.getUrl()), databaseUtilsMock.when(() -> JdbcUtils.isConnectionOK(eq(reqVO.getUrl()),
eq(reqVO.getUsername()), eq(reqVO.getPassword()))).thenReturn(true); eq(reqVO.getUsername()), eq(reqVO.getPassword()))).thenReturn(true);
@ -83,8 +96,7 @@ public class DataSourceConfigServiceImplTest extends BaseDbUnitTest {
dataSourceConfigService.updateDataSourceConfig(reqVO); dataSourceConfigService.updateDataSourceConfig(reqVO);
// 校验是否更新正确 // 校验是否更新正确
DataSourceConfigDO dataSourceConfig = dataSourceConfigMapper.selectById(reqVO.getId()); // 获取最新的 DataSourceConfigDO dataSourceConfig = dataSourceConfigMapper.selectById(reqVO.getId()); // 获取最新的
assertPojoEquals(reqVO, dataSourceConfig, "password"); assertPojoEquals(reqVO, dataSourceConfig);
assertEquals("123456", dataSourceConfig.getPassword());
} }
} }
@ -120,4 +132,16 @@ public class DataSourceConfigServiceImplTest extends BaseDbUnitTest {
assertServiceException(() -> dataSourceConfigService.deleteDataSourceConfig(id), DATA_SOURCE_CONFIG_NOT_EXISTS); assertServiceException(() -> dataSourceConfigService.deleteDataSourceConfig(id), DATA_SOURCE_CONFIG_NOT_EXISTS);
} }
@Test // 测试使用 password 查询,可以查询到数据
public void testSelectPassword() {
// mock 数据
DataSourceConfigDO dbDataSourceConfig = randomPojo(DataSourceConfigDO.class);
dataSourceConfigMapper.insert(dbDataSourceConfig);// @Sql: 先插入出一条存在的数据
// 调用
DataSourceConfigDO result = dataSourceConfigMapper.selectOne(DataSourceConfigDO::getPassword,
EncryptTypeHandler.encrypt(dbDataSourceConfig.getPassword()));
System.out.println(result);
}
} }

@ -100,7 +100,7 @@ public class MemberAuthServiceImpl implements MemberAuthService {
} }
// 创建 Token 令牌,记录登录日志 // 创建 Token 令牌,记录登录日志
return createTokenAfterLoginSuccess(user, null, LoginLogTypeEnum.LOGIN_SOCIAL); return createTokenAfterLoginSuccess(user, user.getMobile(), LoginLogTypeEnum.LOGIN_SOCIAL);
} }
@Override @Override

@ -2,7 +2,7 @@ package cn.iocoder.yudao.module.system.dal.dataobject.sensitiveword;
import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
import cn.iocoder.yudao.framework.mybatis.core.type.StringLiSTTypeHandler; import cn.iocoder.yudao.framework.mybatis.core.type.StringListTypeHandler;
import com.baomidou.mybatisplus.annotation.KeySequence; import com.baomidou.mybatisplus.annotation.KeySequence;
import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableId;
@ -46,7 +46,7 @@ public class SensitiveWordDO extends BaseDO {
* tag "推广" * tag "推广"
* name "推广"tag * name "推广"tag
*/ */
@TableField(typeHandler = StringLiSTTypeHandler.class) @TableField(typeHandler = StringListTypeHandler.class)
private List<String> tags; private List<String> tags;
/** /**
* *

@ -24,7 +24,8 @@ public interface PostMapper extends BaseMapperX<PostDO> {
return selectPage(reqVO, new QueryWrapperX<PostDO>() return selectPage(reqVO, new QueryWrapperX<PostDO>()
.likeIfPresent("code", reqVO.getCode()) .likeIfPresent("code", reqVO.getCode())
.likeIfPresent("name", reqVO.getName()) .likeIfPresent("name", reqVO.getName())
.eqIfPresent("status", reqVO.getStatus())); .eqIfPresent("status", reqVO.getStatus())
.orderByDesc("id"));
} }
default List<PostDO> selectList(PostExportReqVO reqVO) { default List<PostDO> selectList(PostExportReqVO reqVO) {

@ -37,7 +37,7 @@ public interface DictDataMapper extends BaseMapperX<DictDataDO> {
.likeIfPresent(DictDataDO::getLabel, reqVO.getLabel()) .likeIfPresent(DictDataDO::getLabel, reqVO.getLabel())
.likeIfPresent(DictDataDO::getDictType, reqVO.getDictType()) .likeIfPresent(DictDataDO::getDictType, reqVO.getDictType())
.eqIfPresent(DictDataDO::getStatus, reqVO.getStatus()) .eqIfPresent(DictDataDO::getStatus, reqVO.getStatus())
.orderByAsc(Arrays.asList(DictDataDO::getDictType, DictDataDO::getSort))); .orderByDesc(Arrays.asList(DictDataDO::getDictType, DictDataDO::getSort)));
} }
default List<DictDataDO> selectList(DictDataExportReqVO reqVO) { default List<DictDataDO> selectList(DictDataExportReqVO reqVO) {

@ -5,6 +5,7 @@ import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
import cn.iocoder.yudao.module.system.controller.admin.dict.vo.type.DictTypeExportReqVO; import cn.iocoder.yudao.module.system.controller.admin.dict.vo.type.DictTypeExportReqVO;
import cn.iocoder.yudao.module.system.controller.admin.dict.vo.type.DictTypePageReqVO; import cn.iocoder.yudao.module.system.controller.admin.dict.vo.type.DictTypePageReqVO;
import cn.iocoder.yudao.module.system.dal.dataobject.dict.DictDataDO;
import cn.iocoder.yudao.module.system.dal.dataobject.dict.DictTypeDO; import cn.iocoder.yudao.module.system.dal.dataobject.dict.DictTypeDO;
import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Mapper;
@ -18,7 +19,8 @@ public interface DictTypeMapper extends BaseMapperX<DictTypeDO> {
.likeIfPresent(DictTypeDO::getName, reqVO.getName()) .likeIfPresent(DictTypeDO::getName, reqVO.getName())
.likeIfPresent(DictTypeDO::getType, reqVO.getType()) .likeIfPresent(DictTypeDO::getType, reqVO.getType())
.eqIfPresent(DictTypeDO::getStatus, reqVO.getStatus()) .eqIfPresent(DictTypeDO::getStatus, reqVO.getStatus())
.betweenIfPresent(DictTypeDO::getCreateTime, reqVO.getBeginCreateTime(), reqVO.getEndCreateTime())); .betweenIfPresent(DictTypeDO::getCreateTime, reqVO.getBeginCreateTime(), reqVO.getEndCreateTime())
.orderByDesc(DictTypeDO::getId));
} }
default List<DictTypeDO> selectList(DictTypeExportReqVO reqVO) { default List<DictTypeDO> selectList(DictTypeExportReqVO reqVO) {

@ -23,7 +23,7 @@ public interface ErrorCodeMapper extends BaseMapperX<ErrorCodeDO> {
.eqIfPresent("code", reqVO.getCode()) .eqIfPresent("code", reqVO.getCode())
.likeIfPresent("message", reqVO.getMessage()) .likeIfPresent("message", reqVO.getMessage())
.betweenIfPresent("create_time", reqVO.getBeginCreateTime(), reqVO.getEndCreateTime()) .betweenIfPresent("create_time", reqVO.getBeginCreateTime(), reqVO.getEndCreateTime())
.orderByAsc("application_name", "code")); .orderByDesc("code"));
} }
default List<ErrorCodeDO> selectList(ErrorCodeExportReqVO reqVO) { default List<ErrorCodeDO> selectList(ErrorCodeExportReqVO reqVO) {

@ -13,7 +13,8 @@ public interface NoticeMapper extends BaseMapperX<NoticeDO> {
default PageResult<NoticeDO> selectPage(NoticePageReqVO reqVO) { default PageResult<NoticeDO> selectPage(NoticePageReqVO reqVO) {
return selectPage(reqVO, new LambdaQueryWrapperX<NoticeDO>() return selectPage(reqVO, new LambdaQueryWrapperX<NoticeDO>()
.likeIfPresent(NoticeDO::getTitle, reqVO.getTitle()) .likeIfPresent(NoticeDO::getTitle, reqVO.getTitle())
.eqIfPresent(NoticeDO::getStatus, reqVO.getStatus())); .eqIfPresent(NoticeDO::getStatus, reqVO.getStatus())
.orderByDesc(NoticeDO::getId));
} }
} }

@ -23,7 +23,8 @@ public interface RoleMapper extends BaseMapperX<RoleDO> {
.likeIfPresent(RoleDO::getName, reqVO.getName()) .likeIfPresent(RoleDO::getName, reqVO.getName())
.likeIfPresent(RoleDO::getCode, reqVO.getCode()) .likeIfPresent(RoleDO::getCode, reqVO.getCode())
.eqIfPresent(RoleDO::getStatus, reqVO.getStatus()) .eqIfPresent(RoleDO::getStatus, reqVO.getStatus())
.betweenIfPresent(BaseDO::getCreateTime, reqVO.getBeginTime(), reqVO.getEndTime())); .betweenIfPresent(BaseDO::getCreateTime, reqVO.getBeginTime(), reqVO.getEndTime())
.orderByDesc(RoleDO::getId));
} }
default List<RoleDO> selectList(RoleExportReqVO reqVO) { default List<RoleDO> selectList(RoleExportReqVO reqVO) {

@ -2,6 +2,7 @@ package cn.iocoder.yudao.module.system.dal.mysql.user;
import cn.iocoder.yudao.module.system.controller.admin.user.vo.user.UserExportReqVO; import cn.iocoder.yudao.module.system.controller.admin.user.vo.user.UserExportReqVO;
import cn.iocoder.yudao.module.system.controller.admin.user.vo.user.UserPageReqVO; import cn.iocoder.yudao.module.system.controller.admin.user.vo.user.UserPageReqVO;
import cn.iocoder.yudao.module.system.dal.dataobject.tenant.TenantDO;
import cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO; import cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO;
import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
@ -33,7 +34,9 @@ public interface AdminUserMapper extends BaseMapperX<AdminUserDO> {
.likeIfPresent(AdminUserDO::getMobile, reqVO.getMobile()) .likeIfPresent(AdminUserDO::getMobile, reqVO.getMobile())
.eqIfPresent(AdminUserDO::getStatus, reqVO.getStatus()) .eqIfPresent(AdminUserDO::getStatus, reqVO.getStatus())
.betweenIfPresent(AdminUserDO::getCreateTime, reqVO.getBeginTime(), reqVO.getEndTime()) .betweenIfPresent(AdminUserDO::getCreateTime, reqVO.getBeginTime(), reqVO.getEndTime())
.inIfPresent(AdminUserDO::getDeptId, deptIds)); .inIfPresent(AdminUserDO::getDeptId, deptIds)
.orderByDesc(AdminUserDO::getId));
} }
default List<AdminUserDO> selectList(UserExportReqVO reqVO, Collection<Long> deptIds) { default List<AdminUserDO> selectList(UserExportReqVO reqVO, Collection<Long> deptIds) {

@ -181,7 +181,7 @@ public class AdminAuthServiceImpl implements AdminAuthService {
} }
// 创建 Token 令牌,记录登录日志 // 创建 Token 令牌,记录登录日志
return createTokenAfterLoginSuccess(user.getId(), null, LoginLogTypeEnum.LOGIN_SOCIAL); return createTokenAfterLoginSuccess(user.getId(), user.getUsername(), LoginLogTypeEnum.LOGIN_SOCIAL);
} }
@Override @Override

@ -8,8 +8,8 @@ import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
import cn.iocoder.yudao.framework.common.util.collection.MapUtils; import cn.iocoder.yudao.framework.common.util.collection.MapUtils;
import cn.iocoder.yudao.framework.common.util.json.JsonUtils; import cn.iocoder.yudao.framework.common.util.json.JsonUtils;
import cn.iocoder.yudao.framework.datapermission.core.annotation.DataPermission; import cn.iocoder.yudao.framework.datapermission.core.annotation.DataPermission;
import cn.iocoder.yudao.module.system.api.permission.dto.DeptDataPermissionRespDTO;
import cn.iocoder.yudao.framework.tenant.core.aop.TenantIgnore; import cn.iocoder.yudao.framework.tenant.core.aop.TenantIgnore;
import cn.iocoder.yudao.module.system.api.permission.dto.DeptDataPermissionRespDTO;
import cn.iocoder.yudao.module.system.dal.dataobject.dept.DeptDO; import cn.iocoder.yudao.module.system.dal.dataobject.dept.DeptDO;
import cn.iocoder.yudao.module.system.dal.dataobject.permission.MenuDO; import cn.iocoder.yudao.module.system.dal.dataobject.permission.MenuDO;
import cn.iocoder.yudao.module.system.dal.dataobject.permission.RoleDO; import cn.iocoder.yudao.module.system.dal.dataobject.permission.RoleDO;
@ -248,7 +248,12 @@ public class PermissionServiceImpl implements PermissionService {
@Override @Override
public Set<Long> getUserRoleIdsFromCache(Long userId, Collection<Integer> roleStatuses) { public Set<Long> getUserRoleIdsFromCache(Long userId, Collection<Integer> roleStatuses) {
Set<Long> roleIds = new HashSet<>(userRoleCache.get(userId)); Set<Long> cacheRoleIds = userRoleCache.get(userId);
// 创建用户的时候没有分配角色,会存在空指针异常
if (CollUtil.isEmpty(cacheRoleIds)) {
return Collections.emptySet();
}
Set<Long> roleIds = new HashSet<>(cacheRoleIds);
// 过滤角色状态 // 过滤角色状态
if (CollectionUtil.isNotEmpty(roleStatuses)) { if (CollectionUtil.isNotEmpty(roleStatuses)) {
roleIds.removeIf(roleId -> { roleIds.removeIf(roleId -> {
@ -451,6 +456,7 @@ public class PermissionServiceImpl implements PermissionService {
@Override @Override
@DataPermission(enable = false) // 关闭数据权限,不然就会出现递归获取数据权限的问题 @DataPermission(enable = false) // 关闭数据权限,不然就会出现递归获取数据权限的问题
@TenantIgnore // 忽略多租户的自动过滤。如果不忽略,会导致添加租户时,因为切换租户,导致获取不到 User。即使忽略本身该方法不存在跨租户的操作不会存在问题。
public DeptDataPermissionRespDTO getDeptDataPermission(Long userId) { public DeptDataPermissionRespDTO getDeptDataPermission(Long userId) {
DeptDataPermissionRespDTO result = new DeptDataPermissionRespDTO(); DeptDataPermissionRespDTO result = new DeptDataPermissionRespDTO();
// 获得用户的角色 // 获得用户的角色

@ -215,6 +215,9 @@ public class RoleServiceImpl implements RoleService {
@Override @Override
public List<RoleDO> getRoles(@Nullable Collection<Integer> statuses) { public List<RoleDO> getRoles(@Nullable Collection<Integer> statuses) {
if (CollUtil.isEmpty(statuses)) {
return roleMapper.selectList();
}
return roleMapper.selectListByStatus(statuses); return roleMapper.selectListByStatus(statuses);
} }

@ -0,0 +1,36 @@
package cn.iocoder.yudao.server.framework.tip.core;
import cn.hutool.core.thread.ThreadUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.stereotype.Component;
import java.util.concurrent.TimeUnit;
/**
*
*/
@Component
@Slf4j
public class TipApplicationRunner implements ApplicationRunner {
@Override
public void run(ApplicationArguments args) throws Exception {
ThreadUtil.execute(() -> {
ThreadUtil.sleep(1, TimeUnit.SECONDS); // 延迟 1 秒,保证输出到结尾
log.info("\n----------------------------------------------------------\n\t" +
"项目启动成功!\n\t" +
"接口文档: \t{} \n\t" +
"开发文档: \t{} \n\t" +
"视频教程: \t{} \n\t" +
"源码解析: \t{} \n" +
"----------------------------------------------------------",
"https://doc.iocoder.cn/api-doc/",
"https://doc.iocoder.cn",
"https://t.zsxq.com/02Yf6M7Qn",
"https://t.zsxq.com/02B6ujIee");
});
}
}

@ -0,0 +1,4 @@
/**
*
*/
package cn.iocoder.yudao.server.framework.tip;

@ -1,4 +0,0 @@
/**
*
*/
package cn.iocoder.yudao.server.framework.ui.core;

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 63 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

File diff suppressed because one or more lines are too long

@ -12,15 +12,15 @@ eval("\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n
/***/ }), /***/ }),
/***/ "./node_modules/cache-loader/dist/cjs.js?{\"cacheDirectory\":\"node_modules/.cache/vue-loader\",\"cacheIdentifier\":\"f587f70a-vue-loader-template\"}!./node_modules/vue-loader/lib/loaders/templateLoader.js?!./node_modules/cache-loader/dist/cjs.js?!./node_modules/vue-loader/lib/index.js?!./src/views/error/404.vue?vue&type=template&id=09c68b87&scoped=true&": /***/ "./node_modules/cache-loader/dist/cjs.js?{\"cacheDirectory\":\"node_modules/.cache/vue-loader\",\"cacheIdentifier\":\"2ef12c28-vue-loader-template\"}!./node_modules/vue-loader/lib/loaders/templateLoader.js?!./node_modules/cache-loader/dist/cjs.js?!./node_modules/vue-loader/lib/index.js?!./src/views/error/404.vue?vue&type=template&id=09c68b87&scoped=true&":
/*!*********************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************!*\ /*!*********************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************!*\
!*** ./node_modules/cache-loader/dist/cjs.js?{"cacheDirectory":"node_modules/.cache/vue-loader","cacheIdentifier":"f587f70a-vue-loader-template"}!./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options!./src/views/error/404.vue?vue&type=template&id=09c68b87&scoped=true& ***! !*** ./node_modules/cache-loader/dist/cjs.js?{"cacheDirectory":"node_modules/.cache/vue-loader","cacheIdentifier":"2ef12c28-vue-loader-template"}!./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options!./src/views/error/404.vue?vue&type=template&id=09c68b87&scoped=true& ***!
\*********************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************/ \*********************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************/
/*! exports provided: render, staticRenderFns */ /*! exports provided: render, staticRenderFns */
/***/ (function(module, __webpack_exports__, __webpack_require__) { /***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict"; "use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return render; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return staticRenderFns; });\nvar render = function () {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\"div\", { staticClass: \"wscn-http404-container\" }, [\n _c(\"div\", { staticClass: \"wscn-http404\" }, [\n _vm._m(0),\n _c(\n \"div\",\n { staticClass: \"bullshit\" },\n [\n _c(\"div\", { staticClass: \"bullshit__oops\" }, [_vm._v(\" 404错误! \")]),\n _c(\"div\", { staticClass: \"bullshit__headline\" }, [\n _vm._v(\" \" + _vm._s(_vm.message) + \" \"),\n ]),\n _c(\"div\", { staticClass: \"bullshit__info\" }, [\n _vm._v(\n \" 对不起您正在寻找的页面不存在。尝试检查URL的错误然后按浏览器上的刷新按钮或尝试在我们的应用程序中找到其他内容。 \"\n ),\n ]),\n _c(\n \"router-link\",\n { staticClass: \"bullshit__return-home\", attrs: { to: \"/\" } },\n [_vm._v(\" 返回首页 \")]\n ),\n ],\n 1\n ),\n ]),\n ])\n}\nvar staticRenderFns = [\n function () {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\"div\", { staticClass: \"pic-404\" }, [\n _c(\"img\", {\n staticClass: \"pic-404__parent\",\n attrs: { src: __webpack_require__(/*! @/assets/404_images/404.png */ \"./src/assets/404_images/404.png\"), alt: \"404\" },\n }),\n _c(\"img\", {\n staticClass: \"pic-404__child left\",\n attrs: {\n src: __webpack_require__(/*! @/assets/404_images/404_cloud.png */ \"./src/assets/404_images/404_cloud.png\"),\n alt: \"404\",\n },\n }),\n _c(\"img\", {\n staticClass: \"pic-404__child mid\",\n attrs: {\n src: __webpack_require__(/*! @/assets/404_images/404_cloud.png */ \"./src/assets/404_images/404_cloud.png\"),\n alt: \"404\",\n },\n }),\n _c(\"img\", {\n staticClass: \"pic-404__child right\",\n attrs: {\n src: __webpack_require__(/*! @/assets/404_images/404_cloud.png */ \"./src/assets/404_images/404_cloud.png\"),\n alt: \"404\",\n },\n }),\n ])\n },\n]\nrender._withStripped = true\n\n\n\n//# sourceURL=webpack:///./src/views/error/404.vue?./node_modules/cache-loader/dist/cjs.js?%7B%22cacheDirectory%22:%22node_modules/.cache/vue-loader%22,%22cacheIdentifier%22:%22f587f70a-vue-loader-template%22%7D!./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options"); eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return render; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return staticRenderFns; });\nvar render = function () {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\"div\", { staticClass: \"wscn-http404-container\" }, [\n _c(\"div\", { staticClass: \"wscn-http404\" }, [\n _vm._m(0),\n _c(\n \"div\",\n { staticClass: \"bullshit\" },\n [\n _c(\"div\", { staticClass: \"bullshit__oops\" }, [_vm._v(\" 404错误! \")]),\n _c(\"div\", { staticClass: \"bullshit__headline\" }, [\n _vm._v(\" \" + _vm._s(_vm.message) + \" \"),\n ]),\n _c(\"div\", { staticClass: \"bullshit__info\" }, [\n _vm._v(\n \" 对不起您正在寻找的页面不存在。尝试检查URL的错误然后按浏览器上的刷新按钮或尝试在我们的应用程序中找到其他内容。 \"\n ),\n ]),\n _c(\n \"router-link\",\n { staticClass: \"bullshit__return-home\", attrs: { to: \"/\" } },\n [_vm._v(\" 返回首页 \")]\n ),\n ],\n 1\n ),\n ]),\n ])\n}\nvar staticRenderFns = [\n function () {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\"div\", { staticClass: \"pic-404\" }, [\n _c(\"img\", {\n staticClass: \"pic-404__parent\",\n attrs: { src: __webpack_require__(/*! @/assets/404_images/404.png */ \"./src/assets/404_images/404.png\"), alt: \"404\" },\n }),\n _c(\"img\", {\n staticClass: \"pic-404__child left\",\n attrs: {\n src: __webpack_require__(/*! @/assets/404_images/404_cloud.png */ \"./src/assets/404_images/404_cloud.png\"),\n alt: \"404\",\n },\n }),\n _c(\"img\", {\n staticClass: \"pic-404__child mid\",\n attrs: {\n src: __webpack_require__(/*! @/assets/404_images/404_cloud.png */ \"./src/assets/404_images/404_cloud.png\"),\n alt: \"404\",\n },\n }),\n _c(\"img\", {\n staticClass: \"pic-404__child right\",\n attrs: {\n src: __webpack_require__(/*! @/assets/404_images/404_cloud.png */ \"./src/assets/404_images/404_cloud.png\"),\n alt: \"404\",\n },\n }),\n ])\n },\n]\nrender._withStripped = true\n\n\n\n//# sourceURL=webpack:///./src/views/error/404.vue?./node_modules/cache-loader/dist/cjs.js?%7B%22cacheDirectory%22:%22node_modules/.cache/vue-loader%22,%22cacheIdentifier%22:%222ef12c28-vue-loader-template%22%7D!./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options");
/***/ }), /***/ }),
@ -112,7 +112,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _nod
/***/ (function(module, __webpack_exports__, __webpack_require__) { /***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict"; "use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _node_modules_cache_loader_dist_cjs_js_cacheDirectory_node_modules_cache_vue_loader_cacheIdentifier_f587f70a_vue_loader_template_node_modules_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_node_modules_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_lib_index_js_vue_loader_options_404_vue_vue_type_template_id_09c68b87_scoped_true___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!../../../node_modules/cache-loader/dist/cjs.js?{\"cacheDirectory\":\"node_modules/.cache/vue-loader\",\"cacheIdentifier\":\"f587f70a-vue-loader-template\"}!../../../node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib??vue-loader-options!./404.vue?vue&type=template&id=09c68b87&scoped=true& */ \"./node_modules/cache-loader/dist/cjs.js?{\\\"cacheDirectory\\\":\\\"node_modules/.cache/vue-loader\\\",\\\"cacheIdentifier\\\":\\\"f587f70a-vue-loader-template\\\"}!./node_modules/vue-loader/lib/loaders/templateLoader.js?!./node_modules/cache-loader/dist/cjs.js?!./node_modules/vue-loader/lib/index.js?!./src/views/error/404.vue?vue&type=template&id=09c68b87&scoped=true&\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return _node_modules_cache_loader_dist_cjs_js_cacheDirectory_node_modules_cache_vue_loader_cacheIdentifier_f587f70a_vue_loader_template_node_modules_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_node_modules_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_lib_index_js_vue_loader_options_404_vue_vue_type_template_id_09c68b87_scoped_true___WEBPACK_IMPORTED_MODULE_0__[\"render\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return _node_modules_cache_loader_dist_cjs_js_cacheDirectory_node_modules_cache_vue_loader_cacheIdentifier_f587f70a_vue_loader_template_node_modules_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_node_modules_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_lib_index_js_vue_loader_options_404_vue_vue_type_template_id_09c68b87_scoped_true___WEBPACK_IMPORTED_MODULE_0__[\"staticRenderFns\"]; });\n\n\n\n//# sourceURL=webpack:///./src/views/error/404.vue?"); eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _node_modules_cache_loader_dist_cjs_js_cacheDirectory_node_modules_cache_vue_loader_cacheIdentifier_2ef12c28_vue_loader_template_node_modules_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_node_modules_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_lib_index_js_vue_loader_options_404_vue_vue_type_template_id_09c68b87_scoped_true___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!../../../node_modules/cache-loader/dist/cjs.js?{\"cacheDirectory\":\"node_modules/.cache/vue-loader\",\"cacheIdentifier\":\"2ef12c28-vue-loader-template\"}!../../../node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib??vue-loader-options!./404.vue?vue&type=template&id=09c68b87&scoped=true& */ \"./node_modules/cache-loader/dist/cjs.js?{\\\"cacheDirectory\\\":\\\"node_modules/.cache/vue-loader\\\",\\\"cacheIdentifier\\\":\\\"2ef12c28-vue-loader-template\\\"}!./node_modules/vue-loader/lib/loaders/templateLoader.js?!./node_modules/cache-loader/dist/cjs.js?!./node_modules/vue-loader/lib/index.js?!./src/views/error/404.vue?vue&type=template&id=09c68b87&scoped=true&\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return _node_modules_cache_loader_dist_cjs_js_cacheDirectory_node_modules_cache_vue_loader_cacheIdentifier_2ef12c28_vue_loader_template_node_modules_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_node_modules_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_lib_index_js_vue_loader_options_404_vue_vue_type_template_id_09c68b87_scoped_true___WEBPACK_IMPORTED_MODULE_0__[\"render\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return _node_modules_cache_loader_dist_cjs_js_cacheDirectory_node_modules_cache_vue_loader_cacheIdentifier_2ef12c28_vue_loader_template_node_modules_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_node_modules_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_lib_index_js_vue_loader_options_404_vue_vue_type_template_id_09c68b87_scoped_true___WEBPACK_IMPORTED_MODULE_0__[\"staticRenderFns\"]; });\n\n\n\n//# sourceURL=webpack:///./src/views/error/404.vue?");
/***/ }) /***/ })

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

@ -12,15 +12,15 @@ eval("\n\nvar _interopRequireDefault = __webpack_require__(/*! ./node_modules/@b
/***/ }), /***/ }),
/***/ "./node_modules/cache-loader/dist/cjs.js?{\"cacheDirectory\":\"node_modules/.cache/vue-loader\",\"cacheIdentifier\":\"f587f70a-vue-loader-template\"}!./node_modules/vue-loader/lib/loaders/templateLoader.js?!./node_modules/cache-loader/dist/cjs.js?!./node_modules/vue-loader/lib/index.js?!./src/views/error/401.vue?vue&type=template&id=099c4504&scoped=true&": /***/ "./node_modules/cache-loader/dist/cjs.js?{\"cacheDirectory\":\"node_modules/.cache/vue-loader\",\"cacheIdentifier\":\"2ef12c28-vue-loader-template\"}!./node_modules/vue-loader/lib/loaders/templateLoader.js?!./node_modules/cache-loader/dist/cjs.js?!./node_modules/vue-loader/lib/index.js?!./src/views/error/401.vue?vue&type=template&id=099c4504&scoped=true&":
/*!*********************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************!*\ /*!*********************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************!*\
!*** ./node_modules/cache-loader/dist/cjs.js?{"cacheDirectory":"node_modules/.cache/vue-loader","cacheIdentifier":"f587f70a-vue-loader-template"}!./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options!./src/views/error/401.vue?vue&type=template&id=099c4504&scoped=true& ***! !*** ./node_modules/cache-loader/dist/cjs.js?{"cacheDirectory":"node_modules/.cache/vue-loader","cacheIdentifier":"2ef12c28-vue-loader-template"}!./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options!./src/views/error/401.vue?vue&type=template&id=099c4504&scoped=true& ***!
\*********************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************/ \*********************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************/
/*! exports provided: render, staticRenderFns */ /*! exports provided: render, staticRenderFns */
/***/ (function(module, __webpack_exports__, __webpack_require__) { /***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict"; "use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return render; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return staticRenderFns; });\nvar render = function () {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\n \"div\",\n { staticClass: \"errPage-container\" },\n [\n _c(\n \"el-button\",\n {\n staticClass: \"pan-back-btn\",\n attrs: { icon: \"arrow-left\" },\n on: { click: _vm.back },\n },\n [_vm._v(\" 返回 \")]\n ),\n _c(\n \"el-row\",\n [\n _c(\"el-col\", { attrs: { span: 12 } }, [\n _c(\"h1\", { staticClass: \"text-jumbo text-ginormous\" }, [\n _vm._v(\" 401错误! \"),\n ]),\n _c(\"h2\", [_vm._v(\"您没有访问权限!\")]),\n _c(\"h6\", [\n _vm._v(\n \"对不起,您没有访问权限,请不要进行非法操作!您可以返回主页面\"\n ),\n ]),\n _c(\"ul\", { staticClass: \"list-unstyled\" }, [\n _c(\n \"li\",\n { staticClass: \"link-type\" },\n [\n _c(\"router-link\", { attrs: { to: \"/\" } }, [\n _vm._v(\" 回首页 \"),\n ]),\n ],\n 1\n ),\n ]),\n ]),\n _c(\"el-col\", { attrs: { span: 12 } }, [\n _c(\"img\", {\n attrs: {\n src: _vm.errGif,\n width: \"313\",\n height: \"428\",\n alt: \"Girl has dropped her ice cream.\",\n },\n }),\n ]),\n ],\n 1\n ),\n ],\n 1\n )\n}\nvar staticRenderFns = []\nrender._withStripped = true\n\n\n\n//# sourceURL=webpack:///./src/views/error/401.vue?./node_modules/cache-loader/dist/cjs.js?%7B%22cacheDirectory%22:%22node_modules/.cache/vue-loader%22,%22cacheIdentifier%22:%22f587f70a-vue-loader-template%22%7D!./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options"); eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return render; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return staticRenderFns; });\nvar render = function () {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\n \"div\",\n { staticClass: \"errPage-container\" },\n [\n _c(\n \"el-button\",\n {\n staticClass: \"pan-back-btn\",\n attrs: { icon: \"arrow-left\" },\n on: { click: _vm.back },\n },\n [_vm._v(\" 返回 \")]\n ),\n _c(\n \"el-row\",\n [\n _c(\"el-col\", { attrs: { span: 12 } }, [\n _c(\"h1\", { staticClass: \"text-jumbo text-ginormous\" }, [\n _vm._v(\" 401错误! \"),\n ]),\n _c(\"h2\", [_vm._v(\"您没有访问权限!\")]),\n _c(\"h6\", [\n _vm._v(\n \"对不起,您没有访问权限,请不要进行非法操作!您可以返回主页面\"\n ),\n ]),\n _c(\"ul\", { staticClass: \"list-unstyled\" }, [\n _c(\n \"li\",\n { staticClass: \"link-type\" },\n [\n _c(\"router-link\", { attrs: { to: \"/\" } }, [\n _vm._v(\" 回首页 \"),\n ]),\n ],\n 1\n ),\n ]),\n ]),\n _c(\"el-col\", { attrs: { span: 12 } }, [\n _c(\"img\", {\n attrs: {\n src: _vm.errGif,\n width: \"313\",\n height: \"428\",\n alt: \"Girl has dropped her ice cream.\",\n },\n }),\n ]),\n ],\n 1\n ),\n ],\n 1\n )\n}\nvar staticRenderFns = []\nrender._withStripped = true\n\n\n\n//# sourceURL=webpack:///./src/views/error/401.vue?./node_modules/cache-loader/dist/cjs.js?%7B%22cacheDirectory%22:%22node_modules/.cache/vue-loader%22,%22cacheIdentifier%22:%222ef12c28-vue-loader-template%22%7D!./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options");
/***/ }), /***/ }),
@ -101,7 +101,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _nod
/***/ (function(module, __webpack_exports__, __webpack_require__) { /***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict"; "use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _node_modules_cache_loader_dist_cjs_js_cacheDirectory_node_modules_cache_vue_loader_cacheIdentifier_f587f70a_vue_loader_template_node_modules_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_node_modules_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_lib_index_js_vue_loader_options_401_vue_vue_type_template_id_099c4504_scoped_true___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!../../../node_modules/cache-loader/dist/cjs.js?{\"cacheDirectory\":\"node_modules/.cache/vue-loader\",\"cacheIdentifier\":\"f587f70a-vue-loader-template\"}!../../../node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib??vue-loader-options!./401.vue?vue&type=template&id=099c4504&scoped=true& */ \"./node_modules/cache-loader/dist/cjs.js?{\\\"cacheDirectory\\\":\\\"node_modules/.cache/vue-loader\\\",\\\"cacheIdentifier\\\":\\\"f587f70a-vue-loader-template\\\"}!./node_modules/vue-loader/lib/loaders/templateLoader.js?!./node_modules/cache-loader/dist/cjs.js?!./node_modules/vue-loader/lib/index.js?!./src/views/error/401.vue?vue&type=template&id=099c4504&scoped=true&\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return _node_modules_cache_loader_dist_cjs_js_cacheDirectory_node_modules_cache_vue_loader_cacheIdentifier_f587f70a_vue_loader_template_node_modules_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_node_modules_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_lib_index_js_vue_loader_options_401_vue_vue_type_template_id_099c4504_scoped_true___WEBPACK_IMPORTED_MODULE_0__[\"render\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return _node_modules_cache_loader_dist_cjs_js_cacheDirectory_node_modules_cache_vue_loader_cacheIdentifier_f587f70a_vue_loader_template_node_modules_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_node_modules_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_lib_index_js_vue_loader_options_401_vue_vue_type_template_id_099c4504_scoped_true___WEBPACK_IMPORTED_MODULE_0__[\"staticRenderFns\"]; });\n\n\n\n//# sourceURL=webpack:///./src/views/error/401.vue?"); eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _node_modules_cache_loader_dist_cjs_js_cacheDirectory_node_modules_cache_vue_loader_cacheIdentifier_2ef12c28_vue_loader_template_node_modules_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_node_modules_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_lib_index_js_vue_loader_options_401_vue_vue_type_template_id_099c4504_scoped_true___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!../../../node_modules/cache-loader/dist/cjs.js?{\"cacheDirectory\":\"node_modules/.cache/vue-loader\",\"cacheIdentifier\":\"2ef12c28-vue-loader-template\"}!../../../node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib??vue-loader-options!./401.vue?vue&type=template&id=099c4504&scoped=true& */ \"./node_modules/cache-loader/dist/cjs.js?{\\\"cacheDirectory\\\":\\\"node_modules/.cache/vue-loader\\\",\\\"cacheIdentifier\\\":\\\"2ef12c28-vue-loader-template\\\"}!./node_modules/vue-loader/lib/loaders/templateLoader.js?!./node_modules/cache-loader/dist/cjs.js?!./node_modules/vue-loader/lib/index.js?!./src/views/error/401.vue?vue&type=template&id=099c4504&scoped=true&\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return _node_modules_cache_loader_dist_cjs_js_cacheDirectory_node_modules_cache_vue_loader_cacheIdentifier_2ef12c28_vue_loader_template_node_modules_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_node_modules_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_lib_index_js_vue_loader_options_401_vue_vue_type_template_id_099c4504_scoped_true___WEBPACK_IMPORTED_MODULE_0__[\"render\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return _node_modules_cache_loader_dist_cjs_js_cacheDirectory_node_modules_cache_vue_loader_cacheIdentifier_2ef12c28_vue_loader_template_node_modules_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_node_modules_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_lib_index_js_vue_loader_options_401_vue_vue_type_template_id_099c4504_scoped_true___WEBPACK_IMPORTED_MODULE_0__[\"staticRenderFns\"]; });\n\n\n\n//# sourceURL=webpack:///./src/views/error/401.vue?");
/***/ }) /***/ })

@ -11,6 +11,61 @@ eval("!function(t,e){ true?e(exports):undefined}(this,function(t){\"use strict\"
/***/ }), /***/ }),
/***/ "./src/assets/images/bg-mobile.png":
/*!*****************************************!*\
!*** ./src/assets/images/bg-mobile.png ***!
\*****************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
eval("module.exports = __webpack_require__.p + \"static/img/bg-mobile.0e3df208.png\";\n\n//# sourceURL=webpack:///./src/assets/images/bg-mobile.png?");
/***/ }),
/***/ "./src/assets/images/bg.png":
/*!**********************************!*\
!*** ./src/assets/images/bg.png ***!
\**********************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
eval("module.exports = __webpack_require__.p + \"static/img/bg.9bed9548.png\";\n\n//# sourceURL=webpack:///./src/assets/images/bg.png?");
/***/ }),
/***/ "./src/assets/images/icon.png":
/*!************************************!*\
!*** ./src/assets/images/icon.png ***!
\************************************/
/*! no static exports found */
/***/ (function(module, exports) {
eval("module.exports = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAMAAAAolt3jAAAAS1BMVEX///+QkJDq6ur9/f35+fnz8/ORkZGGhob19fWVlZV/f3/v7+/s7Ozc3NzPz8+3t7efn5/d3d3Ly8vCwsK7u7ukpKR1dXVgYGBfX19XIQVLAAAAVUlEQVQI113OWQqAMAxF0ZgO6dw6u/+VWkF8xfsTDiQQ6hnWhNzuM6RLqOaTWsIGUZIrTG+WKbY+QUVD6k+2WG5x4HFKwiKLn3FpqpTh1+xXR0jzoxvqPQI0Iy9ftQAAAABJRU5ErkJggg==\"\n\n//# sourceURL=webpack:///./src/assets/images/icon.png?");
/***/ }),
/***/ "./src/assets/images/pic.png":
/*!***********************************!*\
!*** ./src/assets/images/pic.png ***!
\***********************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
eval("module.exports = __webpack_require__.p + \"static/img/pic.49137f73.png\";\n\n//# sourceURL=webpack:///./src/assets/images/pic.png?");
/***/ }),
/***/ "./src/assets/logo/login-logo.png":
/*!****************************************!*\
!*** ./src/assets/logo/login-logo.png ***!
\****************************************/
/*! no static exports found */
/***/ (function(module, exports) {
eval("module.exports = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAaEAAABACAYAAACzx8hRAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAKwwAACsMBNCkkqwAAABx0RVh0U29mdHdhcmUAQWRvYmUgRmlyZXdvcmtzIENTNui8sowAAAwiSURBVHic7Z3Rcdu4FoZ/39nh8C3uwLzDAuytwNwK4g7CrcDuIEoFUSoIU8E6FSxVwcoFcC5dwVpvHL7kPuAwoWUCBCWQIKX/m9HEESAQoiT8OAcHBxc/fvzA0ri4uPDdBUIImZwljtd9/Md3BwghhJwvFCFCCCHeoAgRQgjxBkWIEEKINyhChBBCvPGb7w6Q06cIwsu4rl6ObCMBkAB4jOtqa1E/ApACyAFsj70+IWQcLpYY8ncKIdpFEK4AfNQUb+K6Sny05RoRj0cAWVxXD5avuYQSnOZx3Sq2ej8d9+QZwLZ5xHX1aNMXFxRBmEG9/3yqa5LTZInjdR+0hMgoiJCsANzLU/dFEOaWg/8lgAzAu46y2yII70ztyLX3Be9KHu8BfIcSxtERAfoA4EMRhF90QiyWWzRFn3p4sbE0CXEFRYg4R6yfDGrQb5MVQZj0DXJxXZViyXzWVFnDLCIP6BYwANhBuelGpyVADfdyb+7iuir3qqfQW7NTsoGyPmdHEYT5SE3ncV2tRmqb9EARIk4pgvAOwF+a4nf4JUTGNZq4rtbS1m1H8VURhGlcV5nm5amh6bsp1oc6BKjhGsBWrLl87H74QgSj67M7hE8iEq7a2ycfqV1iAUXIMUUQprBzqySGskgsAVtctFUaBnVr4rp6LILwCa/XcdpcQ1kyqUVzKdQaTpdVsyqC8HFfUIogfMBbC6zhyxQDv3wHugSo4R2Av4sg/MQZODl3KELuSXH8jO0K7lwztm1toFxoLriDXjwAtT6SN6J34Kz5CsC/RRAOec19EYT3usK4rpxEvMR1lYnbzSREAPCxCMIbTOQeJFpK3x04Z7hPiDhH1jtWPdXWshh/ksR1lQL4ZFH1PZRlSPxR+u7AOUNLiIxCz5oOoKykRwA30/VqWuK6WhVBWAL4aqj2BBVIYQpf31hcTnefd1BWqS2MjCOTQhEiY5LC7Ja7Hrj2tTjENQcoa2f/PuwggRImt2LfviixKP+nKV6f0LqTjRjriKBfK6TweoQiREbDItR6hzNwhYgQbaGisBoh2gFIOkK1D+HOUObL1ZfhbdRZBP062aajfkMO9IuxCVl37BQhZtPwC0XIPRnsQj4T6F0ozxgWJOCirXLA9awRt1yKt9FyGwCpCBUwLEw2gn4wG3rvJiGuq60EK+RQQtS7X2oAOlfeN18DbFekZY/Vm9lEZ7bSN+naKHs7R2YFRcgxtmHO8oPUCUc5xIXisq2RSAH8I3/vAKziuvo5Qx8aGi5h2DoRWrfbnhMtIYoOESBNVoUIejdTLtezYYpMCSaLLbdsI4E+2tP0uV9qnj/GxUccQBEioyOD7xeoIITUwWzVFMyQH9n2qMhAf+hgn2JY6L4pIGKfUTMlSCol3d6xJxcWTI/Vp7s28QxFiEyCTfJSR7vs/xm4d8jZ/qB9ZODNodxEs7TOJsSFFQTMNKUQORyKkD9yQ1npsS3ijjXUDPyzuMXSM14EN4mQi2SyWreabAjWkTu4NjkCitDI9GRHzg2vSwZealBbp5y3bA7IOl173eo91BpNem5ZqsUifK8p3g38LkYHdEG3HkRmAEVofFLMIzvyPss/lGmmSDRg12d+DSVEJ528tIPUUDbUCtIFYZgsTJMInatlOhsoQsQpRRCuYZkFwedhe2Mhrh9TQECTvPRPFwljBeuDC3sOQByL1FDm6lwnk3Vp+j6elVU6RyhCxDU3cJ9y/+hs0+KS/NtJb8yUUKl4+qKxvsqRFunoPfKI3HfdvdgBeOlzPTdWY8/aDlkoFCFCHCIpeBKoNbo+IXqVTfxESQ1l72A3MWhcxya3WmkoM4mX6XVkAihCZAkkDnLMRQ76YUVLiNYwH+ewcSRAt0UQ/nDQjlMkKKfvOIshHCpC2tcxw4J/KEJkCdxivFM1R0FCsVPZs9Q1ED/BHLZ8CvTuDRuIyaJJDW69SPei/cnNDLKLnB0UoZGRL/Xq0Nf3LSSPtdGSuCGuqy4h2uHE9wxJWHY64SUPtbj2f1urI/tBBsJD7QgZGQk++NZ66hz2Cq2gP8KDkJ/QEiJO2Q8VdhQS/IzjF5BNuctGp2URlXFduQpLbhhycF0E/V4bJ8hakPYYdULaUITIEsgWFKKtZcRw7O3M9gmtLOv93N/kaf/SPs+er3+W0B1HyDyIfHfAIbnvDhxI6bsD5wgtIYf05Ik7FGN7B+SYM1HONGTVFPlki9f8YUUQZlDnKJWaKpHm+SeL5i8H3B/ddZwhJ8l2HWdOyBsoQm5JMb1LwaWL6RPmGR10hZHXMcZEBOID1ObUDdTBe7brQjYRdNfw7GrsYA3Hv4VjI00b5rin6pyhO46Q8Wnvb7kF8FcRhGURhGsJZQZOL9Nz5rsDZBlQhAgZn6TjuSuoCLJGfE7q5E9xO3733Q8yf+iOI0tgg+MXuyO4TSEzBN1O/2eLNbi+8jmTQX+O0CAkeekx1uJW0inxWIeZQREiSyB3FKI9uQjJoKdbz8qlTmJoonTbo+mI6+qxCMJPUJbgsWmX1ke28QfU/eaxDjODIkTIuCSGsmbQs5qdNwvzRRBe6lL+GBbd3xyHUQThzdiZG+K6WhVBmI95DbJsKEIOcRW904a54wAAH4sg9L2R8VASQ1ku/1rPzsWy2hZBuMWB+efE8soAXBVB+PsZpBAiM4aBCYSMS6J5ftca/HV1gLfrFA9Q7r33AMoiCK0zVRdBGBVB+AgVzt24CLOedRJCRoUiRMi46KLe2taH1hJqWymyON+2CN8B+FwEYW5x6uiNXHM/UOAa89wbRs4EuuPI2JztLLsn4CCXOjfQZxbYz5aQaerdov8+b6VO1+L+fRGEj80x2hMStc7zSSa65lTXIZZQhMhoSKoabURaEYTZiEk950BiKMst6pTNHzJY66yqb5YCkkKJUZfoZRKoMGWY8hXssyo84MgQbYs6+RHtkwOhCM2fyHcHDqFPgIQPcrzBgwx+xw40c0N7cmpLNFLD63Pgp0WlG6x3sDzBNK6rUnK6dbV1Je2sbNqaGofBE6f0/ToJKEIzRlw1vjZYHoQscuewzwDwAUAiM/3HUzltVO6D7h48SZ3IUAdQUXCXAEx55gZFyEnIdIruvUsfxS13ktFyci9P/Uj1xUER8oRENe3/ILb4FQ11A0e7zScmx/AUNFcAvgL4WgThd6j7kLfKt+2B1sHu+X3a7eWO1kYSQ1nT/spQpzmoLod+zeh7OxGqRXBCQwp9wtM1FrZuIqKatp7KNVVTLDgR7qlCEfLHC94uEg/dEX6Kh3C9l8crl5G47abAlRVgmnHnFrPyHEoQTILehGhvoYR0ZdOxuK5yEfuuSc5tEYRpXFeZTVszIcLr386hmRVOwgpfGgzR9kfuoI05uk0yQ9kOdufj+GLn8OjtxFCWQwmG6bydEmaR2kElQP0MZdV87mlvH9060jOmG4x3UHkBNzhuQpW76MupuiHnDkXIE5K48lhLxtWA6RJTn+6gBue5ClHmohFxi+ncPs1nft/TzArqXu06yj5BWUlDeDXAyvfvS0e7Nw6FuLdPcV0lcsR3dkQ7LkRzjr+ls4Ai5JdjZl7Pc3SZyOC26Sj6M66rPK6rl7iubvB2AJwDmaN2UkNZLutbf6BbYAAVcv0iM/MIr0V7I+mh8oF96qq/wi9r5L9xXa2WGBjiwILZYaZRgecARcgvh/54dph3lE+29/9v+4IZ19UDgN8xnzNnnidyx+TAzxDtCN1WYdb80RLtb3j9uQ/p65cucZHnbsQaKQe0N0cO9SrsAJzC+18sFz9+LO+k24uL08jZKfs/hh7L/A3Aas4/Gll0/1f++z2uK6NgSqhy46pLMGxtwxVvskwfSxGEd1Dv6w6/3tOrhKEdIe0bcU91tRe1P/ciCEv0R3ttANz5tHAkei3qKCqbyYn8FpKu19t8LpKpe2hAwux/S/sscbzugyLkmY409yXeniHzAjXz3S7FXSKJMiOoWeZBfZYB2jbs2ERiUScbczBqBKkrQ4S8zzXUnqk/bEPEDQPvE9R36HGOLtsxGBq27yFFkROWOF73QREioyCDQrkU0ZwDRRDeTRgUQBbIEsfrPihChBCyEJY4XvfBwARCCCHeoAgRQgjxBkWIEEKINyhChBBCvEERIoQQ4g2KECGEEG/8H4e6e0opY/nPAAAAAElFTkSuQmCC\"\n\n//# sourceURL=webpack:///./src/assets/logo/login-logo.png?");
/***/ }),
/***/ "./src/utils/jsencrypt.js": /***/ "./src/utils/jsencrypt.js":
/*!********************************!*\ /*!********************************!*\
!*** ./src/utils/jsencrypt.js ***! !*** ./src/utils/jsencrypt.js ***!

@ -12,15 +12,15 @@ eval("\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n
/***/ }), /***/ }),
/***/ "./node_modules/cache-loader/dist/cjs.js?{\"cacheDirectory\":\"node_modules/.cache/vue-loader\",\"cacheIdentifier\":\"f587f70a-vue-loader-template\"}!./node_modules/vue-loader/lib/loaders/templateLoader.js?!./node_modules/cache-loader/dist/cjs.js?!./node_modules/vue-loader/lib/index.js?!./src/views/bpm/oa/leave/create.vue?vue&type=template&id=e0c7f4d2&": /***/ "./node_modules/cache-loader/dist/cjs.js?{\"cacheDirectory\":\"node_modules/.cache/vue-loader\",\"cacheIdentifier\":\"2ef12c28-vue-loader-template\"}!./node_modules/vue-loader/lib/loaders/templateLoader.js?!./node_modules/cache-loader/dist/cjs.js?!./node_modules/vue-loader/lib/index.js?!./src/views/bpm/oa/leave/create.vue?vue&type=template&id=e0c7f4d2&":
/*!*******************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************!*\ /*!*******************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************!*\
!*** ./node_modules/cache-loader/dist/cjs.js?{"cacheDirectory":"node_modules/.cache/vue-loader","cacheIdentifier":"f587f70a-vue-loader-template"}!./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options!./src/views/bpm/oa/leave/create.vue?vue&type=template&id=e0c7f4d2& ***! !*** ./node_modules/cache-loader/dist/cjs.js?{"cacheDirectory":"node_modules/.cache/vue-loader","cacheIdentifier":"2ef12c28-vue-loader-template"}!./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options!./src/views/bpm/oa/leave/create.vue?vue&type=template&id=e0c7f4d2& ***!
\*******************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************/ \*******************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************/
/*! exports provided: render, staticRenderFns */ /*! exports provided: render, staticRenderFns */
/***/ (function(module, __webpack_exports__, __webpack_require__) { /***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict"; "use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return render; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return staticRenderFns; });\nvar render = function () {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\n \"div\",\n { staticClass: \"app-container\" },\n [\n _c(\n \"el-form\",\n {\n ref: \"form\",\n attrs: { model: _vm.form, rules: _vm.rules, \"label-width\": \"80px\" },\n },\n [\n _c(\n \"el-form-item\",\n { attrs: { label: \"开始时间\", prop: \"startTime\" } },\n [\n _c(\"el-date-picker\", {\n attrs: {\n clearable: \"\",\n size: \"small\",\n type: \"date\",\n \"value-format\": \"timestamp\",\n placeholder: \"选择开始时间\",\n },\n model: {\n value: _vm.form.startTime,\n callback: function ($$v) {\n _vm.$set(_vm.form, \"startTime\", $$v)\n },\n expression: \"form.startTime\",\n },\n }),\n ],\n 1\n ),\n _c(\n \"el-form-item\",\n { attrs: { label: \"结束时间\", prop: \"endTime\" } },\n [\n _c(\"el-date-picker\", {\n attrs: {\n clearable: \"\",\n size: \"small\",\n type: \"date\",\n \"value-format\": \"timestamp\",\n placeholder: \"选择结束时间\",\n },\n model: {\n value: _vm.form.endTime,\n callback: function ($$v) {\n _vm.$set(_vm.form, \"endTime\", $$v)\n },\n expression: \"form.endTime\",\n },\n }),\n ],\n 1\n ),\n _c(\n \"el-form-item\",\n { attrs: { label: \"请假类型\", prop: \"type\" } },\n [\n _c(\n \"el-select\",\n {\n attrs: { placeholder: \"请选择\" },\n model: {\n value: _vm.form.type,\n callback: function ($$v) {\n _vm.$set(_vm.form, \"type\", $$v)\n },\n expression: \"form.type\",\n },\n },\n _vm._l(_vm.typeDictData, function (dict) {\n return _c(\"el-option\", {\n key: parseInt(dict.value),\n attrs: { label: dict.label, value: parseInt(dict.value) },\n })\n }),\n 1\n ),\n ],\n 1\n ),\n _c(\n \"el-form-item\",\n { attrs: { label: \"原因\", prop: \"reason\" } },\n [\n _c(\n \"el-col\",\n { attrs: { span: 10 } },\n [\n _c(\"el-input\", {\n attrs: {\n type: \"textarea\",\n rows: 3,\n placeholder: \"请输入原因\",\n },\n model: {\n value: _vm.form.reason,\n callback: function ($$v) {\n _vm.$set(_vm.form, \"reason\", $$v)\n },\n expression: \"form.reason\",\n },\n }),\n ],\n 1\n ),\n ],\n 1\n ),\n _c(\n \"el-form-item\",\n [\n _c(\n \"el-button\",\n { attrs: { type: \"primary\" }, on: { click: _vm.submitForm } },\n [_vm._v(\"提 交\")]\n ),\n ],\n 1\n ),\n ],\n 1\n ),\n ],\n 1\n )\n}\nvar staticRenderFns = []\nrender._withStripped = true\n\n\n\n//# sourceURL=webpack:///./src/views/bpm/oa/leave/create.vue?./node_modules/cache-loader/dist/cjs.js?%7B%22cacheDirectory%22:%22node_modules/.cache/vue-loader%22,%22cacheIdentifier%22:%22f587f70a-vue-loader-template%22%7D!./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options"); eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return render; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return staticRenderFns; });\nvar render = function () {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\n \"div\",\n { staticClass: \"app-container\" },\n [\n _c(\n \"el-form\",\n {\n ref: \"form\",\n attrs: { model: _vm.form, rules: _vm.rules, \"label-width\": \"80px\" },\n },\n [\n _c(\n \"el-form-item\",\n { attrs: { label: \"开始时间\", prop: \"startTime\" } },\n [\n _c(\"el-date-picker\", {\n attrs: {\n clearable: \"\",\n size: \"small\",\n type: \"date\",\n \"value-format\": \"timestamp\",\n placeholder: \"选择开始时间\",\n },\n model: {\n value: _vm.form.startTime,\n callback: function ($$v) {\n _vm.$set(_vm.form, \"startTime\", $$v)\n },\n expression: \"form.startTime\",\n },\n }),\n ],\n 1\n ),\n _c(\n \"el-form-item\",\n { attrs: { label: \"结束时间\", prop: \"endTime\" } },\n [\n _c(\"el-date-picker\", {\n attrs: {\n clearable: \"\",\n size: \"small\",\n type: \"date\",\n \"value-format\": \"timestamp\",\n placeholder: \"选择结束时间\",\n },\n model: {\n value: _vm.form.endTime,\n callback: function ($$v) {\n _vm.$set(_vm.form, \"endTime\", $$v)\n },\n expression: \"form.endTime\",\n },\n }),\n ],\n 1\n ),\n _c(\n \"el-form-item\",\n { attrs: { label: \"请假类型\", prop: \"type\" } },\n [\n _c(\n \"el-select\",\n {\n attrs: { placeholder: \"请选择\" },\n model: {\n value: _vm.form.type,\n callback: function ($$v) {\n _vm.$set(_vm.form, \"type\", $$v)\n },\n expression: \"form.type\",\n },\n },\n _vm._l(_vm.typeDictData, function (dict) {\n return _c(\"el-option\", {\n key: parseInt(dict.value),\n attrs: { label: dict.label, value: parseInt(dict.value) },\n })\n }),\n 1\n ),\n ],\n 1\n ),\n _c(\n \"el-form-item\",\n { attrs: { label: \"原因\", prop: \"reason\" } },\n [\n _c(\n \"el-col\",\n { attrs: { span: 10 } },\n [\n _c(\"el-input\", {\n attrs: {\n type: \"textarea\",\n rows: 3,\n placeholder: \"请输入原因\",\n },\n model: {\n value: _vm.form.reason,\n callback: function ($$v) {\n _vm.$set(_vm.form, \"reason\", $$v)\n },\n expression: \"form.reason\",\n },\n }),\n ],\n 1\n ),\n ],\n 1\n ),\n _c(\n \"el-form-item\",\n [\n _c(\n \"el-button\",\n { attrs: { type: \"primary\" }, on: { click: _vm.submitForm } },\n [_vm._v(\"提 交\")]\n ),\n ],\n 1\n ),\n ],\n 1\n ),\n ],\n 1\n )\n}\nvar staticRenderFns = []\nrender._withStripped = true\n\n\n\n//# sourceURL=webpack:///./src/views/bpm/oa/leave/create.vue?./node_modules/cache-loader/dist/cjs.js?%7B%22cacheDirectory%22:%22node_modules/.cache/vue-loader%22,%22cacheIdentifier%22:%222ef12c28-vue-loader-template%22%7D!./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options");
/***/ }), /***/ }),
@ -68,7 +68,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _nod
/***/ (function(module, __webpack_exports__, __webpack_require__) { /***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict"; "use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _node_modules_cache_loader_dist_cjs_js_cacheDirectory_node_modules_cache_vue_loader_cacheIdentifier_f587f70a_vue_loader_template_node_modules_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_node_modules_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_lib_index_js_vue_loader_options_create_vue_vue_type_template_id_e0c7f4d2___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!../../../../../node_modules/cache-loader/dist/cjs.js?{\"cacheDirectory\":\"node_modules/.cache/vue-loader\",\"cacheIdentifier\":\"f587f70a-vue-loader-template\"}!../../../../../node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!../../../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../node_modules/vue-loader/lib??vue-loader-options!./create.vue?vue&type=template&id=e0c7f4d2& */ \"./node_modules/cache-loader/dist/cjs.js?{\\\"cacheDirectory\\\":\\\"node_modules/.cache/vue-loader\\\",\\\"cacheIdentifier\\\":\\\"f587f70a-vue-loader-template\\\"}!./node_modules/vue-loader/lib/loaders/templateLoader.js?!./node_modules/cache-loader/dist/cjs.js?!./node_modules/vue-loader/lib/index.js?!./src/views/bpm/oa/leave/create.vue?vue&type=template&id=e0c7f4d2&\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return _node_modules_cache_loader_dist_cjs_js_cacheDirectory_node_modules_cache_vue_loader_cacheIdentifier_f587f70a_vue_loader_template_node_modules_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_node_modules_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_lib_index_js_vue_loader_options_create_vue_vue_type_template_id_e0c7f4d2___WEBPACK_IMPORTED_MODULE_0__[\"render\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return _node_modules_cache_loader_dist_cjs_js_cacheDirectory_node_modules_cache_vue_loader_cacheIdentifier_f587f70a_vue_loader_template_node_modules_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_node_modules_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_lib_index_js_vue_loader_options_create_vue_vue_type_template_id_e0c7f4d2___WEBPACK_IMPORTED_MODULE_0__[\"staticRenderFns\"]; });\n\n\n\n//# sourceURL=webpack:///./src/views/bpm/oa/leave/create.vue?"); eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _node_modules_cache_loader_dist_cjs_js_cacheDirectory_node_modules_cache_vue_loader_cacheIdentifier_2ef12c28_vue_loader_template_node_modules_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_node_modules_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_lib_index_js_vue_loader_options_create_vue_vue_type_template_id_e0c7f4d2___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!../../../../../node_modules/cache-loader/dist/cjs.js?{\"cacheDirectory\":\"node_modules/.cache/vue-loader\",\"cacheIdentifier\":\"2ef12c28-vue-loader-template\"}!../../../../../node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!../../../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../node_modules/vue-loader/lib??vue-loader-options!./create.vue?vue&type=template&id=e0c7f4d2& */ \"./node_modules/cache-loader/dist/cjs.js?{\\\"cacheDirectory\\\":\\\"node_modules/.cache/vue-loader\\\",\\\"cacheIdentifier\\\":\\\"2ef12c28-vue-loader-template\\\"}!./node_modules/vue-loader/lib/loaders/templateLoader.js?!./node_modules/cache-loader/dist/cjs.js?!./node_modules/vue-loader/lib/index.js?!./src/views/bpm/oa/leave/create.vue?vue&type=template&id=e0c7f4d2&\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return _node_modules_cache_loader_dist_cjs_js_cacheDirectory_node_modules_cache_vue_loader_cacheIdentifier_2ef12c28_vue_loader_template_node_modules_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_node_modules_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_lib_index_js_vue_loader_options_create_vue_vue_type_template_id_e0c7f4d2___WEBPACK_IMPORTED_MODULE_0__[\"render\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return _node_modules_cache_loader_dist_cjs_js_cacheDirectory_node_modules_cache_vue_loader_cacheIdentifier_2ef12c28_vue_loader_template_node_modules_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_node_modules_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_lib_index_js_vue_loader_options_create_vue_vue_type_template_id_e0c7f4d2___WEBPACK_IMPORTED_MODULE_0__[\"staticRenderFns\"]; });\n\n\n\n//# sourceURL=webpack:///./src/views/bpm/oa/leave/create.vue?");
/***/ }) /***/ })

@ -12,15 +12,15 @@ eval("\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n
/***/ }), /***/ }),
/***/ "./node_modules/cache-loader/dist/cjs.js?{\"cacheDirectory\":\"node_modules/.cache/vue-loader\",\"cacheIdentifier\":\"f587f70a-vue-loader-template\"}!./node_modules/vue-loader/lib/loaders/templateLoader.js?!./node_modules/cache-loader/dist/cjs.js?!./node_modules/vue-loader/lib/index.js?!./src/views/bpm/oa/leave/detail.vue?vue&type=template&id=003aca6c&": /***/ "./node_modules/cache-loader/dist/cjs.js?{\"cacheDirectory\":\"node_modules/.cache/vue-loader\",\"cacheIdentifier\":\"2ef12c28-vue-loader-template\"}!./node_modules/vue-loader/lib/loaders/templateLoader.js?!./node_modules/cache-loader/dist/cjs.js?!./node_modules/vue-loader/lib/index.js?!./src/views/bpm/oa/leave/detail.vue?vue&type=template&id=003aca6c&":
/*!*******************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************!*\ /*!*******************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************!*\
!*** ./node_modules/cache-loader/dist/cjs.js?{"cacheDirectory":"node_modules/.cache/vue-loader","cacheIdentifier":"f587f70a-vue-loader-template"}!./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options!./src/views/bpm/oa/leave/detail.vue?vue&type=template&id=003aca6c& ***! !*** ./node_modules/cache-loader/dist/cjs.js?{"cacheDirectory":"node_modules/.cache/vue-loader","cacheIdentifier":"2ef12c28-vue-loader-template"}!./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options!./src/views/bpm/oa/leave/detail.vue?vue&type=template&id=003aca6c& ***!
\*******************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************/ \*******************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************/
/*! exports provided: render, staticRenderFns */ /*! exports provided: render, staticRenderFns */
/***/ (function(module, __webpack_exports__, __webpack_require__) { /***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict"; "use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return render; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return staticRenderFns; });\nvar render = function () {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\n \"div\",\n { staticClass: \"app-container\" },\n [\n _c(\n \"el-form\",\n {\n ref: \"form\",\n attrs: { model: _vm.form, rules: _vm.rules, \"label-width\": \"100px\" },\n },\n [\n _c(\n \"el-form-item\",\n { attrs: { label: \"开始时间:\", prop: \"startTime\" } },\n [\n _vm._v(\n \" \" +\n _vm._s(_vm.parseTime(_vm.form.startTime, \"{y}-{m}-{d}\")) +\n \" \"\n ),\n ]\n ),\n _c(\n \"el-form-item\",\n { attrs: { label: \"结束时间:\", prop: \"endTime\" } },\n [\n _vm._v(\n \" \" +\n _vm._s(_vm.parseTime(_vm.form.endTime, \"{y}-{m}-{d}\")) +\n \" \"\n ),\n ]\n ),\n _c(\n \"el-form-item\",\n { attrs: { label: \"请假类型:\", prop: \"type\" } },\n [\n _c(\"dict-tag\", {\n attrs: {\n type: _vm.DICT_TYPE.BPM_OA_LEAVE_TYPE,\n value: _vm.form.type,\n },\n }),\n ],\n 1\n ),\n _c(\"el-form-item\", { attrs: { label: \"原因:\", prop: \"reason\" } }, [\n _vm._v(\" \" + _vm._s(_vm.form.reason)),\n ]),\n ],\n 1\n ),\n ],\n 1\n )\n}\nvar staticRenderFns = []\nrender._withStripped = true\n\n\n\n//# sourceURL=webpack:///./src/views/bpm/oa/leave/detail.vue?./node_modules/cache-loader/dist/cjs.js?%7B%22cacheDirectory%22:%22node_modules/.cache/vue-loader%22,%22cacheIdentifier%22:%22f587f70a-vue-loader-template%22%7D!./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options"); eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return render; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return staticRenderFns; });\nvar render = function () {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\n \"div\",\n { staticClass: \"app-container\" },\n [\n _c(\n \"el-form\",\n {\n ref: \"form\",\n attrs: { model: _vm.form, rules: _vm.rules, \"label-width\": \"100px\" },\n },\n [\n _c(\n \"el-form-item\",\n { attrs: { label: \"开始时间:\", prop: \"startTime\" } },\n [\n _vm._v(\n \" \" +\n _vm._s(_vm.parseTime(_vm.form.startTime, \"{y}-{m}-{d}\")) +\n \" \"\n ),\n ]\n ),\n _c(\n \"el-form-item\",\n { attrs: { label: \"结束时间:\", prop: \"endTime\" } },\n [\n _vm._v(\n \" \" +\n _vm._s(_vm.parseTime(_vm.form.endTime, \"{y}-{m}-{d}\")) +\n \" \"\n ),\n ]\n ),\n _c(\n \"el-form-item\",\n { attrs: { label: \"请假类型:\", prop: \"type\" } },\n [\n _c(\"dict-tag\", {\n attrs: {\n type: _vm.DICT_TYPE.BPM_OA_LEAVE_TYPE,\n value: _vm.form.type,\n },\n }),\n ],\n 1\n ),\n _c(\"el-form-item\", { attrs: { label: \"原因:\", prop: \"reason\" } }, [\n _vm._v(\" \" + _vm._s(_vm.form.reason)),\n ]),\n ],\n 1\n ),\n ],\n 1\n )\n}\nvar staticRenderFns = []\nrender._withStripped = true\n\n\n\n//# sourceURL=webpack:///./src/views/bpm/oa/leave/detail.vue?./node_modules/cache-loader/dist/cjs.js?%7B%22cacheDirectory%22:%22node_modules/.cache/vue-loader%22,%22cacheIdentifier%22:%222ef12c28-vue-loader-template%22%7D!./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options");
/***/ }), /***/ }),
@ -68,7 +68,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _nod
/***/ (function(module, __webpack_exports__, __webpack_require__) { /***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict"; "use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _node_modules_cache_loader_dist_cjs_js_cacheDirectory_node_modules_cache_vue_loader_cacheIdentifier_f587f70a_vue_loader_template_node_modules_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_node_modules_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_lib_index_js_vue_loader_options_detail_vue_vue_type_template_id_003aca6c___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!../../../../../node_modules/cache-loader/dist/cjs.js?{\"cacheDirectory\":\"node_modules/.cache/vue-loader\",\"cacheIdentifier\":\"f587f70a-vue-loader-template\"}!../../../../../node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!../../../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../node_modules/vue-loader/lib??vue-loader-options!./detail.vue?vue&type=template&id=003aca6c& */ \"./node_modules/cache-loader/dist/cjs.js?{\\\"cacheDirectory\\\":\\\"node_modules/.cache/vue-loader\\\",\\\"cacheIdentifier\\\":\\\"f587f70a-vue-loader-template\\\"}!./node_modules/vue-loader/lib/loaders/templateLoader.js?!./node_modules/cache-loader/dist/cjs.js?!./node_modules/vue-loader/lib/index.js?!./src/views/bpm/oa/leave/detail.vue?vue&type=template&id=003aca6c&\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return _node_modules_cache_loader_dist_cjs_js_cacheDirectory_node_modules_cache_vue_loader_cacheIdentifier_f587f70a_vue_loader_template_node_modules_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_node_modules_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_lib_index_js_vue_loader_options_detail_vue_vue_type_template_id_003aca6c___WEBPACK_IMPORTED_MODULE_0__[\"render\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return _node_modules_cache_loader_dist_cjs_js_cacheDirectory_node_modules_cache_vue_loader_cacheIdentifier_f587f70a_vue_loader_template_node_modules_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_node_modules_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_lib_index_js_vue_loader_options_detail_vue_vue_type_template_id_003aca6c___WEBPACK_IMPORTED_MODULE_0__[\"staticRenderFns\"]; });\n\n\n\n//# sourceURL=webpack:///./src/views/bpm/oa/leave/detail.vue?"); eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _node_modules_cache_loader_dist_cjs_js_cacheDirectory_node_modules_cache_vue_loader_cacheIdentifier_2ef12c28_vue_loader_template_node_modules_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_node_modules_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_lib_index_js_vue_loader_options_detail_vue_vue_type_template_id_003aca6c___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!../../../../../node_modules/cache-loader/dist/cjs.js?{\"cacheDirectory\":\"node_modules/.cache/vue-loader\",\"cacheIdentifier\":\"2ef12c28-vue-loader-template\"}!../../../../../node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!../../../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../../node_modules/vue-loader/lib??vue-loader-options!./detail.vue?vue&type=template&id=003aca6c& */ \"./node_modules/cache-loader/dist/cjs.js?{\\\"cacheDirectory\\\":\\\"node_modules/.cache/vue-loader\\\",\\\"cacheIdentifier\\\":\\\"2ef12c28-vue-loader-template\\\"}!./node_modules/vue-loader/lib/loaders/templateLoader.js?!./node_modules/cache-loader/dist/cjs.js?!./node_modules/vue-loader/lib/index.js?!./src/views/bpm/oa/leave/detail.vue?vue&type=template&id=003aca6c&\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return _node_modules_cache_loader_dist_cjs_js_cacheDirectory_node_modules_cache_vue_loader_cacheIdentifier_2ef12c28_vue_loader_template_node_modules_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_node_modules_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_lib_index_js_vue_loader_options_detail_vue_vue_type_template_id_003aca6c___WEBPACK_IMPORTED_MODULE_0__[\"render\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return _node_modules_cache_loader_dist_cjs_js_cacheDirectory_node_modules_cache_vue_loader_cacheIdentifier_2ef12c28_vue_loader_template_node_modules_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_node_modules_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_lib_index_js_vue_loader_options_detail_vue_vue_type_template_id_003aca6c___WEBPACK_IMPORTED_MODULE_0__[\"staticRenderFns\"]; });\n\n\n\n//# sourceURL=webpack:///./src/views/bpm/oa/leave/detail.vue?");
/***/ }) /***/ })

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

@ -0,0 +1,4 @@
phantomjs_cdnurl=http://cnpmjs.org/downloads
chromedriver_cdnurl=http://cdn.npm.taobao.org/dist/chromedriver
sass_binary_site=https://npm.taobao.org/mirrors/node-sass/
registry=https://registry.npmmirror.com

@ -12,7 +12,8 @@
"build:dev": "vue-cli-service build --mode dev", "build:dev": "vue-cli-service build --mode dev",
"build:demo1024": "vue-cli-service build --mode demo1024", "build:demo1024": "vue-cli-service build --mode demo1024",
"preview": "node build/index.js --preview", "preview": "node build/index.js --preview",
"lint": "eslint --ext .js,.vue src" "lint": "eslint --ext .js,.vue src",
"clean": "rimraf node_modules"
}, },
"husky": { "husky": {
"hooks": { "hooks": {
@ -62,11 +63,11 @@
"vue-router": "3.4.9", "vue-router": "3.4.9",
"vuedraggable": "2.24.3", "vuedraggable": "2.24.3",
"vuex": "3.6.0", "vuex": "3.6.0",
"bpmn-js-token-simulation": "^0.10.0", "bpmn-js-token-simulation": "0.10.0",
"min-dash": "^3.5.2", "min-dash": "3.5.2",
"xml-js": "^1.6.11", "xml-js": "1.6.11",
"@babel/parser": "^7.7.4", "@babel/parser": "7.7.4",
"throttle-debounce": "^2.1.0" "throttle-debounce": "2.1.0"
}, },
"devDependencies": { "devDependencies": {
"@vue/cli-plugin-babel": "4.4.6", "@vue/cli-plugin-babel": "4.4.6",

@ -499,7 +499,8 @@ export const selectComponents = [
__slot__: { __slot__: {
'list-type': true 'list-type': true
}, },
action: process.env.VUE_APP_BASE_API + "/admin-api/infra/file/upload", // 请求地址 // action: process.env.VUE_APP_BASE_API + "/admin-api/infra/file/upload", // 请求地址
action: '/infra/file/upload', // 请求地址
disabled: false, disabled: false,
accept: '', accept: '',
name: 'file', name: 'file',

@ -1,6 +1,7 @@
<script> <script>
import { deepClone } from '@/utils/index' import { deepClone } from '@/utils/index'
import render from '@/components/render/render.js' import render from '@/components/render/render.js'
import {getAccessToken} from "@/utils/auth";
const ruleTrigger = { const ruleTrigger = {
'el-input': 'blur', 'el-input': 'blur',
@ -79,10 +80,51 @@ function formBtns(h) {
} }
function renderFormItem(h, elementList) { function renderFormItem(h, elementList) {
const that = this
const data = this[this.formConf.formModel]
// const formRef = that.$refs[that.formConf.formRef] // $refs
return elementList.map(scheme => { return elementList.map(scheme => {
const config = scheme.__config__ const config = scheme.__config__
const layout = layouts[config.layout] const layout = layouts[config.layout]
// edit by el-upload
// https://github.com/JakHuang/form-generator/blob/master/src/components/parser/example/Index.vue
const vModel = scheme.__vModel__
const val = data[vModel]
if (scheme.__config__.tag === 'el-upload') {
//
scheme['file-list'] = (val || []).map(url => ({ name: url, url }))
// +
scheme.action = process.env.VUE_APP_BASE_API + "/admin-api/infra/file/upload"
scheme.headers = { Authorization: "Bearer " + getAccessToken() }
// on-success
scheme['on-success'] = function (response, file, fileList) {
if (response.code !== 0) {
return;
}
// data
const prev = data[vModel] || []
this.$set(data, vModel, [
...prev,
response.data
])
//
that.$refs[that.formConf.formRef].validateField(vModel)
}
// on-remove
scheme['on-remove'] = function (file, fileList) {
// data
const prev = data[vModel] || []
const index = prev.indexOf(file.response.data)
if (index === -1) {
return
}
prev.splice(index, 1) // set array
//
that.$refs[that.formConf.formRef].validateField(vModel)
}
}
if (layout) { if (layout) {
return layout.call(this, h, scheme) return layout.call(this, h, scheme)
} }

@ -152,31 +152,24 @@ export default {
}) })
}, },
refreshSelectedTag(view) { refreshSelectedTag(view) {
this.$store.dispatch('tagsView/delCachedView', view).then(() => { this.$tab.refreshPage(view);
const { fullPath } = view
this.$nextTick(() => {
this.$router.replace({
path: '/redirect' + fullPath
})
})
})
}, },
closeSelectedTag(view) { closeSelectedTag(view) {
this.$store.dispatch('tagsView/delView', view).then(({ visitedViews }) => { this.$tab.closePage(view).then(({ visitedViews }) => {
if (this.isActive(view)) { if (this.isActive(view)) {
this.toLastView(visitedViews, view) this.toLastView(visitedViews, view)
} }
}) })
}, },
closeRightTags() { closeRightTags() {
this.$store.dispatch('tagsView/delRightTags', this.selectedTag).then(visitedViews => { this.$tab.closeRightPage(this.selectedTag).then(visitedViews => {
if (!visitedViews.find(i => i.fullPath === this.$route.fullPath)) { if (!visitedViews.find(i => i.fullPath === this.$route.fullPath)) {
this.toLastView(visitedViews) this.toLastView(visitedViews)
} }
}) })
}, },
closeLeftTags() { closeLeftTags() {
this.$store.dispatch('tagsView/delLeftTags', this.selectedTag).then(visitedViews => { this.$tab.closeLeftPage(this.selectedTag).then(visitedViews => {
if (!visitedViews.find(i => i.fullPath === this.$route.fullPath)) { if (!visitedViews.find(i => i.fullPath === this.$route.fullPath)) {
this.toLastView(visitedViews) this.toLastView(visitedViews)
} }
@ -184,12 +177,12 @@ export default {
}, },
closeOthersTags() { closeOthersTags() {
this.$router.push(this.selectedTag).catch(()=>{}); this.$router.push(this.selectedTag).catch(()=>{});
this.$store.dispatch('tagsView/delOthersViews', this.selectedTag).then(() => { this.$tab.closeOtherPage(this.selectedTag).then(() => {
this.moveToCurrentTag() this.moveToCurrentTag()
}) })
}, },
closeAllTags(view) { closeAllTags(view) {
this.$store.dispatch('tagsView/delAllViews').then(({ visitedViews }) => { this.$tab.closeAllPage().then(({ visitedViews }) => {
if (this.affixTags.some(tag => tag.path === this.$route.path)) { if (this.affixTags.some(tag => tag.path === this.$route.path)) {
return return
} }

@ -69,8 +69,9 @@ import "bpmn-js/dist/assets/bpmn-font/css/bpmn-embedded.css";
import Tinymce from '@/components/tinymce/index.vue' import Tinymce from '@/components/tinymce/index.vue'
Vue.component('tinymce', Tinymce) Vue.component('tinymce', Tinymce)
import '@/icons' import '@/icons'
import axios from 'axios' import request from "@/utils/request" // 实现 form generator 使用自己定义的 axios request 对象
Vue.prototype.$axios = axios console.log(request)
Vue.prototype.$axios = request
import '@/styles/index.scss' import '@/styles/index.scss'
/** /**

@ -2,6 +2,7 @@ import { constantRoutes } from '@/router'
import { getRouters } from '@/api/menu' import { getRouters } from '@/api/menu'
import Layout from '@/layout/index' import Layout from '@/layout/index'
import ParentView from '@/components/ParentView'; import ParentView from '@/components/ParentView';
import { toCamelCase } from "@/utils";
const permission = { const permission = {
state: { state: {
@ -56,6 +57,8 @@ function filterAsyncRouter(asyncRouterMap, lastRouter = false, type = false) {
icon: route.icon, icon: route.icon,
noCache: !route.keepAlive, noCache: !route.keepAlive,
} }
// 路由地址转首字母大写驼峰作为路由名称适配keepAlive
route.name = toCamelCase(route.path, true)
route.hidden = !route.visible route.hidden = !route.visible
// 处理 component 属性 // 处理 component 属性
if (route.children) { // 父节点 if (route.children) { // 父节点

@ -79,6 +79,23 @@ const mutations = {
} }
return false return false
}) })
},
DEL_LEFT_VIEWS: (state, view) => {
const index = state.visitedViews.findIndex(v => v.path === view.path)
if (index === -1) {
return
}
state.visitedViews = state.visitedViews.filter((item, idx) => {
if (idx >= index || (item.meta && item.meta.affix)) {
return true
}
const i = state.cachedViews.indexOf(item.name)
if (i > -1) {
state.cachedViews.splice(i, 1)
}
return false
})
} }
} }
@ -172,7 +189,14 @@ const actions = {
commit('DEL_RIGHT_VIEWS', view) commit('DEL_RIGHT_VIEWS', view)
resolve([...state.visitedViews]) resolve([...state.visitedViews])
}) })
} },
delLeftTags({ commit }, view) {
return new Promise(resolve => {
commit('DEL_LEFT_VIEWS', view)
resolve([...state.visitedViews])
})
},
} }
export default { export default {

@ -1,22 +1,96 @@
import Cookies from 'js-cookie' import {decrypt, encrypt} from "@/utils/jsencrypt";
const AccessTokenKey = 'ACCESS_TOKEN' const AccessTokenKey = 'ACCESS_TOKEN'
const RefreshTokenKey = 'REFRESH_TOKEN' const RefreshTokenKey = 'REFRESH_TOKEN'
// ========== Token 相关 ==========
export function getAccessToken() { export function getAccessToken() {
return Cookies.get(AccessTokenKey) return localStorage.getItem(AccessTokenKey)
} }
export function getRefreshToken() { export function getRefreshToken() {
return Cookies.get(RefreshTokenKey) return localStorage.getItem(RefreshTokenKey)
} }
export function setToken(token) { export function setToken(token) {
Cookies.set(AccessTokenKey, token.accessToken) localStorage.setItem(AccessTokenKey, token.accessToken)
Cookies.set(RefreshTokenKey, token.refreshToken) localStorage.setItem(RefreshTokenKey, token.refreshToken)
} }
export function removeToken() { export function removeToken() {
Cookies.remove(AccessTokenKey) localStorage.removeItem(AccessTokenKey)
Cookies.remove(RefreshTokenKey) localStorage.removeItem(RefreshTokenKey)
}
// ========== 账号相关 ==========
const UsernameKey = 'USERNAME'
const PasswordKey = 'PASSWORD'
const RememberMeKey = 'REMEMBER_ME'
export function getUsername() {
return localStorage.getItem(UsernameKey)
}
export function setUsername(username) {
localStorage.setItem(UsernameKey, username)
}
export function removeUsername() {
localStorage.removeItem(UsernameKey)
}
export function getPassword() {
const password = localStorage.getItem(PasswordKey)
return password ? decrypt(password) : undefined
}
export function setPassword(password) {
localStorage.setItem(PasswordKey, encrypt(password))
}
export function removePassword() {
localStorage.removeItem(PasswordKey)
}
export function getRememberMe() {
return localStorage.getItem(RememberMeKey) === 'true'
}
export function setRememberMe(rememberMe) {
localStorage.setItem(RememberMeKey, rememberMe)
}
export function removeRememberMe() {
localStorage.removeItem(RememberMeKey)
}
// ========== 租户相关 ==========
const TenantIdKey = 'TENANT_ID'
const TenantNameKey = 'TENANT_NAME'
export function getTenantName() {
return localStorage.getItem(TenantNameKey)
}
export function setTenantName(username) {
localStorage.setItem(TenantNameKey, username)
}
export function removeTenantName() {
localStorage.removeItem(TenantNameKey)
}
export function getTenantId() {
return localStorage.getItem(TenantIdKey)
}
export function setTenantId(username) {
localStorage.setItem(TenantIdKey, username)
}
export function removeTenantId() {
localStorage.removeItem(TenantIdKey)
} }

@ -75,13 +75,13 @@ export const SystemUserSocialTypeEnum = {
title: "钉钉", title: "钉钉",
type: 20, type: 20,
source: "dingtalk", source: "dingtalk",
img: "https://cdn.jsdelivr.net/gh/justauth/justauth-oauth-logo@1.11/dingtalk.png", img: "https://s1.ax1x.com/2022/05/22/OzMDRs.png",
}, },
WECHAT_ENTERPRISE: { WECHAT_ENTERPRISE: {
title: "企业微信", title: "企业微信",
type: 30, type: 30,
source: "wechat_enterprise", source: "wechat_enterprise",
img: "https://cdn.jsdelivr.net/gh/justauth/justauth-oauth-logo@1.11/wechat_enterprise.png", img: "https://s1.ax1x.com/2022/05/22/OzMrzn.png",
} }
} }

@ -427,3 +427,15 @@ export function isNumberStr(str) {
return /^[+-]?(0|([1-9]\d*))(\.\d+)?$/g.test(str) return /^[+-]?(0|([1-9]\d*))(\.\d+)?$/g.test(str)
} }
// -转驼峰
export function toCamelCase(str, upperCaseFirst) {
str = (str || '').toLowerCase().replace(/-(.)/g, function (match, group1) {
return group1.toUpperCase();
});
if (upperCaseFirst && str) {
str = str.charAt(0).toUpperCase() + str.slice(1);
}
return str;
}

@ -1,12 +1,17 @@
import axios from 'axios' import axios from 'axios'
import { Notification, MessageBox, Message } from 'element-ui' import {Message, MessageBox, Notification} from 'element-ui'
import store from '@/store' import store from '@/store'
import {getAccessToken, getRefreshToken, setToken} from '@/utils/auth' import {getAccessToken, getRefreshToken, getTenantId, setToken} from '@/utils/auth'
import errorCode from '@/utils/errorCode' import errorCode from '@/utils/errorCode'
import Cookies from "js-cookie";
import {getPath, getTenantEnable} from "@/utils/ruoyi"; import {getPath, getTenantEnable} from "@/utils/ruoyi";
import {refreshToken} from "@/api/login"; import {refreshToken} from "@/api/login";
// 需要忽略的提示。忽略后,自动 Promise.reject('error')
const ignoreMsgs = [
"无效的刷新令牌", // 刷新令牌被删除时,不用提示
"刷新令牌已过期" // 使用刷新令牌,刷新获取新的访问令牌时,结果因为过期失败,此时需要忽略。否则,会导致继续 401无法跳转到登出界面
]
// 是否显示重新登录 // 是否显示重新登录
export let isRelogin = { show: false }; export let isRelogin = { show: false };
// Axios 无感知刷新令牌,参考 https://www.dashingdog.cn/article/11 与 https://segmentfault.com/a/1190000020210980 实现 // Axios 无感知刷新令牌,参考 https://www.dashingdog.cn/article/11 与 https://segmentfault.com/a/1190000020210980 实现
@ -21,7 +26,9 @@ const service = axios.create({
// axios中请求配置有baseURL选项表示请求URL公共部分 // axios中请求配置有baseURL选项表示请求URL公共部分
baseURL: process.env.VUE_APP_BASE_API + '/admin-api/', // 此处的 /admin-api/ 地址,原因是后端的基础路径为 /admin-api/ baseURL: process.env.VUE_APP_BASE_API + '/admin-api/', // 此处的 /admin-api/ 地址,原因是后端的基础路径为 /admin-api/
// 超时 // 超时
timeout: 30000 timeout: 30000,
// 禁用 Cookie 等信息
withCredentials: false,
}) })
// request拦截器 // request拦截器
service.interceptors.request.use(config => { service.interceptors.request.use(config => {
@ -32,7 +39,7 @@ service.interceptors.request.use(config => {
} }
// 设置租户 // 设置租户
if (getTenantEnable()) { if (getTenantEnable()) {
const tenantId = Cookies.get('tenantId'); const tenantId = getTenantId();
if (tenantId) { if (tenantId) {
config.headers['tenant-id'] = tenantId; config.headers['tenant-id'] = tenantId;
} }
@ -70,8 +77,10 @@ service.interceptors.response.use( async res => {
// 未设置状态码则默认成功状态 // 未设置状态码则默认成功状态
const code = res.data.code || 200; const code = res.data.code || 200;
// 获取错误信息 // 获取错误信息
const msg = errorCode[code] || res.data.msg || errorCode['default'] const msg = res.data.msg || errorCode[code] || errorCode['default']
if (code === 401) { if (ignoreMsgs.indexOf(msg) !== -1) { // 如果是忽略的错误码,直接返回 msg 异常
return Promise.reject(msg)
} else if (code === 401) {
// 如果未认证,并且未进行刷新令牌,说明可能是访问令牌过期了 // 如果未认证,并且未进行刷新令牌,说明可能是访问令牌过期了
if (!isRefreshToken) { if (!isRefreshToken) {
isRefreshToken = true; isRefreshToken = true;
@ -124,7 +133,7 @@ service.interceptors.response.use( async res => {
return Promise.reject(new Error(msg)) return Promise.reject(new Error(msg))
} else if (code !== 200) { } else if (code !== 200) {
if (msg === '无效的刷新令牌') { // hard coding忽略这个提示直接登出 if (msg === '无效的刷新令牌') { // hard coding忽略这个提示直接登出
console.log('无效的刷新令牌') console.log(msg)
} else { } else {
Notification.error({ Notification.error({
title: msg title: msg
@ -134,17 +143,14 @@ service.interceptors.response.use( async res => {
} else { } else {
return res.data return res.data
} }
}, }, error => {
error => {
console.log('err' + error) console.log('err' + error)
let {message} = error; let {message} = error;
if (message === "Network Error") { if (message === "Network Error") {
message = "后端接口连接异常"; message = "后端接口连接异常";
} } else if (message.includes("timeout")) {
else if (message.includes("timeout")) {
message = "系统接口请求超时"; message = "系统接口请求超时";
} } else if (message.includes("Request failed with status code")) {
else if (message.includes("Request failed with status code")) {
message = "系统接口" + message.substr(message.length - 3) + "异常"; message = "系统接口" + message.substr(message.length - 3) + "异常";
} }
Message({ Message({
@ -159,7 +165,7 @@ service.interceptors.response.use( async res => {
export function getBaseHeader() { export function getBaseHeader() {
return { return {
'Authorization': "Bearer " + getAccessToken(), 'Authorization': "Bearer " + getAccessToken(),
'tenant-id': Cookies.get('tenantId'), 'tenant-id': getTenantId(),
} }
} }

@ -429,7 +429,7 @@ export default {
this.$modal.confirm('是否删除该流程!!').then(function() { this.$modal.confirm('是否删除该流程!!').then(function() {
deleteModel(row.id).then(response => { deleteModel(row.id).then(response => {
that.getList(); that.getList();
that.msgSuccess("删除成功"); that.$modal.msgSuccess("删除成功");
}) })
}).catch(() => {}); }).catch(() => {});
}, },
@ -439,7 +439,7 @@ export default {
this.$modal.confirm('是否部署该流程!!').then(function() { this.$modal.confirm('是否部署该流程!!').then(function() {
deployModel(row.id).then(response => { deployModel(row.id).then(response => {
that.getList(); that.getList();
that.msgSuccess("部署成功"); that.$modal.msgSuccess("部署成功");
}) })
}).catch(() => {}); }).catch(() => {});
}, },

@ -55,10 +55,9 @@
<script> <script>
import {getProcessDefinitionBpmnXML, getProcessDefinitionList} from "@/api/bpm/definition"; import {getProcessDefinitionBpmnXML, getProcessDefinitionList} from "@/api/bpm/definition";
import {DICT_TYPE, getDictDatas} from "@/utils/dict"; import {DICT_TYPE, getDictDatas} from "@/utils/dict";
import {getForm} from "@/api/bpm/form";
import {decodeFields} from "@/utils/formGenerator"; import {decodeFields} from "@/utils/formGenerator";
import Parser from '@/components/parser/Parser' import Parser from '@/components/parser/Parser'
import {createProcessInstance, getMyProcessInstancePage} from "@/api/bpm/processInstance"; import {createProcessInstance} from "@/api/bpm/processInstance";
// //
export default { export default {

@ -58,7 +58,7 @@
</el-table-column> </el-table-column>
<el-table-column label="当前审批任务" align="center" prop="tasks"> <el-table-column label="当前审批任务" align="center" prop="tasks">
<template slot-scope="scope"> <template slot-scope="scope">
<el-button v-for="task in scope.row.tasks" type="text" @click="handleFormDetail(task.id)"> <el-button v-for="task in scope.row.tasks" :key="task.id" type="text" @click="handleFormDetail(task.id)">
<span>{{ task.name }}</span> <span>{{ task.name }}</span>
</el-button> </el-button>
</template> </template>

@ -12,7 +12,7 @@
</el-table-column> </el-table-column>
<el-table-column label="规则范围" align="center" prop="options" width="440px"> <el-table-column label="规则范围" align="center" prop="options" width="440px">
<template slot-scope="scope"> <template slot-scope="scope">
<el-tag size="medium" v-if="scope.row.options" v-for="option in scope.row.options"> <el-tag size="medium" v-if="scope.row.options" :key="option" v-for="option in scope.row.options">
{{ getAssignRuleOptionName(scope.row.type, option) }} {{ getAssignRuleOptionName(scope.row.type, option) }}
</el-tag> </el-tag>
</template> </template>

@ -107,9 +107,17 @@
import {getCodeImg, sendSmsCode, socialAuthRedirect} from "@/api/login"; import {getCodeImg, sendSmsCode, socialAuthRedirect} from "@/api/login";
import {getTenantIdByName} from "@/api/system/tenant"; import {getTenantIdByName} from "@/api/system/tenant";
import Cookies from "js-cookie"; import Cookies from "js-cookie";
import {decrypt, encrypt} from '@/utils/jsencrypt'
import {SystemUserSocialTypeEnum} from "@/utils/constants"; import {SystemUserSocialTypeEnum} from "@/utils/constants";
import {getTenantEnable} from "@/utils/ruoyi"; import {getTenantEnable} from "@/utils/ruoyi";
import {
getPassword,
getRememberMe, getTenantName,
getUsername,
removePassword, removeRememberMe, removeTenantName,
removeUsername,
setPassword, setRememberMe, setTenantId, setTenantName,
setUsername
} from "@/utils/auth";
export default { export default {
name: "Login", name: "Login",
@ -161,7 +169,7 @@ export default {
const tenantId = res.data; const tenantId = res.data;
if (tenantId && tenantId >= 0) { if (tenantId && tenantId >= 0) {
// //
Cookies.set("tenantId", tenantId); setTenantId(tenantId)
callback(); callback();
} else { } else {
callback('租户不存在'); callback('租户不存在');
@ -172,8 +180,6 @@ export default {
} }
] ]
}, },
loading: false, loading: false,
redirect: undefined, redirect: undefined,
// //
@ -213,21 +219,16 @@ export default {
}); });
}, },
getCookie() { getCookie() {
const username = Cookies.get("username"); const username = getUsername();
const password = Cookies.get("password"); const password = getPassword();
const rememberMe = Cookies.get('rememberMe') const rememberMe = getRememberMe();
const tenantName = Cookies.get('tenantName'); const tenantName = getTenantName();
const mobile = Cookies.get('mobile');
const mobileCode = Cookies.get('mobileCode');
const loginType = Cookies.get('loginType');
this.loginForm = { this.loginForm = {
username: username === undefined ? this.loginForm.username : username, ...this.loginForm,
password: password === undefined ? this.loginForm.password : decrypt(password), username: username ? username : this.loginForm.username,
rememberMe: rememberMe === undefined ? false : Boolean(rememberMe), password: password ? password : this.loginForm.password,
tenantName: tenantName === undefined ? this.loginForm.tenantName : tenantName, rememberMe: rememberMe ? getRememberMe() : false,
mobile: mobile === undefined ? this.loginForm.mobile : mobile, tenantName: tenantName ? tenantName : this.loginForm.tenantName,
mobileCode: mobileCode === undefined ? this.loginForm.mobileCode : mobileCode,
loginType: loginType === undefined ? this.loginForm.loginType : loginType,
}; };
}, },
handleLogin() { handleLogin() {
@ -236,18 +237,18 @@ export default {
this.loading = true; this.loading = true;
// Cookie // Cookie
if (this.loginForm.rememberMe) { if (this.loginForm.rememberMe) {
Cookies.set("username", this.loginForm.username, {expires: 30}); setUsername(this.loginForm.username)
Cookies.set("password", encrypt(this.loginForm.password), {expires: 30}); setPassword(this.loginForm.password)
Cookies.set('rememberMe', this.loginForm.rememberMe, {expires: 30}); setRememberMe(this.loginForm.rememberMe)
Cookies.set('tenantName', this.loginForm.tenantName, {expires: 30}); setTenantName(this.loginForm.tenantName)
} else { } else {
Cookies.remove("username"); removeUsername()
Cookies.remove("password"); removePassword()
Cookies.remove('rememberMe'); removeRememberMe()
Cookies.remove('tenantName'); removeTenantName()
} }
// //
console.log("发起登录", this.loginForm); // console.log("", this.loginForm);
this.$store.dispatch(this.loginForm.loginType === "sms" ? "SmsLogin" : "Login", this.loginForm).then(() => { this.$store.dispatch(this.loginForm.loginType === "sms" ? "SmsLogin" : "Login", this.loginForm).then(() => {
this.$router.push({path: this.redirect || "/"}).catch(() => { this.$router.push({path: this.redirect || "/"}).catch(() => {
}); });

@ -74,7 +74,7 @@
<!-- <el-table-column label="商户名称" align="center" prop="merchantName" width="120"/>--> <!-- <el-table-column label="商户名称" align="center" prop="merchantName" width="120"/>-->
<!-- <el-table-column label="应用名称" align="center" prop="appName" width="120"/>--> <!-- <el-table-column label="应用名称" align="center" prop="appName" width="120"/>-->
<el-table-column label="支付渠道" align="center" width="130"> <el-table-column label="支付渠道" align="center" width="130">
<template v-slot="scope"> <template slot-scope="scope">
<el-popover trigger="hover" placement="top"> <el-popover trigger="hover" placement="top">
<p>商户名称: {{ scope.row.merchantName }}</p> <p>商户名称: {{ scope.row.merchantName }}</p>
<p>应用名称: {{ scope.row.appName }}</p> <p>应用名称: {{ scope.row.appName }}</p>
@ -88,7 +88,7 @@
<!-- <el-table-column label="交易订单号" align="center" prop="tradeNo" width="140"/>--> <!-- <el-table-column label="交易订单号" align="center" prop="tradeNo" width="140"/>-->
<!-- <el-table-column label="商户订单编号" align="center" prop="merchantOrderId" width="140"/>--> <!-- <el-table-column label="商户订单编号" align="center" prop="merchantOrderId" width="140"/>-->
<el-table-column label="商户订单号" align="left" width="230"> <el-table-column label="商户订单号" align="left" width="230">
<template v-slot="scope"> <template slot-scope="scope">
<p class="order-font"> <p class="order-font">
<el-tag size="mini">退款</el-tag> <el-tag size="mini">退款</el-tag>
{{ scope.row.merchantRefundNo }} {{ scope.row.merchantRefundNo }}
@ -100,7 +100,7 @@
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="支付订单号" align="center" prop="merchantRefundNo" width="250"> <el-table-column label="支付订单号" align="center" prop="merchantRefundNo" width="250">
<template v-slot="scope"> <template slot-scope="scope">
<p class="order-font"> <p class="order-font">
<el-tag size="mini">交易</el-tag> <el-tag size="mini">交易</el-tag>
{{ scope.row.tradeNo }} {{ scope.row.tradeNo }}
@ -112,7 +112,7 @@
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="支付金额(元)" align="center" prop="payAmount" width="100"> <el-table-column label="支付金额(元)" align="center" prop="payAmount" width="100">
<template v-slot="scope" class=""> <template slot-scope="scope" class="">
{{ parseFloat(scope.row.payAmount / 100).toFixed(2) }} {{ parseFloat(scope.row.payAmount / 100).toFixed(2) }}
</template> </template>
</el-table-column> </el-table-column>
@ -122,17 +122,17 @@
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="退款类型" align="center" prop="type" width="80"> <el-table-column label="退款类型" align="center" prop="type" width="80">
<template v-slot="scope"> <template slot-scope="scope">
<dict-tag :type="DICT_TYPE.PAY_REFUND_ORDER_TYPE" :value="scope.row.type" /> <dict-tag :type="DICT_TYPE.PAY_REFUND_ORDER_TYPE" :value="scope.row.type" />
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="退款状态" align="center" prop="status"> <el-table-column label="退款状态" align="center" prop="status">
<template v-slot="scope"> <template slot-scope="scope">
<dict-tag :type="DICT_TYPE.PAY_REFUND_ORDER_STATUS" :value="scope.row.status" /> <dict-tag :type="DICT_TYPE.PAY_REFUND_ORDER_STATUS" :value="scope.row.status" />
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="回调状态" align="center" prop="notifyStatus"> <el-table-column label="回调状态" align="center" prop="notifyStatus">
<template v-slot="scope"> <template slot-scope="scope">
<dict-tag :type="DICT_TYPE.PAY_ORDER_NOTIFY_STATUS" :value="scope.row.notifyStatus" /> <dict-tag :type="DICT_TYPE.PAY_ORDER_NOTIFY_STATUS" :value="scope.row.notifyStatus" />
</template> </template>
</el-table-column> </el-table-column>
@ -183,7 +183,7 @@
<el-tag class="tag-purple" size="mini">{{ parseFloat(refundDetail.refundAmount / 100).toFixed(2) }}</el-tag> <el-tag class="tag-purple" size="mini">{{ parseFloat(refundDetail.refundAmount / 100).toFixed(2) }}</el-tag>
</el-descriptions-item> </el-descriptions-item>
<el-descriptions-item label="退款类型"> <el-descriptions-item label="退款类型">
<template v-slot="scope"> <template slot-scope="scope">
<dict-tag :type="DICT_TYPE.PAY_REFUND_ORDER_TYPE" :value="refundDetail.type" /> <dict-tag :type="DICT_TYPE.PAY_REFUND_ORDER_TYPE" :value="refundDetail.type" />
</template> </template>
</el-descriptions-item> </el-descriptions-item>

@ -19,7 +19,7 @@
</el-tab-pane> </el-tab-pane>
</el-tabs> </el-tabs>
<div> <div>
<el-form ref="loginForm" :model="loginForm" :rules="LoginRules" class="login-form"> <el-form ref="loginForm" :model="loginForm" :rules="loginRules" class="login-form">
<!-- 账号密码登录 --> <!-- 账号密码登录 -->
<el-form-item prop="username"> <el-form-item prop="username">
<el-input v-model="loginForm.username" type="text" auto-complete="off" placeholder="账号"> <el-input v-model="loginForm.username" type="text" auto-complete="off" placeholder="账号">
@ -65,16 +65,28 @@
<script> <script>
import Cookies from "js-cookie"; import Cookies from "js-cookie";
import { encrypt, decrypt } from '@/utils/jsencrypt' import { encrypt, decrypt } from '@/utils/jsencrypt'
import {
getPassword, getRememberMe,
getUsername,
removePassword,
removeUsername,
setPassword,
setRememberMe,
setUsername
} from "@/utils/auth";
import {getCodeImg} from "@/api/login";
export default { export default {
name: "ThirdLogin", name: "ThirdLogin",
data() { data() {
return { return {
codeUrl: "",
captchaEnable: true,
loginForm: { loginForm: {
loginType: "uname", loginType: "uname",
username: "admin", username: "admin",
password: "admin123", password: "admin123",
rememberMe: false, // TODO rememberMe: false,
}, },
loginRules: { loginRules: {
username: [ username: [
@ -104,6 +116,7 @@ export default {
this.getCookie(); this.getCookie();
// //
this.redirect = this.$route.query.redirect; this.redirect = this.$route.query.redirect;
this.getCode();
// //
this.type = this.$route.query.type; this.type = this.$route.query.type;
this.code = this.$route.query.code; this.code = this.$route.query.code;
@ -119,16 +132,30 @@ export default {
}); });
}, },
methods: { methods: {
getCode() {
//
if (!this.captchaEnable) {
return;
}
//
getCodeImg().then(res => {
res = res.data;
this.captchaEnable = res.enable;
if (this.captchaEnable) {
this.codeUrl = "data:image/gif;base64," + res.img;
this.loginForm.uuid = res.uuid;
}
});
},
getCookie() { getCookie() {
const username = Cookies.get("username"); const username = getUsername();
const password = Cookies.get("password"); const password = getPassword();
const rememberMe = Cookies.get('rememberMe') const rememberMe = getRememberMe();
const loginType = Cookies.get('loginType');
this.loginForm = { this.loginForm = {
username: username === undefined ? this.loginForm.username : username, username: username ? username : this.loginForm.username,
password: password === undefined ? this.loginForm.password : decrypt(password), password: password ? password : this.loginForm.password,
rememberMe: rememberMe === undefined ? false : Boolean(rememberMe), rememberMe: rememberMe ? getRememberMe() : false,
loginType: loginType === undefined ? this.loginForm.loginType : loginType, loginType: this.loginForm.loginType,
}; };
}, },
handleLogin() { handleLogin() {
@ -136,11 +163,12 @@ export default {
if (valid) { if (valid) {
this.loading = true; this.loading = true;
if (this.loginForm.rememberMe) { if (this.loginForm.rememberMe) {
Cookies.set("username", this.loginForm.username, { expires: 30 }); setUsername(this.loginForm.username)
Cookies.set("password", encrypt(this.loginForm.password), { expires: 30 }); setPassword(this.loginForm.password)
setRememberMe(this.loginForm.rememberMe)
} else { } else {
Cookies.remove("username"); removeUsername()
Cookies.remove("password"); removePassword()
} }
this.$store.dispatch("SocialLogin2", { this.$store.dispatch("SocialLogin2", {
code: this.code, code: this.code,

@ -50,7 +50,7 @@
</el-table-column> </el-table-column>
<el-table-column label="授权类型" align="center" prop="authorizedGrantTypes"> <el-table-column label="授权类型" align="center" prop="authorizedGrantTypes">
<template slot-scope="scope"> <template slot-scope="scope">
<el-tag :disable-transitions="true" v-for="(authorizedGrantType, index) in scope.row.authorizedGrantTypes" :index="index"> <el-tag :disable-transitions="true" :key="index" v-for="(authorizedGrantType, index) in scope.row.authorizedGrantTypes" :index="index">
{{ authorizedGrantType }} {{ authorizedGrantType }}
</el-tag> </el-tag>
</template> </template>

@ -54,7 +54,7 @@
<el-table-column label="描述" align="center" prop="description"/> <el-table-column label="描述" align="center" prop="description"/>
<el-table-column label="标签" align="center" prop="tags"> <el-table-column label="标签" align="center" prop="tags">
<template slot-scope="scope"> <template slot-scope="scope">
<el-tag :disable-transitions="true" v-for="(tag, index) in scope.row.tags" :index="index"> <el-tag :disable-transitions="true" :key="index" v-for="(tag, index) in scope.row.tags" :index="index">
{{ tag }} {{ tag }}
</el-tag> </el-tag>
</template> </template>

@ -147,7 +147,7 @@
<el-form-item label="手机号" prop="mobile"> <el-form-item label="手机号" prop="mobile">
<el-input v-model="sendSmsForm.mobile" placeholder="请输入手机号" /> <el-input v-model="sendSmsForm.mobile" placeholder="请输入手机号" />
</el-form-item> </el-form-item>
<el-form-item v-for="param in sendSmsForm.params" :label="'参数 {' + param + '}'" :prop="'templateParams.' + param"> <el-form-item v-for="param in sendSmsForm.params" :key="param" :label="'参数 {' + param + '}'" :prop="'templateParams.' + param">
<el-input v-model="sendSmsForm.templateParams[param]" :placeholder="'请输入 ' + param + ' 参数'" /> <el-input v-model="sendSmsForm.templateParams[param]" :placeholder="'请输入 ' + param + ' 参数'" />
</el-form-item> </el-form-item>
</el-form> </el-form>

@ -111,7 +111,7 @@
</el-col> </el-col>
<el-col :span="12"> <el-col :span="12">
<el-form-item label="归属部门" prop="deptId"> <el-form-item label="归属部门" prop="deptId">
<treeselect v-model="form.deptId" :options="deptOptions" :show-count="true" <treeselect v-model="form.deptId" :options="deptOptions" :show-count="true" :clearable="false"
placeholder="请选择归属部门" :normalizer="normalizer"/> placeholder="请选择归属部门" :normalizer="normalizer"/>
</el-form-item> </el-form-item>
</el-col> </el-col>
@ -304,7 +304,7 @@ export default {
// //
headers: getBaseHeader(), headers: getBaseHeader(),
// //
url: process.env.VUE_APP_BASE_API + '/admin-api/' + "/system/user/import" url: process.env.VUE_APP_BASE_API + '/admin-api/system/user/import'
}, },
// //
queryParams: { queryParams: {

Loading…
Cancel
Save