新增农户功能升级:身份证OCR/OSS上传、头像采集、同名村检测、Region热度排序及表单体验优化

- Region 表新增热度列,热门省份优先显示
- 区县下拉按地级市分组、已录区县优先、支持全省搜索
- 组选择内置一组至二十组
- 银行卡号独立行+粗体预览,开户行独立行
- 新增农户类型:农户/个体户/合作社/经营集体/公司
- 身份证正反面支持高拍仪/摄像头OCR与手机扫码上传,附件存本地/OSS
- 新增农户头像采集组件(摄像头/本地上传),预留人脸识别收购扩展
- 同名村弹窗提醒(防选错乡镇)
- 编辑窗体禁止遮罩/Esc误关,整体加宽适配高频操作
- 修复二维码局域网手机无法访问(监听0.0.0.0、局域网IP识别、Vite代理兜底)
This commit is contained in:
2026-08-13 16:07:35 +08:00
commit c377421a3e
93 changed files with 12934 additions and 0 deletions
+51
View File
@@ -0,0 +1,51 @@
const BASE = 'http://localhost:5246'
let token = ''
const h = (json = false) => ({
Authorization: `Bearer ${token}`,
...(json ? { 'Content-Type': 'application/json' } : {})
})
const api = async (path, opts = {}) => {
const res = await fetch(BASE + path, opts)
if (!res.ok) {
const text = await res.text()
throw new Error(`${res.status} ${path} => ${text.slice(0, 200)}`)
}
return res.json()
}
token = (await api('/api/auth/login', {
method: 'POST',
headers: h(true),
body: JSON.stringify({ username: 'admin', password: '123456' })
})).token
const enc = encodeURIComponent
console.log('== /farmers/all 新字段(含老数据 NULL 兼容) ==')
const all = await api('/api/farmers/all?limit=6', { headers: h() })
all.forEach((f) => console.log(`id=${f.id} ${f.name} | province=${f.province || ''} county=${f.county || ''} township=${f.township || ''} village=${f.village} groupName=${f.groupName || ''}`))
console.log('== 村列表(锦江区/春熙路街道) ==')
console.log((await api(`/api/regions/villages?county=${enc('锦江区')}&township=${enc('春熙路街道')}`, { headers: h() })).join(', '))
console.log('== 组列表(锦江区/春熙路街道/水井坊村) ==')
console.log((await api(`/api/regions/groups?county=${enc('锦江区')}&township=${enc('春熙路街道')}&village=${enc('水井坊村')}`, { headers: h() })).join(', '))
console.log('== 乡镇列表(锦江区, 公开数据+农户补充) ==')
console.log((await api(`/api/regions/townships?county=${enc('锦江区')}`, { headers: h() })).join(', '))
console.log('== 列表按县筛选(平南县) ==')
const list = await api(`/api/farmers?county=${enc('平南县')}&page=1&pageSize=10`, { headers: h() })
console.log(`total=${list.total}`)
list.items.forEach((f) => console.log(`${f.name} | ${f.province}/${f.county}/${f.township}/${f.village}/${f.groupName} | ${f.phone} | ${f.bankAccount}`))
console.log('== 关键字搜索“水井坊” ==')
const search = await api(`/api/farmers?keyword=${enc('水井坊')}&page=1&pageSize=10`, { headers: h() })
console.log(`total=${search.total}`)
search.items.forEach((f) => console.log(`${f.name} | ${f.county}/${f.township}/${f.village}/${f.groupName}`))
console.log('== 全量列表分页(page=1,pageSize=3,验证NULL兼容) ==')
const p = await api('/api/farmers?page=1&pageSize=3', { headers: h() })
console.log(`total=${p.total}`)
p.items.forEach((f) => console.log(`id=${f.id} ${f.name} | province=${f.province || ''} | phone=${f.phone}`))