This commit is contained in:
BianLzhaoMin 2025-11-18 18:01:33 +08:00
parent e31bd2c78f
commit 3c580c86f6
9 changed files with 346 additions and 168 deletions

View File

@ -4,7 +4,7 @@ VUE_APP_TITLE = 实名制管理系统
# 生产环境配置 # 生产环境配置
ENV = 'production' ENV = 'production'
VUE_APP_ENV = 'production' VUE_APP_ENV = 'production'
VUE_APP_SHOW_PARAMETER = true VUE_APP_SHOW_PARAMETER = false
# 实名制管理系统/生产环境 # 实名制管理系统/生产环境
VUE_APP_BASE_API = '/hd-real-name' VUE_APP_BASE_API = '/hd-real-name'

View File

@ -1,19 +1,21 @@
const getters = { const getters = {
sidebar: state => state.app.sidebar, sidebar: (state) => state.app.sidebar,
size: state => state.app.size, size: (state) => state.app.size,
device: state => state.app.device, device: (state) => state.app.device,
dict: state => state.dict.dict, dict: (state) => state.dict.dict,
visitedViews: state => state.tagsView.visitedViews, visitedViews: (state) => state.tagsView.visitedViews,
cachedViews: state => state.tagsView.cachedViews, cachedViews: (state) => state.tagsView.cachedViews,
token: state => state.user.token, token: (state) => state.user.token,
avatar: state => state.user.avatar, avatar: (state) => state.user.avatar,
name: state => state.user.name, name: (state) => state.user.name,
introduction: state => state.user.introduction, introduction: (state) => state.user.introduction,
roles: state => state.user.roles, roles: (state) => state.user.roles,
permissions: state => state.user.permissions, permissions: (state) => state.user.permissions,
permission_routes: state => state.permission.routes, permission_routes: (state) => state.permission.routes,
topbarRouters: state => state.permission.topbarRouters, topbarRouters: (state) => state.permission.topbarRouters,
defaultRoutes: state => state.permission.defaultRoutes, defaultRoutes: (state) => state.permission.defaultRoutes,
sidebarRouters: state => state.permission.sidebarRouters sidebarRouters: (state) => state.permission.sidebarRouters,
companyId: (state) => state.user.companyId,
companyLevel: (state) => state.user.companyLevel,
} }
export default getters export default getters

View File

