xiongzhu il y a 5 ans
Parent
commit
bbbe68e016

+ 6 - 0
project.config.json

@@ -173,6 +173,12 @@
                     "pathName": "pages/verifyDetail",
                     "query": "id=118",
                     "scene": null
+                },
+                {
+                    "id": -1,
+                    "name": "反馈",
+                    "pathName": "pages/report",
+                    "scene": null
                 }
             ]
         }

Fichier diff supprimé car celui-ci est trop grand
+ 20 - 0
src/App.vue


+ 35 - 6
src/components/navigationBar.vue

@@ -4,7 +4,7 @@
             <div class="navigation-bar-title" :style="{ color: frontColor }">
                 {{ title }}
             </div>
-            <div class="icon-wrapper" @click="back">
+            <div class="icon-wrapper" @click="back" v-if="showLeftIcon">
                 <img class="left-icon" :src="icon" />
             </div>
         </div>
@@ -22,6 +22,14 @@ export default {
             default() {
                 return false;
             }
+        },
+        showLeftIcon: {
+            default() {
+                return true;
+            }
+        },
+        leftIcon: {
+            default: 'back'
         }
     },
     created() {
@@ -29,10 +37,20 @@ export default {
     },
     computed: {
         icon() {
-            if (this.color === 'light') {
+            if (this.leftIcon === 'back') {
+                if (this.color === 'light') {
+                    return '/native/imgs/navi_back_dark.png';
+                } else if (this.color === 'dark') {
+                    return '/native/imgs/navi_back_light.png';
+                }
                 return '/native/imgs/navi_back_dark.png';
-            } else if (this.color === 'dark') {
-                return '/native/imgs/navi_back_light.png';
+            } else if (this.leftIcon === 'home') {
+                if (this.color === 'light') {
+                    return '/native/imgs/navi_home_dark.png';
+                } else if (this.color === 'dark') {
+                    return '/native/imgs/navi_home_light.png';
+                }
+                return '/native/imgs/navi_home_dark.png';
             }
             return '/native/imgs/navi_back_dark.png';
         },
@@ -83,16 +101,27 @@ export default {
             }
         },
         back() {
-            wx.navigateBack();
+            if (this.leftIcon === 'back') {
+                wx.navigateBack();
+            } else {
+                wx.switchTab({
+                    url: '/pages/home'
+                });
+            }
         }
     }
 };
 </script>
 <style lang="less" scoped>
 .navigation-bar {
+    position: fixed;
+    top: 0;
+    left: 0;
+    width: 100vw;
+    transition: all 0.3s linear;
     .navigation-bar-body {
         position: relative;
-        transition: background 0.3s linear;
+        transition: all 0.3s linear;
         .icon-wrapper {
             position: absolute;
             left: 0;

+ 3 - 1
src/main.js

@@ -78,7 +78,9 @@ export default {
             'pages/orderDetail',
             'pages/record',
             'pages/verify',
-            'pages/verifyDetail'
+            'pages/verifyDetail',
+            'pages/report',
+            'pages/edit'
         ],
         tabBar: {
             custom: true,

BIN
src/native/imgs/navi_home_dark.png


BIN
src/native/imgs/navi_home_light.png


BIN
src/native/imgs/tab_home.png


BIN
src/native/imgs/tab_home_pre.png


BIN
src/native/imgs/tab_my.png


BIN
src/native/imgs/tab_my_pre.png


+ 7 - 2
src/pages/commission.vue

@@ -19,7 +19,10 @@
             </div>
             <div class="title">
                 <div class="name">佣金明细</div>
-                <div class="tip">如何赚取佣金?</div>
+            </div>
+            <div class="empty-section" v-if="empty">
+                <img src="../static/imgs/verify_empty.png" class="icon" />
+                <div class="desc">暂无佣金明细</div>
             </div>
             <div class="list">
                 <div class="item" v-for="item in list" :key="item.id">
@@ -39,7 +42,8 @@ export default {
     data() {
         return {
             list: [],
-            commission: 0
+            commission: 0,
+            empty: false
         };
     },
     onShow() {
@@ -48,6 +52,7 @@ export default {
         });
         this.$http.get('/commissionRecord/my').then(res => {
             this.list = res;
+            this.empty = res.length === 0;
         });
     }
 };

+ 26 - 5
src/pages/detail.vue

@@ -73,7 +73,12 @@
             </div>
             <div style="height:70px"></div>
         </div>
-        <navigation-bar :color="style" :title="transparent ? '' : title" :transparent="transparent"></navigation-bar>
+        <navigation-bar
+            :leftIcon="leftIcon"
+            :color="style"
+            :title="transparent ? '' : title"
+            :transparent="transparent"
+        ></navigation-bar>
         <div class="bottom-wrapper">
             <div class="btn-large" @click="buy">立即购买</div>
         </div>
@@ -91,7 +96,8 @@ export default {
             packageInfo: {
                 img: []
             },
-            packageGoods: []
+            packageGoods: [],
+            leftIcon: 'back'
         };
     },
     onShow() {
@@ -101,6 +107,9 @@ export default {
         this.$http.postJson('/packageGoods/all', { size: 10000, query: { packageId: this.$mp.query.id } }).then(res => {
             this.packageGoods = res.content;
         });
+        if (this.$mp.query && this.$mp.query.from === 'share') {
+            this.leftIcon = 'home';
+        }
     },
     computed: {
         sum() {
@@ -139,7 +148,20 @@ export default {
         }
     },
     onShareAppMessage(res) {
-        return this.share();
+        let path = 'pages/home?from=share';
+        if (this.packageInfo && this.packageInfo.id) {
+            path = 'pages/detail?from=share&id=' + this.packageInfo.id;
+        }
+        if (this.$store.state.userInfo && this.$store.state.userInfo.id) {
+            path += '&invitor=' + this.$store.state.userInfo.id;
+        }
+        return {
+            title: this.title || '甲山下',
+            path: path,
+            imageUrl:
+                ((this.packageInfo || {}).img || [])[0] ||
+                'https://jiashanxia.oss-cn-hangzhou.aliyuncs.com/image/2020-11-30-15-41-01dgYYeraK.png'
+        };
     }
 };
 </script>
@@ -306,7 +328,6 @@ export default {
     width: 100%;
     height: auto;
     border-radius: 8px;
-    margin-bottom: 12px;
-    margin-top: 12px;
+    margin-top: 8px;
 }
 </style>

+ 93 - 0
src/pages/edit.vue

@@ -0,0 +1,93 @@
+<config>
+{
+    "disableScroll": true,
+    "navigationBarTitleText": "编辑",
+    "navigationBarBackgroundColor": "#ffffff",
+    "navigationBarTextStyle": "black",
+    "backgroundColor": "#ffffff"
+}
+</config>
+<template>
+    <div class="page-container">
+        <div class="page-scroll">
+            <input v-model="value" :placeholder="placeholder" placeholder-class="placeholder" />
+            <div>
+                <div class="btn-large btn-save" @click="save">保存</div>
+            </div>
+        </div>
+    </div>
+</template>
+<script>
+export default {
+    data() {
+        return {
+            eventChannel: null,
+            field: '',
+            value: '',
+            placeholder: ''
+        };
+    },
+    onShow() {
+        console.log(this.$mp.query);
+        wx.setNavigationBarTitle({ title: this.$mp.query.title });
+        this.placeholder = this.$mp.query.placeholder;
+        this.value = this.$mp.query.current;
+        this.field = this.$mp.query.field;
+    },
+    methods: {
+        save() {
+            if (!this.value) {
+                wx.showToast({
+                    icon: 'none',
+                    title: this.placeholder
+                });
+                return;
+            }
+            wx.showLoading({
+                title: '保存中'
+            });
+            let data = {};
+            data[this.field] = this.value;
+            this.$http
+                .postJson('/user/updateUserInfo', data)
+                .then(res => {
+                    wx.hideLoading();
+                    wx.showToast({
+                        title: '保存成功'
+                    });
+                    this.$store.dispatch('getUserInfo');
+                    setTimeout(() => {
+                        wx.navigateBack();
+                    }, 1500);
+                })
+                .catch(e => {
+                    wx.hideLoading();
+                    wx.showToast({
+                        icon: 'none',
+                        title: e.error
+                    });
+                });
+        }
+    }
+};
+</script>
+<style lang="less">
+page {
+    background: white;
+}
+.placeholder {
+    color: @text4;
+    font-size: 14px;
+}
+input {
+    margin: 16px 16px 0 16px;
+    font-size: 14px;
+    color: black;
+    border-bottom: 1px solid @border2;
+    height: 44px;
+    line-height: 44px;
+}
+.btn-save {
+    margin: 60px auto 0 auto;
+}
+</style>

+ 28 - 3
src/pages/home.vue

@@ -6,7 +6,16 @@
 }
 </config>
 <template>
-    <div class="page-container">
+    <scroll-view
+        class="page-container"
+        scroll-y="true"
+        enhanced
+        :show-scrollbar="false"
+        style="100vh"
+        upper-threshold="240rpx"
+        @scroll="scroll"
+        :bounces="false"
+    >
         <div class="page-scroll">
             <div class="bg">
                 <div class="bg1"></div>
@@ -63,10 +72,18 @@
                 </div>
             </div>
         </div>
-    </div>
+        <navigation-bar
+            color="light"
+            :showLeftIcon="false"
+            :title="transparent ? '' : '甲山下生态园'"
+            :transparent="transparent"
+        ></navigation-bar>
+    </scroll-view>
 </template>
 <script>
+import NavigationBar from '../components/navigationBar';
 export default {
+    components: { NavigationBar },
     onShow() {
         this.$mp.page.getTabBar().setData({ selected: 'home' });
         let type = 'PERSONAL';
@@ -84,7 +101,8 @@ export default {
         return {
             swiperIndex: 0,
             banners: [],
-            packages: []
+            packages: [],
+            transparent: true
         };
     },
     methods: {
@@ -95,6 +113,13 @@ export default {
             wx.navigateTo({
                 url: '/pages/detail?id=' + item.id
             });
+        },
+        scroll(e) {
+            if (e.detail.scrollTop > 120) {
+                this.transparent = false;
+            } else {
+                this.transparent = true;
+            }
         }
     }
 };

+ 36 - 5
src/pages/my.vue

@@ -8,7 +8,16 @@
 }
 </config>
 <template>
-    <div class="page-container">
+    <scroll-view
+        class="page-container"
+        scroll-y="true"
+        enhanced
+        :show-scrollbar="false"
+        style="100vh"
+        upper-threshold="750rpx"
+        :bounces="false"
+        @scroll="scroll"
+    >
         <div class="page-scroll">
             <div class="wrapper">
                 <div
@@ -76,7 +85,7 @@
                         </div>
                     </div>
                     <div style="min-width: 13px;"></div>
-                    <div class="col" style="background: #e3f3ff;" @click="showQrCode = true">
+                    <div class="col" style="background: #e3f3ff;" @click="myCode">
                         <img src="../static/imgs/icon_code.png" class="icon" />
                         <div class="info">
                             <div class="label">我的核销码</div>
@@ -103,7 +112,12 @@
                 </div>
             </div>
         </div>
-
+        <navigation-bar
+            color="light"
+            :showLeftIcon="false"
+            :title="transparent ? '' : '我的'"
+            :transparent="transparent"
+        ></navigation-bar>
         <van-overlay :show="showQrCode">
             <div class="qr-code-dialog">
                 <div class="body">
@@ -116,13 +130,15 @@
                 <img src="../static/imgs/icon_close.png" class="icon-close" @click="showQrCode = false" />
             </div>
         </van-overlay>
-    </div>
+    </scroll-view>
 </template>
 <script>
 import { mapState } from 'vuex';
 import base64 from '../base64';
+import NavigationBar from '../components/navigationBar';
 const qrcode = require('../qrcode/index');
 export default {
+    components: { NavigationBar },
     onShareAppMessage(res) {
         return this.share();
     },
@@ -146,7 +162,8 @@ export default {
                 commission: 0,
                 promote: 0
             },
-            packages: []
+            packages: [],
+            transparent: true
         };
     },
     computed: {
@@ -192,6 +209,18 @@ export default {
             if (this.checkLogin()) {
                 this.navigateTo('/pages/order');
             }
+        },
+        myCode() {
+            if (this.checkLogin()) {
+                this.showQrCode = true;
+            }
+        },
+        scroll(e) {
+            if (e.detail.scrollTop > 120) {
+                this.transparent = false;
+            } else {
+                this.transparent = true;
+            }
         }
     },
     watch: {
@@ -348,6 +377,8 @@ export default {
                 color: darken(@prim, 30%);
                 font-size: 14px;
                 flex-grow: 1;
+                font-weight: bold;
+                font-weight: 500;
             }
             .btn {
                 width: 56px;

+ 2 - 2
src/pages/order.vue

@@ -17,7 +17,7 @@
                     <van-tab name="3" title="已完成"></van-tab>
                 </van-tabs>
             </van-sticky>
-            <van-empty description="什么也没有" v-if="empty" />
+            <van-empty description="暂无订单" v-if="empty" />
             <div class="list">
                 <div class="item" v-for="item in orders" :key="item.id" @click="detail(item)">
                     <div class="title">
@@ -40,7 +40,7 @@
                     </div>
                     <div class="total-price">
                         <div style="margin-right: 4px; margin-top: 2px;">总金额</div>
-                        <price-tag color="black" size="22" value="599"></price-tag>
+                        <price-tag color="black" size="22" :value="item.price"></price-tag>
                     </div>
                     <div class="btns" v-if="item.status !== 'CANCELLED'">
                         <div class="btn btn-cancel" @click.stop="cancel(item)" v-if="item.status === 'UNPAID'">

+ 1 - 1
src/pages/orderDetail.vue

@@ -133,7 +133,7 @@ export default {
         },
         copy() {
             wx.setClipboardData({
-                data: this.orderInfo.id,
+                data: this.orderInfo.id + '',
                 success(res) {
                     wx.getClipboardData({
                         success(res) {

+ 22 - 5
src/pages/pay.vue

@@ -70,6 +70,9 @@ export default {
     },
     methods: {
         onGetPhoneNumber(res) {
+            if (!res.detail.errMsg.includes('ok')) {
+                return;
+            }
             wx.showLoading({
                 title: '加载中',
                 mask: true
@@ -114,15 +117,29 @@ export default {
                             wx.showToast({
                                 title: '支付成功'
                             });
-                            this.navigateTo('/pages/order');
+                            wx.redirectTo({
+                                url: '/pages/order'
+                            });
                         },
                         fail: e => {
                             console.log(e);
                             wx.hideLoading();
-                            wx.showToast({
-                                icon: 'none',
-                                title: '支付失败'
-                            });
+                            if (e.errMsg.includes('cancel')) {
+                                wx.showToast({
+                                    icon: 'none',
+                                    title: '支付取消'
+                                });
+                            } else {
+                                wx.showToast({
+                                    icon: 'none',
+                                    title: '支付失败'
+                                });
+                            }
+                            setTimeout(() => {
+                                wx.redirectTo({
+                                    url: '/pages/order'
+                                });
+                            }, 1500);
                         }
                     });
                 })

+ 47 - 2
src/pages/profile.vue

@@ -10,14 +10,14 @@
 <template>
     <div class="page-container">
         <div class="page-scroll">
-            <div class="cell">
+            <div class="cell" @click="chooseImg">
                 <div class="label">头像</div>
                 <div class="value">
                     <img class="avatar" :src="(userInfo || {}).avatar || '/native/imgs/avatar.jpg'" />
                 </div>
                 <img src="../static/imgs/icon_into.png" class="into" />
             </div>
-            <div class="cell">
+            <div class="cell" @click="edit('nickname')">
                 <div class="label">昵称</div>
                 <div class="value">{{ (userInfo || {}).nickname }}</div>
                 <img src="../static/imgs/icon_into.png" class="into" />
@@ -120,6 +120,51 @@ export default {
                 .then(res => {
                     this.$store.dispatch('getUserInfo');
                 });
+        },
+        edit(field) {
+            wx.navigateTo({
+                url: `/pages/edit?title=编辑昵称&placeholder=请输入昵称&field=nickname&current=${this.userInfo[field]}`
+            });
+        },
+        chooseImg() {
+            new Promise((resolve, reject) => {
+                wx.chooseImage({
+                    count: 1,
+                    sizeType: ['original', 'compressed'],
+                    sourceType: ['album', 'camera'],
+                    success: res => {
+                        resolve(res.tempFilePaths);
+                    },
+                    fail: e => {
+                        reject(e);
+                    }
+                });
+            })
+                .then(res => {
+                    console.log(res);
+                    return this.$http.uploadFile(res[0]);
+                })
+                .then(res => {
+                    console.log(res);
+                    this.img = res;
+                    wx.showLoading({
+                        title: '保存中'
+                    });
+                    return this.$http.postJson('/user/updateUserInfo', {
+                        avatar: res
+                    });
+                })
+                .then(res => {
+                    wx.hideLoading();
+                    this.$store.dispatch('getUserInfo');
+                    wx.showToast({
+                        title: '保存成功'
+                    });
+                })
+                .catch(e => {
+                    wx.hideLoading();
+                    console.log(e);
+                });
         }
     }
 };

+ 7 - 1
src/pages/promote.vue

@@ -20,6 +20,10 @@
             <div class="title">
                 <div class="name">推广列表</div>
             </div>
+            <div class="empty-section" v-if="empty">
+                <img src="../static/imgs/verify_empty.png" class="icon" />
+                <div class="desc">暂无推广人员</div>
+            </div>
             <div class="list">
                 <div class="item" v-for="item in list" :key="item.id">
                     <img :src="item.avatar" class="avatar" />
@@ -37,7 +41,8 @@ export default {
     data() {
         return {
             list: [],
-            promote: 0
+            promote: 0,
+            empty: false
         };
     },
     onShow() {
@@ -46,6 +51,7 @@ export default {
         });
         this.$http.get('/user/myPromotion').then(res => {
             this.list = res;
+            this.empty = res.length === 0;
         });
     }
 };

+ 10 - 5
src/pages/record.vue

@@ -11,7 +11,10 @@
     <div class="page-container">
         <div class="page-scroll">
             <div style="height:10px"></div>
-            <van-empty description="什么也没有" v-if="empty" />
+            <div class="empty-section" v-if="empty">
+                <img src="../static/imgs/verify_empty.png" class="icon" />
+                <div class="desc">暂无相关明细</div>
+            </div>
             <div class="item" v-for="(item, i) in list" :key="i">
                 <div class="left">
                     <div class="line-top" v-if="i !== 0"></div>
@@ -30,10 +33,12 @@
                         </div>
                         <div class="row" v-for="(row, j) in item.content" :key="j">
                             <div class="name">{{ row.name }}</div>
-                            <div class="value add">{{ row.num > 0 ? '+' : '' }}{{ row.num }}</div>
+                            <div class="value" :class="{ add: item.type === 'BUY' }">
+                                {{ row.num > 0 ? '+' : '' }}{{ row.num }}
+                            </div>
                         </div>
                     </div>
-                    <div class="tip">对此单有异议?</div>
+                    <div class="tip" @click="navigateTo('/pages/report')">对此单有异议?</div>
                 </div>
             </div>
         </div>
@@ -58,8 +63,8 @@ export default {
             if (e === 'BUY') {
                 return '购买套餐';
             }
-            if (e === '线下核销') {
-                return '';
+            if (e === 'WRITE_OFF') {
+                return '线下核销';
             }
         }
     }

+ 136 - 0
src/pages/report.vue

@@ -0,0 +1,136 @@
+<config>
+{
+    "disableScroll": true,
+    "navigationBarTitleText": "问题反馈",
+    "navigationBarBackgroundColor": "#ffffff",
+    "navigationBarTextStyle": "black",
+    "backgroundColor": "#ffffff"
+}
+</config>
+<template>
+    <div class="page-container">
+        <div class="page-scroll">
+            <textarea
+                v-model="desc"
+                :maxlength="200"
+                placeholder="请输入您的问题,200字以内"
+                placeholder-class="placeholder"
+            />
+            <img class="pic" :src="img" @click="chooseImg" v-if="img" mode="aspectFill" />
+            <div class="pic" @click="chooseImg" v-else>
+                <img src="../static/imgs/icon_pic.png" />
+                <div>上传图片</div>
+            </div>
+            <div>
+                <div class="btn-large btn-submit" @click="submit">提交</div>
+            </div>
+        </div>
+    </div>
+</template>
+<script>
+export default {
+    data() {
+        return {
+            desc: '',
+            img: ''
+        };
+    },
+    methods: {
+        chooseImg() {
+            new Promise((resolve, reject) => {
+                wx.chooseImage({
+                    count: 1,
+                    sizeType: ['original', 'compressed'],
+                    sourceType: ['album', 'camera'],
+                    success: res => {
+                        resolve(res.tempFilePaths);
+                    },
+                    fail: e => {
+                        reject(e);
+                    }
+                });
+            })
+                .then(res => {
+                    console.log(res);
+                    return this.$http.uploadFile(res[0]);
+                })
+                .then(res => {
+                    console.log(res);
+                    this.img = res;
+                })
+                .catch(e => {
+                    console.log(e);
+                });
+        },
+        submit() {
+            if (!this.desc) {
+                wx.showToast({
+                    icon: 'none',
+                    title: '请输入您的问题'
+                });
+                return;
+            }
+            wx.showLoading({
+                title: '提交中'
+            });
+            this.$http
+                .postJson('/feedback/save', {
+                    userId: this.$store.state.userInfo.id,
+                    img: [this.img],
+                    content: this.desc
+                })
+                .then(res => {
+                    wx.hideLoading();
+                    wx.showToast({
+                        title: '提交成功'
+                    });
+                    setTimeout(() => {
+                        wx.navigateBack();
+                    }, 1500);
+                })
+                .catch(e => {
+                    wx.hideLoading();
+                    wx.showToast({
+                        icon: 'none',
+                        title: e.error
+                    });
+                });
+        }
+    }
+};
+</script>
+<style lang="less">
+page {
+    background: white;
+}
+.placeholder {
+    color: @text4;
+    font-size: 14px;
+}
+textarea {
+    font-size: 14px;
+    color: black;
+    margin: 16px;
+    border-bottom: 1px solid @border2;
+}
+.pic {
+    .flex-col();
+    align-items: center;
+    justify-content: center;
+    width: 80px;
+    height: 80px;
+    background: @border2;
+    border-radius: 8px;
+    color: @text4;
+    font-size: 12px;
+    margin: 20px 0 0 16px;
+    img {
+        width: 32px;
+        height: 22px;
+        margin-bottom: 6px;
+    }
+}
+.btn-submit {
+    margin: 60px auto 0 auto;
+}
+</style>

+ 22 - 2
src/pages/verify.vue

@@ -17,6 +17,7 @@
         style="100vh"
         upper-threshold="750rpx"
         :bounces="false"
+        @scroll="scroll"
         @scrolltolower="scrolltolower"
     >
         <div class="page-scroll">
@@ -54,6 +55,12 @@
                 <div style="height:150px"></div>
             </div>
         </div>
+        <navigation-bar
+            color="light"
+            :showLeftIcon="false"
+            :title="transparent ? '' : '项目核销'"
+            :transparent="transparent"
+        ></navigation-bar>
         <div class="btn-scan" @click="scan">
             <img src="../static/imgs/icon_scan.png" />
             点击扫码
@@ -62,13 +69,16 @@
 </template>
 <script>
 import base64 from '../base64.js';
+import NavigationBar from '../components/navigationBar';
 export default {
+    components: { NavigationBar },
     data() {
         return {
             page: 0,
             hasMore: true,
             list: [],
-            empty: false
+            empty: false,
+            transparent: true
         };
     },
     onShow() {
@@ -83,7 +93,10 @@ export default {
             this.$http
                 .postJson('/userPackageFlow/writeOffAll1', {
                     page: this.page,
-                    sort: 'createdAt,desc'
+                    sort: 'createdAt,desc',
+                    query: {
+                        writeOffUserId: (this.$store.state.userInfo || {}).id
+                    }
                 })
                 .then(res => {
                     if (res.first) {
@@ -113,6 +126,13 @@ export default {
                 this.page++;
                 this.getData();
             }
+        },
+        scroll(e) {
+            if (e.detail.scrollTop > 120) {
+                this.transparent = false;
+            } else {
+                this.transparent = true;
+            }
         }
     }
 };

+ 2 - 1
src/pages/verifyDetail.vue

@@ -42,7 +42,8 @@ export default {
     components: { NavigationBar, Stepper },
     data() {
         return {
-            userInfo: {}
+            userInfo: {},
+            list: []
         };
     },
     created() {

+ 1 - 1
src/plugins/http.js

@@ -157,7 +157,7 @@ const http = {
                             try {
                                 resolve(JSON.parse(res.data));
                             } catch (e) {
-                                reject(e);
+                                resolve(res.data);
                             }
                         } else {
                             reject(res);

BIN
src/static/imgs/icon_pic.png


Certains fichiers n'ont pas été affichés car il y a eu trop de fichiers modifiés dans ce diff