Bläddra i källkod

reactor:441 工单待办:增加接办时间;440 甄别待审批和甄别列表部分位置增加“不满意原因”;420 【二级等保漏洞修复】

zhangchong 1 månad sedan
förälder
incheckning
965453ebaa

+ 1 - 1
.env.development

@@ -3,7 +3,7 @@ VITE_MODE_NAME=development
 # 防止部署多套系统到同一域名不同目录时,变量共用的问题 设置不同的前缀
 VITE_STORAGE_NAME=dev
 # 业务系统基础请求地址
-VITE_API_URL=http://110.188.24.28:50300
+VITE_API_URL=http://110.188.24.28:50100
 # 业务系统socket请求地址
 VITE_API_SOCKET_URL=http://110.188.24.28:50100/hubs/hotline
 # 业务系统文件上传上传请求地址

+ 1 - 0
package.json

@@ -27,6 +27,7 @@
 		"@wangeditor-next/editor-for-vue": "^5.1.14",
 		"@wsfe/vue-tree": "^4.1.1",
 		"axios": "^1.4.0",
+		"crypto-js": "^4.2.0",
 		"dayjs": "^1.11.9",
 		"echarts": "^5.5.0",
 		"element-plus": "^2.9.2",

+ 12 - 0
src/api/login/index.ts

@@ -16,6 +16,18 @@ export const signIn = (data?: object) => {
 		data,
 	});
 };
