Jelajahi Sumber

添加图标,底部导航,派工页面

陈龙 4 bulan lalu
induk
melakukan
0bab3e4e77
35 mengubah file dengan 737 tambahan dan 491 penghapusan
  1. 6 152
      src/Auman.PieceWage.UniApp/README.md
  2. 37 2
      src/Auman.PieceWage.UniApp/androidPrivacy.json
  3. 64 30
      src/Auman.PieceWage.UniApp/components/easy-tab-item/easy-tab-item.vue
  4. 5 1
      src/Auman.PieceWage.UniApp/components/easy-tab/easy-tab.vue
  5. 119 0
      src/Auman.PieceWage.UniApp/components/page-dispatch/page-dispatch.vue
  6. 0 82
      src/Auman.PieceWage.UniApp/components/tabs/tabs.vue
  7. 2 2
      src/Auman.PieceWage.UniApp/manifest.json
  8. 38 7
      src/Auman.PieceWage.UniApp/pages.json
  9. 33 0
      src/Auman.PieceWage.UniApp/pages/dispatch/dispatch.vue
  10. 76 188
      src/Auman.PieceWage.UniApp/pages/home/index.vue
  11. 56 25
      src/Auman.PieceWage.UniApp/pages/login/index.vue
  12. 28 0
      src/Auman.PieceWage.UniApp/pages/my/protocol.vue
  13. 19 0
      src/Auman.PieceWage.UniApp/pages/work-order/work-order.vue
  14. 169 0
      src/Auman.PieceWage.UniApp/static/protocol.html
  15. TEMPAT SAMPAH
      src/Auman.PieceWage.UniApp/static/tabbar/calendar-check.png
  16. TEMPAT SAMPAH
      src/Auman.PieceWage.UniApp/static/tabbar/calendar-check_active.png
  17. TEMPAT SAMPAH
      src/Auman.PieceWage.UniApp/static/tabbar/chart-bar.png
  18. TEMPAT SAMPAH
      src/Auman.PieceWage.UniApp/static/tabbar/chart-bar_active.png
  19. TEMPAT SAMPAH
      src/Auman.PieceWage.UniApp/static/tabbar/grid.png
  20. TEMPAT SAMPAH
      src/Auman.PieceWage.UniApp/static/tabbar/grid_active.png
  21. TEMPAT SAMPAH
      src/Auman.PieceWage.UniApp/static/tabbar/house.png
  22. TEMPAT SAMPAH
      src/Auman.PieceWage.UniApp/static/tabbar/house_active.png
  23. TEMPAT SAMPAH
      src/Auman.PieceWage.UniApp/static/tabbar/list-check.png
  24. TEMPAT SAMPAH
      src/Auman.PieceWage.UniApp/static/tabbar/list-check_active.png
  25. TEMPAT SAMPAH
      src/Auman.PieceWage.UniApp/static/tabbar/list.png
  26. TEMPAT SAMPAH
      src/Auman.PieceWage.UniApp/static/tabbar/list_active.png
  27. TEMPAT SAMPAH
      src/Auman.PieceWage.UniApp/static/tabbar/me.png
  28. TEMPAT SAMPAH
      src/Auman.PieceWage.UniApp/static/tabbar/me_active.png
  29. TEMPAT SAMPAH
      src/Auman.PieceWage.UniApp/static/tabbar/tags.png
  30. TEMPAT SAMPAH
      src/Auman.PieceWage.UniApp/static/tabbar/tags_active.png
  31. TEMPAT SAMPAH
      src/Auman.PieceWage.UniApp/static/tabbar/user.png
  32. TEMPAT SAMPAH
      src/Auman.PieceWage.UniApp/static/tabbar/user_active.png
  33. 9 0
      src/Auman.PieceWage.UniApp/styles/color.css
  34. 70 2
      src/Auman.PieceWage.UniApp/styles/main.css
  35. 6 0
      src/Auman.PieceWage.UniApp/utils/user.js

+ 6 - 152
src/Auman.PieceWage.UniApp/README.md

@@ -1,157 +1,11 @@
 # 开发日志
 
-## 1.0.8`2027/11/15`
+## 0.0.2 `2024/12/10`
 
-1. 修复扫码报错是导致页面卡死问题。
-2. 修复【提货单】提交时有条码已出库导致应用数据未更新的问题。
+1. 编写《服务协议和隐私政策》。
+2. 登录页可以查看《服务协议和隐私政策》。
+3. 编写首页。
 
-## 1.0.7`2024/11/8`
+## 0.0.1 `2024/12/10`
 
-1. 扫码报错后必须关掉弹窗才能做下一步操作。
-
-## 1.0.6`2024/11/6`
-
-1. 询问提交订单弹窗显示【取消】按钮。
-
-## 1.0.5`2024/10/31`
-
-1. 调整【提货单】叉数和总数的位置。
-2. 将【提货单】`叉数`改名为`叉板数`,将【提货单】`总数`改名为`叉内数`。
-
-## 1.0.4`2024/10/30`
-
-1. 为所有页面的提示消息添加音效。
-2. 修复【外协送货扫描】提交时用户内码和仓库内码丢失的问题。
-
-## 1.0.3`2024/10/28`
-
-1. 紧急修复音频播放导致界面卡顿的问题。
-
-## 1.0.2`2024/10/25`
-
-1. 【提货单】在保存或提交订单报错时,更新获取到的订单信息,弹窗显示出错二维码。
-2. 新增`voice.js`统一管理音频。
-3. 新增`tone.js`统一管理提示音。
-4. 新增`message.js`统一管理消息,并增加额外操作。
-5. 使用`message.error方法`替换所有报错提示。
-6. 增加报错时错误提示音。
-
-## 1.0.1`2024/10/22`
-
-1. 版本更新时报错,增加状态码的显示。
-2. app更新地址改为`baseUrl + 服务器返回的Url`形式,目的是解决内外网无法同时更新的问题。
-
-## 1.0.0`2024/10/11`
-
-1. 0.5.20 稳定的正式发布版。
-
-## 0.5.20`2024/10/11`
-
-1. 首页改为两列,放大字体。
-2. 优化所有页面,放大字体。
-3. 增加正式环境API地址。
-4. 菜单【定制入库】改为【OEM入库】。
-5. 优化按钮配色,使操作更醒目。
-6. 调整输入框placeholder字体大小为32upx。
-7. 优化【服务器设置】页面体验效果。
-
-## 0.5.19`2024/10/10`
-
-1. 修复【提货单】保存后不能提交的问题。
-2. 优化【提货单】首页体验效果。
-3. 修复【入库扫描】手工提交报错问题。
-4. 修复【外协入库扫描】数据未清除问题。
-5. 修复【外协入库扫描】返回首页时数据未清空问题。
-6. 登录成功时记住账号密码。
-
-## 0.5.18`2024/10/10`
-
-1. 优化【入库检验】扫描结果页面体验效果。
-
-## 0.5.17`2024/10/07`
-
-1. 修复注销登录未清除登录信息问题。
-
-## 0.5.16`2024/10/06`
-
-1. 优化【送货单扫描】页面体体验效果。
-2. 修复【送货单扫描】查找断码报错的问题。
-3. 修复【入库校验】扫码错误问题。
-4. 修复【入库校验】查看页面数据未显示问题。
-5. 修复【入库校验】首次加载扫描结构页面数据未显示问题。
-
-## 0.5.15`2024/9/29`
-
-1. 扫描功能退出到菜单页面的时候清空数据。
-2. 优化【提货单扫描】查看明细页面体验效果。
-3. 测试账号:6000088301,60000149,30000003,30000043,60000160
-4. 账号密码:123456、1
-5. 修复【定制入库】扫码信息未显示的问题。
-6. 优化【定制入库】页面体验效果。
-7. 优化【入库校验】页面体验效果。
-8. 优化【送货单扫描】页面体验效果。
-
-## 0.5.14`2024/9/24`
-
-1. 修复【OEM单总编号多仓位送货单】保存后再提交会报错的问题。
-2. 修复【外协送货扫描】表格内容过多时不会出现滚动条的问题。
-3. 修复【外协送货扫描】提交时的数据格式错误问题。
-
-## 0.5.13`2024/9/14`
-
-1. 【OEM单总编号多仓位送货单】条码数据填写库位名称。
-2. 修复【OEM单总编号多仓位送货单】保存、提交后当前库位信息丢失问题。
-3. 修复【OEM单总编号多仓位送货单】转移仓位错误的问题。
-4. 修复【OEM单总编号多仓位送货单】提交后未清空订单问题。
-
-## 0.5.12`2024/9/14`
-
-1. 修复【OEM单总编号多仓位送货单】表格中没有数据时,清空表格勾选方法报错问题。
-2. 修复【OEM单总编号多仓位送货单】扫码后数量计算不准确的问题。
-3. 在【OEM单总编号多仓位送货单】扫码完后提示【数量已够】。
-4. 【OEM单总编号多仓位送货单】增加无效条码的判断。
-5. 完善【整车】扫码逻辑。
-6. 重写扫码辅助类,修复重复注册扫码事件问题。
-7. 【OEM单总编号多仓位送货单】条码数据填写仓位编码。
-8. 【OEM单总编号多仓位送货单】条码数据填写条码状态。
-
-## 0.5.11`2024/9/9`
-
-1. 修复【OEM单总编号多仓位送货单】表格勾选错误。
-
-## 0.5.10`2024/9/6`
-
-1. 增加按钮样式,扩展了type,新增了primary、secondary、success、danger、warning、info、light、dark。修改了warn样式,统一为warning。
-
-## 0.5.9`2024/9/5`
-
-1. 修复【OEM单总编号多仓位送货单】明细扫码错误。
-
-## 0.5.7`2024/9/5`
-
-1. 优化【OEM单总编号多仓位送货单】表格显示。
-
-## 0.5.6`2024/9/5`
-
-1. 修复版本更新模块,版本检查出错的问题。
-2. 修复OEM单无法扫码获取的问题。
-
-## 0.5.5`2024/9/5`
-
-1. 基本完成【OEM单总编号多仓位送货单】开发。
-
-## 0.5.0`2024/8/16`
-
-1. 开发【OEM单总编号多仓位送货单】。
-2. 开发【整车/分车】扫码。
-
-## 0.4.14`2024/8/15`
-
-1. 更新功能页面返回主页时的提示内容。
-
-## 0.4.13`2024/8/15`
-
-1. 新增 DevLogs.md 日子文件
-2. 修复提货单页面获取 SystemUserId 出错的问题。
-3. 修复外协入库页面获取 SystemUserId 出错的问题。
-4. 优化应用更新体验,取消应用下载完成后的安装提示。
+1. 开发登录页。

