This commit is contained in:
2025-04-20 08:02:06 +08:00
parent 53fa8a059c
commit 2c79d3c37e
32 changed files with 753 additions and 72 deletions

View File

@@ -57,4 +57,4 @@ export function getCodeImg() {
method: 'get',
timeout: 20000
})
}
}

View File

@@ -44,6 +44,7 @@ export function delUser(userId) {
})
}
// 用户密码重置
export function resetUserPwd(userId, password) {
const data = {
@@ -57,6 +58,17 @@ export function resetUserPwd(userId, password) {
})
}
export function checkWeakPwd(password) {
const data = {
password
}
return request({
url: '/checkWeakPwd',
method: 'post',
data: data
})
}
// 用户状态修改
export function changeUserStatus(userId, status) {
const data = {

View File

@@ -43,7 +43,7 @@ const user = {
login(username, password, code, uuid).then(res => {
setToken(res.token)
commit('SET_TOKEN', res.token)
resolve()
resolve(res)
}).catch(error => {
reject(error)
})

View File

@@ -55,6 +55,15 @@
>{{ this.form.xzxfqk === '1' ? "改派" : "指派" }}
</el-button>
</el-col>
<!-- <el-col :span="1.5">-->
<!-- <el-button-->
<!-- type="danger"-->
<!-- plain-->
<!-- size="mini"-->
<!-- @click="handleExportGeoJson"-->
<!-- >导出矢量-->
<!-- </el-button>-->
<!-- </el-col>-->
<el-col :span="1.5">
<el-button
type="danger"
@@ -826,7 +835,13 @@ export default {
} else {
return "primary"
}
}
},
handleExportGeoJson() {
const id = this.$route.query.id;
this.download(`/cxxm/zftk/task/exportGeoJson/${id}`, {
...this.queryParams
},`执法踏勘_${this.form.xmmc}_${this.form.dkh}.json`)
},
},
};
</script>

View File

@@ -112,6 +112,18 @@
>导出全部
</el-button>
</el-col>
<!-- <el-col :span="1.5">-->
<!-- <el-button-->
<!-- type="warning"-->
<!-- plain-->
<!-- icon="el-icon-download"-->
<!-- size="mini"-->
<!-- :disabled="multiple"-->
<!-- v-if="showXmmcCheck"-->
<!-- @click="handleExportGeoJsonByXmmcs"-->
<!-- >导出矢量-->
<!-- </el-button>-->
<!-- </el-col>-->
<right-toolbar :showSearch.sync="showSearch" @queryTable="getTaskXmmcList" :columns="columns"></right-toolbar>
</el-row>
@@ -443,6 +455,16 @@ export default {
...this.queryParams
}, `执法踏勘_${new Date().getFullYear()}-${new Date().getMonth() + 1}-${new Date().getDate()}.xlsx`)
},
handleExportGeoJsonByXmmcs(row) {
const xmmcs = row.xmmc || this.xmmcs;
if (!xmmcs || xmmcs.indexOf('') !== -1) {
this.$modal.msgError("存在项目类型为空的选项,无法按项目名类型导出");
return;
}
this.download(`/cxxm/zftk/task/exportGeoJsonByXmmcs/${xmmcs}`, {
...this.queryParams
}, `执法踏勘_${new Date().getFullYear()}-${new Date().getMonth() + 1}-${new Date().getDate()}.json`)
},
handleExportAll() {
this.download(`/cxxm/zftk/task/exportAll`, {
...this.queryParams

View File

@@ -55,6 +55,15 @@
>{{ this.form.xzxfqk === '1' ? "改派" : "指派" }}
</el-button>
</el-col>
<!-- <el-col :span="1.5">-->
<!-- <el-button-->
<!-- type="danger"-->
<!-- plain-->
<!-- size="mini"-->
<!-- @click="handleExportGeoJson"-->
<!-- >导出矢量-->
<!-- </el-button>-->
<!-- </el-col>-->
<el-col :span="1.5">
<el-button
type="danger"
@@ -852,6 +861,12 @@ export default {
return "primary"
}
},
handleExportGeoJson() {
const id = this.$route.query.id;
this.download(`/cxxm/zt/task/exportGeoJson/${id}`, {
...this.queryParams
},`持续监管_${this.form.xmmc}_${this.form.tbbh}.json`)
},
}
}
;

