рд╕рд░реНрд╡рд░ рдкрд░ Ext JS

рдлреЛрдЯреЛ рдпрд╣рд╛рдБ рд╕реЗ https://github.com/tj/palette рдЬрдм рдпрд╣ рдПрдХреНрд╕рдЯ рдЬреЗрдПрд╕ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреА рдмрд╛рдд рдЖрддреА рд╣реИ, рддреЛ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮреЛрдВ рдиреЗ рдХрд╛рдлреА рдирдХрд╛рд░рд╛рддреНрдордХрддрд╛ рд╕реБрдиреА рд╣реИ: рднрд╛рд░реА, рдорд╣рдВрдЧреА, рдЫреЛрдЯреА рдЧрд╛рдбрд╝реАред рдПрдХ рдирд┐рдпрдо рдХреЗ рд░реВрдк рдореЗрдВ, рдЕрдзрд┐рдХрд╛рдВрд╢ рд╕рдорд╕реНрдпрд╛рдПрдВ рдЗрд╕реЗ рдкрдХрд╛рдиреЗ рдореЗрдВ рдЕрд╕рдорд░реНрдерддрд╛ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИрдВред рд╕рднреА рд╕реАрдПрд╕рдПрд╕ рдХреЗ рд╕рд╛рде рд╕рд╛рдВрдЪрд╛ рд╕реАрдПрдордбреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рдЗрдХрдЯреНрдареЗ рд╣реБрдП рдкреНрд░реЛрдЬреЗрдХреНрдЯ, рдЫрд╡рд┐рдпреЛрдВ рдХрд╛ рдЙрддреНрдкрд╛рджрди 1 рдПрдордмреА рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рд╣реЛрддрд╛ рд╣реИ, рдЬреЛ рдПрдХ рд╣реА рдХреЛрдгреАрдп рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рд╣реИред рд╣рд╛рдВ, рдФрд░ рдЧреНрд▓рд┐рдЪ рдЕрдзрд┐рдХ рдирд╣реАрдВ рд╣реИрдВ ...

рдпрд╣ рд╕рдВрднрд╡ рд╣реИ рдХрд┐ рд╕реНрдиреЗрдЪрд╛ рдХреЗ рджрд┐рдорд╛рдЧ рдХреА рдЙрдкрдЬ рдЗрд╕ рд╡рдВрд╢ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реЛ, рд▓реЗрдХрд┐рди рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЗрд╕рдХреЗ рд░рд╛рдЬрд╕реА рд╡рд┐рд░реЛрдзрд┐рдпреЛрдВ рдХрд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рдЧрдВрднреАрд░ рдЗрдВрдЯреНрд░рд╛рдиреЗрдЯ рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╕рдорд╛рдзрд╛рди рдЦреЛрдЬрдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИред

рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рдПрдХреНрд╕рдЯ рдЬреЗрдПрд╕ рдореЗрдВ рд╕рдмрд╕реЗ рдореВрд▓реНрдпрд╡рд╛рди рдЪреАрдЬ рдпреВрдЖрдИ рдШрдЯрдХреЛрдВ рдХрд╛ рд╕рдВрдЧреНрд░рд╣ рдирд╣реАрдВ рд╣реИ, рдмрд▓реНрдХрд┐ рдПрдХ рдЕрдЪреНрдЫрд╛ рдУрдУрдкреА рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рд╣реИред рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рд╣рд╛рд▓ рдХреЗ рд╡рд░реНрд╖реЛрдВ рдореЗрдВ рдЬреЗрдПрд╕ рдХреЗ рддреЗрдЬреА рд╕реЗ рд╡рд┐рдХрд╛рд╕ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реБрдП, 7 рд╕рд╛рд▓ рдкрд╣рд▓реЗ рдПрдХреНрд╕рдЯ рдЬреЗрдПрд╕ рдореЗрдВ рд▓рд╛рдЧреВ рдХреА рдЧрдИ рдХрдИ рдЖрд╡рд╢реНрдпрдХ рдЪреАрдЬреЗрдВ рдЕрднреА рднреА рдореВрд▓ рд╡рд░реНрдЧреЛрдВ (рдирд╛рдо рд╕реНрдерд╛рди, рдорд┐рд╢реНрд░рдг, рд╕реНрдерд┐рд░ рдЧреБрдг, рдорд╛рддрд╛-рдкрд┐рддрд╛ рдХреЗ рддрд░реАрдХреЛрдВ рдХреА рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдХреЙрд▓рд┐рдВрдЧ) рдореЗрдВ рдЧрд╛рдпрдм рд╣реИрдВред рдЗрд╕рдиреЗ рдореБрдЭреЗ рдХреБрдЫ рд╕рд╛рд▓ рдкрд╣рд▓реЗ рдмреИрдХреЗрдВрдб рдореЗрдВ рдПрдХреНрд╕рдЯ рдЬреЗрдПрд╕ рдХрдХреНрд╖рд╛рдУрдВ рдХреЗ рдкреНрд░рдХреНрд╖реЗрдкрдг рдХреЗ рд╕рд╛рде рдкреНрд░рдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЗрд░рд┐рдд рдХрд┐рдпрд╛ред рдЗрд╕реА рддрд░рд╣ рдХреЗ рдкрд╣рд▓реЗ рдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рд╣реА рд╣реИрдмреЗ рдкрд░ рдкреЛрд╕реНрдЯ рдХрд┐рдпрд╛ рдерд╛ред рдпрд╣ рд▓реЗрдЦ рдкреБрд░рд╛рдиреЗ рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреЗ рдПрдХ рдирдП рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдФрд░ рдХрдИ рдирдП рд▓реЛрдЧреЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИред

рд╢реБрд░реВ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдЗрд╕ рдкреНрд░рд╢реНрди рдкрд░ рдзреНрдпрд╛рди рджреЗрдВ: рдЖрдкрдХреЛ рдХреНрдпрд╛ рд▓рдЧрддрд╛ рд╣реИ, рдЗрд╕реЗ рдХрд╣рд╛рдБ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдиреАрдЪреЗ рдХреЛрдб рд╕реНрдирд┐рдкреЗрдЯ рдХреНрдпрд╛ рдХрд░рддрд╛ рд╣реИ?

