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
...
@@ -4,7 +4,7 @@ NODE_ENV=production
VITE_DEV=false
VITE_DEV=false
# 请求路径
# 请求路径
VITE_BASE_URL='
http://api-dashboard.yudao.iocoder.cn
'
VITE_BASE_URL='
/admin-api
'
# 文件上传类型:server - 后端上传, client - 前端直连上传,仅支持S3服务
# 文件上传类型:server - 后端上传, client - 前端直连上传,仅支持S3服务
VITE_UPLOAD_TYPE=server
VITE_UPLOAD_TYPE=server
...
...
src/api/member/enterprise/index.ts
View file @
ddb76bb1
import
request
from
'@/config/axios'
import
request
from
'@/config/axios'
import
type
{
Dayjs
}
from
'dayjs'
;
/** 客户企业信息 */
/** 客户企业信息 */
export
interface
Enterprise
{
export
interface
Enterprise
{
...
@@ -31,8 +30,13 @@ export const EnterpriseApi = {
...
@@ -31,8 +30,13 @@ export const EnterpriseApi = {
},
},
// 修改客户企业
// 修改客户企业
updateEnterprise
:
async
(
data
:
Enterprise
)
=>
{
// updateEnterprise: async (data: Enterprise) => {
return
await
request
.
put
({
url
:
`/member/enterprise/update`
,
data
})
// 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 = {
...
@@ -49,4 +53,4 @@ export const EnterpriseApi = {
exportEnterprise
:
async
(
params
)
=>
{
exportEnterprise
:
async
(
params
)
=>
{
return
await
request
.
download
({
url
:
`/member/enterprise/export-excel`
,
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
>
<
template
>
import
{
PropType
}
from
'vue'
<div>
import
{
Editor
,
Toolbar
}
from
'@wangeditor/editor-for-vue'
<!-- 工具栏 -->
import
{
i18nChangeLanguage
,
IDomEditor
,
IEditorConfig
}
from
'@wangeditor/editor'
<Toolbar
:editor=
"editor"
/>
import
{
propTypes
}
from
'@/utils/propTypes'
<!-- 编辑器主体,监听 customPaste 事件 -->
import
{
isNumber
}
from
'@/utils/is'
<Editor
import
{
ElMessage
}
from
'element-plus'
v-model=
"content"
import
{
useLocaleStore
}
from
'@/store/modules/locale'
:defaultConfig=
"editorConfig"
import
{
getRefreshToken
,
getTenantId
}
from
'@/utils/auth'
:toolbarConfig=
"toolbarConfig"
import
{
getUploadUrl
}
from
'@/components/UploadFile/src/useUpload'
@
on-created=
"onCreated"
@
custom-paste=
"customPaste"
defineOptions
({
name
:
'Editor'
})
/>
</div>
type
InsertFnType
=
(
url
:
string
,
alt
:
string
,
href
:
string
)
=>
void
</
template
>
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'
,
// 上传之前触发
<
script
>
onBeforeUpload
(
file
:
File
)
{
import
{
Editor
,
Toolbar
}
from
'@wangeditor/editor-for-vue'
// console.log(file)
import
{
getUploadUrl
}
from
"@/components/UploadFile/src/useUpload"
;
return
file
import
{
getRefreshToken
,
getTenantId
}
from
"@/utils/auth"
;
},
// 上传进度的回调函数
export
default
{
onProgress
(
progress
:
number
)
{
components
:
{
Editor
,
Toolbar
},
// progress 是 0-100 的数字
data
()
{
console
.
log
(
'progress'
,
progress
)
return
{
},
editor
:
null
,
onSuccess
(
file
:
File
,
res
:
any
)
{
content
:
''
,
console
.
log
(
'onSuccess'
,
file
,
res
)
toolbarConfig
:
{
},
// 可以根据需要配置工具栏项目
onFailed
(
file
:
File
,
res
:
any
)
{
placeholder
:
'请输入内容...'
,
alert
(
res
.
message
)
customAlert
:
(
s
,
t
)
=>
{
console
.
log
(
'onFailed'
,
file
,
res
)
switch
(
t
)
{
},
case
'success'
:
ElMessage
.
success
(
s
);
break
onError
(
file
:
File
,
err
:
any
,
res
:
any
)
{
case
'info'
:
ElMessage
.
info
(
s
);
break
alert
(
err
.
message
)
case
'warning'
:
ElMessage
.
warning
(
s
);
break
console
.
error
(
'onError'
,
file
,
err
,
res
)
case
'error'
:
ElMessage
.
error
(
s
);
break
},
default
:
ElMessage
.
info
(
s
)
// 自定义插入图片
customInsert
(
res
:
any
,
insertFn
:
InsertFnType
)
{
insertFn
(
res
.
data
,
'image'
,
res
.
data
)
}
}
},
},
[
'uploadVideo'
]:
{
autoFocus
:
false
,
server
:
getUploadUrl
(),
scroll
:
true
,
// 单个文件的最大体积限制,默认为 10M
MENU_CONF
:
{
maxFileSize
:
10
*
1024
*
1024
,
uploadImage
:
{
// 最多可上传几个文件,默认为 100
server
:
getUploadUrl
(),
maxNumberOfFiles
:
10
,
maxFileSize
:
5
*
1024
*
1024
,
// 选择文件时的类型限制,默认为 ['video/*'] 。如不想限制,则设置为 []
maxNumberOfFiles
:
100
,
allowedFileTypes
:
[
'video/*'
],
allowedFileTypes
:
[
''
],
headers
:
{
// 自定义增加 http header
Accept
:
'*'
,
headers
:
{
Authorization
:
'Bearer '
+
getRefreshToken
(),
Accept
:
'*'
,
'tenant-id'
:
getTenantId
()
Authorization
:
'Bearer '
+
getRefreshToken
(),
// 使用 getRefreshToken() 方法,而不使用 getAccessToken() 方法的原因:Editor 无法方便的刷新访问令牌
},
'tenant-id'
:
getTenantId
()
timeout
:
15
*
1000
,
},
fieldName
:
'file'
,
onBeforeUpload
(
file
)
{
// 超时时间,默认为 30 秒
return
file
timeout
:
15
*
1000
,
// 15 秒
},
onProgress
(
progress
)
{
// form-data fieldName,后端接口参数名称,默认值wangeditor-uploaded-image
console
.
log
(
'progress'
,
progress
)
fieldName
:
'file'
,
},
onSuccess
(
file
,
res
)
{
// 上传之前触发
console
.
log
(
'onSuccess'
,
file
,
res
)
onBeforeUpload
(
file
:
File
)
{
},
// console.log(file)
onFailed
(
file
,
res
)
{
return
file
ElMessage
.
error
(
res
.
message
)
},
onError
(
file
,
err
,
res
)
{
ElMessage
.
error
(
err
.
message
)
},
customInsert
(
res
,
insertFn
)
{
insertFn
(
res
.
data
,
'image'
,
res
.
data
)
}
},
},
// 上传进度的回调函数
uploadVideo
:
{
onProgress
(
progress
:
number
)
{
server
:
getUploadUrl
(),
// progress 是 0-100 的数字
maxFileSize
:
10
*
1024
*
1024
,
console
.
log
(
'progress'
,
progress
)
maxNumberOfFiles
:
10
,
},
allowedFileTypes
:
[
'video/*'
],
onSuccess
(
file
:
File
,
res
:
any
)
{
headers
:
{
console
.
log
(
'onSuccess'
,
file
,
res
)
Accept
:
'*'
,
},
Authorization
:
'Bearer '
+
getRefreshToken
(),
onFailed
(
file
:
File
,
res
:
any
)
{
'tenant-id'
:
getTenantId
()
alert
(
res
.
message
)
},
console
.
log
(
'onFailed'
,
file
,
res
)
timeout
:
15
*
1000
,
},
fieldName
:
'file'
,
onError
(
file
:
File
,
err
:
any
,
res
:
any
)
{
onBeforeUpload
(
file
)
{
alert
(
err
.
message
)
return
file
console
.
error
(
'onError'
,
file
,
err
,
res
)
},
},
onProgress
(
progress
)
{
// 自定义插入图片
console
.
log
(
'progress'
,
progress
)
customInsert
(
res
:
any
,
insertFn
:
InsertFnType
)
{
},
insertFn
(
res
.
data
,
'mp4'
,
res
.
data
)
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
(()
=>
{
async
customPaste
(
editor
,
event
)
{
const
editor
=
unref
(
editorRef
.
value
)
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
// 依次处理每个
<
img
>
标签
editor
?.
destroy
()
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
>
=>
{
// 最终 HTML 内容
await
nextTick
()
const
finalHtml
=
doc
.
body
.
innerHTML
return
unref
(
editorRef
.
value
)
as
IDomEditor
// 将处理后的内容插入编辑器
editor
.
dangerouslyInsertHtml
(
finalHtml
)
// 阻止默认粘贴(已由我们手动插入)
event
.
preventDefault
()
return
false
}
// 其他情况使用默认粘贴行为
return
true
}
}
}
}
defineExpose
({
getEditorRef
})
</
script
>
</
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
>
<
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 = () => {
...
@@ -201,7 +201,7 @@ const clear = () => {
<
template
>
<
template
>
<div
<div
v-if=
"
fals
e"
v-if=
"
tru
e"
:class=
"prefixCls"
:class=
"prefixCls"
class=
"fixed right-0 top-[45%] h-40px w-40px cursor-pointer bg-[var(--el-color-primary)] text-center leading-40px"
class=
"fixed right-0 top-[45%] h-40px w-40px cursor-pointer bg-[var(--el-color-primary)] text-center leading-40px"
@
click=
"drawer = true"
@
click=
"drawer = true"
...
...
src/locales/zh-CN.ts
View file @
ddb76bb1
...
@@ -317,8 +317,8 @@ export default {
...
@@ -317,8 +317,8 @@ export default {
bannerUpdate
:
'修改banner页管理'
,
bannerUpdate
:
'修改banner页管理'
,
computilityCreate
:
'添加计算资源首页管理'
,
computilityCreate
:
'添加计算资源首页管理'
,
computilityUpdate
:
'修改计算资源首页管理'
,
computilityUpdate
:
'修改计算资源首页管理'
,
assemblyCreate
:
'添加
组件管理
'
,
assemblyCreate
:
'添加
行业应用
'
,
assemblyUpdate
:
'修改
组件管理
'
,
assemblyUpdate
:
'修改
行业应用
'
,
informationCreate
:
'添加活动资源管理'
,
informationCreate
:
'添加活动资源管理'
,
informationUpdate
:
'修改活动资源管理'
,
informationUpdate
:
'修改活动资源管理'
,
},
},
...
...
src/utils/dict.ts
View file @
ddb76bb1
...
@@ -167,6 +167,7 @@ export enum DICT_TYPE {
...
@@ -167,6 +167,7 @@ export enum DICT_TYPE {
// ========== Member 会员模块 ==========
// ========== Member 会员模块 ==========
MEMBER_POINT_BIZ_TYPE
=
'member_point_biz_type'
,
// 积分的业务类型
MEMBER_POINT_BIZ_TYPE
=
'member_point_biz_type'
,
// 积分的业务类型
MEMBER_EXPERIENCE_BIZ_TYPE
=
'member_experience_biz_type'
,
// 会员经验业务类型
MEMBER_EXPERIENCE_BIZ_TYPE
=
'member_experience_biz_type'
,
// 会员经验业务类型
CHECK_STATUS
=
'check_status'
,
// 客户企业管理审核
// ========== MALL - 商品模块 ==========
// ========== MALL - 商品模块 ==========
PRODUCT_SPU_STATUS
=
'product_spu_status'
,
//商品状态
PRODUCT_SPU_STATUS
=
'product_spu_status'
,
//商品状态
...
...
src/views/member/enterprise/EnterpriseForm.vue
View file @
ddb76bb1
...
@@ -2,33 +2,49 @@
...
@@ -2,33 +2,49 @@
<Dialog
:title=
"dialogTitle"
v-model=
"dialogVisible"
>
<Dialog
:title=
"dialogTitle"
v-model=
"dialogVisible"
>
<el-form
<el-form
ref=
"formRef"
ref=
"formRef"
disabled
:model=
"formData"
:model=
"formData"
:rules=
"formRules"
:rules=
"formRules"
label-width=
"100px"
label-width=
"100px"
v-loading=
"formLoading"
v-loading=
"formLoading"
>
>
<el-form-item
label=
"
member用户id"
prop=
"memberUserId
"
>
<el-form-item
label=
"
姓名"
prop=
"contactName
"
>
<el-input
v-model=
"formData.
memberUserId"
placeholder=
"请输入member用户id
"
/>
<el-input
v-model=
"formData.
contactName
"
/>
</el-form-item>
</el-form-item>
<el-form-item
label=
"企业名称"
prop=
"name"
>
<el-form-item
label=
"身份证"
prop=
"identityCard"
>
<el-input
v-model=
"formData.name"
placeholder=
"请输入企业名称"
/>
<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>
<el-form-item
label=
"法人"
prop=
"legalPerson"
>
<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>
<el-form-item
label=
"联系电话"
prop=
"mo
ib
le"
>
<el-form-item
label=
"联系电话"
prop=
"mo
bi
le"
>
<el-input
v-model=
"formData.mo
ible"
placeholder=
"请输入联系电话
"
/>
<el-input
v-model=
"formData.mo
bile
"
/>
</el-form-item>
</el-form-item>
<el-form-item
label=
"承诺书"
prop=
"letterOfCommitment"
>
<el-form-item
label=
"承诺书"
prop=
"letterOfCommitment"
>
<UploadImg
v-model=
"formData.letterOfCommitment"
/>
<UploadImg
v-model=
"formData.letterOfCommitment"
:disabled=
"true"
/>
</el-form-item>
</el-form-item>
<el-form-item
label=
"
是否审核
"
prop=
"status"
>
<el-form-item
label=
"
审核状态
"
prop=
"status"
>
<el-radio-group
v-model=
"formData.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-radio-group>
</el-form-item>
</el-form-item>
<el-form-item
label=
"备注"
prop=
"remark"
>
<el-form-item
label=
"备注"
prop=
"remark"
>
<el-input
v-model=
"formData.remark"
placeholder=
"请输入备注"
/>
<el-input
v-model=
"formData.remark"
/>
</el-form-item>
</el-form-item>
</el-form>
</el-form>
<template
#
footer
>
<template
#
footer
>
...
@@ -39,6 +55,7 @@
...
@@ -39,6 +55,7 @@
</template>
</template>
<
script
setup
lang=
"ts"
>
<
script
setup
lang=
"ts"
>
import
{
EnterpriseApi
,
Enterprise
}
from
'@/api/member/enterprise'
import
{
EnterpriseApi
,
Enterprise
}
from
'@/api/member/enterprise'
import
{
DICT_TYPE
,
getIntDictOptions
}
from
'@/utils/dict'
/** 客户企业 表单 */
/** 客户企业 表单 */
defineOptions
({
name
:
'EnterpriseForm'
})
defineOptions
({
name
:
'EnterpriseForm'
})
...
@@ -52,28 +69,20 @@ const formLoading = ref(false) // 表单的加载中:1)修改时的数据加
...
@@ -52,28 +69,20 @@ const formLoading = ref(false) // 表单的加载中:1)修改时的数据加
const
formType
=
ref
(
''
)
// 表单的类型:create - 新增;update - 修改
const
formType
=
ref
(
''
)
// 表单的类型:create - 新增;update - 修改
const
formData
=
ref
({
const
formData
=
ref
({
id
:
undefined
,
id
:
undefined
,
memberUserId
:
undefined
,
name
:
undefined
,
legalPerson
:
undefined
,
moible
:
undefined
,
letterOfCommitment
:
undefined
,
status
:
undefined
,
status
:
undefined
,
remark
:
undefined
remark
:
undefined
})
})
const
formRules
=
reactive
({
const
formRules
=
reactive
({
memberUserId
:
[{
required
:
true
,
message
:
'member用户id不能为空'
,
trigger
:
'blur'
}],
status
:
[{
required
:
true
,
message
:
'审核状态不能为空'
,
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'
}]
})
})
const
formRef
=
ref
()
// 表单 Ref
const
formRef
=
ref
()
// 表单 Ref
/** 打开弹窗 */
/** 打开弹窗 */
const
open
=
async
(
type
:
string
,
id
?:
number
)
=>
{
const
open
=
async
(
type
:
string
,
id
?:
number
)
=>
{
console
.
log
(
type
,
'type'
)
dialogVisible
.
value
=
true
dialogVisible
.
value
=
true
dialogTitle
.
value
=
t
(
'action.'
+
type
)
dialogTitle
.
value
=
t
(
'action.'
+
type
)
// dialogTitle.value = '审核'
formType
.
value
=
type
formType
.
value
=
type
resetForm
()
resetForm
()
// 修改时,设置数据
// 修改时,设置数据
...
@@ -101,7 +110,7 @@ const submitForm = async () => {
...
@@ -101,7 +110,7 @@ const submitForm = async () => {
await
EnterpriseApi
.
createEnterprise
(
data
)
await
EnterpriseApi
.
createEnterprise
(
data
)
message
.
success
(
t
(
'common.createSuccess'
))
message
.
success
(
t
(
'common.createSuccess'
))
}
else
{
}
else
{
await
EnterpriseApi
.
update
Enterprise
(
data
)
await
EnterpriseApi
.
process
Enterprise
(
data
)
message
.
success
(
t
(
'common.updateSuccess'
))
message
.
success
(
t
(
'common.updateSuccess'
))
}
}
dialogVisible
.
value
=
false
dialogVisible
.
value
=
false
...
@@ -116,14 +125,9 @@ const submitForm = async () => {
...
@@ -116,14 +125,9 @@ const submitForm = async () => {
const
resetForm
=
()
=>
{
const
resetForm
=
()
=>
{
formData
.
value
=
{
formData
.
value
=
{
id
:
undefined
,
id
:
undefined
,
memberUserId
:
undefined
,
name
:
undefined
,
legalPerson
:
undefined
,
moible
:
undefined
,
letterOfCommitment
:
undefined
,
status
:
undefined
,
status
:
undefined
,
remark
:
undefined
remark
:
undefined
}
}
formRef
.
value
?.
resetFields
()
formRef
.
value
?.
resetFields
()
}
}
</
script
>
</
script
>
\ No newline at end of file
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 @@
...
@@ -6,20 +6,19 @@
:model=
"queryParams"
:model=
"queryParams"
ref=
"queryFormRef"
ref=
"queryFormRef"
:inline=
"true"
:inline=
"true"
label-width=
"68px"
>
>
<el-form-item
label=
"
member用户id"
prop=
"memberUserId
"
>
<el-form-item
label=
"
姓名"
prop=
"contactName
"
>
<el-input
<el-input
v-model=
"queryParams.
memberUserId
"
v-model=
"queryParams.
contactName
"
placeholder=
"请输入
member用户id
"
placeholder=
"请输入
姓名
"
clearable
clearable
@
keyup
.
enter=
"handleQuery"
@
keyup
.
enter=
"handleQuery"
class=
"!w-240px"
class=
"!w-240px"
/>
/>
</el-form-item>
</el-form-item>
<el-form-item
label=
"企业名称"
prop=
"
n
ame"
>
<el-form-item
label=
"企业名称"
prop=
"
enterpriseN
ame"
>
<el-input
<el-input
v-model=
"queryParams.
n
ame"
v-model=
"queryParams.
enterpriseN
ame"
placeholder=
"请输入企业名称"
placeholder=
"请输入企业名称"
clearable
clearable
@
keyup
.
enter=
"handleQuery"
@
keyup
.
enter=
"handleQuery"
...
@@ -35,23 +34,28 @@
...
@@ -35,23 +34,28 @@
class=
"!w-240px"
class=
"!w-240px"
/>
/>
</el-form-item>
</el-form-item>
<el-form-item
label=
"联系电话"
prop=
"mo
ib
le"
>
<el-form-item
label=
"联系电话"
prop=
"mo
bi
le"
>
<el-input
<el-input
v-model=
"queryParams.mo
ib
le"
v-model=
"queryParams.mo
bi
le"
placeholder=
"请输入联系电话"
placeholder=
"请输入联系电话"
clearable
clearable
@
keyup
.
enter=
"handleQuery"
@
keyup
.
enter=
"handleQuery"
class=
"!w-240px"
class=
"!w-240px"
/>
/>
</el-form-item>
</el-form-item>
<el-form-item
label=
"
是否审核
"
prop=
"status"
>
<el-form-item
label=
"
审核状态
"
prop=
"status"
>
<el-select
<el-select
v-model=
"queryParams.status"
v-model=
"queryParams.status"
placeholder=
"请选择
是否审核
"
placeholder=
"请选择
审核状态
"
clearable
clearable
class=
"!w-240px"
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-select>
</el-form-item>
</el-form-item>
<el-form-item
label=
"创建时间"
prop=
"createTime"
>
<el-form-item
label=
"创建时间"
prop=
"createTime"
>
...
@@ -66,15 +70,13 @@
...
@@ -66,15 +70,13 @@
/>
/>
</el-form-item>
</el-form-item>
<el-form-item>
<el-form-item>
<el-button
@
click=
"handleQuery"
><Icon
icon=
"ep:search"
class=
"mr-5px"
/>
搜索
</el-button>
<el-button
type=
"primary"
@
click=
"handleQuery"
>
<el-button
@
click=
"resetQuery"
><Icon
icon=
"ep:refresh"
class=
"mr-5px"
/>
重置
</el-button>
<Icon
icon=
"ep:search"
class=
"mr-5px"
/>
<el-button
搜索
type=
"primary"
</el-button>
plain
<el-button
@
click=
"resetQuery"
>
@
click=
"openForm('create')"
<Icon
icon=
"ep:refresh"
class=
"mr-5px"
/>
v-hasPermi=
"['member:enterprise:create']"
重置
>
<Icon
icon=
"ep:plus"
class=
"mr-5px"
/>
新增
</el-button>
</el-button>
<el-button
<el-button
type=
"success"
type=
"success"
...
@@ -83,16 +85,8 @@
...
@@ -83,16 +85,8 @@
:loading=
"exportLoading"
:loading=
"exportLoading"
v-hasPermi=
"['member:enterprise:export']"
v-hasPermi=
"['member:enterprise:export']"
>
>
<Icon
icon=
"ep:download"
class=
"mr-5px"
/>
导出
<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"
/>
批量删除
</el-button>
</el-button>
</el-form-item>
</el-form-item>
</el-form>
</el-form>
...
@@ -101,21 +95,51 @@
...
@@ -101,21 +95,51 @@
<!-- 列表 -->
<!-- 列表 -->
<ContentWrap>
<ContentWrap>
<el-table
<el-table
row-key=
"id"
row-key=
"id"
v-loading=
"loading"
v-loading=
"loading"
:data=
"list"
:data=
"list"
:stripe=
"true"
:stripe=
"true"
:show-overflow-tooltip=
"true"
:show-overflow-tooltip=
"true"
@
selection-change=
"handleRowCheckboxChange"
@
selection-change=
"handleRowCheckboxChange"
>
>
<el-table-column
type=
"selection"
width=
"55"
/>
<el-table-column
type=
"selection"
width=
"55"
/>
<el-table-column
label=
"主键"
align=
"center"
prop=
"id"
/>
<el-table-column
label=
"姓名"
align=
"center"
prop=
"contactName"
/>
<el-table-column
label=
"member用户id"
align=
"center"
prop=
"memberUserId"
/>
<el-table-column
label=
"身份证号"
align=
"center"
prop=
"identityCard"
/>
<el-table-column
label=
"企业名称"
align=
"center"
prop=
"name"
/>
<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=
"legalPerson"
/>
<el-table-column
label=
"联系电话"
align=
"center"
prop=
"moible"
/>
<el-table-column
label=
"联系电话"
align=
"center"
prop=
"mobile"
/>
<el-table-column
label=
"承诺书"
align=
"center"
prop=
"letterOfCommitment"
/>
<el-table-column
label=
"承诺书"
align=
"center"
prop=
"letterOfCommitment"
>
<el-table-column
label=
"是否审核"
align=
"center"
prop=
"status"
/>
<
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
<el-table-column
label=
"创建时间"
label=
"创建时间"
align=
"center"
align=
"center"
...
@@ -126,20 +150,15 @@
...
@@ -126,20 +150,15 @@
<el-table-column
label=
"操作"
align=
"center"
min-width=
"120px"
>
<el-table-column
label=
"操作"
align=
"center"
min-width=
"120px"
>
<
template
#
default=
"scope"
>
<
template
#
default=
"scope"
>
<el-button
<el-button
v-if=
"scope.row.status === 0"
link
link
type=
"primary"
type=
"primary"
@
click=
"openForm('update', scope.row.id)"
@
click=
"openForm('update', scope.row.id)"
v-hasPermi=
"['member:enterprise:update']"
>
>
编辑
审核
</el-button>
</el-button>
<el-button
<el-button
link
type=
"primary"
@
click=
"openForm('detail', scope.row.id)"
>
link
详情
type=
"danger"
@
click=
"handleDelete(scope.row.id)"
v-hasPermi=
"['member:enterprise:delete']"
>
删除
</el-button>
</el-button>
</
template
>
</
template
>
</el-table-column>
</el-table-column>
...
@@ -155,14 +174,18 @@
...
@@ -155,14 +174,18 @@
<!-- 表单弹窗:添加/修改 -->
<!-- 表单弹窗:添加/修改 -->
<EnterpriseForm
ref=
"formRef"
@
success=
"getList"
/>
<EnterpriseForm
ref=
"formRef"
@
success=
"getList"
/>
<review-form
ref=
"reviewRef"
@
success=
"getList"
/>
</template>
</template>
<
script
setup
lang=
"ts"
>
<
script
setup
lang=
"ts"
>
import
{
is
Empt
y
}
from
'@/utils/is'
import
{
is
Arra
y
}
from
'@/utils/is'
import
{
dateFormatter
}
from
'@/utils/formatTime'
import
{
dateFormatter
}
from
'@/utils/formatTime'
import
download
from
'@/utils/download'
import
download
from
'@/utils/download'
import
{
EnterpriseApi
,
Enterprise
}
from
'@/api/member/enterprise'
import
{
EnterpriseApi
,
Enterprise
}
from
'@/api/member/enterprise'
import
EnterpriseForm
from
'./EnterpriseForm.vue'
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'
})
defineOptions
({
name
:
'Enterprise'
})
...
@@ -212,7 +235,12 @@ const resetQuery = () => {
...
@@ -212,7 +235,12 @@ const resetQuery = () => {
/** 添加/修改操作 */
/** 添加/修改操作 */
const
formRef
=
ref
()
const
formRef
=
ref
()
const
reviewRef
=
ref
()
const
openForm
=
(
type
:
string
,
id
?:
number
)
=>
{
const
openForm
=
(
type
:
string
,
id
?:
number
)
=>
{
if
(
type
===
'update'
)
{
reviewRef
.
value
.
open
(
type
,
id
)
return
}
formRef
.
value
.
open
(
type
,
id
)
formRef
.
value
.
open
(
type
,
id
)
}
}
...
@@ -234,15 +262,29 @@ const handleDeleteBatch = async () => {
...
@@ -234,15 +262,29 @@ const handleDeleteBatch = async () => {
try
{
try
{
// 删除的二次确认
// 删除的二次确认
await
message
.
delConfirm
()
await
message
.
delConfirm
()
await
EnterpriseApi
.
deleteEnterpriseList
(
checkedIds
.
value
)
;
await
EnterpriseApi
.
deleteEnterpriseList
(
checkedIds
.
value
)
message
.
success
(
t
(
'common.delSuccess'
))
message
.
success
(
t
(
'common.delSuccess'
))
await
getList
()
;
await
getList
()
}
catch
{}
}
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
checkedIds
=
ref
<
number
[]
>
([])
const
handleRowCheckboxChange
=
(
records
:
Enterprise
[])
=>
{
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 () => {
...
@@ -264,4 +306,4 @@ const handleExport = async () => {
onMounted
(()
=>
{
onMounted
(()
=>
{
getList
()
getList
()
})
})
</
script
>
</
script
>
\ No newline at end of file
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