2017-02-01 17 views
6

मैं जेएचस्प्टर 3.12.2 का उपयोग कर एक एप्लीकेशन विकसित कर रहा हूं।जेएचप्स्टर: अतिरिक्त जानकारी वाले उपयोगकर्ता को पंजीकृत करना

चूंकि मुझे जेएचप्स्टर द्वारा प्रदान की जाने वाली चीज़ों की तुलना में अधिक जानकारी की आवश्यकता है, इसलिए मैंने एक इकाई उपयोगकर्ता एक्स्ट्रा बनाया जिसमें दो स्ट्रिंग्स हैं: एक फोन नंबर और स्काइप पता। मैंने इस इकाई को JHI_User से एक से एक रिश्ते में जोड़ा है।

अब जिस समस्या का सामना करना पड़ रहा है वह है, जब कोई उपयोगकर्ता पंजीकरण कर रहा है, तो मैं पंजीकृत उपयोगकर्ता से जुड़ा नया उपयोगकर्ता एक्स्ट्रा बनाना चाहता हूं।

इसे प्राप्त करने के लिए, मैंने क्लाइंट पक्ष पर कई चीजों की कोशिश की है।

मानक जेएचप्स्टर रजिस्टर पेज काम करने का तरीका vm.registerAccount नामक चर का उपयोग करके है जो पहले नाम, अंतिम नाम, लॉगिन, पासवर्ड आदि रखता है।

मैंने अपने फोन नंबर और स्काइप को पकड़कर एक और चर Vm.userExtra का उपयोग करने का प्रयास किया है। फिर, मैं कई बातें करने की कोशिश की:

  • register.controller.js में, मैं createaccount कार्य करने के लिए मेरी userExtra पारित कर दिया:

    Auth.createAccount(vm.registerAccount, vm.userExtra).then(function() { 
            vm.success = 'OK'; 
           }).catch(function (response) { 
            vm.success = null; 
            if (response.status === 400 && response.data === 'login already in use') { 
             vm.errorUserExists = 'ERROR'; 
            } else if (response.status === 400 && response.data === 'e-mail address already in use') { 
             vm.errorEmailExists = 'ERROR'; 
            } else { 
             vm.error = 'ERROR'; 
            } 
           });
  • मैं auth.service.js की createaccount समारोह संशोधित परिवर्तन किए पालन करने के लिए:

    function createAccount (account, userExtra, callback) { 
          var cb = callback || angular.noop;

     return Register.save(account, userExtra, 
          function() { 
           return cb(account); 
          }, 
          function (err) { 
           this.logout(); 
           return cb(err); 
          }.bind(this)).$promise; 
        }</pre> 
    
  • अंत में, मैं सर्वर साइड पर AccountResource.java की registerAccount समारोह अद्यतन:

    public ResponseEntity registerAccount(@Valid @RequestBody ManagedUserVM managedUserVM, UserExtra userExtra) { ... }

लेकिन registerAccount समारोह भी मैं क्या याद से क्रियान्वित नहीं किया गया था।

मैं भी इस तरह register.controller.js की createaccount समारोह के कॉलबैक में नया उपयोगकर्ता जोड़ने की कोशिश की:

