Browse Source

Merge branch 'master' of ssh://gitlab.frkj.cc:222/php/ZhiHuiJiaoWu_UniApp

master
王泽彦 10 months ago
parent
commit
528334c021
  1. 58
      api/apiRoute.js
  2. 4
      common/config.js
  3. 56
      components/AQ/AQUplodeImage.vue
  4. 13
      manifest.json
  5. 19
      pages.json
  6. 47
      pages/coach/my/exam_results.vue
  7. 185
      pages/coach/my/gotake_exam.vue
  8. 16
      pages/coach/my/teaching_management.vue
  9. 344
      pages/common/im_chat_info.vue
  10. 706
      pages/common/my_attendance.vue
  11. 7
      pages/market/clue/index.vue
  12. 219
      pages/market/my/firm_info.vue
  13. BIN
      static/icon-img/ding_wei.png

58
api/apiRoute.js

@ -38,6 +38,20 @@ export default {
return res;
})
},
//教师/销售端请假/打卡/签退-编辑
common_attendanceEdit(data = {}) {
let url = '/attendance/edit'
return http.post(url, data).then(res => {
return res;
})
},
//教师/销售端请假/打卡/签退-列表
common_attendanceIndex(data = {}) {
let url = '/attendance/index'
return http.post(url, data).then(res => {
return res;
})
},
//获取字典数据
common_Dictionary(data = {}) {
let url = '/common/getDictionary'
@ -67,6 +81,13 @@ export default {
return res;
})
},
//公共端-教师/销售端验证旧密码是否正确
common_getPersonnelCampus(data = {}) {
let url = '/campus/getPersonnelCampus'
return http.get(url, data).then(res => {
return res;
})
},
@ -131,6 +152,20 @@ export default {
return res;
})
},
//获取试卷
getTeachingTestPaper(data = {}) {
let url = '/teachingResearch/teachingTestPaper'
return http.get(url, data).then(res => {
return res;
})
},
//提交试卷
submitTestPaper(data = {}) {
let url = '/teachingResearch/submitTestPaper'
return http.get(url, data).then(res => {
return res;
})
},
//↑↑↑↑↑↑↑↑↑↑↑↑-----教练接口相关-----↑↑↑↑↑↑↑↑↑↑↑↑
@ -206,6 +241,29 @@ export default {
})
},
//销售端-获取好友关系绑定详情
xs_chatGetChatFriendsInfo(data = {}) {
let url = '/chat/getChatFriendsInfo'
return http.get(url, data).then(res => {
return res;
})
},
//销售端-获取聊天消息列表
xs_chatGetChatMessagesList(data = {}) {
let url = '/chat/getChatMessagesList'
return http.get(url, data).then(res => {
return res;
})
},
//销售端-发送聊天消息
xs_chatSendChatMessages(data = {}) {
let url = '/chat/sendChatMessages'
return http.post(url, data).then(res => {
return res;
})
},

4
common/config.js

@ -10,8 +10,8 @@ const img_domian = 'http://zhjwxt.test/'
// const Api_url='https://zh.hnhbty.cn/api'
// const img_domian = 'https://zh.hnhbty.cn/'
// const Api_url='http://146.56.228.75:20024/api'
// const img_domian = 'http://146.56.228.75:20024/'
const Api_url='http://146.56.228.75:20024/api'
const img_domian = 'http://146.56.228.75:20024/'
const IsDemo = false

56
components/AQ/AQUplodeImage.vue

@ -0,0 +1,56 @@
<template>
<view @click="chooseImage">
<slot></slot>
</view>
</template>
<script>
export default {
props: {
multiple: { type: Boolean, default: false },
limit: { type: Number, default: 1 },
uploadUrl: { type: String, default: '' },
extraData: { type: Object, default: () => ({}) }
},
methods: {
chooseImage() {
uni.chooseImage({
count: this.multiple ? this.limit : 1,
sizeType: ['compressed'],
sourceType: ['album', 'camera'],
success: (res) => {
const tempFilePath = res.tempFilePaths[0];
this.uploadFile(tempFilePath);
}
});
},
uploadFile(filePath) {
let token = uni.getStorageSync('token');
uni.uploadFile({
url: this.uploadUrl,
filePath: filePath,
name: 'file',
header: {
'token': token
},
formData: this.extraData.formData || {},
success: (e) => {
try {
let res = JSON.parse(e.data.replace(/\ufeff/g, "") || "{}");
if (res.code === 1) {
this.$emit('uplodeImageRes', res.data, this.extraData);
} else {
uni.showToast({ title: res.msg, icon: 'none' });
}
} catch (error) {
uni.showToast({ title: '解析失败', icon: 'none' });
}
},
fail: () => {
uni.showToast({ title: '上传失败', icon: 'none' });
}
});
}
}
}
</script>

13
manifest.json

@ -72,9 +72,13 @@
"permission" : {
"scope.userFuzzyLocation" : {
"desc" : "你的位置信息将用于小程序位置接口的效果展示"
},
"scope.userLocation" : {
"desc" : "用于获取当前所在城市信息"
}
},
"requiredPrivateInfos" : [ "getLocation", "chooseLocation" ]
"requiredPrivateInfos" : [ "getLocation", "chooseLocation" ],
"libVersion":"latest"
},
"mp-alipay" : {
"usingComponents" : true
@ -92,6 +96,13 @@
"router" : {
"base" : "./",
"mode" : "history"
},
"sdkConfigs" : {
"maps" : {
"tencent" : {
"key" : "AKTBZ-OGICT-E5NXQ-LGEGK-H5AJ5-M2BOX"
}
}
}
}
}

19
pages.json

@ -400,7 +400,24 @@
"navigationBarTextStyle": "black"
}
},
{
"path": "pages/coach/my/gotake_exam",
"style": {
"navigationBarTitleText": "考试",
"navigationStyle": "default",
"navigationBarBackgroundColor": "#171717",
"navigationBarTextStyle": "black"
}
},
{
"path": "pages/coach/my/exam_results",
"style": {
"navigationBarTitleText": "考试结果",
"navigationStyle": "default",
"navigationBarBackgroundColor": "#fff",
"navigationBarTextStyle": "black"
}
},

47
pages/coach/my/exam_results.vue

