
ãã®èšäºã®ç®çã¯ãå°ããªäŸ¿å©ãªã¢ããªã±ãŒã·ã§ã³ãäœæããäŸã䜿çšããŠã
CUBAãã©ãããã©ãŒã ã®æ©èœã«ã€ããŠèª¬æããããšã§ãã
CUBAã¯Javaã§ã®ããžãã¹ã¢ããªã±ãŒã·ã§ã³ã®é«ééçºãç®çãšããŠããŸãããHabré
ã«é¢ããããã€ãã®
èšäºã«ã€ããŠã¯ãã§ã«æžããŠããŸãã
éåžžããã©ãããã©ãŒã ã¯ãå®åšããã倧ããããééçãªæ
å ±ã·ã¹ãã ããŸãã¯ãHello Worldãã¹ã¿ã€ã«ã®ã¢ããªã±ãŒã·ã§ã³ããŸãã¯Webãµã€ãã®ãLibrariesããªã©ã®äººå·¥çãªäŸãæ§ç¯ããŸãã ãã®ããããã°ããåã«ãç§ã¯2矜ã®é³¥ãäžåºŠã«1ç³ã§æ®ºãããšããããšã«ããŸãã-ç§ãã¡ã®ãã©ãããã©ãŒã ã®äœ¿çšäŸãšããŠãèªåã«ãšã£ãŠäŸ¿å©ãªã¢ããªã±ãŒã·ã§ã³ãæžããŠãããªãã¯ãã¡ã€ã³ã«çœ®ããŸãã
çµæãšããŠäœãèµ·ãã£ãã®ã
èŠããã«ãã¢ããªã±ãŒã·ã§ã³ã¯2ã€ã®äž»ãªã¿ã¹ã¯ã解決ããŸãã
- ã©ã®æç¹ã§ããçŸéãã«ãŒããé éãåµåãªã©ãããããçš®é¡ã®çŸéã®çŸåšã®æ®é«ã衚瀺ãããŸãã
- åå
¥ãšæ¯åºã®ã«ããŽãªããšã«ã¬ããŒããçæããç¹å®ã®æéã«ãéãäœã«äœ¿ãããã®ããã©ãããæ¥ãã®ãã調ã¹ãããšãã§ããŸãã
ããå°ã詳ããïŒ
- ããŸããŸãªçš®é¡ã®çŸéãå£åº§ããæ瀺ãããŸã ã
- å£åº§ãžã®å°çãå£åº§ããã®åºè²»ãå£åº§éã§ã®è³é移åæã«æäœãå¯èœã§ãã
- åå
¥ãŸãã¯è²»çšã®ãã©ã³ã¶ã¯ã·ã§ã³ã§ã¯ã ã«ããŽãªãæå®ããŠããéã®åºæãŸãã¯äœ¿çšç®çãæå®ã§ããŸãã
- çŸåšã®æ¥ä»ã®ãã¹ãŠã®ã¢ã«ãŠã³ãã®æ®é«ã¯åžžã«è¡šç€ºãããåãã©ã³ã¶ã¯ã·ã§ã³ã®åŸã«åèšç®ãããŸãã
- åå
¥ãšæ¯åºã®ã«ããŽãªå¥ã®ã¬ããŒãã«ã¯ãèŠèŠçãªæ¯èŒããã°ããè¡ãããã«ãä»»æã®2ã€ã®æéã®æŠèŠãåæã«è¡šç€ºãããŸãã ã©ã®ã«ããŽãªãæ¯èŒããé€å€ã§ããŸãã ã¬ããŒãã®åè¡ã«ã€ããŠãæäœã§ã倱æãããŠãã¬ããŒãã®æ§æã確èªã§ããŸãã
- ã·ã¹ãã ã¯ã1ã€ã®Tomcatã«ãããã€ããã3ã€ã®Webã¢ããªã±ãŒã·ã§ã³ã§æ§æãããŠããŸãã
- ããã«ãŠã§ã¢
- CUBAã®ãã«æ©èœUI
- Backbone.js + Bootstrapã®ã¬ã¹ãã³ã·ãUIã¯ãã¢ãã€ã«ããã€ã¹ã§ã®æäœã®å
¥åã容æã«ããŸãã
ãã®ãããªåçŽãªã¿ã¹ã¯ã解決ããã®ã¯ããã¶ãåé·ã«èŠããŸããã第äžã«ãã¢ããªã±ãŒã·ã§ã³ã¯å®çšçãšãããããæè²ç®çã®ããã«äœæããã第äºã«ãå€ãã®ãªãœãŒã¹ãå¿
èŠãšããŸãã-ç§èªèº«ã®ã³ããŒã¯Amazon EC2ãã€ã¯ãã€ã³ã¹ã¿ã³ã¹ã§ç°¡åã«å®è¡ã§ããŸãã
ããã€ãã®ã¹ã¯ãªãŒã³ã·ã§ãã
ã¡ã€ã³UIïŒæäœã®ãªã¹ã ã¡ã€ã³UIïŒåå
¥/è²»çšã®ã«ããŽãªå¥ã¬ããŒã ã¬ã¹ãã³ã·ãUIïŒæäœã®ãªã¹ã ã¬ã¹ãã³ã·ãUIïŒçŸåšã®ãã©ã³ã¹ å®è¡æ¹æ³
ãããžã§ã¯ãã®ãœãŒã¹ã³ãŒãã¯æ¬¡ã®
ãšããã§ã
ãgithub.com /
knstvk /
akkount ïŒKK-ãããã¯ç§ã®ã€ãã·ã£ã«ã§ãããç§ã®é ã«æµ®ããã ãã®ã¯ãããŸããïŒã
ãã©ãããã©ãŒã èªäœã¯ç¡æã§ã¯ãããŸããããç¡æã©ã€ã»ã³ã¹ã§ã®5ã€ã®åææ¥ç¶ã¯å®¶åºã§ã®äœ¿çšã«ã¯ååã§ããããã誰ããããã䜿çšãããå Žåã¯ãé¡ãããŸãã
JDK 7+ãšset JAVA_HOMEç°å¢å€æ°ã®ã¿ãå¿
èŠã§ãã ãã«ãããã«ã¯ããããžã§ã¯ãã®ã«ãŒãã§ã³ãã³ãããã³ãããéããå®è¡ããŸã
gradlew setupTomcat deploy
GradleãããŠã³ããŒãããã
ã€ã³ã¿ãŒããããã©ãããã©ãŒã ãšä»ã®ã©ã€ãã©ãªãããŠã³ããŒããããbuild / tomcatãµããã£ã¬ã¯ããªã«ã¢ããªã±ãŒã·ã§ã³ãã¢ã»ã³ãã«ãããŸãã ã¢ã»ã³ããªããã»ã¹äžã«ãCUBAãã©ãããã©ãŒã ã®ã©ã€ã»ã³ã¹å¥çŽã«åæããããæ±ããããŸãã
ãã®åŸãHSQLãµãŒããŒãèµ·åãããããžã§ã¯ãããŒã¿ãµããã£ã¬ã¯ããªã«ããŒã¿ããŒã¹ãäœæããå¿
èŠããããŸãã
gradlew startDb
gradlew createDb
Gradleã³ãã³ãã䜿çšããŠTomcatãèµ·åã§ããŸãã
gradlew start
ãŸãã¯
startup.*
build/tomcat/bin
ãµããã£ã¬ã¯ããªå
ã®ã¹ã¯ãªããã
ã¢ããªã±ãŒã·ã§ã³ã®ã¡ã€ã³Webã€ã³ã¿ãŒãã§ãŒã¹ã¯
localhost:8080/app
localhost:8080/app
ãã¬ã¹ãã³ã·ãUI-ãªã³
localhost:8080/app-portal
localhost:8080/app-portal
ãŠãŒã¶ãŒã¯adminããã¹ã¯ãŒãã¯adminã§ãã
ããŒã¿ããŒã¹ã¯æåã¯ç©ºã§ããããã¹ãããŒã¿ãå
¥åããããã®ãžã§ãã¬ãŒã¿ãŒããããŸãã
管çã¡ãã¥ãŒ
-> JMXã³ã³ãœãŒã«-> app-core.akkount-> app-core.akkountïŒtype = SampleDataGeneratorããå©çšã§ããŸãã 以äžã«
generateSampleData()
ã¡ãœããã瀺ããŸãããã®ã¡ãœããã¯ãæŽæ°ãå
¥åãšããŠåãåããŸããããã¯ãæäœãäœæããå¿
èŠãããçŸåšã®æ¥ä»ããã®æ¥æ°ã§ãã ããšãã°ã200ãšå
¥åãã[å®è¡]ãã¯ãªãã¯ããŸãã æäœãå®äºããã®ãåŸ
ã£ãŠãããã°ã¢ãŠããïŒå³äžé
ã®ã¢ã€ã³ã³ïŒãå床ãã°ã€ã³ããŸãã ç§ã®ã¹ã¯ãªãŒã³ã·ã§ãããšã»ãŒåããã®ã衚瀺ãããŸãã
å
éšã®èŠæ¹
ã¢ããªã±ãŒã·ã§ã³ã調æ»ããã³æ¹è¯ããã«ã¯ãCUBA StudioãIntelliJ IDEAãããã³CUBAãã©ã°ã€ã³ã
ããŠã³ããŒãããŠã€ã³ã¹ããŒã«ããããšããå§ãã
ãŸã ã
ããã«ãã¹ã¿ãžãªã§ã©ã®ããã«ãäœãè¡ãããŠãããã«ã€ããŠã¯è§ŠããŸããã ãã¹ãŠãèŠèŠçã§ãããã³ã³ããã¹ããã«ããããããã©ãããã©ãŒã äžã«
ãããªè³æãš
ããã¥ã¡ã³ãããããŸãã HSQLããŒã¿ããŒã¹ã䜿çšããå¯äžã®ãã¥ã¢ã³ã¹ã«ã€ããŠèª¬æããŸããHSQLDBã䜿çšããŠãããžã§ã¯ããéããšãã¹ã¿ãžãªã¯ç¬èªã®ãµãŒããŒãããŒã9001ã§èµ·åããããŒã¿ããŒã¹ã
~/.haulmont/studio/hsqldb
ä¿åããŸãã ã€ãŸããGradleã³ãã³ãã䜿çšããŠStudioãšã¯å¥ã«HSQLãµãŒããŒãèµ·åããå Žåã¯ãåæ¢ããå¿
èŠããããŸãã å¿
èŠã«å¿ããŠãããŒã¿ããŒã¹ãã¡ã€ã«ã
data/akk
ãã
~/.haulmont/studio/hsqldb/akk
ç°¡åã«è»¢éã§ããŸãã
äžè¬ã«ãã¢ããªã±ãŒã·ã§ã³ã¯ãããæ·±å»ãªããŒã¿ããŒã¹ïŒPostgreSQLãMicrosoft SQL ServerããŸãã¯OracleïŒã§ãå®è¡ã§ããŸãã ãããè¡ãã«ã¯ãStudioã§
ãããžã§ã¯ãããããã£ã§å¿
èŠãªããŒã¿ããŒã¹ã®ã¿ã€ããéžæãã[
ãšã³ãã£ãã£]-> [DBã¹ã¯ãªããã®çæ ]ã
å®è¡ããã¡ã€ã³ã¡ãã¥ãŒã®[
å®è¡ ]
-> [ããŒã¿ããŒã¹ã®äœæ ]ã
ã¯ãªãã¯ããŸã ã
ãã®èšäºã®äž»ãªç®çã¯ãStudioã®ã€ã³ã¿ãŒãã§ãŒã¹ã«ã¯è¡šç€ºããããäœãæ¢ãã¹ããäºåã«ããããªãå Žåã¯ããã¥ã¡ã³ãã§èŠã€ããã®ãé£ãããã©ãããã©ãŒã ã§ã®éçºææ³ã瀺ãããšã§ãã ãããã£ãŠããããžã§ã¯ãã®èª¬æã¯æççã§ãããéèªæã§éæšæºçãªãã®ã«éç¹ã眮ãããŸãã
ããŒã¿ã¢ãã«