Ext.define('Module.message.model.Message', { .... /* scope:server */ ,async newMessage() { ......... this.fireEvent('newmessage', data); ...... } ... }) 

рдЗрд╕ рдХреЛрдб рдХреЛ рд╕рд░реНрд╡рд░ рдкрд░ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рд╕рд░реНрд╡рд░ рд╕реЗ рдЬреБрдбрд╝реЗ рд╕рднреА рдХреНрд▓рд╛рдЗрдВрдЯ рдорд╢реАрдиреЛрдВ рдкрд░ "Module.message.model.Message" рд╡рд░реНрдЧ рдХреЗ рд╕рднреА рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ "newmessage" рдЗрд╡реЗрдВрдЯ рдЙрдард╛рддрд╛ рд╣реИред

рд╕рд░реНрд╡рд░-рд╕рд╛рдЗрдб рдПрдХреНрд╕рдЯ рдЬреЗрдПрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛рдУрдВ рдХреЛ рд╕реНрдкрд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдПрдХ рд╕рд░рд▓ рдЪреИрдЯ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░реЗрдВрдЧреЗред рд╣рдо рдХрд┐рд╕реА рднреА рд▓реЙрдЧрд┐рди рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ, рдмрд╕ рдЬрдм рдЖрдк рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рджрд░реНрдЬ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдПрдХ рдЙрдкрдирд╛рдо рджрд░реНрдЬ рдХрд░рддрд╛ рд╣реИред рдЖрдк рд╕рд╛рдорд╛рдиреНрдп рдпрд╛ рдирд┐рдЬреА рд╕рдВрджреЗрд╢ рдкреЛрд╕реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЪреИрдЯ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдордп рдореЗрдВ рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЬреЛ рд▓реЛрдЧ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ рд╡реЗ рд╡реНрдпрд╡рд╕рд╛рдп рдореЗрдВ рдЗрд╕ рд╕рднреА рдЕрд░реНрдерд╡реНрдпрд╡рд╕реНрдерд╛ рдХреЛ рддреБрд░рдВрдд рдЖрдЬрд╝рдорд╛ рд╕рдХрддреЗ рд╣реИрдВ

рд╕реНрдерд╛рдкрдирд╛


рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ 9 + рдФрд░ рд░реЗрдбрд┐рд╕-рд╕рд░реНрд╡рд░ рдиреЛрдбрдЬ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ (рдпрд╣ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рд╡реЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕реНрдерд╛рдкрд┐рдд рд╣реИрдВ)ред

 git clone https://github.com/Kolbaskin/extjs-backend-example cd extjs-backend-example npm i 

рд╣рдо рд╕рд░реНрд╡рд░ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ:

 node server 

рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ, рд▓реЛрдХрд▓рд╣реЛрд╕реНрдЯ рдкреЗрдЬ рдЦреЛрд▓реЗрдВ: 3000 / www / рдСрд░реНрдЯрд┐рдХрд▓ /
рдХреБрдЫ рдЙрдкрдирд╛рдо рджрд░реНрдЬ рдХрд░реЗрдВ рдФрд░ рдПрдВрдЯрд░ рджрдмрд╛рдПрдВред

рдкрд░рд┐рдпреЛрдЬрдирд╛ рдПрдХ рдбреЗрдореЛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдкреБрд░рд╛рдиреЗ рдмреНрд░рд╛рдЙрдЬрд╝рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рд╕рдорд░реНрдерди рдирд╣реАрдВ рд╣реИ (рдИрдПрд╕ 8 рдбрд┐рдЬрд╛рдЗрди рд╣реИрдВ), рдирдП рдХреНрд░реЛрдо рдпрд╛ рдПрдлрдПрдл рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред

рд╕рд░реНрд╡рд░


рдХреНрд░рдо рдореЗрдВ рдЪрд▓рддреЗ рд╣реИрдВред

рд╕рд░реНрд╡рд░ рдХреЛрдб (server.js)

 //   http-  express //   Ext JS     express const express = require('express'); const staticSrv = require('extjs-express-static'); const app = express(); const bodyParser = require('body-parser'); //    global = { config: require('config') } //     Ext JS require('extjs-on-backend')({ //     express app, //         wsClient: 'Base.wsClient' }); //    Ext.Loader.setPath('Api', 'protected/rest'); Ext.Loader.setPath('Base', 'protected/base'); Ext.Loader.setPath('Www', 'protected/www'); //   http   app.use( bodyParser.json() ); app.use(bodyParser.urlencoded({ extended: true })); //     Ext JS  app.use('/api/auth', Ext.create('Api.auth.Main')); app.use('/www/auth', Ext.create('Www.login.controller.Login')); //    app.use(staticSrv(__dirname + '/static')); //   const server = app.listen(3000, () => { console.log('server is running at %s', server.address().port); }); 

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╣рд╛рдВ рд╕рдм рдХреБрдЫ рдПрдХреНрд╕рдкреНрд░реЗрд╕ рдкрд░ рд╕рд░реНрд╡рд░ рдХреЗ рд▓рд┐рдП рдХрдо рдпрд╛ рдЬреНрдпрд╛рджрд╛ рдорд╛рдирдХ рд╣реИред рдмреНрдпрд╛рдЬ рд╕рдВрдмрдВрдзрд┐рдд рдорд╛рд░реНрдЧреЛрдВ рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХреНрд╕рдЯ рдЬреЗрдПрд╕ рд╡рд░реНрдЧреЛрдВ рдХрд╛ рд╕рдорд╛рд╡реЗрд╢ рд╣реИ:

 app.use('/api/auth', Ext.create('Api.auth.Main')); app.use('/www/auth', Ext.create('Www.login.controller.Login')); 

рдЕрдиреНрдп рдПрдкреАрдЖрдИ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди


