bonus-ui/src/views/company-manage/components/add-form.vue

728 lines
25 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<!-- 新增修改弹框 -->
<div>
<el-dialog
width="55%"
:title="dialogTitle"
:visible.sync="dialogVisible"
:before-close="handleClose"
append-to-body
>
<el-form
label-width="120px"
:model="addOrEditForm"
:rules="addOrEditFormRef"
ref="addOrEditFormRef"
:disabled="formType == 1"
>
<TitleTip :titleText="`公司信息`" />
<el-form-item label="公司名称:" prop="deptName">
<el-input v-model="addOrEditForm.deptName" clearable />
</el-form-item>
<el-form-item label="公司地址:" prop="province">
<el-row>
<el-col :span="6">
<el-form-item prop="province">
<el-select
filterable
clearable
placeholder="请选择所在省"
@change="onChangeProvince"
v-model="addOrEditForm.province"
style="width: 95%"
>
<el-option
:key="item.code"
:label="item.name"
:value="item.code"
v-for="item in provinceList"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item prop="city">
<el-select
filterable
clearable
placeholder="请选择所在市"
@change="onChangeCity"
v-model="addOrEditForm.city"
style="width: 95%"
>
<el-option
:key="item.code"
:label="item.name"
:value="item.code"
v-for="item in cityList"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item prop="district">
<el-select
filterable
clearable
placeholder="请选择所在区/县"
v-model="addOrEditForm.district"
style="width: 95%"
>
<el-option
:key="item.code"
:label="item.name"
:value="item.code"
v-for="item in areaList"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item prop="address">
<el-input
clearable
style="width: 95%"
placeholder="请输入详细地址"
v-model="addOrEditForm.address"
/>
</el-form-item>
</el-col>
</el-row>
</el-form-item>
<el-form-item label="公司简称:" prop="deptAbbreviation">
<el-input
v-model="addOrEditForm.deptAbbreviation"
clearable
/>
</el-form-item>
<el-form-item label="公司概述:" prop="remark">
<el-input
v-model="addOrEditForm.remark"
type="textarea"
:autosize="{ minRows: 2, maxRows: 10 }"
clearable
/>
</el-form-item>
<el-form-item
label="公司状态:"
prop="status"
v-if="formType == 2"
>
<el-radio-group v-model="addOrEditForm.status">
<el-radio label="0"> 启用 </el-radio>
<el-radio label="1"> 停用 </el-radio>
<!-- <el-radio label="2"> 注销 </el-radio> -->
</el-radio-group>
</el-form-item>
<!-- <TitleTip :titleText="`基础设置`" /> -->
<el-form-item label="默认密码:" prop="initPassword">
<el-input v-model="addOrEditForm.initPassword" clearable />
</el-form-item>
<el-form-item label="LOGO设置" prop="logo">
<div class="upload-container" v-if="formType != 1">
<el-upload
:limit="1"
:action="uploadFileUrl"
list-type="picture-card"
:file-list="addOrEditForm.fileList"
:headers="headers"
:on-remove="handleRemove"
:on-preview="handlePreview"
:on-success="handleSuccess"
:before-upload="handleBeforeUpload"
:show-file-list="true"
:on-exceed="handleExceed"
>
<i class="el-icon-plus"></i>
</el-upload>
<div>
1、上传图片文件格式仅支持SVG <br />
2、LOGO图片大小不超过3MB,尺寸100px * 100px <br />
3、收集客户的logo请UI设计完成后添加 <br />
4、默认公司LOGO。
<a @click="onDefaultLogo()"> &gt;&gt; 恢复默认 </a>
<br />
</div>
</div>
<div
v-else
class="view-logo-box"
@click="onViewLogoImg(addOrEditForm.logo)"
>
<img
:src="addOrEditForm.logo"
style="
display: block;
max-width: 100%;
max-height: 100%;
margin: 0 auto;
"
/>
</div>
</el-form-item>
<TitleTip :titleText="`默认管理员`" />
<el-form-item label="姓名:" prop="nickName">
<el-input v-model="addOrEditForm.nickName" clearable />
</el-form-item>
<el-form-item prop="phonenumber" class="user-phone-number">
<template slot="label">
<div class="custom-label">
<span>手机号码:</span>
<span>(登录账号)</span>
</div>
</template>
<el-input v-model="addOrEditForm.phonenumber" clearable />
</el-form-item>
<el-form-item label="权限模板:" prop="menuTemplateId">
<el-select
filterable
clearable
placeholder="请选择权限模板"
v-model="addOrEditForm.menuTemplateId"
style="width: 100%"
>
<el-option
:key="item.id"
:label="item.name"
:value="item.id"
v-for="item in templateList"
/>
</el-select>
</el-form-item>
<el-form-item label="角色:" prop="roles">
<el-input disabled v-model="addOrEditForm.roles" />
</el-form-item>
<el-form-item class="handle" v-if="formType !== 1">
<el-button
@click="
() => {
$emit('update:formDialogVisible', false)
}
"
>
取消
</el-button>
<el-button type="primary" @click="onSubmitForm">
保存
</el-button>
</el-form-item>
</el-form>
<el-dialog
width="30%"
:visible.sync="dialogInnerVisible"
append-to-body
:before-close="
() => {
dialogInnerVisible = false
}
"
>
<img
:src="previewUrl"
style="display: block; max-width: 100%; margin: 0 auto"
/>
</el-dialog>
</el-dialog>
</div>
</template>
<script>
import {
addCompanyAPI,
editCompanyAPI,
getDeptDetailsAPI,
getAddressListAPI,
} from '@/api/company-manage/index.js'
import { getTemplateListAPI } from '@/api/permission-template/index.js'
import { validateNewPassword } from '@/utils/validate'
import { getToken } from '@/utils/auth'
export default {
props: {
formType: {
type: Number,
default: () => 3,
},
detailsId: {
type: [String, Number],
default: () => '',
},
formDialogVisible: {
type: Boolean,
default: () => false,
},
},
data() {
return {
uploadFileUrl: process.env.VUE_APP_BASE_API + '/file/upload',
fileType: ['svg'],
dialogInnerVisible: false,
provinceList: [],
cityList: [],
areaList: [],
templateList: [],
previewUrl: '',
headers: {
Authorization: 'Bearer ' + getToken(),
},
// 新增或修改接口
addOrEditForm: {
deptName: '',
deptAbbreviation: '',
remark: '',
initPassword: '',
logo: '',
nickName: '',
phonenumber: '',
userName: '',
orderNum: 999,
fileList: [],
status: '',
roles: '公司管理员',
province: '',
city: '',
district: '',
address: '',
menuTemplateId: '',
},
addOrEditFormRef: {
deptName: [
{
required: true,
message: '请输入公司名称',
trigger: 'blur',
},
{
min: 1,
max: 30,
message: '长度在 1 到 30 个字符',
trigger: 'blur',
},
],
deptAbbreviation: [
{
required: true,
message: '请输入公司简称',
trigger: 'blur',
},
{
min: 1,
max: 20,
message: '长度在 1 到 20 个字符',
trigger: 'blur',
},
],
status: [
{
required: true,
message: '请选择公司状态',
trigger: 'change',
},
],
remark: [
{
required: true,
message: '请输入公司概述',
trigger: 'blur',
},
{
min: 1,
max: 150,
message: '长度在 1 到 150 个字符',
trigger: 'blur',
},
],
initPassword: [
{
required: true,
message: '请输入默认密码',
trigger: 'blur',
},
{ validator: validateNewPassword, trigger: 'blur' },
],
logo: [
{
required: true,
message: '请上传logo',
trigger: 'blur',
},
],
nickName: [
{
required: true,
message: '请输入管理员姓名',
trigger: 'blur',
},
{
min: 1,
max: 20,
message: '长度在 1 到 20 个字符',
trigger: 'blur',
},
],
phonenumber: [
{
required: true,
message: '请输入手机号码',
trigger: 'blur',
},
{
pattern: /^1[3456789]\d{9}$/,
message: '请输入正确的手机号码',
trigger: 'blur',
},
],
roles: [
{
required: true,
message: '请输入角色',
trigger: 'blur',
},
],
province: [
{
required: true,
message: '请选择省',
trigger: 'change',
},
],
city: [
{
required: true,
message: '请选择市',
trigger: 'change',
},
],
district: [
{
required: true,
message: '请选择区/县',
trigger: 'blur',
},
],
address: [
{
required: true,
message: '请输入详细地址',
trigger: 'blur',
},
],
menuTemplateId: [
{
required: true,
message: '请选择权限模板',
trigger: 'change',
},
],
},
}
},
computed: {
dialogVisible: {
get() {
return this.formDialogVisible
},
},
dialogTitle: {
get() {
if (this.formType === 1) return '公司详情'
if (this.formType === 2) return '公司编辑'
if (this.formType === 3) return '公司注册'
},
},
},
methods: {
handleClose() {
this.$refs.addOrEditFormRef.resetFields()
this.$emit('update:formDialogVisible', false)
},
// 表单提交
onSubmitForm() {
this.$refs.addOrEditFormRef.validate(async (valid) => {
if (valid) {
const {
deptName,
deptAbbreviation,
remark,
initPassword,
logo,
nickName,
phonenumber,
deptId,
parentId,
userId,
status,
province,
city,
district,
address,
menuTemplateId,
roleId,
} = this.addOrEditForm
const params = {
deptName,
deptAbbreviation,
remark,
logo,
initPassword,
orderNum: 200,
province,
city,
district,
address,
menuTemplateId,
sysUser: {
nickName,
phonenumber,
userName: phonenumber,
},
}
if (this.formType == 2) {
params.deptId = deptId
params.status = status
params.parentId = parentId
params.sysUser.userId = userId
params.sysUser.roleId = roleId
}
const SEND_FUN =
this.formType == 2 ? editCompanyAPI : addCompanyAPI
const res = await SEND_FUN(params)
if (res.code === 200) {
this.$modal.msgSuccess(
this.formType === 2 ? '修改成功' : '新增成功',
)
}
this.$emit('update:formDialogVisible', false)
this.$emit('updateTableList')
}
})
},
// 上传之前
handleBeforeUpload(file) {
const isSvg = this.fileType.some((e) => file.type.includes(e))
if (!isSvg) {
this.$modal.msgError(
`文件格式不正确, 请上传${this.fileType.join(
'、',
)}格式的文件!`,
)
return false
}
const isLt = file.size / 1024 / 1024 < 3
if (!isLt) {
this.$modal.msgError(`LOGO大小不能超过 3 MB`)
return false
}
this.$modal.loading('图片正在上传,请稍候...')
},
// 移除
handleRemove(file) {
this.addOrEditForm.fileList = this.addOrEditForm.fileList.filter(
(item) => item.uid !== file.uid,
)
this.addOrEditForm.logo = ''
},
// 预览 LOGO
handlePreview(file) {
this.dialogInnerVisible = true
this.previewUrl = file.url
},
// 上传成功
handleSuccess(res) {
if (res.code === 200) {
this.addOrEditForm.logo = res.data.url
} else {
this.addOrEditForm.fileList = []
this.addOrEditForm.logo = ''
}
this.$modal.closeLoading()
},
// 详情时预览 LOGO
onViewLogoImg(url) {
this.dialogInnerVisible = true
this.previewUrl = url
},
// 设置默认LOGO
onDefaultLogo() {
this.addOrEditForm.fileList = [
{
url: 'http://36.33.26.201:17788/statics/2025/01/03/logo_20250103151123A002.svg',
},
]
this.addOrEditForm.logo =
'http://36.33.26.201:17788/statics/2025/01/03/logo_20250103151123A002.svg'
},
// 文件个数超出限制
handleExceed() {
this.$modal.msgError(`上传的LOGO数量不能超过 1 个`)
},
// 获取地址
async getAddressListData(parentCode = 0) {
const { data: res } = await getAddressListAPI({ parentCode })
return res
},
// 获取省
async getProvinceData() {
this.provinceList = await this.getAddressListData()
},
// 省change事件
async onChangeProvince(val) {
this.cityList = await this.getAddressListData(val)
},
// 市change事件
async onChangeCity(val) {
this.areaList = await this.getAddressListData(val)
},
async getTemplateListData() {
const { rows: res } = await getTemplateListAPI({
pageNum: 1,
pageSize: 9999,
})
this.templateList = res
console.log(res, '模板列表')
},
},
async mounted() {
this.getProvinceData()
this.getTemplateListData()
if (this.formType === 1 || this.formType === 2) {
const { data: res } = await getDeptDetailsAPI(this.detailsId)
const {
deptName,
deptAbbreviation,
remark,
deptId,
logo,
initPassword,
parentId,
sysUser,
status,
province,
city,
district,
address,
menuTemplateId,
} = res
this.cityList = await this.getAddressListData(province)
this.areaList = await this.getAddressListData(city)
const { userName, nickName, userId, roleId } = sysUser
Object.assign(this.addOrEditForm, {
deptName,
deptAbbreviation,
remark,
deptId,
userId,
logo,
initPassword,
parentId,
phonenumber: userName,
userName,
nickName,
status,
province,
city,
district,
address,
menuTemplateId,
roleId,
fileList: [{ url: logo }],
})
}
if (this.formType === 3) {
this.getConfigKey('sys.user.initPassword').then((res) => {
this.addOrEditForm.initPassword = res.msg
})
}
},
watch: {
formDialogVisible: {
handler(newValue) {
if (!newValue) {
this.$refs.addOrEditFormRef.resetFields()
}
},
deep: true,
},
},
}
</script>
<style lang="scss" scoped>
::v-deep .handle .el-form-item__content {
text-align: right;
}
::v-deep .el-dialog {
display: flex !important;
flex-direction: column !important;
margin: 0 !important;
position: absolute !important;
top: 50% !important;
left: 50% !important;
transform: translate(-50%, -50%) !important;
max-height: 100vh !important;
.el-dialog__body {
flex: 1;
overflow-y: scroll !important;
.el-table__header-wrapper .el-checkbox {
display: none !important;
}
}
.dialog-content {
padding: 20px;
}
}
.upload-container {
display: flex;
align-items: center;
& div:last-child {
font-size: 13px;
padding-left: 20px;
line-height: 2.2;
a {
color: #1890ff;
}
}
}
.view-logo-box {
width: 120px;
height: 120px;
cursor: pointer;
}
::v-deep .el-upload {
width: 120px;
height: 120px;
}
::v-deep .el-upload--picture-card {
line-height: 120px;
}
::v-deep .el-upload-list--picture-card .el-upload-list__item {
width: 120px;
height: 120px;
}
.custom-label {
display: flex;
flex-direction: column;
align-items: flex-end;
}
::v-deep .user-phone-number .el-form-item__label {
display: flex;
justify-content: flex-end;
}
</style>