ãšã³ãã£ãã£ã¯ã©ã¹ã¯
global
ã¢ãžã¥ãŒã«ã«ãããäžéå±€ãšWebã¯ã©ã€ã¢ã³ãã®äž¡æ¹ããã¢ã¯ã»ã¹ã§ããŸãã
ãããã¯åºæ¬çã«éåžžã®JPAãšã³ãã£ãã£ã§ãããé©åã«æ³šéãä»ãããã
persistence.xml
ç»é²ãããŸãã ãããã®ã»ãšãã©ã«ã¯ããã€ã³ã¹ã¿ã³ã¹åããèšå®ããCUBAåºæã®ã¢ãããŒã·ã§ã³
@NamePattern
ããããŸããããã¯ã
toString()
ãããªUIã§ç¹å®ã®ãšã³ãã£ãã£ã€ã³ã¹ã¿ã³ã¹ã衚瀺ããæ¹æ³ã§ãã ãã®ãããªæ³šéãæå®ãããŠããªãå Žåãã€ã³ã¹ã¿ã³ã¹åãšããŠ
toString()
䜿çšãããã¯ã©ã¹åãšãªããžã§ã¯ãèå¥åãè¿ãããŸãã å¥ã®ç¹å®ã®ã¢ãããŒã·ã§ã³
@Listeners
ããªããžã§ã¯ããäœæ/å€æŽããããã®ãªã¹ããŒãªããžã§ã¯ãã®ã¯ã©ã¹ãå®çŸ©ããŸãã ãšã³ãã£ãã£ãªã¹ããŒã«ã€ããŠã¯ã以äžã§è©³ãã説æããŸãã
JPAãšã³ãã£ãã£ã«å ããŠããããžã§ã¯ãã«ã¯éæ°žç¶çãª
CategoryAmount
ãšã³ãã£ãã£ããããŸãã éæ°žç¶ãšã³ãã£ãã£ã®ã€ã³ã¹ã¿ã³ã¹ã¯ããŒã¿ããŒã¹ã«ä¿åãããŸããããã¢ããªã±ãŒã·ã§ã³ã¬ã€ã€ãŒéã§ããŒã¿ã転éããæšæºUIã³ã³ããŒãã³ãã§è¡šç€ºããããã«ã®ã¿äœ¿çšãããŸãã ãã®å Žåããã®ãããªãšã³ãã£ãã£ã䜿çšããŠã
CategoryAmount
ããšã«ã¬ããŒããçæããŸãïŒäžéå±€ã§ã¯ãããŒã¿ãæœåºããã
CategoryAmount
ã€ã³ã¹ã¿ã³ã¹ãäœæããã³å
¥åãããWebã¯ã©ã€ã¢ã³ãã§ã¯ããããã®ã€ã³ã¹ã¿ã³ã¹ãããŒã¿ãœãŒã¹ïŒããŒã¿ãœãŒã¹ïŒã«é
眮ãããããŒãã«ã«è¡šç€ºãããŸãã æšæºã®
Table
ã³ã³ããŒãã³ãã¯ããšã³ãã£ãã£ã®èµ·æºã«ã€ããŠã¯äœãç¥ããŸãã-ãããã«ãšã£ãŠããããã¯ã¢ããªã±ãŒã·ã§ã³ã®ã¡ã¿ããŒã¿ã§æ¢ç¥ã®ãªããžã§ã¯ãã«ãããŸããã ãŸããã¡ã¿ããŒã¿ã«éæ°žç¶ãšã³ãã£ãã£ãå«ããã«ã¯ãã¯ã©ã¹ã«
@MetaClass
ã¢ãããŒã·ã§ã³ãè¿œå ãã
@MetaClass
ã¢ãããŒã·ã§ã³ãè¿œå ããŠã
metadata.xml
ãã¡ã€ã«ã«ã¯ã©ã¹ãç»é²ããå¿
èŠããããŸãã ãã¡ãããæ°žç¶ãšã³ãã£ãã£ãã¡ã¿ããŒã¿ã§èª¬æãããŠããŸãããã®ãããã¢ããªã±ãŒã·ã§ã³ã®éå§æã«ã¡ã¿ããŒã¿ããŒããŒã
persistence.xml
ãã¡ã€ã«ã解æããŸãã
Enumã¯ã
OperationType
ãªã©ã®ãšã³ãã£ãã£ã®é£ã«ããããŸãã ãšã³ãã£ãã£å±æ§ã®ããŒã¿ã¢ãã«ã§äœ¿çšãããåæäœã¯ããŸãäžè¬çã§ã¯ãããŸããããããã¯
EnumClass
ã€ã³ã¿ãŒãã§ã€ã¹ãå®è£
ãã
id
ãã£ãŒã«ããæã£ãŠããŸãã ãããã£ãŠãããŒã¿ããŒã¹ã«æ ŒçŽãããŠããå€ã¯Javaå€ããåé¢ãããŠããŸãã ããã«ãããã¢ããªã±ãŒã·ã§ã³ã³ãŒãã®ä»»æã®ãªãã¡ã¯ã¿ãªã³ã°äžã«ãéçšããŒã¿ããŒã¹ã®ããŒã¿ãšã®äºææ§ã確ä¿ã§ããŸãã
ãšã³ãã£ãã£ããã±ãŒãžã®
messages.properties
ããã³
messages_ru.properties
ãã¡ã€ã«ã«ã¯ããšã³ãã£ãã£ã®ããŒã«ã©ã€ãºãããååãšãã®å±æ§ãå«ãŸããŠããŸãã ãããã®ååã¯ãããžã¥ã¢ã«ã³ã³ããŒãã³ãããããã®ã¬ãã«ã§åå®çŸ©ããªãå Žåã«UIã§äœ¿çšãããŸãã ã¡ãã»ãŒãžãã¡ã€ã«ã¯ãäžè¬çãªUTF-8ãšã³ã³ãŒãã®ããŒãšå€ã®ã»ããã§ãã ç¹å®ã®ãã±ãŒã«ã®ã¡ãã»ãŒãžã®æ€çŽ¢ã¯ã
PropertyResourceBundle
ã«ãŒã«ã«äŒŒãŠããŸã-æåã«ããã±ãŒã«ã«å¯Ÿå¿ãããµãã£ãã¯ã¹ãæã€ãã¡ã€ã«ã§ãèŠã€ãããªãå Žåããµãã£ãã¯ã¹ã®ãªããã¡ã€ã«ã§ããŒãæ€çŽ¢ãããŸãã
ã¢ãã«ã®æ¬è³ªãèæ
®ããŠãã ããã
Currency
-é貚ã äžæã®ã³ãŒããšä»»æã®ååããããŸãã é貚ã³ãŒãã®äžææ§ã¯ã @Column
ã¢ãããŒã·ã§ã³ã«unique = true
ããããã£ãå«ãŸããå ŽåãStudioãããŒã¿ããŒã¹äœæã¹ã¯ãªããã«å«ããäžæã®ã€ã³ããã¯ã¹ã«ãã£ãŠãµããŒããããŸãã ãã©ãããã©ãŒã ã«ã¯ãããŒã¿ããŒã¹ã§äžææ§ã䟵害ããããšãã«ã¹ããŒãããäŸå€ãã³ãã©ãå«ãŸããŠããŸãã ãã®ãã³ãã©ãŒã¯ããŠãŒã¶ãŒã«æšæºã¡ãã»ãŒãžãæäŸããŸãã ãã³ãã©ãŒã¯ãããžã§ã¯ãã§çœ®ãæããããšãã§ããŸããAccount
-ã¢ã«ãŠã³ãã äžæã®ååãšä»»æã®èª¬æããããŸãã ãŸããé貚ãžã®ãªã³ã¯ãšåå¥ã®é貚ã³ãŒããã£ãŒã«ããå«ãŸããŠããŸãã ãã®ãã£ãŒã«ãã¯ãããã©ãŒãã³ã¹ãæ¹åããããã®éæ£èŠåã®äŸã§ãã éåžžãã¢ã«ãŠã³ãã®ãªã¹ãã¯é貚ã³ãŒããšäžç·ã«è¡šç€ºããããããé貚ã³ãŒããã¢ã«ãŠã³ãèªäœã«è¿œå ããããšã§ãããŒã¿ããŒã¹ãžã®ã¯ãšãªã®çµåãåãé€ãã®ãçã«ããªã£ãŠããŸãã ã¢ã«ãŠã³ãã®é貚ãå€æŽãããšãã«ããšã³ãã£ãã£ãªã¹ãã«ã¢ã«ãŠã³ãã®é貚ã³ãŒããæŽæ°ãããã匷å¶ããŸãïŒå®éã«ã¯ããã¯éåžžã«ãŸãã§ããïŒãããã«ã€ããŠã¯åŸã§è©³ãã説æããŸãã ã¢ã«ãŠã³ãã«ã¯ã active
å±æ§ïŒæ°ããæäœã§äœ¿çšã§ãããšããå
åïŒãšincludeInTotal
å±æ§ïŒãã®å£åº§ã®æ®é«ãåèšæ®é«ã«å«ããå¿
èŠããããšããå
åïŒãå«ãŸããŠããŸããCategory
-åå
¥ãŸãã¯æ¯åºã®ã«ããŽãªã äžæã®ååãšä»»æã®èª¬æããããŸãã catType
å±æ§ã¯ã CategoryType
åæã«ãã£ãŠå®çŸ©ãããã«ããŽãªã¿ã€ãã§ãã æ¢ã«äžèšã§èª¬æããããã«ãåæèå¥åã«ãã£ãŠå®çŸ©ãããå€ïŒãã®å ŽåãæååãEããŸãã¯ãIãïŒã¯ã¯ã©ã¹ãã£ãŒã«ããšããŒã¿ããŒã¹ã«æ ŒçŽãããã²ãã¿ãŒãšã»ãã¿ãŒããããã£ãŠã¢ããªã±ãŒã·ã§ã³ã³ãŒãå
šäœãCategoryType.INCOME
å€ã§åäœããŸãããã³CategoryType.EXPENSE
ãOperation
-æäœã æäœå±æ§ïŒã¿ã€ãïŒ OperationType
åæïŒãæ¥ä»ãè²»çšããã³acc1
åå®ïŒ acc1
ã acc2
ïŒããã³å¯Ÿå¿ããéé¡ïŒ amount1
ã amount2
ïŒãã«ããŽãªããã³ã³ã¡ã³ããBalance
-ç¹å®ã®æ¥ä»ã®å£åº§æ®é«ã äžè¬ã«ãããŒã ã¢ã«ãŠã³ãã£ã³ã°ã®å Žåããã®æ¬è³ªããªããŠãããæéã®åããããåžžã«åçã«æ®é«ãèšç®ããããšãå®å
šã«å¯èœã§ãã ãããã楜ãã¿ã®ããã«ãç§ã¯å€æ°ã®æäœã®å Žåã«å®è£
ãè€éã«ããããšã«ããŸãã-åæã®åãã®å£åº§æ®é«ã¯ãåæäœãèšé²ãããšãã«Balance
ã³ããŒã«ä¿åãããç¿æã®åãïŒããã³ãããããã°ïŒã®æ®é«ãåèšç®ãããŸãã ãã ããçŸåšã®æ¥ä»ã®æ®é«ãèšç®ããã«ã¯ãæã®åãã«æ®é«ãååŸããçŸåšã®æã®æäœã®å£²äžé«ãèšç®ããã ãã§ãã ãã®ã¢ãããŒãã¯ãé·æã«ããã£ãŠããã©ãŒãã³ã¹ã®åé¡ãåŒãèµ·ããããšã¯ãããŸãããUserData
ã¯ãäžéšã®ãŠãŒã¶ãŒé¢é£ããŒã¿ã®ããŒãšå€ã®ã¹ãã¢ã§ãã ããšãã°ãæåŸã«äœ¿çšããã¢ã«ãŠã³ããã«ããŽãªå¥ã®ã¬ããŒããã©ã¡ãŒã¿ãŒã ã€ãŸããç¹°ãè¿ãè¡ããããŠãŒã¶ãŒã¢ã¯ã·ã§ã³äžã«ãèšæ¶ãããå¿
èŠããããã®ãä¿åããŸãã å¯èœãªããŒã¯ã UserDataKeys
ã¯ã©ã¹ã®å®æ°ã«ãã£ãŠå®çŸ©ãããŸãã
ãšã³ãã£ãã£ãªã¹ããŒ

