feat: 抬头管理
This commit is contained in:
parent
62d9fb8516
commit
c19b0167e4
@ -76,4 +76,10 @@ export default {
|
||||
createPolicy: (data = {}) => request.post('/policy/create', data),
|
||||
updatePolicy: (data = {}) => request.post('/policy/update', data),
|
||||
deletePolicy: (params = {}) => request.delete('/policy/delete', { params }),
|
||||
|
||||
//发票`/valuations/${data.id}`
|
||||
getInvoiceHeaders: () => request.get('/app-invoices/headers'),
|
||||
addInvoiceHeaders: (data = {}) => request.post('/app-invoices/headers', data),
|
||||
updateInvoiceHeaders: (data = {}) => request.put(`/app-invoices/headers/${data.id}`, data),
|
||||
deleteInvoiceHeaders: (id) => request.delete(`/app-invoices/headers/${id}`),
|
||||
}
|
||||
|
||||
@ -56,32 +56,54 @@
|
||||
<span class="text_2" @click.stop="handleOpenAgreement">《用户协议》</span>
|
||||
</n-checkbox>
|
||||
</div>
|
||||
|
||||
|
||||
<!-- User Agreement Modal -->
|
||||
<n-modal
|
||||
v-model:show="showAgreement"
|
||||
preset="card"
|
||||
title="用户服务协议"
|
||||
style="width: 800px; max-width: 90vw;"
|
||||
style="width: 800px; max-width: 90vw"
|
||||
:bordered="false"
|
||||
>
|
||||
<div class="agreement-content" style="max-height: 60vh; overflow-y: auto; padding: 0 10px;">
|
||||
<div
|
||||
class="agreement-content"
|
||||
style="max-height: 60vh; overflow-y: auto; padding: 0 10px"
|
||||
>
|
||||
<h3>特别提示</h3>
|
||||
<p>在此特别提醒您(用户)在注册成为用户之前,请认真阅读本《用户协议》(以下简称“协议”),确保您充分理解本协议中各条款。请您审慎阅读并选择接受或不接受本协议。除非您接受本协议所有条款,否则您无权注册、登录或使用本协议所涉服务。您的注册、登录、使用等行为将视为对本协议的接受,并同意接受本协议各项条款的约束。</p>
|
||||
<p>本协议约定成都文化产权交易所有限公司(以下简称“成都文交所”)与用户之间关于“IP文产通”平台服务(以下简称“服务”)的权利义务。“用户”是指注册、登录、使用本服务的个人。本协议可由成都文交所随时更新,更新后的协议条款一旦公布即代替原来的协议条款,恕不另行通知,用户可在本网站查阅最新版协议条款。在成都文交所修改协议条款后,如果用户不接受修改后的条款,请立即停止使用成都文交所提供的服务,用户继续使用成都文交所提供的服务将被视为接受修改后的协议。</p>
|
||||
|
||||
<p>
|
||||
在此特别提醒您(用户)在注册成为用户之前,请认真阅读本《用户协议》(以下简称“协议”),确保您充分理解本协议中各条款。请您审慎阅读并选择接受或不接受本协议。除非您接受本协议所有条款,否则您无权注册、登录或使用本协议所涉服务。您的注册、登录、使用等行为将视为对本协议的接受,并同意接受本协议各项条款的约束。
|
||||
</p>
|
||||
<p>
|
||||
本协议约定成都文化产权交易所有限公司(以下简称“成都文交所”)与用户之间关于“IP文产通”平台服务(以下简称“服务”)的权利义务。“用户”是指注册、登录、使用本服务的个人。本协议可由成都文交所随时更新,更新后的协议条款一旦公布即代替原来的协议条款,恕不另行通知,用户可在本网站查阅最新版协议条款。在成都文交所修改协议条款后,如果用户不接受修改后的条款,请立即停止使用成都文交所提供的服务,用户继续使用成都文交所提供的服务将被视为接受修改后的协议。
|
||||
</p>
|
||||
|
||||
<h3>一、服务内容</h3>
|
||||
<p>1.1 本服务的具体内容由成都文交所根据实际情况提供,包括但不限于授权用户通过其账号进行相关操作。</p>
|
||||
<p>1.2 成都文交所提供的服务仅限于平台上的相关功能,用户在使用服务时应遵守相关法律法规及本协议的规定。</p>
|
||||
|
||||
<p>
|
||||
1.1
|
||||
本服务的具体内容由成都文交所根据实际情况提供,包括但不限于授权用户通过其账号进行相关操作。
|
||||
</p>
|
||||
<p>
|
||||
1.2
|
||||
成都文交所提供的服务仅限于平台上的相关功能,用户在使用服务时应遵守相关法律法规及本协议的规定。
|
||||
</p>
|
||||
|
||||
<h3>二、用户账号</h3>
|
||||
<p>2.1 用户在使用本服务前需要注册一个账号。账号注册过程中,用户应提供真实、准确、完整的个人资料。</p>
|
||||
<p>2.2 用户有责任妥善保管注册账号信息及账号密码的安全,因用户保管不善可能导致遭受盗号或密码失窃,责任由用户自行承担。</p>
|
||||
|
||||
<p>
|
||||
2.1
|
||||
用户在使用本服务前需要注册一个账号。账号注册过程中,用户应提供真实、准确、完整的个人资料。
|
||||
</p>
|
||||
<p>
|
||||
2.2
|
||||
用户有责任妥善保管注册账号信息及账号密码的安全,因用户保管不善可能导致遭受盗号或密码失窃,责任由用户自行承担。
|
||||
</p>
|
||||
|
||||
<h3>三、用户个人信息保护</h3>
|
||||
<p>3.1 保护用户个人信息是成都文交所的一项基本原则,成都文交所将会采取合理的措施保护用户的个人信息。除法律法规规定的情形外,未经用户许可成都文交所不会向第三方公开、透露用户个人信息。</p>
|
||||
|
||||
<br/>
|
||||
<p>
|
||||
3.1
|
||||
保护用户个人信息是成都文交所的一项基本原则,成都文交所将会采取合理的措施保护用户的个人信息。除法律法规规定的情形外,未经用户许可成都文交所不会向第三方公开、透露用户个人信息。
|
||||
</p>
|
||||
|
||||
<br />
|
||||
<!-- <p style="color: #999; text-align: center; font-size: 12px;">(以上内容为示例,请替换为完整版《用户服务协议(暂行)》)</p> -->
|
||||
</div>
|
||||
</n-modal>
|
||||
@ -133,7 +155,6 @@ function handleOpenAgreement() {
|
||||
showAgreement.value = true
|
||||
}
|
||||
|
||||
|
||||
// Initialize login info
|
||||
if (localStorage.getItem('phone')) {
|
||||
loginInfo.value.phone = localStorage.getItem('phone')
|
||||
@ -210,6 +231,7 @@ async function handleLogin() {
|
||||
if (res.data?.token?.access_token) {
|
||||
setToken(res.data.token.access_token)
|
||||
localStorage.setItem('phone', phone)
|
||||
localStorage.setItem('app_user_id', res.data.user.id)
|
||||
|
||||
if (query.redirect) {
|
||||
const path = query.redirect
|
||||
|
||||
@ -43,66 +43,46 @@
|
||||
>
|
||||
<n-grid :cols="2" :x-gap="16">
|
||||
<!-- 公司名称 -->
|
||||
<n-form-item-gi :span="1" path="companyName" label="公司名称">
|
||||
<n-input
|
||||
v-model:value="formData.companyName"
|
||||
placeholder="请输入公司名称"
|
||||
clearable
|
||||
/>
|
||||
<n-form-item-gi :span="1" path="company_name" label="公司名称">
|
||||
<n-input v-model:value="formData.company_name" placeholder="请输入公司名称" clearable />
|
||||
</n-form-item-gi>
|
||||
|
||||
<!-- 公司税号 -->
|
||||
<n-form-item-gi :span="1" path="taxNumber" label="公司税号">
|
||||
<n-input
|
||||
v-model:value="formData.taxNumber"
|
||||
placeholder="请输入公司税号"
|
||||
clearable
|
||||
/>
|
||||
<n-form-item-gi :span="1" path="tax_number" label="公司税号">
|
||||
<n-input v-model:value="formData.tax_number" placeholder="请输入公司税号" clearable />
|
||||
</n-form-item-gi>
|
||||
|
||||
<!-- 注册地址 -->
|
||||
<n-form-item-gi :span="2" path="registeredAddress" label="注册地址">
|
||||
<n-form-item-gi :span="2" path="register_address" label="注册地址">
|
||||
<n-input
|
||||
v-model:value="formData.registeredAddress"
|
||||
v-model:value="formData.register_address"
|
||||
placeholder="请输入注册地址"
|
||||
clearable
|
||||
/>
|
||||
</n-form-item-gi>
|
||||
|
||||
<!-- 注册电话 -->
|
||||
<n-form-item-gi :span="2" path="registeredPhone" label="注册电话">
|
||||
<n-form-item-gi :span="2" path="register_phone" label="注册电话">
|
||||
<n-input
|
||||
v-model:value="formData.registeredPhone"
|
||||
v-model:value="formData.register_phone"
|
||||
placeholder="请输入注册电话"
|
||||
clearable
|
||||
/>
|
||||
</n-form-item-gi>
|
||||
|
||||
<!-- 开户银行 -->
|
||||
<n-form-item-gi :span="1" path="bankName" label="开户银行">
|
||||
<n-input
|
||||
v-model:value="formData.bankName"
|
||||
placeholder="请输入开户银行"
|
||||
clearable
|
||||
/>
|
||||
<n-form-item-gi :span="1" path="bank_name" label="开户银行">
|
||||
<n-input v-model:value="formData.bank_name" placeholder="请输入开户银行" clearable />
|
||||
</n-form-item-gi>
|
||||
|
||||
<!-- 银行账号 -->
|
||||
<n-form-item-gi :span="1" path="bankAccount" label="银行账号">
|
||||
<n-input
|
||||
v-model:value="formData.bankAccount"
|
||||
placeholder="请输入银行账号"
|
||||
clearable
|
||||
/>
|
||||
<n-form-item-gi :span="1" path="bank_account" label="银行账号">
|
||||
<n-input v-model:value="formData.bank_account" placeholder="请输入银行账号" clearable />
|
||||
</n-form-item-gi>
|
||||
|
||||
<!-- 电子邮箱 -->
|
||||
<n-form-item-gi :span="2" path="email" label="电子邮箱">
|
||||
<n-input
|
||||
v-model:value="formData.email"
|
||||
placeholder="请输入邮箱"
|
||||
clearable
|
||||
/>
|
||||
<n-input v-model:value="formData.email" placeholder="请输入邮箱" clearable />
|
||||
<template #feedback>
|
||||
<span class="email-hint">此邮箱用于接收发票,请填写正确!</span>
|
||||
</template>
|
||||
@ -122,13 +102,24 @@
|
||||
|
||||
<script setup>
|
||||
import { h, ref, watch } from 'vue'
|
||||
import { NButton, NDataTable, NSpace, NModal, NForm, NFormItemGi, NGrid, NInput } from 'naive-ui'
|
||||
import {
|
||||
NButton,
|
||||
NDataTable,
|
||||
NSpace,
|
||||
NModal,
|
||||
NForm,
|
||||
NFormItemGi,
|
||||
NGrid,
|
||||
NInput,
|
||||
NPopconfirm,
|
||||
} from 'naive-ui'
|
||||
import { renderIcon } from '@/utils'
|
||||
|
||||
const props = defineProps({
|
||||
invoiceList: {
|
||||
type: Array,
|
||||
default: () => []
|
||||
}
|
||||
default: () => [],
|
||||
},
|
||||
})
|
||||
|
||||
const emit = defineEmits(['add-invoice', 'delete-invoice', 'update-invoice'])
|
||||
@ -139,31 +130,27 @@ const formRef = ref(null)
|
||||
|
||||
// 表单数据
|
||||
const formData = ref({
|
||||
companyName: '',
|
||||
taxNumber: '',
|
||||
registeredAddress: '',
|
||||
registeredPhone: '',
|
||||
bankName: '',
|
||||
bankAccount: '',
|
||||
email: ''
|
||||
company_name: '',
|
||||
tax_number: '',
|
||||
register_address: '',
|
||||
register_phone: '',
|
||||
bank_name: '',
|
||||
bank_account: '',
|
||||
email: '',
|
||||
})
|
||||
|
||||
// 表单验证规则
|
||||
const formRules = {
|
||||
companyName: [
|
||||
{ required: true, message: '请输入公司名称', trigger: 'blur' }
|
||||
],
|
||||
taxNumber: [
|
||||
{ required: true, message: '请输入公司税号', trigger: 'blur' }
|
||||
],
|
||||
company_name: [{ required: true, message: '请输入公司名称', trigger: 'blur' }],
|
||||
tax_number: [{ required: true, message: '请输入公司税号', trigger: 'blur' }],
|
||||
email: [
|
||||
{ required: true, message: '请输入电子邮箱', trigger: 'blur' },
|
||||
{
|
||||
{
|
||||
pattern: /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/,
|
||||
message: '请输入正确的邮箱格式',
|
||||
trigger: 'blur'
|
||||
}
|
||||
]
|
||||
trigger: 'blur',
|
||||
},
|
||||
],
|
||||
}
|
||||
|
||||
// 监听弹窗显示状态,重置表单
|
||||
@ -175,13 +162,13 @@ watch(showModal, (newVal) => {
|
||||
} else {
|
||||
// 新增模式,清空数据
|
||||
formData.value = {
|
||||
companyName: '',
|
||||
taxNumber: '',
|
||||
registeredAddress: '',
|
||||
registeredPhone: '',
|
||||
bankName: '',
|
||||
bankAccount: '',
|
||||
email: ''
|
||||
company_name: '',
|
||||
tax_number: '',
|
||||
register_address: '',
|
||||
register_phone: '',
|
||||
bank_name: '',
|
||||
bank_account: '',
|
||||
email: '',
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -238,7 +225,7 @@ const columns = [
|
||||
ellipsis: true,
|
||||
align: 'center',
|
||||
titleAlign: 'center',
|
||||
render: (row) => row.name || row.companyName || '-'
|
||||
render: (row) => row.name || row.company_name || '-',
|
||||
},
|
||||
{
|
||||
title: '税号',
|
||||
@ -246,7 +233,7 @@ const columns = [
|
||||
minWidth: 200,
|
||||
align: 'center',
|
||||
titleAlign: 'center',
|
||||
render: (row) => row.taxId || row.taxNumber || '123456789012345678'
|
||||
render: (row) => row.taxId || row.tax_number || '123456789012345678',
|
||||
},
|
||||
{
|
||||
title: '操作',
|
||||
@ -266,27 +253,44 @@ const columns = [
|
||||
text: true,
|
||||
type: 'primary',
|
||||
size: 'small',
|
||||
onClick: () => handleEditInvoice(row)
|
||||
onClick: () => handleEditInvoice(row),
|
||||
},
|
||||
{ default: () => '编辑' }
|
||||
{
|
||||
default: () => '编辑',
|
||||
icon: renderIcon('material-symbols:edit', { size: 16 }),
|
||||
}
|
||||
),
|
||||
h(
|
||||
NButton,
|
||||
NPopconfirm,
|
||||
{
|
||||
text: true,
|
||||
type: 'error',
|
||||
size: 'small',
|
||||
onClick: () => handleDeleteInvoice(row)
|
||||
onPositiveClick: () => handleDeleteInvoice(row),
|
||||
negativeText: '取消',
|
||||
positiveText: '确定',
|
||||
},
|
||||
{ default: () => '删除' }
|
||||
)
|
||||
]
|
||||
{
|
||||
trigger: () =>
|
||||
h(
|
||||
NButton,
|
||||
{
|
||||
text: true,
|
||||
type: 'error',
|
||||
size: 'small',
|
||||
},
|
||||
{
|
||||
default: () => '删除',
|
||||
icon: renderIcon('material-symbols:delete-outline', { size: 16 }),
|
||||
}
|
||||
),
|
||||
default: () => '确定删除该发票抬头吗?',
|
||||
}
|
||||
),
|
||||
],
|
||||
}
|
||||
)
|
||||
}
|
||||
),
|
||||
},
|
||||
]
|
||||
|
||||
const rowKey = (row) => row.id ?? row.name ?? row.companyName ?? row.taxId ?? row.taxNumber
|
||||
const rowKey = (row) => row.id ?? row.name ?? row.company_name ?? row.taxId ?? row.tax_number
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
@ -313,7 +317,7 @@ const rowKey = (row) => row.id ?? row.name ?? row.companyName ?? row.taxId ?? ro
|
||||
.title-bar {
|
||||
width: 4px;
|
||||
height: 16px;
|
||||
background: #A30113;
|
||||
background: #a30113;
|
||||
border-radius: 2px;
|
||||
}
|
||||
|
||||
@ -328,7 +332,7 @@ const rowKey = (row) => row.id ?? row.name ?? row.companyName ?? row.taxId ?? ro
|
||||
align-items: center;
|
||||
gap: 4px;
|
||||
padding: 8px 16px;
|
||||
background: #A30113;
|
||||
background: #a30113;
|
||||
color: white;
|
||||
border-radius: 4px;
|
||||
font-size: 14px;
|
||||
@ -337,7 +341,7 @@ const rowKey = (row) => row.id ?? row.name ?? row.companyName ?? row.taxId ?? ro
|
||||
}
|
||||
|
||||
.add-btn:hover {
|
||||
background: #880C22;
|
||||
background: #880c22;
|
||||
}
|
||||
|
||||
.plus-icon {
|
||||
@ -375,7 +379,7 @@ const rowKey = (row) => row.id ?? row.name ?? row.companyName ?? row.taxId ?? ro
|
||||
}
|
||||
|
||||
:deep(.n-form-item-label__asterisk) {
|
||||
color: #A30113;
|
||||
color: #a30113;
|
||||
}
|
||||
|
||||
:deep(.n-input) {
|
||||
@ -383,12 +387,12 @@ const rowKey = (row) => row.id ?? row.name ?? row.companyName ?? row.taxId ?? ro
|
||||
}
|
||||
|
||||
:deep(.n-input__input-el::placeholder) {
|
||||
color: #C0C4CC;
|
||||
color: #c0c4cc;
|
||||
}
|
||||
|
||||
.email-hint {
|
||||
font-size: 12px;
|
||||
color: #A30113;
|
||||
color: #a30113;
|
||||
margin-top: 4px;
|
||||
display: inline-block;
|
||||
}
|
||||
@ -402,7 +406,7 @@ const rowKey = (row) => row.id ?? row.name ?? row.companyName ?? row.taxId ?? ro
|
||||
|
||||
.cancel-btn {
|
||||
padding: 8px 24px;
|
||||
border: 1px solid #DCDFE6;
|
||||
border: 1px solid #dcdfe6;
|
||||
background: white;
|
||||
color: #606266;
|
||||
border-radius: 4px;
|
||||
@ -412,13 +416,13 @@ const rowKey = (row) => row.id ?? row.name ?? row.companyName ?? row.taxId ?? ro
|
||||
}
|
||||
|
||||
.cancel-btn:hover {
|
||||
border-color: #C0C4CC;
|
||||
background: #F5F7FA;
|
||||
border-color: #c0c4cc;
|
||||
background: #f5f7fa;
|
||||
}
|
||||
|
||||
.save-btn {
|
||||
padding: 8px 24px;
|
||||
background: #A30113;
|
||||
background: #a30113;
|
||||
color: white;
|
||||
border: none;
|
||||
border-radius: 4px;
|
||||
@ -428,6 +432,6 @@ const rowKey = (row) => row.id ?? row.name ?? row.companyName ?? row.taxId ?? ro
|
||||
}
|
||||
|
||||
.save-btn:hover {
|
||||
background: #880C22;
|
||||
background: #880c22;
|
||||
}
|
||||
</style>
|
||||
|
||||
@ -29,6 +29,9 @@
|
||||
:asset-list="assetList"
|
||||
:invoice-list="invoiceList"
|
||||
@return-home="handleBackToHome"
|
||||
@add-invoice="addInvoice"
|
||||
@update-invoice="updateInvoice"
|
||||
@delete-invoice="deleteInvoice"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
@ -62,10 +65,7 @@ const valuationCount = ref(0)
|
||||
const assetList = ref([])
|
||||
|
||||
// 开票列表
|
||||
const invoiceList = ref([
|
||||
{ id: 1, name: '某某公司', status: '待审' },
|
||||
{ id: 2, name: '某某公司', status: '待审' },
|
||||
])
|
||||
const invoiceList = ref([])
|
||||
|
||||
// 菜单列表
|
||||
const menuList = ref([
|
||||
@ -116,9 +116,50 @@ async function loadData() {
|
||||
$message.error('加载估值记录失败,请稍后重试')
|
||||
}
|
||||
}
|
||||
//加载发票抬头列表
|
||||
async function loadInvoiceList() {
|
||||
try {
|
||||
const res = await api.getInvoiceHeaders()
|
||||
invoiceList.value = res.data
|
||||
} catch (error) {
|
||||
console.error('发票抬头获取失败:', error)
|
||||
}
|
||||
}
|
||||
|
||||
//添加发票抬头
|
||||
async function addInvoice(data) {
|
||||
try {
|
||||
await api.addInvoiceHeaders(data)
|
||||
$message.success('添加成功')
|
||||
loadInvoiceList()
|
||||
} catch (error) {
|
||||
console.error('新增发票抬头失败:', error)
|
||||
}
|
||||
}
|
||||
//更新发票抬头
|
||||
async function updateInvoice(data) {
|
||||
try {
|
||||
await api.updateInvoiceHeaders(data)
|
||||
$message.success('编辑成功')
|
||||
loadInvoiceList()
|
||||
} catch (error) {
|
||||
console.error('更新发票抬头失败:', error)
|
||||
}
|
||||
}
|
||||
//删除发票抬头
|
||||
async function deleteInvoice(data) {
|
||||
try {
|
||||
await api.deleteInvoiceHeaders(data.id)
|
||||
$message.success('删除成功')
|
||||
loadInvoiceList()
|
||||
} catch (error) {
|
||||
console.error('删除发票抬头失败:', error)
|
||||
}
|
||||
}
|
||||
|
||||
onMounted(() => {
|
||||
loadData()
|
||||
loadInvoiceList()
|
||||
})
|
||||
</script>
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user