Commit c6726567 by 李宁

1

1 parent 5fd0db23
{
"permissions": {
"allow": [
"Bash(tree src/ -I node_modules)"
],
"deny": [],
"ask": []
}
}
\ No newline at end of file \ No newline at end of file
...@@ -9,7 +9,7 @@ ...@@ -9,7 +9,7 @@
</div> </div>
<div class="account-table"> <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="username" label="用户名" width="120"></el-table-column>
<el-table-column prop="name" label="姓名" width="100"></el-table-column> <el-table-column prop="name" label="姓名" width="100"></el-table-column>
<el-table-column prop="role" label="角色" width="120"> <el-table-column prop="role" label="角色" width="120">
...@@ -17,7 +17,7 @@ ...@@ -17,7 +17,7 @@
<el-tag size="mini">{{ scope.row.role }}</el-tag> <el-tag size="mini">{{ scope.row.role }}</el-tag>
</template> </template>
</el-table-column> </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"> <el-table-column label="联系方式" width="150">
<template slot-scope="scope"> <template slot-scope="scope">
<span>{{ scope.row.phone || scope.row.email || '-' }}</span> <span>{{ scope.row.phone || scope.row.email || '-' }}</span>
...@@ -30,12 +30,12 @@ ...@@ -30,12 +30,12 @@
</el-tag> </el-tag>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column prop="lastLogin" label="最近登录" width="150"> <el-table-column prop="lastLogin" label="最近登录" width="220">
<template slot-scope="scope"> <template slot-scope="scope">
<span>{{ scope.row.lastLogin || '从未登录' }}</span> <span>{{ scope.row.lastLogin || '从未登录' }}</span>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="操作" width="120"> <el-table-column label="操作">
<template slot-scope="scope"> <template slot-scope="scope">
<el-button <el-button
type="text" type="text"
......
...@@ -4,7 +4,6 @@ ...@@ -4,7 +4,6 @@
<div class="toolbar"> <div class="toolbar">
<div class="toolbar-left"> <div class="toolbar-left">
<div class="search-wrapper"> <div class="search-wrapper">
<i class="el-icon-search search-icon"></i>
<el-input <el-input
v-model="searchQuery" v-model="searchQuery"
placeholder="请输入工号/手机号查询" placeholder="请输入工号/手机号查询"
...@@ -44,20 +43,20 @@ ...@@ -44,20 +43,20 @@
<!-- 表格 --> <!-- 表格 -->
<div class="personnel-table"> <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="name" label="姓名" width="100"></el-table-column>
<el-table-column prop="workId" 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="phone" label="手机号" width="150"></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 label="状态" width="80"> <el-table-column label="状态" width="120">
<template slot-scope="scope"> <template slot-scope="scope">
<el-tag :type="scope.row.status === 'enabled' ? 'success' : 'info'"> <el-tag :type="scope.row.status === 'enabled' ? 'success' : 'info'">
{{ scope.row.status === 'enabled' ? '启用' : '关闭' }} {{ scope.row.status === 'enabled' ? '启用' : '关闭' }}
</el-tag> </el-tag>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column prop="createTime" label="创建时间" width="150"></el-table-column> <el-table-column prop="createTime" label="创建时间" width="220"></el-table-column>
<el-table-column label="操作" width="120"> <el-table-column label="操作" min-width="120">
<template slot-scope="scope"> <template slot-scope="scope">
<el-button <el-button
type="text" type="text"
......
...@@ -4,7 +4,6 @@ ...@@ -4,7 +4,6 @@
<div class="toolbar"> <div class="toolbar">
<div class="toolbar-left"> <div class="toolbar-left">
<div class="search-wrapper"> <div class="search-wrapper">
<i class="el-icon-search search-icon"></i>
<el-input <el-input
v-model="searchTerm" v-model="searchTerm"
placeholder="请输入工号查询..." placeholder="请输入工号查询..."
...@@ -43,7 +42,7 @@ ...@@ -43,7 +42,7 @@
<!-- 人员列表 --> <!-- 人员列表 -->
<div class="personnel-table"> <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="name" label="姓名" width="100"></el-table-column>
<el-table-column prop="workId" 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="phone" label="手机号" width="120"></el-table-column>
...@@ -75,7 +74,7 @@ ...@@ -75,7 +74,7 @@
</template> </template>
</el-table-column> </el-table-column>
<el-table-column prop="createTime" label="创建时间" width="150"></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"> <template slot-scope="scope">
<el-button <el-button
type="text" type="text"
......
...@@ -65,7 +65,7 @@ const routes = [ ...@@ -65,7 +65,7 @@ const routes = [
] ]
const router = new VueRouter({ const router = new VueRouter({
mode: 'history', mode: 'hash',
base: process.env.BASE_URL, base: process.env.BASE_URL,
routes routes
}) })
......
...@@ -5,8 +5,7 @@ ...@@ -5,8 +5,7 @@
<el-aside <el-aside
:width="isCollapse ? '64px' : '240px'" :width="isCollapse ? '64px' : '240px'"
class="dashboard-sidebar" class="dashboard-sidebar"
:class="{ 'sidebar-collapsed': isCollapse, 'sidebar-expanded': !isCollapse }" :class="{ 'sidebar-collapsed': isCollapse, 'sidebar-expanded': !isCollapse }">
>
<div class="sidebar-header"> <div class="sidebar-header">
<div class="sidebar-logo" :class="{ 'logo-center': isCollapse }"> <div class="sidebar-logo" :class="{ 'logo-center': isCollapse }">
<img <img
...@@ -32,8 +31,7 @@ ...@@ -32,8 +31,7 @@
active-text-color="#409EFF" active-text-color="#409EFF"
unique-opened unique-opened
router router
class="sidebar-menu" class="sidebar-menu">
>
<template v-for="item in menuItems"> <template v-for="item in menuItems">
<!-- 有子菜单的项 --> <!-- 有子菜单的项 -->
<el-submenu <el-submenu
...@@ -98,7 +96,7 @@ ...@@ -98,7 +96,7 @@
</el-aside> </el-aside>
<!-- 主内容区 --> <!-- 主内容区 -->
<el-container> <el-container style="min-width: 1400px;overflow:auto;">
<!-- 顶部导航栏 --> <!-- 顶部导航栏 -->
<el-header class="dashboard-header"> <el-header class="dashboard-header">
<div class="header-left"> <div class="header-left">
...@@ -275,7 +273,6 @@ export default { ...@@ -275,7 +273,6 @@ export default {
.dashboard-wrapper { .dashboard-wrapper {
height: 100%; height: 100%;
.dashboard-sidebar { .dashboard-sidebar {
background-color: #001529; background-color: #001529;
transition: width 0.3s ease; transition: width 0.3s ease;
......
...@@ -25,7 +25,7 @@ ...@@ -25,7 +25,7 @@
<div class="filter-content"> <div class="filter-content">
<el-row :gutter="24"> <el-row :gutter="24">
<el-col :span="6"> <el-col :span="3">
<el-cascader <el-cascader
v-model="selectedRegion" v-model="selectedRegion"
:options="regionOptions" :options="regionOptions"
...@@ -36,7 +36,7 @@ ...@@ -36,7 +36,7 @@
></el-cascader> ></el-cascader>
</el-col> </el-col>
<el-col :span="6"> <el-col :span="3">
<el-select <el-select
v-model="selectedGrid" v-model="selectedGrid"
placeholder="选择网格" placeholder="选择网格"
...@@ -51,7 +51,7 @@ ...@@ -51,7 +51,7 @@
</el-select> </el-select>
</el-col> </el-col>
<el-col :span="6"> <el-col :span="3">
<el-select <el-select
v-model="selectedInstaller" v-model="selectedInstaller"
placeholder="选择装维师傅" placeholder="选择装维师傅"
...@@ -67,7 +67,7 @@ ...@@ -67,7 +67,7 @@
</el-select> </el-select>
</el-col> </el-col>
<el-col :span="6"> <el-col :span="3">
<el-select <el-select
v-model="selectedSales" v-model="selectedSales"
placeholder="选择营销人员" placeholder="选择营销人员"
...@@ -161,11 +161,12 @@ ...@@ -161,11 +161,12 @@
<div class="list-content"> <div class="list-content">
<el-table <el-table
:data="filteredGrids" :data="filteredGrids"
border
style="width: 100%" style="width: 100%"
@row-click="handleRowClick" @row-click="handleRowClick"
> >
<el-table-column prop="name" label="网格名称" width="120"></el-table-column> <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="installerCount" label="装维师傅数" width="120"></el-table-column>
<el-table-column prop="salesCount" 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> <el-table-column prop="opportunityCount" label="商机数" width="100"></el-table-column>
...@@ -179,8 +180,8 @@ ...@@ -179,8 +180,8 @@
</el-tag> </el-tag>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column prop="lastActivity" label="最后活跃" width="150"></el-table-column> <el-table-column prop="lastActivity" label="最后活跃" width="200"></el-table-column>
<el-table-column label="操作" width="150"> <el-table-column label="操作">
<template slot-scope="scope"> <template slot-scope="scope">
<el-button <el-button
type="text" type="text"
......
...@@ -101,16 +101,16 @@ ...@@ -101,16 +101,16 @@
<el-row :gutter="24"> <el-row :gutter="24">
<el-col :span="4"> <el-col :span="4">
<div class="search-wrapper"> <div class="search-wrapper">
<i class="el-icon-search search-icon"></i>
<el-input <el-input
v-model="searchTerm" v-model="searchTerm"
placeholder="用户账号/师傅名字/营销人员名字" placeholder="用户账号/师傅名字/营销人员名字"
style="padding-left: 0;"
@keyup.enter.native="handleFilter" @keyup.enter.native="handleFilter"
/> />
</div> </div>
</el-col> </el-col>
<el-col :span="4"> <el-col :span="6">
<el-date-picker <el-date-picker
v-model="dateRange" v-model="dateRange"
type="daterange" type="daterange"
...@@ -125,19 +125,6 @@ ...@@ -125,19 +125,6 @@
<el-col :span="4"> <el-col :span="4">
<el-select <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" v-model="selectedStatus"
placeholder="选择状态" placeholder="选择状态"
clearable clearable
...@@ -169,6 +156,23 @@ ...@@ -169,6 +156,23 @@
</el-col> </el-col>
</el-row> </el-row>
</div> </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> </el-card>
<!-- 商机列表 --> <!-- 商机列表 -->
...@@ -189,17 +193,15 @@ ...@@ -189,17 +193,15 @@
<div class="list-content"> <div class="list-content">
<el-table <el-table
:data="paginatedOpportunities" :data="paginatedOpportunities" border
style="width: 100%" v-loading="loading">
v-loading="loading"
>
<el-table-column prop="id" label="商机ID" width="150"></el-table-column> <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="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="customerPhone" label="用户账号" width="120"></el-table-column>
<el-table-column prop="installerName" 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 prop="assignedToName" label="营销人员姓名" width="120"></el-table-column>
<el-table-column label="商机标签" width="150"> <el-table-column label="商机标签" width="250">
<template slot-scope="scope"> <template slot-scope="scope">
<el-tag <el-tag
v-for="tag in scope.row.tags" v-for="tag in scope.row.tags"
...@@ -223,23 +225,10 @@ ...@@ -223,23 +225,10 @@
</template> </template>
</el-table-column> </el-table-column>
<el-table-column prop="lastFollowTime" label="最新跟进" width="180"></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"> <template slot-scope="scope">
<el-dropdown @command="handleCommand" size="mini"> <el-button type="text" @click="checkDetail(scope.row)">查看详情</el-button>
<el-button size="mini" type="text"> <el-button type="text" @click="checkAudio(scope.row)">审核</el-button>
<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>
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
...@@ -617,12 +606,11 @@ export default { ...@@ -617,12 +606,11 @@ export default {
this.dateRange = [] this.dateRange = []
this.currentPage = 1 this.currentPage = 1
}, },
handleCommand(command) { checkDetail(row){
if (command.type === 'view') { this.$router.push(`/opportunities/${row.id}`)
this.$router.push(`/opportunities/${command.row.id}`) },
} else if (command.type === 'audit') { checkAudio(row){
this.handleOpenAudit(command.row.id) this.handleOpenAudit(row.id)
}
}, },
handleCreateOpportunity() { handleCreateOpportunity() {
this.$refs.opportunityForm.validate((valid) => { this.$refs.opportunityForm.validate((valid) => {
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
const path = require('path') const path = require('path')
module.exports = { module.exports = {
publicPath: '/', publicPath: './',
outputDir: 'dist', outputDir: 'dist',
assetsDir: 'static', assetsDir: 'static',
lintOnSave: process.env.NODE_ENV === 'development', lintOnSave: process.env.NODE_ENV === 'development',
......
...@@ -30,8 +30,8 @@ ...@@ -30,8 +30,8 @@
<h2 class="section-title" data-node-id="6:253">用户地址</h2> <h2 class="section-title" data-node-id="6:253">用户地址</h2>
<div class="addressLi"> <div class="addressLi">
<div class="name">所在地区</div> <div class="name">所在地区</div>
<div class="selectCity"> <div class="selectCity" @click="openAddressSelector">
<input v-model="areaStore.text" @touchend.prevent="selectPicker('areaStore')" type="text" placeholder="省、市、区、街道" readonly> <input type="text" placeholder="省、市、区、街道" readonly v-model="selectedAddressText">
<img src="images/right.png" alt=""> <img src="images/right.png" alt="">
</div> </div>
</div> </div>
...@@ -157,12 +157,49 @@ ...@@ -157,12 +157,49 @@
</div> </div>
</div> </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>
</div> </div>
<!-- 引入Vue.js --> <!-- 引入Vue.js -->
<script src="js/vue.min.js"></script> <script src="js/vue.min.js"></script>
<script src="js/util.js"></script> <script src="js/util.js"></script>
<script src="js/addressData.js"></script>
<script src="js/addBusi.js"></script> <script src="js/addBusi.js"></script>
</body> </body>
</html> </html>
\ No newline at end of file \ No newline at end of file
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
</head> </head>
<body> <body>
<div id="app" v-cloak> <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=""> <img class="topImg" src="images/bg.png" alt="">
...@@ -74,7 +74,7 @@ ...@@ -74,7 +74,7 @@
<div class="action-button contact-marketer" data-node-id="294:2314" @click="callMarketer"> <div class="action-button contact-marketer" data-node-id="294:2314" @click="callMarketer">
<span data-node-id="294:2316">致电营销人员</span> <span data-node-id="294:2316">致电营销人员</span>
</div> </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> <span data-node-id="294:2319">联系客户</span>
</div> </div>
</div> </div>
...@@ -165,7 +165,7 @@ ...@@ -165,7 +165,7 @@
</div> </div>
</div> </div>
<div class="botButt"> <div class="botButt" v-if="!isWorker">
<div class="bbli"> <div class="bbli">
<img src="images/genjin.png" alt=""> <img src="images/genjin.png" alt="">
<div>写跟进</div> <div>写跟进</div>
......
...@@ -165,6 +165,7 @@ body { ...@@ -165,6 +165,7 @@ body {
margin-bottom: 0; margin-bottom: 0;
width: auto; width: auto;
font-size: .28rem; font-size: .28rem;
flex-grow: 1;
} }
/* 商机类型 */ /* 商机类型 */
...@@ -778,3 +779,175 @@ body { ...@@ -778,3 +779,175 @@ body {
color: #0068ee; color: #0068ee;
font-weight: 500; 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 \ No newline at end of file
...@@ -24,6 +24,9 @@ body { ...@@ -24,6 +24,9 @@ body {
padding: 0 .24rem; padding: 0 .24rem;
padding-bottom: 1.3rem; padding-bottom: 1.3rem;
} }
.worker-con{
padding-bottom: 0;
}
.topImg{ .topImg{
position: absolute; position: absolute;
...@@ -282,6 +285,10 @@ body { ...@@ -282,6 +285,10 @@ body {
.action-button.contact-marketer { .action-button.contact-marketer {
border-right: 1px solid #F1F1F1; border-right: 1px solid #F1F1F1;
} }
.worker-con .contact-marketer{
width: 100%;
border-right: none;
}
.detail-card{ .detail-card{
padding: .4rem .32rem; padding: .4rem .32rem;
......
...@@ -23,6 +23,8 @@ body { ...@@ -23,6 +23,8 @@ body {
background-color: #f7f8fa; background-color: #f7f8fa;
margin: 0 auto; margin: 0 auto;
position: relative; position: relative;
}
.worker-con{
padding-bottom: 1.31rem; /* 为底部导航预留空间 */ padding-bottom: 1.31rem; /* 为底部导航预留空间 */
} }
...@@ -134,9 +136,12 @@ body { ...@@ -134,9 +136,12 @@ body {
/* 商机列表 */ /* 商机列表 */
.business-list { .business-list {
padding: 0 0.32rem; padding: 0 0.32rem;
height: calc(100vh - 5.2rem); height: calc(100vh - 3.8rem);
overflow: auto; overflow: auto;
} }
.worker-con .business-list{
height: calc(100vh - 5.2rem);
}
.business-card { .business-card {
background-color: white; background-color: white;
...@@ -177,23 +182,27 @@ body { ...@@ -177,23 +182,27 @@ body {
} }
.status-badge.follow-up { .status-badge.follow-up {
background-color: #f0e6ff; background-color: #F3E8FF;
color: #8b5cf6; color: #8200DB;
} }
.status-badge.pending { .status-badge.pending {
background-color: #e6f3ff; background-color: #DBEAFE;
color: #3b82f6; color: #1447E6;
} }
.status-badge.completed { .status-badge.completed {
background-color: #dcfce7; background-color: #dcfce7;
color: #16a34a; color: #008236;
} }
.status-badge.closed { .status-badge.closed {
background-color: #f3f4f6; background-color: #f3f4f6;
color: #6b7280; color: #333;
}
.status-badge.audio {
background-color: #FEF9C2;
color: #A65F00;
} }
/* 商机详情 */ /* 商机详情 */
......
...@@ -71,7 +71,23 @@ new Vue({ ...@@ -71,7 +71,23 @@ new Vue({
// 用户信息 // 用户信息
userInfo: null, 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() { created() {
...@@ -585,6 +601,121 @@ new Vue({ ...@@ -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() { cleanup() {
...@@ -626,6 +757,54 @@ new Vue({ ...@@ -626,6 +757,54 @@ new Vue({
*/ */
formattedRecordingDuration() { formattedRecordingDuration() {
return this.formatRecordingDuration(this.recordingDuration); 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 \ No newline at end of file
...@@ -5,6 +5,8 @@ new Vue({ ...@@ -5,6 +5,8 @@ new Vue({
el: '#app', el: '#app',
data: { data: {
isWorker: false,
// 商机详情数据 - 按照设计图中的真实数据 // 商机详情数据 - 按照设计图中的真实数据
businessDetail: { businessDetail: {
businessId: 'OP20250928002', // 商机ID businessId: 'OP20250928002', // 商机ID
...@@ -45,7 +47,7 @@ new Vue({ ...@@ -45,7 +47,7 @@ new Vue({
userInfo: null, userInfo: null,
gjStore: { gjStore: {
isShow: true, isShow: false,
isLoading: false isLoading: false
}, },
......
new Vue({ new Vue({
el: '#app', el: '#app',
data: { data: {
isWorker: true,
searchKeyword: '', searchKeyword: '',
activeTab: 'completed', activeTab: 'completed',
filterTags: [ filterTags: [
......
...@@ -8,9 +8,7 @@ ...@@ -8,9 +8,7 @@
</head> </head>
<body> <body>
<div id="app" v-cloak> <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="tab-stats" data-node-id="355:513">
<div class="active-indicator" data-node-id="355:514"></div> <div class="active-indicator" data-node-id="355:514"></div>
...@@ -143,7 +141,7 @@ ...@@ -143,7 +141,7 @@
</div> </div>
<!-- 底部导航 --> <!-- 底部导航 -->
<div class="bottom-nav" data-name="tab" data-node-id="355:520"> <div class="bottom-nav" v-if="isWorker">
<div <div
class="nav-item collect-business" class="nav-item collect-business"
data-name="收集商机" data-name="收集商机"
......
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!