JPAã䜿çšããŠããå Žåã¯ããããããšã³ãã£ãã£ãªã¹ããŒã䜿çšããã§ãããã ããã¯ãããŒã¿ããŒã¹ã®ãšã³ãã£ãã£ãžã®å€æŽãä¿åãããšãã«ã¢ã¯ã·ã§ã³ãå®è¡ããããã®äŸ¿å©ãªã¡ã«ããºã ã§ãã æãéèŠãªããšã¯ããªã¹ããŒã«ãã£ãŠè¡ããããã¹ãŠã®å€æŽã¯ãããŒã¿ããŒã¹ããªã¬ãŒãšåæ§ã«åããã©ã³ã¶ã¯ã·ã§ã³ã§è¡ãããŸãã ãããã£ãŠããªã¹ããŒã®ããŒã¿ã¢ãã«ã®äžè²«æ§ãç¶æããããã®ããžãã¯ãç·šæãããšäŸ¿å©ã§ãã
CUBAã®ãšã³ãã£ãã£ãªã¹ããŒã¯ãå®è£
ãJPAãšãããã«ç°ãªããŸãã ãªã¹ããŒã¯ã©ã¹ã¯ã1ã€ä»¥äžã®ç¹å¥ãªã€ã³ã¿ãŒãã§ã€ã¹ïŒ
BeforeInsertEntityListener
ã
BeforeUpdateEntityListener
ãªã©ïŒãå®è£
ããå¿
èŠããããŸãã ãªã¹ããŒã¯ãæååã®é
åã«ã¯ã©ã¹åããªã¹ãããããš
@Listeners
ã
@Listeners
ã¢ãããŒã·ã§ã³ã®ãšã³ãã£ãã£ã¯ã©ã¹ã«ç»é²ãããŸãã ãšã³ãã£ãã£ã¯äžéå±€ãšã¯ã©ã€ã¢ã³ãã®äž¡æ¹ã«ã¢ã¯ã»ã¹å¯èœãªã°ããŒãã«ãªããžã§ã¯ãã§ããããªã¹ããŒã¯ã¯ã©ã€ã¢ã³ãã«ã¢ã¯ã»ã¹ã§ããªãäžéå±€ã®ã¿ã®ãªããžã§ã¯ãã§ããããããªã¹ããŒã¯ã©ã¹ã®ãªãã©ã«ããšã³ãã£ãã£ã¯ã©ã¹ã§çŽæ¥äœ¿çšããããšã¯ã§ããŸããã ãªã¹ããŒã¯ã
EntityManager
ããã³ããŒã¿ããŒã¹ãæäœããä»ã®æ段ã«ã¢ã¯ã»ã¹ããå¿
èŠããããããäžéå±€ã«ã®ã¿ååšããŸãã
ãã®ã¢ããªã±ãŒã·ã§ã³ã§ã¯ããšã³ãã£ãã£ãªã¹ããŒã¯2ã€ã®æ©èœãå®è¡ããŸãã1ã€ç®ã¯éæ£èŠåãã£ãŒã«ããæŽæ°ãã2ã€ç®ã¯æã®åãã«å£åº§æ®é«ãåèšç®ããããšã§ãã
æåã®ã¿ã¹ã¯ã¯ç°¡åã§ã
onBeforeInsert()
ã¡ãœããã®AccountEntityListener
AccountEntityListener
ã
onBeforeInsert()
ã¯é貚ã³ãŒãã®å€ãæŽæ°ããŸãã ãããè¡ãã«ã¯ã
Currency
é¢é£ã€ã³ã¹ã¿ã³ã¹ãåç
§ããã ãã§ååã§ãã
2çªç®ã®ã¿ã¹ã¯ã¯ãåºæ¬çã«ã¢ããªã±ãŒã·ã§ã³ã®ããžãã¹ããžãã¯ã®äž»èŠãªã¿ã¹ã¯ã®1ã€ã§ãã
OperationEntityListener
ã¯ããã®
onBeforeInsert()
ã
onBeforeUpdate()
ã
onBeforeDelete()
ãŸãã ãã©ã³ã¹ã®åèšç®ã«å ããŠããã®ãªã¹ããŒã¯
UserData
ãªããžã§ã¯ãã§æåŸã«äœ¿çšãããã¢ã«ãŠã³ããèšæ¶ããŸãã
Before-listenerã§ã¯ã
EntityManager
ã®äœ¿çšã«å¶éããªãããšã³ãã£ãã£ã®ã€ã³ã¹ã¿ã³ã¹ãããŒãããã³å€æŽããããšã«æ³šæããŠãã ããã ããšãã°ã
addOperation()
ã§ã¯ã
Query
ã䜿çšããŠ
Query
Balance
ã€ã³ã¹ã¿ã³ã¹ãããŒãããã³å€æŽãããŸãã ãããã¯ã1ã€ã®ãã©ã³ã¶ã¯ã·ã§ã³ã®æäœãšåæã«ããŒã¿ããŒã¹ã«ä¿åãããŸãã
ãªã¹ããŒã§ã¯ãæ°žç¶ã³ã³ããã¹ãã«ãããªããžã§ã¯ãã®ãåã®ãç¶æ
ãã€ãŸãããŒã¿ããŒã¹ã«ããç¶æ
ãååŸããå¿
èŠãããå ŽåããããŸãã ããšãã°ããã®å Žåã
onBeforeUpdate()
å Žåãæåã«æ®é«ããååŒéé¡ã®åã®å€ãå·®ãåŒããŠãããæ°ããå€ãè¿œå ããå¿
èŠããããŸãã ãããè¡ãã«ã¯ã
getOldOperation()
ã䜿çšããŠ
getOldOperation()
ã¡ãœããã§æ°ãããã©ã³ã¶ã¯ã·ã§ã³ãéå§ããããã®ã³ã³ããã¹ãã§
EntityManager
å¥ã®ã€ã³ã¹ã¿ã³ã¹
EntityManager
ååŸãããåãèå¥åãæã€ä»¥åã®æäœç¶æ
ãããŒã¿ããŒã¹ããããŒããããŸãã ãã®åŸããªã¹ããŒãåäœããŠããçŸåšã®ãã©ã³ã¶ã¯ã·ã§ã³ã«åœ±é¿ãäžããããšãªããæ°ãããã©ã³ã¶ã¯ã·ã§ã³ãå®äºããŸãã
äžéå±€ã³ã³ããŒãã³ã