@ -1,4 +1,12 @@
import { login, logout, getInfo, refreshToken, getPhoneCode, isLogin,isAdmin} from '@/api/login' import {
login,
logout,
getInfo,
refreshToken,
getPhoneCode,
isLogin,
isAdmin,
} from '@/api/login'
import { getToken, setToken, setExpiresIn, removeToken } from '@/utils/auth' import { getToken, setToken, setExpiresIn, removeToken } from '@/utils/auth'
// 更严格的手机号和邮箱正则表达式 // 更严格的手机号和邮箱正则表达式
@ -6,20 +14,37 @@ const phonePattern = /^(\+86)?1[3-9]\d{9}$/ // 支持前缀 +86
const emailPattern = /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/ const emailPattern = /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/
// 构建 payload 函数 // 构建 payload 函数
const buildPayload = ({ loginMethod, username, password, uuid, code, mobile, verificationCode,phoneUuid }) => { const buildPayload = ({
loginMethod,
username,
password,
uuid,
code,
mobile,
verificationCode,
phoneUuid,
}) => {
let loginType = '' let loginType = ''
if (loginMethod === 'mobile') { if (loginMethod === 'mobile') {
loginType = phonePattern.test(mobile.trim()) ? 'PHONE_OTP' : emailPattern.test(mobile.trim()) ? 'EMAIL_OTP' : 'PHONE_OTP' loginType = phonePattern.test(mobile.trim())
? 'PHONE_OTP'
: emailPattern.test(mobile.trim())
? 'EMAIL_OTP'
: 'PHONE_OTP'
return { return {
username: mobile.trim(), username: mobile.trim(),
verificationCode, verificationCode,
uuid, uuid,
code, code,
loginType, loginType,
phoneUuid phoneUuid,
} }
} else { } else {
loginType = phonePattern.test(username.trim()) ? 'PHONE_PASSWORD' : emailPattern.test(username.trim()) ? 'EMAIL_PASSWORD' : 'USERNAME_PASSWORD' loginType = phonePattern.test(username.trim())
? 'PHONE_PASSWORD'
: emailPattern.test(username.trim())
? 'EMAIL_PASSWORD'
: 'USERNAME_PASSWORD'
return { return {
username: username.trim(), username: username.trim(),
password, password,
@ -27,7 +52,7 @@ const buildPayload = ({ loginMethod, username, password, uuid, code, mobile, ver
uuid, uuid,
code, code,
loginType, loginType,
phoneUuid phoneUuid,
} }
} }
} }
@ -39,7 +64,9 @@ const user = {
name: '', name: '',
avatar: '', avatar: '',
roles: [], roles: [],
permissions: [] permissions: [],
companyId: '',
companyLevel: '',
}, },
mutations: { mutations: {
@ -63,36 +90,43 @@ const user = {
}, },
SET_PERMISSIONS(state, permissions) { SET_PERMISSIONS(state, permissions) {
state.permissions = permissions state.permissions = permissions
} },
SET_COMPANY_ID(state, companyId) {
state.companyId = companyId
},
SET_COMPANY_LEVEL(state, companyLevel) {
state.companyLevel = companyLevel
},
}, },
actions: { actions: {
IsLogin({ commit }, userInfo) { IsLogin({ commit }, userInfo) {
const payload = buildPayload(userInfo) const payload = buildPayload(userInfo)
return isLogin(payload) return isLogin(payload)
.then(res => res) .then((res) => res)
.catch(error => Promise.reject(error)) .catch((error) => Promise.reject(error))
}, },
IsAdmin({ commit }, userInfo) { IsAdmin({ commit }, userInfo) {
const payload = buildPayload(userInfo) const payload = buildPayload(userInfo)
return isAdmin(payload) return isAdmin(payload)
.then(res => res) .then((res) => res)
.catch(error => Promise.reject(error)) .catch((error) => Promise.reject(error))
}, },
// 登录 // 登录
Login({ commit }, userInfo) { Login({ commit }, userInfo) {
const payload = buildPayload(userInfo) const payload = buildPayload(userInfo)
return login(payload) return login(payload)
.then(res => { .then((res) => {
const { access_token, expires_in } = res.data const { access_token, expires_in } = res.data
setToken(access_token) setToken(access_token)
commit('SET_TOKEN', access_token) commit('SET_TOKEN', access_token)
setExpiresIn(expires_in) setExpiresIn(expires_in)
commit('SET_EXPIRES_IN', expires_in) commit('SET_EXPIRES_IN', expires_in)
return res; return res
}) })
.catch(error => Promise.reject(error)) .catch((error) => Promise.reject(error))
}, },
// 获取手机验证码 // 获取手机验证码
@ -102,38 +136,50 @@ const user = {
uuid: userInfo.uuid, uuid: userInfo.uuid,
code: userInfo.code, code: userInfo.code,
phoneUuid: userInfo.phoneUuid, phoneUuid: userInfo.phoneUuid,
verificationCodeType: userInfo.mobileCodeType verificationCodeType: userInfo.mobileCodeType,
} }
return getPhoneCode(payload) return getPhoneCode(payload)
.then(res => res) .then((res) => res)
.catch(error => Promise.reject(error)) .catch((error) => Promise.reject(error))
}, },
// 获取用户信息 // 获取用户信息
GetInfo({ commit }) { GetInfo({ commit }) {
return getInfo() return getInfo()
.then(res => { .then((res) => {
const user = res.user const user = res.user
const avatar = user.avatar ? user.avatar : require('@/assets/images/profile.jpg') const avatar = user.avatar
commit('SET_ROLES', res.roles && res.roles.length > 0 ? res.roles : ['ROLE_DEFAULT']) ? user.avatar
: require('@/assets/images/profile.jpg')
commit(
'SET_ROLES',
res.roles && res.roles.length > 0
? res.roles
: ['ROLE_DEFAULT'],
)
commit('SET_PERMISSIONS', res.permissions) commit('SET_PERMISSIONS', res.permissions)
commit('SET_ID', user.userId) commit('SET_ID', user.userId)
commit('SET_NAME', user.userName) commit('SET_NAME', user.userName)
commit('SET_AVATAR', avatar) commit('SET_AVATAR', avatar)
// 存储用户的公司id 和公司级别
commit('SET_COMPANY_ID', user.bandId)
commit('SET_COMPANY_LEVEL', user.roleLevel)
return res return res
}) })
.catch(error => Promise.reject(error)) .catch((error) => Promise.reject(error))
}, },
// 刷新 token // 刷新 token
RefreshToken({ commit, state }) { RefreshToken({ commit, state }) {
return refreshToken(state.token) return refreshToken(state.token)
.then(res => { .then((res) => {
const expiresIn = res.data const expiresIn = res.data
setExpiresIn(expiresIn) setExpiresIn(expiresIn)
commit('SET_EXPIRES_IN', expiresIn) commit('SET_EXPIRES_IN', expiresIn)
}) })
.catch(error => Promise.reject(error)) .catch((error) => Promise.reject(error))
}, },
// 退出登录 // 退出登录
@ -145,18 +191,18 @@ const user = {
commit('SET_PERMISSIONS', []) commit('SET_PERMISSIONS', [])
removeToken() removeToken()
}) })
.catch(error => Promise.reject(error)) .catch((error) => Promise.reject(error))
}, },
// 前端退出 // 前端退出
FedLogOut({ commit }) { FedLogOut({ commit }) {
return new Promise(resolve => { return new Promise((resolve) => {
commit('SET_TOKEN', '') commit('SET_TOKEN', '')
removeToken() removeToken()
resolve() resolve()
}) })
} },
} },
} }
export default user export default user