+/**
+ * @description 用户登录 加密
+ * @param {object} data  登录参数
+ * @returns 返回接口数据
+ */
+export  const signInEncrypt = (data?: object) => {
+	return request({
+		url: '/api/v1/Identity/login-sign',
+		method: 'post',
+		data,
+	});
+}
 /**
  * @description 密码修改状态 未修改直接跳转到修改密码页面  不进入系统
  *  @returns

+ 3 - 0
src/views/business/discern/components/Discern-audit.vue

@@ -39,6 +39,9 @@
 					<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
 						<el-form-item label="是否省甄别">{{ state.infoForm?.isProvince ? '是' : '否' }} </el-form-item>
 					</el-col>
+					<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
+						<el-form-item label="不满意原因">{{ state.infoForm?.visitDetail?.orgNoSatisfiedReasonText }} </el-form-item>
+					</el-col>
 					<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
 						<el-form-item label="申请理由" class="formatted-text">{{ state.infoForm?.content }} </el-form-item>
 					</el-col>

+ 3 - 0
src/views/business/discern/components/Discern-detail.vue

@@ -27,6 +27,9 @@
 				<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
 					<el-form-item label="是否省甄别">{{ state.ruleForm?.isProvince ? '是' : '否' }} </el-form-item>
 				</el-col>
+				<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
+					<el-form-item label="不满意原因">{{ state.ruleForm?.visitDetail?.orgNoSatisfiedReasonText }} </el-form-item>
+				</el-col>
 				<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
 					<el-form-item label="申请理由" class="formatted-text">{{ state.ruleForm?.content }} </el-form-item>
 				</el-col>

+ 3 - 0
src/views/business/discern/components/Discern-return.vue

@@ -27,6 +27,9 @@
 				<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
 					<el-form-item label="是否省甄别">{{ state.infoForm?.isProvince ? '是' : '否' }} </el-form-item>
 				</el-col>
+				<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12">
+					<el-form-item label="不满意原因">{{ state.infoForm?.visitDetail?.orgNoSatisfiedReasonText }} </el-form-item>
+				</el-col>
 				<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
 					<el-form-item label="申请理由" class="formatted-text">{{ state.infoForm?.content }} </el-form-item>
 				</el-col>

+ 121 - 54
src/views/login/components/Account.vue

@@ -1,68 +1,71 @@
 <template>
 	<el-form size="large" class="login-content-form" ref="ruleFormRef" :model="state.ruleForm" @submit.native.prevent>
-			<el-form-item class="mb30" prop="username" :rules="[{ required: true, message: '请填写账号', trigger: 'blur' }]">
+		<el-form-item class="mb30" prop="username" :rules="[{ required: true, message: '请填写账号', trigger: 'blur' }]">
+			<el-input
+				type="text"
+				class="inputDeep"
+				placeholder="请填写账号"
+				v-model="state.ruleForm.username"
+				clearable
+				@keyup.enter="onSignIn(ruleFormRef)"
+				autocomplete="off"
+				@blur="blurUserName"
+			>
+				<template #prefix>
+					<SvgIcon name="ele-User" class="el-input__icon" />
+				</template>
+			</el-input>
+		</el-form-item>
+		<el-form-item class="mb30" prop="password" :rules="[{ required: true, message: '请填写密码', trigger: 'blur' }]">
+			<el-input
+				class="inputDeep"
+				clearable
+				show-password
+				placeholder="请填写密码"
+				v-model="state.ruleForm.password"
+				@keyup.enter="onSignIn(ruleFormRef)"
+				autocomplete="off"
+			>
+				<template #prefix>
+					<SvgIcon name="ele-Unlock" class="el-input__icon" />
+				</template>
+			</el-input>
+		</el-form-item>
+		<el-form-item
+			prop="msgCode"
+			class="mb30"
+			:rules="[{ required: msgCodeRequired, message: '请填写短信验证码', trigger: 'blur' }]"
+			v-if="themeConfig.isLoginMessageCode"
+		>
+			<el-col :span="11">
 				<el-input
 					type="text"
-					class="inputDeep"
-					placeholder="请填写账号"
-					v-model="state.ruleForm.username"
+					maxlength="6"
+					placeholder="请填写短信验证码"
+					v-model="state.ruleForm.msgCode"
 					clearable
-					@keyup.enter="onSignIn(ruleFormRef)"
 					autocomplete="off"
-					@blur="blurUserName"
-				>
-					<template #prefix>
-						<SvgIcon name="ele-User" class="el-input__icon" />
-					</template>
-				</el-input>
-			</el-form-item>
-			<el-form-item class="mb30" prop="password" :rules="[{ required: true, message: '请填写密码', trigger: 'blur' }]">
-				<el-input
 					class="inputDeep"
-					clearable
-					show-password
-					placeholder="请填写密码"
-					v-model="state.ruleForm.password"
 					@keyup.enter="onSignIn(ruleFormRef)"
-					autocomplete="off"
 				>
 					<template #prefix>
-						<SvgIcon name="ele-Unlock" class="el-input__icon" />
+						<SvgIcon name="ele-ChatDotSquare" class="el-input__icon" />
 					</template>
 				</el-input>
-			</el-form-item>
-			<el-form-item prop="msgCode" class="mb30" :rules="[{ required: msgCodeRequired, message: '请填写短信验证码', trigger: 'blur' }]"  v-if="themeConfig.isLoginMessageCode">
-				<el-col :span="11">
-					<el-input
-						type="text"
-						maxlength="6"
-						placeholder="请填写短信验证码"
-						v-model="state.ruleForm.msgCode"
-						clearable
-						autocomplete="off"
-						class="inputDeep"
-						@keyup.enter="onSignIn(ruleFormRef)"
-					>
-						<template #prefix>
-							<SvgIcon name="ele-ChatDotSquare" class="el-input__icon" />
-						</template>
-					</el-input>
-				</el-col>
-				<el-col :span="12" :offset="1">
-					<el-button class="login-content-code w100" :disabled="isDisabled" @click="getIdentifyCodeBtn">{{
-						isDisabled ? countText : click
-					}}</el-button>
-				</el-col>
-			</el-form-item>
-			<el-form-item>
-				<el-button type="primary" class="login-content-submit" round @click="onSignIn(ruleFormRef)" :loading="state.loading">登录</el-button>
-				<puzzle-Code :show="showCode" @success="success" @close="close" @fail="fail" :imgs="imgList"></puzzle-Code>
-			</el-form-item>
+			</el-col>
+			<el-col :span="12" :offset="1">
+				<el-button class="login-content-code w100" :disabled="isDisabled" @click="getIdentifyCodeBtn">{{ isDisabled ? countText : click }}</el-button>
+			</el-col>
+		</el-form-item>
+		<el-form-item>
+			<el-button type="primary" class="login-content-submit" round @click="onSignIn(ruleFormRef)" :loading="state.loading">登录</el-button>
+			<puzzle-Code :show="showCode" @success="success" @close="close" @fail="fail" :imgs="imgList"></puzzle-Code>
+		</el-form-item>
 		运营管理系统 <span class="color-danger font-bold">v5.0</span>
-			<div class="login-msg">
-				<div>联系管理员<b>重置密码</b></div>
-				<!-- <el-button link type="primary" class="font16" @click="forgetPwd">忘记密码</el-button> -->
-			</div>
+		<div class="login-msg">
+			<div>联系管理员<b>重置密码</b></div>
+			<!-- <el-button link type="primary" class="font16" @click="forgetPwd">忘记密码</el-button> -->
+		</div>
 	</el-form>
 </template>
 
@@ -78,9 +81,10 @@ import { Session, Local, Cookie } from '@/utils/storage';
 import { formatAxis } from '@/utils/formatTime';
 import { NextLoading } from '@/utils/loading';
 import type { FormInstance } from 'element-plus';
-import { sendCode, signIn, whiteList } from '@/api/login';
+import { sendCode, signIn, signInEncrypt, whiteList } from '@/api/login';
 import { JSEncrypt } from 'jsencrypt'; // rsa加密
-import { getImageUrl, throttle, trimCompat } from '@/utils/tools';
+import { getImageUrl, guid, throttle, trimCompat } from '@/utils/tools';
+import CryptoJS from 'crypto-js'; // aes加密
 //引入'vue3-puzzle-vcode'插件
 import PuzzleCode from 'vue3-puzzle-vcode';
 import { encryptionLoginKey } from '@/utils/constants';
@@ -163,11 +167,21 @@ const countDown = () => {
 	}
 };
 const imgList = [getImageUrl('login/code1.png'), getImageUrl('login/code2.png'), getImageUrl('login/code3.png'), getImageUrl('login/code4.png')];
+
 const showCode = ref(false); // 是否展示验证码
 const success = () => {
 	// 验证成功
 	showCode.value = false;
 	state.loading = true;
+	if (['LuZhou'].includes(themeConfig.value.appScope)) {
+		// 泸州先行加密登录
+		encryptionLogin();
+	} else {
+		normalLogin();
+	}
+};
+// 普通登录
+const normalLogin = () => {
 	// 新建一个JSEncrypt对象
 	const encryptor = new JSEncrypt({ default_key_size: '2048' });
 	encryptor.setPublicKey(encryptionLoginKey); // publicKey为公钥
@@ -201,6 +215,59 @@ const success = () => {
 			state.loading = false;
 		});
 };
+// 加密登录
+const encryptionLogin = () => {
+	const key = 'qlzeJrbj0CPkHdFBvEAxX47Y4nCbBPZW'; // 加密秘钥
+	const iv = 'JxeDP0sgnPJdH9fE'; // 偏移量
+	const key1 = CryptoJS.enc.Utf8.parse(key);
+	const iv1 = CryptoJS.enc.Utf8.parse(iv);
+
+	const usernameTrim = trimCompat(state.ruleForm.username);
+	const passwordTrim = trimCompat(state.ruleForm.password);
+	const usernameMesCode = trimCompat(state.ruleForm.msgCode);
+	// 加密数据
+	const submitObj = {
+		username: usernameTrim, // 用户名
+		password: passwordTrim, // 密码
+		msgCode: usernameMesCode, // 验证码
+		timestamp: new Date().getTime(), // 时间戳
+		nonce: guid(), // 随机数
+	};
+	const encrypted = CryptoJS.AES.encrypt(JSON.stringify(submitObj), key1, {
+		// 加密
+		iv: iv1,
+		mode: CryptoJS.mode.CBC,
+		padding: CryptoJS.pad.Pkcs7,
+	});
+	const encryptedStr = encrypted.toString(); // 加密后的字符串
+	/*	const decrypted = CryptoJS.AES.decrypt(encrypted,key1, { // 解密
+		iv: iv1,
+		mode: CryptoJS.mode.CBC,
+		padding: CryptoJS.pad.Pkcs7
+	})
+	console.log('de: ',decrypted.toString(CryptoJS.enc.Utf8));*/
+	signInEncrypt({ signature: encryptedStr })
+		.then(async (res) => {
+			//登录
+			// 存储 token 到浏览器缓存
+			Cookie.set('token', res.result);
+			if (!themeConfig.value.isRequestRoutes) {
+				// 前端控制路由,2、请注意执行顺序
+				const isNoPower = await initFrontEndControlRoutes();
+				signInSuccess(isNoPower);
+			} else {
+				// 模拟后端控制路由,isRequestRoutes 为 true,则开启后端控制路由
+				// 添加完动态路由,再进行 router 跳转,否则可能报错 No match found for location with path "/"
+				const isNoPower = await initBackEndControlRoutes();
+				// 执行完 initBackEndControlRoutes,再执行 signInSuccess
+				signInSuccess(isNoPower);
+			}
+		})
+		.catch((err) => {
+			console.log('err: ', err);
+			state.loading = false;
+		});
+};
 const close = () => {
 	// 关闭验证码
 	showCode.value = false;

+ 7 - 0
src/views/todo/order/tableHeader.tsx

@@ -118,6 +118,13 @@ export const ZGTableHeader = [
 		sortable: true,
 		formatter: 'formatDate',
 	},
+	{
+		field: 'currentStepAcceptTime',
+		title: '接办时间',
+		width: 160,
+		sortable: true,
+		formatter: 'formatDate',
+	},
 	{ field: 'actualHandleOrgName', title: '接办部门', width: 140 },
 	{ field: 'orgLevelOneName', title: '一级部门', width: 140 },
 	{ field: 'counterSignTypeText', title: '是否会签', width: 110 },

+ 5 - 0
yarn.lock

@@ -2057,6 +2057,11 @@ cross-spawn@^7.0.1, cross-spawn@^7.0.3, cross-spawn@^7.0.6:
     shebang-command "^2.0.0"
     which "^2.0.1"
 
+crypto-js@^4.2.0:
+  version "4.2.0"
+  resolved "https://registry.yarnpkg.com/crypto-js/-/crypto-js-4.2.0.tgz#4d931639ecdfd12ff80e8186dba6af2c2e856631"
+  integrity sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==
+
 css-line-break@^2.1.0:
   version "2.1.0"
   resolved "https://registry.yarnpkg.com/css-line-break/-/css-line-break-2.1.0.tgz#bfef660dfa6f5397ea54116bb3cb4873edbc4fa0"