Auth.createAccount(vm.registerAccount).then(function (result) { 
       vm.userExtra.user = result; 
       UserExtra.save(vm.userExtra, function() { // success }, function() { // fail }); 
       vm.success = 'OK'; 
      })... 

लेकिन नए UserExtra सहेजने का प्रयास करते मैं केवल एक त्रुटि हो रही थी।

मुझे पूरा यकीन है कि मुझे AccountResource.java के अंदर रजिस्टर खाता() फ़ंक्शन को संशोधित करने की आवश्यकता है, लेकिन मैं केवल उस अतिरिक्त जानकारी को पुनर्प्राप्त नहीं कर सकता जिसे मैं क्लाइंट साइड से भेजने की कोशिश कर रहा हूं। मैंने इस फ़ंक्शन के अंदर एक नया उपयोगकर्ता बनाने में कामयाब रहा और इसे JHI_User से लिंक किया, लेकिन अतिरिक्त जानकारी के बिना।

यह बहुत संभावना है कि किसी को पहले से ही इस मुद्दे का सामना करना पड़ा है, संभवतः उस समस्या का सबसे अच्छा समाधान क्या हो सकता है? समाधान के साथ

संपादित करें:

गेल Marziou के लिए धन्यवाद, मैं मेरी समस्या तय की।

Here's a minimal example of a project समाधान का उपयोग कर मैं यहां वर्णन कर रहा हूं।

ग्राहक पक्ष पर, रजिस्टर.html पृष्ठ में जो मैंने अपने उपयोग के लिए लिखा है, मेरे पास दो फ़ील्ड vm से बंधे हैं।registerAccount गुण:

<input class="form-control" id="phone" ng-model="vm.registerAccount.phone" placeholder="{{'global.form.phone.placeholder' | translate}}" /> 
... 
<input class="form-control" id="skype" ng-model="vm.registerAccount.skype" placeholder="{{'global.form.skype.placeholder' | translate}}" /> 

ManagedUserVM में मैं वास्तव में सिर्फ मेरी दो क्षेत्रों और उनके ही टिककर खेल कहा:

private String phone; 

private String skype; 

public String getPhone() { 
    return phone; 
} 

public String getSkype() { 
    return skype; 
} 

मैं उपयोगकर्ता और UserExtra आईडी मैप करने के लिए इतना है कि वे नजर आता रहे हैं मेरी UserExtra वर्ग बदल दिया है। यह बहाली प्रक्रिया को तेज करता है और अधिक समझ में आता है के रूप में UserExtra वास्तव में उपयोगकर्ता के लिए सिर्फ एक विस्तार है:

public class UserExtra implements Serializable { 

    private static final long serialVersionUID = 1L; 

    @Id 
    private Long id; 

    @Column(name = "phone") 
    private String phone; 

    @Column(name = "skype") 
    private String skype; 

    @OneToOne 
    @MapsId 
    private User user; 
    ... 
} 

मैं एक नए कस्टम CreateUser (कहा जाता है) UserService में जो बुनियादी लोगों के अलावा मुझे अपना दो क्षेत्रों की जरूरत समारोह बनाया। मैं मौजूदा समारोह को अद्यतन नहीं किया ताकि मैं परीक्षण वर्गों को बदलने की जरूरत नहीं है:

public User createUser(String login, String password, String firstName, String lastName, String email, 
         String langKey, String phone, String skype) { 

    User newUser = new User(); 
    Authority authority = authorityRepository.findOne(AuthoritiesConstants.USER); 
    Set<Authority> authorities = new HashSet<>(); 
    String encryptedPassword = passwordEncoder.encode(password); 
    newUser.setLogin(login); 
    // new user gets initially a generated password 
    newUser.setPassword(encryptedPassword); 
    newUser.setFirstName(firstName); 
    newUser.setLastName(lastName); 
    newUser.setEmail(email); 
    newUser.setLangKey(langKey); 
    // new user is not active 
    newUser.setActivated(false); 
    // new user gets registration key 
    newUser.setActivationKey(RandomUtil.generateActivationKey()); 
    authorities.add(authority); 
    newUser.setAuthorities(authorities); 
    userRepository.save(newUser); 
    userSearchRepository.save(newUser); 
    log.debug("Created Information for User: {}", newUser); 

    // Create and save the UserExtra entity 
    UserExtra newUserExtra = new UserExtra(); 
    newUserExtra.setUser(newUser); 
    newUserExtra.setPhone(phone); 
    newUserExtra.setSkype(skype); 
    userExtraRepository.save(newUserExtra); 
    userExtraSearchRepository.save(newUserExtra); 
    log.debug("Created Information for UserExtra: {}", newUserExtra); 

    return newUser; 
} 

अंत में, मैं दो अतिरिक्त क्षेत्रों का उपयोग कर अपने कस्टम फ़ंक्शन को कॉल करने AccountResource की registerAccount() फ़ंक्शन अद्यतन:

public ResponseEntity<?> registerAccount(@Valid @RequestBody ManagedUserVM managedUserVM) { 

    HttpHeaders textPlainHeaders = new HttpHeaders(); 
    textPlainHeaders.setContentType(MediaType.TEXT_PLAIN); 

    return userRepository.findOneByLogin(managedUserVM.getLogin().toLowerCase()) 
     .map(user -> new ResponseEntity<>("login already in use", textPlainHeaders, HttpStatus.BAD_REQUEST)) 
     .orElseGet(() -> userRepository.findOneByEmail(managedUserVM.getEmail()) 
      .map(user -> new ResponseEntity<>("e-mail address already in use", textPlainHeaders, HttpStatus.BAD_REQUEST)) 
      .orElseGet(() -> { 
       User user = userService 
        .createUser(managedUserVM.getLogin(), managedUserVM.getPassword(), 
         managedUserVM.getFirstName(), managedUserVM.getLastName(), 
         managedUserVM.getEmail().toLowerCase(), managedUserVM.getLangKey(), 
         managedUserVM.getPhone(), managedUserVM.getSkype()); 

       mailService.sendActivationEmail(user); 
       return new ResponseEntity<>(HttpStatus.CREATED); 
      }) 
    ); 
} 
+0

हाय @ पॉल-एटियेन, मैंने अभी आपकी नोक को जिप्स्टर साइट पर देखा है। एक सवाल: क्या आप इस बारे में गिटूब या कुछ समान पर एक न्यूनतम पूर्ण उदाहरण अपलोड करना चाहते हैं? मैंने पोस्टग्रेस्क्ल डेटाबेस और सबसे नया जिप्स्टर --skip-client विकल्प के साथ ऐसा करने की कोशिश की, लेकिन यह काम नहीं करेगा, और अब मैं खुद से पूछ रहा हूं कि मुझे कुछ याद आ रहा है, जैसे "मुझे घोषित करने की ज़रूरत है" @OneToOne 'उपयोगकर्ता इकाई में भी? क्या जनरेटर या हाथ से बनाई गई संस्थाएं हैं? क्या उपयोगकर्ता एक्स्ट्रा इकाई को' @ एंटिटी 'एनोटेशन' और इस तरह के प्रश्नों की आवश्यकता है। बहुत अच्छा होगा! –

+1

हाय @ गेटोवरिट-डीई, मेरे पास वास्तव में आपके अनुरोध को देखने के लिए समय नहीं होगा, लेकिन मेरे पास कल ऐसा करने का समय होना चाहिए। –

+0

हाय @ पॉल-एटियेन, यह बिल्कुल अच्छा होगा, धन्यवाद! –

उत्तर

1

ManagedUserVM एक दृश्य के मॉडल तो सबसे आसान तरीका यह करने के लिए अपने अतिरिक्त क्षेत्रों को जोड़ने के लिए है, एक दृश्य मॉडल कई संस्थाओं की एक समग्र हो सकता है। इस तरह आप अपनी कोणीय सेवा नहीं बदलते हैं, तो आपके क्लाइंट कोड को यह जानने की आवश्यकता नहीं है कि सर्वर पर उपयोगकर्ता कैसे संग्रहीत किया जाता है।

फिर सर्वर पर, आपको UserExtra इकाई को User के रूप में उत्पन्न आईडी के बजाय @MapIds का उपयोग करने के लिए संशोधित करना चाहिए। विवरण के लिए यह बहुत nice article देखें।

+0

बहुत बहुत धन्यवाद, यह काम किया। मैंने इसे अपनी मूल पोस्ट में उल्लेख नहीं किया, लेकिन मैंने पहले से ही प्रबंधित यूज़रवीएम में फ़ील्ड जोड़ने की कोशिश की थी। ऐसा लगता है कि एकमात्र चीज जिसे मैं याद कर रहा था, आईडी को मैप कर रहा था, मुझे यह भी पता नहीं था कि यह संभव था। मेरे पास अभी एक पूछताछ है, सर्वर कैसे जानता है कि क्लाइंट क्या भेजता है उसके अनुसार कौन से फ़ील्ड पॉप्युलेट करना है? मैंने वास्तव में खेतों और उनके गेटर्स को जोड़ा, कोई विशेष कन्स्ट्रक्टर नहीं। क्या यह केवल इसलिए है क्योंकि खेतों के नाम मेल खाते हैं? –

+0

शायद लेकिन यह सत्यापित किया जाना चाहिए। क्या आप कुछ कोड दिखा सकते हैं? मुझे यह भी लगता है कि इसे https://jhipster.github.io/tips/ –

+0

पर एक टिप के रूप में साझा करने के लिए बहुत उपयोगी होना चाहिए ठीक है, मेरे पास एक और समस्या है जिसे मैं पूर्ण कार्य कोड दिखाने और खींचने से पहले ठीक करना चाहता हूं जेएचप्स्टर के टिप सेक्शन पर अनुरोध करें। मैं AccountResource.java के रजिस्टर खाता() फ़ंक्शन में अपना फोन नंबर और स्काइप खाता पुनर्प्राप्त कर सकता हूं लेकिन उन्हें अपने डेटाबेस में सहेजने के लिए संघर्ष कर रहा हूं। मैं इस पर काम करूंगा और हल होने पर आपके पास वापस आऊंगा। –

संबंधित मुद्दे