@ -0,0 +1,47 @@
<template>
<view>
<view style="margin-top: 380rpx;text-align: center;font-size: 50rpx;font-weight: bold;">
答对{{success}},答错{{error}}
</view>
<view style="margin-top: 15rpx;text-align: center;font-size: 50rpx;font-weight: bold;">
总共得分{{num}}
</view>
<view @click="back" style="background-color: #00bfa5;margin: auto;text-align: center;margin-top: 30rpx;border-radius: 50rpx;font-size: 42rpx;padding: 20rpx;">
返回列表
</view>
</view>
</template>
<script>
export default {
data() {
return {
error: '',
success: '',
num: ''
}
},
onLoad(options) {
if(options.error){
this.error = options.error;
}
if(options.success){
this.success = options.success;
}
if(options.num){
this.num = options.num;
}
},
methods: {
back() {
uni.navigateTo({
url: '/pages/coach/my/teaching_management'
})
}
}
}
</script>
<style>
</style>

185
pages/coach/my/gotake_exam.vue

@ -0,0 +1,185 @@
<template>
<view class="whole">
<view style="height: 36rpx;"></view>
<view class="topic" v-for="(item,index) in quantityArr" :key="index" v-show="quantity == index">
<view class="dis_style">
<view class="title_icon">{{index + 1}}</view>
<view class="title_con" v-if="item.question_content_type === 'text'">{{item.question_content}}?</view>
</view>
<view class="dis_style">
<view class="title_con" style="margin: auto;" v-if="item.question_content_type === 'image'">
<img style="width: 300rpx;height: 300rpx;" :src="item.question_content" mode="aspectFit">
</view>
</view>
<view style="line-height: 60rpx;margin-top: 16rpx;">
<fui-radio-group name="radio" v-model="optionList[index]">
<fui-checkbox-group name="checkbox" v-model="optionList[index]">
<view class="title_con title_font" style="display: flex;align-items: center;" v-for="(item_option,index_option) in item.option_json" :key="index_option">
<view style="display: flex;align-items: center;">
<fui-radio :value="item_option.option" v-if="item.question_type != 'multiple_choice'"></fui-radio>
<fui-checkbox :value="item_option.option" v-if="item.question_type == 'multiple_choice'"></fui-checkbox>
</view>
<view>{{item_option.option}}. {{item_option.option_content}}</view>
</view>
</fui-checkbox-group>
</fui-radio-group>
</view>
</view>
<view class="progress_bar">
<fui-progress :percent="number_progress" background="#ddd" activeColor="#00bfa5" height="10"></fui-progress>
</view>
<view class="switch_style">
<view class="dis_style" style="color: #3e94ed;font-size: 30rpx;">
<view @click="previous_question">上一题</view>
<view style="margin-left: 20rpx;" @click="next_question">下一题</view>
</view>
<view class="sub_style" @click="submit">
提交试卷
</view>
</view>
</view>
</template>
<script>
import apiRoute from '@/api/apiRoute.js';
export default {
data() {
return {
quantity: 0,
quantityArr: [1,2,3,4],
number_progress: 0,
testPaperId: 0,
optionList: [],
zid: 0
}
},
onLoad(options) {
if(options.id){
this.testPaperId = options.id;
}
if(options.zid){
this.zid = options.zid;
}
console.log(this.testPaperId, 999)
this.init()
},
methods: {
async init() {
const res = await apiRoute.getTeachingTestPaper({exam_papers_id: this.testPaperId});
if(res.code === 1) {
this.quantityArr = res.data.resText
this.number_progress = (Math.round(100 / res.data.count) * ( this.quantity + 1));
}
},
previous_question() {
if(this.quantity <= 0){
uni.showToast({
title: '已经是第一题了',
icon: 'none'
})
return
} else {
this.quantity--
}
this.number_progress = (Math.round(100 / this.quantityArr.length) * ( this.quantity + 1));
},
next_question() {
if((this.quantity + 1) >= this.quantityArr.length){
uni.showToast({
title: '已经是最后一题了',
icon: 'none'
})
return
} else {
this.quantity++
}
this.number_progress = (Math.round(100 / this.quantityArr.length) * ( this.quantity + 1));
},
async submit() {
this.optionList.forEach((item,index) => {
if (Array.isArray(item)) {
this.optionList[index] = item.join(',')
}
})
const res = await apiRoute.submitTestPaper({optionList: this.optionList,testPaperId: this.testPaperId, id: this.zid});
if(res.code === 1) {
uni.navigateTo({
url: '/pages/coach/my/exam_results?error=' + res.data.error + '&success=' + res.data.success + '&num=' + res.data.num
})
} else {
uni.showToast({
title: res.msg,
icon: 'none'
})
return
}
}
}
}
</script>
<style>
.whole{
width: 100%;
height: 100vh;
background-color: #171717;
}
.topic{
width: 95%;
height: auto;
background-color: #2d2d2d;
border: #3e91e8 4rpx solid;
border-radius: 16rpx;
padding: 26rpx;
margin: auto;
}
.dis_style{
display: flex;
align-items: center;
}
.title_icon{
width: 60rpx;
height: 60rpx;
border-radius: 50rpx;
background-color: #00bfa5;
font-size: 26rpx;
color: #fff;
font-weight: bold;
text-align: center;
line-height: 60rpx;
}
.title_con{
margin-left: 16rpx;
font-size: 26rpx;
color: #fff;
}
.title_font{
font-size: 30rpx;
}
.progress_bar{
width: 95%;
margin: 36rpx auto;
}
.switch_style{
width: 95%;
height: auto;
padding: 26rpx;
background-color: #2d2d2d;
border-radius: 16rpx;
margin: auto;
display: flex;
align-items: center;
justify-content: space-between;
}
.sub_style{
font-size: 32rpx;
padding: 15rpx 30rpx;
border-radius: 30rpx;
color: #000;
font-weight: bold;
text-align: center;
background-color: #35a3f0;
}
</style>

16
pages/coach/my/teaching_management.vue

@ -2,12 +2,16 @@
<view>
<fui-tabs :tabs="tabsList" @change="change" isDot scroll alignLeft></fui-tabs>
<scroll-view scroll-y :scroll-with-animation="true" @scrolltolower="onReachBottom">
<view class="dis_style div_style" v-for="(item,index) in arrayList" :key="index" @click="info(item.id)">
<view>
<view class="dis_style div_style" v-for="(item,index) in arrayList" :key="index">
<view @click="info(item.id)">
<view class='color_style'>{{item.title}}</view>
<view class='color_type_style'>{{getTableType(item.table_type)}}</view>
</view>
<view class='color_date_style'>{{item.create_time}}</view>
<view>
<view class='color_date_style'>{{item.create_time}}</view>
<view class='color_date_style' style="color: blue;" v-if="item.exam_papers_id != 0" @click="goTake(item.exam_papers_id,item.id)">去考试</view>
</view>
</view>
<view v-if="loading" class="loading">加载中...</view>
<view v-else-if="noMoreData" class="no-more">没有更多数据了</view>
@ -100,7 +104,6 @@
return this.tableTypeName[text]
},
info(id) {
console.log(id)
uni.navigateTo({
url: '/pages/coach/my/teaching_management_info?id=' + id
})
@ -122,6 +125,11 @@
this.loading = false
}
})
},
goTake(id,zid) {
uni.navigateTo({
url: '/pages/coach/my/gotake_exam?id=' + id + '&zid=' + zid
})
}
}
}