View File

@@ -112,6 +112,18 @@
>导出全部
</el-button>
</el-col>
<!-- <el-col :span="1.5">-->
<!-- <el-button-->
<!-- type="warning"-->
<!-- plain-->
<!-- icon="el-icon-download"-->
<!-- size="mini"-->
<!-- :disabled="multiple"-->
<!-- v-if="showXmmcCheck"-->
<!-- @click="handleExportGeoJsonByXmmcs"-->
<!-- >导出矢量-->
<!-- </el-button>-->
<!-- </el-col>-->
<right-toolbar :showSearch.sync="showSearch" @queryTable="getTaskXmmcList" :columns="columns"></right-toolbar>
</el-row>
@@ -444,6 +456,16 @@ export default {
...this.queryParams
}, `持续监管_${new Date().getFullYear()}-${new Date().getMonth() + 1}-${new Date().getDate()}.xlsx`)
},
handleExportGeoJsonByXmmcs(row) {
const xmmcs = row.xmmc || this.xmmcs;
if (!xmmcs || xmmcs.indexOf('') !== -1) {
this.$modal.msgError("存在项目类型为空的选项,无法按项目名类型导出");
return;
}
this.download(`/cxxm/zt/task/exportGeoJsonByXmmcs/${xmmcs}`, {
...this.queryParams
}, `持续监管_${new Date().getFullYear()}-${new Date().getMonth() + 1}-${new Date().getDate()}.json`)
},
handleExportAll() {
this.download(`/cxxm/zt/task/exportAll`, {
...this.queryParams

View File

@@ -54,6 +54,15 @@
>{{ this.form.xzxfqk === '1' ? "改派" : "指派" }}
</el-button>
</el-col>
<!-- <el-col :span="1.5">-->
<!-- <el-button-->
<!-- type="danger"-->
<!-- plain-->
<!-- size="mini"-->
<!-- @click="handleExportGeoJson"-->
<!-- >导出矢量-->
<!-- </el-button>-->
<!-- </el-col>-->
<el-col :span="1.5">
<el-button
type="danger"
@@ -813,7 +822,13 @@ export default {
} else {
return "primary"
}
}
},
handleExportGeoJson() {
const id = this.$route.query.id;
this.download(`/cxxm/zttb/task/exportGeoJson/${id}`, {
...this.queryParams
},`自提图斑_${this.form.xmmc}_${this.form.tbbh}.json`)
},
},
};
</script>

View File

