Bonjour,

Après plusieurs recherche et tuto, je n'arrive toujours à trouver la solution. Voilà lorsque je veux modifié un utilisateur , tout se passe bien jusqu'au moment ou j arrive à l'email.Je reçois bien une erreur provenant du backend si l'email existe déjà .Mais je n'arrive pas à la faire apparaître à côté frontend pour que l'utilisateur puisse le voir.J'ai également un second problème, lorsque j'utilise "prevent" avec v-on:submit , impossible de repasser en mode normal ma page reste comme ci que je suis toujours entrain de modifié.Mais lorsque je n'ai pas prevent une fois que je clique sur enregistré la page repasse en normal.Je vais mettre des photos pour que cela soit plus compréhensible.

PS: j'ai aussi essayé avec "vuelidate".

PS 1:La prmière photo "j'ai modifié mais les champs restent ouvert comme ci que je n'ai pas cliquer sur enregistrer"
la second photo j ai retiré prevent qui se trouve avec v-on:submit et là les champs passe bien en normal sauf que lorsque je clique il me valide n'importe quoi"

Je vous remercie par avance pour votre aide.

Code frontend:
Code html : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
<template>
    <div>
        <HeaderConnexion />
        <section class="bloc_user" :style="{'background-image': 'url(' + require('../assets/images/marque-employeur-1.jpg') + ')'}">
            <h1 class="information" >Information personnel</h1>
            <form method="put" v-on:submit.prevent="userProfile"  class="information_user" > 
                <div class="info_champs" v-for="user in users" v-bind:key="user.id_user" > 
                        <div class="champs">
                            <div class="info_champs_user">
                                <input  class="input_information" type="text"  v-model="lastname" :disabled="!isEditing" :class="{view: !isEditing}" placeholder= 'Nom'  >{{user.lastname}}
                                <div v-if="!$v.lastname.required && $v.lastname.$dirty">Le nom est obligatoire!</div>
                                <div v-if="!$v.lastname.alpha && $v.lastname.$dirty">Le nom est obligatoire!</div>
                            </div>
                            <div class="info_champs_user">
                                <input class="input_information" type="text" v-model="firstname" placeholder="Prénom" :disabled="!isEditing" :class="{view: !isEditing}" >{{user.firstname}}
                                <div v-if="!$v.firstname.required && $v.firstname.$dirty">Le prénom est obligatoire!</div>
                                <div v-if="!$v.firstname.alpha && $v.firstname.$dirty">Le prénom est obligatoire!</div>
                            </div> 
                            <div class="info_champs_user">
                                <input class="input_information" type="text" v-model="username" placeholder="Pseudo" :disabled="!isEditing" :class="{view: !isEditing}" >{{user.username}}
                                <div v-if="!$v.username.required && $v.username.$dirty">Le pseudo est obligatoire!</div>
                                <div v-if="!$v.username.alpha && $v.username.$dirty">Le pseudo est obligatoire!</div>
                            </div>
                            <div class="info_champs_user">
                                <input class="input_information" type="email" v-model="email" placeholder="E-mail" :disabled="!isEditing" :class="{view: !isEditing}" >{{user.email}}
                                <div v-if="(!$v.email.required || !$v.email.email) && $v.email.$dirty">L'email est obligatoire!</div>
 
                            </div>
                            <div class="info_champs_user">
                                <input class="input_information" type="password" v-model="password" placeholder="Mot de passe" :disabled="!isEditing" :class="{view: !isEditing}" >*********
                                <div v-if="!$v.password.required && $v.password.$dirty">Le mot de passe est obligatoire!</div>
                                <div v-if="!$v.password.minLength && $v.password.$dirty">Le mot de passe doit contenir 8 caractères!</div>
                            </div>
                        </div>
                        <p class="bio">Biographie</p>
                        <p v-if="!isEditing" id="bio_text" style="white-space: pre-line">{{user.bio}}</p>
                        <textarea v-else name="biographie" type="text" id="bio_text" v-model="bio" cols="30" rows="10" maxlength="250" placeholder="Ajoutez une présentation max 250 caractères..." help="Max: 250 caractères." :disabled="!isEditing" :class="{view: !isEditing}"></textarea>   
 
                        <div class="bio_btn">
                                <button class="button_info" @click="isEditing = !isEditing" v-if="!isEditing" >Modifier les informations</button> 
                                <button type="submit" class="button_info" @click="userProfile()" v-else-if="isEditing" >Sauvegarder</button>
                                <button class="button_info" @click="isEditing = false" v-if="isEditing">Annuler</button>      
                                <button class="logout" v-on:click="logout(users.id_user)">Déconnexion</button> 
                                <button class="btn_delete" v-on:click="userDelete(users.id_user)" >Supprimer mon compte</button> 
                        </div>
                </div>           
            </form>          
        </section>
        <Footer />    
    </div>
</template>
 
<script>
import HeaderConnexion from '@/components/HeaderConnexion.vue'
import Footer from '@/components/Footer.vue'
import Vue from 'vue'
import axios from 'axios'
import VueAxios from 'vue-axios'
import {required, minLength, alpha, email} from 'vuelidate/lib/validators'
 
Vue.use(VueAxios, axios)
 
const token = localStorage.getItem("token")
const id_user = localStorage.getItem("id_user")
console.log(id_user)
console.log(token)
 