ã¯ã©ã€ã¢ã³ãã¬ãã«ãžã®ããŒã¿ã®ããŒããšããŒã¿ããŒã¹ãžã®ãŠãŒã¶ãŒã«ããå€æŽã®ä¿åã«é¢ããäž»ãªäœæ¥ã¯ããã©ãããã©ãŒã ã«å®è£
ãããŠããæšæºã®DataServiceã«ãã£ãŠå®è¡ãããŸãã ããã«ãããèŠèŠã³ã³ããŒãã³ãã®ããŒã¿ãœãŒã¹ãæ©èœããŸãã ããã¯ã¢ããªã±ãŒã·ã§ã³ã§ã¯ååã§ã¯ãªããããããã€ãã®ç¹å®ã®ãµãŒãã¹ãäœæãããŠããŸãã
ãŸãã
UserDataService
ã§ãããããã«ãã
UserDataService
ã®ããŒãšå€ã®ã¹ãã¬ãŒãžãæäœãããšã³ãã£ãã£èå¥åã®èªã¿åããšæžã蟌ã¿ã®ããã®åä»ãã€ã³ã¿ãŒãã§ã€ã¹ãæäŸã§ããŸãã ãµãŒãã¹ã€ã³ã¿ãŒãã§ã€ã¹ã¯ãã¯ã©ã€ã¢ã³ãã¬ãã«ããã¢ã¯ã»ã¹ã§ããå¿
èŠãããããã
global
ã¢ãžã¥ãŒã«ã«ãããŸãã ãµãŒãã¹ã®å®è£
ã¯ã
UserDataServiceBean
ã¯ã©ã¹ã®ã³ã¢ã¢ãžã¥ãŒã«ã«ãããŸãã
UserDataWorker
ãžã®åŒã³åºããå§ä»»ããŸãããã®
UserDataWorker
ã«ã¯ãæçšãªäœæ¥ãè¡ãã³ãŒããéäžããŠããŸãã ãããè¡ãããã®ã¯ã
OperationEntityListener
ããã®æ©èœãå¿
èŠãªããã§ããã€ãŸããäžéå±€ã®ãå
åŽãããã§ãã ãã®ãµãŒãã¹ã¯ãããã«ãŠã§ã¢å¢çãã圢æããã¯ã©ã€ã¢ã³ããããã¯ããã®åŒã³åºãã®ã¿ãç®çãšããŠããŸãã äžéå±€ã³ã³ããŒãã³ãå
ããåŒã³åºãããšã¯ã§ããŸãããããã«ãããã€ã³ã¿ãŒã»ãã¿ãŒã®æäœãç¹°ãè¿ãããèªèšŒã確èªããŠç¹å¥ãªæ¹æ³ã§äŸå€ãåŠçããŸãã ãŸããé åºã埩å
ããããã«ãããã«ãŠã§ã¢ã®å€éšããåŒã³åºããããµãŒãã¹ããå
éšããåŒã³åºãããæ®ãã®Beanããåé¢ãã䟡å€ããããŸãã å°ãªããšãããã©ã³ã¶ã¯ã·ã§ã³ã®å€éšããåŒã³åºãå Žåã¯åžžã«ååšãããããã«ãŠã§ã¢ã³ãŒãããåŒã³åºãå Žåã¯ããã©ã³ã¶ã¯ã·ã§ã³ãæ¢ã«éãããšãã§ããããã§ãã
次ã®ãµãŒãã¹ã¯
BalanceService
ã§ãã ä»»æã®æ¥ã«å£åº§æ®é«ã®å€ãååŸã§ããŸãã ãã®æ©èœã¯UIã®é¡§å®¢ãšäžéå±€ïŒãã¹ãããŒã¿ãžã§ãã¬ãŒã¿ãŒïŒã®äž¡æ¹ã«å¿
èŠãªã®ã§ãå¥ã®
BalanceWorker
ãé
眮ãã
BalanceWorker
ã
æåŸã®ãµãŒãã¹ã¯
ReportService
ã ã«ããŽãªããšã«ã¬ããŒãã®ããŒã¿ãååŸããéæ°žç¶çãª
CategoryAmount
ãšã³ãã£ãã£ã®ã€ã³ã¹ã¿ã³ã¹ã®ãªã¹ããšããŠè¿ããŸãã
äžéå±€ã«ã¯ããã¹ãããŒã¿ãçæããããã«èšèšããã
SampleDataGenerator
ãã³ãå®è£
ãããŠããŸãã ãã®çš®ã®æ©èœã§ã¯ãéåžžãè€éãªUIã¯å¿
èŠãããŸãã-åçŽãªãã©ã¡ãŒã¿ãŒã®è»¢éãåŒã³åºãã«æäŸããã ãã§ååãªå Žåããããå±æ§ã®ã»ããã®åœ¢åŒã§ç¶æ
ã衚瀺ããå¿
èŠãããå ŽåããããŸãã ããã«ãã·ã¹ãã ã®ãŠãŒã¶ãŒã§ã¯ãªãã管çè
ã®ã¿ããããæäœããŸãã ãã®å ŽåãBeanã«JMXã€ã³ã¿ãŒãã§ãŒã¹ãäžããWebã¯ã©ã€ã¢ã³ãã«çµã¿èŸŒãŸããJMXã³ã³ãœãŒã«ããããŸãã¯ä»»æã®å€éšJMXããŒã«ã«æ¥ç¶ããŠããã®ã¡ãœãããåŒã³åºããšäŸ¿å©ã§ãã ãã®å ŽåãBeanã«ã¯
SampleDataGeneratorMBean
ã€ã³ã¿ãŒãã§ãŒã¹ããããã³ã¢ã¢ãžã¥ãŒã«ã®
spring.xml
ç»é²ãããŠããŸãã
Beanã®
generateSampleData()
ã¡ãœããã«ã¯
@Authenticated
ãšããŠæ³šéãä»ããããŠããããšã«æ³šæããŠãã ããã ã€ãŸãããã®ã¡ãœãããåŒã³åºããããšãç¹å¥ãªã·ã¹ãã ãã°ã€ã³ãå®è¡ãããå®è¡ã¹ã¬ããã«ãŠãŒã¶ãŒã»ãã·ã§ã³ãååšããŸãã ãã®å Žåãã¡ãœããã¯
EntityManager
ãä»ããŠãšã³ãã£ãã£ãäœæããã³å€æŽããããããã®ã¡ãœãããå¿
èŠã§ãããããã®ãšã³ãã£ãã£ã¯ãä¿åæã«å±æ§
createdBy
ã
updatedBy
createdBy
å¿
èŠãšããŸãã äžæ¹ã
removeAllData()
ã¡ãœãããJMXã€ã³ã¿ãŒãã§ãŒã¹çµç±ã§åŒã³åºãããŸããã
QueryRunner
ãä»ããSQLã¯ãšãªã䜿çšããŠããŒã¿ãåé€ãããŠãŒã¶ãŒã»ãã·ã§ã³ã«ã©ããããã¢ã¯ã»ã¹ããªããããèªèšŒã¯å¿
èŠãããŸããã
äžè¬ã«ããŠãŒã¶ãŒã»ãã·ã§ã³ã®ååšã®å¿
é ãã§ãã¯ã¯ãã¯ã©ã€ã¢ã³ãã¬ãã«ããäžéå±€ãžã®å
¥ãå£ïŒãµãŒãã¹ã€ã³ã¿ãŒã»ãã¿ãŒïŒã§ã®ã¿å®è¡ãããŸãã ããã«ãŠã§ã¢ã¬ãã«ã§ã»ãã·ã§ã³ã®ååšãšãŠãŒã¶ãŒæš©éã確èªãããã©ãã-ã¢ããªã±ãŒã·ã§ã³éçºè
ã決å®ããŸããããšã³ãã£ãã£ç£æ»ã®å±æ§ã«ãŠãŒã¶ãŒåãå
¥ããå¿
èŠããããããã»ãã·ã§ã³ã®ååšãå¿
èŠãªå ŽåããããŸãã ããã«ã
DataService
ããšã³ãã£ãã£ã䜿çšããCRUDæäœã®å®è¡ãå§ä»»ãã
DataWorker
ã§ãã
DataWorker
ã§ãŠãŒã¶ãŒæš©éãåžžã«ãã§ãã¯ãããŸãã
ã¡ã€ã³ã¢ããªã±ãŒã·ã§ã³ãŠã£ã³ããŠ
CUBA Webã¯ã©ã€ã¢ã³ãã®æšæºæ©èœã¯ãã¢ããªã±ãŒã·ã§ã³ãŠã£ã³ããŠã®å·ŠåŽã«ããé衚瀺ã®ããã«ã§ãéåžžã¯ãããããã¢ããªã±ãŒã·ã§ã³ãã©ã«ããŒããšãæ€çŽ¢ãã©ã«ããŒãã衚瀺ãããŸãããããã®ãã©ã«ããŒã¯ãæ
å ±ã«ãã°ããã¢ã¯ã»ã¹ããããã«äœ¿çšãããŸãããã©ã«ããŒãã¯ãªãã¯ãããšããšã³ãã£ãã£ã®ãªã¹ããšãã£ã«ã¿ãŒãé©çšãããç¹å®ã®ç»é¢ãéããŸããã¡ã€ã³ãŠã£ã³ããŠã®å·ŠåŽã«çŸåšã®æ®é«ã«é¢ããæ
å ±ã衚瀺ããã®ã¯è«ççã«æããŸãããããã§ããã©ã«ãããã«ã®äžéšã«ãã©ã³ã¹ããã«ãåã蟌ã¿ãŸããã
ããã¯æ¬¡ã®ããã«è¡ãããŸãã- ãã©ãããã©ãŒã ãã
FoldersPane
ã¯ã©ã¹ã掟çãLeftPanel
ãã¡ãœããããªãŒããŒã©ã€ãinit()
ããrefreshFolders()
ã©ã®æ¹æ³ãåŒã³åºãããŸãcreateBalancePanel()
ãæ°ããã³ã³ããããã®äžã«äœæãããããååŸããããŒã¿ã§æºãããBalanceService
ã芪ã³ã³ããã®æäžéšã«é
眮ãããŸãã LeftPanel
FoldersPane
, AppWindow
AkkAppWindow
createFoldersPane()
.AkkAppWindow
AppWindow
, createAppWindow()
App
. , getLeftPanel()
â .
ç»é¢èšè¿°åã¯ãã¡ã€ã«ã«ãããŸãoperation-browse.xml
ãããã§ã¯ãã¹ãŠãæšæºã§ãããã ããæäœããŒãã«ã§æ¥ä»ãšéé¡ãè¡šãããã®ãã©ãŒããã¿ã¯ã©ã¹ã®äœ¿çšã¯é€ããŸããæ¥ä»ã衚瀺ããã«ã¯DateFormatter
ãããŒã«ã©ã€ãºãããã¡ãã»ãŒãžã®ããã±ãŒãžããããŒã«ãã£ãŠãã©ãŒããããéä¿¡ããããã©ãããã©ãŒã ã䜿çšãããŸãããããã£ãŠããã©ãŒãããæååã¯èšèªã«ãã£ãŠç°ãªããŸãããã·ã¢èªã®å Žåãæ¥ä»ã¯ãããã§åºåãããè±èªã®å Žåã¯/ã§åºåãããŸããéé¡ãå°æ°éšãªãã§è¡šç€ºããã0ããŸã£ãã衚瀺ãããªãããã«ããããã«ããããžã§ã¯ãã§ã¯ã©ã¹ãäœæãããŸããDecimalFormatter
-éé¡ã®åã§äœ¿çšãããŸããæäœãšãã£ã¿ãŒ
ããã§ããèå³æ·±ãã®ã¯ãæäœã3ã€ã®ã¿ã€ãïŒåå
¥ãè²»çšãæ¯æ¿ïŒã®ããããã§ãããç·šéç»é¢ãç°ãªãããã«èŠããããšã§ãã

