Commit c6726567 by 李宁

1

1 parent 5fd0db23
{
"permissions": {
"allow": [
"Bash(tree src/ -I node_modules)"
],
"deny": [],
"ask": []
}
}
\ No newline at end of file
......@@ -9,7 +9,7 @@
</div>
<div class="account-table">
<el-table :data="accounts" style="width: 100%">
<el-table :data="accounts" style="width: 100%" border>
<el-table-column prop="username" label="用户名" width="120"></el-table-column>
<el-table-column prop="name" label="姓名" width="100"></el-table-column>
<el-table-column prop="role" label="角色" width="120">
......@@ -17,7 +17,7 @@
<el-tag size="mini">{{ scope.row.role }}</el-tag>
</template>
</el-table-column>
<el-table-column prop="region" label="所属区域" width="150"></el-table-column>
<el-table-column prop="region" label="所属区域" width="220"></el-table-column>
<el-table-column label="联系方式" width="150">
<template slot-scope="scope">
<span>{{ scope.row.phone || scope.row.email || '-' }}</span>
......@@ -30,12 +30,12 @@
</el-tag>
</template>
</el-table-column>
<el-table-column prop="lastLogin" label="最近登录" width="150">
<el-table-column prop="lastLogin" label="最近登录" width="220">
<template slot-scope="scope">
<span>{{ scope.row.lastLogin || '从未登录' }}</span>
</template>
</el-table-column>
<el-table-column label="操作" width="120">
<el-table-column label="操作">
<template slot-scope="scope">
<el-button
type="text"
......
......@@ -4,7 +4,6 @@
<div class="toolbar">
<div class="toolbar-left">
<div class="search-wrapper">
<i class="el-icon-search search-icon"></i>
<el-input
v-model="searchQuery"
placeholder="请输入工号/手机号查询"
......@@ -44,20 +43,20 @@
<!-- 表格 -->
<div class="personnel-table">
<el-table :data="paginatedPersonnel" style="width: 100%">
<el-table :data="paginatedPersonnel" border>
<el-table-column prop="name" label="姓名" width="100"></el-table-column>
<el-table-column prop="workId" label="工号" width="100"></el-table-column>
<el-table-column prop="phone" label="手机号" width="120"></el-table-column>
<el-table-column prop="region" label="所属区域" width="200"></el-table-column>
<el-table-column label="状态" width="80">
<el-table-column prop="phone" label="手机号" width="150"></el-table-column>
<el-table-column prop="region" label="所属区域" width="250"></el-table-column>
<el-table-column label="状态" width="120">
<template slot-scope="scope">
<el-tag :type="scope.row.status === 'enabled' ? 'success' : 'info'">
{{ scope.row.status === 'enabled' ? '启用' : '关闭' }}
</el-tag>
</template>
</el-table-column>
<el-table-column prop="createTime" label="创建时间" width="150"></el-table-column>
<el-table-column label="操作" width="120">
<el-table-column prop="createTime" label="创建时间" width="220"></el-table-column>
<el-table-column label="操作" min-width="120">
<template slot-scope="scope">
<el-button
type="text"
......
......@@ -4,7 +4,6 @@
<div class="toolbar">
<div class="toolbar-left">
<div class="search-wrapper">
<i class="el-icon-search search-icon"></i>
<el-input
v-model="searchTerm"
placeholder="请输入工号查询..."
......@@ -43,7 +42,7 @@
<!-- 人员列表 -->
<div class="personnel-table">
<el-table :data="paginatedPersonnel" style="width: 100%">
<el-table :data="paginatedPersonnel" style="width: 100%" border>
<el-table-column prop="name" label="姓名" width="100"></el-table-column>
<el-table-column prop="workId" label="工号" width="100"></el-table-column>
<el-table-column prop="phone" label="手机号" width="120"></el-table-column>
......@@ -75,7 +74,7 @@
</template>
</el-table-column>
<el-table-column prop="createTime" label="创建时间" width="150"></el-table-column>
<el-table-column label="操作" width="120">
<el-table-column label="操作" min-width="150">
<template slot-scope="scope">
<el-button
type="text"
......
......@@ -65,7 +65,7 @@ const routes = [
]
const router = new VueRouter({
mode: 'history',
mode: 'hash',
base: process.env.BASE_URL,
routes
})
......
......@@ -5,8 +5,7 @@
<el-aside
:width="isCollapse ? '64px' : '240px'"
class="dashboard-sidebar"
:class="{ 'sidebar-collapsed': isCollapse, 'sidebar-expanded': !isCollapse }"
>
:class="{ 'sidebar-collapsed': isCollapse, 'sidebar-expanded': !isCollapse }">
<div class="sidebar-header">
<div class="sidebar-logo" :class="{ 'logo-center': isCollapse }">
<img
......@@ -32,8 +31,7 @@
active-text-color="#409EFF"
unique-opened
router
class="sidebar-menu"
>
class="sidebar-menu">
<template v-for="item in menuItems">
<!-- 有子菜单的项 -->
<el-submenu
......@@ -98,7 +96,7 @@
</el-aside>
<!-- 主内容区 -->
<el-container>
<el-container style="min-width: 1400px;overflow:auto;">
<!-- 顶部导航栏 -->
<el-header class="dashboard-header">
<div class="header-left">
......@@ -275,7 +273,6 @@ export default {
.dashboard-wrapper {
height: 100%;
.dashboard-sidebar {
background-color: #001529;
transition: width 0.3s ease;
......
......@@ -25,7 +25,7 @@
<div class="filter-content">
<el-row :gutter="24">
<el-col :span="6">
<el-col :span="3">
<el-cascader
v-model="selectedRegion"
:options="regionOptions"
......@@ -36,7 +36,7 @@
></el-cascader>
</el-col>
<el-col :span="6">
<el-col :span="3">
<el-select
v-model="selectedGrid"
placeholder="选择网格"
......@@ -51,7 +51,7 @@
</el-select>
</el-col>
<el-col :span="6">
<el-col :span="3">
<el-select
v-model="selectedInstaller"
placeholder="选择装维师傅"
......@@ -67,7 +67,7 @@
</el-select>
</el-col>
<el-col :span="6">
<el-col :span="3">
<el-select
v-model="selectedSales"
placeholder="选择营销人员"
......@@ -161,11 +161,12 @@
<div class="list-content">
<el-table
:data="filteredGrids"
border
style="width: 100%"
@row-click="handleRowClick"
>
<el-table-column prop="name" label="网格名称" width="120"></el-table-column>
<el-table-column prop="region" label="所属区域" width="200"></el-table-column>
<el-table-column prop="region" label="所属区域" width="250"></el-table-column>
<el-table-column prop="installerCount" label="装维师傅数" width="120"></el-table-column>
<el-table-column prop="salesCount" label="营销人员数" width="120"></el-table-column>
<el-table-column prop="opportunityCount" label="商机数" width="100"></el-table-column>
......@@ -179,8 +180,8 @@
</el-tag>
</template>
</el-table-column>
<el-table-column prop="lastActivity" label="最后活跃" width="150"></el-table-column>
<el-table-column label="操作" width="150">
<el-table-column prop="lastActivity" label="最后活跃" width="200"></el-table-column>
<el-table-column label="操作">
<template slot-scope="scope">
<el-button
type="text"
......
......@@ -101,16 +101,16 @@
<el-row :gutter="24">
<el-col :span="4">
<div class="search-wrapper">
<i class="el-icon-search search-icon"></i>
<el-input
v-model="searchTerm"
placeholder="用户账号/师傅名字/营销人员名字"
style="padding-left: 0;"
@keyup.enter.native="handleFilter"
/>
</div>
</el-col>
<el-col :span="4">
<el-col :span="6">
<el-date-picker
v-model="dateRange"
type="daterange"
......@@ -125,19 +125,6 @@
<el-col :span="4">
<el-select
v-model="selectedRegion"
placeholder="选择区域"
clearable
>
<el-option label="全部区域" value="all"></el-option>
<el-option label="玄武区" value="玄武区"></el-option>
<el-option label="秦淮区" value="秦淮区"></el-option>
<el-option label="建邺区" value="建邺区"></el-option>
</el-select>
</el-col>
<el-col :span="4">
<el-select
v-model="selectedStatus"
placeholder="选择状态"
clearable
......@@ -169,6 +156,23 @@
</el-col>
</el-row>
</div>
<div class="filter-content" style="margin-top: 20px;">
<el-row :gutter="24">
<el-col :span="4">
<el-select
v-model="selectedRegion"
placeholder="选择区域"
clearable
>
<el-option label="全部区域" value="all"></el-option>
<el-option label="玄武区" value="玄武区"></el-option>
<el-option label="秦淮区" value="秦淮区"></el-option>
<el-option label="建邺区" value="建邺区"></el-option>
</el-select>
</el-col>
</el-row>
</div>
</el-card>
<!-- 商机列表 -->
......@@ -189,17 +193,15 @@
<div class="list-content">
<el-table
:data="paginatedOpportunities"
style="width: 100%"
v-loading="loading"
>
:data="paginatedOpportunities" border
v-loading="loading">
<el-table-column prop="id" label="商机ID" width="150"></el-table-column>
<el-table-column prop="createTime" label="创建时间" width="180"></el-table-column>
<el-table-column prop="customerAddress" label="客户地址" width="200"></el-table-column>
<el-table-column prop="customerAddress" label="客户地址" width="230" show-overflow-tooltip></el-table-column>
<el-table-column prop="customerPhone" label="用户账号" width="120"></el-table-column>
<el-table-column prop="installerName" label="装维师傅姓名" width="120"></el-table-column>
<el-table-column prop="assignedToName" label="营销人员姓名" width="120"></el-table-column>
<el-table-column label="商机标签" width="150">
<el-table-column label="商机标签" width="250">
<template slot-scope="scope">
<el-tag
v-for="tag in scope.row.tags"
......@@ -223,23 +225,10 @@
</template>
</el-table-column>
<el-table-column prop="lastFollowTime" label="最新跟进" width="180"></el-table-column>
<el-table-column label="操作" width="100">
<el-table-column label="操作" min-width="150">
<template slot-scope="scope">
<el-dropdown @command="handleCommand" size="mini">
<el-button size="mini" type="text">
<i class="el-icon-more"></i>
</el-button>
<el-dropdown-menu slot="dropdown">
<el-dropdown-item :command="{type: 'view', row: scope.row}">
<i class="el-icon-view"></i>
查看详情
</el-dropdown-item>
<el-dropdown-item :command="{type: 'audit', row: scope.row}">
<i class="el-icon-document"></i>
审核
</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
<el-button type="text" @click="checkDetail(scope.row)">查看详情</el-button>
<el-button type="text" @click="checkAudio(scope.row)">审核</el-button>
</template>
</el-table-column>
</el-table>
......@@ -617,12 +606,11 @@ export default {
this.dateRange = []
this.currentPage = 1
},
handleCommand(command) {
if (command.type === 'view') {
this.$router.push(`/opportunities/${command.row.id}`)
} else if (command.type === 'audit') {
this.handleOpenAudit(command.row.id)
}
checkDetail(row){
this.$router.push(`/opportunities/${row.id}`)
},
checkAudio(row){
this.handleOpenAudit(row.id)
},
handleCreateOpportunity() {
this.$refs.opportunityForm.validate((valid) => {
......
......@@ -2,7 +2,7 @@
const path = require('path')
module.exports = {
publicPath: '/',
publicPath: './',
outputDir: 'dist',
assetsDir: 'static',
lintOnSave: process.env.NODE_ENV === 'development',
......
......@@ -30,8 +30,8 @@
<h2 class="section-title" data-node-id="6:253">用户地址</h2>
<div class="addressLi">
<div class="name">所在地区</div>
<div class="selectCity">
<input v-model="areaStore.text" @touchend.prevent="selectPicker('areaStore')" type="text" placeholder="省、市、区、街道" readonly>
<div class="selectCity" @click="openAddressSelector">
<input type="text" placeholder="省、市、区、街道" readonly v-model="selectedAddressText">
<img src="images/right.png" alt="">
</div>
</div>
......@@ -157,12 +157,49 @@
</div>
</div>
</div>
<!-- 地址选择弹窗 -->
<div class="modal-overlay address-modal" v-if="addressSelector.show">
<div class="modal address-modal-content">
<div class="modal-header">
<div class="modal-title">选择地区</div>
<div class="close-btn" @click="closeAddressSelector">×</div>
</div>
<div class="address-tabs">
<div
v-for="(tab, index) in addressTabs"
:key="index"
:class="['tab-item', { active: addressSelector.currentStep === index }]"
@click="switchToStep(index)"
>
{{ tab.name }}
</div>
</div>
<div class="address-content">
<div class="address-options">
<div
v-for="item in currentAddressOptions"
:key="item.code"
:class="['option-item', { selected: isAddressSelected(item) }]"
@click="selectAddress(item)"
>
{{ item.name }}
</div>
</div>
</div>
<div class="modal-footer">
<div class="cancel-btn" @click="closeAddressSelector">取消</div>
<div class="confirm-btn" @click="confirmAddressSelection">确定</div>
</div>
</div>
</div>
</div>
</div>
<!-- 引入Vue.js -->
<script src="js/vue.min.js"></script>
<script src="js/util.js"></script>
<script src="js/addressData.js"></script>
<script src="js/addBusi.js"></script>
</body>
</html>
\ No newline at end of file
......@@ -8,7 +8,7 @@
</head>
<body>
<div id="app" v-cloak>
<div class="app-container" data-name="我的商机-营销人员2" data-node-id="294:2276">
<div class="app-container" :class="{'worker-con': isWorker}">
<img class="topImg" src="images/bg.png" alt="">
......@@ -74,7 +74,7 @@
<div class="action-button contact-marketer" data-node-id="294:2314" @click="callMarketer">
<span data-node-id="294:2316">致电营销人员</span>
</div>
<div class="action-button contact-customer" data-node-id="294:2317" @click="callCustomer">
<div class="action-button contact-customer" data-node-id="294:2317" @click="callCustomer" v-if="!isWorker">
<span data-node-id="294:2319">联系客户</span>
</div>
</div>
......@@ -165,7 +165,7 @@
</div>
</div>
<div class="botButt">
<div class="botButt" v-if="!isWorker">
<div class="bbli">
<img src="images/genjin.png" alt="">
<div>写跟进</div>
......
......@@ -165,6 +165,7 @@ body {
margin-bottom: 0;
width: auto;
font-size: .28rem;
flex-grow: 1;
}
/* 商机类型 */
......@@ -778,3 +779,175 @@ body {
color: #0068ee;
font-weight: 500;
}
/* 地址选择弹窗样式 */
.address-modal .address-modal-content {
width: 6.8rem;
max-height: 8rem;
padding: 0;
border-radius: 0.2rem;
overflow: hidden;
display: flex;
flex-direction: column;
}
.modal-header {
display: flex;
justify-content: space-between;
align-items: center;
padding: 0.32rem 0.32rem;
border-bottom: 1px solid #f1f1f1;
}
.modal-title {
font-size: 0.36rem;
font-weight: bold;
color: #333;
}
.close-btn {
font-size: 0.48rem;
color: #999;
cursor: pointer;
width: 0.6rem;
height: 0.6rem;
display: flex;
align-items: center;
justify-content: center;
border-radius: 50%;
transition: all 0.3s ease;
}
.close-btn:hover {
background-color: #f5f5f5;
color: #333;
}
.address-tabs {
display: flex;
background-color: #f8f8f8;
border-bottom: 1px solid #f1f1f1;
}
.tab-item {
flex: 1;
text-align: center;
padding: 0.24rem 0.16rem;
font-size: 0.28rem;
color: #666;
cursor: pointer;
position: relative;
transition: all 0.3s ease;
}
.tab-item.active {
color: #0068ee;
background-color: white;
font-weight: 500;
}
.tab-item.active::after {
content: '';
position: absolute;
bottom: 0;
left: 50%;
transform: translateX(-50%);
width: 0.8rem;
height: 0.04rem;
background-color: #0068ee;
border-radius: 0.02rem;
}
.address-content {
flex: 1;
max-height: 3.6rem;
overflow-y: auto;
}
.address-options {
padding: 0.16rem 0;
}
.option-item {
padding: 0.24rem 0.32rem;
font-size: 0.28rem;
color: #333;
cursor: pointer;
transition: all 0.3s ease;
border-bottom: 1px solid #f5f5f5;
}
.option-item:last-child {
border-bottom: none;
}
.option-item:hover {
background-color: #f8f8f8;
}
.option-item.selected {
color: #0068ee;
background-color: rgba(0, 104, 238, 0.05);
font-weight: 500;
}
.option-item.selected::after {
content: '✓';
float: right;
color: #0068ee;
font-weight: bold;
}
.modal-footer {
display: flex;
justify-content: space-between;
padding: 0.24rem 0.32rem 0.32rem;
border-top: 1px solid #f1f1f1;
}
.cancel-btn, .confirm-btn {
width: 3rem;
height: 0.8rem;
line-height: 0.8rem;
text-align: center;
border-radius: 0.08rem;
font-size: 0.32rem;
cursor: pointer;
transition: all 0.3s ease;
}
.cancel-btn {
background-color: #f6f6f6;
color: #666;
}
.cancel-btn:hover {
background-color: #e6e6e6;
}
.confirm-btn {
background-color: #0176F5;
color: white;
}
.confirm-btn:hover {
background-color: #0056d3;
}
/* 滚动条样式 */
.address-content::-webkit-scrollbar {
width: 0.04rem;
}
.address-content::-webkit-scrollbar-track {
background: #f1f1f1;
}
.address-content::-webkit-scrollbar-thumb {
background: #ccc;
border-radius: 0.02rem;
}
.address-content::-webkit-scrollbar-thumb:hover {
background: #aaa;
}
\ No newline at end of file
......@@ -24,6 +24,9 @@ body {
padding: 0 .24rem;
padding-bottom: 1.3rem;
}
.worker-con{
padding-bottom: 0;
}
.topImg{
position: absolute;
......@@ -282,6 +285,10 @@ body {
.action-button.contact-marketer {
border-right: 1px solid #F1F1F1;
}
.worker-con .contact-marketer{
width: 100%;
border-right: none;
}
.detail-card{
padding: .4rem .32rem;
......
......@@ -23,6 +23,8 @@ body {
background-color: #f7f8fa;
margin: 0 auto;
position: relative;
}
.worker-con{
padding-bottom: 1.31rem; /* 为底部导航预留空间 */
}
......@@ -134,9 +136,12 @@ body {
/* 商机列表 */
.business-list {
padding: 0 0.32rem;
height: calc(100vh - 5.2rem);
height: calc(100vh - 3.8rem);
overflow: auto;
}
.worker-con .business-list{
height: calc(100vh - 5.2rem);
}
.business-card {
background-color: white;
......@@ -177,23 +182,27 @@ body {
}
.status-badge.follow-up {
background-color: #f0e6ff;
color: #8b5cf6;
background-color: #F3E8FF;
color: #8200DB;
}
.status-badge.pending {
background-color: #e6f3ff;
color: #3b82f6;
background-color: #DBEAFE;
color: #1447E6;
}
.status-badge.completed {
background-color: #dcfce7;
color: #16a34a;
color: #008236;
}
.status-badge.closed {
background-color: #f3f4f6;
color: #6b7280;
color: #333;
}
.status-badge.audio {
background-color: #FEF9C2;
color: #A65F00;
}
/* 商机详情 */
......
......@@ -71,7 +71,23 @@ new Vue({
// 用户信息
userInfo: null,
mediaStream: ''
mediaStream: '',
// 地址选择器
addressSelector: {
show: false,
currentStep: 0, // 0: 省, 1: 市, 2: 区, 3: 街道
selectedProvince: null,
selectedCity: null,
selectedDistrict: null,
selectedStreet: null
},
// 选中地址文本
selectedAddressText: '',
// 使用外部地址数据
addressData: addressData
},
created() {
......@@ -585,6 +601,121 @@ new Vue({
},
/**
* 打开地址选择器
*/
openAddressSelector() {
this.addressSelector.show = true;
this.addressSelector.currentStep = 0;
},
/**
* 关闭地址选择器
*/
closeAddressSelector() {
this.addressSelector.show = false;
},
/**
* 切换到指定步骤
*/
switchToStep(step) {
// 只有在已经选择了前面步骤的情况下才能切换到后续步骤
if (step === 0) {
this.addressSelector.currentStep = 0;
} else if (step === 1 && this.addressSelector.selectedProvince) {
this.addressSelector.currentStep = 1;
} else if (step === 2 && this.addressSelector.selectedCity) {
this.addressSelector.currentStep = 2;
} else if (step === 3 && this.addressSelector.selectedDistrict) {
this.addressSelector.currentStep = 3;
}
},
/**
* 检查地址是否被选中
*/
isAddressSelected(item) {
switch (this.addressSelector.currentStep) {
case 0: // 省份
return this.addressSelector.selectedProvince === item;
case 1: // 城市
return this.addressSelector.selectedCity === item;
case 2: // 区县
return this.addressSelector.selectedDistrict === item;
case 3: // 街道
return this.addressSelector.selectedStreet === item;
default:
return false;
}
},
/**
* 选择地址
*/
selectAddress(item) {
switch (this.addressSelector.currentStep) {
case 0: // 选择省份
this.addressSelector.selectedProvince = item;
this.addressSelector.selectedCity = null;
this.addressSelector.selectedDistrict = null;
this.addressSelector.selectedStreet = null;
this.addressSelector.currentStep = 1;
break;
case 1: // 选择城市
this.addressSelector.selectedCity = item;
this.addressSelector.selectedDistrict = null;
this.addressSelector.selectedStreet = null;
this.addressSelector.currentStep = 2;
break;
case 2: // 选择区县
this.addressSelector.selectedDistrict = item;
this.addressSelector.selectedStreet = null;
this.addressSelector.currentStep = 3;
break;
case 3: // 选择街道
this.addressSelector.selectedStreet = item;
// 选择完街道后自动确认
this.confirmAddressSelection();
break;
}
},
/**
* 确认地址选择
*/
confirmAddressSelection() {
const parts = [];
if (this.addressSelector.selectedProvince) {
parts.push(this.addressSelector.selectedProvince.name);
}
if (this.addressSelector.selectedCity) {
parts.push(this.addressSelector.selectedCity.name);
}
if (this.addressSelector.selectedDistrict) {
parts.push(this.addressSelector.selectedDistrict.name);
}
if (this.addressSelector.selectedStreet) {
parts.push(this.addressSelector.selectedStreet.name);
}
this.selectedAddressText = parts.join('');
this.closeAddressSelector();
this.addHapticFeedback();
},
/**
* 重置地址选择
*/
resetAddressSelection() {
this.addressSelector.selectedProvince = null;
this.addressSelector.selectedCity = null;
this.addressSelector.selectedDistrict = null;
this.addressSelector.selectedStreet = null;
this.addressSelector.currentStep = 0;
},
/**
* 清理资源
*/
cleanup() {
......@@ -626,6 +757,54 @@ new Vue({
*/
formattedRecordingDuration() {
return this.formatRecordingDuration(this.recordingDuration);
},
/**
* 地址选择标签页
*/
addressTabs() {
const tabs = [
{ name: '省份', key: 'province' }
];
if (this.addressSelector.selectedProvince) {
tabs.push({ name: '城市', key: 'city' });
}
if (this.addressSelector.selectedCity) {
tabs.push({ name: '区县', key: 'district' });
}
if (this.addressSelector.selectedDistrict) {
tabs.push({ name: '街道', key: 'street' });
}
return tabs;
},
/**
* 当前地址选项列表
*/
currentAddressOptions() {
switch (this.addressSelector.currentStep) {
case 0: // 省份
return this.addressData.provinces;
case 1: // 城市
if (this.addressSelector.selectedProvince) {
return this.addressSelector.selectedProvince.cities || [];
}
return [];
case 2: // 区县
if (this.addressSelector.selectedCity) {
return this.addressSelector.selectedCity.districts || [];
}
return [];
case 3: // 街道
if (this.addressSelector.selectedDistrict) {
return this.addressSelector.selectedDistrict.streets || [];
}
return [];
default:
return [];
}
}
},
......
// 全国省市区县街道数据
window.addressData = {
provinces: [
{
code: '320000',
name: '江苏省',
cities: [
{
code: '320100',
name: '南京市',
districts: [
{ code: '320102', name: '玄武区', streets: [{ code: '320102001', name: '新街口街道' }, { code: '320102002', name: '梅园新村街道' }, { code: '320102003', name: '玄武门街道' }, { code: '320102004', name: '锁金村街道' }, { code: '320102005', name: '红山街道' }, { code: '320102006', name: '孝陵卫街道' }, { code: '320102007', name: '玄武湖街道' }] },
{ code: '320104', name: '秦淮区', streets: [{ code: '320104001', name: '秦虹街道' }, { code: '320104002', name: '红花街道' }, { code: '320104003', name: '夫子庙街道' }, { code: '320104004', name: '双塘街道' }, { code: '320104005', name: '中华门街道' }, { code: '320104006', name: '月牙湖街道' }, { code: '320104007', name: '光华路街道' }, { code: '320104008', name: '瑞金路街道' }, { code: '320104009', name: '朝天宫街道' }, { code: '320104010', name: '五老村街道' }, { code: '320104011', name: '洪武路街道' }, { code: '320104012', name: '建康路街道' }] },
{ code: '320105', name: '建邺区', streets: [{ code: '320105001', name: '莫愁湖街道' }, { code: '320105002', name: '南湖街道' }, { code: '320105003', name: '兴隆街道' }, { code: '320105004', name: '南苑街道' }, { code: '320105005', name: '沙洲街道' }, { code: '320105006', name: '双闸街道' }, { code: '320105007', name: '江心洲街道' }] },
{ code: '320106', name: '鼓楼区', streets: [{ code: '320106001', name: '宁海路街道' }, { code: '320106002', name: '华侨路街道' }, { code: '320106003', name: '湖南路街道' }, { code: '320106004', name: '中央门街道' }, { code: '320106005', name: '挹江门街道' }, { code: '320106006', name: '江东街道' }, { code: '320106007', name: '凤凰街道' }, { code: '320106008', name: '热河南路街道' }, { code: '320106009', name: '下关街道' }, { code: '320106010', name: '建宁路街道' }, { code: '320106011', name: '宝塔桥街道' }, { code: '320106012', name: '小市街道' }, { code: '320106013', name: '幕府山街道' }] },
{ code: '320111', name: '浦口区', streets: [{ code: '320111001', name: '泰山街道' }, { code: '320111002', name: '顶山街道' }, { code: '320111003', name: '沿江街道' }, { code: '320111004', name: '江浦街道' }, { code: '320111005', name: '汤泉街道' }, { code: '320111006', name: '永宁街道' }, { code: '320111007', name: '盘城街道' }, { code: '320111008', name: '星甸街道' }, { code: '320111009', name: '桥林街道' }] },
{ code: '320113', name: '栖霞区', streets: [{ code: '320113001', name: '龙潭街道' }, { code: '320113002', name: '靖安街道' }, { code: '320113003', name: '八卦洲街道' }, { code: '320113004', name: '西岗街道' }, { code: '320113005', name: '栖霞街道' }, { code: '320113006', name: '尧化街道' }, { code: '320113007', name: '迈皋桥街道' }, { code: '320113008', name: '燕子矶街道' }, { code: '320113009', name: '马群街道' }, { code: '320113010', name: '仙林街道' }] },
{ code: '320114', name: '雨花台区', streets: [{ code: '320114001', name: '雨花街道' }, { code: '320114002', name: '赛虹桥街道' }, { code: '320114003', name: '西善桥街道' }, { code: '320114004', name: '板桥街道' }, { code: '320114005', name: '铁心桥街道' }, { code: '320114006', name: '宁南街道' }, { code: '320114007', name: '梅山街道' }, { code: '320114008', name: '古雄街道' }] },
{ code: '320115', name: '江宁区', streets: [{ code: '320115001', name: '东山街道' }, { code: '320115002', name: '秣陵街道' }, { code: '320115003', name: '汤山街道' }, { code: '320115004', name: '淳化街道' }, { code: '320115005', name: '禄口街道' }, { code: '320115006', name: '江宁街道' }, { code: '320115007', name: '谷里街道' }, { code: '320115008', name: '湖熟街道' }, { code: '320115009', name: '横溪街道' }, { code: '320115010', name: '麒麟街道' }] },
{ code: '320116', name: '六合区', streets: [{ code: '320116001', name: '雄州街道' }, { code: '320116002', name: '龙池街道' }, { code: '320116003', name: '马鞍街道' }, { code: '320116004', name: '横梁街道' }, { code: '320116005', name: '程桥街道' }, { code: '320116006', name: '金牛湖街道' }, { code: '320116007', name: '冶山街道' }, { code: '320116008', name: '竹镇镇' }, { code: '320116009', name: '马鞍镇' }] },
{ code: '320117', name: '溧水区', streets: [{ code: '320117001', name: '永阳街道' }, { code: '320117002', name: '白马镇' }, { code: '320117003', name: '东屏镇' }, { code: '320117004', name: '晶桥镇' }, { code: '320117005', name: '和凤镇' }, { code: '320117006', name: '洪蓝镇' }, { code: '320117007', name: '石湫镇' }, { code: '320117008', name: '柘塘镇' }] },
{ code: '320118', name: '高淳区', streets: [{ code: '320118001', name: '淳溪街道' }, { code: '320118002', name: '古柏街道' }, { code: '320118003', name: '漆桥镇' }, { code: '320118004', name: '固城镇' }, { code: '320118005', name: '东坝镇' }, { code: '320118006', name: '桠溪镇' }, { code: '320118007', name: '阳江镇' }, { code: '320118008', name: '砖墙镇' }, { code: '320118009', name: '荆溪镇' }] }
]
},
{
code: '320200',
name: '无锡市',
districts: [
{ code: '320205', name: '梁溪区', streets: [{ code: '320205001', name: '崇安寺街道' }, { code: '320205002', name: '清名桥街道' }, { code: '320205003', name: '迎龙桥街道' }, { code: '320205004', name: '南禅寺街道' }, { code: '320205005', name: '惠山街道' }, { code: '320205006', name: '北大街街道' }, { code: '320205007', name: '广瑞路街道' }, { code: '320205008', name: '扬名街道' }, { code: '320205009', name: '黄巷街道' }, { code: '320205010', name: '山北街道' }, { code: '320205011', name: '瞻江街道' }] },
{ code: '320211', name: '锡山区', streets: [{ code: '320211001', name: '东亭街道' }, { code: '320211002', name: '安镇街道' }, { code: '320211003', name: '厚桥街道' }, { code: '320211004', name: '东北塘街道' }, { code: '320211005', name: '锡北镇' }, { code: '320211006', name: '东港镇' }, { code: '320211007', name: '羊尖镇' }, { code: '320211008', name: '鹅湖镇' }] },
{ code: '320213', name: '惠山区', streets: [{ code: '320213001', name: '堰桥街道' }, { code: '320213002', name: '长安街道' }, { code: '320213003', name: '钱桥街道' }, { code: '320213004', name: '前洲街道' }, { code: '320213005', name: '玉祁街道' }, { code: '320213006', name: '洛社镇' }, { code: '320213007', name: '阳山镇' }] },
{ code: '320214', name: '滨湖区', streets: [{ code: '320214001', name: '河埒街道' }, { code: '320214002', name: '蠡湖街道' }, { code: '320214003', name: '荣巷街道' }, { code: '320214004', name: '蠡园街道' }, { code: '320214005', name: '华庄街道' }, { code: '320214006', name: '太湖街道' }, { code: '320214007', name: '雪浪街道' }, { code: '320214008', name: '马山街道' }] },
{ code: '320281', name: '江阴市', streets: [{ code: '320281001', name: '澄江街道' }, { code: '320281002', name: '南闸街道' }, { code: '320281003', name: '云亭街道' }, { code: '320281004', name: '夏港街道' }, { code: '320281005', name: '申港街道' }, { code: '320281006', name: '利港街道' }, { code: '320281007', name: '璜土镇' }, { code: '320281008', name: '月城镇' }, { code: '320281009', name: '青阳镇' }, { code: '320281010', name: '徐霞客镇' }, { code: '320281011', name: '华士镇' }, { code: '320281012', name: '周庄镇' }, { code: '320281013', name: '新桥镇' }, { code: '320281014', name: '长泾镇' }, { code: '320281015', name: '顾山镇' }, { code: '320281016', name: '祝塘镇' }] },
{ code: '320282', name: '宜兴市', streets: [{ code: '320282001', name: '宜城街道' }, { code: '320282002', name: '屺亭街道' }, { code: '320282003', name: '新街街道' }, { code: '320282004', name: '新庄街道' }, { code: '320282005', name: '张渚镇' }, { code: '320282006', name: '西渚镇' }, { code: '320282007', name: '太华镇' }, { code: '320282008', name: '徐舍镇' }, { code: '320282009', name: '官林镇' }, { code: '320282010', name: '杨巷镇' }, { code: '320282011', name: '新建镇' }, { code: '320282012', name: '和桥镇' }, { code: '320282013', name: '高塍镇' }, { code: '320282014', name: '万石镇' }, { code: '320282015', name: '周铁镇' }, { code: '320282016', name: '芳桥镇' }, { code: '320282017', name: '丁蜀镇' }] }
]
}
]
}
]
}
\ No newline at end of file
......@@ -5,6 +5,8 @@ new Vue({
el: '#app',
data: {
isWorker: false,
// 商机详情数据 - 按照设计图中的真实数据
businessDetail: {
businessId: 'OP20250928002', // 商机ID
......@@ -45,7 +47,7 @@ new Vue({
userInfo: null,
gjStore: {
isShow: true,
isShow: false,
isLoading: false
},
......
new Vue({
el: '#app',
data: {
isWorker: true,
searchKeyword: '',
activeTab: 'completed',
filterTags: [
......
......@@ -8,9 +8,7 @@
</head>
<body>
<div id="app" v-cloak>
<div class="app-container" data-name="我的商机" data-node-id="355:428">
<div class="app-container" :class="{'worker-con': isWorker}">
<!-- 标签页统计 -->
<div class="tab-stats" data-node-id="355:513">
<div class="active-indicator" data-node-id="355:514"></div>
......@@ -143,7 +141,7 @@
</div>
<!-- 底部导航 -->
<div class="bottom-nav" data-name="tab" data-node-id="355:520">
<div class="bottom-nav" v-if="isWorker">
<div
class="nav-item collect-business"
data-name="收集商机"
......
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!