View File

@ -8,6 +8,7 @@ export const formLabel = [
] ]
export const columnsList = [ export const columnsList = [
{ t_props: 'subComName', t_label: '所属分公司' },
{ t_props: 'mainProName', t_label: '总工程名称' }, { t_props: 'mainProName', t_label: '总工程名称' },
{ t_props: 'volLevel', t_label: '电压等级' }, { t_props: 'volLevel', t_label: '电压等级' },

View File

@ -94,6 +94,23 @@
:model="addOrEditForm" :model="addOrEditForm"
:rules="addOrEditFormRules" :rules="addOrEditFormRules"
> >
<el-form-item label="所属分公司" prop="subComId">
<el-select
clearable
filterable
style="width: 100%"
:disabled="subIsDisabled"
placeholder="请选择所属分公司"
v-model="addOrEditForm.subComId"
>
<el-option
:key="item.id"
:value="item.id"
:label="item.subCompanyName"
v-for="item in branchCompanyOptions"
/>
</el-select>
</el-form-item>
<el-form-item label="总工程名称" prop="mainProName"> <el-form-item label="总工程名称" prop="mainProName">
<el-input <el-input
clearable clearable
@ -195,12 +212,14 @@
<script> <script>
import TableModel from '@/components/TableModel' import TableModel from '@/components/TableModel'
import DialogModel from '@/components/DialogModel' import DialogModel from '@/components/DialogModel'
import { formLabel, columnsList, dialogConfig } from './config' import { formLabel, columnsList, dialogConfig } from './config'
import { import {
addAndEditAllProjectAPI, addAndEditAllProjectAPI,
deleteAllProjectAPI, deleteAllProjectAPI,
getAllProjectListAPI, getAllProjectListAPI,
} from '@/api/basic-manage/project-manage/all-project' } from '@/api/basic-manage/project-manage/all-project'
import { getSubCompanySelectListCommonFun } from '@/utils/getCommonData'
export default { export default {
name: 'All-project', name: 'All-project',
dicts: ['voltage_level', 'project_type', 'project_status'], dicts: ['voltage_level', 'project_type', 'project_status'],
@ -215,16 +234,25 @@ export default {
columnsList, columnsList,
dialogConfig, dialogConfig,
getAllProjectListAPI, getAllProjectListAPI,
subIsDisabled: false, //
lotProjectList: [], // () lotProjectList: [], // ()
branchCompanyOptions: [], //
// //
addOrEditForm: { addOrEditForm: {
subComId: '', // id
id: '', // id id: '', // id
volLevel: '', // volLevel: '', //
mainProName: '', // mainProName: '', //
}, },
// //
addOrEditFormRules: { addOrEditFormRules: {
subComId: [
{
required: true,
trigger: 'change',
message: '请选择所属分公司',
},
],
mainProName: [ mainProName: [
{ {
required: true, required: true,
@ -247,6 +275,11 @@ export default {
} }
}, },
async created() {
//
this.branchCompanyOptions = await getSubCompanySelectListCommonFun() //
},
methods: { methods: {
// //
onHandleExportAllProject(queryParams) { onHandleExportAllProject(queryParams) {
@ -261,14 +294,16 @@ export default {
// //
onHandleAddOrEditAllProject(type, data) { onHandleAddOrEditAllProject(type, data) {
this.getCurrentCompanyIdAndLevel() // id
this.dialogConfig.outerTitle = this.dialogConfig.outerTitle =
type === 1 ? '新增总工程' : '修改总工程' type === 1 ? '新增总工程' : '修改总工程'
if (type === 2) { if (type === 2) {
const { mainProName, volLevel, id } = data const { mainProName, volLevel, id, subComId } = data
this.addOrEditForm = { this.addOrEditForm = {
id, id,
volLevel, volLevel,
subComId: subComId === null ? '' : subComId * 1,
mainProName, mainProName,
} }
} }
@ -377,6 +412,26 @@ export default {
return status || '' return status || ''
}, },
//
onHandleSelectOrgId(node) {
this.addOrEditForm.subComId = node.parentId
// this.addOrEditForm.orgId = node.id
},
// id
getCurrentCompanyIdAndLevel() {
// id
const companyId = this.$store.getters.companyId
//
const companyLevel = this.$store.getters.companyLevel
if (companyLevel === '分公司级') {
this.addOrEditForm.subComId = companyId * 1
}
this.subIsDisabled = companyLevel === '分公司级'
},
}, },
} }
</script> </script>

View File

@ -102,7 +102,8 @@
placeholder="请选择所属分公司" placeholder="请选择所属分公司"
v-model="addOrEditForm.subComId" v-model="addOrEditForm.subComId"
:disabled=" :disabled="
dialogConfig.outerTitle === '修改项目部' dialogConfig.outerTitle === '修改项目部' ||
subIsDisabled
" "
> >
<el-option <el-option
@ -234,6 +235,7 @@ export default {
columnsList, columnsList,
dialogConfig, dialogConfig,
getDeptProjectListAPI, getDeptProjectListAPI,
subIsDisabled: false, //
lotProjectList: [], // () lotProjectList: [], // ()
branchCompanyOptions: [], // branchCompanyOptions: [], //
@ -288,6 +290,7 @@ export default {
// //
onHandleAddOrEditDeptProject(type, data, title) { onHandleAddOrEditDeptProject(type, data, title) {
this.getCurrentCompanyIdAndLevel() // id
this.dialogConfig.outerTitle = `${title}项目部` this.dialogConfig.outerTitle = `${title}项目部`
if (type === 2) { if (type === 2) {
const { id, orgName, isEnable, subComId } = data const { id, orgName, isEnable, subComId } = data
@ -398,6 +401,20 @@ export default {
return data || '' return data || ''
}, },
// id
getCurrentCompanyIdAndLevel() {
// id
const companyId = this.$store.getters.companyId
//
const companyLevel = this.$store.getters.companyLevel
if (companyLevel === '分公司级') {
this.addOrEditForm.subComId = companyId * 1
}
this.subIsDisabled = companyLevel === '分公司级'
},
}, },
async created() { async created() {

View File

@ -31,7 +31,27 @@
</el-form-item> </el-form-item>
</el-col> </el-col>
</el-row> </el-row>
<el-row> <el-row>
<el-col :span="12">
<el-form-item label="所属分公司" prop="subComId">
<el-select
clearable
filterable
style="width: 100%"
:disabled="subIsDisabled"
placeholder="请选择所属分公司"
v-model="addOrEditForm.subComId"
>
<el-option
:key="item.id"
:value="item.id"
:label="item.subCompanyName"
v-for="item in branchCompanyOptions"
/>
</el-select>
</el-form-item>
</el-col>
<!-- 法人信息 --> <!-- 法人信息 -->
<el-col :span="12"> <el-col :span="12">
<el-form-item label="法人联系电话" prop="legalPersonPhone"> <el-form-item label="法人联系电话" prop="legalPersonPhone">
@ -44,6 +64,8 @@
/> />
</el-form-item> </el-form-item>
</el-col> </el-col>
</el-row>
<el-row>
<el-col :span="12"> <el-col :span="12">
<el-form-item label="营业住址"> <el-form-item label="营业住址">
<el-input <el-input
@ -58,7 +80,6 @@
</el-row> </el-row>
<el-row> <el-row>
<el-col :span="12"> <el-col :span="12">
<el-form-item label="营业执照"> <el-form-item label="营业执照">
<UploadImgFormData <UploadImgFormData
@ -102,10 +123,7 @@
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="12"> <el-col :span="12">
<el-form-item <el-form-item label="电子签名/法人印章">
label="电子签名/法人印章"
>
<UploadImgFormData <UploadImgFormData
:limit="1" :limit="1"
:file-size="10" :file-size="10"
@ -126,6 +144,7 @@
<script> <script>
import UploadImgFormData from '@/components/UploadImgFormData' import UploadImgFormData from '@/components/UploadImgFormData'
import { addAndEditSubBaseInfoAPI } from '@/api/basic-manage/sub-manage/sub-base-info' import { addAndEditSubBaseInfoAPI } from '@/api/basic-manage/sub-manage/sub-base-info'
import { getSubCompanySelectListCommonFun } from '@/utils/getCommonData'
export default { export default {
name: 'AddOrEditForm', name: 'AddOrEditForm',
components: { components: {
@ -144,6 +163,8 @@ export default {
}, },
data() { data() {
return { return {
subIsDisabled: false, //
branchCompanyOptions: [], //
editUploadFileList: [], // editUploadFileList: [], //
addOrEditForm: { addOrEditForm: {
id: null, // id id: null, // id
@ -151,6 +172,7 @@ export default {
subAddress: '', // subAddress: '', //
legalPerson: '', // legalPerson: '', //
legalPersonPhone: '', // legalPersonPhone: '', //
subComId: '', // id
idCard: [], // idCard: [], //
businessLicense: [], // businessLicense: [], //
@ -174,6 +196,14 @@ export default {
}, },
], ],
subComId: [
{
required: true,
trigger: 'change',
message: '请选择所属分公司',
},
],
legalPersonPhone: [ legalPersonPhone: [
{ {
trigger: 'blur', trigger: 'blur',
@ -213,6 +243,10 @@ export default {
}, },
} }
}, },
async created() {
this.branchCompanyOptions = await getSubCompanySelectListCommonFun() //
this.getCurrentCompanyIdAndLevel() // id
},
methods: { methods: {
// //
onHandleConfirmAddOrEditFun() { onHandleConfirmAddOrEditFun() {
@ -224,6 +258,7 @@ export default {
id, id,
idCard, idCard,
subName, subName,
subComId,
subAddress, subAddress,
legalPerson, legalPerson,
businessLicense, businessLicense,
@ -247,6 +282,7 @@ export default {
subAddress, subAddress,
legalPerson, legalPerson,
legalPersonPhone, legalPersonPhone,
subComId,
} }
businessLicense.forEach((item) => { businessLicense.forEach((item) => {
@ -336,6 +372,20 @@ export default {
resetForm() { resetForm() {
this.$refs.addOrEditFormRef.resetFields() this.$refs.addOrEditFormRef.resetFields()
}, },
// id
getCurrentCompanyIdAndLevel() {
// id
const companyId = this.$store.getters.companyId
//
const companyLevel = this.$store.getters.companyLevel
if (companyLevel === '分公司级') {
this.addOrEditForm.subComId = companyId * 1
}
this.subIsDisabled = companyLevel === '分公司级'
},
}, },
watch: { watch: {
@ -349,9 +399,10 @@ export default {
legalPerson, legalPerson,
contractFile, contractFile,
legalPersonPhone, legalPersonPhone,
subComId,
} = newVal } = newVal
if (contractFile.length > 0) { if (contractFile && contractFile.length > 0) {
this.editUploadFileList = contractFile // this.editUploadFileList = contractFile //
// //
@ -404,6 +455,7 @@ export default {
subName, subName,
subAddress, subAddress,
legalPerson, legalPerson,
subComId,
legalPersonPhone, legalPersonPhone,
}) })
} }

View File

@ -170,6 +170,8 @@ export default {
if (type === 2) { if (type === 2) {
Object.assign(this.editFormData, data) Object.assign(this.editFormData, data)
this.editFormData.subComId =
data.subComId === null ? '' : data.subComId * 1
} else { } else {
this.editFormData = {} this.editFormData = {}
} }

View File

@ -6,6 +6,9 @@
:showOperation="true" :showOperation="true"
:showRightTools="true" :showRightTools="true"
ref="personEntryTableRef" ref="personEntryTableRef"
:sendParams="{
einStatus: '1',
}"
:columnsList="columnsList" :columnsList="columnsList"
:request-api="getEntryPersonListAPI" :request-api="getEntryPersonListAPI"
> >