@@ -112,6 +112,18 @@
>导出全部
</el-button>
</el-col>
<!-- <el-col :span="1.5">-->
<!-- <el-button-->
<!-- type="warning"-->
<!-- plain-->
<!-- icon="el-icon-download"-->
<!-- size="mini"-->
<!-- :disabled="multiple"-->
<!-- v-if="showXmmcCheck"-->
<!-- @click="handleExportGeoJsonByXmmcs"-->
<!-- >导出矢量-->
<!-- </el-button>-->
<!-- </el-col>-->
<right-toolbar :showSearch.sync="showSearch" @queryTable="getTaskXmmcList" :columns="columns"></right-toolbar>
</el-row>
@@ -451,6 +463,16 @@ export default {
...this.queryParams
}, `自提图斑_${new Date().getFullYear()}-${new Date().getMonth() + 1}-${new Date().getDate()}.xlsx`)
},
handleExportGeoJsonByXmmcs(row) {
const xmmcs = row.xmmc || this.xmmcs;
if (!xmmcs || xmmcs.indexOf('') !== -1) {
this.$modal.msgError("存在项目类型为空的选项,无法按项目名类型导出");
return;
}
this.download(`/cxxm/zttb/task/exportGeoJsonByXmmcs/${xmmcs}`, {
...this.queryParams
}, `自提图斑_${new Date().getFullYear()}-${new Date().getMonth() + 1}-${new Date().getDate()}.json`)
},
handleExportAll() {
this.download(`/cxxm/zttb/task/exportAll`, {
...this.queryParams

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

View File

@@ -16,7 +16,7 @@
</el-col>
<el-col :span="20" :xs="24">
<el-tabs v-model="activeName" @tab-click="handleClick">
<el-tab-pane label="部省监管" name="1" :lazy="true">
<el-tab-pane label="持续监管" name="1" :lazy="true">
<el-row :gutter="20">
<el-col :span="4" v-for="(value, key) in ztStatistics">
<div style="text-align: center;margin: 5px;padding: 10px;border: 1px solid #1c6ec4">
@@ -240,6 +240,24 @@
<!-- </el-card>-->
<!-- </el-col>-->
<!-- </el-row>-->
<el-dialog title="系统迁移提示!!!" :visible.sync="newVersion" width="1000px" append-to-body>
<div style="color: red"><h3>本系统已迁移到正式服务器请勿在当前测试环境进行操作!!!</h3></div>
<div style="color: red"><h3>请按照下面操作切换至正式版本!!!</h3></div>
<div><h3>1点击下面链接跳转到正式服务器</h3></div>
<div><a style="margin-top: 50px;text-decoration: underline;color: #13ce66;font-size: larger;"
href="http://1.95.66.168">http://1.95.66.168</a></div>
<div><h3>2下载正式版本app</h3></div>
<div>
<img src="./getLastVersionApK.png" width="300" height="300"/>
<a style="margin-top: 50px;text-decoration: underline;color: #13ce66;font-size: larger;"
href="http://1.95.66.168/prod-api/cxxm/api/version/getLastVersionApK">http://1.95.66.168/prod-api/cxxm/api/version/getLastVersionApK</a>
</div>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="newVersion = false">我已知晓</el-button>
</div>
</el-dialog>
</div>
</template>
@@ -251,6 +269,7 @@ export default {
name: "Index",
data() {
return {
newVersion: false,
zftkStatistics: {
"图斑总数": 0,
"已巡查图斑": 0,

View File

@@ -140,8 +140,12 @@ export default {
Cookies.remove("password");
Cookies.remove('rememberMe');
}
this.$store.dispatch("Login", this.loginForm).then(() => {
this.$router.push({ path: this.redirect || "/" }).catch(()=>{});
this.$store.dispatch("Login", this.loginForm).then((res) => {
if (res.weakPwd){
this.$router.push({ path: "/resetPwd" }).catch(()=>{});
}else{
this.$router.push({ path: this.redirect || "/" }).catch(()=>{});
}
}).catch(() => {
this.loading = false;
if (this.captchaEnabled) {

View File

@@ -414,7 +414,7 @@ import {
updateUser,
resetUserPwd,
changeUserStatus,
deptTreeSelect
deptTreeSelect, checkWeakPwd
} from "@/api/system/user";
import {getToken} from "@/utils/auth";
import Treeselect from "@riophae/vue-treeselect";
@@ -426,6 +426,15 @@ export default {
dicts: ['sys_normal_disable', 'sys_user_sex', 'task_lx'],
components: {Treeselect},
data() {
const validatePassword = (rule, value, callback) => {
checkWeakPwd(value).then(response => {
if (response.code === 200) {
callback();
} else {
callback(new Error(response.message));
}
})
};
return {
// 遮罩层
loading: true,
@@ -512,8 +521,8 @@ export default {
],
password: [
{required: true, message: "用户密码不能为空", trigger: "blur"},
{min: 5, max: 20, message: '用户密码长度必须介于 5 和 20 之间', trigger: 'blur'},
{pattern: /^[^<>"'|\\]+$/, message: "不能包含非法字符:< > \" ' \\\ |", trigger: "blur"}
{min: 8, max: 20, message: '用户密码长度必须介于 8 和 20 之间', trigger: 'blur'},
{validator: validatePassword, trigger: "blur"},
],
email: [
{
@@ -657,10 +666,10 @@ export default {
const userId = row.userId || this.ids;
getUser(userId).then(response => {
console.log(response.data.taskLx)
if (response.data.taskLx==='') {
if (response.data.taskLx === '') {
response.data.taskLx = [];
} else {
response.data.taskLx= response.data.taskLx.split(",");
response.data.taskLx = response.data.taskLx.split(",");
}
this.form = response.data;
this.postOptions = response.posts;

View File

@@ -1,5 +1,25 @@
<template>
<el-form ref="form" :model="user" :rules="rules" label-width="80px">
<div>
<h3>密码组成要求</h3>
<ul style="color: green">
<li>最小长度不少于 8 个字符</li>
<li>字符种类密码必须包含以下至少三种不同类型字符
<ul>
<li>大写英文字母A-Z</li>
<li>小写英文字母a-z</li>
<li>数字0-9</li>
<li>特殊符号!@#$%^&*()-_=+[]{}|;:,.<>/?</li>
</ul>
</li>
</ul>
<h3>禁止使用的内容</h3>
<ul style="color: red">
<li>禁止使用与用户账号姓名工号手机号邮箱等明显相关的信息作为密码</li>
<li>禁止使用常见弱口令123456passwordadminabc123qwerty </li>
<li>不允许使用重复字符或简单模式aaaaaa111111abcabc </li>
</ul>
</div>
<el-form-item label="旧密码" prop="oldPassword">
<el-input v-model="user.oldPassword" placeholder="请输入旧密码" type="password" show-password/>
</el-form-item>
@@ -17,7 +37,7 @@
</template>
<script>
import { updateUserPwd } from "@/api/system/user";
import {updateUserPwd, checkWeakPwd} from "@/api/system/user";
export default {
data() {
@@ -28,6 +48,15 @@ export default {
callback();
}
};
const validatePassword = (rule, value, callback) => {
checkWeakPwd(value).then(response => {
if (response.code === 200) {
callback();
} else {
callback(new Error(response.message));
}
})
};
return {
user: {
oldPassword: undefined,
@@ -37,16 +66,16 @@ export default {
// 表单校验
rules: {
oldPassword: [
{ required: true, message: "旧密码不能为空", trigger: "blur" }
{required: true, message: "旧密码不能为空", trigger: "blur"}
],
newPassword: [
{ required: true, message: "新密码不能为空", trigger: "blur" },
{ min: 6, max: 20, message: "长度在 6 到 20 个字符", trigger: "blur" },
{ pattern: /^[^<>"'|\\]+$/, message: "不能包含非法字符:< > \" ' \\\ |", trigger: "blur" }
{required: true, message: "新密码不能为空", trigger: "blur"},
{min: 8, max: 20, message: "长度在 8 到 20 个字符", trigger: "blur"},
{validator: validatePassword, trigger: "blur"},
],
confirmPassword: [
{ required: true, message: "确认密码不能为空", trigger: "blur" },
{ required: true, validator: equalToPassword, trigger: "blur" }
{required: true, message: "确认密码不能为空", trigger: "blur"},
{required: true, validator: equalToPassword, trigger: "blur"},
]
}
};
@@ -57,6 +86,7 @@ export default {
if (valid) {
updateUserPwd(this.user.oldPassword, this.user.newPassword).then(response => {
this.$modal.msgSuccess("修改成功");
this.$tab.closePage();
});
}
});

View File

@@ -0,0 +1,26 @@
<template>
<div class="app-container">
<div>
<h1 style="color: red">当前密码强度较弱请修改密码</h1>
</div>
<div>
<resetPwd/>
</div>
</div>
</template>
<script>
import resetPwd from "./profile/resetPwd";
export default {
name: "Profile",
components: {resetPwd},
data() {
return {};
},
}
</script>
<style>
</style>