344
pages/common/im_chat_info.vue

@ -6,25 +6,34 @@
<scroll-view
class="section_1"
scroll-y="true"
:scroll-top="scrollTop"
:lower-threshold="lowerThreshold"
@scrolltolower="loadMoreData"
style="height: 80vh;"
>
<view class="ul">
<view class="item_box" v-for="(v,k) in tableList" :key="k">
<view class="time_section" v-if="v.create_time">{{v.create_time}}</view>
<view class="item_box" v-for="(v,k) in tableList" :key="k" :id="'item_' + v.id">
<view class="time_section" v-if="v.created_at">{{v.created_at}}</view>
<view class="li" v-if="v.direction == `left`">
<view class="item left_item">
<view class="text_box">{{v.content}}</view>
<view class="item left_item" :style="v.message_type == 'text' ? { backgroundColor: '#f4f6f9' } : {}">
<!--文本内容-->
<view class="text_box" v-if="v.message_type == 'text'">{{v.content}}</view>
<!-- 图片内容 -->
<view class="img_box" v-if="v.message_type == 'img'" @click="previewImage(v.content)">
<image class="chat_img" :src="v.content" mode="aspectFill"></image>
</view>
</view>
<view class="item"></view>
</view>
<view class="li" v-if="v.direction == `right`">
<view class="item"></view>
<view class="item right_item">
<view class="text_box">{{v.content}}</view>
<view class="item right_item" :style="v.message_type == 'text' ? { backgroundColor: '#1684fc' } : {}">
<view class="text_box" v-if="v.message_type == 'text'">{{v.content}}</view>
<!-- 图片内容 -->
<view class="img_box" v-if="v.message_type == 'img'" @click="previewImage(v.content)">
<image class="chat_img" :src="v.content" mode="aspectFill"></image>
</view>
</view>
</view>
</view>
@ -36,26 +45,66 @@
<input class="input" v-model="formData.content" type="text" placeholder="请输入">
</view>
<view class="right_box">
<image @click="submitForm()" class="send_img" src="@/static/images/common/fa_song.png"></image>
<!--发送-->
<view class="img_box">
<image @click="submitTextForm()" class="send_img" src="@/static/images/common/fa_song.png"></image>
</view>
<!--更多选择-->
<view class="img_box">
<image @click="openMore()" class="send_img" src="@/static/images/common/jia_hao.png"></image>
</view>
</view>
</view>
<!--更多选择-->
<fui-bottom-popup :show="moreShow" @close="closeMore">
<view class="more_section">
<view class="fui-scroll__wrap">
<scroll-view scroll-y class="fui-scroll__view">
<view class="ul">
<view class="li" @click="">
<AQUplodeImage
:uploadUrl=uploadUrl
:extraData="{ input_name: 'img_uplode', formData:{} }"
@uplodeImageRes="uplodeImageRes"
>
<view class="icon_box">
<fui-icon name="picture-fill" :size="80"></fui-icon>
</view>
<view class="title">相册</view>
</AQUplodeImage>
</view>
</view>
</scroll-view>
</view>
</view>
</fui-bottom-popup>
</view>
</template>
<script>
import memberApi from '@/api/member.js';
import commonApi from '@/api/common.js';
import AQUplodeImgMulti from '@/components/AQ/AQUplodeImgMulti';
import apiRoute from '@/api/apiRoute.js';
import {
Api_url
} from "@/common/config.js";
import AQUplodeImage from '@/components/AQ/AQUplodeImage';//
import AQTabber from "@/components/AQ/AQTabber"
export default {
components: {
AQTabber,
AQUplodeImgMulti,
AQUplodeImage,
},
data() {
return {
uploadUrl: `${Api_url}/uploadImage`,
scrollTop:'',//,
loading:false,//
lowerThreshold: 100,//
isReachedBottom: false,//|true=|false=
@ -65,17 +114,38 @@ export default {
page:1,//
limit:10,//
total:10,//
hair_staff_id: '',//id
friend_id: '',//chat_friendsid
},
tableList:[],//
from_id:'',//ID
to_id:'',//ID
from_type:'',//|personnel=,customer=()
//
chatFriendsInfoParams:{
personnel_id:'',
customer_resources_id:'',
},
chatFriendsInfo:{},//
//
formData: {
content: '',
from_type:'',//|personnel=,customer=()
from_id:'',//ID
to_id:'',//ID
friend_id:'',//chat_friendsid
message_type: 'text',//|text=,img=
content: '',//JSON ,=,=
},
//
moreShow:false,
}
},
onLoad(options) {
this.filteredData.hair_staff_id = options.hair_staff_id//id
this.from_id = options.from_id//id
this.to_id = options.to_id//id
},
onShow(){
this.init()
@ -89,7 +159,60 @@ export default {
//
async init(){
//
let userType = uni.getStorageSync('userType')
//1=,2=,3=
if (['1', '2'].includes(String(userType))) {
//
this.from_type = 'personnel'//
this.chatFriendsInfoParams.personnel_id = this.from_id//id
this.chatFriendsInfoParams.customer_resources_id = this.to_id//id
this.formData.from_type = 'personnel'//
this.formData.from_id = this.from_id//id()
this.formData.to_id = this.to_id//id()
} else {
//
this.from_type = 'customer'//
this.chatFriendsInfoParams.personnel_id = this.to_id//id
this.chatFriendsInfoParams.customer_resources_id = this.from_id//id
this.formData.from_type = 'customer'//
this.formData.from_id = this.to_id//id()
this.formData.to_id = this.from_id//id()
}
//
await this.getChatFriendsInfo()
//
await this.getList();
//
if (this.filteredData.page == 2) {
this.scrollToBottom()
}
},
//
async getChatFriendsInfo(){
let params = {
personnel_id: this.chatFriendsInfoParams.personnel_id,//ID
customer_resources_id: this.chatFriendsInfoParams.customer_resources_id,//ID
}
let res = await apiRoute.xs_chatGetChatFriendsInfo(params)
if (res.code != 1){
uni.showToast({
title: res.msg,
icon: 'none'
})
return
}
this.chatFriendsInfo = res.data
this.filteredData.friend_id = res.data.id
this.formData.friend_id = res.data.id
},
//()
@ -109,27 +232,27 @@ export default {
this.filteredData.total = 10//
},
//
//
async getList(){
this.loading = true
let data = {...this.filteredData}
//
if(this.filteredData.page * this.filteredData.limit > this.filteredData.total){
this.loading = false
//
if ((this.filteredData.page - 1) * this.filteredData.limit >= this.filteredData.total) {
this.loading = false;
uni.showToast({
title: '暂无更多',
icon: 'none'
})
return
});
return;
}
if(data.page == 1){
this.tableList = []
}
let res = await commonApi.getContactMessage(data)//
let res = await apiRoute.xs_chatGetChatMessagesList(data)//
this.loading = false
this.isReachedBottom = false;
if (res.code != 1){
@ -141,9 +264,32 @@ export default {
}
// this.tableList = this.tableList.concat(res.data.data); // 使 concat
this.tableList.unshift(...res.data.data); //
console.log('列表',this.tableList)
let list = res.data.data
list.forEach((v, k) => {
if (this.from_type == 'personnel') {
//
if (v.from_type == 'personnel') {
v.direction = 'right'//
} else {
v.direction = 'left'//
}
} else if (this.from_type == 'customer') {
//
if (v.from_type == 'customer') {
v.direction = 'right'//
} else {
v.direction = 'left'//
}
}
})
list.reverse()
this.tableList.unshift(...list); //
console.log('列表',res.data.total)
this.filteredData.total = res.data.total
this.filteredData.page++
},
@ -163,12 +309,15 @@ export default {
// console.log('AQxxx2',this.formData.member_store_certification_arr)
},
//
submitTextForm(){
this.formData.message_type = 'text'
this.submitForm()
},
//
async submitForm() {
let data = {
hair_staff_id: this.filteredData.hair_staff_id,
content: this.formData.content,
}
let data = {...this.formData}
if (!data.content) {
//
uni.showToast({
@ -177,7 +326,7 @@ export default {
})
return
}
let res = await commonApi.sendMessage(data)
let res = await apiRoute.xs_chatSendChatMessages(data)
if (res.code != 1) {
uni.showToast({
title: res.msg,
@ -186,24 +335,60 @@ export default {
} else {
let content = this.formData.content
this.formData.content = ''//
let msgData = {
"id": '',
"hair_staff_id": this.filteredData.hair_staff_id,
"closed_staff_id": '',
"content": content,
"status": 1,
"type": 2,
"create_time": "",
"redirect": null,
"title": null,
"direction": "right",
"show_time": ""
id:'',
from_type:data.from_type,//|personnel=,customer=()
from_id:data.from_id,//ID
to_id:data.to_id,//ID
friend_id:data.friend_id,//chat_friendsid
message_type: data.message_type,//|text=,img=
content: data.content,//JSON ,=,=
direction:'right'
}
//
this.tableList = this.tableList.concat(msgData);
}
},
//
scrollToBottom() {
this.$nextTick(() => {
this.scrollTop = 999999 //
})
},
//
openMore(){
this.moreShow = true
},
//
closeMore(){
this.moreShow = false
},
//
uplodeImageRes(resData,extraData){
console.log('上传成功回调',resData,extraData)
//
if(extraData.input_name == 'img_uplode'){
this.closeMore()//
this.formData.content = resData.url
this.formData.message_type = 'img'
this.submitForm()
}
},
//
previewImage(url){
uni.previewImage({
current: url, //
urls: [url] //
});
},
}
}
</script>
@ -267,13 +452,20 @@ export default {
word-wrap: break-word; /* 允许长单词或 URL 换行 */
word-break: break-all; /* 强制所有字符换行 */
.text_box{}
.img_box {
.chat_img {
width: 200rpx;
height: 200rpx;
border-radius: 16rpx;
}
}
}
.left_item{
background-color: #f4f6f9;
//background-color: #f4f6f9;
color: #343434;
}
.right_item{
background-color: #1684fc;
//background-color: #1684fc;
color: #fff;
}
}
@ -288,12 +480,12 @@ export default {
position: fixed;
bottom: 0;
padding: 50rpx 50rpx;
padding: 50rpx 30rpx;
display: flex;
justify-content:space-between;
align-items: center;
gap: 20rpx;
.left_box{
width: 70%;
.input{
background-color: #f4f6f9;
height: 88rpx;
@ -301,22 +493,28 @@ export default {
font-size: 28rpx;
border-radius: 32rpx;
width: 532rpx;
width: 480rpx;
color: #292929;
font-size: 28rpx;
}
}
.right_box{
border-radius: 50%;
background-color: #a2cefe;
width: 88rpx;
height: 88rpx;
width: 100%;
display: flex;
justify-content: center;
justify-content: space-between;
align-items: center;
.send_img{
width: 36rpx;
height: 36rpx;
.img_box{
width: 88rpx;
height: 88rpx;
border-radius: 50%;
background-color: #a2cefe;
display: flex;
justify-content: center;
align-items: center;
.send_img{
width: 36rpx;
height: 36rpx;
}
}
}
@ -326,4 +524,44 @@ export default {
color: #999999;
padding-left: 30rpx;
}
/* 更多选项相关 自定义内容区样式需自行控制 */
.more_section{
.fui-scroll__wrap {
padding-top: 30rpx;
position: relative;
}
.fui-title {
font-size: 30rpx;
font-weight: bold;
text-align: center;
padding-bottom: 24rpx;
}
.fui-icon__close {
position: absolute;
top: 24rpx;
left: 24rpx;
}
.fui-scroll__view {
width: 100%;
height: 350rpx;
}
.ul{
padding: 10rpx 40rpx;
display: flex;
.li{
display: flex;
flex-direction: column;
align-items: center;
.icon_box{
}
.title{
font-size: 28rpx;
text-align: center;
}
}
}
}
</style>

706
pages/common/my_attendance.vue

@ -3,7 +3,7 @@
<view class="main_box">
<fui-segmented-control
:values="optionTable"
:current="(Number(filteredData.status))"
:current="(Number(currentIndex))"
type="text"
activeColor="#29d3b4"
color="#fff"
@ -11,13 +11,11 @@
</fui-segmented-control>
<view class="main_section">
<!-- 教练端-->
<view v-if="userType == 1">
<view>
<!--全部-->
<scroll-view
class="section_1"
v-if="filteredData.status == '0'"
v-if="currentIndex == '0'"
scroll-y="true"
:lower-threshold="lowerThreshold"
@scrolltolower="loadMoreData"
@ -27,106 +25,27 @@
<view class="li"
v-for="(v,k) in tableList"
:key="k"
@click="openInfo(v)"
>
<view class="left">
<image :src="$util.img(v.courses.thumbnail)" model="aspectFill"></image>
<!-- <image src="http://www.firstui.cn:4000/vipdoc/img/img_logo.png" model="aspectFill"></image>-->
</view>
<view class="right">
<view class="content">{{v.courses.name}}</view>
<view class="content">普通考勤</view>
<view class="content">
{{v.status == 1 ? '考勤正常':'请假'}}
{{v.status_name}}
</view>
<view class="content">{{v.add_time}} - {{v.end_time}}</view>
</view>
</view>
</view>
</scroll-view>
<!--考勤-->
<scroll-view
class="section_1"
v-if="filteredData.status == '1'"
scroll-y="true"
:lower-threshold="lowerThreshold"
@scrolltolower="loadMoreData"
style="height: 80vh;"
>
<view class="ul">
<view class="li"
v-for="(v,k) in tableList"
:key="k"
>
<view class="left">
<image :src="$util.img(v.courses.thumbnail)" model="aspectFill"></image>
</view>
<view class="right">
<view class="content">{{v.courses.name}}</view>
<view class="content">
{{v.status == 1 ? '考勤正常':'请假'}}
校区{{v.campus_id_name}}
</view>
<view class="content">{{v.add_time}} - {{v.end_time}}</view>
</view>
</view>
</view>
</scroll-view>
<!--请假-->
<scroll-view
class="section_1"
v-if="filteredData.status == '2'"
scroll-y="true"
:lower-threshold="lowerThreshold"
@scrolltolower="loadMoreData"
style="height: 80vh;"
>
<view class="ul">
<view class="li"
v-for="(v,k) in tableList"
:key="k"
>
<view class="left">
<image :src="$util.img(v.courses.thumbnail)" model="aspectFill"></image>
</view>
<view class="right">
<view class="content">{{v.courses.name}}</view>
<view class="content">
{{v.status == 1 ? '考勤正常':'请假'}}
备注{{v.remarks || ''}}
</view>
<view class="content">{{v.add_time}} - {{v.end_time}}</view>
</view>
</view>
</view>
</scroll-view>
</view>
<!-- 销售端-->
<view v-else>
<!--全部-->
<scroll-view
class="section_1"
v-if="filteredData.status == '0'"
scroll-y="true"
:lower-threshold="lowerThreshold"
@scrolltolower="loadMoreData"
style="height: 80vh;"
>
<view class="ul">
<view class="li"
v-for="(v,k) in tableList"
:key="k"
>
<view class="left">
<!-- <image src="http://www.firstui.cn:4000/vipdoc/img/img_logo.png" model="aspectFill"></image>-->
</view>
<view class="right">
<view class="content">普通考勤</view>
<view class="content">
{{v.status == 1 ? '考勤正常':'请假'}}
<text>{{v.attendance_date}} {{v.check_in_time}}</text>
<text v-if="v.check_out_time" style="padding: 0 20rpx">-</text>
<text v-if="v.check_out_time">{{v.attendance_date}} {{v.check_out_time}}</text>
</view>
<view class="content">{{v.add_time}} - {{v.end_time}}</view>
</view>
</view>
</view>
@ -136,7 +55,7 @@
<!--考勤-->
<scroll-view
class="section_1"
v-if="filteredData.status == '1'"
v-if="currentIndex == '1'"
scroll-y="true"
:lower-threshold="lowerThreshold"
@scrolltolower="loadMoreData"
@ -153,19 +72,28 @@
<view class="right">
<view class="content">普通考勤</view>
<view class="content">
{{v.status == 1 ? '考勤正常':'请假'}}
{{v.status_name}}
</view>
<view class="content">
校区{{v.campus_id_name}}
</view>
<view class="content">
备注{{v.remarks || ''}}
</view>
<view class="content">
<text>{{v.attendance_date}} {{v.check_in_time}}</text>
<text v-if="v.check_out_time" style="padding: 0 20rpx">-</text>
<text v-if="v.check_out_time">{{v.attendance_date}} {{v.check_out_time}}</text>
</view>
<view class="content">{{v.add_time}} - {{v.end_time}}</view>
</view>
</view>
</view>
</scroll-view>
<!--请假-->
<scroll-view
class="section_1"
v-if="filteredData.status == '2'"
v-if="currentIndex == '2'"
scroll-y="true"
:lower-threshold="lowerThreshold"
@scrolltolower="loadMoreData"
@ -182,9 +110,19 @@
<view class="right">
<view class="content">普通考勤</view>
<view class="content">
{{v.status == 1 ? '考勤正常':'请假'}}
{{v.status_name}}
</view>
<view class="content">
校区{{v.campus_id_name}}
</view>
<view class="content">
备注{{v.remarks || ''}}
</view>
<view class="content">
<text>{{v.attendance_date}} {{v.check_in_time}}</text>
<text v-if="v.check_out_time" style="padding: 0 20rpx">-</text>
<text v-if="v.check_out_time">{{v.attendance_date}} {{v.check_out_time}}</text>
</view>
<view class="content">{{v.add_time}} - {{v.end_time}}</view>
</view>
</view>
</view>
@ -192,21 +130,147 @@
</view>
<!--请假按钮-->
<view class="section_btn">
<view class="btn" @click="openShow()">请假</view>
<!--打卡按钮-->
<view class="btn" style="background-color: #20CAAFFF;" @click="openSignInShow('present')">打卡</view>
<!--请假按钮-->
<view class="btn" style="background-color: #ffb703;" @click="openSignInShow('leave')">请假</view>
<!--签退按钮-->
<view class="btn" style="background-color: #00b0f0;" @click="openSignInShow('sign_out')">签退</view>
</view>
</view>
<!-- 请假提示框-->
<fui-dialog :show="show" :content="content" maskClosable @click="onClick" @close="closeShow"></fui-dialog>
<!--打卡提示框-->
<fui-modal :buttons="[]" width="600" :show="signIn_show">
<text class="fui-title">{{signIn_title}}</text>
<text class="fui-descr">{{signIn_content}}</text>
<fui-form class="form-section" ref="form" top="0" :model="formData" :show="false">
<view class="input-style">
<!--校区选择-->
<fui-form-item
label="选择校区"
asterisk
asteriskPosition="right"
labelSize='26'
prop=""
background='#fff'
labelColor='#000'
:bottomBorder='true'
>
<view class="input-title" style="margin-right:14rpx;">
<view
class="input-title"
style="margin-right:14rpx;"
@click="openCicker()">
{{ (formData.campus_id) ? formData.campus_id_name : '点击选择' }}
</view>
</view>
</fui-form-item>
<!--备注-->
<fui-form-item
v-if="formData.status == 'leave'"
label="备注"
labelSize='26'
prop=""
background='#fff'
labelColor='#000'
:bottomBorder='true'
>
<view class="input-title" style="margin-right:14rpx;">
<fui-input
:borderBottom="false"
:padding="[0]"
placeholder="请输入备注"
v-model="formData.remarks"
backgroundColor="#fff"
size="26"
color="#000"
></fui-input>
</view>
</fui-form-item>
</view>
<view class="button_box">
<fui-button background="#fff" color="#414141" borderColor="#465CFF" btnSize="small" @click="closeSignInShow">取消</fui-button>
<fui-button background="#fff" color="#465CFF" borderColor="#465CFF" btnSize="small" @click="clickSignIn({index:1})">确定</fui-button>
</view>
</fui-form>
<view class="fui-icon__close" @tap="closeSignInShow">
<fui-icon name="close" color="#B2B2B2" :size="48"></fui-icon>
</view>
</fui-modal>
<!--详情提示框-->
<fui-modal :buttons="[]" width="600" :show="info_show">
<text class="fui-title">详情</text>
<view class="info_ul">
<view class="li">
<view class="title">考勤状态</view>
<view class="content">{{info_data.status_name}}</view>
</view>
<view class="li">
<view class="title">考勤日期</view>
<view class="content">
<text style="padding: 0;">{{info_data.attendance_date}}</text>
<text v-if="info_data.status == 'present'">{{info_data.check_in_time}}</text>
<text v-if="info_data.status == 'present' && (info_data.check_out_time || '')">-</text>
<text v-if="info_data.status == 'present' && (info_data.check_out_time || '')">{{info_data.check_out_time || ''}}</text>
<text v-if="info_data.status == 'present' && !(info_data.check_out_time || '')">(未签退)</text>
</view>
</view>
<view class="li">
<view class="title">校区名称</view>
<view class="content">{{info_data.campus_id_name || ''}}</view>
</view>
<view class="li">
<view class="title">备注</view>
<view class="content">{{info_data.remarks || ''}}</view>
</view>
<view class="map_section" v-if="info_data.id && info_data.latitude">
<view class="title">地图</view>
<view class="map">
<map
v-if="info_data.latitude"
:id="`shopMap_${info_data.id}`"
:longitude="info_data.longitude"
:latitude="info_data.latitude"
:markers="getMarkers(info_data.id,info_data)"
:scale="16"
:show-location="false"
style="width: 100%; height: 400rpx;"
></map>
</view>
</view>
</view>
<view class="fui-icon__close" @tap="closeInfoShow">
<fui-icon name="close" color="#B2B2B2" :size="48"></fui-icon>
</view>
</fui-modal>
<!-- 选择器 -->
<fui-picker
:linkage='picker_linkage'
:options="picker_options"
:layer="1"
:show="picker_show"
@change="changeCicker"
@cancel="cancelCicker">
</fui-picker>
</view>
</template>
<script>
import commonApi from '@/api/common.js';
import marketApi from '@/api/market.js';
import apiRoute from '@/api/apiRoute.js';
import AQTabber from "@/components/AQ/AQTabber.vue"
@ -221,17 +285,23 @@ export default {
optionTable: [
{
id: 0,
name: '全部'
name: '全部',
value:[]
},
{
id: 1,
name: '考勤'
name: '考勤',
value:['present']
},
{
id: 2,
name: '请假'
name: '请假',
value:['leave']
}
],
currentIndex:0,
userInfo:{},//
loading:false,//
@ -243,18 +313,45 @@ export default {
page:1,//
limit:10,//
total:10,//
status:'0'//0 1 2
status_arr:[]//: present-, absent-, late-, leave_early-退,leave-
},
tableList:[],//
//
//--退
formData:{
date:'',//
campus_id:'',//ID
campus_id_name:'',//ID
status:'',//: present-, absent-, late-, leave_early-退,leave-,sign_out-退
remarks:'',//
attendance_date:'',///
longitude:'',//
latitude:'',//
},
//
show:false,//
content:'',//
//
signIn_show:false,
signIn_title:'',//
signIn_content:'',//
//
picker_input_name:'',//input_name
picker_show:false,//
picker_linkage:true,//
picker_options:[
// {
// text:'',
// value:'1'
// },
],//
//
info_show:false,//|true=,false=
info_data:{},//
}
},
onLoad(options) {},
@ -264,10 +361,50 @@ export default {
methods: {
//
async init(){
// -
// #ifdef MP-WEIXIN
uni.authorize({
scope: 'scope.userLocation',
success() {
//
},
fail() {
uni.showToast({
title: '请开启定位权限',
icon: 'none'
});
return
}
});
// #endif
this.userType = uni.getStorageSync('userType')
// this.userType = 2
this.getCurrentDate()//
await this.getList();
await this.getUserInfo()//
// await this.getList();
this.getList();
},
//
async getUserInfo(){
let res = await apiRoute.getPersonnelInfo({})
if (res.code != 1) {
uni.showToast({
title: res.msg,
icon: 'none'
})
return
}
this.userInfo = res.data
this.picker_options = []
res.data.cameus_dept_arr.forEach((v,k)=>{
this.picker_options.push({
text: v.campus_id_name,
value: v.campus_id
})
})
console.log(123123,this.picker_options)
},
//
@ -280,20 +417,32 @@ export default {
let res = `${year}-${month}-${day}`
this.content = `${res} 是否确认请假?`
this.formData.date = res
this.formData.attendance_date = res
},
//tag
async segmented(e) {
console.log(e)
this.currentIndex = e.id
//
await this.resetFilteredData()
//e.id|0 1 2
let status = e.id
this.filteredData.status = String(status)
let status_arr = []
switch (status) {
case 1:
status_arr = ['present']
break;
case 2:
status_arr = ['leave']
break;
}
this.filteredData.status_arr = status_arr
await this.getList()
},
@ -333,7 +482,7 @@ export default {
this.tableList = []
}
let res = await commonApi.clockingList(data)
let res = await apiRoute.common_attendanceIndex(data)
this.loading = false
this.isReachedBottom = false;
if (res.code != 1){
@ -346,7 +495,7 @@ export default {
this.tableList = this.tableList.concat(res.data.data); // 使 concat
console.log('列表',this.tableList)
console.log('列表',res.data.data)
this.filteredData.total = res.data.total
this.filteredData.page++
},
@ -360,24 +509,205 @@ export default {
this.show = false
},
//
onClick(e){
async onClick(e){
console.log('xxx',e)
if(e.index == 0){
//
this.closeShow()
}else{
if(!this.formData.campus_id){
uni.showToast({
title: '请选择校区',
icon: 'none'
})
return
}
//
this.submitRest()
this.formData.status='absent'//|present-, absent-
await this.submitFormData()
}
},
//
//
openSignInShow(status){
this.formData.status = status
switch (status){
case 'present':
this.signIn_title = `是否确认打卡?`
this.signIn_content = `${this.formData.attendance_date} 是否确认打卡?`
break;
case 'leave':
this.signIn_title = `是否确认请假?`
this.signIn_content = `${this.formData.attendance_date} 是否确认请假?`
break;
case 'sign_out':
this.signIn_title = `是否确认签退?`
this.signIn_content = `${this.formData.attendance_date} 是否确认签退?`
break;
}
//
this.formData.campus_id = ''
this.formData.campus_id_name = ''
this.formData.remarks = ''
this.formData.longitude = ''
this.formData.latitude = ''
this.getlocation()//
},
//
closeSignInShow(){
this.signIn_show = false
},
//-
async clickSignIn(e){
console.log('xxx',e)
if(e.index == 0){
//
this.closeSignInShow()
}else{
if(!this.formData.campus_id){
uni.showToast({
title: '请选择校区',
icon: 'none'
})
return
}
await this.submitFormData()
}
},
//
async submitRest() {
//-
openCicker(e){
// 使 nextTick picker
this.$nextTick(() => {
this.picker_show = true
})
},
//-
changeCicker(e) {
console.log('监听-下拉选择器', e)
this.formData.campus_id = e.value
this.formData.campus_id_name = e.text
this.cancelCicker()
},
//
cancelCicker() {
this.picker_show = false
},
//
async getLocation_COPY() {
try {
const location = await new Promise((resolve, reject) => {
uni.getLocation({
type: 'wgs84', // wgs84 gps gcj02
success: (res) => {
console.log('当前位置的经度:' + res.longitude);
console.log('当前位置的纬度:' + res.latitude);
this.longitude = res.longitude
this.latitude = res.latitude
resolve(res);
},
fail: (err) => {
reject(err);
}
});
});
console.log('纬度:', location.latitude); //
console.log('经度:', location.longitude); //
// data
this.formData.latitude = location.latitude;
this.formData.longitude = location.longitude;
uni.showToast({
title: `定位-${this.formData.latitude}`,
icon: 'none'
});
this.closeShow()
// uni.showToast({
// title: '',
// icon: 'success'
// });
} catch (error) {
uni.showToast({
title: '获取位置失败',
icon: 'none'
});
console.error('获取位置失败:', error);
}
},
getlocation() {
uni.getLocation({
type: 'gcj02',//
isHighAccuracy: true,//
success: (res) => {
console.log('当前位置的经度:' + res.longitude);
console.log('当前位置的纬度:' + res.latitude);
this.formData.longitude = res.longitude
this.formData.latitude = res.latitude
//
console.log(res, "根据经纬度获取地址");
this.signIn_show = true//
},
//
fail: (err) => {
uni.showModal({
content: '检测到您没打开获取位置功能权限,是否去设置打开?',
confirmText: "确认",
cancelText: '取消',
success: (res) => {
if (res.confirm) {
uni.openSetting({
success: (res) => {
uni.showToast({
title: '授权后请重新打开此页面',
icon: 'none'
})
},
fail: (err) => {
console.log(err)
}
})
} else {
uni.showToast({
title: '获取地理位置授权失败',
icon: 'none',
success: () => {
//
setTimeout(() => {
uni.showToast({
title: "请开启手机定位后再试",
icon: 'none'
})
// uni.navigateBack({
// delta: 1
// })
}, 500)
}
})
}
}
})
},
})
},
///
async submitFormData() {
this.closeSignInShow()
let param = {...this.formData}
let res = await commonApi.clockingRest(param)
let res = await apiRoute.common_attendanceEdit(param)
if (res.code != 1) {
uni.showToast({
title: res.msg,
@ -395,8 +725,53 @@ export default {
setTimeout(() => {
this.segmented({id:0})//
}, 1500)
}
},
//
openInfo(item){
let coordinate_arr= []
if (item.coordinate){
coordinate_arr = item.coordinate.split(',')
}
item.longitude = Number(coordinate_arr[0] || 0)//
item.latitude = Number(coordinate_arr[1] || 0)//
// item.latitude = 18.252865
// item.longitude = 109.511709
this.info_data = {...item};
console.log('详情',this.info_data)
// info_data
this.info_show = true
},
//
closeInfoShow(){
this.info_show = false
},
//
getMarkers(id,item) {
console.log('获取标记点',item)
let data = {
id: Number(id),
//
latitude: Number(item.latitude),
//
longitude: Number(item.longitude),
// name: item.campus_address,
iconPath: '/static/icon-img/ding_wei.png',
width: 30,
height: 30
}
console.log(88888,data)
return [data];
},
}
}
@ -443,6 +818,9 @@ export default {
flex-direction: column;
gap: 24rpx;
.li{
border: 1px solid #5f5f5f;
border-radius: 15rpx;
padding: 20rpx 0;
display: flex;
align-items: center;
gap: 43rpx;
@ -480,12 +858,13 @@ export default {
.section_btn{
display: flex;
justify-content: center;
display: flex;
justify-content: space-between;
.btn{
width: 722rpx;
width: 30%;
height: 64rpx;
line-height: 64rpx;
border-radius: 8rpx;
background-color: rgba(32,202,175,1);
color: rgba(255,255,255,1);
font-size: 28rpx;
text-align: center;
@ -495,4 +874,75 @@ export default {
}
//
.fui-title {
font-size: 32rpx;
padding-top: 24rpx;
}
.fui-descr {
font-size: 24rpx;
color: #B2B2B2;
padding-top: 12rpx;
padding-bottom: 48rpx;
}
.fui-icon__close {
position: absolute;
right: 24rpx;
top: 20rpx;
}
.form-section{
.input-style {
text-align: right !important;
}
.button_box{
margin-top: 30rpx;
padding: 20rpx;
display: flex;
align-items: center;
justify-content: space-between;
gap: 20rpx;
}
}
//
.info_ul{
padding: 30rpx;
display: flex;
flex-direction: column;
gap: 20rpx;
width: 100%;
.li{
display: flex;
.title{
min-width: 140rpx;
}
.content{
word-break: break-all;
text{
padding:0 10rpx;
}
}
}
.map_section{
display: flex;
flex-direction: column;
.title{
width: 130rpx;
}
.map{
border: 1px solid #8b8b8b;
margin-top: 10rpx;
width: 100%;
}
}
}
</style>

7
pages/market/clue/index.vue

@ -450,9 +450,10 @@ export default {
//-
openViewMyMessage(item) {
let hair_staff_id = item.hair_staff_id
let from_id = this.userInfo.id//id
let to_id = item.customerResource.id//ID
uni.navigateTo({
url: `/pages/common/im_chat_info?hair_staff_id=${hair_staff_id}`
url: `/pages/common/im_chat_info?from_id=${from_id}&to_id=${to_id}`
})
},
@ -618,7 +619,7 @@ export default {
border-radius: 5rpx;
font-size: 24rpx;
color: #fff;
background-color: #455bfe;
background-color: #29d3b4;
width: 20%;
height: 100%;
}

219
pages/market/my/firm_info.vue

@ -3,63 +3,91 @@
<view class="assemble">
<view style="height: 30rpx;"></view>
<view class="section_1">
<image class="pic" :src="$util.img(dataInfo.cover)" mode="aspectFit"></image>
</view>
<view class="title_section">基本信息</view>
<view class="section_2">
<view class="item">
<view class="title">企业名称</view>
<view class="content">{{dataInfo.enterprise_name}}</view>
<scroll-view
class="ul"
scroll-y="true"
:lower-threshold="lowerThreshold"
@scrolltolower="loadMoreData_1"
style="height: 80vh;"
>
<view class="li" v-for="(v,k) in tableList" :key="k">
<!--企业图-->
<view class="section_1">
<image class="pic" v-if="v.campus_preview_image" :src="v.campus_preview_image" mode="aspectFit"></image>
</view>
<view class="title_section">基本信息</view>
<view class="section_2">
<view class="item">
<view class="title">企业名称</view>
<view class="content">{{v.campus_name}}</view>
</view>
<view class="item">
<view class="title">企业地址</view>
<view class="content">{{v.campus_address}}</view>
</view>
</view>
<view class="title_section">企业地图</view>
<view class="section_3">
<view class="map_box">
<map
:id="`shopMap_${k}`"
:latitude="v.campus_coordinates_arr.lat"
:longitude="v.campus_coordinates_arr.lng"
:markers="getMarkers(k,v)"
:scale="15"
:show-location="false"
style="width: 90%; height: 400rpx;"
></map>
</view>
</view>
<view class="title_section">企业介绍</view>
<view class="section_4">
<view class="html" v-html="v.
campus_introduction"></view>
</view>
</view>
</scroll-view>
<view class="item">
<view class="title">企业简称</view>
<view class="content">{{dataInfo.enterprise_abbreviation}}</view>
</view>
<view class="item">
<view class="title">企业电话</view>
<view class="content">{{dataInfo.phone}}</view>
</view>
<view class="item">
<view class="title">所属行业</view>
<view class="content">{{dataInfo.profession}}</view>
</view>
<view class="item">
<view class="title">企业网址</view>
<view class="content">{{dataInfo.website}}</view>
</view>
<view class="item">
<view class="title">成立时间</view>
<view class="content">{{dataInfo.establishment_time}}</view>
</view>
</view>
<view class="title_section">企业介绍</view>
<view class="section_3">
<view class="html" v-html="dataInfo.
content"></view>
</view>
</view>
</template>
<script>
import memberApi from '@/api/member.js';
import apiRoute from '@/api/apiRoute.js';
export default {
data() {
return {
dataInfo:{},//
loading:false,//
lowerThreshold: 100,//
isReachedBottom: false,//|true=|false=
//
filteredData:{
personnel_id:'',
},
//
tableList:[],
//
//
mapControls:{
position:{
},
}
}
},
onShow(){
@ -68,13 +96,28 @@ import memberApi from '@/api/member.js';
methods: {
//
async init(){
await this.getEnterpriseInformation()
await this.getUserInfo()
await this.getPersonnelCampus()
},
//
async getEnterpriseInformation(){
let data = {}
let res = await memberApi.getEnterpriseInformation(data)
//
async getUserInfo(){
let res = await apiRoute.getPersonnelInfo({})
if (res.code != 1) {
uni.showToast({
title: res.msg,
icon: 'none'
})
return
}
this.filteredData.personnel_id = res.data.id//id
},
//
async getPersonnelCampus(){
let params = {...this.filteredData}
let res = await apiRoute.common_getPersonnelCampus(params)
if(res.code != 1){
uni.showToast({
title: res.msg,
@ -83,8 +126,19 @@ import memberApi from '@/api/member.js';
return
}
this.dataInfo = res.data
console.log(123,this.dataInfo)
this.tableList = res.data
console.log(123,this.tableList)
},
//
getMarkers(id,item) {
return [{
id: id,
latitude: item.campus_coordinates_arr.lat,
longitude: item.campus_coordinates_arr.lng,
name: item.campus_address,
iconPath: '/static/icon-img/ding_wei.png'
}];
},
}
@ -99,36 +153,55 @@ import memberApi from '@/api/member.js';
color: #fff;
}
.section_1{
.pic{
width: 100%;
height: 300rpx;
}
}
.title_section{
padding: 20rpx 40rpx;
color: #fff;
font-size: 24rpx;
}
.section_2{
background-color: #434544;
.ul{
display: flex;
flex-direction: column;
.item{
padding: 40rpx;
padding-left: 40rpx;
display: flex;
gap: 30rpx;
gap: 40rpx;
.li{
border-top: 1px solid #434544;
.section_1{
.pic{
width: 100%;
height: 300rpx;
}
}
.title_section{
padding: 20rpx 40rpx;
color: #fff;
font-size: 24rpx;
}
.section_2{
background-color: #434544;
display: flex;
flex-direction: column;
.item{
padding: 40rpx;
padding-left: 40rpx;
display: flex;
gap: 30rpx;
}
}
.section_3{
padding: 20rpx 22rpx;
.html{
color: #fff;
}
.map_box{
color: #fff;
display: flex;
justify-content: center;
}
}
.section_4{
padding: 20rpx 22rpx;
padding-bottom: 250rpx;
.html{
color: #fff;
}
}
}
}
.section_3{
padding: 20rpx 22rpx;
padding-bottom: 250rpx;
.html{
color: #fff;
.li:nth-child(1){
border: 0px solid #434544;
}
}
</style>

BIN
static/icon-img/ding_wei.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Loading…
Cancel
Save