Commit 232ac571 authored by huangjie's avatar huangjie

Merge branch 'zuhuduan' of http://192.168.60.201/root/dsk-operate-sys into zuhuduan

parents 50073e07 439e3a4c
...@@ -10,6 +10,7 @@ import com.dsk.common.constant.Constants; ...@@ -10,6 +10,7 @@ import com.dsk.common.constant.Constants;
import com.dsk.common.constant.GlobalConstants; import com.dsk.common.constant.GlobalConstants;
import com.dsk.common.core.domain.R; import com.dsk.common.core.domain.R;
import com.dsk.common.enums.CaptchaType; import com.dsk.common.enums.CaptchaType;
import com.dsk.common.exception.user.CaptchaException;
import com.dsk.common.exception.user.CaptchaExpireException; import com.dsk.common.exception.user.CaptchaExpireException;
import com.dsk.common.helper.LoginHelper; import com.dsk.common.helper.LoginHelper;
import com.dsk.common.utils.MessageUtils; import com.dsk.common.utils.MessageUtils;
...@@ -29,6 +30,7 @@ import org.dromara.sms4j.api.SmsBlend; ...@@ -29,6 +30,7 @@ import org.dromara.sms4j.api.SmsBlend;
import org.dromara.sms4j.api.entity.SmsResponse; import org.dromara.sms4j.api.entity.SmsResponse;
import org.dromara.sms4j.core.factory.SmsFactory; import org.dromara.sms4j.core.factory.SmsFactory;
import org.dromara.sms4j.provider.enumerate.SupplierType; import org.dromara.sms4j.provider.enumerate.SupplierType;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.expression.Expression; import org.springframework.expression.Expression;
import org.springframework.expression.ExpressionParser; import org.springframework.expression.ExpressionParser;
import org.springframework.expression.spel.standard.SpelExpressionParser; import org.springframework.expression.spel.standard.SpelExpressionParser;
...@@ -60,18 +62,23 @@ public class CaptchaController { ...@@ -60,18 +62,23 @@ public class CaptchaController {
private final MailProperties mailProperties; private final MailProperties mailProperties;
private final SysUserMapper userMapper; private final SysUserMapper userMapper;
@Value("${captcha.enable}")
private boolean captchaEnabled;
/** /**
* 发送短信验证码 * 发送短信验证码
* *
* @param phonenumber 用户手机号 * @param phonenumber 用户手机号
*/ */
@GetMapping("/captchaSms") @GetMapping("/captchaSms")
public R<Void> smsCaptcha(@NotBlank(message = "{user.phonenumber.not.blank}") String phonenumber) { public R<Void> smsCaptcha(@NotBlank(message = "{user.phonenumber.not.blank}") String phonenumber,String uid,String captchaCode,String templateId) {
String key = GlobalConstants.CAPTCHA_CODE_KEY + phonenumber; String key = GlobalConstants.CAPTCHA_CODE_KEY + phonenumber;
// 验证码开关
if (captchaEnabled) {
validateCaptcha(phonenumber, captchaCode, uid);
}
String code = RandomUtil.randomNumbers(6); String code = RandomUtil.randomNumbers(6);
RedisUtils.setCacheObject(key, code, Duration.ofMinutes(Constants.CAPTCHA_EXPIRATION)); RedisUtils.setCacheObject(key, code, Duration.ofMinutes(Constants.CAPTCHA_EXPIRATION));
// 验证码模板id 自行处理 (查数据库或写死均可) // 验证码模板id 自行处理 (查数据库或写死均可)
String templateId = "";
LinkedHashMap<String, String> map = new LinkedHashMap<>(1); LinkedHashMap<String, String> map = new LinkedHashMap<>(1);
map.put("code", code); map.put("code", code);
SmsBlend smsBlend = SmsFactory.createSmsBlend(SupplierType.ALIBABA); SmsBlend smsBlend = SmsFactory.createSmsBlend(SupplierType.ALIBABA);
...@@ -83,6 +90,20 @@ public class CaptchaController { ...@@ -83,6 +90,20 @@ public class CaptchaController {
return R.ok(); return R.ok();
} }
private void validateCaptcha(String phonenumber, String captchaCode, String uuid) {
String verifyKey = GlobalConstants.CAPTCHA_CODE_KEY + StringUtils.defaultString(uuid, "");
String captcha = RedisUtils.getCacheObject(verifyKey);
RedisUtils.deleteObject(verifyKey);
if (captcha == null) {
// recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.expire"));
throw new CaptchaExpireException();
}
if (!captchaCode.equalsIgnoreCase(captcha)) {
// recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.error"));
throw new CaptchaException();
}
}
/** /**
* 开发需要,临时发送短信验证码 * 开发需要,临时发送短信验证码
*/ */
......
...@@ -5,6 +5,7 @@ import cn.dev33.satoken.annotation.SaIgnore; ...@@ -5,6 +5,7 @@ import cn.dev33.satoken.annotation.SaIgnore;
import cn.dev33.satoken.stp.StpUtil; import cn.dev33.satoken.stp.StpUtil;
import cn.hutool.core.lang.Assert; import cn.hutool.core.lang.Assert;
import cn.hutool.core.map.MapUtil; import cn.hutool.core.map.MapUtil;
import cn.hutool.core.util.RandomUtil;
import com.dsk.common.constant.Constants; import com.dsk.common.constant.Constants;
import com.dsk.common.constant.GlobalConstants; import com.dsk.common.constant.GlobalConstants;
import com.dsk.common.core.domain.R; import com.dsk.common.core.domain.R;
...@@ -24,6 +25,10 @@ import com.dsk.system.service.ISysMenuService; ...@@ -24,6 +25,10 @@ import com.dsk.system.service.ISysMenuService;
import com.dsk.system.service.ISysUserService; import com.dsk.system.service.ISysUserService;
import com.dsk.system.service.SysLoginService; import com.dsk.system.service.SysLoginService;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import org.dromara.sms4j.api.SmsBlend;
import org.dromara.sms4j.api.entity.SmsResponse;
import org.dromara.sms4j.core.factory.SmsFactory;
import org.dromara.sms4j.provider.enumerate.SupplierType;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
...@@ -32,6 +37,7 @@ import javax.servlet.http.HttpServletRequest; ...@@ -32,6 +37,7 @@ import javax.servlet.http.HttpServletRequest;
import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotBlank;
import java.time.Duration; import java.time.Duration;
import java.util.HashMap; import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
...@@ -116,6 +122,36 @@ public class SysLoginController { ...@@ -116,6 +122,36 @@ public class SysLoginController {
} }
/**
* 获取当前用户默认租户
* @return
*/
@SaIgnore
@PostMapping("/user/default/tenant/phone")
public R<Map> userDefaultTenant(String phone) {
// LoginUser loginUser = LoginHelper.getLoginUser();
// Assert.notNull(loginUser,"用户信息不存在!");
String defaultTenantKey = GlobalConstants.PHONE_DEFAULT_TENANT + phone;
String defaultTenant = RedisUtils.getCacheObject(defaultTenantKey);
return R.ok(MapUtil.of("tenantId",defaultTenant));
}
/**
* 发送短信验证码
*
* @param phones 电话号
* @param templateId 模板ID
*/
@SaIgnore
@GetMapping("/send/sms/code")
public R<Object> sendAliyun(String phones, String templateId) {
LinkedHashMap<String, String> map = new LinkedHashMap<>(1);
map.put("code", RandomUtil.randomNumbers(4));
SmsBlend smsBlend = SmsFactory.createSmsBlend(SupplierType.ALIBABA);
SmsResponse smsResponse = smsBlend.sendMessage(phones, templateId, map);
return R.ok(smsResponse);
}
/** /**
* 短信登录 * 短信登录
* *
...@@ -124,14 +160,11 @@ public class SysLoginController { ...@@ -124,14 +160,11 @@ public class SysLoginController {
*/ */
@SaIgnore @SaIgnore
@PostMapping("/smsLogin") @PostMapping("/smsLogin")
public R<Map<String, Object>> smsLogin(@Validated @RequestBody SmsLoginBody smsLoginBody) { public R<LoginVo> smsLogin(@Validated @RequestBody SmsLoginBody smsLoginBody) {
Map<String, Object> ajax = new HashMap<>();
// 生成令牌 // 生成令牌
String token = loginService.smsLogin(smsLoginBody.getPhonenumber(), smsLoginBody.getSmsCode()); LoginVo loginVo=loginService.smsLogin(smsLoginBody.getPhonenumber(), smsLoginBody.getSmsCode());
ajax.put(Constants.TOKEN, token); return R.ok(loginVo);
return R.ok(ajax);
} }
/** /**
* 邮件登录 * 邮件登录
* *
......
...@@ -5,11 +5,11 @@ import cn.hutool.core.io.FileUtil; ...@@ -5,11 +5,11 @@ import cn.hutool.core.io.FileUtil;
import com.dsk.common.annotation.Log; import com.dsk.common.annotation.Log;
import com.dsk.common.core.controller.BaseController; import com.dsk.common.core.controller.BaseController;
import com.dsk.common.core.domain.R; import com.dsk.common.core.domain.R;
import com.dsk.system.domain.SysUser;
import com.dsk.common.enums.BusinessType; import com.dsk.common.enums.BusinessType;
import com.dsk.common.helper.LoginHelper; import com.dsk.common.helper.LoginHelper;
import com.dsk.common.utils.StringUtils; import com.dsk.common.utils.StringUtils;
import com.dsk.common.utils.file.MimeTypeUtils; import com.dsk.common.utils.file.MimeTypeUtils;
import com.dsk.system.domain.SysUser;
import com.dsk.system.domain.vo.SysOssVo; import com.dsk.system.domain.vo.SysOssVo;
import com.dsk.system.service.ISysOssService; import com.dsk.system.service.ISysOssService;
import com.dsk.system.service.ISysUserService; import com.dsk.system.service.ISysUserService;
...@@ -20,6 +20,7 @@ import org.springframework.web.bind.annotation.*; ...@@ -20,6 +20,7 @@ import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartFile;
import java.util.Arrays; import java.util.Arrays;
import java.util.Base64;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
...@@ -82,6 +83,8 @@ public class SysProfileController extends BaseController { ...@@ -82,6 +83,8 @@ public class SysProfileController extends BaseController {
@Log(title = "个人信息", businessType = BusinessType.UPDATE) @Log(title = "个人信息", businessType = BusinessType.UPDATE)
@PutMapping("/updatePwd") @PutMapping("/updatePwd")
public R<Void> updatePwd(String oldPassword, String newPassword) { public R<Void> updatePwd(String oldPassword, String newPassword) {
oldPassword = new String(Base64.getDecoder().decode(oldPassword));
newPassword = new String(Base64.getDecoder().decode(newPassword));
SysUser user = userService.selectUserById(LoginHelper.getUserId()); SysUser user = userService.selectUserById(LoginHelper.getUserId());
String userName = user.getUserName(); String userName = user.getUserName();
String password = user.getPassword(); String password = user.getPassword();
......
...@@ -7,6 +7,7 @@ import cn.hutool.core.lang.tree.Tree; ...@@ -7,6 +7,7 @@ import cn.hutool.core.lang.tree.Tree;
import cn.hutool.core.util.ArrayUtil; import cn.hutool.core.util.ArrayUtil;
import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ObjectUtil;
import com.dsk.common.annotation.Log; import com.dsk.common.annotation.Log;
import com.dsk.common.constant.GlobalConstants;
import com.dsk.common.core.controller.BaseController; import com.dsk.common.core.controller.BaseController;
import com.dsk.common.core.domain.PageQuery; import com.dsk.common.core.domain.PageQuery;
import com.dsk.common.core.domain.R; import com.dsk.common.core.domain.R;
...@@ -17,6 +18,7 @@ import com.dsk.common.helper.LoginHelper; ...@@ -17,6 +18,7 @@ import com.dsk.common.helper.LoginHelper;
import com.dsk.common.utils.StreamUtils; import com.dsk.common.utils.StreamUtils;
import com.dsk.common.utils.StringUtils; import com.dsk.common.utils.StringUtils;
import com.dsk.common.utils.poi.ExcelUtil; import com.dsk.common.utils.poi.ExcelUtil;
import com.dsk.common.utils.redis.RedisUtils;
import com.dsk.system.domain.SysDept; import com.dsk.system.domain.SysDept;
import com.dsk.system.domain.SysRole; import com.dsk.system.domain.SysRole;
import com.dsk.system.domain.SysUser; import com.dsk.system.domain.SysUser;
...@@ -84,6 +86,18 @@ public class SysUserController extends BaseController { ...@@ -84,6 +86,18 @@ public class SysUserController extends BaseController {
ExcelUtil.exportExcel(listVo, "用户数据", SysUserExportVo.class, response); ExcelUtil.exportExcel(listVo, "用户数据", SysUserExportVo.class, response);
} }
/**
* 获取批量导入用户失败列表
*/
@Log(title = "用户管理", businessType = BusinessType.EXPORT)
@SaCheckPermission("system:user:export")
@PostMapping("/exportFailUsers")
public void exportFailUsers(HttpServletResponse response) {
String key = GlobalConstants.BATCH_IMPORT_FAIL_USERS + LoginHelper.getUserId();
ExcelUtil.exportExcel(RedisUtils.getCacheList(key), "用户数据", SysUserImportVo.class, response);
RedisUtils.deleteObject(key);
}
/** /**
* 导入数据 * 导入数据
* *
...@@ -93,8 +107,14 @@ public class SysUserController extends BaseController { ...@@ -93,8 +107,14 @@ public class SysUserController extends BaseController {
@Log(title = "用户管理", businessType = BusinessType.IMPORT) @Log(title = "用户管理", businessType = BusinessType.IMPORT)
@SaCheckPermission("system:user:import") @SaCheckPermission("system:user:import")
@PostMapping(value = "/importData", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) @PostMapping(value = "/importData", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
public R<Void> importData(@RequestPart("file") MultipartFile file, boolean updateSupport) throws Exception { public R<List<SysUserImportVo>> importData(@RequestPart("file") MultipartFile file, boolean updateSupport) throws Exception {
ExcelResult<SysUserImportVo> result = ExcelUtil.importExcel(file.getInputStream(), SysUserImportVo.class, new SysUserImportListener(updateSupport)); ExcelResult<SysUserImportVo> result = ExcelUtil.importExcel(file.getInputStream(), SysUserImportVo.class, new SysUserImportListener(updateSupport));
List<SysUserImportVo> resultList = result.getList();
if (ObjectUtil.isNotNull(resultList)) {
String key = GlobalConstants.BATCH_IMPORT_FAIL_USERS + LoginHelper.getUserId();
RedisUtils.setCacheList(key, resultList);
return R.fail(resultList);
}
return R.ok(result.getAnalysis()); return R.ok(result.getAnalysis());
} }
...@@ -103,7 +123,9 @@ public class SysUserController extends BaseController { ...@@ -103,7 +123,9 @@ public class SysUserController extends BaseController {
*/ */
@PostMapping("/importTemplate") @PostMapping("/importTemplate")
public void importTemplate(HttpServletResponse response) { public void importTemplate(HttpServletResponse response) {
ExcelUtil.exportExcel(new ArrayList<>(), "用户数据", SysUserImportVo.class, response); List<Object> list = new ArrayList<>();
list.add(new SysUserImportVo("测试部门", "测试用户昵称", "18888888888", "测试角色"));
ExcelUtil.exportTemplate(list, "用户数据", "excel/userImportTemplate.xlsx", response);
} }
/** /**
...@@ -135,9 +157,7 @@ public class SysUserController extends BaseController { ...@@ -135,9 +157,7 @@ public class SysUserController extends BaseController {
@Log(title = "用户管理", businessType = BusinessType.INSERT) @Log(title = "用户管理", businessType = BusinessType.INSERT)
@PostMapping @PostMapping
public R<Void> add(@Validated @RequestBody SysUser user) { public R<Void> add(@Validated @RequestBody SysUser user) {
if (!userService.checkUserNameUnique(user)) { if (StringUtils.isNotEmpty(user.getPhonenumber()) && !userService.checkPhoneUnique(user)) {
return R.fail("新增用户'" + user.getUserName() + "'失败,登录账号已存在");
} else if (StringUtils.isNotEmpty(user.getPhonenumber()) && !userService.checkPhoneUnique(user)) {
return R.fail("新增用户'" + user.getUserName() + "'失败,手机号码已存在"); return R.fail("新增用户'" + user.getUserName() + "'失败,手机号码已存在");
} else if (StringUtils.isNotEmpty(user.getEmail()) && !userService.checkEmailUnique(user)) { } else if (StringUtils.isNotEmpty(user.getEmail()) && !userService.checkEmailUnique(user)) {
return R.fail("新增用户'" + user.getUserName() + "'失败,邮箱账号已存在"); return R.fail("新增用户'" + user.getUserName() + "'失败,邮箱账号已存在");
......
...@@ -167,11 +167,11 @@ sms: ...@@ -167,11 +167,11 @@ sms:
#请求地址 默认为 dysmsapi.aliyuncs.com 如无特殊改变可以不用设置 #请求地址 默认为 dysmsapi.aliyuncs.com 如无特殊改变可以不用设置
requestUrl: dysmsapi.aliyuncs.com requestUrl: dysmsapi.aliyuncs.com
#阿里云的accessKey #阿里云的accessKey
accessKeyId: xxxxxxx accessKeyId: LTAIC4Pb2jJZbUmD
#阿里云的accessKeySecret #阿里云的accessKeySecret
accessKeySecret: xxxxxxx accessKeySecret: L7VANFwqaTludkczLsg9jhvidk0e28
#短信签名 #短信签名
signature: 测试 signature: 大司空信息科技
tencent: tencent:
#请求地址默认为 sms.tencentcloudapi.com 如无特殊改变可不用设置 #请求地址默认为 sms.tencentcloudapi.com 如无特殊改变可不用设置
requestUrl: sms.tencentcloudapi.com requestUrl: sms.tencentcloudapi.com
......
...@@ -43,4 +43,9 @@ public interface GlobalConstants { ...@@ -43,4 +43,9 @@ public interface GlobalConstants {
*/ */
String PHONE_DEFAULT_TENANT = GLOBAL_REDIS_KEY + "phone_default_tenant:"; String PHONE_DEFAULT_TENANT = GLOBAL_REDIS_KEY + "phone_default_tenant:";
/**
* 批量导入用户失败集合
*/
String BATCH_IMPORT_FAIL_USERS = GLOBAL_REDIS_KEY + "batch_import_fail_users";
} }
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
...@@ -368,6 +368,20 @@ export const dynamicRoutes = [ ...@@ -368,6 +368,20 @@ export const dynamicRoutes = [
} }
] ]
}, },
{
path: '/system/oss-config',
component: Layout,
hidden: true,
permissions: ['system:oss:list'],
children: [
{
path: 'index',
component: () => import('@/views/system/oss/config'),
name: 'OssConfig',
meta: { title: '配置管理', activeMenu: '/system/oss' }
}
]
},
{ {
path: '/tool/gen-edit', path: '/tool/gen-edit',
component: Layout, component: Layout,
......
...@@ -5,7 +5,11 @@ ...@@ -5,7 +5,11 @@
<span class="province">{{province}}</span> <span class="province">{{province}}</span>
<span class="icon"> <span class="icon">
<i class="el-icon-location"></i>切换 <i class="el-icon-location"></i>切换
<el-cascader ref="address" class="cascader-region" popper-class='cascader-region-addd' <el-select v-if="key =='5'" v-model="address" class="cascader-region" @change="addressListbtn1">
<el-option v-for="(item,index) in addressList" :key="index" :label="item.label" :value="item.id"></el-option>
</el-select>
<el-cascader v-else ref="address" class="cascader-region" popper-class='cascader-region-addd'
@change="addressListbtn" v-model="address" :options="addressList" :props="props" collapse-tags></el-cascader> @change="addressListbtn" v-model="address" :options="addressList" :props="props" collapse-tags></el-cascader>
</span> </span>
</div> </div>
...@@ -17,7 +21,7 @@ ...@@ -17,7 +21,7 @@
import dataRegion from '@/assets/json/dataRegion' import dataRegion from '@/assets/json/dataRegion'
export default { export default {
name:'region', name:'region',
props:['province','dataQuery'], props:['province','dataQuery','type'],
data(){ data(){
return { return {
props: { props: {
...@@ -28,7 +32,8 @@ ...@@ -28,7 +32,8 @@
addressList: [], addressList: [],
address:'', address:'',
provinceId:[], provinceId:[],
location:'' location:'',
key:'',
} }
}, },
watch: { watch: {
...@@ -39,10 +44,12 @@ ...@@ -39,10 +44,12 @@
created(){ created(){
this.dataRegion() this.dataRegion()
this.location=this.province this.location=this.province
this.key=this.type;
}, },
methods:{ methods:{
addressListbtn() { addressListbtn() {
let nodesObj = this.$refs.address.getCheckedNodes()[0]; let nodesObj = this.$refs.address.getCheckedNodes()[0];
this.location=nodesObj.pathLabels[nodesObj.pathLabels.length-1]; this.location=nodesObj.pathLabels[nodesObj.pathLabels.length-1];
this.provinceId=nodesObj.path; this.provinceId=nodesObj.path;
let data={} let data={}
...@@ -52,6 +59,18 @@ ...@@ -52,6 +59,18 @@
this.$parent.addressListbtn(data) this.$parent.addressListbtn(data)
localStorage.setItem('location', true) localStorage.setItem('location', true)
}, },
addressListbtn1() {
let obj = this.addressList.find((option) => option.id === this.address);
this.location=obj.label;
this.provinceId=[obj.id];
let data={}
data.province=this.location
data.provinceId=this.provinceId
data.provinces=[this.location]
console.log(data,"|||||||")
this.$parent.addressListbtn(data)
localStorage.setItem('location', true)
},
//地区 //地区
async dataRegion() { async dataRegion() {
// await axios.post("https://files.jiansheku.com/file/json/common/dataRegion.json", {}, { // await axios.post("https://files.jiansheku.com/file/json/common/dataRegion.json", {}, {
......
...@@ -376,7 +376,7 @@ export default { ...@@ -376,7 +376,7 @@ export default {
top: 46px; top: 46px;
} }
th{ th{
font-size: 12px !important; font-size: 13px !important;
font-weight: 400 !important; font-weight: 400 !important;
} }
.el-table__fixed-header-wrapper th{ .el-table__fixed-header-wrapper th{
......
...@@ -22,6 +22,7 @@ ...@@ -22,6 +22,7 @@
v-loading="tableLoading" v-loading="tableLoading"
:data="tableData" :data="tableData"
border border
v-horizontal-scroll="'hover'"
highlight-current-row highlight-current-row
@sort-change="sortChange" @sort-change="sortChange"
:default-sort = "{prop: 'gdp', order: 'descending'}" :default-sort = "{prop: 'gdp', order: 'descending'}"
...@@ -36,7 +37,7 @@ ...@@ -36,7 +37,7 @@
</el-table-column> </el-table-column>
<el-table-column prop="gdp" label="GDP(亿元)" sortable width="120" :formatter="formatStatus"/> <el-table-column prop="gdp" label="GDP(亿元)" sortable width="120" :formatter="formatStatus"/>
<el-table-column prop="gdpGrowth" label="GDP增速(%)" sortable width="120" :formatter="formatStatus"/> <el-table-column prop="gdpGrowth" label="GDP增速(%)" sortable width="130" :formatter="formatStatus"/>
<el-table-column prop="gdpPerCapita" label="人均GDP(元)" sortable width="130" :formatter="formatStatus"/> <el-table-column prop="gdpPerCapita" label="人均GDP(元)" sortable width="130" :formatter="formatStatus"/>
<el-table-column prop="population" label="人口(万人)" sortable width="120" :formatter="formatStatus"/> <el-table-column prop="population" label="人口(万人)" sortable width="120" :formatter="formatStatus"/>
<el-table-column prop="fixedInvestment" label="固定资产投资 (亿元) " sortable width="200" :formatter="formatStatus"/> <el-table-column prop="fixedInvestment" label="固定资产投资 (亿元) " sortable width="200" :formatter="formatStatus"/>
...@@ -111,10 +112,10 @@ export default { ...@@ -111,10 +112,10 @@ export default {
params.provinceIds=[this.provinceId[0]] params.provinceIds=[this.provinceId[0]]
} }
if(this.provinceId.length > 1){ if(this.provinceId.length > 1){
params.cityId=[this.provinceId[1]] params.cityIds=[this.provinceId[1]]
} }
if(this.provinceId.length > 2){ if(this.provinceId.length > 2){
params.areaId=[this.provinceId[2]] params.areaIds=[this.provinceId[2]]
} }
// params.provinceIds=[this.dataQuery.provinceId] // params.provinceIds=[this.dataQuery.provinceId]
// this.isSkeleton = true // this.isSkeleton = true
...@@ -226,7 +227,6 @@ export default { ...@@ -226,7 +227,6 @@ export default {
overflow-y: clip; overflow-y: clip;
} }
th{ th{
font-size: 12px !important;
font-weight: 400 !important; font-weight: 400 !important;
} }
.el-table__fixed-header-wrapper th{ .el-table__fixed-header-wrapper th{
......
...@@ -333,9 +333,9 @@ export default { ...@@ -333,9 +333,9 @@ export default {
getData(){ getData(){
this.isSkeleton = true this.isSkeleton = true
let params={} let params={}
if(this.dataQuery.id){ // if(this.dataQuery.id){
params.id=this.dataQuery.id // params.id=this.dataQuery.id
} // }
if(this.provinceId.length >= 0){ if(this.provinceId.length >= 0){
params.provinceId=this.provinceId[0] params.provinceId=this.provinceId[0]
} }
...@@ -732,16 +732,6 @@ export default { ...@@ -732,16 +732,6 @@ export default {
this.$parent.handleClick('second', data); this.$parent.handleClick('second', data);
break; break;
case 2: case 2:
// this.$router.push({
// path: '/macro/urban',
// query:{
// provinceId:this.dataQuery.provinceId,
// province:this.dataQuery.province,
// }
// })
console.log(this.dataQuery.provinceId)
console.log(this.dataQuery.province)
// return
this.$router.push({name: 'Urban', this.$router.push({name: 'Urban',
params: { params: {
provinceId: this.dataQuery.provinceId, provinceId: this.dataQuery.provinceId,
...@@ -883,7 +873,7 @@ export default { ...@@ -883,7 +873,7 @@ export default {
::v-deep .el-table{ ::v-deep .el-table{
overflow:visible; overflow:visible;
th{ th{
font-size: 12px !important; font-size: 13px !important;
font-weight: 400 !important; font-weight: 400 !important;
} }
.el-table__fixed-header-wrapper th{ .el-table__fixed-header-wrapper th{
......
...@@ -76,7 +76,13 @@ export default { ...@@ -76,7 +76,13 @@ export default {
if(Array.isArray(this.dataQuery.provinceId)){ if(Array.isArray(this.dataQuery.provinceId)){
this.provinceId=this.dataQuery.provinceId this.provinceId=this.dataQuery.provinceId
}else { }else {
this.provinceId.push(this.dataQuery.provinceId) if(this.dataQuery.cityId){
this.provinceId=[this.dataQuery.provinceId,this.dataQuery.cityId,this.dataQuery.areaId]
}else if(this.dataQuery.cityId){
this.provinceId=[this.dataQuery.provinceId,this.dataQuery.cityId]
}else {
this.provinceId=[this.dataQuery.provinceId]
}
} }
}else { }else {
location({}).then(res => { location({}).then(res => {
......
<template> <template>
<div class="app-container enterprises"> <div class="app-container enterprises">
<Region v-if="province" :province="province" :dataQuery="dataQuery" @addressListbtn="addressListbtn"></Region> <Region v-if="province" :province="province" :dataQuery="dataQuery" @addressListbtn="addressListbtn" :type="5"></Region>
<div class="flex-box eco-header"> <div class="flex-box eco-header">
<el-tabs v-model="activeName" @tab-click="handleClick"> <el-tabs v-model="activeName" @tab-click="handleClick">
<el-tab-pane label="本地企业" name="first"></el-tab-pane> <el-tab-pane label="本地企业" name="first"></el-tab-pane>
...@@ -20,6 +20,7 @@ ...@@ -20,6 +20,7 @@
collapse-tags collapse-tags
clearable></el-cascader> clearable></el-cascader>
<el-input placeholder="输入关键词查询" v-model="queryParams.ename" clearable @clear="handleSearch()"> <el-input placeholder="输入关键词查询" v-model="queryParams.ename" clearable @clear="handleSearch()">
<i slot="prefix" class="el-icon-search"></i>
<el-button slot="append" @click="handleSearch()">搜索</el-button> <el-button slot="append" @click="handleSearch()">搜索</el-button>
</el-input> </el-input>
<span class="total">{{tableDataTotal}}</span> <span class="total">{{tableDataTotal}}</span>
...@@ -31,7 +32,7 @@ ...@@ -31,7 +32,7 @@
v-loading="tableLoading" v-loading="tableLoading"
border border
fit fit
max-height="640" v-horizontal-scroll="'hover'"
@sort-change="sortChange" @sort-change="sortChange"
highlight-current-row highlight-current-row
v-if="tableDataTotal > 0 && !isSkeleton" v-if="tableDataTotal > 0 && !isSkeleton"
...@@ -291,17 +292,8 @@ export default { ...@@ -291,17 +292,8 @@ export default {
this.dataQuery.province=data.provinces; this.dataQuery.province=data.provinces;
let params={} let params={}
if(data){ if(data){
if(this.provinceId.length > 0){ params.provinceId=this.provinceId
params.provinceId=this.provinceId[0]
} }
if(this.provinceId.length > 1){
params.cityId=this.provinceId[1]
}
if(this.provinceId.length > 2){
params.areaId=this.provinceId[2]
}
}
this.querySubmit() this.querySubmit()
location(params).then(res => { location(params).then(res => {
console.log(res.data) console.log(res.data)
...@@ -362,11 +354,13 @@ export default { ...@@ -362,11 +354,13 @@ export default {
width: 180px; width: 180px;
margin-right: 12px; margin-right: 12px;
height: 32px; height: 32px;
line-height: 32px !important;
.el-input{ .el-input{
width: 100%; width: 100%;
height: 32px; height: 32px;
.el-input__inner{ .el-input__inner{
height: 32px !important; height: 32px !important;
line-height: 32px !important;
} }
} }
.el-cascader__tags{ .el-cascader__tags{
...@@ -379,16 +373,29 @@ export default { ...@@ -379,16 +373,29 @@ export default {
} }
::v-deep .el-input.el-input-group{ ::v-deep .el-input.el-input-group{
width: 240px; width: 240px;
height: 32px; height: 30px;
border: 1px solid #e0e0e0;
.el-input__inner{ .el-input__inner{
height: 32px; height: 30px;
border-right: 0; border: 0;
} }
.el-input__suffix{ .el-input__suffix{
margin-top: -1px; margin-top: -1px;
} }
.el-icon-search{
font-size: 14px;
line-height: 32px;
color:#0081FF;
margin-left: 6px;
margin-right: 4px;
}
.el-input__inner:focus{ .el-input__inner:focus{
border-color: #e0e0e0; /*border-color: #0081FF;*/
}
.el-input__inner:focus ~.el-input-group__append{
/*border: 1px solid #0081FF;*/
color: #ffffff;
background: #0081FF;
} }
.el-input-group__append{ .el-input-group__append{
width: 60px; width: 60px;
...@@ -396,9 +403,12 @@ export default { ...@@ -396,9 +403,12 @@ export default {
text-align: center; text-align: center;
background: #F5F5F5; background: #F5F5F5;
color:#0081FF; color:#0081FF;
border-left: 0; border-radius:0 2px 2px 0;
border-radius: 0; border: 0;
border-right: 0; &:hover{
color: #ffffff;
background: #0081FF;
}
} }
} }
.total{ .total{
...@@ -448,7 +458,7 @@ export default { ...@@ -448,7 +458,7 @@ export default {
overflow-y: clip; overflow-y: clip;
} }
th{ th{
font-size: 12px !important; font-size: 13px !important;
font-weight: 400 !important; font-weight: 400 !important;
} }
.el-table__fixed-header-wrapper th{ .el-table__fixed-header-wrapper th{
......
...@@ -437,7 +437,6 @@ export default { ...@@ -437,7 +437,6 @@ export default {
.content{ .content{
background: #ffffff; background: #ffffff;
padding: 16px; padding: 16px;
margin-bottom: 16px;
border-radius: 4px; border-radius: 4px;
} }
.common-title{ .common-title{
......
<template>
<div class="app-container">
大型甲方
</div>
</template>
<script>
export default {
name: 'FirstParty',
data() {
return {
}
},
created() {
},
methods: {
}
}
</script>
<style lang="scss" scoped>
</style>
<template>
<div class="app-container">
地区榜单
</div>
</template>
<script>
export default {
name: 'List',
data() {
return {
}
},
created() {
},
methods: {
}
}
</script>
<style lang="scss" scoped>
</style>
<template>
<div class="BIfx">
<el-tabs v-model="activeName">
<el-tab-pane label="宏观市场分析" name="first">
<img class="img" src="@/assets/images/BI/hgscfx.png"/>
</el-tab-pane>
<el-tab-pane label="立项设计" name="second">
<img class="img" src="@/assets/images/BI/lxsj.png"/>
</el-tab-pane>
<el-tab-pane label="专项债项目" name="third">
<img class="img" src="@/assets/images/BI/zxz.png"/>
</el-tab-pane>
<el-tab-pane label="中标公告" name="fourth">
<img class="img" src="@/assets/images/BI/zbgg.png"/>
</el-tab-pane>
</el-tabs>
</div>
</template>
<script>
export default {
name: 'BI',
data() {
return {
activeName:'first'
}
}
}
</script>
<style lang="scss" scoped>
.BIfx{
background: #ffffff;
padding: 16px;
margin-top: 12px;
::v-deep .el-tabs{
.el-tabs__nav-wrap::after {
position: static !important;
}
.el-tabs__header{
margin: 0;
.el-tabs__item{
padding: 0 16px;
font-size: 16px;
}
.is-active{
font-weight: bold;
}
}
.el-tabs__content{
width: 100%;
}
}
.img{
width: 100%;
margin-top: 30px;
}
}
</style>
...@@ -225,10 +225,7 @@ ...@@ -225,10 +225,7 @@
} }
}, },
created() { created() {
setTimeout(() => { this.getAreaGroupByProvince()
this.isSkeleton=false;
this.getData()
}, 1000);
var date = new Date() var date = new Date()
var year = date.getFullYear() var year = date.getFullYear()
var month = date.getMonth() + 1 < 10 ? '0' + (date.getMonth() + 1) : date.getMonth()+ 1 var month = date.getMonth() + 1 < 10 ? '0' + (date.getMonth() + 1) : date.getMonth()+ 1
...@@ -274,9 +271,13 @@ ...@@ -274,9 +271,13 @@
total=total+this.jzglData[i].count total=total+this.jzglData[i].count
} }
this.total=total; this.total=total;
this.$nextTick(() => {
this.initChart() this.initChart()
}) })
})
},
getCertGroupByMajorProvinceLevel(){
certGroupByMajorProvinceLevel().then(res => { certGroupByMajorProvinceLevel().then(res => {
this.dqData=res.data; this.dqData=res.data;
let data=this.dqData[0].province; let data=this.dqData[0].province;
...@@ -305,9 +306,15 @@ ...@@ -305,9 +306,15 @@
list.push(item) list.push(item)
} }
this.jzdqData=list this.jzdqData=list
this.$nextTick(() => {
this.initChart1() this.initChart1()
}) })
})
},
getAreaGroupByProvince(){
areaGroupByProvince().then(res => { areaGroupByProvince().then(res => {
this.isSkeleton=false;
this.zbData=res.data; this.zbData=res.data;
//定义一个变量 保存数据 因为sort方法排序会改变原数组 使用JSON方法深拷贝 将原数值暂存 //定义一个变量 保存数据 因为sort方法排序会改变原数组 使用JSON方法深拷贝 将原数值暂存
// let dataArr = JSON.parse(JSON.stringify(res.data)) // let dataArr = JSON.parse(JSON.stringify(res.data))
...@@ -321,10 +328,15 @@ ...@@ -321,10 +328,15 @@
this.rankList=data; this.rankList=data;
//将原数组数据赋值回去 保持数据不变 //将原数组数据赋值回去 保持数据不变
// this.zbData = JSON.parse(JSON.stringify(dataArr)) // this.zbData = JSON.parse(JSON.stringify(dataArr))
this.$nextTick(() => {
this.initChart2() this.initChart2()
}) })
this.getData()
this.getCertGroupByMajorProvinceLevel()
})
}, },
initChart() { initChart() {
this.$nextTick(() => {
let myChart = echarts.init(document.getElementById("gl-echarts")) let myChart = echarts.init(document.getElementById("gl-echarts"))
let option ={ let option ={
tooltip: { tooltip: {
...@@ -382,8 +394,10 @@ ...@@ -382,8 +394,10 @@
window.addEventListener("resize", function () { window.addEventListener("resize", function () {
myChart.resize();//图表跟随页面大小变化宽度 myChart.resize();//图表跟随页面大小变化宽度
}); });
})
}, },
initChart1() { initChart1() {
this.$nextTick(() => {
let myChart = echarts.init(document.getElementById("jzqy-echarts")) let myChart = echarts.init(document.getElementById("jzqy-echarts"))
let option ={ let option ={
legend: { legend: {
...@@ -549,8 +563,11 @@ ...@@ -549,8 +563,11 @@
window.addEventListener("resize", function () { window.addEventListener("resize", function () {
myChart.resize();//图表跟随页面大小变化宽度 myChart.resize();//图表跟随页面大小变化宽度
}); });
})
}, },
initChart2() { initChart2() {
this.$nextTick(() => {
let myChart = echarts.init(document.getElementById("ba-echarts")) let myChart = echarts.init(document.getElementById("ba-echarts"))
let option ={ let option ={
tooltip: { tooltip: {
...@@ -615,6 +632,7 @@ ...@@ -615,6 +632,7 @@
window.addEventListener("resize", function () { window.addEventListener("resize", function () {
myChart.resize();//图表跟随页面大小变化宽度 myChart.resize();//图表跟随页面大小变化宽度
}); });
})
}, },
handleClick(type,index){ handleClick(type,index){
if(type === 1){ if(type === 1){
...@@ -848,7 +866,7 @@ ...@@ -848,7 +866,7 @@
} }
} }
th{ th{
font-size: 12px !important; font-size: 13px !important;
font-weight: 400 !important; font-weight: 400 !important;
} }
.el-table__fixed-header-wrapper th{ .el-table__fixed-header-wrapper th{
......
...@@ -11,7 +11,7 @@ ...@@ -11,7 +11,7 @@
</el-select> </el-select>
</div> </div>
</div> </div>
<div class="content_box" v-if="gyflState"> <div class="content_box" v-if="gyfsList.length > 0 && !isSkeleton">
<div class="box-left"> <div class="box-left">
<div id="echarts1" style="height: 280px"></div> <div id="echarts1" style="height: 280px"></div>
</div> </div>
...@@ -36,12 +36,12 @@ ...@@ -36,12 +36,12 @@
</el-table> </el-table>
</div> </div>
</div> </div>
<div class="empty" v-if="!gyflState"> <div class="empty" v-if="gyfsList.length === 0 && !isSkeleton">
<img class="img" src="@/assets/images/project/empty.png"> <img class="img" src="@/assets/images/project/empty.png">
<div class="p1">抱歉,暂无数据展示</div> <div class="p1">抱歉,暂无数据展示</div>
</div> </div>
</div> </div>
<div v-if="!isSkeleton" class="td_content"> <div v-if="!tdytState" class="td_content">
<div class="flex-box query-box"> <div class="flex-box query-box">
<div class="flex-box query-params"> <div class="flex-box query-params">
<span class="common-title">全国土地交易项目土地用途</span> <span class="common-title">全国土地交易项目土地用途</span>
...@@ -50,7 +50,7 @@ ...@@ -50,7 +50,7 @@
</el-select> </el-select>
</div> </div>
</div> </div>
<div class="content_box" v-if="tdytState"> <div class="content_box" v-if="tdytList.length > 0 && !tdytState">
<div class="box-left"> <div class="box-left">
<div id="echarts2" style="height: 280px"></div> <div id="echarts2" style="height: 280px"></div>
</div> </div>
...@@ -75,12 +75,12 @@ ...@@ -75,12 +75,12 @@
</el-table> </el-table>
</div> </div>
</div> </div>
<div class="empty" v-if="!tdytState"> <div class="empty" v-if="tdytList.length === 0 && !tdytState">
<img class="img" src="@/assets/images/project/empty.png"> <img class="img" src="@/assets/images/project/empty.png">
<div class="p1">抱歉,暂无数据展示</div> <div class="p1">抱歉,暂无数据展示</div>
</div> </div>
</div> </div>
<div v-if="!isSkeleton" class="td_content"> <div v-if="!topState" class="td_content">
<div class="flex-box query-box"> <div class="flex-box query-box">
<div class="flex-box query-params"> <div class="flex-box query-params">
<span class="common-title">全国土地交易项目地区Top10</span> <span class="common-title">全国土地交易项目地区Top10</span>
...@@ -92,7 +92,7 @@ ...@@ -92,7 +92,7 @@
</el-select> </el-select>
</div> </div>
</div> </div>
<div class="content_box" v-if="topList.length > 0 && !isSkeleton"> <div class="content_box" v-if="topList.length > 0 && !topState">
<div class="box-left" style="width: 60%;"> <div class="box-left" style="width: 60%;">
<div id="echarts3" style="height: 300px"></div> <div id="echarts3" style="height: 300px"></div>
</div> </div>
...@@ -117,18 +117,18 @@ ...@@ -117,18 +117,18 @@
</el-table> </el-table>
</div> </div>
</div> </div>
<div class="empty" v-if="topList.length === 0 && !isSkeleton"> <div class="empty" v-if="topList.length === 0 && !topState">
<img class="img" src="@/assets/images/project/empty.png"> <img class="img" src="@/assets/images/project/empty.png">
<div class="p1">抱歉,暂无数据展示</div> <div class="p1">抱歉,暂无数据展示</div>
</div> </div>
</div> </div>
<div v-if="!isSkeleton" class="td_content"> <div v-if="!nftjState" class="td_content">
<div class="flex-box query-box"> <div class="flex-box query-box">
<div class="flex-box query-params"> <div class="flex-box query-params">
<span class="common-title">全国土地交易项目年份统计</span> <span class="common-title">全国土地交易项目年份统计</span>
</div> </div>
</div> </div>
<div class="content_box"> <div class="content_box" v-if="nftjList.length > 0 && !nftjState">
<div class="box-left" style="width: 60%;"> <div class="box-left" style="width: 60%;">
<div id="echarts4" style="height: 300px"></div> <div id="echarts4" style="height: 300px"></div>
</div> </div>
...@@ -187,6 +187,7 @@ export default { ...@@ -187,6 +187,7 @@ export default {
gyflState:true, gyflState:true,
tdytState:true, tdytState:true,
topState:true, topState:true,
nftjState:true,
// typeName:['住宅用地','工业用地','城镇住宅用地','其他商服用地','公共设施用地','公路用地','城镇村道路用地','公园与绿地', // typeName:['住宅用地','工业用地','城镇住宅用地','其他商服用地','公共设施用地','公路用地','城镇村道路用地','公园与绿地',
// '工矿仓储用地','零售商业用地','科研用地','街巷用地','机关团体用地','商服用地','商务金融用地'] // '工矿仓储用地','零售商业用地','科研用地','街巷用地','机关团体用地','商服用地','商务金融用地']
} }
...@@ -194,15 +195,16 @@ export default { ...@@ -194,15 +195,16 @@ export default {
created() { created() {
this.dataRegion() this.dataRegion()
this.yearsData() this.yearsData()
setTimeout(() => {
},
mounted() {
this.$nextTick(()=>{
this.getCountLandMarketByType() this.getCountLandMarketByType()
this.getCountLandMarketByTypeTd() this.getCountLandMarketByTypeTd()
this.getCountLandMarketByProvince() this.getCountLandMarketByProvince()
this.getCountLandMarketByYear() this.getCountLandMarketByYear()
this.isSkeleton=false; })
}, 1500);
},
mounted() {
}, },
beforeDestroy(){ beforeDestroy(){
...@@ -211,7 +213,8 @@ export default { ...@@ -211,7 +213,8 @@ export default {
getCountLandMarketByType(){ getCountLandMarketByType(){
// this.isSkeleton = true // this.isSkeleton = true
countLandMarketByType({type:'供应方式',yearStr:this.years.join(",")}).then(res => { countLandMarketByType({type:'供应方式',yearStr:this.years.join(",")}).then(res => {
// this.isSkeleton = false this.isSkeleton = false
this.gyflState = false
this.gyfsList=res.data.provinceDate; this.gyfsList=res.data.provinceDate;
var list=[]; var list=[];
for(var i=0;i<res.data.provinceDate.length;i++){ for(var i=0;i<res.data.provinceDate.length;i++){
...@@ -222,12 +225,9 @@ export default { ...@@ -222,12 +225,9 @@ export default {
list.push(obj) list.push(obj)
} }
if(list.length > 0){ if(list.length > 0){
this.gyflState=true
this.$nextTick(() => { this.$nextTick(() => {
this.initChart1(list) this.initChart1(list)
}) })
}else {
this.gyflState=false;
} }
}) })
}, },
...@@ -235,9 +235,9 @@ export default { ...@@ -235,9 +235,9 @@ export default {
// this.isSkeleton = true // this.isSkeleton = true
countLandMarketByType({type:'土地用途',yearStr:this.years1.join(",")}).then(res => { countLandMarketByType({type:'土地用途',yearStr:this.years1.join(",")}).then(res => {
// this.isSkeleton = false // this.isSkeleton = false
this.tdytState=false;
this.tdytList=res.data.provinceDate; this.tdytList=res.data.provinceDate;
if(res.data.provinceDate.length > 0){ if(res.data.provinceDate.length > 0){
this.tdytState=true
var list=[]; var list=[];
for(var i=0;i<10;i++){ for(var i=0;i<10;i++){
var obj={}; var obj={};
...@@ -251,10 +251,7 @@ export default { ...@@ -251,10 +251,7 @@ export default {
this.initChart2(list) this.initChart2(list)
}) })
} }
}else {
this.tdytState=false;
} }
}) })
}, },
getCountLandMarketByProvince(){ getCountLandMarketByProvince(){
...@@ -264,9 +261,8 @@ export default { ...@@ -264,9 +261,8 @@ export default {
if(this.address.length > 0){ if(this.address.length > 0){
params.provinceId=this.address.join(",") params.provinceId=this.address.join(",")
} }
// this.isSkeleton = true
countLandMarketByProvince(params).then(res => { countLandMarketByProvince(params).then(res => {
// this.isSkeleton = false this.topState = false
this.topList=res.data.provinceDate; this.topList=res.data.provinceDate;
var list=[]; var list=[];
if(res.data.provinceDate){ if(res.data.provinceDate){
...@@ -288,10 +284,10 @@ export default { ...@@ -288,10 +284,10 @@ export default {
}, },
getCountLandMarketByYear(){ getCountLandMarketByYear(){
countLandMarketByYear().then(res => { countLandMarketByYear().then(res => {
this.nftjState=false;
this.nftjList=res.data.yearDate; this.nftjList=res.data.yearDate;
var list=[]; var list=[];
if(res.data.yearDate){ if(res.data.yearDate){
this.topState=true
for(var i=0;i<res.data.yearDate.length;i++){ for(var i=0;i<res.data.yearDate.length;i++){
var obj={}; var obj={};
obj.type=res.data.yearDate[i].type; obj.type=res.data.yearDate[i].type;
...@@ -300,11 +296,11 @@ export default { ...@@ -300,11 +296,11 @@ export default {
obj.typeList=res.data.yearDate[i].typeList obj.typeList=res.data.yearDate[i].typeList
list.push(obj) list.push(obj)
} }
if(list.length > 0){
this.$nextTick(() => { this.$nextTick(() => {
this.initChart4(list) this.initChart4(list)
}) })
}else { }
this.topState=false;
} }
}) })
}, },
......
...@@ -11,7 +11,7 @@ ...@@ -11,7 +11,7 @@
</el-select> </el-select>
</div> </div>
</div> </div>
<div class="content_box" v-if="gyflState"> <div class="content_box" v-if="xmtjList.length > 0 && !isSkeleton">
<div class="box-left"> <div class="box-left">
<div id="echarts1" style="height: 280px"></div> <div id="echarts1" style="height: 280px"></div>
</div> </div>
...@@ -38,12 +38,12 @@ ...@@ -38,12 +38,12 @@
</el-table> </el-table>
</div> </div>
</div> </div>
<div class="empty" v-if="!gyflState"> <div class="empty" v-if="xmtjList.length === 0 && !isSkeleton">
<img class="img" src="@/assets/images/project/empty.png"> <img class="img" src="@/assets/images/project/empty.png">
<div class="p1">抱歉,暂无数据展示</div> <div class="p1">抱歉,暂无数据展示</div>
</div> </div>
</div> </div>
<div v-if="!isSkeleton" class="td_content"> <div v-if="!zbtjState" class="td_content">
<div class="flex-box query-box"> <div class="flex-box query-box">
<div class="flex-box query-params"> <div class="flex-box query-params">
<span class="common-title">全国各地区中标统计TOP10</span> <span class="common-title">全国各地区中标统计TOP10</span>
...@@ -52,7 +52,7 @@ ...@@ -52,7 +52,7 @@
</el-select> </el-select>
</div> </div>
</div> </div>
<div class="content_box" v-if="tdytState"> <div class="content_box" v-if="topList.length > 0 && !zbtjState">
<div class="box-left"> <div class="box-left">
<div id="echarts2" style="height: 280px"></div> <div id="echarts2" style="height: 280px"></div>
</div> </div>
...@@ -79,12 +79,12 @@ ...@@ -79,12 +79,12 @@
</el-table> </el-table>
</div> </div>
</div> </div>
<div class="empty" v-if="!tdytState"> <div class="empty" v-if="topList.length === 0 && !zbtjState">
<img class="img" src="@/assets/images/project/empty.png"> <img class="img" src="@/assets/images/project/empty.png">
<div class="p1">抱歉,暂无数据展示</div> <div class="p1">抱歉,暂无数据展示</div>
</div> </div>
</div> </div>
<div v-if="!isSkeleton" class="td_content"> <div v-if="!jefxState" class="td_content">
<div class="flex-box query-box"> <div class="flex-box query-box">
<div class="flex-box query-params"> <div class="flex-box query-params">
<span class="common-title">全国中标金额分析</span> <span class="common-title">全国中标金额分析</span>
...@@ -93,7 +93,7 @@ ...@@ -93,7 +93,7 @@
</el-select> </el-select>
</div> </div>
</div> </div>
<div class="content_box" v-if="tdytState"> <div class="content_box" v-if="zbjeList.length > 0 && !jefxState">
<div class="box-left"> <div class="box-left">
<div id="echarts3" style="height: 280px"></div> <div id="echarts3" style="height: 280px"></div>
</div> </div>
...@@ -118,18 +118,18 @@ ...@@ -118,18 +118,18 @@
</el-table> </el-table>
</div> </div>
</div> </div>
<div class="empty" v-if="!tdytState"> <div class="empty" v-if="zbjeList.length === 0 && !jefxState">
<img class="img" src="@/assets/images/project/empty.png"> <img class="img" src="@/assets/images/project/empty.png">
<div class="p1">抱歉,暂无数据展示</div> <div class="p1">抱歉,暂无数据展示</div>
</div> </div>
</div> </div>
<div v-if="!isSkeleton" class="td_content"> <div v-if="!qsfxState" class="td_content">
<div class="flex-box query-box"> <div class="flex-box query-box">
<div class="flex-box query-params"> <div class="flex-box query-params">
<span class="common-title">全国中标趋势分析</span> <span class="common-title">全国中标趋势分析</span>
</div> </div>
</div> </div>
<div class="content_box"> <div class="content_box" v-if="zbqsList.length > 0 && !qsfxState">
<div class="box-left"> <div class="box-left">
<div id="echarts4" style="height: 300px"></div> <div id="echarts4" style="height: 300px"></div>
</div> </div>
...@@ -154,8 +154,12 @@ ...@@ -154,8 +154,12 @@
</el-table> </el-table>
</div> </div>
</div> </div>
<div class="empty" v-if="zbqsList.length === 0 && !qsfxState">
<img class="img" src="@/assets/images/project/empty.png">
<div class="p1">抱歉,暂无数据展示</div>
</div>
</div> </div>
<div v-if="!isSkeleton" class="td_content"> <div v-if="!xflState" class="td_content">
<div class="flex-box query-box"> <div class="flex-box query-box">
<div class="flex-box query-params"> <div class="flex-box query-params">
<span class="common-title">全国中标下浮率分析</span> <span class="common-title">全国中标下浮率分析</span>
...@@ -164,7 +168,7 @@ ...@@ -164,7 +168,7 @@
</el-select> </el-select>
</div> </div>
</div> </div>
<div class="content_box" v-if="tdytState"> <div class="content_box" v-if="xflList.length > 0 && !xflState">
<div class="box-left"> <div class="box-left">
<div id="echarts5" style="height: 280px"></div> <div id="echarts5" style="height: 280px"></div>
</div> </div>
...@@ -189,17 +193,17 @@ ...@@ -189,17 +193,17 @@
</el-table> </el-table>
</div> </div>
</div> </div>
<div class="empty" v-if="!tdytState"> <div class="empty" v-if="xflList.length === 0 && !xflState">
<img class="img" src="@/assets/images/project/empty.png"> <img class="img" src="@/assets/images/project/empty.png">
<div class="p1">抱歉,暂无数据展示</div> <div class="p1">抱歉,暂无数据展示</div>
</div> </div>
</div> </div>
<div v-if="!isSkeleton" class="td_content"> <div v-if="!xmlxState" class="td_content">
<div class="flex-box query-box"> <div class="flex-box query-box">
<div class="flex-box query-params"> <div class="flex-box query-params">
<span class="common-title">全国中标业绩项目类型下浮率</span> <span class="common-title">全国中标业绩项目类型下浮率</span>
<el-select @change="handleYears(6)" style="margin-right: 8px" v-model="address" collapse-tags filterable class="form-content-width" placeholder="地区筛选" :popper-append-to-body='false' size="small"> <el-select @change="handleYears(6)" style="margin-right: 8px" v-model="address" clearable collapse-tags filterable class="form-content-width" placeholder="地区筛选" :popper-append-to-body='false' size="small">
<el-option v-for="(item, index) in addressList" :key="index" :label="item.label" :value="item.id" /> <el-option v-for="(item, index) in addressList" :key="index" :label="item.label" :value="item.id" />
</el-select> </el-select>
<el-select v-model="years4" @change="handleYears(6)" collapse-tags filterable class="form-content-width" placeholder="请选择" :popper-append-to-body='false' size="small"> <el-select v-model="years4" @change="handleYears(6)" collapse-tags filterable class="form-content-width" placeholder="请选择" :popper-append-to-body='false' size="small">
...@@ -207,7 +211,7 @@ ...@@ -207,7 +211,7 @@
</el-select> </el-select>
</div> </div>
</div> </div>
<div class="content_box" v-if="topList.length > 0 && !isSkeleton"> <div class="content_box" v-if="xmxflList.length > 0 && !isSkeleton">
<div class="box-left"> <div class="box-left">
<div id="echarts6" style="height: 300px"></div> <div id="echarts6" style="height: 300px"></div>
</div> </div>
...@@ -233,7 +237,7 @@ ...@@ -233,7 +237,7 @@
</el-table> </el-table>
</div> </div>
</div> </div>
<div class="empty" v-if="topList.length === 0 && !isSkeleton"> <div class="empty" v-if="xmxflList.length === 0 && !xmlxState">
<img class="img" src="@/assets/images/project/empty.png"> <img class="img" src="@/assets/images/project/empty.png">
<div class="p1">抱歉,暂无数据展示</div> <div class="p1">抱歉,暂无数据展示</div>
</div> </div>
...@@ -269,24 +273,24 @@ ...@@ -269,24 +273,24 @@
xflList :[], xflList :[],
xmxflList :[], xmxflList :[],
isSkeleton:true, isSkeleton:true,
gyflState:true, zbtjState:true,
tdytState:true, jefxState:true,
topState:true, qsfxState:true,
xflState:true,
xmlxState:true,
} }
}, },
created() { created() {
this.dataRegion() this.dataRegion()
this.yearsData() this.yearsData()
this.getCountBidByType() this.getCountBidByType()
this.$nextTick(() => {
})
setTimeout(() => {
this.getCountBidGroupByProvince() this.getCountBidGroupByProvince()
this.getRangeBidMoney() this.getRangeBidMoney()
this.getRangeBidFiveYears() this.getRangeBidFiveYears()
this.getLowerRateByYear() this.getLowerRateByYear()
this.getLowerRangeTenderType() this.getLowerRangeTenderType()
setTimeout(() => {
}, 1000); }, 1000);
}, },
mounted() { mounted() {
...@@ -322,6 +326,7 @@ ...@@ -322,6 +326,7 @@
yearStr:this.years1.join(",") yearStr:this.years1.join(",")
} }
countBidGroupByProvince(params).then(res => { countBidGroupByProvince(params).then(res => {
this.zbtjState=false;
this.topList=res.data; this.topList=res.data;
if(res.data){ if(res.data){
this.$nextTick(() => { this.$nextTick(() => {
...@@ -335,6 +340,7 @@ ...@@ -335,6 +340,7 @@
yearStr:this.years2.join(",") yearStr:this.years2.join(",")
} }
rangeBidMoney(params).then(res => { rangeBidMoney(params).then(res => {
this.jefxState=false;
this.zbjeList=res.data; this.zbjeList=res.data;
var list=[]; var list=[];
for(var i=0;i<res.data.length;i++){ for(var i=0;i<res.data.length;i++){
...@@ -353,6 +359,7 @@ ...@@ -353,6 +359,7 @@
}, },
getRangeBidFiveYears(){ getRangeBidFiveYears(){
rangeBidFiveYears().then(res => { rangeBidFiveYears().then(res => {
this.qsfxState=false;
this.zbqsList=res.data; this.zbqsList=res.data;
if(res.data){ if(res.data){
this.$nextTick(() => { this.$nextTick(() => {
...@@ -366,6 +373,7 @@ ...@@ -366,6 +373,7 @@
yearStr:this.years3 yearStr:this.years3
} }
lowerRateByYear(params).then(res => { lowerRateByYear(params).then(res => {
this.xflState=false;
for (var i=0; i<res.data.length; i++){ for (var i=0; i<res.data.length; i++){
res.data[i].rate=res.data[i].rate.toFixed(2) res.data[i].rate=res.data[i].rate.toFixed(2)
} }
...@@ -385,7 +393,7 @@ ...@@ -385,7 +393,7 @@
params.provinceId=this.address params.provinceId=this.address
} }
lowerRangeTenderType(params).then(res => { lowerRangeTenderType(params).then(res => {
this.xmlxState=false;
for (var i=0; i<res.data.length; i++){ for (var i=0; i<res.data.length; i++){
for (let j=0; j<res.data[i].typeList.length; j++){ for (let j=0; j<res.data[i].typeList.length; j++){
if(res.data[i].typeList[j].tenderType === '施工'){ if(res.data[i].typeList[j].tenderType === '施工'){
...@@ -526,7 +534,6 @@ ...@@ -526,7 +534,6 @@
}, },
initChart2(data) { initChart2(data) {
this.$nextTick(() => { this.$nextTick(() => {
// console.log(typeList)
let myChart = echarts.init(document.getElementById("echarts2")) let myChart = echarts.init(document.getElementById("echarts2"))
let seriesData=[] let seriesData=[]
let color=['#FCD68A', '#67B3FD', '#FFB8AD', '#FFD7AD', '#A9F1E5', '#D0FAB7', '#ADC0FF', '#BEECFF', '#81D5BC', '#FFE48A']; let color=['#FCD68A', '#67B3FD', '#FFB8AD', '#FFD7AD', '#A9F1E5', '#D0FAB7', '#ADC0FF', '#BEECFF', '#81D5BC', '#FFE48A'];
......
...@@ -6,6 +6,7 @@ ...@@ -6,6 +6,7 @@
<el-tab-pane label="全国商机项目分析" name="second"></el-tab-pane> <el-tab-pane label="全国商机项目分析" name="second"></el-tab-pane>
<el-tab-pane label="全国中标市场分析" name="third"></el-tab-pane> <el-tab-pane label="全国中标市场分析" name="third"></el-tab-pane>
<el-tab-pane label="全国建筑企业分析" name="fourth"></el-tab-pane> <el-tab-pane label="全国建筑企业分析" name="fourth"></el-tab-pane>
<el-tab-pane label="BI统计分析" name="five"></el-tab-pane>
</el-tabs> </el-tabs>
</div> </div>
...@@ -13,6 +14,7 @@ ...@@ -13,6 +14,7 @@
<Sjxmfx v-if="activeName === 'second'"></Sjxmfx> <Sjxmfx v-if="activeName === 'second'"></Sjxmfx>
<Zhongbiao v-if="activeName === 'third'"></Zhongbiao> <Zhongbiao v-if="activeName === 'third'"></Zhongbiao>
<Jzqyfx v-if="activeName === 'fourth'"></Jzqyfx> <Jzqyfx v-if="activeName === 'fourth'"></Jzqyfx>
<BI v-if="activeName === 'five'"></BI>
</div> </div>
</template> </template>
...@@ -21,10 +23,11 @@ ...@@ -21,10 +23,11 @@
import Sjxmfx from './component/sjxmfx' import Sjxmfx from './component/sjxmfx'
import Jzqyfx from './component/jzqyfx' import Jzqyfx from './component/jzqyfx'
import Zhongbiao from './component/zhongbiao' import Zhongbiao from './component/zhongbiao'
import BI from './component/BI'
export default { export default {
name: 'NationalEconomies', name: 'NationalEconomies',
components: { components: {
Economic,Sjxmfx,Jzqyfx,Zhongbiao Economic,Sjxmfx,Jzqyfx,Zhongbiao,BI
}, },
data() { data() {
return { return {
......
<template>
<div class="app-container">
区域资讯
</div>
</template>
<script>
export default {
name: 'Rmation',
data() {
return {
}
},
created() {
},
methods: {
}
}
</script>
<style lang="scss" scoped>
</style>
...@@ -35,9 +35,9 @@ module.exports = { ...@@ -35,9 +35,9 @@ module.exports = {
// detail: https://cli.vuejs.org/config/#devserver-proxy // detail: https://cli.vuejs.org/config/#devserver-proxy
[process.env.VUE_APP_BASE_API]: { [process.env.VUE_APP_BASE_API]: {
// target: `http://47.104.91.229:9099/prod-api`, // target: `http://47.104.91.229:9099/prod-api`,
target: `http://192.168.0.165:9098`,//施 // target: `http://192.168.0.165:9098`,//施
// target: `http://192.168.60.6:9098`,//谭 // target: `http://192.168.60.6:9098`,//谭
// target: `http://139.9.157.49:9099`,//测试 target: `http://139.9.157.49:9099/prod-api`,//测试
changeOrigin: true, changeOrigin: true,
pathRewrite: { pathRewrite: {
['^' + process.env.VUE_APP_BASE_API]: '' ['^' + process.env.VUE_APP_BASE_API]: ''
......
...@@ -2,25 +2,14 @@ package com.dsk.system.domain.vo; ...@@ -2,25 +2,14 @@ package com.dsk.system.domain.vo;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.alibaba.excel.annotation.ExcelProperty; import com.alibaba.excel.annotation.ExcelProperty;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableLogic;
import com.baomidou.mybatisplus.annotation.TableName;
import com.dsk.common.annotation.ExcelDictFormat; import com.dsk.common.annotation.ExcelDictFormat;
import com.dsk.common.convert.ExcelDictConvert; import com.dsk.common.convert.ExcelDictConvert;
import com.dsk.common.tenant.core.TenantEntity;
import com.dsk.system.domain.SysDept; import com.dsk.system.domain.SysDept;
import com.dsk.system.domain.SysTenantPackage;
import com.sun.org.apache.xpath.internal.operations.Bool;
import io.github.linpeilie.annotations.AutoMapper; import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode;
import javax.validation.constraints.Email;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import java.io.Serializable; import java.io.Serializable;
import java.util.Date;
/** /**
* 部门表 sys_dept * 部门表 sys_dept
...@@ -105,4 +94,10 @@ public class SysDeptVo implements Serializable { ...@@ -105,4 +94,10 @@ public class SysDeptVo implements Serializable {
@ExcelProperty(value = "该部门是否存在用户", converter = ExcelDictConvert.class) @ExcelProperty(value = "该部门是否存在用户", converter = ExcelDictConvert.class)
@ExcelDictFormat(readConverterExp = "true=存在,false=删除") @ExcelDictFormat(readConverterExp = "true=存在,false=删除")
private Boolean existUsers; private Boolean existUsers;
/**
* 创建时间
*/
@ExcelProperty(value = "创建时间")
private Date createTime;
} }
...@@ -9,7 +9,6 @@ import io.github.linpeilie.annotations.AutoMapper; ...@@ -9,7 +9,6 @@ import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data; import lombok.Data;
import java.io.Serializable; import java.io.Serializable;
import java.util.Date;
/** /**
* @author sxk * @author sxk
...@@ -35,4 +34,10 @@ public class SysTenantPackageSelectVo implements Serializable { ...@@ -35,4 +34,10 @@ public class SysTenantPackageSelectVo implements Serializable {
@ExcelProperty(value = "套餐名称") @ExcelProperty(value = "套餐名称")
private String packageName; private String packageName;
/**
* 状态(0正常 1停用)
*/
@ExcelProperty(value = "状态", converter = ExcelDictConvert.class)
@ExcelDictFormat(readConverterExp = "0=正常,1=停用")
private String status;
} }
package com.dsk.system.domain.vo; package com.dsk.system.domain.vo;
import com.alibaba.excel.annotation.ExcelProperty; import com.alibaba.excel.annotation.ExcelProperty;
import com.dsk.common.annotation.ExcelDictFormat;
import com.dsk.common.convert.ExcelDictConvert;
import lombok.Data; import lombok.Data;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
...@@ -18,38 +16,21 @@ import java.io.Serializable; ...@@ -18,38 +16,21 @@ import java.io.Serializable;
@NoArgsConstructor @NoArgsConstructor
// @Accessors(chain = true) // 导入不允许使用 会找不到set方法 // @Accessors(chain = true) // 导入不允许使用 会找不到set方法
public class SysUserImportVo implements Serializable { public class SysUserImportVo implements Serializable {
private static final long serialVersionUID = 1L;
/** //如需修改以下字段,需同步修改
* 用户ID private static final long serialVersionUID = 1L;
*/
@ExcelProperty(value = "用户序号")
private Long userId;
/**
* 部门ID
*/
@ExcelProperty(value = "部门编号")
private Long deptId;
/** /**
* 用户账号 * 所属部门
*/ */
@ExcelProperty(value = "登录名称") private String deptName;
private String userName;
/** /**
* 用户昵称 * 用户昵称
*/ */
@ExcelProperty(value = "用户称") @ExcelProperty(value = "用户称")
private String nickName; private String nickName;
/**
* 用户邮箱
*/
@ExcelProperty(value = "用户邮箱")
private String email;
/** /**
* 手机号码 * 手机号码
*/ */
...@@ -57,17 +38,21 @@ public class SysUserImportVo implements Serializable { ...@@ -57,17 +38,21 @@ public class SysUserImportVo implements Serializable {
private String phonenumber; private String phonenumber;
/** /**
* 用户性别 * 用户角色
*/ */
@ExcelProperty(value = "用户性别", converter = ExcelDictConvert.class) @ExcelProperty(value = "用户角色")
@ExcelDictFormat(dictType = "sys_user_sex") private String roleName;
private String sex;
/** /**
* 帐号状态(0正常 1停用) * 失败原因
* 该字段无需同步到模板中
*/ */
@ExcelProperty(value = "帐号状态", converter = ExcelDictConvert.class) private String failReason;
@ExcelDictFormat(dictType = "sys_normal_disable")
private String status;
public SysUserImportVo(String deptName, String nickName, String phonenumber, String roleName) {
this.deptName = deptName.replace(" ", "");
this.nickName = nickName.replace(" ", "");
this.phonenumber = phonenumber;
this.roleName = roleName.replace(" ", "");
}
} }
...@@ -5,18 +5,23 @@ import cn.hutool.core.bean.BeanUtil; ...@@ -5,18 +5,23 @@ import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ObjectUtil;
import com.alibaba.excel.context.AnalysisContext; import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener; import com.alibaba.excel.event.AnalysisEventListener;
import com.dsk.system.domain.vo.SysUserImportVo;
import com.dsk.system.domain.SysUser;
import com.dsk.common.excel.ExcelListener; import com.dsk.common.excel.ExcelListener;
import com.dsk.common.excel.ExcelResult; import com.dsk.common.excel.ExcelResult;
import com.dsk.common.exception.ServiceException; import com.dsk.common.exception.ServiceException;
import com.dsk.common.helper.LoginHelper; import com.dsk.common.helper.LoginHelper;
import com.dsk.common.utils.ValidatorUtils; import com.dsk.common.utils.ValidatorUtils;
import com.dsk.common.utils.spring.SpringUtils; import com.dsk.common.utils.spring.SpringUtils;
import com.dsk.system.domain.SysDept;
import com.dsk.system.domain.SysRole;
import com.dsk.system.domain.SysUser;
import com.dsk.system.domain.vo.SysUserImportVo;
import com.dsk.system.service.ISysConfigService; import com.dsk.system.service.ISysConfigService;
import com.dsk.system.service.ISysDeptService;
import com.dsk.system.service.ISysRoleService;
import com.dsk.system.service.ISysUserService; import com.dsk.system.service.ISysUserService;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import java.util.ArrayList;
import java.util.List; import java.util.List;
/** /**
...@@ -28,13 +33,15 @@ import java.util.List; ...@@ -28,13 +33,15 @@ import java.util.List;
public class SysUserImportListener extends AnalysisEventListener<SysUserImportVo> implements ExcelListener<SysUserImportVo> { public class SysUserImportListener extends AnalysisEventListener<SysUserImportVo> implements ExcelListener<SysUserImportVo> {
private final ISysUserService userService; private final ISysUserService userService;
private final ISysDeptService deptService;
private final ISysRoleService roleService;
private final String password; private final String password;
private final Boolean isUpdateSupport; private final Boolean isUpdateSupport;
private final String operName; private final String operName;
private ArrayList<SysUserImportVo> resultList = new ArrayList<>();
private int successNum = 0; private int successNum = 0;
private int failureNum = 0; private int failureNum = 0;
private final StringBuilder successMsg = new StringBuilder(); private final StringBuilder successMsg = new StringBuilder();
...@@ -43,6 +50,8 @@ public class SysUserImportListener extends AnalysisEventListener<SysUserImportVo ...@@ -43,6 +50,8 @@ public class SysUserImportListener extends AnalysisEventListener<SysUserImportVo
public SysUserImportListener(Boolean isUpdateSupport) { public SysUserImportListener(Boolean isUpdateSupport) {
String initPassword = SpringUtils.getBean(ISysConfigService.class).selectConfigByKey("sys.user.initPassword"); String initPassword = SpringUtils.getBean(ISysConfigService.class).selectConfigByKey("sys.user.initPassword");
this.userService = SpringUtils.getBean(ISysUserService.class); this.userService = SpringUtils.getBean(ISysUserService.class);
this.deptService = SpringUtils.getBean(ISysDeptService.class);
this.roleService = SpringUtils.getBean(ISysRoleService.class);
this.password = BCrypt.hashpw(initPassword); this.password = BCrypt.hashpw(initPassword);
this.isUpdateSupport = isUpdateSupport; this.isUpdateSupport = isUpdateSupport;
this.operName = LoginHelper.getUsername(); this.operName = LoginHelper.getUsername();
...@@ -50,13 +59,25 @@ public class SysUserImportListener extends AnalysisEventListener<SysUserImportVo ...@@ -50,13 +59,25 @@ public class SysUserImportListener extends AnalysisEventListener<SysUserImportVo
@Override @Override
public void invoke(SysUserImportVo userVo, AnalysisContext context) { public void invoke(SysUserImportVo userVo, AnalysisContext context) {
SysUser user = this.userService.selectUserByUserName(userVo.getUserName()); SysUser user = this.userService.selectUserByPhonenumber(userVo.getPhonenumber());
SysDept dept = this.deptService.selectDeptByDeptName(userVo.getDeptName());
SysRole role = this.roleService.selectRoleByRoleName(userVo.getRoleName());
try { try {
if (ObjectUtil.isNull(dept)) {
throw new ServiceException("部门不存在");
}
if (ObjectUtil.isNull(role)) {
throw new ServiceException("角色不存在");
}
// 验证是否存在这个用户 // 验证是否存在这个用户
if (ObjectUtil.isNull(user)) { if (ObjectUtil.isNull(user)) {
user = BeanUtil.toBean(userVo, SysUser.class); user = BeanUtil.toBean(userVo, SysUser.class);
user.setUserName(userVo.getPhonenumber());
user.setDeptId(dept.getDeptId());
user.setDept(dept);
user.setRoleId(role.getRoleId());
user.setRoleIds(new Long[]{role.getRoleId()});
ValidatorUtils.validate(user); ValidatorUtils.validate(user);
user.setPassword(password);
user.setCreateBy(operName); user.setCreateBy(operName);
userService.insertUser(user); userService.insertUser(user);
successNum++; successNum++;
...@@ -65,6 +86,11 @@ public class SysUserImportListener extends AnalysisEventListener<SysUserImportVo ...@@ -65,6 +86,11 @@ public class SysUserImportListener extends AnalysisEventListener<SysUserImportVo
Long userId = user.getUserId(); Long userId = user.getUserId();
user = BeanUtil.toBean(userVo, SysUser.class); user = BeanUtil.toBean(userVo, SysUser.class);
user.setUserId(userId); user.setUserId(userId);
user.setUserName(userVo.getPhonenumber());
user.setDeptId(dept.getDeptId());
user.setDept(dept);
user.setRoleId(role.getRoleId());
user.setRoleIds(new Long[]{role.getRoleId()});
ValidatorUtils.validate(user); ValidatorUtils.validate(user);
userService.checkUserAllowed(user); userService.checkUserAllowed(user);
userService.checkUserDataScope(user.getUserId()); userService.checkUserDataScope(user.getUserId());
...@@ -75,11 +101,15 @@ public class SysUserImportListener extends AnalysisEventListener<SysUserImportVo ...@@ -75,11 +101,15 @@ public class SysUserImportListener extends AnalysisEventListener<SysUserImportVo
} else { } else {
failureNum++; failureNum++;
failureMsg.append("<br/>").append(failureNum).append("、账号 ").append(user.getUserName()).append(" 已存在"); failureMsg.append("<br/>").append(failureNum).append("、账号 ").append(user.getUserName()).append(" 已存在");
userVo.setFailReason("手机号已存在");
resultList.add(userVo);
} }
} catch (Exception e) { } catch (Exception e) {
failureNum++; failureNum++;
String msg = "<br/>" + failureNum + "、账号 " + user.getUserName() + " 导入失败:"; String msg = "<br/>" + failureNum + "、账号 " + userVo.getPhonenumber() + " 导入失败:";
failureMsg.append(msg).append(e.getMessage()); failureMsg.append(msg).append(e.getMessage());
userVo.setFailReason(e.getMessage());
resultList.add(userVo);
log.error(msg, e); log.error(msg, e);
} }
} }
...@@ -106,7 +136,7 @@ public class SysUserImportListener extends AnalysisEventListener<SysUserImportVo ...@@ -106,7 +136,7 @@ public class SysUserImportListener extends AnalysisEventListener<SysUserImportVo
@Override @Override
public List<SysUserImportVo> getList() { public List<SysUserImportVo> getList() {
return null; return resultList;
} }
@Override @Override
......
...@@ -51,6 +51,14 @@ public interface ISysDeptService { ...@@ -51,6 +51,14 @@ public interface ISysDeptService {
*/ */
SysDept selectDeptById(Long deptId); SysDept selectDeptById(Long deptId);
/**
* 根据部门名称查询部门
*
* @param deptName 部门名称
* @return 部门
*/
SysDept selectDeptByDeptName(String deptName);
/** /**
* 根据ID查询所有子部门数(正常状态) * 根据ID查询所有子部门数(正常状态)
* *
...@@ -113,4 +121,5 @@ public interface ISysDeptService { ...@@ -113,4 +121,5 @@ public interface ISysDeptService {
* @return 结果 * @return 结果
*/ */
int deleteDeptById(Long deptId); int deleteDeptById(Long deptId);
} }
...@@ -42,6 +42,14 @@ public interface ISysRoleService { ...@@ -42,6 +42,14 @@ public interface ISysRoleService {
*/ */
Set<String> selectRolePermissionByUserId(Long userId); Set<String> selectRolePermissionByUserId(Long userId);
/**
* 根据角色名称查询角色
*
* @param roleName 角色名称
* @return 角色
*/
SysRole selectRoleByRoleName(String roleName);
/** /**
* 查询所有角色 * 查询所有角色
* *
...@@ -178,4 +186,5 @@ public interface ISysRoleService { ...@@ -178,4 +186,5 @@ public interface ISysRoleService {
int insertAuthUsers(Long roleId, Long[] userIds); int insertAuthUsers(Long roleId, Long[] userIds);
void cleanOnlineUserByRole(Long roleId); void cleanOnlineUserByRole(Long roleId);
} }
...@@ -187,19 +187,64 @@ public class SysLoginService { ...@@ -187,19 +187,64 @@ public class SysLoginService {
return StpUtil.getTokenValue(); return StpUtil.getTokenValue();
} }
public String smsLogin(String phonenumber, String smsCode) { public LoginVo smsLogin(String username, String smsCode) {
// 通过手机号查找用户 String tenantId=null;
SysUser user = loadUserByPhonenumber(phonenumber); // if(ReUtil.isMatch(RegexPool.MOBILE, username)) {
// String defaultTenantId = RedisUtils.getCacheObject(GlobalConstants.PHONE_DEFAULT_TENANT + username);
// log.info("登录用户:{} 获取缓存默认租户:"+tenantId, username);
// if(StrUtil.isNotBlank(defaultTenantId)){
// tenantId=defaultTenantId;
// }
// }
checkLogin(LoginType.SMS, user.getUserName(), () -> !validateSmsCode(phonenumber, smsCode)); //查询手机号绑定的所有用户
if (StrUtil.isEmpty(tenantId)) {
List<SysUser> sysUsers = queryListByPhone(username);
if (CollectionUtil.isEmpty(sysUsers)) {
log.info("登录用户:{} 不存在.", username);
throw new UserException("user.not.exists", username);
} else if (sysUsers.size() > 1) {
//处理存在多个用户的情况,取一个最新租户
SysUser sysUser = sysUsers.get(0);
if (ObjectUtil.isEmpty(sysUser)) {
log.info("登录用户:{} 不存在.", username);
throw new UserException("user.not.exists", username);
}
tenantId = sysUser.getTenantId();
}else {
SysUser sysUser = sysUsers.get(0);
tenantId = sysUser.getTenantId();
}
}
// 校验租户
if (tenantId != null) {
checkTenant(tenantId);
}
if (tenantId == null || "".equals(tenantId)) {
tenantId = TenantConstants.DEFAULT_TENANT_ID;
}
TenantHelper.setTenantId(tenantId);
// 框架登录不限制从什么表查询 只要最终构建出 LoginUser 即可
// SysUser user = loadUserByUsername(username);
// return TenantBroker.applyAs(tenantId, (id -> {
// 框架登录不限制从什么表查询 只要最终构建出 LoginUser 即可
SysUser user = loadUserByUsername(username);
checkLogin(LoginType.PASSWORD, username, () -> !validateSmsCode(username, smsCode));
// 此处可根据登录用户的数据不同 自行创建 loginUser 属性不够用继承扩展就行了 // 此处可根据登录用户的数据不同 自行创建 loginUser 属性不够用继承扩展就行了
LoginUser loginUser = buildLoginUser(user); LoginUser loginUser = buildLoginUser(user);
// 生成token // 生成token
LoginHelper.loginByDevice(loginUser, DeviceType.APP); LoginHelper.loginByDevice(loginUser, DeviceType.PC);
recordLogininfor(user.getUserName(), Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success")); recordLogininfor(username, Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success"));
recordLoginInfo(user.getUserId(), user.getUserName()); recordLoginInfo(user.getUserId(), username);
return StpUtil.getTokenValue();
LoginVo loginVo = new LoginVo();
loginVo.setTenantId(TenantHelper.getTenantId());
loginVo.setAccessToken(StpUtil.getTokenValue());
loginVo.setExpireIn(StpUtil.getTokenTimeout());
return loginVo;
} }
public String emailLogin(String email, String emailCode) { public String emailLogin(String email, String emailCode) {
......
...@@ -5,7 +5,6 @@ import cn.hutool.core.collection.CollUtil; ...@@ -5,7 +5,6 @@ import cn.hutool.core.collection.CollUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.dsk.common.constant.TenantConstants;
import com.dsk.common.core.domain.PageQuery; import com.dsk.common.core.domain.PageQuery;
import com.dsk.common.core.page.TableDataInfo; import com.dsk.common.core.page.TableDataInfo;
import com.dsk.common.exception.ServiceException; import com.dsk.common.exception.ServiceException;
...@@ -57,8 +56,7 @@ public class ISysTenantPackageServiceImpl implements ISysTenantPackageService { ...@@ -57,8 +56,7 @@ public class ISysTenantPackageServiceImpl implements ISysTenantPackageService {
*/ */
@Override @Override
public List<SysTenantPackageSelectVo> selectList() { public List<SysTenantPackageSelectVo> selectList() {
List<SysTenantPackageVo> tenantPackageVo = baseMapper.selectVoList(new LambdaQueryWrapper<SysTenantPackage>() List<SysTenantPackageVo> tenantPackageVo = baseMapper.selectVoList(null);
.eq(SysTenantPackage::getStatus, TenantConstants.NORMAL));
return BeanUtil.copyToList(tenantPackageVo, SysTenantPackageSelectVo.class); return BeanUtil.copyToList(tenantPackageVo, SysTenantPackageSelectVo.class);
} }
......
...@@ -126,6 +126,19 @@ public class SysDeptServiceImpl implements ISysDeptService, DeptService { ...@@ -126,6 +126,19 @@ public class SysDeptServiceImpl implements ISysDeptService, DeptService {
return dept; return dept;
} }
/**
* 根据部门名称查询部门
*
* @param deptName 部门名称
* @return 部门
*/
@Override
public SysDept selectDeptByDeptName(String deptName) {
LambdaQueryWrapper<SysDept> wrapper = new LambdaQueryWrapper<SysDept>()
.eq(SysDept::getDeptName, deptName);
return baseMapper.selectOne(wrapper);
}
/** /**
* 通过部门ID查询部门名称 * 通过部门ID查询部门名称
* *
......
...@@ -117,6 +117,19 @@ public class SysRoleServiceImpl implements ISysRoleService { ...@@ -117,6 +117,19 @@ public class SysRoleServiceImpl implements ISysRoleService {
return permsSet; return permsSet;
} }
/**
* 根据角色名称查询角色
*
* @param roleName 角色名称
* @return 角色
*/
@Override
public SysRole selectRoleByRoleName(String roleName) {
LambdaQueryWrapper<SysRole> wrapper = new LambdaQueryWrapper<SysRole>()
.eq(SysRole::getRoleName, roleName);
return baseMapper.selectOne(wrapper);
}
/** /**
* 查询所有角色 * 查询所有角色
* *
......
...@@ -10,26 +10,21 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; ...@@ -10,26 +10,21 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.dsk.common.utils.DingTalkUtil;
import com.dsk.common.utils.PasswordUtils;
import com.dsk.system.mapper.*;
import com.dsk.system.service.ISysUserService;
import com.dsk.common.constant.CacheNames; import com.dsk.common.constant.CacheNames;
import com.dsk.common.constant.UserConstants; import com.dsk.common.constant.UserConstants;
import com.dsk.common.core.domain.PageQuery; import com.dsk.common.core.domain.PageQuery;
import com.dsk.system.domain.SysDept;
import com.dsk.system.domain.SysRole;
import com.dsk.system.domain.SysUser;
import com.dsk.common.core.page.TableDataInfo; import com.dsk.common.core.page.TableDataInfo;
import com.dsk.common.core.service.UserService; import com.dsk.common.core.service.UserService;
import com.dsk.common.exception.ServiceException; import com.dsk.common.exception.ServiceException;
import com.dsk.common.helper.DataBaseHelper; import com.dsk.common.helper.DataBaseHelper;
import com.dsk.common.helper.LoginHelper; import com.dsk.common.helper.LoginHelper;
import com.dsk.common.utils.DingTalkUtil;
import com.dsk.common.utils.PasswordUtils;
import com.dsk.common.utils.StreamUtils; import com.dsk.common.utils.StreamUtils;
import com.dsk.common.utils.StringUtils; import com.dsk.common.utils.StringUtils;
import com.dsk.system.domain.SysPost; import com.dsk.system.domain.*;
import com.dsk.system.domain.SysUserPost; import com.dsk.system.mapper.*;
import com.dsk.system.domain.SysUserRole; import com.dsk.system.service.ISysUserService;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.cache.annotation.Cacheable; import org.springframework.cache.annotation.Cacheable;
...@@ -277,16 +272,14 @@ public class SysUserServiceImpl implements ISysUserService, UserService { ...@@ -277,16 +272,14 @@ public class SysUserServiceImpl implements ISysUserService, UserService {
user.setPassword(BCrypt.hashpw(password)); user.setPassword(BCrypt.hashpw(password));
// 新增用户信息 // 新增用户信息
int rows = baseMapper.insert(user); int rows = baseMapper.insert(user);
if (rows>0) { if (rows > 0) {
//租户新增成功,发送短信通知租户 //租户新增成功,发送短信通知租户
//此处暂用钉钉机器人模拟发送短信 //此处暂用钉钉机器人模拟发送短信
String content = "【央企数字经营管理系统通知】:" String content = user.getNickName()
+ user.getNickName() + "您好,您已经成功开通数字化经营管理系统,请使用手机号码登录,初始密码为"
+ "您好,您已经成功注册央企数字经营管理系统,请使用手机号码登录,初始密码为"
+ password + password
+ "。友情提示:为了您的账号安全,请立即前往【个人中心】修改密码。"; + "。友情提示:为了您的账号安全,请勿泄露密码。";
DingTalkUtil.sendDingTalkMsg(content); DingTalkUtil.sendDingTalkMsg(content);
System.out.println("👉🏻:" + content);
} }
// 新增用户岗位关联 // 新增用户岗位关联
insertUserPost(user); insertUserPost(user);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment