提交代码

This commit is contained in:
‘tuzi0421 2024-03-13 16:07:11 +08:00
parent d022e33da9
commit e37d0e4112
34 changed files with 1933 additions and 206 deletions

16
App.vue
View File

@ -34,18 +34,19 @@
padding: 10px;
}
.pagepaddings{padding: 14px;}
.page_content{padding: 0 12px 10px;}
//
.contentboxsty{border-radius: 8px;background: #1C2755;}
//
.noborbot{border-bottom:none !important}
.t-icon{background-repeat: no-repeat;}
.icon22{width: 22px;height: 22px;}
.paddrigth5{padding-right: 5px;}
//
.font12{font-size: $uni-font-size-sm;}
.font13{font-size:13px;}
.font14{font-size: $uni-font-size-base;}
.font15{font-size: 15px;}
.font15{font-size: 15px!important;}
.font20{font-size: 20px;}
.font22{font-size: 22px;}
.font24{font-size: 24px;}
@ -53,12 +54,21 @@
.font_bold{font-weight: bold;}
//
.text_color_black{color: #000;}
.theme_color{color: #009688 }
//
.but_color{background: #009688 !important;}
// .text_{color: #00B68D;}
//
.flex_layout{display: flex;}
.flex1{flex: 1;}
//paddind
.padd_rigth5{padding-right: 5px;}
.padd_bot6{padding-bottom: 6px;}
.padd_top12{padding-top:12px;}
.padd_rigth12{padding-right: 12px;}
.padd_bot12{padding-bottom: 12px;}
.padd_left12{padding-left:12px;}
//margin
.mar_top12{margin-top: 12px;}
.page_list{margin-bottom: 12px;padding:0 12px;}
@ -74,7 +84,6 @@
}
.list_content{padding:12px;}
}
//
.bottom_but{bottom: 40px;bottom: 40px;position: fixed;width: calc(100% - 28px);
view{width: 50%;text-align: center;margin: 0 20px;border-radius: 19px;background: #DDD;line-height: 38px;}
@ -84,5 +93,4 @@
.page_add{display: flex;justify-content: center;margin: 7px 20px;border-radius: 17.5px;background: #1C2755;line-height: 35px;}
}
.bot_padding{padding-bottom: 100px;}
</style>

View File

@ -31,8 +31,8 @@ export default {
{
id: 0,
path: '/pages/index/index',
icon: '/static/indexB.png',
selectIcon: '/static/indexA.png',
icon: '/static/indexA.png',
selectIcon: '/static/indexB.png',
text: '首页',
centerItem: false
},
@ -48,8 +48,8 @@ export default {
{
id: 2,
path: '/pages/person/person',
icon: '/static/personA.png',
selectIcon: '/static/personB.png',
icon: '/static/personB.png',
selectIcon: '/static/personA.png',
text: '我的',
centerItem: false
}

View File

@ -0,0 +1,20 @@
<template>
<view>
</view>
</template>
<script>
export default {
name:"switchDefine",
data() {
return {
};
}
}
</script>
<style>
</style>

21
env.js Normal file
View File

@ -0,0 +1,21 @@
// 不同的环境变量配置
const development = {
requestBaseUrl: 'http://development',
appid: '',
}
const test = {
requestBaseUrl: 'https://api.dev.dwoodauto.com/api',
appid: 'wxd5xxxxee0fce1c81',
}
const production = {
requestBaseUrl: 'http://production',
appid: 'wx3xxxx1ce403cab3',
}
export default {
development,
test,
production
}

View File

@ -6,6 +6,7 @@ import "./static/iconfont/iconfont-weapp/iconfont-weapp-icon.css"
import Vue from 'vue'
import App from './App'
import svg from './static/iconfont/svg.js'
Vue.use(svg);
Vue.config.productionTip = false;
@ -20,8 +21,13 @@ app.$mount()
// #ifdef VUE3
import { createSSRApp } from 'vue'
import App from './App.vue'
import request from "./utils/api.js"
import publicMethods from "./utils/public.js"
export function createApp() {
const app = createSSRApp(App)
app.config.globalProperties.$api = request;
app.config.globalProperties.$wf = publicMethods;
return {
app
}

View File

@ -50,7 +50,7 @@
/* */
"mp-weixin" : {
/* */
"appid" : "wx62bd7b72516b9017",
"appid" : "wx38dc81b0eef130a3",
"setting" : {
"urlCheck" : false
},

View File

@ -1,16 +1,22 @@
{
"name": "mes_mobile",
"version": "1.0.0",
"description": "",
"main": "main.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"repository": {
"type": "git",
"url": "https://git.tool.dwoodauto.com/long/mes_mobile.git"
},
"keywords": [],
"author": "",
"license": "ISC"
"uni-app": {
"scripts": {
"dev": {
"title": "微信小程序——开发版",
"env": {
"ENV_TYPE": "dev",
"UNI_PLATFORM": "mp-weixin",
"VITE_BASE_API": "https://api.dev.dwoodauto.com"
}
},
"pro": {
"title": "微信小程序——正式版",
"env": {
"ENV_TYPE": "pro",
"UNI_PLATFORM": "mp-weixin",
"VITE_BASE_API": "http://pro.domain/"
}
}
}
}
}

View File

@ -119,6 +119,46 @@
"navigationBarTitleText" : "设备状态",
"enablePullDownRefresh" : false
}
},
{
"path" : "pages/equipmentManage/deviceDetail",
"style" :
{
"navigationBarTitleText" : "设备信息",
"enablePullDownRefresh" : false
}
},
{
"path" : "pages/person/faceAuthentication",
"style" :
{
"navigationBarTitleText" : "人脸认证",
"enablePullDownRefresh" : false
}
},
{
"path" : "pages/person/myAuthority",
"style" :
{
"navigationBarTitleText" : "我的权限",
"enablePullDownRefresh" : false
}
},
{
"path" : "pages/person/alarm",
"style" :
{
"navigationBarTitleText" : "设备报警",
"enablePullDownRefresh" : false
}
},
{
"path" : "pages/person/safetyAccidents",
"style" :
{
"navigationBarTitleText" : "安全事故",
"enablePullDownRefresh" : false
}
}],
"globalStyle": {
"navigationBarTextStyle": "white",

View File

@ -1,23 +1,248 @@
<template>
<!-- 设备状态 -->
<view>
<view class="pagepaddings">
<view class=".padd_bot12">
<text>硬件设备状态</text>
</view>
<view class="body-view contentboxsty">
<view class="content-top">
<view class="content-left">
<text class="iconfont icon-gengduo more_icon"></text>
</view>
<view class="content-scroll">
<view class="center-cut-menu">
<scroll-view scroll-x="true" scroll-with-animation="true" class="scroll-view" :scroll-left="scrollLeft">
<view class="scroll-item" v-for="(item, index) in list" :key="index" @click="changeMenu(index)">
<text class="item-text" :class="curIndex == index? 'active' : ''">{{item.name}}</text>
</view>
</scroll-view>
</view>
</view>
<view class="content-right">
<text class="iconfont icon-gengduo"></text>
</view>
</view>
<swiper class="swiper-box-list" circular="true" :current="curIndex" @change="swiperChange">
<swiper-item class="swiper-topic-list" v-for="item in swiperDateList" :key="item.id">
<view class="swiper-item" v-if="item.id==1">
<view class="" style="width: 100%;">
<image style="width: 100%;" src="http://dm-auto.oss-cn-shanghai.aliyuncs.com/mes_wechat/background.png" mode=""></image>
</view>
<view class="font14">
<view class="device_row">
<text class="name font_bold">设备名称</text>
<text>双头立锯</text>
</view>
<view class="device_row">
<text class="name font_bold">开机时间</text>
<text>2024-02-11 08:00:45</text>
</view>
<view class="device_row">
<text class="name font_bold">保养到期日</text>
<text>2024-02-11 08:00:45</text>
</view>
<view class="device_row">
<text class="name font_bold">今日停机</text>
<text>5</text>
</view>
</view>
</view>
</swiper-item>
</swiper>
</view>
</view>
</template>
<script>
export default {
data() {
return {
export default {
data() {
return {
list: [{
id: 1,
name: '多片锯'
},
{
id: 2,
name: '立式带锯'
},
{
id: 3,
name: '视觉'
},
{
id: 4,
name: '卧锯'
},
{
id: 5,
name: '多片锯'
},
{
id: 6,
name: '卧锯测试A'
},
{
id: 7,
name: '卧锯B'
},
{
id: 8,
name: '卧锯测试3'
},
{
id: 9,
name: '卧锯4'
},
{
id: 10,
name: '卧锯5'
},
{
id: 11,
name: '卧锯6'
},
],
// Tab
swiperDateList: [
{
id: 1,
content: '1'
},
{
id: 2,
content: '2'
},
{
id: 3,
content: '3'
},
{
id: 4,
content: '4'
},
{
id: 5,
content: '5'
},
{
id: 6,
content: '6'
},
{
id: 7,
content: '7'
},
{
id: 8,
content: '8'
},
{
id: 9,
content: '9'
},
{
id: 10,
content: '10'
},
{
id: 11,
content: '11'
},
],
contentScrollW: 0, //
curIndex: 0, //
scrollLeft: 0, //
}
},
mounted() {
//
this.getScrollW()
},
methods: {
//
getScrollW() {
let query = uni.createSelectorQuery().in(this);
query.select('.scroll-view').boundingClientRect(data => {
// scroll-view
this.contentScrollW = data.width
}).exec();
}
},
methods: {
query.selectAll('.scroll-item').boundingClientRect(data => {
let dataLen = data.length;
for (let i = 0; i < dataLen; i++) {
// scroll-view
this.list[i].left = data[i].left;
// scroll-view
this.list[i].width = data[i].width
}
}).exec()
},
}
}
//
changeMenu(index) {
this.curIndex = index;
// console.log(index,111)
// ()
// this.scrollLeft = index * this.list[index].width
// ()
// this.scrollLeft = 0;
// for (let i = 0; i < index; i++) {
// this.scrollLeft += this.list[i].width
// };
// ()
// this.scrollLeft = (index - 1) * this.list[index].width
// ()
this.scrollLeft = 0;
for (let i = 0; i < index - 1; i++) {
this.scrollLeft += this.list[i].width
};
// ()
// this.scrollLeft = this.list[index].left - this.contentScrollW / 2 + this.list[index].width / 2;
},
//
swiperChange(e) {
// console.log(22,e)
let index = e.detail.current
this.changeMenu(index)
}
}
}
</script>
<style>
<style lang="scss">
.body-view{
height: 450px;
.content-top{
display: flex;
align-items: center;
.content-left{flex-basis: 30px;text-align: center;
.more_icon{display: inline-block;transform: scaleX(-1);}
}
.content-scroll{flex: 1;overflow: auto;}
.center-cut-menu {width: 100%;height: 100rpx;box-sizing: border-box;
.scroll-view {height: 100rpx;white-space: nowrap;
.scroll-item {height: 100rpx;padding: 0 20rpx;display: inline-block;text-align: center;
.item-text {font-size: 14px;line-height: 100rpx;
&.active {
// color: #1468FF;
font-size: 18px;
}
}
}
}
}
.content-right{flex-basis: 30px;text-align: center;}
}
.swiper-box-list{height: 400px;padding:0 12px;
.device_row{padding: 6px 0;display: flex;
.name{width: 82px;}
}
}
}
</style>

View File

@ -0,0 +1,69 @@
<template>
<view class="pagepaddings">
<view class="contentboxsty page_content ">
<view class="content_row">
<view class="name">设备</view>
<view class="data">{{form.name}}</view>
</view>
<view class="content_row">
<view class="name">设备名称</view>
<view class="data">双头立锯</view>
</view>
<view class="content_row">
<view class="name">设备功率</view>
<view class="data">双头立锯</view>
</view>
<view class="content_row">
<view class="name">设备IP</view>
<view class="data">双头立锯</view>
</view>
<view class="content_row">
<view class="name">端口</view>
<view class="data">双头立锯</view>
</view>
<view class="content_row">
<view class="name">状态</view>
<view class="data">{{form.active_status==true?'启用':'禁用'}}</view>
</view>
<view class="textarea_row">
<view class="name font13">设置备注</view>
<view class="">
{{form.remark}}
</view>
</view>
</view>
</view>
</template>
<script>
export default {
data() {
return {
form:{}
}
},
onLoad(options){
this.getDetail(options.id);
},
methods: {
getDetail(id){
this.$api.postFuncLoading('/device.info',{id:id}).then(res=>{
console.log(res)
this.form = res.data
})
},
}
}
</script>
<style lang="scss">
.content_row{display: flex;height: 44px;align-items: center;
.name{width: 30%;font-size: 13px;}
.data{font-size: 14px;}
}
.textarea_row{
.name{padding: 12px 0;}
// textarea{border-radius: 4px;background: rgba(255, 255, 255, 0.50);width: 100%;}
}
</style>

View File

@ -3,9 +3,9 @@
<navigation-bar title="添加设备" color="white"></navigation-bar>
</page-meta>
<view class="pagepaddings">
<view class="page_name font14">
<!-- <view class="page_name font14">
添加/编辑设备
</view>
</view> -->
<view class="page_content contentboxsty font13">
<view class="content_row">
<view class="name">选择设备</view>
@ -47,22 +47,29 @@
<view class="content_row">
<view class="name">状态</view>
<view class="flex_layout">
<!-- <image src="/static/enable.png" mode=""></image><text class="text">启用</text>
<image src="/static/disable.png" mode=""></image><text class="text">禁用</text> -->
<view class="t-icon t-icon-qiyong1 contenticon"></view><text class="text">启用</text>
<view class="t-icon t-icon-jinyong2 contenticon"></view><text class="text">禁用</text>
<!-- <label class="radio"><radio value="r1" checked="true" />启用</label>
<label class="radio"><radio value="r2" />禁用</label> -->
<view class="switch" @click="switchSta(1)">
<view v-if="selectSta==1" class="t-icon t-icon-qiyong1 contenticon"></view>
<view v-else class="t-icon t-icon-jinyong2 contenticon"></view>
<text class="text">启用</text>
</view>
<view class="switch" @click="switchSta(2)">
<view v-if="selectSta==2" class="t-icon t-icon-qiyong1 contenticon"></view>
<view v-else class="t-icon t-icon-jinyong2 contenticon"></view>
<text class="text">禁用</text>
</view>
</view>
</view>
<view class="textarea_row">
<view class="name">设置备注</view>
<view class="textarea">
<textarea />
</view>
</view>
</view>
<view class="bottom_but flex_layout">
<view class="font13">保存</view>
<view class="font13 but_color">保存</view>
<view class="font13">取消</view>
</view>
</view>
@ -73,10 +80,14 @@
data() {
return {
array: ['中国', '美国', '巴西', '日本'],
selectSta:1,
}
},
methods: {
switchSta(type){
console.log(type)
this.selectSta = type;
},
}
}
</script>
@ -86,13 +97,15 @@
.page_content{padding: 0 12px 10px;}
.content_row{display: flex;border-bottom: 1px solid #2D3A6F;height: 44px;align-items: center;
.name{width: 30%;}
.flex_layout{
.switch{display: flex;align-items: center;
.contenticon{width: 20px;height: 20px;}
.text{padding: 0 20px 0 5px;}
}
}
.textarea_row{
.name{padding: 12px 0;}
textarea{border-radius: 4px;background: rgba(255, 255, 255, 0.50);width: 100%;}
.textarea{border-radius: 4px;background: rgba(255, 255, 255, 0.50);padding:5px 10px;
textarea{width: 100%;}
}
}
</style>

View File

@ -2,7 +2,7 @@
<!-- 设备管理 -->
<view class="pagepaddings bot_padding">
<view class="" v-for="(item,index) in list" :key="index" >
<view class="page_list contentboxsty font13">
<view class="page_list contentboxsty font13" @click="toDeviceDetail(item.id)">
<view class="list_row">
<view class="row_name">
设备名称
@ -10,7 +10,7 @@
<view class="row_data">
{{item.name}}
</view>
<view class="iconfont icon-bianji font20"></view>
<view class="iconfont icon-bianji font20" @click="toAddDevice()"></view>
</view>
<view class="list_row">
设备IP/端口
@ -43,19 +43,26 @@
export default {
data() {
return {
list:[{name:"双头立锯"},
{name:"双头立锯"},
{name:"双头立锯"},
{name:"双头立锯"},
{name:"双头立锯"},
{name:"双头立锯"},
{name:"双头立锯"},
{name:"双头立锯"},
{name:"双头立锯"},
]
list:[]
}
},
onLoad() {
this.getList();
},
methods: {
getList(){
// this.$api.postFuncLoading('/equipment.mag',{}).then(res=>{
// console.log(res)
// this.list = res.data.rows;
// })
},
//
toDeviceDetail(id){
console.log(id)
uni.navigateTo({
url:'/pages/equipmentManage/deviceDetail?id='+id
})
},
toAddDevice(){
uni.navigateTo({
url:'/pages/equipmentManage/editDevice'

View File

@ -3,8 +3,8 @@
<view class="container home">
<view class="home_head">
<view class="iconfont icon-chaojiguanliyuan accounticon"></view>
<view class="name" @click="toLogin()">未登录</view>
<!-- <view class="name">Ykxiao 超级管理员</view> -->
<view class="name" v-if="userName==''" @click="toLogin()">未登录</view>
<view class="name" v-else>{{userName}} </view>
<view class="iconfont icon-xiaoxitongzhi notifyicon" @click="toMessage()"></view>
<view class="iconfont icon-shezhi setupicon"></view>
</view>
@ -199,7 +199,7 @@
<view class="content_data">
<view class="content_module" @click="toEquipmentManage()">
<view class="t-icon t-icon-shebeiguanli contenticon"></view>
<view class="contentname">设备设置</view>
<view class="contentname">设备管理</view>
</view>
<view class="content_module" @click="toDeviceStatus()">
<view class="t-icon t-icon-shebeizhuangtai contenticon"></view>
@ -225,9 +225,21 @@
},
data() {
return {
userName: '',
}
},
// onLoad() {
// this.userName = uni.getStorageSync('demu_mes_user_name')
// },
onShow(){
this.userName = uni.getStorageSync('demu_mes_user_name')
},
// created() {
// },
mounted() {
this.userName = uni.getStorageSync('demu_mes_user_name')
},
methods: {
//
toLogin(){
@ -283,7 +295,7 @@
<style lang="scss">
.home {height: 100vh;padding: 0 10px;font-size: 14px;
.home {padding: 0 10px;font-size: 14px;
.home_head{height: 40px;display: flex;position: relative;align-items: center;padding-bottom: 5px;
.name{flex:1;}
.accounticon{
@ -323,6 +335,7 @@
.energy_number{color: #FA3758;}
}
.content_data{
// view{display: inline-block;width: 25%;}
padding: 10px 0;display: flex;position: relative;align-items: center;text-align: center;height: 98px;
.content_module{
width: 25%;margin: 10px 1%;height: 98px;display: flex;align-items: center;justify-content: center;flex-direction: column;background-color: #009688;border-radius: 8px;

View File

@ -7,35 +7,44 @@
工单号:{{item.name}}
</view>
<view class="top_right">
工单详情
工单详情 <text class="iconfont icon-gengduo"></text>
</view>
</view>
<view class="list_content">
<view class="list_content font13">
<view class="list_centre">
<view class="centre_left">
加工规格:{{item.specs}}
<view class="list_row">
<view class="centre_left">
<text>加工规格</text>
<text>{{item.specs}}</text>
</view>
<view class="centre_right">
生产中
</view>
</view>
<view class="centre_right">
生产中
<view class="list_row">
<view class="centre_left">
<text>算法出材率</text>
<text>{{item.algorithm}}%</text>
</view>
</view>
</view>
<view class="list_below">
<view class="below_left">
<view class="">
算法出材率
出材率
</view>
<view class="percentage font24">
{{item.algorithm}}%
</view>
</view>
<view class="below_left">
<!-- <view class="below_left">
<view class="">
算法出材率
</view>
<view class="percentage font24">
{{item.reality}}%
</view>
</view>
</view> -->
</view>
</view>
</view>
@ -96,8 +105,13 @@
// .list_top{display: flex;padding: 12px 0;border-bottom: 1px solid #2D3A6F;margin-bottom: 8px;
// .top_left{flex: 1;}
// }
.list_centre{display: flex;
.centre_left{flex: 1;}
.list_centre{
.list_row{display: flex;padding-bottom: 12px;
.centre_left{flex: 1;display: flex;
text:first-child{width:80px;}
}
.centre_right{background: rgba(230,162,60,0.2);border-radius: 4px 4px 4px 4px;height: 20px;padding: 0 6px;color: #E6A23C;}
}
}
.list_below{display: flex;text-align: center;padding: 20px 0;
view{flex: 1;}

View File

@ -24,7 +24,7 @@
</view>
<view class="con_but">
<view class="but_rat"><view class="t-icon t-icon-shenpizhida icon22"></view>审批</view>
<view class="but_del"><view class="t-icon t-icon-shezhi icon22 paddrigth5"></view>删除</view>
<view class="but_del"><view class="t-icon t-icon-shezhi icon22 padd_rigth5"></view>删除</view>
</view>
</view>
</view>

View File

@ -1,7 +1,7 @@
<template>
<!-- 工单进度管理 -->
<view class="pagepaddings">
<view class="detail_list contentboxsty">
<view class="detail_list contentboxsty font13">
<view class="list_top">
<view class="top_left">
工单号:
@ -14,7 +14,7 @@
<view class="list_row">
<view class="row_left">
<view class="">开始时间</view>
<view class=""></view>
<view class="">24-01-12 08:00</view>
</view>
<view class="row_right">
生产中
@ -22,13 +22,13 @@
</view>
<view class="list_row padd_top12">
<view class="">计划完成</view>
<view class=""></view>
<view class="">24-01-12 08:00</view>
</view>
<view class="padd_top12">
<progressBar :total="100" :val="20" title="" />
</view>
</view>
<annularProgressBar :progress_txt="20" :width="84" :height="69" title="出材率"/>
<!-- <annularProgressBar :progress_txt="20" :width="84" :height="69" title="出材率"/> -->
</view>
</view>
</template>
@ -55,7 +55,9 @@
<style lang="scss">
.detail_list{
.list_content{
.list_row{display: flex;}
.list_row{display: flex;
.row_left{display: flex;}
}
}
}
</style>

View File

@ -1,5 +1,6 @@
<template>
<view class="login_page ">
<view class="iconfont icon-shouye" @click="toIndex()" style="height: 25px;position: absolute;top: 60px;width: 30px;"></view>
<view class="login_top">
<view class="login_logo">
<image src="https://dm-auto.oss-cn-shanghai.aliyuncs.com/mes_wechat/meslogo.png" class="logopng"></image>
@ -20,10 +21,10 @@
</view>
<view class="font12 text_color_black" v-if="tab==1">
<view class="login_input">
<input placeholder="请输入账号" />
<input placeholder="请输入账号" v-model="accountValue"/>
</view>
<view class="login_input">
<input password type="text" placeholder="请输入密码" />
<input password type="text" v-model="passValue" placeholder="请输入密码" />
</view>
</view>
<view class="font12 text_color_black" v-if="tab==2">
@ -38,12 +39,19 @@
<view class="" v-if="tab==1" style="color: #C4C4C4;font-size: 11px; padding-top: 14px;">
记住密码
</view>
<view class="loginbut">
<view class="loginbut" @click="login()">
登录
</view>
<view class="" style="color: #009688;text-align: center;font-size: 13px;">
手机号一键登录
</view>
<button class="persontc " type="default" open-type="getPhoneNumber" @getphonenumber="getPhone">
<view class="" style="color: #009688;text-align: center;font-size: 13px;">
手机号快捷登录
</view>
</button>
<!-- <button class="persontc" open-type="getPhoneNumber" @getphonenumber="getPhoneNumber">
<view class="" style="color: #009688;text-align: center;font-size: 13px;">
手机号快捷登录
</view>
</button> -->
</view>
<view class="login_below">
<view class="">
@ -62,6 +70,8 @@
return {
codename:'获取验证码',
tab:1,
accountValue:'long',
passValue:'123456',
}
},
methods: {
@ -69,6 +79,24 @@
changeTab(tab){
this.$set(this,"tab",tab);
},
toIndex(){
uni.navigateBack({
delta: 2
});
},
login(){
this.$api.postFuncLoading('/user.login',{login_name:this.accountValue,password:this.passValue}).then(res=>{
console.log(res)
let obj = new Object();
obj.mes_user_name=res.data.user.name;
obj.mes_token=res.data.token;
this.$wf.setLoginData(obj)
uni.switchTab({
url:'/pages/index/index'
})
})
},
}
}
</script>
@ -87,10 +115,43 @@
.demupng{width: 60px;height: 36px;}
.login_centre{border-radius: 16px;background: #FFF;padding: 20px 24px 40px;}
.login_switch{display: flex;}
.login_name{flex: 1;text-align: center;}
.login_name{flex: 1;text-align: center;
padding-bottom: 5px;
/* border-bottom: 1px solid #000; */
margin-bottom: 10px;
}
.login_name:focus {
outline: none; /* 去除默认的外边框效果 */
border-width: 3px; /* 当元素被点击或者获得焦点时将边框宽度修改为3像素 */
}
.font_bold{
position: relative;
}
.font_bold::after{
content: '';
position: absolute;
left: calc(50% - 15px);
bottom: -4px;
z-index: 10;
width: 30px;
border-bottom: 3px solid #009688 ;
}
.login_input{border-radius: 21.5px;background: #F3F5F9;margin-top: 12px;padding: 5px 15px;}
.getCaptcha{border-radius: 21.5px;background: #009688;height: auto;color: white;display: flex;align-items: center;width: 40%;justify-content: center;}
.flex_layout{display: flex;margin-top: 12px;}
.login_code{margin-top: unset;width:60%;margin-right: 12px;}
.loginbut{background: #009688;text-align: center;margin-top: 60px;margin-bottom: 18px;padding: 9px;border-radius: 66rpx;}
.persontc{
border: none;
margin: 0;
padding: 0;
outline: none;
border-radius: 0;
background: none!important;
line-height: normal;
}
.persontc::after {
border: none;
}
</style>

View File

@ -35,7 +35,9 @@
<view class="person_dataC contentboxsty">
<view class="content_box">
<view class="data_name">设备故障通知</view>
<view class=""></view>
<view class="">
</view>
</view>
<view class="content_box">
<view class="data_name">出材率预警通知</view>
@ -75,9 +77,9 @@
},
//
toChangPhone(){
// uni.navigateTo({
// url: '/pages/person/changePhone'
// })
uni.navigateTo({
url: '/pages/person/changePhone'
})
}
}
}
@ -101,4 +103,6 @@
}
.data_name{flex: 1;}
}
</style>

62
pages/person/alarm.vue Normal file
View File

@ -0,0 +1,62 @@
<template>
<!-- 设备报警 -->
<view class="pagepaddings">
<view class="content_layout" @click="cancelLongpress">
<view class="item_layout" v-for="(item, index) in list" :key="index">
<view :class="islongpress?'longpress_style':''" @longpress="longpress" @click="deleteAlarm">
<image :src="item.url" class="img_style" mode=""></image>
</view>
<view class="font13 flex_layout">
<text class="flex1">{{item.name}}</text>
<text>{{item.time}}</text>
</view>
</view>
</view>
</view>
</template>
<script>
export default {
data() {
return {
islongpress:false,
list:[
{name:'周边侵入警报',time:'2023-09-01',url:'../../static/logo.png'},
{name:'周边侵入警报',time:'2023-09-01',url:'../../static/logo.png'},
{name:'周边侵入警报',time:'2023-09-01',url:'../../static/logo.png'},
]
}
},
methods: {
longpress(){
console.log('长按事件')
this.islongpress = true
},
//
cancelLongpress(){
this.islongpress = false
},
//
deleteAlarm(){
if(this.islongpress){
console.log('删除')
}
},
}
}
</script>
<style>
/* .content_layout{display: flex;flex-flow: wrap;}
.item_layout{width: 50%;} */
.content_layout{
display: grid;
grid-template-columns: 1fr 1fr;/* 每一列占一行的一半 */
grid-gap: 10px; /* 可选的间距 */
}
.img_style{height: 110px;width: 100%;}
.longpress_style{background-color: #000;
opacity: 0.2;}
</style>

View File

@ -1,6 +1,14 @@
<template>
<view>
<view class="pagepaddings font13">
<view class="phone_page contentboxsty">
<view class="content_row">
<input placeholder="请输入要更换的手机号码" />
</view>
<view class="content_row noborbot">
<input placeholder="请输入短信验证码" />
<view class="theme_color">获取验证码</view>
</view>
</view>
</view>
</template>
@ -18,5 +26,7 @@
</script>
<style>
.phone_page{padding: 0 12px;}
.content_row{display: flex;height: 49px;align-items: center;border-bottom: 1px solid #2D3A6F;}
.content_row input{flex: 1;}
</style>

View File

@ -0,0 +1,464 @@
<template>
<view v-if="step==1">
<view class="scan_box">
<image class="avatar_frame" src="http://dm-auto.oss-cn-shanghai.aliyuncs.com/mes_wechat/morentouxiang.png" mode=""></image>
<image class="scan_img" src="http://dm-auto.oss-cn-shanghai.aliyuncs.com/mes_wechat/saomiao.png"></image>
</view>
<view class="start_view" @click="startAttestation(2)">
<view class="start_but">
开始认证
</view>
</view>
</view>
<view class="page-content" v-else-if="step==2">
<view class="containerV">
<view class="headerV">
<view class="top-tips1 font15">
<view>请把脸移入圈内保持不动</view>
</view>
<!-- <view class="top-tips2">
为了便于识别认证请拍摄本人头像
</view> -->
</view>
<view class="contentV">
<view class="mark"></view>
<image v-if="tempImg" mode="widthFix" :src="tempImg" />
<camera v-if='isAuthCamera' :device-position="devicePosition ?'front': 'back'" class="camera"
flash="off" resolution='high' />
<view v-show="!tempImg && tipsText" class="tipV">{{ tipsText }}</view>
</view>
<view class="footerV">
<view style="width: 100%;">
<view v-if="!tempImg" style="width: 100%;">
<!-- <view class="privacyV">
<view class="icon"></view>
<view class="text">
照片隐私<text @click="handleJumpSecurityClick">安全保障</text>
</view>
</view>
<view class="bottom-tips-2">该照片仅作为你认证的凭证</view> -->
<view class="take-photo-bgV">
<!-- 图片上传 -->
<!-- <view v-show="true" class="btn-change-upload" @click="handleChooseImage" ></view> -->
<!--拍照-->
<view class="btn-take-photo" @click="handleTakePhotoClick" ></view>
<!-- 切换镜头 -->
<view class="btn-change-camera" @click="handleChangeCameraClick" ></view>
</view>
</view>
<view class="confirmV" v-else>
<view class="btn-cancel" @click="handleCancelClick">
取消
</view>
<view class="btn-ok" @click="handleOkClick">
确定
</view>
</view>
</view>
</view>
</view>
</view>
</template>
<script>
export default {
name: 'index',
components: {
},
data() {
return {
step:1,
tipsText: '', //
tempImg: '', //
// BASE_API,
cameraEngine: null, //
devicePosition: false, //
isAuthCamera: true, //
}
},
onLoad(options) {
this.initData()
},
mounted(){
},
methods: {
//
startAttestation(type){
this.step=type;
},
//
initData() {
this.handleChangeCameraClick();
// console.log(1111)
// const session = wx.createVKSession({
// track: {
// face: { mode: 1 } // mode: 1 - 使2 -
// },
// })
// console.log(222)
// // updateAnchors
// session.on('updateAnchors', anchors => {
// anchors.forEach(anchor => {
// console.log('anchor.points', anchor.points)
// console.log('anchor.origin', anchor.origin)
// console.log('anchor.size', anchor.size)
// console.log('anchor.angle', anchor.angle)
// })
// })
// console.log(333)
// // removeAnchors
// session.on('removeAnchors', () => {
// console.log('removeAnchors')
// })
// // start
// session.start(errno => {
// if (errno) {
// // errno
// } else {
// // null
// }
// })
// console.log(444)
this.cameraEngine = wx.createCameraContext()
const listener = this.cameraEngine.onCameraFrame((frame) => {
if (this.tempImg) {
return;
}
wx.createVKSession({
track: {
plane: {mode: 3},
},
version: 'v2',
// gl, // WebGLRenderingContext
})
})
// // #ifdef MP-WEIXIN
// // 1
// wx.initFaceDetect()
// // 2 camera CameraContext
// this.cameraEngine = wx.createCameraContext()
// // 3 Camera
// const listener = this.cameraEngine.onCameraFrame((frame) => {
// if (this.tempImg) {
// return;
// }
// // 4使 wx.initFaceDetect 使
// wx.faceDetect({
// frameBuffer: frame.data,
// width: frame.width,
// height: frame.height,
// enablePoint: true,
// enableConf: true,
// enableAngle: true,
// enableMultiFace: true,
// success: (faceData) => {
// let face = faceData.faceInfo[0]
// if (faceData.x == -1 || faceData.y == -1) {
// this.tipsText = ''
// }
// if (faceData.faceInfo.length > 1) {
// this.tipsText = ''
// } else {
// const {
// pitch,
// roll,
// yaw
// } = face.angleArray;
// const standard = 0.5
// if (Math.abs(pitch) >= standard || Math.abs(roll) >= standard ||
// Math.abs(yaw) >= standard) {
// this.tipsText = ''
// } else if (face.confArray.global <= 0.8 || face.confArray.leftEye <=
// 0.8 || face.confArray.mouth <= 0.8 || face.confArray.nose <= 0.8 ||
// face.confArray.rightEye <= 0.8) {
// this.tipsText = ''
// } else {
// this.tipsText = ''
// //
// }
// }
// },
// fail: (err) => {
// if (err.x == -1 || err.y == -1) {
// this.tipsText = ''
// } else {
// this.tipsText = err.errMsg || '退'
// }
// },
// })
// })
// 5
// listener.start()
// #endif
},
//
handleChangeCameraClick() {
this.devicePosition = !this.devicePosition;
},
//
handleChooseImage() {
uni.chooseImage({
count: 1,
sizeType: ['original', 'compressed'],
sourceType: ['album','camera'],
success: (res) => {
console.log(res,'打印res哈哈哈哈哈')
if (res.errMsg === 'chooseImage:ok') {
uni.showLoading({
title: '照片上传中...'
})
const tempFilePaths = res.tempFilePaths[0]
this.upLoad(res.tempFilePaths);
}
},
fail: (res) => {
},
});
},
//
handleTakePhotoClick() {
if (this.tipsText != "" && this.tipsText != "请拍照") {
return;
}
uni.getSetting({
success: (res) => {
if (!res.authSetting['scope.camera']) {
this.isAuthCamera = false
uni.openSetting({
success: (res) => {
if (res.authSetting['scope.camera']) {
this.isAuthCamera = true;
}
}
})
}
}
})
this.cameraEngine.takePhoto({
quality: "high",
success: ({
tempImagePath
}) => {
this.tempImg = tempImagePath
}
})
console.log(this.tempImg,2121)
},
//
handleOkClick() {
// this.tempImg
this.upLoadOne(this.tempImg)
uni.navigateBack({
delta: 1
});
},
upLoad(tempFilePaths) {
// # tempFilePaths
//
uni.showLoading({
title: "上传中,请稍后...",
});
let proAll = [];
tempFilePaths.forEach((item) => {
console.log(item,'打印item')
proAll.push(this.upLoadOne(item));
});
Promise.all(proAll).then((res) => {
//
uni.hideLoading();
});
},
upLoadOne(imgPath) {
// imgPath
//
},
// -
handleCancelClick() {
this.tempImg = ''
},
// -
handleJumpSecurityClick() {
uni.showToast({
icon: "none",
title: "假装跳转人脸安全保障",
duration: 2000,
})
},
}
}
</script>
<style lang="scss" scoped>
.scan_box{width: 200px;height: 200px;margin: 70px auto;border: 3px solid #009688;border-radius: 50%;background-color: #EEEEEE;
display: flex;justify-content: center;
}
.avatar_frame{width: 100%;height: 100%;}
.scan_img{height: 98px;padding-top: 14px; position: absolute;width: 200px;}
.start_view{display: flex;justify-content: center;padding-top: 20px;}
.start_but{width: 116px;height: 34px;border-radius: 29px;background: #009688;align-items: center;justify-content: center;display: flex;}
.page-content {
width: 100%;
height: 100%;
.containerV {
width: 100%;
height: 100%;
.headerV {
.top-tips1 {
margin-top: 60rpx;
color: #FFFFFF;
font-size: 36rpx;
text-align: center;
}
.top-tips2 {
margin-top: 20rpx;
color: #00AAFF;
font-size: 28rpx;
text-align: center;
}
}
.contentV {
position: relative;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
height: 400rpx;
margin-top: 30rpx;
.tipV {
bottom: 30rpx;
position: absolute;
line-height: 90rpx;
padding-left: 24rpx;
padding-right: 24rpx;
max-width: calc(100vw - 50rpx * 2);
text-align: center;
font-size: 30rpx;
background: #000000;
opacity: 0.75;
color: #FFFFFF;
border-radius: 16rpx;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
z-index: 5;
}
.camera {
width: 400upx;
height: 400upx;
border-radius: 50%;
border: 3px solid #009688;
}
.mark {
position: absolute;
left: 0;
top: 0;
z-index: 2;
width: 750rpx;
height: 100%;
// background:deeppink;
background-size: 750rpx 661rpx;
}
image {
position: absolute;
width: 100%;
height: 100%;
z-index: 3;
}
}
.footerV {
width: 100%;
display: flex;
flex-direction: row;
align-items: center;
justify-content: center;
.privacyV {
padding-top: 30rpx;
display: flex;
flex-direction: row;
align-items: center;
justify-content: center;
.text {
font-size: 30rpx;
color: #1C1C1C;
text-align: center;
line-height: 42rpx;
margin-left: 15rpx;
text {
font-size: 30rpx;
color: #00AAFF;
text-align: center;
line-height: 42rpx;
}
}
.icon {
width: 40rpx;
height: 47rpx;
background:green;
background-size: 100% auto;
}
}
.bottom-tips-2 {
margin-top: 20rpx;
color: #999999;
text-align: center;
font-size: 26rpx;
}
.take-photo-bgV {
width: 100%;
margin-top: 300rpx;
display: flex;
flex-direction: row;
align-items: center;
justify-content: center;
.btn-take-photo {
margin: 0rpx 80rpx 0rpx 80rpx;
width: 196rpx;
height: 196rpx;
background: yellow;
background-size: 100% auto;
}
.btn-change-upload {
left: 130rpx;
width: 80rpx;
height: 80rpx;
background: blue;
background-size: 100% auto;
}
.btn-change-camera {
right: 130rpx;
width: 80rpx;
height: 80rpx;
background:red;
background-size: 100% auto;
}
}
.confirmV {
margin: 200rpx 100rpx 0rpx 100rpx;
display: flex;
flex-direction: row;
align-items: center;
justify-content: space-between;
.btn-cancel {
font-size: 32rpx;
color: #1C1C1C;
}
.btn-ok {
font-size: 32rpx;
color: #00AAFF;
}
}
}
}
}
</style>

View File

@ -0,0 +1,158 @@
<template>
<view class="pagepaddings">
<!-- <checkbox-group @change="checkboxChange">
<label class="uni-list-cell uni-list-cell-pd" v-for="item in items" :key="item.value">
<view>
<checkbox :value="item.value" :checked="item.checked" />
</view>
<view>{{item.name}}</view>
</label>
</checkbox-group> -->
<view class="contentboxsty" v-for="(item, index) in list" :key="index.id">
<view class="list_name">
<checkbox-group @change="changeCheckbox">
<checkbox value="cb" class="checkbox-backgroun-yellow" :value="item.id" :checked="item.checked" style="transform:scale(0.7)" />
</checkbox-group>
<!-- <checkbox-group @change="selectPath(e,item)">
<checkbox value="cb" class="checkbox-backgroun-yellow" :value="item.id" :checked="item.checked" style="transform:scale(0.7)" />
</checkbox-group> -->
<!-- <text class="t-icon t-icon-xuanzhong padd_rigth12" @click="selectPath($event.target,item)"></text> -->
{{item.name}}{{item.checked}}
</view>
<view class="list_content" v-for="(i, ind) in item.child" :key="ind">
<view class="content_name">
<checkbox-group @change="selectPath(e,i)">
<checkbox value="cb" class="checkbox-backgroun-yellow" :value="i.id" :checked="i.checked" style="transform:scale(0.7)" />
</checkbox-group>
<!-- <text class="t-icon t-icon-xuanzhong padd_rigth5"></text> -->
<text class="">{{i.name}}</text>
</view>
<view class="content_item">
<view class="content_data" v-for="(btn, inx) in i.child" :key="inx">
<checkbox-group @change="selectPath(e,i)">
<checkbox value="cb" class="checkbox-backgroun-yellow" :value="btn.id" :checked="btn.checked" style="transform:scale(0.7)" />
</checkbox-group>
<!-- <text class="t-icon t-icon-xuanzhong padd_rigth5"></text> -->
<text class="">{{btn.name}}</text>
</view>
</view>
</view>
</view>
</view>
</template>
<script>
export default {
data() {
return {
items: [{
value: 'USA',
name: '美国'
},
{
value: 'CHN',
name: '中国',
checked: 'true'
},
{
value: 'BRA',
name: '巴西'
},
{
value: 'JPN',
name: '日本'
},
{
value: 'ENG',
name: '英国'
},
{
value: 'FRA',
name: '法国'
}
],
list:[
{name:'首页',checked:true,id:1,child:[{
id: 2,
name:'控制台',
checked:true,
child:[
{id:121,name:'设备信息',},
{id:122,name:'生产加工信息',},
{id:123,name:'生产加工信息',},
{id:124,name:'账号信息',},
{id:125,name:'通知设置',},
{id:126,name:'升级角色'},],
},
],
},
// {name:'',id:11,child:[{
// id: 3,
// name:'',
// child:[{name:''},
// {name:''},
// {name:''},
// ],
// },
// {name:'',
// child:[],
// },
// ],
// }
],
arr:[]
}
},
methods: {
checkboxChange: function (e) {
var items = this.items,
values = e.detail.value;
for (var i = 0, lenI = items.length; i < lenI; ++i) {
const item = items[i]
if(values.includes(item.value)){
this.$set(item,'checked',true)
}else{
this.$set(item,'checked',false)
}
}
console.log(items)
},
changeCheckbox(e){
console.log(e)
// var items = this.list,
// values = e.detail.value;
// for (var i = 0, lenI = items.length; i < lenI; ++i) {
// const item = items[i]
// if(values.includes(item.value)){
// this.$set(item,'checked',true)
// }else{
// this.$set(item,'checked',false)
// }
// }
// console.log(items)
},
selectPath(e,item){
console.log(e,item,222)
},
}
}
</script>
<style>
.contentboxsty{padding: 14px 12px;margin-bottom: 12px;}
.list_name{display: flex;align-items: center;padding-bottom: 7px;border-bottom: 1px solid #2D3A6F;}
.content_name{padding:8px 0 ;display: flex;align-items: center;}
.content_item{display: flex;align-items: center;flex-wrap: wrap;}
.content_data{padding: 4px 15px 4px 0;display: flex;align-items: center;}
/* 复选框-背景颜色 */
checkbox.checkbox-backgroun-yellow[checked] .wx-checkbox-input,
checkbox.checkbox-backgroun-yellow.checked .uni-checkbox-input{
background-color: #009688 !important;
border-color: #009688 !important;
color: #ffffff !important;
}
</style>

View File

@ -32,7 +32,7 @@
<view class="t-icon t-icon-shengchangongdan backlogicon"></view>
<view class="backlogname">流程审批</view>
</view>
<view class="backlog_module">
<view class="backlog_module" @click="toAlarm">
<view class="t-icon t-icon-shengchangongdan backlogicon"></view>
<view class="backlogname">设备报警</view>
</view>
@ -40,7 +40,7 @@
<view class="t-icon t-icon-shengchangongdan backlogicon"></view>
<view class="backlogname">权限审批</view>
</view>
<view class="backlog_module">
<view class="backlog_module" @click="toSafetyAccidents()">
<view class="t-icon t-icon-shengchangongdan backlogicon"></view>
<view class="backlogname">安全事故</view>
</view>
@ -51,7 +51,7 @@
<view class="font14">账户中心</view>
</view>
<view class="con_data">
<view class="con_module">
<view class="con_module" @click="toMessage">
<view class="t-icon t-icon-xiaoxitongzhi-gerenzhongxin personicon"></view>
<view class="font13">消息管理</view>
<view class=""></view>
@ -61,11 +61,16 @@
<view class="font13">审批直达</view>
<view class=""></view>
</view> -->
<view class="con_module noborbot">
<view class="con_module" @click="toMyAuthority()">
<view class="t-icon t-icon-wodequanxian personicon"></view>
<view class="font13">我的权限</view>
<view class=""></view>
</view>
<view class="con_module noborbot" @click="toFaceAuthentication()">
<view class="t-icon t-icon-renlianrenzheng personicon"></view>
<view class="font13">人脸认证</view>
<view class=""></view>
</view>
</view>
<view class="con_set">
<view class="t-icon t-icon-xitongshezhi-gerenzhongxin personicon"></view>
@ -90,12 +95,40 @@
}
},
methods: {
//
toAlarm(){
uni.navigateTo({
url:'/pages/person/alarm'
})
},
toSafetyAccidents(){
uni.navigateTo({
url:'/pages/person/safetyAccidents'
})
},
//
toAccountCenter(){
uni.navigateTo({
url: '/pages/person/accountCenter'
})
},
//
toFaceAuthentication(){
uni.navigateTo({
url:'/pages/person/faceAuthentication'
})
},
toMyAuthority(){
uni.navigateTo({
url:'/pages/person/myAuthority'
})
},
//
toMessage(){
uni.navigateTo({
url: '/pages/index/message'
})
},
}
}
</script>

View File

@ -0,0 +1,43 @@
<template>
<!-- 安全事故 -->
<view class="pagepaddings">
<view class="contentboxsty font13" v-for="(item, index) in list" :key="index">
<view class="name font_bold font14">
{{item.name}}
</view>
<view class="img_style">
<image :src="item.url"></image>
</view>
<view class="flex_layout padd_bot6">
<view class="flex1">员工安全行为</view>
<view class="">2023-09-01</view>
</view>
<view class="">
事件描述事件描述事件描述事件描述事件描述事件描述
事件描述事件描述事件描述事件描述事件描述事件描述
</view>
</view>
</view>
</template>
<script>
export default {
data() {
return {
list:[
{name:'设备一',url:'../../static/logo.png'},
{name:'设备一',url:'../../static/logo.png'},
]
}
},
methods: {
}
}
</script>
<style>
.contentboxsty{padding: 14px 12px;margin-bottom: 12px;}
.img_style{padding: 12px 0 14px 0;}
</style>

View File

@ -1,6 +1,58 @@
<template>
<view>
<view class="pagepaddings">
<view class="detail_list contentboxsty ">
<view class="list_top">
<view class="top_left">
工单号 <text class="padd_left12">{{form.order_sn}}</text>
</view>
<view class="top_right font13">
{{form.review_status_label}}
</view>
</view>
<view class="list_content">
<view class="content_left font13">
<view class="content_row">
<text class="name">生产开始时间</text>
<text class="data">{{form.created_at}}</text>
</view>
<view class="content_row">
<text class="name">生产结束时间</text>
<text class="data">{{form.updated_at}}</text>
</view>
<view class="content_row">
<text class="name">工单耗时</text>
<text class="data">10h</text>
</view>
<view class="content_row">
<text class="name">加工规格</text>
<text class="data">{{form.order_spec}}</text>
</view>
<view class="content_row">
<text class="name">规格料</text>
<text class="data">13.01</text>
</view>
<view class="content_row">
<text class="name">生产负责</text>
<text class="data">张三</text>
</view>
<view class="content_row">
<text class="name">加工等级</text>
<text class="data">全齐边</text>
</view>
<view class="content_row">
<text class="name">辅料</text>
<text class="data">0.61</text>
</view>
<view class="content_row">
<text class="name">电话</text>
<text class="data">13712279001</text>
</view>
</view>
<view class="content_right">
</view>
</view>
</view>
</view>
</template>
@ -8,15 +60,34 @@
export default {
data() {
return {
form:{}
}
},
onLoad(option){
console.log(option)
this.detailData(option.id)
},
onShow(){
// this.detailData()
},
methods: {
detailData(id){
this.$api.postFuncLoading('/order.info',{id:id}).then(res=>{
console.log(res.data)
this.form = res.data
})
},
}
}
</script>
<style>
<style lang="scss">
.list_top{
.top_right{background: #243168;border-radius: 4px 4px 4px 4px;width: 46px;height: 20px;text-align: center;}
}
.list_content{
.content_row{display: flex;padding:6px 0;
.name{width: 90px;}
}
}
</style>

View File

@ -1,60 +1,61 @@
<template>
<!-- 生产工单 -->
<view class="pagepaddings">
<view v-for="(item,index) in list" :key="index" class="page_list contentboxsty font13">
<view @click="toDetail()">
<view v-for="(item,index) in list" :key="index" class="detail_list contentboxsty font13">
<view @click="toDetail(item.id)">
<view class="list_top">
<view class="top_left">
工单号:{{item.name}}
工单号:{{item.order_sn}}
</view>
<view class="top_right">
工单详情
</view>
<view class="iconfont icon-gengduo-1"></view>
</view>
<view class="list_centre">
<view class="centre_left">
<view class="">
算法出材率
</view>
<view class="percentage font24">
{{item.algorithm}}%
</view>
</view>
<view class="centre_left">
<view class="">
算法出材率
</view>
<view class="percentage font24">
{{item.reality}}%
</view>
工单详情 <text class="iconfont icon-gengduo"></text>
</view>
</view>
<view class="list_below">
<view class="row">
<view class="row_left">
<text>状态</text>
<text>{{item.state}}</text>
<view class="list_content font13">
<view class="list_centre">
<view class="centre_left">
<view class="">
算法出材率
</view>
<view class="percentage font24">
{{item.algorithm}}%
</view>
</view>
<view class="row_right">
<text>加工规格</text>
<text>{{item.specs}}</text>
<view class="centre_left">
<view class="">
实际出材率
</view>
<view class="percentage font24">
{{item.reality}}%
</view>
</view>
</view>
<view class="row">
<view class="row_left">
<text>生产开始</text>
<text>{{item.time}}</text>
<view class="list_below">
<view class="row">
<view class="row_left">
<text>状态</text>
<text>{{item.review_status_label}}</text>
</view>
<view class="row_right">
<text>加工规格</text>
<text>{{item.order_spec}}</text>
</view>
</view>
<view class="row_right">
<text>工单耗时</text>
<text>{{item.timeConsuming}}</text>
<view class="row">
<view class="row_left">
<text>生产开始</text>
<text>{{item.plan_date}}</text>
</view>
<view class="row_right">
<text>工单耗时</text>
<text>{{item.timeConsuming}}</text>
</view>
</view>
</view>
<view class="row">
<view class="row_left">
<text>工单数量</text>
<text>{{item.number}}</text>
<view class="row">
<view class="row_left">
<text>工单数量</text>
<text>{{item.order_number}}</text>
</view>
</view>
</view>
</view>
@ -67,50 +68,25 @@
export default {
data() {
return {
list:[{
name:'SO202401111004',
algorithm:'81.5',
reality:'81.4',
state:'生产中',
specs:'4*9*3.66',
time:'jan-11 10:05',
timeConsuming:'3.5H',
number:'12.66m³'
},{
name:'SO202401111004',
algorithm:'81.5',
reality:'81.4',
state:'生产中',
specs:'4*9*3.66',
time:'jan-11 10:05',
timeConsuming:'3.5H',
number:'12.66m³'
},{
name:'SO202401111004',
algorithm:'81.5',
reality:'81.4',
state:'生产中',
specs:'4*9*3.66',
time:'jan-11 10:05',
timeConsuming:'3.5H',
number:'12.66m³'
},{
name:'SO202401111004',
algorithm:'81.5',
reality:'81.4',
state:'生产中',
specs:'4*9*3.66',
time:'jan-11 10:05',
timeConsuming:'3.5H',
number:'12.66m³'
}]
list:[]
}
},
onShow(){
this.listData();
},
methods: {
listData(){
this.$api.postFuncLoading('/order.list',{page: 1,pageSize: 15}).then(res=>{
this.list = res.data.rows
})
},
//
toDetail(){
toDetail(id){
console.log(id)
uni.navigateTo({
url:'/pages/production/productionDetail'
url:'/pages/production/productionDetail?id='+id
})
},
}
@ -118,10 +94,7 @@
</script>
<style lang="scss">
.page_list{
.list_top{display: flex;padding: 12px 0;border-bottom: 1px solid #2D3A6F;margin-bottom: 8px;
.top_left{flex: 1;}
}
.detail_list{
.list_centre{display: flex;text-align: center;padding-bottom: 10px;
view{flex: 1;}
.percentage{color: #00B68D;}
@ -131,5 +104,6 @@
view{flex: 1;}
}
}
}
</style>

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1,8 +1,8 @@
@font-face {
font-family: "iconfont"; /* Project id 4403683 */
src: url('//at.alicdn.com/t/c/font_4403683_gbygrrqjx2.woff2?t=1706861428966') format('woff2'),
url('//at.alicdn.com/t/c/font_4403683_gbygrrqjx2.woff?t=1706861428966') format('woff'),
url('//at.alicdn.com/t/c/font_4403683_gbygrrqjx2.ttf?t=1706861428966') format('truetype');
src: url('//at.alicdn.com/t/c/font_4403683_5b5i159cydc.woff2?t=1709604278213') format('woff2'),
url('//at.alicdn.com/t/c/font_4403683_5b5i159cydc.woff?t=1709604278213') format('woff'),
url('//at.alicdn.com/t/c/font_4403683_5b5i159cydc.ttf?t=1709604278213') format('truetype');
}
.iconfont {
@ -13,6 +13,38 @@
-moz-osx-font-smoothing: grayscale;
}
.icon-paizhao:before {
content: "\e633";
}
.icon-qiehuanjingtou:before {
content: "\e634";
}
.icon-renlianrenzheng:before {
content: "\e632";
}
.icon-xuanzhong:before {
content: "\e631";
}
.icon-renzhengshibai:before {
content: "\e62f";
}
.icon-renzhengchenggong:before {
content: "\e630";
}
.icon-shenpi:before {
content: "\e62d";
}
.icon-a-shanchu21:before {
content: "\e62e";
}
.icon-weixiubaoyangpinshuai:before {
content: "\e62a";
}

128
utils/api.js Normal file
View File

@ -0,0 +1,128 @@
import config from './envConfig.js';
import wf from './public.js'
const request = (url = '', data = {}, header = { //这里这样封装是为了后续具体组件中使用时可以直接传参,需按此顺序传参而不需要写urlxxx等键值对传参
//具体的header和后端商同后再编写这里以常见的token为例
'Authorization': 'Bearer '+uni.getStorageSync('mes_token') ? 'Bearer '+uni.getStorageSync('mes_token') : '',
}) => {
return new Promise((resolve, reject) => {
// console.log(config,800)
uni.request({
url: config.dev.VITE_BASE_API + url, //接口地址:前缀+方法中传入的地址
method: "POST", //请求方法
dataType: "json",
data: data, //传递参数
header: header, //自定义头部,和后端商同后编写
success: (res) => {
// console.log('request.js文件的通用接口请求封装返回的结果数据',res);
//注因为这里对请求成功的没有统一设置抛错提示所以后续具体组件中使用接口请求的res除200实际以后端同事定好的为准成功外的其他code需要额外写抛错提示
if (res.data.code == 'xxx') { //自定请求失败的情况这里以常见的token失效或过期为例
uni.removeStorageSync('token');
uni.showModal({
showCancel: false,
title: '温馨提示',
content: res.data.msg,
// header: {
// "Token": 'Bearer ' + uni.getStorageSync("mes_token")
// },
success: function(result) {
if (result.confirm) {
// uni.reLaunch({
// url: '/pages/login/index' //这里需用绝对路径才可
// });
}
}
});
}
if(res.header.Authorization){
uni.removeStorageSync('mes_token');
let obj = new Object();
let str =String(res.header.Authorization)
let newStr = str.slice(0, 0) + str.slice(7)
obj.mes_token=newStr;
uni.setStorageSync("mes_token",obj.mes_token);
}
resolve(res.data) //成功
},
// 这里的接口请求如果出现问题就输出接口请求失败的msg
//注因为这里对于请求失败的设置统一抛错提示了所以后续具体组件中使用接口请求的catch中不需要再写抛错提示
fail: (err) => {
uni.showToast({
title: "" + err.msg,
icon: 'none'
});
reject(err)
}
})
})
}
const postFuncLoading = (url = '', data = {}, header = { //这里这样封装是为了后续具体组件中使用时可以直接传参,需按此顺序传参而不需要写urlxxx等键值对传参
//具体的header和后端商同后再编写这里以常见的token为例
'Authorization': 'Bearer '+uni.getStorageSync('mes_token') ? 'Bearer '+uni.getStorageSync('mes_token') : '',
}) => {
uni.showLoading({
title: '加载中',
mask: true
})
return new Promise((resolve, reject) => {
// console.log(config,800)
uni.request({
url: config.dev.VITE_BASE_API + url, //接口地址:前缀+方法中传入的地址
method: "POST", //请求方法
dataType: "json",
data: data, //传递参数
header: header, //自定义头部,和后端商同后编写
success: (res) => {
setTimeout(function () {
uni.hideLoading();
}, 200);
// console.log('request.js文件的通用接口请求封装返回的结果数据',res);
//注因为这里对请求成功的没有统一设置抛错提示所以后续具体组件中使用接口请求的res除200实际以后端同事定好的为准成功外的其他code需要额外写抛错提示
if (res.data.code == 'xxx') { //自定请求失败的情况这里以常见的token失效或过期为例
uni.removeStorageSync('token');
uni.showModal({
showCancel: false,
title: '温馨提示',
content: res.data.msg,
// header: {
// "Token": 'Bearer ' + uni.getStorageSync("mes_token")
// },
success: function(result) {
if (result.confirm) {
// uni.reLaunch({
// url: '/pages/login/index' //这里需用绝对路径才可
// });
}
}
});
}
if(res.header.Authorization){
uni.removeStorageSync('mes_token');
let obj = new Object();
let str =String(res.header.Authorization)
let newStr = str.slice(0, 0) + str.slice(7)
obj.mes_token=newStr;
uni.setStorageSync("mes_token",obj.mes_token);
}
resolve(res.data) //成功
},
// 这里的接口请求如果出现问题就输出接口请求失败的msg
//注因为这里对于请求失败的设置统一抛错提示了所以后续具体组件中使用接口请求的catch中不需要再写抛错提示
fail: (err) => {
uni.showToast({
title: "" + err.msg,
icon: 'none'
});
reject(err)
}
})
})
}
export default {
request,
postFuncLoading
};

21
utils/envConfig.js Normal file
View File

@ -0,0 +1,21 @@
// 导出的环境请求地址
//本地环境
const dev = {
ENV: "dev",
VITE_BASE_API: "https://api.dev.dwoodauto.com/mobile/v1",
};
//正式环境
const pro = {
ENV: "pro",
VITE_BASE_API: "https://api.dev.dwoodauto.com",
};
// //测试环境
// const test = {
// ENV: "test",
// VITE_BASE_API: "https://api.dev.dwoodauto.com",
// };
export default {
dev,
// test,
pro,
};

9
utils/public.js Normal file
View File

@ -0,0 +1,9 @@
//登录存储信息
const setLoginData=function(obj){
uni.setStorageSync("demu_mes_user_name",obj.mes_user_name);
uni.setStorageSync("mes_token",obj.mes_token);
}
export default {
setLoginData
};

21
vite.config.js Normal file
View File

@ -0,0 +1,21 @@
import { defineConfig } from "vite";
import uni from "@dcloudio/vite-plugin-uni";
import ENV_CONFIG from "./utils/envConfig.js";
import { resolve } from "path"; // 导入 path 模块,帮助我们解析路径
export default defineConfig(() => {
return {
server: {
port: "3002",
},
resolve: {
alias: {
"@": resolve(__dirname, "/src"),
},
},
plugins: [uni()],
define: {
"process.env.config": ENV_CONFIG, //配置一
'process.env': process.env, //配置二
},
};
});