Skip to content
Toggle navigation
P
Projects
G
Groups
S
Snippets
Help
phsl
/
admin
This project
Loading...
Sign in
Toggle navigation
Go to a project
Project
Repository
Issues
0
Merge Requests
0
Pipelines
Wiki
Snippets
Members
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Commit
ddb76bb1
authored
Aug 18, 2025
by
孙美琪
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
会员中心-客户企业管理修改
parent
81791eaf
Hide whitespace changes
Inline
Side-by-side
Showing
9 changed files
with
436 additions
and
326 deletions
+436
-326
.env.stage
+1
-1
src/api/member/enterprise/index.ts
+8
-5
src/components/Editor/src/Editor.vue
+189
-229
src/layout/components/Setting/src/Setting.vue
+1
-1
src/locales/zh-CN.ts
+2
-2
src/utils/dict.ts
+1
-0
src/views/member/enterprise/EnterpriseForm.vue
+33
-30
src/views/member/enterprise/ReviewForm.vue
+102
-0
src/views/member/enterprise/index.vue
+99
-58
No files found.
.env.stage
View file @
ddb76bb1
...
...
@@ -4,7 +4,7 @@ NODE_ENV=production
VITE_DEV=false
# 请求路径
VITE_BASE_URL='
http://api-dashboard.yudao.iocoder.cn
'
VITE_BASE_URL='
/admin-api
'
# 文件上传类型:server - 后端上传, client - 前端直连上传,仅支持S3服务
VITE_UPLOAD_TYPE=server
...
...
src/api/member/enterprise/index.ts
View file @
ddb76bb1
import
request
from
'@/config/axios'
import
type
{
Dayjs
}
from
'dayjs'
;
/** 客户企业信息 */
export
interface
Enterprise
{
...
...
@@ -31,8 +30,13 @@ export const EnterpriseApi = {
},
// 修改客户企业
updateEnterprise
:
async
(
data
:
Enterprise
)
=>
{
return
await
request
.
put
({
url
:
`/member/enterprise/update`
,
data
})
// updateEnterprise: async (data: Enterprise) => {
// return await request.put({ url: `/member/enterprise/update`, data })
// },
// 审核客户企业
processEnterprise
:
async
(
data
:
Enterprise
)
=>
{
return
await
request
.
put
({
url
:
`/member/enterprise/check`
,
data
})
},
// 删除客户企业
...
...
@@ -49,4 +53,4 @@ export const EnterpriseApi = {
exportEnterprise
:
async
(
params
)
=>
{
return
await
request
.
download
({
url
:
`/member/enterprise/export-excel`
,
params
})
}
}
\ No newline at end of file
}
src/components/Editor/src/Editor.vue
View file @
ddb76bb1
<
script
lang=
"ts"
setup
>
import
{
PropType
}
from
'vue'
import
{
Editor
,
Toolbar
}
from
'@wangeditor/editor-for-vue'
import
{
i18nChangeLanguage
,
IDomEditor
,
IEditorConfig
}
from
'@wangeditor/editor'
import
{
propTypes
}
from
'@/utils/propTypes'
import
{
isNumber
}
from
'@/utils/is'
import
{
ElMessage
}
from
'element-plus'
import
{
useLocaleStore
}
from
'@/store/modules/locale'
import
{
getRefreshToken
,
getTenantId
}
from
'@/utils/auth'
import
{
getUploadUrl
}
from
'@/components/UploadFile/src/useUpload'
defineOptions
({
name
:
'Editor'
})
type
InsertFnType
=
(
url
:
string
,
alt
:
string
,
href
:
string
)
=>
void
const
localeStore
=
useLocaleStore
()
const
currentLocale
=
computed
(()
=>
localeStore
.
getCurrentLocale
)
i18nChangeLanguage
(
unref
(
currentLocale
).
lang
)
const
props
=
defineProps
({
editorId
:
propTypes
.
string
.
def
(
'wangeEditor-1'
),
height
:
propTypes
.
oneOfType
([
Number
,
String
]).
def
(
'500px'
),
editorConfig
:
{
type
:
Object
as
PropType
<
Partial
<
IEditorConfig
>>
,
default
:
()
=>
undefined
},
readonly
:
propTypes
.
bool
.
def
(
false
),
modelValue
:
propTypes
.
string
.
def
(
''
)
})
const
emit
=
defineEmits
([
'change'
,
'update:modelValue'
])
// 编辑器实例,必须用 shallowRef
const
editorRef
=
shallowRef
<
IDomEditor
>
()
const
valueHtml
=
ref
(
''
)
watch
(
()
=>
props
.
modelValue
,
(
val
:
string
)
=>
{
if
(
val
===
unref
(
valueHtml
))
return
valueHtml
.
value
=
val
},
{
immediate
:
true
}
)
// 监听
watch
(
()
=>
valueHtml
.
value
,
(
val
:
string
)
=>
{
emit
(
'update:modelValue'
,
val
)
}
)
const
handleCreated
=
(
editor
:
IDomEditor
)
=>
{
editorRef
.
value
=
editor
}
// 编辑器配置
const
editorConfig
=
computed
(():
IEditorConfig
=>
{
return
Object
.
assign
(
{
placeholder
:
'请输入内容...'
,
readOnly
:
props
.
readonly
,
customAlert
:
(
s
:
string
,
t
:
string
)
=>
{
switch
(
t
)
{
case
'success'
:
ElMessage
.
success
(
s
)
break
case
'info'
:
ElMessage
.
info
(
s
)
break
case
'warning'
:
ElMessage
.
warning
(
s
)
break
case
'error'
:
ElMessage
.
error
(
s
)
break
default
:
ElMessage
.
info
(
s
)
break
}
},
autoFocus
:
false
,
scroll
:
true
,
MENU_CONF
:
{
[
'uploadImage'
]:
{
server
:
getUploadUrl
(),
// 单个文件的最大体积限制,默认为 2M
maxFileSize
:
5
*
1024
*
1024
,
// 最多可上传几个文件,默认为 100
maxNumberOfFiles
:
10
,
// 选择文件时的类型限制,默认为 ['image/*'] 。如不想限制,则设置为 []
allowedFileTypes
:
[
'image/*'
],
// 自定义增加 http header
headers
:
{
Accept
:
'*'
,
Authorization
:
'Bearer '
+
getRefreshToken
(),
// 使用 getRefreshToken() 方法,而不使用 getAccessToken() 方法的原因:Editor 无法方便的刷新访问令牌
'tenant-id'
:
getTenantId
()
},
// 超时时间,默认为 10 秒
timeout
:
15
*
1000
,
// 15 秒
// form-data fieldName,后端接口参数名称,默认值wangeditor-uploaded-image
fieldName
:
'file'
,
<
template
>
<div>
<!-- 工具栏 -->
<Toolbar
:editor=
"editor"
/>
<!-- 编辑器主体,监听 customPaste 事件 -->
<Editor
v-model=
"content"
:defaultConfig=
"editorConfig"
:toolbarConfig=
"toolbarConfig"
@
on-created=
"onCreated"
@
custom-paste=
"customPaste"
/>
</div>
</
template
>
// 上传之前触发
onBeforeUpload
(
file
:
File
)
{
// console.log(file)
return
file
},
// 上传进度的回调函数
onProgress
(
progress
:
number
)
{
// progress 是 0-100 的数字
console
.
log
(
'progress'
,
progress
)
},
onSuccess
(
file
:
File
,
res
:
any
)
{
console
.
log
(
'onSuccess'
,
file
,
res
)
},
onFailed
(
file
:
File
,
res
:
any
)
{
alert
(
res
.
message
)
console
.
log
(
'onFailed'
,
file
,
res
)
},
onError
(
file
:
File
,
err
:
any
,
res
:
any
)
{
alert
(
err
.
message
)
console
.
error
(
'onError'
,
file
,
err
,
res
)
},
// 自定义插入图片
customInsert
(
res
:
any
,
insertFn
:
InsertFnType
)
{
insertFn
(
res
.
data
,
'image'
,
res
.
data
)
<
script
>
import
{
Editor
,
Toolbar
}
from
'@wangeditor/editor-for-vue'
import
{
getUploadUrl
}
from
"@/components/UploadFile/src/useUpload"
;
import
{
getRefreshToken
,
getTenantId
}
from
"@/utils/auth"
;
export
default
{
components
:
{
Editor
,
Toolbar
},
data
()
{
return
{
editor
:
null
,
content
:
''
,
toolbarConfig
:
{
// 可以根据需要配置工具栏项目
placeholder
:
'请输入内容...'
,
customAlert
:
(
s
,
t
)
=>
{
switch
(
t
)
{
case
'success'
:
ElMessage
.
success
(
s
);
break
case
'info'
:
ElMessage
.
info
(
s
);
break
case
'warning'
:
ElMessage
.
warning
(
s
);
break
case
'error'
:
ElMessage
.
error
(
s
);
break
default
:
ElMessage
.
info
(
s
)
}
},
[
'uploadVideo'
]:
{
server
:
getUploadUrl
(),
// 单个文件的最大体积限制,默认为 10M
maxFileSize
:
10
*
1024
*
1024
,
// 最多可上传几个文件,默认为 100
maxNumberOfFiles
:
10
,
// 选择文件时的类型限制,默认为 ['video/*'] 。如不想限制,则设置为 []
allowedFileTypes
:
[
'video/*'
],
// 自定义增加 http header
headers
:
{
Accept
:
'*'
,
Authorization
:
'Bearer '
+
getRefreshToken
(),
// 使用 getRefreshToken() 方法,而不使用 getAccessToken() 方法的原因:Editor 无法方便的刷新访问令牌
'tenant-id'
:
getTenantId
()
},
// 超时时间,默认为 30 秒
timeout
:
15
*
1000
,
// 15 秒
// form-data fieldName,后端接口参数名称,默认值wangeditor-uploaded-image
fieldName
:
'file'
,
// 上传之前触发
onBeforeUpload
(
file
:
File
)
{
// console.log(file)
return
file
autoFocus
:
false
,
scroll
:
true
,
MENU_CONF
:
{
uploadImage
:
{
server
:
getUploadUrl
(),
maxFileSize
:
5
*
1024
*
1024
,
maxNumberOfFiles
:
100
,
allowedFileTypes
:
[
''
],
headers
:
{
Accept
:
'*'
,
Authorization
:
'Bearer '
+
getRefreshToken
(),
'tenant-id'
:
getTenantId
()
},
timeout
:
15
*
1000
,
fieldName
:
'file'
,
onBeforeUpload
(
file
)
{
return
file
},
onProgress
(
progress
)
{
console
.
log
(
'progress'
,
progress
)
},
onSuccess
(
file
,
res
)
{
console
.
log
(
'onSuccess'
,
file
,
res
)
},
onFailed
(
file
,
res
)
{
ElMessage
.
error
(
res
.
message
)
},
onError
(
file
,
err
,
res
)
{
ElMessage
.
error
(
err
.
message
)
},
customInsert
(
res
,
insertFn
)
{
insertFn
(
res
.
data
,
'image'
,
res
.
data
)
}
},
// 上传进度的回调函数
onProgress
(
progress
:
number
)
{
// progress 是 0-100 的数字
console
.
log
(
'progress'
,
progress
)
},
onSuccess
(
file
:
File
,
res
:
any
)
{
console
.
log
(
'onSuccess'
,
file
,
res
)
},
onFailed
(
file
:
File
,
res
:
any
)
{
alert
(
res
.
message
)
console
.
log
(
'onFailed'
,
file
,
res
)
},
onError
(
file
:
File
,
err
:
any
,
res
:
any
)
{
alert
(
err
.
message
)
console
.
error
(
'onError'
,
file
,
err
,
res
)
},
// 自定义插入图片
customInsert
(
res
:
any
,
insertFn
:
InsertFnType
)
{
insertFn
(
res
.
data
,
'mp4'
,
res
.
data
)
uploadVideo
:
{
server
:
getUploadUrl
(),
maxFileSize
:
10
*
1024
*
1024
,
maxNumberOfFiles
:
10
,
allowedFileTypes
:
[
'video/*'
],
headers
:
{
Accept
:
'*'
,
Authorization
:
'Bearer '
+
getRefreshToken
(),
'tenant-id'
:
getTenantId
()
},
timeout
:
15
*
1000
,
fieldName
:
'file'
,
onBeforeUpload
(
file
)
{
return
file
},
onProgress
(
progress
)
{
console
.
log
(
'progress'
,
progress
)
},
onSuccess
(
file
,
res
)
{
console
.
log
(
'onSuccess'
,
file
,
res
)
},
onFailed
(
file
,
res
)
{
ElMessage
.
error
(
res
.
message
)
},
onError
(
file
,
err
,
res
)
{
ElMessage
.
error
(
err
.
message
)
},
customInsert
(
res
,
insertFn
)
{
insertFn
(
res
.
data
,
'mp4'
,
res
.
data
)
}
}
}
},
uploadImgShowBase64
:
true
},
uploadImgShowBase64
:
true
editorConfig
:
{
placeholder
:
'请输入内容...'
}
}
},
methods
:
{
// 编辑器创建后保存实例
onCreated
(
editorInstance
)
{
this
.
editor
=
editorInstance
},
props
.
editorConfig
||
{}
)
})
const
editorStyle
=
computed
(()
=>
{
return
{
height
:
isNumber
(
props
.
height
)
?
`
${
props
.
height
}
px`
:
props
.
height
}
})
// 回调函数
const
handleChange
=
(
editor
:
IDomEditor
)
=>
{
emit
(
'change'
,
editor
)
}
// 组件销毁时,及时销毁编辑器
onBeforeUnmount
(()
=>
{
const
editor
=
unref
(
editorRef
.
value
)
// 自定义粘贴事件处理
async
customPaste
(
editor
,
event
)
{
const
clipboardData
=
event
.
clipboardData
if
(
!
clipboardData
)
{
return
true
// 如果没有剪贴板数据则使用默认
}
// 获取粘贴的 HTML 和 RTF 内容
const
html
=
clipboardData
.
getData
(
'text/html'
)
const
rtf
=
clipboardData
.
getData
(
'text/rtf'
)
// 只有在 HTML 和 RTF 同时存在(通常是来自 Word/WPS)时才自定义处理
if
(
html
&&
rtf
)
{
// 使用 DOMParser 解析 HTML
const
parser
=
new
DOMParser
()
const
doc
=
parser
.
parseFromString
(
html
,
'text/html'
)
const
imgTags
=
doc
.
querySelectorAll
(
'img'
)
if
(
imgTags
.
length
>
0
)
{
// 从剪贴板项中提取文件(图片)对象列表
const
items
=
clipboardData
.
items
const
files
=
[]
for
(
const
item
of
items
)
{
if
(
item
.
kind
===
'file'
)
{
const
file
=
item
.
getAsFile
()
if
(
file
)
{
files
.
push
(
file
)
}
}
}
// 销毁,并移除 editor
editor
?.
destroy
()
})
// 依次处理每个
<
img
>
标签
let
fileIndex
=
0
for
(
const
img
of
imgTags
)
{
const
src
=
img
.
getAttribute
(
'src'
)
||
''
// 如果 src 是本地文件路径(file:// 开头)
if
(
src
.
startsWith
(
'file://'
))
{
if
(
fileIndex
<
files
.
length
)
{
const
file
=
files
[
fileIndex
++
]
// 通过指定的上传接口上传文件
const
uploadUrl
=
getUploadUrl
()
// 请实现该函数返回上传端点
const
formData
=
new
FormData
()
formData
.
append
(
'file'
,
file
)
try
{
const
response
=
await
fetch
(
uploadUrl
,
{
method
:
'POST'
,
body
:
formData
})
const
data
=
await
response
.
json
()
// 假设返回的 JSON 中包含字段 `url` 为图片线上地址
const
url
=
data
.
url
if
(
url
)
{
img
.
setAttribute
(
'src'
,
url
)
}
else
{
// 上传成功但无 URL,移除图片
img
.
remove
()
}
}
catch
(
err
)
{
console
.
error
(
'图片上传失败:'
,
err
)
img
.
remove
()
}
}
else
{
// 剪贴板文件不够用,移除此
<
img
>
img
.
remove
()
}
}
}
}
const
getEditorRef
=
async
():
Promise
<
IDomEditor
>
=>
{
await
nextTick
()
return
unref
(
editorRef
.
value
)
as
IDomEditor
// 最终 HTML 内容
const
finalHtml
=
doc
.
body
.
innerHTML
// 将处理后的内容插入编辑器
editor
.
dangerouslyInsertHtml
(
finalHtml
)
// 阻止默认粘贴(已由我们手动插入)
event
.
preventDefault
()
return
false
}
// 其他情况使用默认粘贴行为
return
true
}
}
}
defineExpose
({
getEditorRef
})
</
script
>
<
template
>
<div
class=
"border-1 border-solid border-[var(--tags-view-border-color)] z-10"
>
<!-- 工具栏 -->
<Toolbar
:editor=
"editorRef"
:editorId=
"editorId"
class=
"border-0 b-b-1 border-solid border-[var(--tags-view-border-color)]"
/>
<!-- 编辑器 -->
<Editor
v-model=
"valueHtml"
:defaultConfig=
"editorConfig"
:editorId=
"editorId"
:style=
"editorStyle"
@
on-change=
"handleChange"
@
on-created=
"handleCreated"
/>
</div>
</
template
>
<
style
src=
"@wangeditor/editor/dist/css/style.css"
></
style
>
src/layout/components/Setting/src/Setting.vue
View file @
ddb76bb1
...
...
@@ -201,7 +201,7 @@ const clear = () => {
<
template
>
<div
v-if=
"
fals
e"
v-if=
"
tru
e"
:class=
"prefixCls"
class=
"fixed right-0 top-[45%] h-40px w-40px cursor-pointer bg-[var(--el-color-primary)] text-center leading-40px"
@
click=
"drawer = true"
...
...
src/locales/zh-CN.ts
View file @
ddb76bb1
...
...
@@ -317,8 +317,8 @@ export default {
bannerUpdate
:
'修改banner页管理'
,
computilityCreate
:
'添加计算资源首页管理'
,
computilityUpdate
:
'修改计算资源首页管理'
,
assemblyCreate
:
'添加
组件管理
'
,
assemblyUpdate
:
'修改
组件管理
'
,
assemblyCreate
:
'添加
行业应用
'
,
assemblyUpdate
:
'修改
行业应用
'
,
informationCreate
:
'添加活动资源管理'
,
informationUpdate
:
'修改活动资源管理'
,
},
...
...
src/utils/dict.ts
View file @
ddb76bb1
...
...
@@ -167,6 +167,7 @@ export enum DICT_TYPE {
// ========== Member 会员模块 ==========
MEMBER_POINT_BIZ_TYPE
=
'member_point_biz_type'
,
// 积分的业务类型
MEMBER_EXPERIENCE_BIZ_TYPE
=
'member_experience_biz_type'
,
// 会员经验业务类型
CHECK_STATUS
=
'check_status'
,
// 客户企业管理审核
// ========== MALL - 商品模块 ==========
PRODUCT_SPU_STATUS
=
'product_spu_status'
,
//商品状态
...
...
src/views/member/enterprise/EnterpriseForm.vue
View file @
ddb76bb1
...
...
@@ -2,33 +2,49 @@
<Dialog
:title=
"dialogTitle"
v-model=
"dialogVisible"
>
<el-form
ref=
"formRef"
disabled
:model=
"formData"
:rules=
"formRules"
label-width=
"100px"
v-loading=
"formLoading"
>
<el-form-item
label=
"
member用户id"
prop=
"memberUserId
"
>
<el-input
v-model=
"formData.
memberUserId"
placeholder=
"请输入member用户id
"
/>
<el-form-item
label=
"
姓名"
prop=
"contactName
"
>
<el-input
v-model=
"formData.
contactName
"
/>
</el-form-item>
<el-form-item
label=
"企业名称"
prop=
"name"
>
<el-input
v-model=
"formData.name"
placeholder=
"请输入企业名称"
/>
<el-form-item
label=
"身份证"
prop=
"identityCard"
>
<el-input
v-model=
"formData.identityCard"
/>
</el-form-item>
<el-form-item
label=
"身份证图片"
>
<UploadImg
v-model=
"formData.nationalEmblemFace"
:disabled=
"true"
/>
<UploadImg
v-model=
"formData.portraitFace"
:disabled=
"true"
/>
</el-form-item>
<el-form-item
label=
"企业名称"
prop=
"enterpriseName"
>
<el-input
v-model=
"formData.enterpriseName"
/>
</el-form-item>
<el-form-item
label=
"法人"
prop=
"legalPerson"
>
<el-input
v-model=
"formData.legalPerson"
placeholder=
"请输入法人"
/>
<el-input
v-model=
"formData.legalPerson"
/>
</el-form-item>
<el-form-item
label=
"企业营业执照"
prop=
"businessLicense"
>
<UploadImg
v-model=
"formData.businessLicense"
:disabled=
"true"
/>
</el-form-item>
<el-form-item
label=
"联系电话"
prop=
"mo
ib
le"
>
<el-input
v-model=
"formData.mo
ible"
placeholder=
"请输入联系电话
"
/>
<el-form-item
label=
"联系电话"
prop=
"mo
bi
le"
>
<el-input
v-model=
"formData.mo
bile
"
/>
</el-form-item>
<el-form-item
label=
"承诺书"
prop=
"letterOfCommitment"
>
<UploadImg
v-model=
"formData.letterOfCommitment"
/>
<UploadImg
v-model=
"formData.letterOfCommitment"
:disabled=
"true"
/>
</el-form-item>
<el-form-item
label=
"
是否审核
"
prop=
"status"
>
<el-form-item
label=
"
审核状态
"
prop=
"status"
>
<el-radio-group
v-model=
"formData.status"
>
<el-radio
value=
"1"
>
请选择字典生成
</el-radio>
<el-radio
v-for=
"dict in getIntDictOptions(DICT_TYPE.CHECK_STATUS)"
:key=
"dict.value"
:label=
"dict.label"
:value=
"dict.value"
/>
</el-radio-group>
</el-form-item>
<el-form-item
label=
"备注"
prop=
"remark"
>
<el-input
v-model=
"formData.remark"
placeholder=
"请输入备注"
/>
<el-input
v-model=
"formData.remark"
/>
</el-form-item>
</el-form>
<template
#
footer
>
...
...
@@ -39,6 +55,7 @@
</template>
<
script
setup
lang=
"ts"
>
import
{
EnterpriseApi
,
Enterprise
}
from
'@/api/member/enterprise'
import
{
DICT_TYPE
,
getIntDictOptions
}
from
'@/utils/dict'
/** 客户企业 表单 */
defineOptions
({
name
:
'EnterpriseForm'
})
...
...
@@ -52,28 +69,20 @@ const formLoading = ref(false) // 表单的加载中:1)修改时的数据加
const
formType
=
ref
(
''
)
// 表单的类型:create - 新增;update - 修改
const
formData
=
ref
({
id
:
undefined
,
memberUserId
:
undefined
,
name
:
undefined
,
legalPerson
:
undefined
,
moible
:
undefined
,
letterOfCommitment
:
undefined
,
status
:
undefined
,
remark
:
undefined
})
const
formRules
=
reactive
({
memberUserId
:
[{
required
:
true
,
message
:
'member用户id不能为空'
,
trigger
:
'blur'
}],
name
:
[{
required
:
true
,
message
:
'企业名称不能为空'
,
trigger
:
'blur'
}],
legalPerson
:
[{
required
:
true
,
message
:
'法人不能为空'
,
trigger
:
'blur'
}],
moible
:
[{
required
:
true
,
message
:
'联系电话不能为空'
,
trigger
:
'blur'
}],
letterOfCommitment
:
[{
required
:
true
,
message
:
'承诺书不能为空'
,
trigger
:
'blur'
}],
status
:
[{
required
:
true
,
message
:
'是否审核不能为空'
,
trigger
:
'blur'
}]
status
:
[{
required
:
true
,
message
:
'审核状态不能为空'
,
trigger
:
'blur'
}]
})
const
formRef
=
ref
()
// 表单 Ref
/** 打开弹窗 */
const
open
=
async
(
type
:
string
,
id
?:
number
)
=>
{
console
.
log
(
type
,
'type'
)
dialogVisible
.
value
=
true
dialogTitle
.
value
=
t
(
'action.'
+
type
)
// dialogTitle.value = '审核'
formType
.
value
=
type
resetForm
()
// 修改时,设置数据
...
...
@@ -101,7 +110,7 @@ const submitForm = async () => {
await
EnterpriseApi
.
createEnterprise
(
data
)
message
.
success
(
t
(
'common.createSuccess'
))
}
else
{
await
EnterpriseApi
.
update
Enterprise
(
data
)
await
EnterpriseApi
.
process
Enterprise
(
data
)
message
.
success
(
t
(
'common.updateSuccess'
))
}
dialogVisible
.
value
=
false
...
...
@@ -116,14 +125,9 @@ const submitForm = async () => {
const
resetForm
=
()
=>
{
formData
.
value
=
{
id
:
undefined
,
memberUserId
:
undefined
,
name
:
undefined
,
legalPerson
:
undefined
,
moible
:
undefined
,
letterOfCommitment
:
undefined
,
status
:
undefined
,
remark
:
undefined
}
formRef
.
value
?.
resetFields
()
}
</
script
>
\ No newline at end of file
</
script
>
src/views/member/enterprise/ReviewForm.vue
0 → 100644
View file @
ddb76bb1
<
template
>
<Dialog
title=
"审核"
v-model=
"dialogVisible"
width=
"600"
>
<el-form
ref=
"formRef"
:model=
"formData"
:rules=
"formRules"
label-width=
"100px"
v-loading=
"formLoading"
>
<el-form-item
label=
"审核状态"
prop=
"status"
>
<el-radio-group
v-model=
"formData.status"
>
<el-radio
v-for=
"dict in getIntDictOptions(DICT_TYPE.CHECK_STATUS)"
:key=
"dict.value"
:label=
"dict.label"
:value=
"dict.value"
/>
</el-radio-group>
</el-form-item>
<el-form-item
label=
"备注"
prop=
"remark"
>
<el-input
v-model=
"formData.remark"
placeholder=
"请输入备注"
/>
</el-form-item>
</el-form>
<template
#
footer
>
<el-button
@
click=
"submitForm"
type=
"primary"
:disabled=
"formLoading"
>
确 定
</el-button>
<el-button
@
click=
"dialogVisible = false"
>
取 消
</el-button>
</
template
>
</Dialog>
</template>
<
script
setup
lang=
"ts"
>
import
{
EnterpriseApi
,
Enterprise
}
from
'@/api/member/enterprise'
import
{
DICT_TYPE
,
getIntDictOptions
}
from
'@/utils/dict'
/** 客户企业 表单 */
defineOptions
({
name
:
'ReviewForm'
})
const
{
t
}
=
useI18n
()
// 国际化
const
message
=
useMessage
()
// 消息弹窗
const
dialogVisible
=
ref
(
false
)
// 弹窗的是否展示
const
dialogTitle
=
ref
(
''
)
// 弹窗的标题
const
formLoading
=
ref
(
false
)
// 表单的加载中:1)修改时的数据加载;2)提交的按钮禁用
const
formType
=
ref
(
''
)
// 表单的类型:create - 新增;update - 修改
const
formData
=
ref
({
id
:
undefined
,
status
:
undefined
,
remark
:
undefined
})
const
formRules
=
reactive
({
status
:
[{
required
:
true
,
message
:
'审核状态不能为空'
,
trigger
:
'blur'
}]
})
const
formRef
=
ref
()
// 表单 Ref
/** 打开弹窗 */
const
open
=
async
(
type
:
string
,
id
?:
number
)
=>
{
console
.
log
(
type
,
'type'
)
dialogVisible
.
value
=
true
dialogTitle
.
value
=
t
(
'action.'
+
type
)
// dialogTitle.value = '审核'
formType
.
value
=
type
resetForm
()
// 修改时,设置数据
if
(
id
)
{
formLoading
.
value
=
true
try
{
formData
.
value
=
await
EnterpriseApi
.
getEnterprise
(
id
)
}
finally
{
formLoading
.
value
=
false
}
}
}
defineExpose
({
open
})
// 提供 open 方法,用于打开弹窗
/** 提交表单 */
const
emit
=
defineEmits
([
'success'
])
// 定义 success 事件,用于操作成功后的回调
const
submitForm
=
async
()
=>
{
// 校验表单
await
formRef
.
value
.
validate
()
// 提交请求
formLoading
.
value
=
true
try
{
const
data
=
formData
.
value
as
unknown
as
Enterprise
await
EnterpriseApi
.
processEnterprise
(
data
)
message
.
success
(
t
(
'common.updateSuccess'
))
dialogVisible
.
value
=
false
// 发送操作成功的事件
emit
(
'success'
)
}
finally
{
formLoading
.
value
=
false
}
}
/** 重置表单 */
const
resetForm
=
()
=>
{
formData
.
value
=
{
id
:
undefined
,
status
:
undefined
,
remark
:
undefined
}
formRef
.
value
?.
resetFields
()
}
</
script
>
src/views/member/enterprise/index.vue
View file @
ddb76bb1
...
...
@@ -6,20 +6,19 @@
:model=
"queryParams"
ref=
"queryFormRef"
:inline=
"true"
label-width=
"68px"
>
<el-form-item
label=
"
member用户id"
prop=
"memberUserId
"
>
<el-form-item
label=
"
姓名"
prop=
"contactName
"
>
<el-input
v-model=
"queryParams.
memberUserId
"
placeholder=
"请输入
member用户id
"
v-model=
"queryParams.
contactName
"
placeholder=
"请输入
姓名
"
clearable
@
keyup
.
enter=
"handleQuery"
class=
"!w-240px"
/>
</el-form-item>
<el-form-item
label=
"企业名称"
prop=
"
n
ame"
>
<el-form-item
label=
"企业名称"
prop=
"
enterpriseN
ame"
>
<el-input
v-model=
"queryParams.
n
ame"
v-model=
"queryParams.
enterpriseN
ame"
placeholder=
"请输入企业名称"
clearable
@
keyup
.
enter=
"handleQuery"
...
...
@@ -35,23 +34,28 @@
class=
"!w-240px"
/>
</el-form-item>
<el-form-item
label=
"联系电话"
prop=
"mo
ib
le"
>
<el-form-item
label=
"联系电话"
prop=
"mo
bi
le"
>
<el-input
v-model=
"queryParams.mo
ib
le"
v-model=
"queryParams.mo
bi
le"
placeholder=
"请输入联系电话"
clearable
@
keyup
.
enter=
"handleQuery"
class=
"!w-240px"
/>
</el-form-item>
<el-form-item
label=
"
是否审核
"
prop=
"status"
>
<el-form-item
label=
"
审核状态
"
prop=
"status"
>
<el-select
v-model=
"queryParams.status"
placeholder=
"请选择
是否审核
"
placeholder=
"请选择
审核状态
"
clearable
class=
"!w-240px"
>
<el-option
label=
"请选择字典生成"
value=
""
/>
<el-option
v-for=
"dict in getIntDictOptions(DICT_TYPE.CHECK_STATUS)"
:key=
"dict.value"
:label=
"dict.label"
:value=
"dict.value"
/>
</el-select>
</el-form-item>
<el-form-item
label=
"创建时间"
prop=
"createTime"
>
...
...
@@ -66,15 +70,13 @@
/>
</el-form-item>
<el-form-item>
<el-button
@
click=
"handleQuery"
><Icon
icon=
"ep:search"
class=
"mr-5px"
/>
搜索
</el-button>
<el-button
@
click=
"resetQuery"
><Icon
icon=
"ep:refresh"
class=
"mr-5px"
/>
重置
</el-button>
<el-button
type=
"primary"
plain
@
click=
"openForm('create')"
v-hasPermi=
"['member:enterprise:create']"
>
<Icon
icon=
"ep:plus"
class=
"mr-5px"
/>
新增
<el-button
type=
"primary"
@
click=
"handleQuery"
>
<Icon
icon=
"ep:search"
class=
"mr-5px"
/>
搜索
</el-button>
<el-button
@
click=
"resetQuery"
>
<Icon
icon=
"ep:refresh"
class=
"mr-5px"
/>
重置
</el-button>
<el-button
type=
"success"
...
...
@@ -83,16 +85,8 @@
:loading=
"exportLoading"
v-hasPermi=
"['member:enterprise:export']"
>
<Icon
icon=
"ep:download"
class=
"mr-5px"
/>
导出
</el-button>
<el-button
type=
"danger"
plain
:disabled=
"isEmpty(checkedIds)"
@
click=
"handleDeleteBatch"
v-hasPermi=
"['member:enterprise:delete']"
>
<Icon
icon=
"ep:delete"
class=
"mr-5px"
/>
批量删除
<Icon
icon=
"ep:download"
class=
"mr-5px"
/>
导出
</el-button>
</el-form-item>
</el-form>
...
...
@@ -101,21 +95,51 @@
<!-- 列表 -->
<ContentWrap>
<el-table
row-key=
"id"
v-loading=
"loading"
:data=
"list"
:stripe=
"true"
:show-overflow-tooltip=
"true"
@
selection-change=
"handleRowCheckboxChange"
row-key=
"id"
v-loading=
"loading"
:data=
"list"
:stripe=
"true"
:show-overflow-tooltip=
"true"
@
selection-change=
"handleRowCheckboxChange"
>
<el-table-column
type=
"selection"
width=
"55"
/>
<el-table-column
label=
"主键"
align=
"center"
prop=
"id"
/>
<el-table-column
label=
"member用户id"
align=
"center"
prop=
"memberUserId"
/>
<el-table-column
label=
"企业名称"
align=
"center"
prop=
"name"
/>
<el-table-column
type=
"selection"
width=
"55"
/>
<el-table-column
label=
"姓名"
align=
"center"
prop=
"contactName"
/>
<el-table-column
label=
"身份证号"
align=
"center"
prop=
"identityCard"
/>
<el-table-column
label=
"身份证国徽面"
>
<template
#
default=
"scope"
>
<el-image
:src=
"scope.row.nationalEmblemFace"
class=
"h-36px"
@
click=
"imagePreview(scope.row.nationalEmblemFace)"
/>
</
template
>
</el-table-column>
<el-table-column
label=
"身份证人像面"
>
<
template
#
default=
"scope"
>
<el-image
:src=
"scope.row.portraitFace"
class=
"h-36px"
@
click=
"imagePreview(scope.row.portraitFace)"
/>
</
template
>
</el-table-column>
<el-table-column
label=
"企业名称"
align=
"center"
prop=
"enterpriseName"
/>
<el-table-column
label=
"法人"
align=
"center"
prop=
"legalPerson"
/>
<el-table-column
label=
"联系电话"
align=
"center"
prop=
"moible"
/>
<el-table-column
label=
"承诺书"
align=
"center"
prop=
"letterOfCommitment"
/>
<el-table-column
label=
"是否审核"
align=
"center"
prop=
"status"
/>
<el-table-column
label=
"联系电话"
align=
"center"
prop=
"mobile"
/>
<el-table-column
label=
"承诺书"
align=
"center"
prop=
"letterOfCommitment"
>
<
template
#
default=
"scope"
>
<el-image
:src=
"scope.row.letterOfCommitment"
class=
"h-36px"
@
click=
"imagePreview(scope.row.letterOfCommitment)"
/>
</
template
>
</el-table-column>
<el-table-column
label=
"审核状态"
align=
"center"
prop=
"status"
>
<
template
#
default=
"scope"
>
<dict-tag
:type=
"DICT_TYPE.CHECK_STATUS"
:value=
"scope.row.status"
/>
</
template
>
</el-table-column>
<el-table-column
label=
"创建时间"
align=
"center"
...
...
@@ -126,20 +150,15 @@
<el-table-column
label=
"操作"
align=
"center"
min-width=
"120px"
>
<
template
#
default=
"scope"
>
<el-button
v-if=
"scope.row.status === 0"
link
type=
"primary"
@
click=
"openForm('update', scope.row.id)"
v-hasPermi=
"['member:enterprise:update']"
>
编辑
审核
</el-button>
<el-button
link
type=
"danger"
@
click=
"handleDelete(scope.row.id)"
v-hasPermi=
"['member:enterprise:delete']"
>
删除
<el-button
link
type=
"primary"
@
click=
"openForm('detail', scope.row.id)"
>
详情
</el-button>
</
template
>
</el-table-column>
...
...
@@ -155,14 +174,18 @@
<!-- 表单弹窗:添加/修改 -->
<EnterpriseForm
ref=
"formRef"
@
success=
"getList"
/>
<review-form
ref=
"reviewRef"
@
success=
"getList"
/>
</template>
<
script
setup
lang=
"ts"
>
import
{
is
Empt
y
}
from
'@/utils/is'
import
{
is
Arra
y
}
from
'@/utils/is'
import
{
dateFormatter
}
from
'@/utils/formatTime'
import
download
from
'@/utils/download'
import
{
EnterpriseApi
,
Enterprise
}
from
'@/api/member/enterprise'
import
EnterpriseForm
from
'./EnterpriseForm.vue'
import
ReviewForm
from
'./ReviewForm.vue'
import
{
createImageViewer
}
from
'@/components/ImageViewer'
import
{
DICT_TYPE
,
getIntDictOptions
}
from
'@/utils/dict'
/** 客户企业 列表 */
defineOptions
({
name
:
'Enterprise'
})
...
...
@@ -212,7 +235,12 @@ const resetQuery = () => {
/** 添加/修改操作 */
const
formRef
=
ref
()
const
reviewRef
=
ref
()
const
openForm
=
(
type
:
string
,
id
?:
number
)
=>
{
if
(
type
===
'update'
)
{
reviewRef
.
value
.
open
(
type
,
id
)
return
}
formRef
.
value
.
open
(
type
,
id
)
}
...
...
@@ -234,15 +262,29 @@ const handleDeleteBatch = async () => {
try
{
// 删除的二次确认
await
message
.
delConfirm
()
await
EnterpriseApi
.
deleteEnterpriseList
(
checkedIds
.
value
)
;
await
EnterpriseApi
.
deleteEnterpriseList
(
checkedIds
.
value
)
message
.
success
(
t
(
'common.delSuccess'
))
await
getList
()
;
await
getList
()
}
catch
{}
}
const
imagePreview
=
(
args
)
=>
{
const
urlList
=
[]
if
(
isArray
(
args
))
{
args
.
forEach
((
item
)
=>
{
urlList
.
push
(
item
.
url
)
})
}
else
{
urlList
.
push
(
args
)
}
createImageViewer
({
urlList
})
}
const
checkedIds
=
ref
<
number
[]
>
([])
const
handleRowCheckboxChange
=
(
records
:
Enterprise
[])
=>
{
checkedIds
.
value
=
records
.
map
((
item
)
=>
item
.
id
)
;
checkedIds
.
value
=
records
.
map
((
item
)
=>
item
.
id
)
}
/** 导出按钮操作 */
...
...
@@ -264,4 +306,4 @@ const handleExport = async () => {
onMounted
(()
=>
{
getList
()
})
</
script
>
\ No newline at end of file
</
script
>
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment