/add-webpage-talent
接口用于批量添加网页提取的人才信息到系统中。该接口能够将网页内容保存到MinIO存储,并为每个人才创建对应的业务卡片记录。系统会自动设置数据来源信息(origin_source
)和人才档案信息(talent_profile
)。
项目 | 值 |
---|---|
接口路径 | /api/data-parse/add-webpage-talent |
请求方法 | POST |
Content-Type | application/json |
认证方式 | 根据系统配置 |
{
"talent_list": [
{
"name_zh": "张三",
"name_en": "Zhang San",
"title_zh": "总经理",
"title_en": "General Manager",
"hotel_zh": "北京万豪酒店",
"hotel_en": "Beijing Marriott Hotel",
"brand_group": "万豪",
"mobile": "13800138000",
"email": "zhangsan@example.com",
"phone": "010-12345678",
"address_zh": "北京市朝阳区XXX路123号",
"address_en": "123 XXX Road, Chaoyang District, Beijing",
"postal_code_zh": "100000",
"postal_code_en": "100000",
"brand_zh": "万豪",
"brand_en": "Marriott",
"affiliation_zh": "万豪国际集团",
"affiliation_en": "Marriott International",
"birthday": "1980-01-01",
"age": 44,
"native_place": "北京市",
"residence": "北京市朝阳区",
"pic_url": "https://example.com/photo.jpg",
"talent_profile": "资深酒店管理专家,拥有20年行业经验..."
}
],
"web_md": "# 酒店任命公告\n\n## 人事变动\n\n1. **张三** 被任命为北京万豪酒店总经理...\n\n更多内容..."
}
talent_list
(必填)Array<Object>
talent_list[].name_zh
(必填)String
"张三"
talent_list[].name_en
(可选)String
"Zhang San"
talent_list[].title_zh
(可选)String
"总经理"
talent_list[].title_en
(可选)String
"General Manager"
talent_list[].hotel_zh
(可选)String
"北京万豪酒店"
talent_list[].hotel_en
(可选)String
"Beijing Marriott Hotel"
talent_list[].brand_group
(可选)String
"万豪"
talent_list[].mobile
(可选)String
"13800138000,13900139000"
talent_list[].email
(可选)String
"zhangsan@example.com"
talent_list[].phone
(可选)String
"010-12345678"
talent_list[].address_zh
(可选)String
"北京市朝阳区XXX路123号"
talent_list[].address_en
(可选)String
"123 XXX Road, Chaoyang District, Beijing"
talent_list[].birthday
(可选)String
"1980-01-01"
talent_list[].age
(可选)Integer
44
talent_list[].pic_url
(可选)String
"https://example.com/photo.jpg"
talent_list[].talent_profile
(可选)String
"资深酒店管理专家,拥有20年行业经验,曾在多家国际知名酒店担任高级管理职位..."
web_md
(必填)String
{
"code": 200,
"success": true,
"message": "所有3条人才记录处理成功",
"data": [
{
"id": 123,
"name_zh": "张三",
"name_en": "Zhang San",
"title_zh": "总经理",
"title_en": "General Manager",
"hotel_zh": "北京万豪酒店",
"hotel_en": "Beijing Marriott Hotel",
"mobile": "13800138000",
"email": "zhangsan@example.com",
"phone": "010-12345678",
"address_zh": "北京市朝阳区XXX路123号",
"address_en": "123 XXX Road, Chaoyang District, Beijing",
"postal_code_zh": "100000",
"postal_code_en": "100000",
"brand_zh": "万豪",
"brand_en": "Marriott",
"affiliation_zh": "万豪国际集团",
"affiliation_en": "Marriott International",
"birthday": "1980-01-01",
"age": 44,
"native_place": "北京市",
"residence": "北京市朝阳区",
"brand_group": "万豪",
"image_path": "talent_photos/talent_photo_张三_20240101_12345678.jpg",
"career_path": [
{
"date": "2024-01-01",
"hotel_zh": "北京万豪酒店",
"hotel_en": "Beijing Marriott Hotel",
"title_zh": "总经理",
"title_en": "General Manager",
"image_path": "talent_photos/talent_photo_张三_20240101_12345678.jpg",
"source": "webpage_extraction"
}
],
"talent_profile": "资深酒店管理专家,拥有20年行业经验...",
"origin_source": {
"type": "webpage_talent",
"minio_path": "webpage_talent/webpage_talent_20240101_12345678.md",
"source_date": "2024-01-01 12:00:00"
},
"created_at": "2024-01-01 12:00:00",
"updated_at": "2024-01-01 12:00:00",
"updated_by": "webpage_talent_system",
"status": "active"
},
{
"id": 124,
"name_zh": "李四",
"name_en": "Li Si",
"title_zh": "副总经理",
"title_en": "Deputy General Manager",
"hotel_zh": "上海希尔顿酒店",
"hotel_en": "Shanghai Hilton Hotel",
"mobile": "13900139000",
"email": "lisi@example.com",
"brand_group": "希尔顿",
"image_path": "talent_photos/talent_photo_李四_20240101_12345679.jpg",
"career_path": [
{
"date": "2024-01-01",
"hotel_zh": "上海希尔顿酒店",
"hotel_en": "Shanghai Hilton Hotel",
"title_zh": "副总经理",
"title_en": "Deputy General Manager",
"image_path": "talent_photos/talent_photo_李四_20240101_12345679.jpg",
"source": "webpage_extraction"
}
],
"talent_profile": "酒店业资深管理者,专注于市场营销和品牌推广...",
"origin_source": {
"type": "webpage_talent",
"minio_path": "webpage_talent/webpage_talent_20240101_12345678.md",
"source_date": "2024-01-01 12:00:00"
},
"created_at": "2024-01-01 12:00:00",
"updated_at": "2024-01-01 12:00:00",
"updated_by": "webpage_talent_system",
"status": "active"
}
]
}
{
"code": 206,
"success": true,
"message": "部分处理成功:2/3条记录成功",
"data": {
"total_count": 3,
"success_count": 2,
"failed_count": 1,
"success_records": [
{
"id": 123,
"name_zh": "张三",
"name_en": "Zhang San",
"title_zh": "总经理",
"title_en": "General Manager",
"hotel_zh": "北京万豪酒店",
"hotel_en": "Beijing Marriott Hotel",
"mobile": "13800138000",
"email": "zhangsan@example.com",
"brand_group": "万豪",
"image_path": "talent_photos/talent_photo_张三_20240101_12345678.jpg",
"talent_profile": "资深酒店管理专家,拥有20年行业经验...",
"origin_source": {
"type": "webpage_talent",
"minio_path": "webpage_talent/webpage_talent_20240101_12345678.md",
"source_date": "2024-01-01 12:00:00"
},
"created_at": "2024-01-01 12:00:00",
"updated_at": "2024-01-01 12:00:00",
"status": "active"
},
{
"id": 124,
"name_zh": "李四",
"title_zh": "副总经理",
"hotel_zh": "上海希尔顿酒店",
"brand_group": "希尔顿",
"image_path": "talent_photos/talent_photo_李四_20240101_12345679.jpg",
"talent_profile": "酒店业资深管理者...",
"origin_source": {
"type": "webpage_talent",
"minio_path": "webpage_talent/webpage_talent_20240101_12345678.md",
"source_date": "2024-01-01 12:00:00"
},
"created_at": "2024-01-01 12:00:00",
"status": "active"
}
],
"failed_records": [
{
"error": "第3个记录缺少name_zh字段",
"input_data": {
"name_zh": "",
"title_zh": "经理"
}
}
],
"minio_md_path": "webpage_talent/webpage_talent_20240101_12345678.md"
}
}
{
"code": 400,
"success": false,
"message": "talent_list参数必须是非空数组",
"data": null
}
code
: HTTP状态码 (200=全部成功, 206=部分成功, 400=参数错误, 500=服务器错误)success
: 操作是否成功 (true/false)message
: 响应消息,描述操作结果data
: 响应数据内容Array<Object>
total_count
: 总记录数success_count
: 成功处理的记录数failed_count
: 失败记录数success_records
: 成功记录数组,每个对象包含完整的名片信息failed_records
: 失败记录数组,包含错误信息和输入数据minio_md_path
: 网页内容在MinIO中的存储路径每个成功创建的业务卡片记录包含以下字段:
id
: 数据库记录IDname_zh
: 中文姓名name_en
: 英文姓名title_zh
: 中文职位title_en
: 英文职位hotel_zh
: 酒店中文名称hotel_en
: 酒店英文名称mobile
: 手机号码email
: 电子邮箱phone
: 固定电话address_zh
: 中文地址address_en
: 英文地址postal_code_zh
: 中文邮编postal_code_en
: 英文邮编brand_zh
: 品牌中文名称brand_en
: 品牌英文名称affiliation_zh
: 中文所属机构affiliation_en
: 英文所属机构birthday
: 生日 (YYYY-MM-DD格式)age
: 年龄native_place
: 籍贯residence
: 居住地brand_group
: 品牌组合image_path
: 人才照片在MinIO中的存储路径(如果提供了pic_url)career_path
: 职业轨迹数组,包含职位变化历史talent_profile
: 人才档案信息origin_source
: 数据来源信息,包含以下子字段:
type
: 数据来源类型,固定为"webpage_talent"minio_path
: 原始网页内容在MinIO中的存储路径source_date
: 数据处理时间created_at
: 创建时间updated_at
: 更新时间updated_by
: 更新人status
: 记录状态 (通常为"active")状态码 | 说明 | 场景 |
---|---|---|
200 | 成功 | 所有记录处理成功 |
206 | 部分成功 | 部分记录处理成功 |
400 | 请求参数错误 | 参数格式不正确或缺少必填参数 |
500 | 服务器内部错误 | 系统异常或数据库错误 |
// 发送请求函数
async function addWebpageTalent(talentList, webMd) {
const url = '/api/data-parse/add-webpage-talent';
const requestBody = {
talent_list: talentList,
web_md: webMd
};
try {
const response = await fetch(url, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
// 如果需要认证,添加相应的头部
// 'Authorization': 'Bearer your-token'
},
body: JSON.stringify(requestBody)
});
const result = await response.json();
if (result.success) {
console.log('处理成功:', result.message);
console.log('处理详情:', result.data);
// 处理成功记录 - 区分全部成功和部分成功的响应格式
if (result.code === 200) {
// 全部成功:data是业务卡片记录数组
console.log(`成功处理 ${result.data.length} 条记录`);
result.data.forEach((record, index) => {
console.log(`记录 ${index + 1}: ${record.name_zh}`);
// 显示图片路径信息
if (record.image_path) {
console.log(` 图片路径: ${record.image_path}`);
}
// 显示人才档案信息
if (record.talent_profile) {
console.log(` 人才档案: ${record.talent_profile.substring(0, 50)}...`);
}
// 显示数据来源信息
if (record.origin_source) {
console.log(` 数据来源: ${record.origin_source.type}`);
console.log(` 原始文档: ${record.origin_source.minio_path}`);
}
});
} else if (result.code === 206) {
// 部分成功:data包含详细的成功和失败信息
console.log(`部分成功:${result.data.success_count}/${result.data.total_count} 条记录成功`);
// 显示成功记录
if (result.data.success_records.length > 0) {
result.data.success_records.forEach((record, index) => {
console.log(`成功记录 ${record.index}: ${record.data.name_zh} - ${record.message}`);
if (record.data.image_path) {
console.log(` 图片路径: ${record.data.image_path}`);
}
});
}
// 显示失败记录
if (result.data.failed_records.length > 0) {
result.data.failed_records.forEach((record, index) => {
console.error(`失败记录 ${record.index}: ${record.error}`);
});
}
}
return result;
} else {
console.error('处理失败:', result.message);
throw new Error(result.message);
}
} catch (error) {
console.error('请求失败:', error);
throw error;
}
}
// 使用示例
const talentData = [
{
name_zh: "张三",
name_en: "Zhang San",
title_zh: "总经理",
title_en: "General Manager",
hotel_zh: "北京万豪酒店",
hotel_en: "Beijing Marriott Hotel",
brand_group: "万豪",
mobile: "13800138000",
email: "zhangsan@example.com",
pic_url: "https://example.com/photos/zhangsan.jpg",
talent_profile: "资深酒店管理专家,拥有20年行业经验,曾在多家国际知名酒店担任高级管理职位。精通酒店运营管理、客户服务、团队建设等多个领域。"
},
{
name_zh: "李四",
name_en: "Li Si",
title_zh: "副总经理",
title_en: "Deputy General Manager",
hotel_zh: "上海希尔顿酒店",
hotel_en: "Shanghai Hilton Hotel",
brand_group: "希尔顿",
mobile: "13900139000",
email: "lisi@example.com",
pic_url: "https://example.com/photos/lisi.jpg",
talent_profile: "酒店业资深管理者,专注于市场营销和品牌推广,具有丰富的国际酒店管理经验。"
}
];
const webContent = `
# 酒店人事任命公告
## 重要人事变动

1. **张三**被任命为北京万豪酒店总经理
- 手机:13800138000
- 邮箱:zhangsan@example.com
- 简介:资深酒店管理专家,拥有20年行业经验

2. **李四**被任命为上海希尔顿酒店副总经理
- 手机:13900139000
- 邮箱:lisi@example.com
- 简介:酒店业资深管理者,专注于市场营销和品牌推广
`;
// 调用函数
addWebpageTalent(talentData, webContent)
.then(result => {
console.log('操作完成:', result);
})
.catch(error => {
console.error('操作失败:', error);
});
function addWebpageTalent(talentList, webMd) {
return $.ajax({
url: '/api/data-parse/add-webpage-talent',
type: 'POST',
contentType: 'application/json',
data: JSON.stringify({
talent_list: talentList,
web_md: webMd
}),
success: function(result) {
if (result.success) {
console.log('处理成功:', result.message);
// 显示处理结果 - 区分全部成功和部分成功的响应格式
if (result.code === 200) {
// 全部成功
alert(`成功处理 ${result.data.length} 条记录`);
// 显示详细信息
result.data.forEach(record => {
console.log(`人才: ${record.name_zh}`);
if (record.image_path) {
console.log(`图片已保存: ${record.image_path}`);
}
if (record.talent_profile) {
console.log(`人才档案: ${record.talent_profile.substring(0, 50)}...`);
}
});
} else if (result.code === 206) {
// 部分成功
alert(`部分成功: ${result.data.success_count}/${result.data.total_count} 条记录成功`);
// 显示成功记录
result.data.success_records.forEach(record => {
console.log(`成功: ${record.data.name_zh}`);
if (record.data.image_path) {
console.log(`图片已保存: ${record.data.image_path}`);
}
});
// 显示失败记录
result.data.failed_records.forEach(record => {
console.error(`失败: ${record.error}`);
});
}
if (result.data.failed_count > 0) {
console.warn(`失败 ${result.data.failed_count} 条记录`);
result.data.failed_records.forEach(record => {
console.error(`记录 ${record.index}: ${record.error}`);
});
}
} else {
alert('处理失败: ' + result.message);
}
},
error: function(xhr, status, error) {
console.error('请求失败:', error);
alert('请求失败: ' + error);
}
});
}
// 使用示例
const talentData = [
{
name_zh: "张三",
title_zh: "总经理",
hotel_zh: "北京万豪酒店",
mobile: "13800138000",
pic_url: "https://example.com/photos/zhangsan.jpg",
talent_profile: "资深酒店管理专家,拥有20年行业经验..."
}
];
const webContent = "# 人事任命公告\n\n\n\n张三被任命为总经理...";
addWebpageTalent(talentData, webContent);
<template>
<div>
<h3>添加网页人才信息</h3>
<!-- 人才信息表单 -->
<div v-for="(talent, index) in talentList" :key="index" class="talent-form">
<h4>人才 {{ index + 1 }}</h4>
<div class="form-group">
<label>中文姓名 (必填):</label>
<input v-model="talent.name_zh" type="text" required>
</div>
<div class="form-group">
<label>英文姓名:</label>
<input v-model="talent.name_en" type="text">
</div>
<div class="form-group">
<label>中文职位:</label>
<input v-model="talent.title_zh" type="text">
</div>
<div class="form-group">
<label>酒店名称:</label>
<input v-model="talent.hotel_zh" type="text">
</div>
<div class="form-group">
<label>手机号码:</label>
<input v-model="talent.mobile" type="text">
</div>
<div class="form-group">
<label>电子邮箱:</label>
<input v-model="talent.email" type="email">
</div>
<div class="form-group">
<label>照片URL:</label>
<input v-model="talent.pic_url" type="url" placeholder="https://example.com/photo.jpg">
</div>
<div class="form-group">
<label>人才档案:</label>
<textarea v-model="talent.talent_profile" rows="4" cols="50"
placeholder="请输入人才的详细档案信息,包括工作经历、专业技能等..."></textarea>
</div>
</div>
<!-- 网页内容 -->
<div class="form-group">
<label>网页内容 (Markdown格式):</label>
<textarea v-model="webMd" rows="10" cols="50" required></textarea>
</div>
<!-- 操作按钮 -->
<div class="actions">
<button @click="addTalent">添加人才</button>
<button @click="submitData" :disabled="loading">
{{ loading ? '处理中...' : '提交数据' }}
</button>
</div>
<!-- 结果显示 -->
<div v-if="result" class="result">
<h4>处理结果</h4>
<p :class="result.success ? 'success' : 'error'">{{ result.message }}</p>
<div v-if="result.data">
<!-- 全部成功的显示 -->
<div v-if="result.code === 200">
<p>总记录数: {{ result.data.length }}</p>
<p>全部处理成功</p>
<div class="success-records">
<h5>成功记录:</h5>
<ul>
<li v-for="(record, index) in result.data" :key="index">
<strong>{{ record.name_zh }}</strong>
<div v-if="record.image_path" class="detail">
图片已保存: {{ record.image_path }}
</div>
<div v-if="record.talent_profile" class="detail">
人才档案: {{ record.talent_profile.substring(0, 100) }}...
</div>
<div v-if="record.origin_source" class="detail">
数据来源: {{ record.origin_source.type }}
({{ record.origin_source.source_date }})
</div>
</li>
</ul>
</div>
</div>
<!-- 部分成功的显示 -->
<div v-if="result.code === 206">
<p>总记录数: {{ result.data.total_count }}</p>
<p>成功: {{ result.data.success_count }}</p>
<p>失败: {{ result.data.failed_count }}</p>
<!-- 成功记录详情 -->
<div v-if="result.data.success_records.length > 0" class="success-records">
<h5>成功记录:</h5>
<ul>
<li v-for="record in result.data.success_records" :key="record.index">
<strong>{{ record.data.name_zh }}</strong> - {{ record.message }}
<div v-if="record.data.image_path" class="detail">
图片已保存: {{ record.data.image_path }}
</div>
<div v-if="record.data.talent_profile" class="detail">
人才档案: {{ record.data.talent_profile.substring(0, 100) }}...
</div>
<div v-if="record.data.origin_source" class="detail">
数据来源: {{ record.data.origin_source.type }}
({{ record.data.origin_source.source_date }})
</div>
</li>
</ul>
</div>
<!-- 失败记录详情 -->
<div v-if="result.data.failed_records.length > 0" class="failed-records">
<h5>失败记录:</h5>
<ul>
<li v-for="record in result.data.failed_records" :key="record.index">
记录 {{ record.index }}: {{ record.error }}
</li>
</ul>
</div>
</div>
</div>
</div>
</div>
</template>
<script>
export default {
name: 'AddWebpageTalent',
data() {
return {
talentList: [
{
name_zh: '',
name_en: '',
title_zh: '',
title_en: '',
hotel_zh: '',
hotel_en: '',
brand_group: '',
mobile: '',
email: '',
phone: '',
address_zh: '',
address_en: '',
pic_url: '',
talent_profile: ''
}
],
webMd: '',
loading: false,
result: null
};
},
methods: {
addTalent() {
this.talentList.push({
name_zh: '',
name_en: '',
title_zh: '',
title_en: '',
hotel_zh: '',
hotel_en: '',
brand_group: '',
mobile: '',
email: '',
phone: '',
address_zh: '',
address_en: '',
pic_url: '',
talent_profile: ''
});
},
async submitData() {
if (!this.validateData()) {
return;
}
this.loading = true;
this.result = null;
try {
const response = await fetch('/api/data-parse/add-webpage-talent', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({
talent_list: this.talentList,
web_md: this.webMd
})
});
const result = await response.json();
this.result = result;
if (result.success) {
this.$message.success(result.message);
// 显示详细处理结果
if (result.code === 200) {
console.log('成功处理的记录详情:');
result.data.forEach(record => {
console.log(`- ${record.name_zh}:`);
if (record.image_path) {
console.log(` 图片: ${record.image_path}`);
}
if (record.talent_profile) {
console.log(` 档案: ${record.talent_profile.substring(0, 50)}...`);
}
});
} else if (result.code === 206) {
console.log('部分成功的记录详情:');
result.data.success_records.forEach(record => {
console.log(`- ${record.data.name_zh}: ${record.message}`);
if (record.data.image_path) {
console.log(` 图片: ${record.data.image_path}`);
}
});
if (result.data.failed_records.length > 0) {
console.log('失败的记录详情:');
result.data.failed_records.forEach(record => {
console.error(`- 记录 ${record.index}: ${record.error}`);
});
}
}
} else {
this.$message.error(result.message);
}
} catch (error) {
this.result = {
success: false,
message: '请求失败: ' + error.message
};
this.$message.error('请求失败: ' + error.message);
} finally {
this.loading = false;
}
},
validateData() {
// 验证必填字段
for (let i = 0; i < this.talentList.length; i++) {
if (!this.talentList[i].name_zh.trim()) {
this.$message.error(`第 ${i + 1} 个人才的中文姓名不能为空`);
return false;
}
}
if (!this.webMd.trim()) {
this.$message.error('网页内容不能为空');
return false;
}
return true;
}
}
};
</script>
<style scoped>
.talent-form {
border: 1px solid #ddd;
padding: 15px;
margin: 10px 0;
border-radius: 5px;
}
.form-group {
margin: 10px 0;
}
.form-group label {
display: inline-block;
width: 120px;
font-weight: bold;
}
.form-group input,
.form-group textarea {
width: 300px;
padding: 5px;
border: 1px solid #ccc;
border-radius: 3px;
}
.actions {
margin: 20px 0;
}
.actions button {
margin-right: 10px;
padding: 10px 20px;
background: #007bff;
color: white;
border: none;
border-radius: 5px;
cursor: pointer;
}
.actions button:disabled {
background: #6c757d;
cursor: not-allowed;
}
.result {
margin: 20px 0;
padding: 15px;
border: 1px solid #ddd;
border-radius: 5px;
}
.success {
color: #28a745;
}
.error {
color: #dc3545;
}
.success-records, .failed-records {
margin-top: 15px;
}
.detail {
font-size: 12px;
color: #666;
margin-left: 10px;
}
</style>
错误: talent_list参数必须是非空数组
解决: 确保talent_list是一个非空数组
错误: 第X个记录缺少name_zh字段
解决: 确保每个人才记录都包含name_zh字段
错误: 上传网页内容到MinIO失败
解决: 检查MinIO服务状态和配置
错误: 人员XXX的图片处理失败
解决: 检查pic_url是否有效,网络连接是否正常。图片下载失败不会影响其他数据的处理
错误: 数据库操作失败
解决: 检查数据库连接和表结构
origin_source
(JSON类型)系统自动生成的数据来源信息,包含:
type
: 数据来源类型,网页人才固定为"webpage_talent"minio_path
: 原始网页内容在MinIO中的存储路径source_date
: 数据处理时间talent_profile
(文本类型)人才档案信息,可包含:
image_path
(字符串类型)如果提供了pic_url
,系统会:
talent_photos/
目录webpage_talent/
目录下origin_source
字段支持talent_profile
字段支持pic_url
字段和图片自动下载功能如果在使用过程中遇到问题,请联系技术支持团队。