export default {
    name: 'Account',
    components: {
        HeaderConnexion,
        Footer
    },
    data() {
        return {  
            errored: false,
            errors:[],
            isEditing: false, 
            id_user: localStorage.getItem('id_user'),
            users:[],
            lastname: "",
            firstname: "",
            username: "",
            email: localStorage.getItem('email'),
            password:"",
            bio: "",
            token: localStorage.getItem('token'),       
        };
    },  
    validations: {
        lastname :  {
        required,
        minLength: minLength(2),
        alpha
        } ,
        firstname: { 
        required,
        minLength: minLength(2),
        alpha,
        },
        username: { 
        required,
        alpha,
        minLength: minLength(4)
        },
        email: { 
        required,
        email
        },
        password: { 
        required,
        minLength: minLength(8) 
        },
    },
    methods: {
        userProfile (){
            this.$v.$touch();
            if(!this.$v.$invalid){
                
                console.log(`lastname:${this.lastname},firstname:${this.firstname},username:${this.username},email:${this.email},password:${this.password},bio:${this.bio}`)
                
            }
            //if(this.lastname && this.firstname && this.username && this.email && this.password){
                const id_user = localStorage.getItem('id_user')
                const headers = {
                    headers: {
                        'Content-type': 'application/json',
                        'Authorization': `Bearer ${token}`
                    }
                }
                const dataUser = {
                    lastname : this.lastname,
                    firstname : this.firstname,
                    username : this.username,
                    bio : this.bio,
                    email : this.email,
                    password : this.password
                }
                console.log(dataUser)
                
 
                
                    this.axios
                .put(`http://localhost:3000/api/auth/user/${id_user}`,dataUser, headers, {
                    params:{
                        id_user: id_user
                    },  
                    lastname : this.lastname,
                    firstname : this.firstname,
                    username : this.username,
                    bio : this.bio,
                    email : this.email,
                    password : this.password 
                })
                .then((response) => {
                    response.data
                    console.log(response)
                
                    //this.$router.push('/Post')
                })
                .catch(error =>{ 
                    // if(this.email != 0 ){
                    //     return error
                    // }
                
                    console.log(error)
                   this.errored = true 
                    
                }) 
            //}else{
                //this.errored = true 
                
            //     if(!this.lastname){
            //     this.errors.push ('Le nom est obligatoire');
            //     }
            //     if(!this.firstname){
            //     this.errors.push('Le prénom est obligatoire!')
            //     }
            //     if(!this.username){
            //     this.errors.push('Le pseudo est obligatoire!')
            //     }
            //     if(!this.email){
            //     this.errors.push('L email est obligatoire!')
            //     }
            //     if(this.email != 0){
            //         this.errors.push('l email existe déjà!')
            //     }
            //     // e.preventDefault()
        
            
        },
        logout(){
            localStorage.removeItem("token");
            localStorage.removeItem("id_user");
            localStorage.removeItem("email")
            this.$router.push('/')
        },
        
        userDelete() {
            const id_user = localStorage.getItem('id_user')
            const token = localStorage.getItem('token')
            //const email = localStorage.getItem('email')
            const header = {
                headers: {
                    'Content-type': 'application/json',
                    'Authorization': `Bearer ${token}`
                }
            }
            this.axios
            .delete(`http://localhost:3000/api/auth/user/${id_user}`, header)
            .then((response) => {
                console.log(response)
                // this.getData() 
                this.$router.push('/')
                localStorage.removeItem("id_user")              
                localStorage.removeItem("token")
                localStorage.removeItem("email")
            }).catch((error) => {
                console.log({ error })
            })      
        },
    },
    beforeMount(){
        const token = localStorage.getItem('token')
        const header = {
            headers: {
                'Content-type': 'application/json',
                'Authorization': `Bearer ${token}`
            }
        }
        this.axios.get(`http://localhost:3000/api/auth/user/${id_user}`, header)               
        .then(response => {    
                console.log(response)
                this.users = response.data
                console.log(this.users)  
        })
        .catch((error) => {   
            console.log({error})
            this.$router.push('/')
           
        })
    } 
}
</script>

Code côté backend:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
exports.modifyUser =  async (req, res) => {
    //const id_user = parseInt(req.params.id_user)
    //const { username , email, lastname, firstname } = req.body 
    const password_regex = /^(?=.*[0-9]+.*)(?=.*[a-zA-Z]+.*)[0-9a-zA-Z]{8,}$/; 
    const encryptedPassword = await bcrypt.hash(req.body.password, 10)
//         console.log(encryptedPassword) 
//         //const password = req.body.password
    if(req.body.email){
        connection.query('SELECT * FROM users WHERE id_user= ?', [req.params.id_user], (err, result)=> {
            if(err){
                res.status(401).json({err :'aucun utilisateur correspondant à l id'})
                console.log('aucun utilisateur correspondant à l id')
            }else {
                if(result[0] != undefined){
                    connection.query('SELECT * FROM users WHERE email = ? ',[req.body.email], (err, result)=>{
                        if(err){
                            res.status(401).json({err :'auncun email correspond'})
                            console.log('aucun email correspond')
                        }else {
                            if(result[0] != undefined){
                                res.status(401).json({err: 'l email existe déjà'})
                                console.log('l email existe déjà!')
                            }else {
                                connection.query('UPDATE users SET username = ?, email = ?, lastname = ?, firstname = ?, password = ?, bio = ? WHERE id_user= ?',[req.body.username, req.body.email, req.body.lastname, req.body.firstname,`${encryptedPassword}`,  req.body.bio, req.params.id_user ],(err, result) =>{
                                    if(err){
                                        res.status(401).json({err:'la modification à échoué!'})
                                        console.log('la modification à échoué!')
                                    }else {
                                        res.status(201).json({message:'modification réussi!'})
                                        console.log('modification réussi!')
                                    }
                                })
                            } 
                        }
                    })
                }else{
                    res.status(401).json({err:'aucun id'})
                    console.log('aucun id_user')
                }
 
            }
        })
    }
}
Nom : 1.jpg
Affichages : 89
Taille : 124,5 Ko
Nom : 2.jpg
Affichages : 78
Taille : 106,2 Ko