äžèŠãããšãæåã®2ã€ã®ç»é¢ã¯åãããã«èŠããŸãããå®éã¯ããã§ã¯ãããŸãããããžã¥ã¢ã«ã³ã³ããŒãã³ãã¯ããšã³ãã£ãã£ã®ããŸããŸãªå±æ§Operation
-ãšã®è²»çšãacc1
- amount1
ãšã®åå
¥ãacc2
ããã³ãšã®åå
¥amount2
ã§ãããã®å¯å€æ§ã¯ãã³ã³ãããŒã©ãŒã³ãŒãã§å®å
šã«å®è£
ã§ããŸãããç»é¢ã®ããŸããŸãªéšåãå¥ã
ã®ãã¬ãŒã ã«åå²ããããšã§ããã宣èšçã«è¡ãããšã«ããŸããã3ã€ã®ãã¬ãŒã -æäœã®çš®é¡ã®æ°ããããã¯ãã¹ãŠãæäœç·šéç»é¢èªäœãšåãããã±ãŒãžã«ãããŸããã»ãšãã©ã®å Žåããã¬ãŒã ã¯éçã«æ¥ç¶ãããŸã-ã³ã³ããŒãã³ãã䜿çšããŠiframe
XMLç»é¢èšè¿°åå
ãæäœã®ã¿ã€ãã«å¿ããŠç®çã®ãã¬ãŒã ãéžæããå¿
èŠããããããããã¯ç§ãã¡ã«ã¯é©ããŠããŸããããããã£ãŠãç»é¢ã®XMLèšè¿°åã§ã¯operation-edit.xml
ããã¬ãŒã ã®ã³ã³ããã®ã¿ãå®çŸ©ãããŸãgroupBox
ãèå¥åãæã€ã³ã³ããŒãã³ãframeContainer
ãããã³ç»é¢ãžã®ãã¬ãŒã ã®å®éã®äœæãšæ¿å
¥ã¯ãã³ã³ãããŒã©ãŒã§å®è¡ãããŸãOperationEdit
ã @Inject private GroupBoxLayout frameContainer; private OperationFrame operationFrame; @Override public void init(Map<String, Object> params) { ... String frameId = operation.getOpType().name().toLowerCase() + "-frame"; operationFrame = openFrame(frameContainer, frameId, params);
ããã§OperationFrame
-ãã¬ãŒã ã³ã³ãããŒã©æäœã®çš®é¡ã«ãã£ãŠå®è£
ãããã€ã³ã¿ãã§ãŒã¹ããããä»ããŠã3ã€ã®ãã¬ãŒã ãã¹ãŠãåäžã«ç®¡çããããšãã€ãŸãããããåæåããã³æ€èšŒããããšã䟿å©ã§ããã³ã³ãããŒã©ãŒã¡ãœããã«ã¯å¥ã®èå³æ·±ããã€ã³ãããããŸããæäœãã³ããããããåŸã«èµ·åãããªã¹ããŒãç»é²ãããŸããinit()
OperationEdit
@Override public void init(Map<String, Object> params) { ... getDsContext().addListener(new DsContext.CommitListenerAdapter() { @Override public void afterCommit(CommitContext context, Set<Entity> result) { LeftPanel leftPanel = App.getLeftPanel(); if (leftPanel != null) leftPanel.refreshBalance(); } }); }
ãã®ãªã¹ããŒã¯ãçŸåšã®ãã©ã³ã¹ã衚瀺ããå·Šããã«ã®ã³ã³ãã³ããæŽæ°ããŸããæäœã¿ã€ããã¬ãŒã ã«ã¯ã次ã®å
±éæ©èœããããŸããåèšã§æ©èœããããã¹ããã£ãŒã«ãã¯ãããŒã¿ãœãŒã¹ã«æ·»ä»ãããŸãããããã¯ããã£ãŒã«ãã«ç®è¡åŒãå
¥åã§ããããã«è¡ãããã·ã¹ãã ãéé¡ãèšç®ããŸããæ€èšããŠãã ããexpense-frame.xml
ãtextField
èå¥åã䜿çšããŠã³ã³ããŒãã³ãã宣èšããŸãamountField
ãã³ã³ãããŒã©ãŒExpenseFrame
ã¯AmountCalculator
ãåèšèšç®ããžãã¯ãã«ãã»ã«åããããã³ã䜿çšããŸãã @Inject private TextField amountField; @Inject private AmountCalculator amountCalculator; @Override public void postInit(Operation item) { amountCalculator.initAmount(amountField, item.getAmount1()); ⊠} @Override public void postValidate(ValidationErrors errors) { BigDecimal value = amountCalculator.calculateAmount(amountField, errors); ⊠}
Webã¯ã©ã€ã¢ã³ãå±€ã§å®çŸ©ãããåãBeanã¯ãä»ã®2ã€ã®ãã¬ãŒã ã³ã³ãããŒã©ãŒã§ã䜿çšãããŸããinitAmount()
Bean ã¡ãœããã¯ãããã¹ãããã¯ã¹ã®ããŒã¿åã§ãã©ãŒããããããçŸåšã®éãèšå®ããŸãBigDecimal
ãdatatype = decimal
ã³ã³ããŒãã³ãã«æå®ããããšã¯åçŽã«äžå¯èœã§ãããã®å Žåãæ°åã®ã¿ãå
¥åããããšãå¯èœã§ãããç®è¡åŒãå
¥åã§ããå¿
èŠãããããã§ããã¡ãœããcalculateAmount()
ã¯ãæ£èŠè¡šçŸã䜿çšããŠåŒã®æ£ç¢ºæ§ããã§ãã¯ããã€ã³ã¿ãŒãã§ã€ã¹ãä»ããŠGroovyã®åŒãšããŠå®è¡ããŸãScripting
ãçµæã¯æ°å€ã«ãªããæäœãèšå®ããããã«ã¹ã¯ãªãŒã³ã³ã³ãããŒã©ãŒã«è¿ãããŸããã«ããŽãªãŒã¬ããŒã
ãã®å¯Ÿè©±åã¬ããŒãã¯ç»é¢ã«ãã£ãŠå®è£
ãããŸãcategories-report.xml
ããã®ã¿ã€ãã®2ã€ã®ã«ã¹ã¿ã ããŒã¿ãœãŒã¹ãå«ãŸããŠãããããäž»ã«èå³æ·±ããã®CategoryAmountDatasource
ã§ããããŒã¿ãœãŒã¹ã¯ã©ã¹ã¯datasourceClass
element å±æ§ã§æå®ãããŸãcollectionDatasource
ããããã®ããŒã¿ãœãŒã¹ã«ã¯JPQLæŒç®åãæå®ãããŸããã䜿çšããããæå®ãããŠããªãå Žåã¯Studioãã¯ãšãªããã¹ããèªåçã«çæããããã«ã®ã¿ååšããŸããå®éãããŒã¿ãœãŒã¹CategoryAmountDatasource
ã¯ã¡ãœããloadData()
ããªãŒããŒã©ã€ããDataService
ãJPQLã¯ãšãªãä»ããŠããŒã¿ãããŒããã代ããã«ãserviceãåŒã³åºãReportService
ãå¿
èŠãªãã©ã¡ãŒã¿ãŒãæž¡ããŸãã public class CategoryAmountDatasource extends CollectionDatasourceImpl<CategoryAmount, UUID> { private ReportService service = AppBeans.get(ReportService.NAME); @Override protected void loadData(Map<String, Object> params) { ... Date fromDate = (Date) params.get("from"); Date toDate = (Date) params.get("to"); ... List<CategoryAmount> list = service.getTurnoverByCategories(fromDate, toDate, categoryType, currency.getCode(), ids); for (CategoryAmount categoryAmount : list) { data.put(categoryAmount.getId(), categoryAmount); } ... }
ãã©ã¡ãŒã¿ã¯ãrefresh()
ããŒã¿ãœãŒã¹ã¡ãœããã®ã¹ã¯ãªãŒã³ã³ã³ãããŒã©ãŒã«ãã£ãŠèšå®ãããŸããã¡ãœããrefreshDs1()
ãrefreshDs2()
ã¯ã©ã¹ãåç
§ããŠãã ããCategoriesReport
ããµãŒãã¹ã¯éæ°žç¶ãšã³ãã£ãã£ã€ã³ã¹ã¿ã³ã¹ã®ãªã¹ããè¿ãCategoryAmount
ãããŒã¿ãœãŒã¹ã¯ããããããŒã¿ã³ã¬ã¯ã·ã§ã³ã«ä¿åããŸãããããã£ãŠããããã®ããŒã¿ãœãŒã¹ã«é¢é£ä»ããããããŒãã«CategoryAmount
ã¯ãéåžžã®æ¹æ³ã§ããŒã¿ããŒã¹ããããŒããããä»ã®ãšã³ãã£ãã£ãšããŠã€ã³ã¹ã¿ã³ã¹ã衚瀺ããŸãã[é€å€]ãã¿ã³ã®æ©èœã¯èå³æ·±ãããã«èšèšãããŠãããéžæããã«ããŽãªãæ€èšå¯Ÿè±¡ããé€å€ã§ããŸãããã®ãããª2ã€ã®ãã¿ã³ã¯ãèšè¿°åã§categories-report.xml
宣èšãããŠããŸã-å·Šå³ã®ããŒãã«çšã§ããåãã¿ã³ã¯ã¢ã¯ã·ã§ã³ã«é¢é£ä»ããããŠããŸããexcludeCategory
ããªãã®ããŒãã«ããã ããXMLèšè¿°åã®ããŒãã«ã«å¯ŸããŠã¢ã¯ã·ã§ã³ã¯å®£èšãããŠããŸãããã©ã®ããã«æ©èœããŸããïŒå®éããã®å Žåã®ããŒãã«ã®ã¢ã¯ã·ã§ã³ã¯init()
ã¹ã¯ãªãŒã³ã³ã³ãããŒã©ãŒã¡ãœããã«è¿œå ãããŸãinitExcludedCategories()
ãã¡ãœãããåç
§ããŠãã ããããã®ã¡ãœããã¯ããµãŒãã¹ã䜿çšããŠèšæ¶ãããŠãã以åã«é€å€ãããã«ããŽãªã®ãªã¹ããããªã³ãŒã«ãããŸãUserDataService
ãåã¢ã¯ã·ã§ã³ã¯ExcludeCategoryAction
ãããªã¬ãŒããããšãé€å€ãããã«ããŽãªã«å¯Ÿå¿ãããªã³ã¯ãã¿ã³ãæã€ã³ã³ãããšç¢æãäœæãããã³ãã«ã§äºåã«å®£èšãããã³ã³ããå
ã«æ°ããã³ã³ãããé
眮ããã¡ãœããexcludeCategory()
ãåŒã³åºãComponentsFactory
ãŸãexcludedBox
ããã¿ã³ããšã«ãªã¹ããŒãäœæãããããªã¬ãŒããããšããã¿ã³ãã©ãã«ãšãšãã«é
眮ãããŠããã³ã³ããå
šäœã芪ã³ã³ããããåé€ãããŸããããã«ãããŒã¿ãœãŒã¹ã¯ã«ããŽãªãªã¹ããåç·šæããããšã«ããæŽæ°ãããŸããäžè¬ã«ãã«ããŽãªã¬ããŒãç»é¢ã¯ãã©ãããã©ãŒã ã䜿çšããããã®ããªãéæšæºã®ãªãã·ã§ã³ã§ãããããå€ãã®æåã§èšè¿°ãããããžãã¯ããããéåžžã¯ã³ã³ããŒãã³ãã®çžäºäœçšã®æšæºãªãã·ã§ã³å
ã«é ãããŠããŸããè¬èŸ
ãã°ãã䜿ã£ãŠããçŽ æŽãããzenmoney.ruãµãŒãã¹ããã¢ã€ãã¢ãåŸãŸããããã©ãããã©ãŒã ã«å«ãŸãããã¹ãŠã®ãªãŒãã³ãœãŒã¹ã©ã€ãã©ãªãšãã¬ãŒã ã¯ãŒã¯ã¯ã[ãã«ã]-> [ããŒãžã§ã³æ
å ±]-> [ã¯ã¬ãžãã]ãŠã£ã³ããŠã«ãªã¹ããããŠããŸããç¶ã
åãã¢ããªã±ãŒã·ã§ã³ã«é¢ãã次ã®èšäºã§ã¯ãBackbone.js + Bootstrapã§èšè¿°ãããREST APIãä»ããŠäžéå±€ãšå¯Ÿè©±ããããã€ã¹ãããã¯ã¬ã¹ãã³ã·ãUIã«ã€ããŠèª¬æããäºå®ã§ããããã«ãã¡ã€ã³UIã®ããŒãããããã«å€æŽããæ°ããUIã³ã³ããŒãã³ããè¿œå ããŠããããžã§ã¯ãã§ã€ã³ã¿ãŒãã§ã€ã¹ãã«ã¹ã¿ãã€ãºããå¯èœæ§ã瀺ããŸãã