+ 37 - 2
src/Auman.PieceWage.UniApp/androidPrivacy.json

@@ -1,3 +1,38 @@
 {
-    "prompt" : "template"
-}
+    "version": "1",
+    "prompt": "template",
+    "title": "服务协议和隐私政策",
+    "message": "  请你务必审慎阅读、充分理解“服务协议”和“隐私政策”各条款,包括但不限于:为了更好的向你提供服务,我们需要收集你的设备标识、操作日志等信息用于分析、优化应用性能。<br/>  你可阅读<a href=\"/static/protocol.html\">《服务协议》</a>和<a href=\"/static/protocol.html\">《隐私政策》</a>了解详细信息。如果你同意,请点击下面按钮开始接受我们的服务。",
+    "buttonAccept": "同意并接受",
+    "buttonRefuse": "暂不同意",
+    "hrefLoader": "system",
+    "backToExit": "false",
+    "second": {
+        "title": "确认提示",
+        "message": "  进入应用前,你需先同意<a href=\"/static/protocol.html\">《服务协议》</a>和<a href=\"/static/protocol.html\">《隐私政策》</a>,否则将退出应用。",
+        "buttonAccept": "同意并继续",
+        "buttonRefuse": "退出应用"
+    },
+    "disagreeMode": {
+        "support": false,
+        "loadNativePlugins": false,
+        "visitorEntry": false,
+        "showAlways": false
+    },
+    "styles": {
+        "backgroundColor": "#00FF00",
+        "borderRadius": "5px",
+        "title": {
+            "color": "#ff00ff"
+        },
+        "buttonAccept": {
+            "color": "#ffff00"
+        },
+        "buttonRefuse": {
+            "color": "#00ffff"
+        },
+        "buttonVisitor": {
+            "color": "#00ffff"
+        }
+    }
+}

+ 64 - 30
src/Auman.PieceWage.UniApp/components/easy-tab-item/easy-tab-item.vue

@@ -1,5 +1,5 @@
 <template>
-    <view :class="'easy-tab-item' + (selected ? ' selected' : '')" @tap="select()">
+    <view :class="`easy-tab-item${selected ? ' selected' : ''}`" @tap="select()">
         <view class="easy-tab-item-content">
             <slot></slot>
         </view>
@@ -43,40 +43,74 @@
 </script>
 
 <style lang="scss">