Api.auth.Main рд╡рд░реНрдЧ REST API (рд╕рдВрд░рдХреНрд╖рд┐рдд / рдмрд╛рдХреА / рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХ / Main.js) рдХреЗ рд▓рд┐рдП рдЕрдиреБрд░реЛрдз рдХрд░рддрд╛ рд╣реИред

 Ext.define('Api.auth.Main', { extend: 'Api.Base', //   //     routes: [ { path: '/', get: 'login'}, { path: '/restore', post: 'restoreLogin' }, { path: '/registration', post: 'newuser'}, { path: '/users', get: 'allUsers'} ] //     : // {query: <...>, params: <...>, body: <...>} ,async login(data) { return {data:[{ id:1, subject: 111, sender:222, }]} } ,async restoreLogin() { ... } ,async newuser() { ... } ,async allUsers() { .... } }) 

рд╕рд░реНрд╡рд░ рдкрд░ XTemplate рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ HTML рдкреГрд╖реНрда рдкреАрдврд╝реА


рджреВрд╕рд░реА рд╢реНрд░реЗрдгреА, Www.login.controller.Login, рдПрдХ рд▓реЙрдЧрд┐рди рдлрд╝реЙрд░реНрдо (рд╕рдВрд░рдХреНрд╖рд┐рдд / www / рд▓реЙрдЧрд┐рди / рдирд┐рдпрдВрддреНрд░рдХ / Login.js) рдХреЗ рд╕рд╛рде рдПрдХ рдирд┐рдпрдорд┐рдд HTML рдкреГрд╖реНрда рдмрдирд╛рддрд╛ рд╣реИред

 Ext.define('Www.login.controller.Login', { //      "" : // ,    .. extend: 'Www.Base' //    //   ,   .. ,baseTpl: 'view/inner' //     // ,   ,loginFormTpl: 'login/view/login' //  ,routes: [ { path: '/', get: 'loginForm', post: 'doLogin'} ] //  html   //       ,async loginForm () { return await this.tpl(this.loginFormTpl, { pageTitle: 'Login page', date: new Date() }); } ,async doLogin (params, res) { if(params.body.name && /^[a-z0-9]{2,10}$/i.test(params.body.name)) { this.redirect(`/index.html?name=${params.body.name}`, res); return; } return await this.tpl(this.loginFormTpl, { pageTitle: 'Login page', date: new Date() }); } }) 

рдЯреЗрдореНрдкрд▓реЗрдЯ рдорд╛рдирдХ XTemplate (рд╕рдВрд░рдХреНрд╖рд┐рдд / www / рд▓реЙрдЧрд┐рди / рджреЗрдЦрдиреЗ / login.tpl) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ

 <h2>{pageTitle} (date: {[Ext.Date.format(values.date,'dmY')]})</h2> <form method="post"> <input name="name" placeholder="name"> <button type="submit">enter</button> </form> 

рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рд╕рдм рдХреБрдЫ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдорд╛рдирдХ рд╕реЗрдЯ рд╣реИ, рдПрдХ рд╕рд╛рд╡рдзрд╛рдиреАрдкреВрд░реНрд╡рдХ рдкрд╛рдардХ рдХрд╣реЗрдВрдЧреЗ, рдФрд░ рдЗрд╕рдХреЗ рд▓рд┐рдП рд╕рд░реНрд╡рд░ рдХреЛ рдПрдХреНрд╕рдЯреА рдЬреЗрдПрд╕ рдХреЗ рд╕реНрдерд╛рдирд╛рдВрддрд░рдг рдХреЗ рд╕рд╛рде рдЗрд╕ рдЙрджреНрдпрд╛рди рдХреЛ рдмрд╛рдбрд╝рдиреЗ рдХреА рдХреЛрдИ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рдереАред рдЗрд╕рд▓рд┐рдП, рд╣рдо рд▓реЗрдЦ рдХреЗ рджреВрд╕рд░реЗ рднрд╛рдЧ рдкрд░ рдЪрд▓рддреЗ рд╣реИрдВ, рдЬреЛ рдпрд╣ рджрд┐рдЦрд╛рдПрдЧрд╛ рдХрд┐ рдпрд╣ рд╕рдм рдХрд┐рд╕ рдЙрджреНрджреЗрд╢реНрдп рд╕реЗ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред

рдЧреНрд░рд╛рд╣рдХ


рдЖрдЗрдП рд╕реНрдереИрддрд┐рдХ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рд╕рд╛рдорд╛рдиреНрдп рдХреНрд▓рд╛рдЗрдВрдЯ Ext JS рдПрдкреНрд▓реАрдХреЗрд╢рди рдмрдирд╛рдПрдВред рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдореИрдВ рдЬрд╛рдирдмреВрдЭрдХрд░ рд╕реАрдПрдордбреА рдХреЗ рдЙрдкрдпреЛрдЧ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реВрдВ, рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рд╕реЗ рдирд┐рд░реНрдорд┐рдд рдПрдХреНрд╕рдЯ-рдСрд▓ рдФрд░ рдорд╛рдирдХ рдереАрдо рд▓рд┐рдпрд╛ред рд╡рд┐рдзрд╛рдирд╕рднрд╛ рдореБрджреНрджреЗ рдПрдХ рдЕрд▓рдЧ рд╡рд┐рд╖рдп рд╣реИ, рдЬреЛ, рд╢рд╛рдпрдж, рдПрдХ рдЕрд▓рдЧ рдкрдж рд╕рдорд░реНрдкрд┐рдд рдХрд░реЗрдЧрд╛ред

рдпрд╣ рд╕рдм app.js рд╕реЗ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ

 //   Ext.Loader.setConfig({ enabled: true, paths: { "Core": "app/core", "Admin": "app/admin", "Module": "app/admin/modules", "Ext.ux": "ext/ux" } }); //    this.token = Ext.data.identifier.Uuid.createRandom()(); //      //    () //    (   ) Ext.WS = Ext.create('Core.WSocket', { token: this.token, user: new URLSearchParams(document.location.search).get("name") }); //   Ext.application({ name: 'Example', extend: 'Ext.app.Application', requires: ['Admin.*'], autoCreateViewport: 'Admin.view.Viewport' }) 

рдПрдХ рд╡реЗрдм рд╕реЙрдХреЗрдЯ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд┐рдВрджреБ рд╣реИ, рдпрд╣ рд╡рд╣ рд╣реИ рдЬреЛ рдЖрдкрдХреЛ рдиреАрдЪреЗ рд╡рд░реНрдгрд┐рдд рд╕рднреА рдЬрд╛рджреВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред

рдкреГрд╖реНрда рдкрд░ рддрддреНрд╡реЛрдВ рдХрд╛ рд▓реЗрдЖрдЙрдЯ Admin.view.Viewport рд╡рд░реНрдЧ (рд╕реНрдерд┐рд░ / рдПрдкреНрд▓рд┐рдХреЗрд╢рди / рджреГрд╢реНрдп / Viewport.js) рдореЗрдВ рдирд┐рд╣рд┐рдд рд╣реИред рд╡рд╣рд╛рдВ рдХреБрдЫ рднреА рджрд┐рд▓рдЪрд╕реНрдк рдирд╣реАрдВ рд╣реИред

рдореБрдЦреНрдп рдХрд╛рд░реНрдпрд╛рддреНрдордХ рддрддреНрд╡ (рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕реВрдЪреА, рд╕рдВрджреЗрд╢ рдмрд╛рд░ рдФрд░ рднреЗрдЬрдиреЗ рдХрд╛ рддрд░реАрдХрд╛) рдЕрд▓рдЧ-рдЕрд▓рдЧ рдореЙрдбреНрдпреВрд▓ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред

рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕реВрдЪреА


рдЗрд╕ рд╕реВрдЪреА рдХрд╛ рд╕рд░рд▓ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ: рдкреЗрдЬ рдЦреЛрд▓рдиреЗ рдХреЗ рдХреНрд╖рдг рдореЗрдВ, рд╡рд░реНрддрдорд╛рди рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕рд░реНрд╡рд░ рд╕реЗ рд▓реЛрдб рд╣реЛрддреЗ рд╣реИрдВред рдЬрдм рдирдП рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХрдиреЗрдХреНрдЯ рд╣реЛрддреЗ рд╣реИрдВ, рддреЛ рд╕рд░реНрд╡рд░ "Module.users.model.UserModel" рд╡рд░реНрдЧ рдореЗрдВ рдПрдХ "рдРрдб" рдИрд╡реЗрдВрдЯ рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИ, рдЬрдм рдбрд┐рд╕реНрдХрдиреЗрдХреНрдЯ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЙрд╕реА рдХреНрд▓рд╛рд╕ рдореЗрдВ, "рд╣рдЯрд╛рдПрдВ" рдИрд╡реЗрдВрдЯ рдЙрдард╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдИрд╡реЗрдВрдЯ рдХреЛ рд╕рд░реНрд╡рд░ рд╕рд╛рдЗрдб рдкрд░ рдЯреНрд░рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рдЖрдк рдЗрд╕реЗ рдХреНрд▓рд╛рдЗрдВрдЯ рдкрд░ рдЯреНрд░реИрдХ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдЕрдм, рдкрд╣рд▓реЗ рдЪреАрдЬреЗрдВ рдкрд╣рд▓реЗред рдЧреНрд░рд╛рд╣рдХ рдХреА рдУрд░ рд╕реЗ, рд╕реНрдЯреЛрд░ рдбреЗрдЯрд╛ (рд╕реНрдерд┐рд░ / рдПрдкреНрд▓рд┐рдХреЗрд╢рди / рдореЙрдбреНрдпреВрд▓ / рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ / рд╕реНрдЯреЛрд░ / UsersStore.js) рдХреЛ рд╕рд╛рдЭрд╛ рдХрд░рддрд╛ рд╣реИ

 Ext.define('Module.users.store.UsersStore', { extend: 'Ext.data.Store' ,autoLoad: true ,total: 0 ,constructor() { //         this.dataModel = Ext.create('Module.users.model.UserModel'); //      this.dataModel.on({ add: (records) => { this.onDataAdd(records) }, remove: (records) => { this.onDataRemove(records) } }) this.callParent(arguments) } //   load ,async load() { //      const data = await this.dataModel.$read(); //   this.total = data.total; //    UI this.loadData(data.data); } ,getTotalCount() { return this.total; } //          ,onDataAdd(records) { this.add(records[0]); } //   --  ,onDataRemove(records) { this.remove(this.getById (records[0].id)) } }); 

2 рджрд┐рд▓рдЪрд╕реНрдк рдмрд┐рдВрджреБ рд╣реИрдВред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд▓рд╛рдЗрди рдореЗрдВ "рдХрд╛рд╕реНрдЯ рдбреЗрдЯрд╛ = рдЗрд╕ рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рдХрд░реЗрдВред MataModelред $ Read ();" рдореЙрдбрд▓ рдХрд╛ рд╕рд░реНрд╡рд░ рд╡рд┐рдзрд┐ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдЕрдм рдЖрдкрдХреЛ рдЕрдЬрд╛рдХреНрд╕, рд╕рдорд░реНрдерди рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдЖрджрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдмрд╕ рд╕рд░реНрд╡рд░ рд╡рд┐рдзрд┐ рдХреЛ рд╕реНрдерд╛рдиреАрдп рдХрд╣реЗрдВред рдЗрд╕реА рд╕рдордп, рд╕реБрд░рдХреНрд╖рд╛ рдХрд╛ рдмрд▓рд┐рджрд╛рди рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдиреАрдЪреЗ рдЙрд╕ рдкрд░ рдЕрдзрд┐рдХ)ред

рджреВрд╕рд░реЗ, рдЗрд╕.dataModel.on (...) рдХрд╛ рдорд╛рдирдХ рдирд┐рд░реНрдорд╛рдг рдЖрдкрдХреЛ рд╕рд░реНрд╡рд░ рджреНрд╡рд╛рд░рд╛ рдЙрддреНрдкрдиреНрди рд╣реЛрдиреЗ рд╡рд╛рд▓реА рдШрдЯрдирд╛рдУрдВ рдХреЛ рдЯреНрд░реИрдХ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред

рдореЙрдбрд▓ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рдХреНрд▓рд╛рдЗрдВрдЯ рдФрд░ рд╕рд░реНрд╡рд░ рднрд╛рдЧреЛрдВ рдХреЗ рдмреАрдЪ рдПрдХ рдкреБрд▓ рд╣реИред рдпрд╣ рдкреНрд░рдХрд╛рд╢ рдХреЗ рджреНрд╡реИрддрд╡рд╛рдж рдХреА рддрд░рд╣ рд╣реИ - рдпрд╣ рдлреНрд░рдВрдЯрдПрдВрдб рдФрд░ рдмреИрдХрдПрдВрдб рджреЛрдиреЛрдВ рдХреЗ рдЧреБрдгреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред рдЖрдЗрдП рдореЙрдбрд▓ рдХреЛ рдзреНрдпрд╛рди рд╕реЗ рджреЗрдЦреЗрдВред

 Ext.define('Module.users.model.UserModel', { extend: 'Core.data.DataModel' /* scope:client */ ,testClientMethod() { ... } ,testGlobalMethod() { ... } /* scope:server */ ,privateServerMethod() { .... } /* scope:server */ ,async $read(params) { //      redis const keys = await this.getMemKeys('client:*'); let data = [], name; for(let i = 0;i<keys.length;i++) { //         name = await this.getMemKey(keys[i]); if(name) { data.push({ id: keys[i].substr(7), name }) } } //    return { total: data.length, data } } }) 

рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдкрд░ рдзреНрдпрд╛рди рджреЗрдВ / * рдЧреБрдВрдЬрд╛рдЗрд╢: рд╕рд░реНрд╡рд░ * / рдФрд░ / * рдЧреБрдВрдЬрд╛рдЗрд╢: рдХреНрд▓рд╛рдЗрдВрдЯ * / - рдпреЗ рдирд┐рд░реНрдорд╛рдг рд╕рд░реНрд╡рд░ рдХреЗ рд▓рд┐рдП рд▓реЗрдмрд▓ рд╣реИрдВ рдЬрд┐рд╕рдХреЗ рджреНрд╡рд╛рд░рд╛ рдпрд╣ рд╡рд┐рдзрд┐ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИред

testClientMethod - рдпрд╣ рд╡рд┐рдзрд┐ рдХреНрд▓рд╛рдЗрдВрдЯ рдкрд░ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЪрд▓рддреА рд╣реИ рдФрд░ рдХреЗрд╡рд▓ рдХреНрд▓рд╛рдЗрдВрдЯ рд╕рд╛рдЗрдб рдкрд░ рдЙрдкрд▓рдмреНрдз рд╣реИред
testGlobalMethod - рдпрд╣ рд╡рд┐рдзрд┐ рдХреНрд▓рд╛рдЗрдВрдЯ рдФрд░ рд╕рд░реНрд╡рд░ рдкрд░ рдЪрд▓рддреА рд╣реИ рдФрд░ рдХреНрд▓рд╛рдЗрдВрдЯ рдФрд░ рд╕рд░реНрд╡рд░ рд╕рд╛рдЗрдб рдкрд░ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рд╣реИред
PrivateServerMethod - рд╡рд┐рдзрд┐ рдХреЛ рд╕рд░реНрд╡рд░ рдкрд░ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдпрд╣ рдХреЗрд╡рд▓ рд╕рд░реНрд╡рд░ рдкрд░ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рд╣реИред
$ рд░реАрдб рд╕рдмрд╕реЗ рджрд┐рд▓рдЪрд╕реНрдк рдкреНрд░рдХрд╛рд░ рдХрд╛ рддрд░реАрдХрд╛ рд╣реИ рдЬреЛ рдХреЗрд╡рд▓ рд╕рд░реНрд╡рд░ рд╕рд╛рдЗрдб рдкрд░ рдЪрд▓рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдк рдЗрд╕реЗ рдХреНрд▓рд╛рдЗрдВрдЯ рдФрд░ рд╕рд░реНрд╡рд░ рджреЛрдиреЛрдВ рдкрд░ рдХреЙрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред $ рдЙрдкрд╕рд░реНрдЧ рдХреНрд▓рд╛рдЗрдВрдЯ рд╕рд╛рдЗрдб рдкрд░ рдЙрдкрд▓рдмреНрдз рдХрд┐рд╕реА рднреА рд╕рд░реНрд╡рд░-рд╕рд╛рдЗрдб рдкрджреНрдзрддрд┐ рдХреЛ рдмрдирд╛рддрд╛ рд╣реИред

рдЖрдк рд╡реЗрдм рд╕реЙрдХреЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЧреНрд░рд╛рд╣рдХ рдХрдиреЗрдХреНрд╢рди рдФрд░ рд╡рд┐рдпреЛрдЧ рдХреЛ рдЯреНрд░реИрдХ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдкреНрд░рддреНрдпреЗрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХрдиреЗрдХреНрд╢рди (рд╕рдВрд░рдХреНрд╖рд┐рдд / рдЖрдзрд╛рд░ / wsClient.js) рдХреЗ рд▓рд┐рдП Base.wsClient рд╡рд░реНрдЧ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред

 Ext.define('Base.wsClient', { extend: 'Core.WsClient' //      ,usersModel: Ext.create('Module.users.model.UserModel') //       ,async onStart() { //   "add"    this.usersModel.fireEvent('add', 'all', [{id: this.token, name: this.req.query.user}]); //     redis await this.setMemKey(`client:${this.token}`, this.req.query.user || ''); //   ""      , //     await this.queueProcess(`client:${this.token}`, async (data, done) => { const res = await this.prepareClientEvents(data); done(res); }) } //      ,onClose() { //   "remove"    this.usersModel.fireEvent('remove', 'all', [{id: this.token, name: this.req.query.user}]) this.callParent(arguments); } }) 

рдПрдХ рдорд╛рдирдХ рдХреЗ рд╡рд┐рдкрд░реАрдд, рдлрд╛рдпрд░рдПрд╡реЗрдВрдЯ рд╡рд┐рдзрд┐ рдореЗрдВ рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдкреИрд░рд╛рдореАрдЯрд░ рд╣реЛрддрд╛ рд╣реИ, рдЬрд╣рд╛рдВ рдпрд╣ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдХрд┐рд╕ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рдШрдЯрдирд╛ рдХреЛ рдЯреНрд░рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╣ рдПрдХ рдПрдХрд▓ рдЧреНрд░рд╛рд╣рдХ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛, рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛рдУрдВ рдХреА рдПрдХ рд╕рд░рдгреА, рдпрд╛ рд╕реНрдЯреНрд░рд┐рдВрдЧ "рд╕рднреА" рдХреЛ рдкрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд╡реАрдХрд╛рд░реНрдп рд╣реИред рдмрд╛рдж рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдШрдЯрдирд╛ рдХреЛ рд╕рднреА рдЬреБрдбрд╝реЗ рдЧреНрд░рд╛рд╣рдХреЛрдВ рдкрд░ рдЯреНрд░рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЕрдиреНрдпрдерд╛, рдпрд╣ рдПрдХ рдорд╛рдирдХ рдЕрдЧреНрдирд┐ рд╣реИред

рд╕рдВрджреЗрд╢ рднреЗрдЬрдирд╛ рдФрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛


рдкреНрд░рдкрддреНрд░ рдирд┐рдпрдВрддреНрд░рдХ (рд╕реНрдерд┐рд░ / рдПрдкреНрд▓рд┐рдХреЗрд╢рди / рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ / рдореЙрдбреНрдпреВрд▓ / рд╕рдВрджреЗрд╢ / рджреГрд╢реНрдп / FormController.js) рд╕рдВрджреЗрд╢ рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИред

 Ext.define('Module.messages.view.FormController', { extend: 'Ext.app.ViewController' ,init(view) { this.view = view; //     this.model = Ext.create('Module.messages.model.Model'); //      this.msgEl = this.view.down('[name=message]'); //     this.usersGrid = Ext.getCmp('users-grid') //    "" this.control({ '[action=submit]' : {click: () => {this.newMessage() }} }) } //     ,newMessage() { let users = []; //     const sel = this.usersGrid.getSelection(); if(sel && sel.length) { sel.forEach((s) => { users.push(s.data.id) }) } //        if(users.length && users.indexOf(Ext.WS.token) == -1) users.push(Ext.WS.token); //       this.model.$newmessage({ to: users, user: Ext.WS.user, message: this.msgEl.getValue() }) //    this.msgEl.setValue(''); } }); 

рд╕рдВрджреЗрд╢ рд╕рд░реНрд╡рд░ рдкрд░ рдХрд╣реАрдВ рднреА рд╕рд╣реЗрдЬрд╛ рдирд╣реАрдВ рдЧрдпрд╛ рд╣реИ, "newmessage" рдШрдЯрдирд╛ рдмрд╕ рдЯреНрд░рд┐рдЧрд░ рд╣реИред рдмреНрдпрд╛рдЬ рдХреА рдХреЙрд▓ "this.fireEvent ('newmessage', data.to, msg);" рд╣реИ, рдЬрд╣рд╛рдВ рдЧреНрд░рд╛рд╣рдХ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛рдУрдВ рдХреЛ рд╕рдВрджреЗрд╢ рдкреНрд░рд╛рдкреНрддрдХрд░реНрддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдирд┐рдЬреА рд╕рдВрджреЗрд╢реЛрдВ рдХрд╛ рд╡рд┐рддрд░рдг рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рд╕реНрдереИрддрд┐рдХ / рдПрдкреНрд▓рд┐рдХреЗрд╢рди / рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ / рдореЙрдбреНрдпреВрд▓ / рд╕рдВрджреЗрд╢ / рдореЙрдбрд▓ / рдореЙрдбрд▓.рдЬреЗрдПрд╕)ред

 Ext.define('Module.messages.model.Model', { extend: 'Core.data.DataModel' /* scope:server */ ,async $newmessage(data) { const msg = { user: data.user, message: data.message } if(data.to && Ext.isArray(data.to) && data.to.length) { this.fireEvent('newmessage', data.to, msg); } else { this.fireEvent('newmessage', 'all', msg); } return true; } }) 

рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд╕рд╛рде, рд╕рдВрджреЗрд╢ рд╕реВрдЪреА рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛ рд╕реНрдЯреЛрд░ (рд╕реНрдерд┐рд░ / рдПрдкреНрд▓рд┐рдХреЗрд╢рди / рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ / рдореЙрдбреНрдпреВрд▓ / рд╕рдВрджреЗрд╢ / рд╕реНрдЯреЛрд░ / MessageStore.js) рджреНрд╡рд╛рд░рд╛ рд╕рдВрдЪрд╛рд▓рд┐рдд рд╣реЛрддрд╛ рд╣реИ

 Ext.define('Module.messages.store.MessagesStore', { extend: 'Ext.data.Store', fields: ['user', 'message'], constructor() { //       Ext.create('Module.messages.model.Model', { listeners: { newmessage: (mess) => { this.add(mess) } } }) this.callParent(arguments); } }); 

рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдпрд╣ рд╕рдм рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рджрд┐рд▓рдЪрд╕реНрдк рд╣реИред

рд╕рдВрднрд╡ рдкреНрд░рд╢реНрди


рдХреНрд▓рд╛рдЗрдВрдЯ рдкрд░ рд╕рд░реНрд╡рд░ рдХреЗ рддрд░реАрдХреЛрдВ рдХреА рдЙрдкрд▓рдмреНрдзрддрд╛, рдЬрд╝рд╛рд╣рд┐рд░ рд╣реИ, рдЕрдЪреНрдЫреА рд╣реИ, рд▓реЗрдХрд┐рди рд╕реБрд░рдХреНрд╖рд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛? рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рдПрдХ рджреБрд╖реНрдЯ рд╣реИрдХрд░ рд╕рд░реНрд╡рд░ рдХреЛрдб рджреЗрдЦ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдмреИрдХрдПрдВрдб рдХреЛ рдХреНрд░реИрдХ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд╕рдХрддрд╛ рд╣реИ?

рдирд╣реАрдВ, рд╡рд╣ рд╕рдлрд▓ рдирд╣реАрдВ рд╣реЛрдЧрд╛ред рдХреНрд▓рд╛рдЗрдВрдЯ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдкрд░ рднреЗрдЬреЗ рдЬрд╛рдиреЗ рдкрд░ рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╕рднреА рд╕рд░реНрд╡рд░ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдХреНрд▓рд╛рд╕ рдХреЛрдб рд╕реЗ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕ рдЙрджреНрджреЗрд╢реНрдп рдХреЗ рд▓рд┐рдП, рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ / рдирд┐рд░реНрджреЗрд╢реЛрдВ / * рдЧреБрдВрдЬрд╛рдЗрд╢ рдХрд╛ рдЗрд░рд╛рджрд╛ рд╣реИ: ... * /ред рджреВрд╕рд░реЗ, рд╕рдмрд╕реЗ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд╕рд░реНрд╡рд░-рд╕рд╛рдЗрдб рдкрджреНрдзрддрд┐ рдХрд╛ рдХреЛрдб рдПрдХ рдордзреНрдпрд╡рд░реНрддреА рдирд┐рд░реНрдорд╛рдг рджреНрд╡рд╛рд░рд╛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ рдХреНрд▓рд╛рдЗрдВрдЯ рд╕рд╛рдЗрдб рдкрд░ рджреВрд░рд╕реНрде рдХреЙрд▓ рддрдВрддреНрд░ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред

рдлрд┐рд░ рд╕реЗ рд╕реБрд░рдХреНрд╖рд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВред рдпрджрд┐ рдХреНрд▓рд╛рдЗрдВрдЯ рдкрд░ рд╕рд░реНрд╡рд░ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ, рдХреНрдпрд╛ рдореИрдВ рдРрд╕реА рдХреЛрдИ рд╡рд┐рдзрд┐ рдХрд╣ рд╕рдХрддрд╛ рд╣реВрдВ? рдФрд░ рдЕрдЧрд░ рдпрд╣ рдПрдХ рдбреЗрдЯрд╛рдмреЗрд╕ рд╕рдлрд╛рдИ рд╡рд┐рдзрд┐ рд╣реИ?

рдХреНрд▓рд╛рдЗрдВрдЯ рд╕реЗ, рдЖрдк рдХреЗрд╡рд▓ рдЙрди рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдХреЙрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рдирдХреЗ рдирд╛рдо рдореЗрдВ $ рдЙрдкрд╕рд░реНрдЧ рд╣реИред рдЗрд╕ рддрд░рд╣ рдХреЗ рддрд░реАрдХреЛрдВ рдХреЗ рд▓рд┐рдП, рдЖрдк рд╕реНрд╡рдпрдВ рдЪреЗрдХ рдФрд░ рдПрдХреНрд╕реЗрд╕ рдХреЗ рддрд░реНрдХ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдПрдХ рдмрд╛рд╣рд░реА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдкрд╛рд╕ $ рдХреЗ рдмрд┐рдирд╛ рд╕рд░реНрд╡рд░ рд╡рд┐рдзрд┐рдпреЛрдВ рддрдХ рдкрд╣реБрдВрдЪ рдирд╣реАрдВ рд╣реИ, рд╡рд╣ рдЙрдиреНрд╣реЗрдВ рднреА рдирд╣реАрдВ рджреЗрдЦреЗрдЧрд╛ (рдкрд┐рдЫрд▓реЗ рдЙрддреНрддрд░ рджреЗрдЦреЗрдВ)

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рдПрдХ рдЕрдЦрдВрдб рдкреНрд░рдгрд╛рд▓реА рдорд┐рд▓реА рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдХреНрд▓рд╛рдЗрдВрдЯ рдФрд░ рд╕рд░реНрд╡рд░ рдХрд╛ рдЕрдЯреВрдЯ рд╕рдВрдмрдВрдз рд╣реИред рдХреНрдпрд╛ рдХреНрд╖реИрддрд┐рдЬ рд╕реНрдХреЗрд▓рд┐рдВрдЧ рд╕рдВрднрд╡ рд╣реИ?

рдкреНрд░рдгрд╛рд▓реА, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЕрдЦрдВрдб рджрд┐рдЦрддреА рд╣реИ, рд▓реЗрдХрд┐рди рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИред рдХреНрд▓рд╛рдЗрдВрдЯ рдФрд░ рд╕рд░реНрд╡рд░ рд╡рд┐рднрд┐рдиреНрди рдорд╢реАрдиреЛрдВ рдкрд░ "рд▓рд╛рдЗрд╡" рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рдХрд┐рд╕реА рднреА рддреГрддреАрдп-рдкрдХреНрд╖ рд╡реЗрдм рд╕рд░реНрд╡рд░ (Nginx, Apache, рдЖрджрд┐) рдкрд░ рдЪрд▓рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдХреНрд▓рд╛рдЗрдВрдЯ рдФрд░ рд╕рд░реНрд╡рд░ рдХреЗ рдкреГрдердХреНрдХрд░рдг рдХрд╛ рдореБрджреНрджрд╛ рдмрд╣реБрдд рдЖрд╕рд╛рдиреА рд╕реЗ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдмрд┐рд▓реНрдбрд░ рджреНрд╡рд╛рд░рд╛ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдореИрдВ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рдЕрд▓рдЧ рдкреЛрд╕реНрдЯ рд▓рд┐рдЦ рд╕рдХрддрд╛ рд╣реВрдВ)ред рдЖрдВрддрд░рд┐рдХ рд╕реЗрд╡рд╛ рдореИрд╕реЗрдЬрд┐рдВрдЧ рддрдВрддреНрд░ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╕рд┐рд╕реНрдЯрдо рдХрддрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ (рдЕрд░реНрдерд╛рдд, рдЗрд╕рдХреЗ рд▓рд┐рдП Redis рдЖрд╡рд╢реНрдпрдХ рд╣реИ)ред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╕рд░реНрд╡рд░ рднрд╛рдЧ рдХреЛ рдХреЗрд╡рд▓ рдирдИ рдорд╢реАрдиреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдХрд░ рдХреНрд╖реИрддрд┐рдЬ рд░реВрдк рд╕реЗ рдЖрд╕рд╛рдиреА рд╕реЗ рдмрдврд╝рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рд╕рд╛рдорд╛рдиреНрдп рд╡рд┐рдХрд╛рд╕ рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд╕рд╛рде, рдПрдХ рдирд┐рдпрдо рдХреЗ рд░реВрдк рдореЗрдВ, рдмреИрдХрдПрдВрдб рдПрдкреАрдЖрдИ рдХрд╛ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╕реЗрдЯ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕рд╕реЗ рдЖрдк рд╡рд┐рд╡рд┐рдз рдХреНрд▓рд╛рдЗрдВрдЯ рдПрдкреНрд▓рд┐рдХреЗрд╢рди (рд╡реЗрдмрд╕рд╛рдЗрдЯ, рдореЛрдмрд╛рдЗрд▓ рдПрдкреНрд▓рд┐рдХреЗрд╢рди) рд╕реЗ рдЬреБрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред рдЖрдкрдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рдПрдХреНрд╕рдЯ рдЬреЗрдПрд╕ рдореЗрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рдХреЗрд╡рд▓ рдПрдХ рдЧреНрд░рд╛рд╣рдХ рдмреИрдХрдПрдВрдб рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реИ?

рд╕рд░реНрд╡рд░ рдкрд░, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдореЙрдбреНрдпреВрд▓ рдореЙрдбрд▓ рдореЗрдВ, рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХ рддрд░реНрдХ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред REST API рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЗрд╕ рддрдХ рдкрд╣реБрдБрдЪ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ рдЫреЛрдЯрд╛ "рдЖрд╡рд░рдг" рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред рдЗрд╕ рд▓реЗрдЦ рдХреЗ рдкрд╣рд▓реЗ рднрд╛рдЧ рдореЗрдВ рдПрдХ рд╕рдВрдмрдВрдзрд┐рдд рдЙрджрд╛рд╣рд░рдг рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

рдирд┐рд╖реНрдХрд░реНрд╖


рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдХрд╛рдлреА рдЬрдЯрд┐рд▓ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рдЖрд░рд╛рдорджрд╛рдпрдХ рдХреЛрдбрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП, рд╕рд╛рдордиреЗ рдХреЗ рдЫреЛрд░ рдФрд░ рдмреИрдХрдПрдВрдб рдкрд░ рдПрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рд╕рд╛рде рдХрд░рдирд╛ рдХрд╛рдлреА рд╕рдВрднрд╡ рд╣реИред рдЗрд╕рдХреЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд▓рд╛рдн рд╣реИрдВред

рд╡рд┐рдХрд╛рд╕ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдЧрддрд┐ рджреЗрдирд╛ред рдЯреАрдо рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рд╕рджрд╕реНрдп рдмреИрдХрдПрдВрдб рдФрд░ рдлреНрд░рдВрдЯреЗрдВрдб рдкрд░ рдХрд╛рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдбрд╛рдЙрдирдЯрд╛рдЗрдо рдЗрд╕ рдХрд╛рд░рдг рд╕реЗ "рдореИрдВ рдЗрд╕ рдПрдкреАрдЖрдИ рдХреЗ рд╕рд░реНрд╡рд░ рдкрд░ рдЖрдиреЗ рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ" рдЕрдм рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдирд╣реАрдВ рд╣реИред

рдХрдо рдХреЛрдбред рдХреЛрдб рдХреЗ рд╕рдорд╛рди рд╡рд░реНрдЧреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреНрд▓рд╛рдЗрдВрдЯ рдкрд░ рдФрд░ рд╕рд░реНрд╡рд░ рдкрд░ (рдЪреЗрдХ, рд╕рддреНрдпрд╛рдкрди, рдЖрджрд┐) рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдРрд╕реА рдкреНрд░рдгрд╛рд▓реА рдХреЛ рдмрдирд╛рдП рд░рдЦрдирд╛ рдмрд╣реБрдд рд╕рд░рд▓ рдФрд░ рд╕рд╕реНрддрд╛ рд╣реИред рджреЛ рд╡рд┐рд╡рд┐рдз рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЗ рдмрдЬрд╛рдп, рд╕рд┐рд╕реНрдЯрдо рдПрдХ (рдпрд╛ рд╡рд╣реА рджреЛ рд▓реЗрдХрд┐рди рд╡рд┐рдирд┐рдореЗрдп) рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдЧрд╛ред рдЗрд╕реА рдХрд╛рд░рдг рд╕реЗ, рдЯреАрдо рдХреЗ рдХрд╛рд░реЛрдмрд╛рд░ рд╕реЗ рдЬреБрдбрд╝реЗ рдЬреЛрдЦрд┐рдо рднреА рдХрдо рд╣реИрдВред

рдмреЙрдХреНрд╕ рд╕реЗ рд░реАрдпрд▓-рдЯрд╛рдЗрдо рд╕рд┐рд╕реНрдЯрдо рдмрдирд╛рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ред

рдмреИрдХрдПрдВрдб рдФрд░ рдлреНрд░рдВрдЯреЗрдВрдЯ рдХреЗ рд▓рд┐рдП рдПрдХрд▓ рдкрд░реАрдХреНрд╖рдг рдкреНрд░рдгрд╛рд▓реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ред

Source: https://habr.com/ru/post/hi431180/


All Articles