-    .easy-tab-item {
-        position: relative;
-        display: inline-block;
-        padding-top: 20upx;
-        vertical-align: bottom;
-        
-        .easy-tab-item-content {
+    .easy-tab-type-card {
+        .easy-tab-item {
             position: relative;
-            display: flex;
-            height: 70upx;
-            justify-content: center;
-            align-items: center;
-            color: #666666;
-            background-color: #cccccc;
-            border-width: 1upx 1upx 0 1upx;
-            border-style: solid;
-            border-color: #bbbbbb;
-            border-radius: 15upx 15upx 0 0;
-            padding: 0 20upx;
-            box-shadow: 0 0 16upx rgba(0, 0, 0, 0.1);
+            display: inline-block;
+            padding-top: 20upx;
+            vertical-align: bottom;
+
+            .easy-tab-item-content {
+                position: relative;
+                display: flex;
+                height: 70upx;
+                justify-content: center;
+                align-items: center;
+                color: #666666;
+                background-color: #cccccc;
+                border-width: 1upx 1upx 0 1upx;
+                border-style: solid;
+                border-color: #bbbbbb;
+                border-radius: 15upx 15upx 0 0;
+                padding: 0 20upx;
+                box-shadow: 0 0 16upx rgba(0, 0, 0, 0.1);
+            }
         }
-    }
 
-    .easy-tab-item.selected {
-        padding-top: 0upx;
-        
-        .easy-tab-item-content {
-            height: 80upx;
-            background-color: #ffffff;
-            border: 1upx solid #dfdfdf;
+        .easy-tab-item.selected {
+            padding-top: 0upx;
+
+            .easy-tab-item-content {
+                height: 80upx;
+                background-color: #ffffff;
+                border: 1upx solid #dfdfdf;
+            }
+        }
+
+        .easy-tab-item+.easy-tab-item {
+            margin-left: 10upx;
         }
     }
+    
+    .easy-tab-type-line {
+        .easy-tab-item {
+            position: relative;
+            display: inline-block;
+            vertical-align: bottom;
 
-    .easy-tab-item+.easy-tab-item {
-        margin-left: 10upx;
+            .easy-tab-item-content {
+                position: relative;
+                display: flex;
+                height: 80upx;
+                justify-content: center;
+                align-items: center;
+                color: #666666;
+                border-bottom: 8upx solid transparent;
+                padding: 0 20upx;
+            }
+        }
+
+        .easy-tab-item.selected {
+            padding-top: 0upx;
+
+            .easy-tab-item-content {
+                color: #3775f6;
+                border-color: #3775f6;
+            }
+        }
+
+        .easy-tab-item+.easy-tab-item {
+            margin-left: 10upx;
+        }
     }
 </style>

+ 5 - 1
src/Auman.PieceWage.UniApp/components/easy-tab/easy-tab.vue

@@ -1,5 +1,5 @@
 <template>
-    <view class="easy-tab">
+    <view :class="`easy-tab easy-tab-type-${type}`">
         <slot></slot>
     </view>
 </template>
@@ -11,6 +11,10 @@
             selected: {
                 type: Number,
                 default: 0
+            },
+            type: {
+                type: String,
+                default: 'card'
             }
         },
         data() {

+ 119 - 0
src/Auman.PieceWage.UniApp/components/page-dispatch/page-dispatch.vue

@@ -0,0 +1,119 @@
+<template>
+    <view class="flex direction-column height-100pre width-100per">
+        <uni-search-bar placeholder="单号、型号" style="width: 100%;"></uni-search-bar>
+        <view class="flex padding-lr child-gap">
+            <uni-datetime-picker type="date" placeholder="开始时间"></uni-datetime-picker>
+            <uni-datetime-picker type="date" placeholder="结束时间"></uni-datetime-picker>
+        </view>
+        <view class="grow-1 height-0 scroll padding">
+            <view class="dispatch-row" v-for="(item, index) in list" key="number">
+                <view class="dispatch-row-title">{{item.title}}</view>
+                <view class="dispatch-row-cells child-gap">
+                    <view class="dispatch-row-cell width-40per">{{item.number}}</view>
+                    <view class="dispatch-row-cell grow-1">{{item.spec}}</view>
+                </view>
+            </view>
+        </view>
+    </view>
+</template>
+
+<script>
+    import extend from '../../utils/extend';
+    import request from '../../utils/request';
+    export default {
+        name: "page-dispatch",
+        props: {
+            url: {
+                type: String,
+                default: ''
+            },
+            method: {
+                type: String,
+                default: 'get'
+            }
+        },
+        data() {
+            return {
+                list: [{
+                    title: '劳伦斯',
+                    number: 'C25412555',
+                    spec: '左扶1+右扶1+脚踏'
+                }, {
+                    title: '劳伦斯ds',
+                    number: 'C254125ert',
+                    spec: '左扶1+右扶1+脚踏'
+                }, {
+                    title: '劳ddsds',
+                    number: 'CD212244',
+                    spec: '左扶1+右扶1+脚踏'
+                }, {
+                    title: '劳gs',
+                    number: 'CD21552244',
+                    spec: '左扶1+右扶1+脚踏'
+                }, {
+                    title: '劳bdf',
+                    number: 'CS21552244',
+                    spec: '左扶1+右扶1+脚踏'
+                }, {
+                    title: 'hhhbdf',
+                    number: 'GCS21552244',
+                    spec: '左扶1+右扶1+脚踏'
+                }, {
+                    title: 'hhdggbdf',
+                    number: 'GC232244',
+                    spec: '左扶1+右扶1+脚踏'
+                }, {
+                    title: 'haadggbdf',
+                    number: 'GV3224de4',
+                    spec: '左扶1+右扶1+脚踏'
+                }]
+            };
+        },
+        created(){
+            this.load();
+        },
+        methods: {
+            async load(){
+                if (extend.isEmptyString(this.url)) {
+                    return;
+                }
+                uni.showLoading();
+                let res = await request.sendToken({
+                    url: this.url,
+                    method: this.method
+                });
+                uni.hideLoading();
+                console.log(res);
+                if (res.success) {} else {
+                    uni.showModal({
+                        title: '错误',
+                        content: res.message
+                    });
+                }
+            }
+        }
+    }
+</script>
+
+<style lang="scss">
+    .dispatch-row {
+        position: relative;
+        padding: 10upx 0;
+        
+        .dispatch-row-title {
+            font-size: 32upx;
+            padding: 10upx 0;
+        }
+        
+        .dispatch-row-cells {
+            position: relative;
+            display: flex;
+            font-size: 24upx;
+            color: #666666;
+        }
+        
+        .dispatch-row-cell {
+            flex-shrink: 0;
+        }
+    }
+</style>

+ 0 - 82
src/Auman.PieceWage.UniApp/components/tabs/tabs.vue

@@ -1,82 +0,0 @@
-<template>
-    <view class="tabs">
-        <view :class="'tabs-item' + (selectedIndex === index ? ' selected' : '')" v-for="(item, index) in list" @tap="tapItem(item[idField])" :style="'z-index:' + (selectedIndex === index ? 100 : 100 - index)">{{item[textField]}}</view>
-    </view>
-</template>
-
-<script>
-    export default {
-        props: {
-            list: {
-                type: Array,
-                default: []
-            },
-            idField: {
-                type: String,
-                default: 'id'
-            },
-            textField: {
-                type: String,
-                default: 'text'
-            },
-            selected: {
-                type: Number,
-                default: 0
-            }
-        },
-        data(){
-            return{
-                selectedIndex: 0
-            }
-        },
-        mounted() {
-            this.selectedIndex = this.selected;
-        },
-        methods:{
-            tapItem(id){
-                for(var i = 0; i < this.list.length; i++) {
-                    if (this.list[i][this.idField] === id) {
-                        this.selectedIndex = i;
-                        this.$emit('change', this.list[i]);
-                        break;
-                    }
-                }
-            }
-        }
-    }
-</script>
-
-<style lang="scss">
-    .tabs {
-        position: relative;
-        display: flex;
-        justify-content: flex-start;
-        z-index: 10;
-        align-items: flex-end;
-    }
-
-    .tabs-item {
-        position: relative;
-        display: flex;
-        height: 70upx;
-        justify-content: center;
-        align-items: center;
-        background-color: #cccccc;
-        border-width: 1upx 1upx 0 1upx;
-        border-style: solid;
-        border-color: #bbbbbb;
-        border-radius: 15upx 15upx 0 0;
-        padding: 0 20upx;
-        margin-left: -10upx;
-    }
-
-    .tabs-item.selected {
-        height: 80upx;
-        background-color: #ffffff;
-        border: 1upx solid #dfdfdf;
-    }
-
-    .tabs-item:first-child {
-        margin-left: 10upx;
-    }
-</style>

+ 2 - 2
src/Auman.PieceWage.UniApp/manifest.json

@@ -2,8 +2,8 @@
     "name" : "生产流程管理",
     "appid" : "__UNI__930B119",
     "description" : "生产流程管理",
-    "versionName" : "0.0.1",
-    "versionCode" : 1,
+    "versionName" : "0.0.3",
+    "versionCode" : 3,
     "transformPx" : false,
     /* 5+App特有相关 */
     "app-plus" : {

+ 38 - 7
src/Auman.PieceWage.UniApp/pages.json

@@ -3,7 +3,7 @@
         {
             "path": "pages/home/index",
             "style": {
-                "navigationBarTitleText": "装车扫描"
+                "navigationStyle": "custom"
             }
         }, 
         {
@@ -25,6 +25,27 @@
                 "navigationBarTitleText": "服务器设置",
                 "enablePullDownRefresh": false
             }
+        },
+        {
+            "path" : "pages/my/protocol",
+            "style" : 
+            {
+                "navigationBarTitleText" : "服务协议和隐私政策"
+            }
+        },
+        {
+            "path" : "pages/dispatch/dispatch",
+            "style" : 
+            {
+                "navigationBarTitleText" : "派工"
+            }
+        },
+        {
+            "path" : "pages/work-order/work-order",
+            "style" : 
+            {
+                "navigationBarTitleText" : "报工"
+            }
         }
     ],
     "globalStyle": {
@@ -37,17 +58,27 @@
     "tabBar": {
         "color": "#666666",
         "selectedColor": "#2185d0",
-        "fontSize": "11px",
+        "fontSize": "10px",
         "list": [{
             "pagePath": "pages/home/index",
             "text": "首页",
-            "iconPath": "static/icons/home.png",
-            "selectedIconPath": "static/icons/home-selected.png"
+            "iconPath": "static/tabbar/house.png",
+            "selectedIconPath": "static/tabbar/house_active.png"
+        }, {
+            "pagePath": "pages/dispatch/dispatch",
+            "text": "派工",
+            "iconPath": "static/tabbar/chart-bar.png",
+            "selectedIconPath": "static/tabbar/chart-bar_active.png"
+        }, {
+            "pagePath": "pages/work-order/work-order",
+            "text": "报工",
+            "iconPath": "static/tabbar/calendar-check.png",
+            "selectedIconPath": "static/tabbar/calendar-check_active.png"
         }, {
             "pagePath": "pages/my/index",
-            "text": "我的",
-            "iconPath": "static/icons/my.png",
-            "selectedIconPath": "static/icons/my-selected.png"
+            "text": "我",
+            "iconPath": "static/tabbar/user.png",
+            "selectedIconPath": "static/tabbar/user_active.png"
         }]
     }
 }

+ 33 - 0
src/Auman.PieceWage.UniApp/pages/dispatch/dispatch.vue

@@ -0,0 +1,33 @@
+<template>
+    <view class="flex direction-column height-100pre">
+        <easy-tab type="line" @change="onTabChange">
+            <easy-tab-item>开料</easy-tab-item>
+            <easy-tab-item>断料</easy-tab-item>
+            <easy-tab-item>钉架子</easy-tab-item>
+            <easy-tab-item>打底</easy-tab-item>
+        </easy-tab>
+        <view class="flex grow-1 height-0 width-100per">
+            <page-dispatch :url="url" :method="method"></page-dispatch>
+        </view>
+    </view>
+</template>
+
+<script>
+    export default {
+        data() {
+            return {
+                url: 'dispatch/search',
+                method: 'get'
+            };
+        },
+        methods: {
+            onTabChange(e){
+                console.log(e);
+            }
+        }
+    }
+</script>
+
+<style lang="scss">
+
+</style>

+ 76 - 188
src/Auman.PieceWage.UniApp/pages/home/index.vue

@@ -1,30 +1,40 @@
 <template>
     <view class="flex direction-column height-100pre">
-        <view class="scroll">
-            <view class="scroll-layout" v-if="isLogin">
-                <view class="scroll-item" v-for="item in list">
-                    <view class="scroll-item-box" @tap="openPage(item.path)">{{item.name}}</view>
+        <view class="status-bar-height"></view>
+        <view class="image-view"></view>
+        <view class="flex justify-bewteen padding">
+            <view class="appicon">
+                <view class="appicon-icon">
+                    <uni-icons type="hand-up-filled" size="30" color="royalblue"></uni-icons>
                 </view>
+                <view class="appicon-text">确认派工</view>
             </view>
-            <uni-card v-else>
-                <navigator url="/pages/login/index?type=switchTab&page=/pages/home/index">没有登录</navigator>
-            </uni-card>
-            <uni-popup ref="newVerPopup" type="center" :is-mask-click="false">
-                <view class="new-version">
-                    <view class="new-version-title">
-                        <text>发现新版本</text>
-                        <text class="new-version-title-version">V{{appWgtVersion}}</text>
-                    </view>
-                    <view class="new-version-progress">
-                        <view class="new-version-progress-bar">
-                            <view class="new-version-progress-bar-text">{{updateProcess / 100}}%</view>
-                            <view class="new-version-progress-bar-current" :style="'width:' + updateProcess / 100">
-                            </view>
-                        </view>
-                    </view>
+            <view class="appicon">
+                <view class="appicon-icon">
+                    <uni-icons type="calendar-filled" size="30" color="royalblue"></uni-icons>
                 </view>
-            </uni-popup>
+                <view class="appicon-text">完成派工</view>
+            </view>
+            <view class="appicon">
+                <view class="appicon-icon">
+                    <uni-icons type="settings-filled" size="30" color="royalblue"></uni-icons>
+                </view>
+                <view class="appicon-text">特殊派工</view>
+            </view>
+            <view class="appicon">
+                <view class="appicon-icon">
+                    <uni-icons type="wallet-filled" size="30" color="royalblue"></uni-icons>
+                </view>
+                <view class="appicon-text">工资明细</view>
+            </view>
+        </view>
+        <view class="title">未完成清单</view>
+        <view class="list-view">
+            <view class="list-view-item">dddsdf</view>
+            <view class="list-view-item">eeesd</view>
+            <view class="list-view-item">rrrrd</view>
         </view>
+        <view class="height-20"></view>
     </view>
 </template>
 
@@ -35,41 +45,6 @@
     import appUpdate from '../../utils/appUpdate.js';
     import request from '../../utils/request.js';
 
-    /**
-     * 菜单列表
-     */
-    const menus = [{
-        roleId: 60,
-        name: '送货单',
-        path: '/pages/completionOrder/index'
-    }, {
-        roleId: 61,
-        name: '入库校验',
-        path: '/pages/receiptOrder/index'
-    }, {
-        roleId: 61,
-        name: '提货扫描',
-        path: '/pages/pickupOrder/index',
-    }, {
-        roleId: 61,
-        name: '外协入库',
-        path: '/pages/outsourcedDelivery/index'
-    }, {
-        roleId: 61,
-        name: 'OEM入库',
-        path: '/pages/outsourceCustomizeDeliveryOrder/index'
-    }, {
-        roleId: 88,
-        name: '定制多仓位入库',
-        path: '/pages/multiCustomizeDeliveryOrder/index'
-    }, {
-        roleId: 90,
-        name: '整车/分车',
-        path: '/pages/shipPlan/index'
-    }];
-
-    let userinfo = null;
-
     export default {
         data() {
             return {
@@ -82,27 +57,8 @@
             }
         },
         async onShow() {
-            if (token.has()) {
-                this.isLogin = true;
-                userinfo = user.get();
-                this.list = await this.getList();
-            } else {
-                let res = await token.getByServer();
-                if (res.success) {
-                    this.isLogin = true;
-                    userinfo = user.get();
-                    this.list = await this.getList();
-                } else {
-                    token.clear();
-                    this.isLogin = false;
-                    userinfo = null;
-                    this.list = [];
-                }
-            }
-            let _this = this;
-
             // #ifdef APP
-            
+
             let baseUrl = await request.getBaseUrl();
             // console.log('baseUrl', baseUrl);
 
@@ -110,7 +66,7 @@
             let updateRes = await appUpdate.check('api/PDAScan/GetVersion?name=PDA');
             this.isNew = updateRes.isNew;
             this.appWgtVersion = updateRes.appWgtVersion;
-            
+
             let url = baseUrl + updateRes.url;
             // console.log(updateRes);
             // console.log('url:', url);
@@ -151,131 +107,63 @@
 
             // #endif
         },
-        methods: {
-            async scan() {
-                await uni.scanCode({
-                    success: (res) => {
-                        console.log(res);
-                        this.msg = res.result;
-                    }
-                });
-            },
-
-            async getList() {
-                let list = [];
-                if (extend.isObject(userinfo) && extend.isArray(userinfo.RoleIds)) {
-                    for (let i in menus) {
-                        if (extend.isNull(menus[i].roleId) || menus[i].roleId < 0) {
-                            list.push(menus[i]);
-                            continue;
-                        }
-                        for (let j in userinfo.RoleIds) {
-                            if (userinfo.RoleIds[j] === menus[i].roleId) {
-                                list.push(menus[i]);
-                                break;
-                            }
-                        }
-                    }
-                }
-                return list;
-            },
-
-            openPage(url) {
-                uni.navigateTo({
-                    url: url
-                });
-            }
-        }
+        methods: {}
     }
 </script>
 
 <style lang="scss">
-    .scroll {
+    .image-view {
         position: relative;
-        padding: 20upx;
-        flex-grow: 1;
+        height: 360upx;
+        background-color: #f8f8f8;
+    }
 
-        .scroll-layout {
-            position: relative;
-            display: flex;
-            overflow: auto;
-            flex-wrap: wrap;
+    .appicon {
+        padding: 20upx 0;
+        width: 25%;
 
-            .scroll-item {
-                position: relative;
-                display: flex;
-                width: 50%;
-                height: 280upx;
-                padding: 20upx;
-                box-sizing: border-box;
+        .appicon-icon {
+            display: flex;
+            justify-content: center;
+            align-items: center;
+            height: 100upx;
+        }
 
-                .scroll-item-box {
-                    position: relative;
-                    display: flex;
-                    width: 100%;
-                    height: 100%;
-                    border: 4upx solid #00557f;
-                    align-items: center;
-                    justify-content: center;
-                    border-radius: 50upx 0 50upx 0;
-                    padding: 10upx;
-                    color: #00557f;
-                    box-sizing: border-box;
-                    box-shadow: 0 0 20upx rgba(0, 85, 127, 0.5);
-                    overflow: hidden;
-                    font-size: 2em;
-                }
-            }
+        .appicon-text {
+            display: flex;
+            justify-content: center;
         }
     }
 
-    .new-version {
-        position: relative;
+    .title {
         display: flex;
-        flex-direction: column;
-        width: 500upx;
-        height: 400upx;
-        background-color: #ffffff;
-
-        .new-version-title {
-            position: relative;
-            height: 40upx;
-            font-size: 40upx;
-            text-align: center;
-
-            .new-version-title-version {
-                position: absolute;
-                font-size: 20upx;
-                padding: 6upx;
-                background-color: #00557f;
-                border-radius: 6upx;
-            }
-        }
-
-        .new-version-progress {
-            position: relative;
-
-            .new-version-progress-bar {
-                position: relative;
-                width: 100%;
-                height: 20upx;
-                border-radius: 6upx;
-                overflow: hidden;
+        padding: 20upx;
+        color: royalblue;
+        margin: 0 20upx;
+        align-items: center;
+        background-color: #f8f8f8;
+    }
 
-                .new-version-progress-bar-text,
-                .new-version-progress-bar-current {
-                    position: absolute;
-                    top: 0;
-                    left: 0;
-                    height: 100%;
-                }
+    .title::before {
+        display: inline-block;
+        content: '';
+        width: 16upx;
+        height: 100%;
+        background-color: royalblue;
+        margin-right: 10upx;
+    }
 
-                .new-version-progress-bar-text {
-                    width: 100%;
-                    text-align: center;
-                    color: #666666;
-                }
-            }
+    .list-view {
+        position: relative;
+        flex-grow: 1;
+        background-color: #f8f8f8;
+        margin: 0 20upx;
+        overflow-x: hidden;
+        overflow-y: auto;
+        
+        .list-view-item {
+            display: flex;
+            padding: 20upx;
         }
     }
 </style>

+ 56 - 25
src/Auman.PieceWage.UniApp/pages/login/index.vue

@@ -1,21 +1,24 @@
 <template>
-    <view class="flex direction-column">
+    <view class="flex direction-column height-100pre justify-bewteen bg-lightblue-to-white">
         <view class="status-bar-height"></view>
-        <view class="flex direction-column gap grow-1">
-            <uni-nav-bar fixed="true" title="登录" backgroundColor="#f8f8f8" :border="false" leftIcon="left"
-                rightIcon="gear" @clickRight="openSetting" @clickLeft="back"></uni-nav-bar>
+        <view class="flex direction-column grow-1">
             <view class="title padding-top">
-                <view class="title-name">双虎物流平台智能客户端</view>
+                <view class="title-name">生产流程管理</view>
             </view>
-            <view class="flex direction-column padding">
-                <uni-easyinput class="padding-top" placeholder="账号" v-model="username"></uni-easyinput>
-                <uni-easyinput class="padding-top" placeholder="密码" v-model="password" type="password"
-                    @confirm="login"></uni-easyinput>
-                <view class="flex padding-top">
-                    <button type="primary" class="grow-1" @tap="login">登录</button>
+            <view class="flex direction-column padding child-gap-40">
+                <uni-easyinput placeholder="输入账号" v-model="username"></uni-easyinput>
+                <uni-easyinput placeholder="输入密码" v-model="password" type="password" @confirm="login"></uni-easyinput>
+                <view class="flex padding-top-40">
+                    <button type="lightblue" border="round" class="grow-1" @tap="login">登录</button>
                 </view>
             </view>
         </view>
+        <div class="xieyi" @tap="openProtocol()">
+            <text>登录表示您同意</text>
+            <text>《用户协议》</text>
+            <text>和</text>
+            <text>《隐私政策》</text>
+        </div>
     </view>
 </template>
 
@@ -24,6 +27,7 @@
     import request from '../../utils/request.js';
     import token from '../../utils/token.js';
     import user from '../../utils/user.js';
+    import url from '../../utils/url.js';
 
     export default {
         data() {
@@ -74,7 +78,7 @@
                     mask: true,
                 });
                 let res = await token.getByServer({
-                    url: '/oauth2/token',
+                    url: 'oauth2/token',
                     data: data
                 });
                 uni.hideLoading();
@@ -86,19 +90,24 @@
                     });
 
                     let userRes = await user.getByServer({
-                        url: '/auman/user/info'
+                        url: 'auman/user/info'
                     });
-                    console.log(userRes);
+
                     if (userRes.success) {
-                        user.set(userRes.data.data);
+                        let url = extend.isNonEmptyString(this.prevPage) ? this.prevPage : '/pages/home/index';
+                        uni.switchTab({
+                            url: url
+                        });
+                    } else {
+                        uni.showModal({
+                            title: '错误',
+                            content: res.message,
+                            mask: true
+                        });
                     }
-                    let url = extend.isNonEmptyString(this.prevPage) ? this.prevPage : '/pages/home/index';
-                    uni.switchTab({
-                        url: url
-                    });
                 } else {
                     uni.showModal({
-                        title: '提示',
+                        title: '错误',
                         content: res.message,
                         mask: true
                     });
@@ -117,19 +126,41 @@
                         uni.navigateBack();
                         break;
                 }
+            },
+
+            openProtocol() {
+                uni.navigateTo({
+                    url: '/pages/my/protocol'
+                });
             }
         }
     }
 </script>
 
 <style lang="scss">
+    .page-bg {
+        background-color: #f8f8f8;
+    }
+
     .title {
+        display: flex;
+        height: 400upx;
+        justify-content: center;
+        align-items: center;
+
         .title-name {
-            display: flex;
-            justify-content: center;
-            align-items: center;
-            font-size: 36upx;
-            height: 120upx;
+            font-size: 60upx;
+            font-weight: bold;
         }
     }
+
+    .xieyi {
+        position: relative;
+        display: flex;
+        justify-content: center;
+        align-items: center;
+        color: #888888;
+        height: 60upx;
+        padding-bottom: 30upx;
+    }
 </style>

+ 28 - 0
src/Auman.PieceWage.UniApp/pages/my/protocol.vue

@@ -0,0 +1,28 @@
+<template>
+    <view class="height-100pre">
+        <web-view :src="protocolUrl"></web-view>
+    </view>
+</template>
+
+<script>
+    import extend from '../../utils/extend';
+    
+    export default {
+        data() {
+            return {
+                protocolUrl: ''
+            };
+        },
+        onLoad(opt) {
+            if (extend.isUrl(opt.url)) {
+                this.protocolUrl = opt.url;
+            } else {
+                this.protocolUrl = '/static/protocol.html';
+            }
+        }
+    }
+</script>
+
+<style lang="scss">
+
+</style>

+ 19 - 0
src/Auman.PieceWage.UniApp/pages/work-order/work-order.vue

@@ -0,0 +1,19 @@
+<template>
+    <view>
+        
+    </view>
+</template>
+
+<script>
+    export default {
+        data() {
+            return {
+                
+            };
+        }
+    }
+</script>
+
+<style lang="scss">
+
+</style>

+ 169 - 0
src/Auman.PieceWage.UniApp/static/protocol.html

@@ -0,0 +1,169 @@
+<!DOCTYPE html>
+<html lang="zh-cn">
+    <head>
+        <title>服务协议和隐私政策</title>
+        <style>
+            p {
+                text-indent: 32px;
+            }
+        </style>
+    </head>
+    <body>
+        <h1>服务协议和隐私政策</h1>
+        <p>本政策仅适用于{公司名}的《生产流程管理》产品或服务。</p>
+        <p>最近更新日期:2024年12月10日</p>
+        <b>本政策将帮助您了解以下内容:</b>
+        <p>一、我们如何收集和使用您的用户信息</p>
+        <p>二、我们如何使用 Cookie 和同类技术</p>
+        <p>三、我们如何共享、转让、公开披露您的用户信息</p>
+        <p>四、我们如何保护您的用户信息</p>
+        <p>五、您的权利</p>
+        <p>六、我们如何处理儿童的个人信息</p>
+        <p>七、您的用户信息如何储存及如何在全球范围转移</p>
+        <p>八、本政策如何更新</p>
+        <p>九、如何联系我们</p>
+        <p>我们深知用户信息对您的重要性,并会尽全力保护您的用户信息安全可靠。我们致力于维持您对我们的信任,恪守以下原则,保护您的用户信息:权责一致原则、目的明确原则、选择同意原则、最少够用原则、确保安全原则、主体参与原则、公开透明原则等。同时,我们承诺,我们将按业界成熟的安全标准,采取相应的安全保护措施来保护您的用户信息。
+        </p>
+        <p>请在使用我们的产品(或服务)前,仔细阅读并了解本隐私政策。</p>
+        <h2>一、我们如何收集和使用您的用户信息</h2>
+        <h3>(一)您使用我司产品或服务过程中我们收集和使用的信息</h3>
+        <p>
+            我们仅会出于本政策所述的业务功能,收集和使用您的用户信息,收集用户信息的目的在于向您提供产品或服务,您有权自行选择是否提供该信息,但多数情况下,如果您不提供,我们可能无法向您提供相应的服务,也无法回应您遇到的问题:
+        </p>
+        <p>在您使用我们的服务时,允许我们收集您自行向我们提供的或为向您提供服务所必要的信息包括:网络日志、设备信息、位置信息和其它相关信息等。
+            对于我们收集的用户信息,我们将用于为您提供身份验证、安全防范、反诈骗监测、存档备份、客户的安全服务等用途。</p>
+        <p>您提供的上述信息,将在您使用本服务期间持续授权我们使用。在您停止使用推送服务时,我们将停止使用并删除上述信息。</p>
+        <p>我们保证会依法对收集后的用户信息进行去标识化或匿名化处理,对于无法单独或者与其他信息结合识别自然人个人身份的信息,不属于法律意义上的个人信息。如果我们将非个人信息与其他信息结合识别到您的个人身份时,或者与您的个人信息结合使用时,我们会在结合使用期间,将此类信息作为您的个人信息按照本隐私政策对其进行处理和保护。
+        </p>
+        <p>为了更好运营和改善我们的技术和服务,或出于商业策略的变化,当我们提供的产品或服务所需的用户信息收集、使用、处理超出上述范围或者要将收集到的用户信息用于本隐私政策未载明的其他用途,或当我们要将基于特定目的收集而来的信息用于其他目的时,我们会在获取用户信息后的合理期限内或处理用户信息前通知您,并获得您的授权同意。
+        </p>
+        <h3>(二)征得授权同意的例外</h3>
+        <b>请您理解,根据法律法规及相关国家标准,以下情形中,我们收集和使用您的用户信息无需征得您的授权同意:</b>
+        <p>1、与国家安全、国防安全直接相关的;</p>
+        <p>2、与公共安全、公共卫生、重大公共利益直接相关的;</p>
+        <p>3、与犯罪侦查、起诉、审判和判决执行等直接相关的;</p>
+        <p>4、出于维护您或其他个人的生命、财产等重大合法权益但又很难得到本人同意的;</p>
+        <p>5、所收集的您的用户信息是您自行向社会公众公开的;</p>
+        <p>6、从合法公开披露的信息中收集的您的用户信息,如合法的新闻报道、政府信息公开等渠道;</p>
+        <p>7、根据您的要求签订或履行合同所必需的;</p>
+        <p>8、用于维护软件及相关服务的安全稳定运行所必需的,例如发现、处置软件及相关服务的故障;</p>
+        <p>9、 个人信息控制者为新闻单位且其在开展合法的新闻报道所必需的;</p>
+        <p>10、学术研究机构基于公共利益开展统计或学术研究所必要,且对外提供学术研究或描述的结果时,对结果中所包含的个人信息进行去标识化处理的。</p>
+        <p>11、法律法规规定的其他情形。</p>
+        <h2>二、我们如何使用 Cookie 和同类技术</h2>
+        <h3>(一)Cookie</h3>
+        <p>为确保网站正常运转,我们会在您的计算机或移动设备上存储名为 Cookie 的小数据文件。Cookie 通常包含标识符、站点名称以及一些号码和字符。借助于 Cookie,网站能够存储您的访问偏好数据。</p>
+        <p>我们不会将 Cookie 用于本政策所述目的之外的任何用途。您可根据自己的偏好管理或删除 Cookie。您可以清除计算机上保存的所有 Cookie,大部分网络浏览器都设有阻止Cookie
+            的功能。但如果您这么做,则需要在每一次访问我们的网站时亲自更改用户设置。</p>
+        <h3>(二)网站信标和像素标签</h3>
+        <p>除 Cookie 外,我们还会在网站上使用网站信标和像素标签等其他同类技术。例如,我们向您发送的电子邮件可能含有链接至我们网站内容的点击URL。</p>
+        <p>如果您点击该链接,我们则会跟踪此次点击,帮助我们了解您的产品或服务偏好并改善客户服务。网站信标通常是一种嵌入到网站或电子邮件中的透明图像。借助于电子邮件中的像素标签,我们能够获知电子邮件是否被打开。如果您不希望自己的活动以这种方式被追踪,则可以随时从我们的寄信名单中退订。
+        </p>
+        <h3>(三)Do Not Track(请勿追踪)</h3>
+        <p>很多网络浏览器均设有Do Not Track功能,该功能可向网站发布Do Not Track请求。目前,主要互联网标准组织尚未设立相关政策来规定网站应如何应对此类请求。但如果您的浏览器启用了 Do Not
+            Track,那么我们的所有网站都会尊重您的选择。</p>
+        <h2>三、我们如何共享、转让、公开披露您的用户信息</h2>
+        <h3>(一)共享</h3>
+        <p>我们不会与其他的任何公司、组织和个人分享您的用户信息,但以下情况除外:</p>
+        <p>1、在获取明确同意的情况下共享:获得您的明确同意后,我们会与其他方共享您的用户信息。</p>
+        <p>2、我们可能会根据法律法规规定,或按政府主管部门的强制性要求,对外共享您的用户信息。</p>
+        <p>3、与我们的关联公司共享:您的用户信息可能会与我们的关联公司共享。我们只会共享必要的用户信息,且受本隐私政策中所声明目的的约束。关联公司如要改变用户信息的处理目的,将再次征求您的授权同意。</p>
+        <p>4、与授权合作伙伴共享:仅为实现本政策中声明的目的,我们的某些服务将由授权合作伙伴提供。我们可能会与合作伙伴共享您的某些用户信息,以提供更好的客户服务和用户体验。我们仅会出于合法、正当、必要、特定、明确的目的共享您的用户信息,并且只会共享提供服务所必要的用户信息。为了更好运营和改善技术和服务,您同意我们和授权合作伙伴在符合相关法律法规的前提下可将收集的信息用于其他服务和用途。
+        </p>
+        <b>以下列举了具体的授权合作伙伴,并提供了该第三方的隐私政策链接,我们建议您阅读该第三方的隐私政策:</b>
+        <p>(1)消息推送服务供应商:由每日互动股份有限公司提供推送技术服务,我们可能会将您的设备平台、设备厂商及品牌、设备型号及系统版本、设备识别码、设备序列号等设备信息,应用列表信息、网络信息以及位置相关信息提供给每日互动股份有限公司,用于为您提供推送技术服务。我们在向您推送消息时,我们可能会授权每日互动股份有限公司进行链路调节,相互促活被关闭的SDK推送进程,保障您可以及时接收到我们向您推送的消息。详细内容请访问《个推用户隐私政策》。
+        </p>
+        <p>(2)广告、媒体:我们可能会将收集到的信息共享给广告、媒体以及我们的其他授权合作伙伴,用于包括优化广告投放和提升营销效果等商业化用途。</p>
+        <p>对我们与之共享用户信息的公司、组织和个人,我们会与其签署严格的保密协定,要求他们按照我们的说明、本隐私政策以及其他任何相关的保密和安全措施来处理用户信息。</p>
+        <h3>(二)转让</h3>
+        <b>我们不会将您的用户信息转让给任何公司、组织和个人,但以下情况除外:</b>
+        <p>1、在获取明确同意的情况下转让:获得您的明确同意后,我们会向其他方转让您的用户信息;</p>
+        <p>2、在涉及合并、收购或破产清算时,如涉及到用户信息转让,我们会再要求新的持有您用户信息的公司、组织继续受此隐私政策的约束,否则我们将要求该公司、组织重新向您征求授权同意。</p>
+        <h3>(三)公开披露</h3>
+        <b>我们仅会在以下情况下,公开披露您的用户信息:</b>
+        <p>1、获得您明确同意后;</p>
+        <p>2、基于法律的披露:在法律、法律程序、诉讼或政府主管部门强制性要求的情况下,我们可能会公开披露您的用户信息。</p>
+        <h3>(四)共享、转让、公开披露信息时事先征得授权同意的例外</h3>
+        <b>请您理解,根据法律法规及相关国家标准,以下情形中,我们共享、转让、公开披露您的用户信息无需征得您的授权同意:</b>
+        <p>1、与国家安全、国防安全直接相关的;</p>
+        <p>2、与公共安全、公共卫生、重大公共利益直接相关的;</p>
+        <p>3、与犯罪侦查、起诉、审判和判决执行等直接相关的;</p>
+        <p>4、出于维护您或其他个人的生命、财产等重大合法权益但又很难得到本人同意的;</p>
+        <p>5、您自行向社会公众公开的信息; </p>
+        <p>6、从合法公开披露的信息中收集的,如合法的新闻报道、政府信息公开等渠道。</p>
+        <h2>四、我们如何保护您的用户信息</h2>
+        <p>(一)我们已使用符合业界标准的安全防护措施保护您提供的用户信息,防止数据遭到未经授权的访问、公开披露、使用、修改、损坏或丢失。我们会采取一切合理可行的措施,保护您的用户信息。例如,在您的浏览器与“服务”之间交换数据时受 SSL 加密保护;我们同时对网站提供https安全浏览方式;我们会使用加密技术确保数据的保密性;我们会使用受信赖的保护机制防止数据遭到恶意攻击;我们会部署访问控制机制,确保只有授权人员才可访问用户信息;以及我们会举办安全和隐私保护培训课程,加强员工对于保护用户信息重要性的认识。</p>
+        <p>(二)我们已经取得了以下认证:{公司获取的相关认证内容}。</p>
+        <p>(三)我们的数据安全能力:{公司的数据安全能力描述}。</p>
+        <p>(四)我们会采取一切合理可行的措施,确保未收集无关的用户信息。我们只会在达成本政策所述目的所需的期限内保留您的用户信息,除非需要延长保留期或受到法律的允许。</p>
+        <p>(五)互联网并非绝对安全的环境,而且电子邮件、即时通讯、及与其他用户的交流方式并未加密,我们强烈建议您不要通过此类方式发送用户信息。</p>
+        <p>(六)我们将定期更新并公开安全风险、用户信息安全影响评估等报告的有关内容。您可通过以下方式获得:补充安全风险公开途径</p>
+        <p>(七)互联网环境并非百分之百安全,我们将尽力确保您发送给我们的任何信息的安全性。即使我们做出了很大努力,采取了一切合理且必要的措施,仍然有可能无法杜绝您的用户信息被非法访问、被非法盗取,被非法篡改或毁坏,导致您的合法权益受损,请您理解信息网络的上述风险并自愿承担。</p>
+        <p>(八)在不幸发生用户信息安全事件后,我们将按照法律法规的要求,及时向您告知:安全事件的基本情况和可能的影响、我们已采取或将要采取的处置措施、您可自主防范和降低风险的建议、对您的补救措施等。我们将及时将事件相关情况以邮件、信函、电话、推送通知等方式告知您,难以逐一告知用户信息主体时,我们会采取合理、有效的方式发布公告。同时,我们还将按照监管部门要求,主动上报用户信息安全事件的处置情况。</p>
+        <h2>五、您的权利</h2>
+        <b>按照中国相关的法律、法规、标准,以及其他国家、地区的通行做法,我们保障您对自己的用户信息行使以下权利:</b>
+        <h3>(一)访问您的用户信息</h3>
+        <p>您有权访问您的用户信息,法律法规规定的例外情况除外。如果您想行使数据访问权,可以通过以下方式自行访问:补充用户信息访问方式</p>
+        <p>如果您无法通过上述链接访问这些用户信息,您可以随时使用我们的 Web 表单联系,或发送电子邮件至{公司邮箱}。我们将在30天内回复您的访问请求。</p>
+        <p>对于您在使用我们的产品或服务过程中产生的其他用户信息,只要我们不需要过多投入,我们会向您提供。如果您想行使数据访问权,请发送电子邮件至{公司邮箱}。</p>
+        <h3>(二)更正您的用户信息</h3>
+        <p>当您发现我们处理的关于您的用户信息有错误时,您有权要求我们作出更正。您可以通过“(一)访问您的用户信息”中罗列的方式提出更正申请。 如果您无法通过上述链接更正这些用户信息,您可以随时使用我们的 Web 表单联系,或发送电子邮件至{公司邮箱}。我们将在30天内回复您的更正请求。</p>
+        <h3>(三)删除您的用户信息</h3>
+        <b>在以下情形中,您可以向我们提出删除用户信息的请求:</b>
+        <p>1、如果我们处理用户信息的行为违反法律法规;</p>
+        <p>2、如果我们收集、使用您的用户信息,却未征得您的同意;</p>
+        <p>3、如果我们处理用户信息的行为违反了与您的约定;</p>
+        <p>4、如果您不再使用我们的产品或服务,或您注销了账号;</p>
+        <p>5、如果我们不再为您提供产品或服务。</p>
+        <p>我们将会根据您的删除请求进行评估,若满足相应规定,我们将会采取相应步骤进行处理。当您向我们提出删除请求时,我们可能会要求您进行身份验证,以保障账户的安全。当您从我们的服务中删除信息后,因为适用的法律和安全技术,我们可能不会立即从备份系统中删除相应的信息,我们将安全存储您的信息直到备份可以清除或实现匿名化。</p>
+        <h3>(四)改变您授权同意的范围</h3>
+        <p>每个业务功能需要一些基本的用户信息才能得以完成(见本政策“第一部分”)。对于用户信息的收集和使用,您可以随时给予或收回您的授权同意。您可以通过以下方式自行操作:补充改变用户信息的访问方式</p>
+        <p>当您收回同意后,我们将不再处理相应的用户信息。同时也请您注意,您撤销授权同意可能会导致某些后果,例如我们可能无法继续为您提供相应的服务或特定的功能,但您收回同意的决定,不会影响此前基于您的授权而开展的用户信息处理。</p>
+        <h3>(五)用户信息主体注销账户 </h3>
+        <p>您随时可注销此前注册的账户,您可以通过以下方式自行操作:补充注销账户的操作方式</p>
+        <p>在注销账户之后,我们将停止为您提供产品或服务并依据您的要求,删除或匿名化您的信息,法律法规另有规定的除外。这也将可能导致您失去对您账户中数据的访问权,请您谨慎操作。</p>
+        <h3>(六)用户信息主体获取用户信息副本</h3>
+        <p>您有权获取您的用户信息副本,您可以通过以下方式自行操作:补充获取用户信息副本的操作方式</p>
+        <p>在技术可行的前提下,例如数据接口匹配,我们还可按您的要求,直接将您的用户信息副本传输给您指定的第三方。</p>
+        <h3>(七)约束信息系统自动决策</h3>
+        <p>在某些业务功能中,我们可能仅依据信息系统、算法等在内的非人工自动决策机制作出决定。如果这些决定显著影响您的合法权益,您有权要求我们作出解释,我们也将提供适当的救济方式。</p>
+        <h3>(八)响应您的上述请求</h3>
+        <p>为保障安全,您可能需要提供书面请求,或以其他方式证明您的身份。我们可能会先要求您验证自己的身份,然后再处理您的请求。</p>
+        <p>我们将在三十天内作出答复。如您不满意,还可以通过以下途径投诉:补充其他的申诉途径</p>
+        <b>对于您合理的请求,我们原则上不收取费用,但对多次重复、超出合理限度的请求,我们将视情况收取一定成本费用。对于那些无端重复、需要过多技术手段(例如,需要开发新系统或从根本上改变现行惯例)、给他人合法权益带来风险或者非常不切实际的请求,我们可能会予以拒绝。也请您理解,出于安全保障的考虑、相关法律法规的要求或技术上的限制,对于您的某些请求我们可能无法做出响应,例如以下情形:</b>
+        <p>1、与用户信息控制者履行法律法规规定的义务相关的;</p>
+        <p>2、与国家安全、国防安全直接相关的;</p>
+        <p>3、与公共安全、公共卫生、重大公共利益直接相关的;</p>
+        <p>4、与犯罪侦查、起诉、审判和执行判决等直接相关的;</p>
+        <p>5、用户信息控制者有充分证据表明用户信息主体存在主观恶意或滥用权利的;</p>
+        <p>6、出于维护用户信息主体或其他个人的生命、财产等重大合法权益但又很难得到本人同意的;</p>
+        <p>7、响应用户信息主体的请求将导致用户信息主体或其他个人、组织的合法权益受到严重损害的;</p>
+        <p>8、涉及商业秘密的。</p>
+        <h2>六、我们如何处理儿童的个人信息</h2>
+        <p>我们非常重视儿童个人信息的保护,我们的产品、网站和服务主要面向成人。如果没有父母或监护人的同意,儿童不应创建自己的用户账户。尽管当地法律和习俗对儿童的定义不同,但我们将不满 14 周岁的任何人均视为儿童。</p>
+        <p>对于经父母或监护人同意而收集儿童用户信息的情况,我们只会在受到法律允许、父母或监护人明确同意或者保护儿童所必要的情况下储存、使用或公开披露此信息,否则我们会设法尽快删除相关数据。</p>
+        <p>鉴于现有技术和业务模式的限制,我们很难主动识别儿童的个人信息,如果您发现我们在不知情的情况下或在未事先获得可证实的监护人同意的情况下收集了儿童的个人信息,您可以及时联系我们,我们将在发现后设法及时删除,如果我们自己发现前述情形的,我们也会及时删除,法律要求我们保留的除外。</p>
+        <h2>七、您的用户信息如何储存以及如何在全球范围转移</h2>
+        <p>原则上,我们在中华人民共和国境内收集和产生的用户信息,将存储在中华人民共和国境内。我们只会在本政策所述目的和用途所需的期限内和法律法规规定的最短期限内保留您的用户信息,超出上述保留期间后,我们会根据适用法律法规的要求删除您的用户信息或匿名化处理。法律法规另有规定,或出于公共利益、科学历史研究等的目的,或您的另行授权同意的除外,我们可能需要较长时间保留相关数据。</p>
+        <p>由于我们通过遍布全球的资源和服务器提供产品或服务,这意味着,在获得您的授权同意后,您的用户信息可能会被转移到您使用产品或服务所在国家/地区的境外管辖区,或者受到来自这些管辖区的访问。</p>
+        <p>此类管辖区可能设有不同的数据保护法,甚至未设立相关法律。在此类情况下,我们会确保您的用户信息得到在中华人民共和国境内足够同等的保护。例如,我们会请求您对跨境转移用户信息的同意,或者在跨境数据转移之前实施数据去标识化等安全举措。</p>
+        <h2>八、本政策如何更新</h2>
+        <p>我们的隐私政策可能变更。未经您明确同意,我们不会削减您按照本隐私政策所应享有的权利。我们会在本页面上发布对本政策所做的任何变更。</p>
+        <b>对于重大变更,我们还会提供更为显著的通知。本政策所指的重大变更包括但不限于:</b>
+        <p>1、我们的服务模式发生重大变化。如处理用户信息的目的、处理的用户信息类型、用户信息的使用方式等;</p>
+        <p>2、我们在所有权结构、组织架构等方面发生重大变化。如业务调整、破产并购等引起的所有者变更等;</p>
+        <p>3、用户信息共享、转让或公开披露的主要对象发生变化;</p>
+        <p>4、您参与用户信息处理方面的权利及其行使方式发生重大变化;</p>
+        <p>5、我们负责处理用户信息安全的责任部门、联络方式及投诉渠道发生变化时;</p>
+        <p>6、用户信息安全影响评估报告表明存在高风险时。</p>
+        <p>我们还会将本政策的旧版本存档,供您查阅。</p>
+        <h2>九、如何联系我们</h2>
+        <b>如果您对本隐私政策有任何疑问、意见或建议,通过以下方式与我们联系:</b>
+        <p>电子邮件:{公司邮件地址}</p>
+        <p>电  话:{公司电话}</p>
+        <p>传  真:{公司传真}</p>
+        <p>我们设立了用户信息保护专职部门,您可以通过以下方式与相关人员联系:补充用户信息保护相关的联系方式</p>
+        <p>一般情况下,我们将在三十天内回复。</p>
+        <p>如果您对我们的回复不满意,特别是我们的用户信息处理行为损害了您的合法权益,您还可以通过以下外部途径寻求解决方案:补充其他获取解决方案的外部途径</p>
+    </body>
+</html>

TEMPAT SAMPAH
src/Auman.PieceWage.UniApp/static/tabbar/calendar-check.png


TEMPAT SAMPAH
src/Auman.PieceWage.UniApp/static/tabbar/calendar-check_active.png


TEMPAT SAMPAH
src/Auman.PieceWage.UniApp/static/tabbar/chart-bar.png


TEMPAT SAMPAH
src/Auman.PieceWage.UniApp/static/tabbar/chart-bar_active.png


TEMPAT SAMPAH
src/Auman.PieceWage.UniApp/static/tabbar/grid.png


TEMPAT SAMPAH
src/Auman.PieceWage.UniApp/static/tabbar/grid_active.png


TEMPAT SAMPAH
src/Auman.PieceWage.UniApp/static/tabbar/house.png


TEMPAT SAMPAH
src/Auman.PieceWage.UniApp/static/tabbar/house_active.png


TEMPAT SAMPAH
src/Auman.PieceWage.UniApp/static/tabbar/list-check.png


TEMPAT SAMPAH
src/Auman.PieceWage.UniApp/static/tabbar/list-check_active.png


TEMPAT SAMPAH
src/Auman.PieceWage.UniApp/static/tabbar/list.png


TEMPAT SAMPAH
src/Auman.PieceWage.UniApp/static/tabbar/list_active.png


TEMPAT SAMPAH
src/Auman.PieceWage.UniApp/static/tabbar/me.png


TEMPAT SAMPAH
src/Auman.PieceWage.UniApp/static/tabbar/me_active.png


TEMPAT SAMPAH
src/Auman.PieceWage.UniApp/static/tabbar/tags.png


TEMPAT SAMPAH
src/Auman.PieceWage.UniApp/static/tabbar/tags_active.png


TEMPAT SAMPAH
src/Auman.PieceWage.UniApp/static/tabbar/user.png


TEMPAT SAMPAH
src/Auman.PieceWage.UniApp/static/tabbar/user_active.png


+ 9 - 0
src/Auman.PieceWage.UniApp/styles/color.css

@@ -273,4 +273,13 @@
 
 .bg-light-white {
     background-color: var(--color-light-white);
+}
+
+/* 渐变色 */
+.bg-lightblue-to-white {
+    background: linear-gradient(to bottom, var(--color-light-blue) 10%, var(--color-white) 70%)
+}
+
+.bg-lightcyan-to-white {
+    background: linear-gradient(to bottom, var(--color-light-cyan) 10%, var(--color-white) 70%)
 }

+ 70 - 2
src/Auman.PieceWage.UniApp/styles/main.css

@@ -35,10 +35,34 @@ text {
     width: 33.3%;
 }
 
+.width-40per {
+    width: 40%;
+}
+
 .width-50per {
     width: 50%;
 }
 
+.width-60per {
+    width: 60%;
+}
+
+.width-70per {
+    width: 70%;
+}
+
+.width-80per {
+    width: 80%;
+}
+
+.width-90per {
+    width: 90%;
+}
+
+.width-100per {
+    width: 100%;
+}
+
 .width-70 {
     width: 70upx;
 }
@@ -67,6 +91,18 @@ text {
     height: 0;
 }
 
+.height-20 {
+    height: 20upx;
+}
+
+.height-40 {
+    height: 40upx;
+}
+
+.height-60 {
+    height: 60upx;
+}
+
 .height-80 {
     height: 80upx;
 }
@@ -323,8 +359,31 @@ text {
 .flex-warp.child-gap>button+button,
 .flex-warp.child-gap>view+button,
 .flex-warp.child-gap>button+view{
-    margin-top: 10upx;
-    margin-bottom: 10upx;
+    margin-top: 20upx;
+    margin-bottom: 20upx;
+}
+
+.child-gap-40>view+view,
+.child-gap-40>button+button,
+.child-gap-40>view+button,
+.child-gap-40>button+view {
+    margin-left: 40upx !important;
+}
+
+.direction-column.child-gap-40>view+view,
+.direction-column.child-gap-40>button+button,
+.direction-column.child-gap-40>view+button,
+.direction-column.child-gap-40>button+view{
+    margin-left: 0 !important;
+    margin-top: 40upx !important;
+}
+
+.flex-warp.child-gap-40>view+view,
+.flex-warp.child-gap-40>button+button,
+.flex-warp.child-gap-40>view+button,
+.flex-warp.child-gap-40>button+view{
+    margin-top: 40upx;
+    margin-bottom: 40upx;
 }
 
 /* 网格 */
@@ -478,4 +537,13 @@ uni-button[type="black"],
 uni-button[type="dark"] {
     color: var(--color-white);
     background-color: var(--color-black);
+}
+
+uni-button[type="lightblue"] {
+    color: var(--color-black);
+    background-color: var(--color-light-blue);
+}
+
+uni-button[border="round"] {
+    border-radius: 100upx !important;
 }

+ 6 - 0
src/Auman.PieceWage.UniApp/utils/user.js

@@ -30,6 +30,12 @@ export default {
         let res = await request.sendToken({
             url: opts.url
         });
+        if (res.success) {
+            if (extend.isObject(res.data)) {
+                this.set(res.data);
+            }
+        }
+        return res;
     },
 
     /**