├── .gitignore ├── aardio-erp ├── res │ ├── version.txt │ ├── System │ │ ├── Error.aardio │ │ ├── EditPwd.aardio │ │ ├── User.aardio │ │ ├── UserAddEdit.aardio │ │ ├── Menu.aardio │ │ ├── MenuAddEdit.aardio │ │ └── LimitMenu.aardio │ ├── Main │ │ ├── menu.aardio │ │ ├── mainLayout.aardio │ │ └── loginLayout.aardio │ └── Demo │ │ └── Report.aardio ├── favicon.ico ├── aardio-erp-mssql.sql ├── lib │ ├── ws │ │ ├── System │ │ │ ├── 直连.txt │ │ │ ├── Errlog.aardio │ │ │ ├── SystemUserToMenu.aardio │ │ │ ├── _.aardio │ │ │ ├── SystemUser.aardio │ │ │ └── SystemMenu.aardio │ │ ├── Demo │ │ │ ├── Demo.aardio │ │ │ └── _.aardio │ │ ├── sql.aardio │ │ └── _.aardio │ ├── web │ │ ├── layout │ │ │ ├── behavior │ │ │ │ ├── login │ │ │ │ │ ├── password.aardio │ │ │ │ │ ├── buttons.aardio │ │ │ │ │ └── selectRoad.aardio │ │ │ │ ├── main │ │ │ │ │ ├── click.aardio │ │ │ │ │ ├── systemMenuClick.aardio │ │ │ │ │ └── systemMenu.aardio │ │ │ │ ├── msgbox.aardio │ │ │ │ └── titleMenu.aardio │ │ │ └── msgbox.aardio │ │ └── layoutEx.aardio │ ├── config.aardio │ └── conn.aardio ├── .build │ ├── default.init.aardio │ ├── default.main.aardio │ └── default.Manifest.xml ├── layout │ ├── styles │ │ ├── msgbox.css │ │ ├── images │ │ │ ├── Home.png │ │ │ ├── Quartz.png │ │ │ ├── Search.png │ │ │ ├── System.png │ │ │ ├── iDisk.png │ │ │ ├── msgbox.png │ │ │ ├── GetInfo.png │ │ │ ├── Keychain.png │ │ │ ├── Network.png │ │ │ ├── Numbers.png │ │ │ ├── Security.png │ │ │ ├── Unknown.png │ │ │ ├── loading.png │ │ │ ├── password.png │ │ │ ├── qq │ │ │ │ ├── Thumbs.db │ │ │ │ ├── afternoon.jpg │ │ │ │ ├── btn_max_down.png │ │ │ │ ├── btn_mini_down.png │ │ │ │ ├── btn_set_hover.png │ │ │ │ ├── btn_set_press.png │ │ │ │ ├── btn_close_down.png │ │ │ │ ├── btn_max_normal.png │ │ │ │ ├── btn_mini_normal.png │ │ │ │ ├── btn_set_normal.png │ │ │ │ ├── checkbox_normal.png │ │ │ │ ├── checkbox_pushed.png │ │ │ │ ├── edit_frame_down.png │ │ │ │ ├── login_head_bkg.png │ │ │ │ ├── noavatar_middle.gif │ │ │ │ ├── btn_close_normal.png │ │ │ │ ├── btn_max_highlight.png │ │ │ │ ├── btn_mini_highlight.png │ │ │ │ ├── btn_restore_down.png │ │ │ │ ├── btn_restore_normal.png │ │ │ │ ├── button_login_down.png │ │ │ │ ├── button_login_hover.png │ │ │ │ ├── corner_right_hover.png │ │ │ │ ├── edit_frame_hover.png │ │ │ │ ├── edit_frame_normal.png │ │ │ │ ├── switch_single_down.png │ │ │ │ ├── btn_close_highlight.png │ │ │ │ ├── button_login_normal.png │ │ │ │ ├── checkbox_hightlight.png │ │ │ │ ├── checkbox_tick_normal.png │ │ │ │ ├── checkbox_tick_pushed.png │ │ │ │ ├── switch_single_hover.png │ │ │ │ ├── switch_single_normal.png │ │ │ │ ├── btn_restore_highlight.png │ │ │ │ ├── checkbox_tick_highlight.png │ │ │ │ ├── corner_right_normal_down.png │ │ │ │ ├── edit_frame_down_reversed.png │ │ │ │ ├── edit_frame_hover_reversed.png │ │ │ │ ├── corner_right_normal_breath.png │ │ │ │ └── edit_frame_normal_reversed.png │ │ │ ├── Documents.png │ │ │ ├── Iconfactory.png │ │ │ ├── Input-box.png │ │ │ ├── msgboxErr.png │ │ │ ├── msgboxTest.png │ │ │ └── bouncing-beach-ball.png │ │ ├── titlebar.css │ │ └── main.css │ ├── titlebar.html │ ├── msgbox.html │ ├── main.html │ └── login.html ├── config │ └── loginForm.table ├── default.main.aardio └── rpc │ └── wwwroot │ └── system │ ├── functions.aardio │ ├── rpc.aardio │ ├── config.aardio │ └── sqlhelper.aardio ├── lib └── carl │ ├── _.aardio │ ├── ctrl │ ├── .res │ │ ├── toolbar.gif │ │ └── toolbar.psd │ ├── _.aardio │ ├── pageSort.aardio │ ├── treeviewex.aardio │ ├── tab.aardio │ ├── select.aardio │ ├── comboboxex.aardio │ ├── toolbar.aardio │ └── pagectrl.aardio │ ├── rpc │ ├── _.aardio │ ├── server.aardio │ └── client.aardio │ ├── rsa.aardio │ ├── log.aardio │ ├── report │ ├── _.aardio │ └── template.aardio │ ├── oracle.aardio │ ├── mysql.aardio │ ├── sql.aardio │ ├── processcmd.aardio │ ├── http.aardio │ ├── update.aardio │ └── mssql.aardio ├── aardio-rpc ├── .build │ ├── default.init.aardio │ ├── default.main.aardio │ └── default.Manifest.xml ├── publicKey.txt ├── default.aproj ├── privateKey.txt ├── functions.aardio ├── res │ └── rpc.aardio ├── rpc.aardio ├── config.aardio ├── sqlhelper.aardio └── main.aardio ├── README.md ├── aardio-cgi ├── .build │ ├── default.init.aardio │ ├── default.main.aardio │ └── default.Manifest.xml ├── default.aproj ├── lib │ └── config.aardio └── main.aardio └── LICENSE /.gitignore: -------------------------------------------------------------------------------- 1 | 2 | Publish 3 | /*.ppk -------------------------------------------------------------------------------- /aardio-erp/res/version.txt: -------------------------------------------------------------------------------- 1 | 1.0.05 -------------------------------------------------------------------------------- /lib/carl/_.aardio: -------------------------------------------------------------------------------- 1 | 2 | namespace carl{ 3 | 4 | } 5 | -------------------------------------------------------------------------------- /aardio-rpc/.build/default.init.aardio: -------------------------------------------------------------------------------- 1 | //发布前触发 2 | import ide; -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/carlaau/aardio-erp/HEAD/README.md -------------------------------------------------------------------------------- /aardio-erp/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/carlaau/aardio-erp/HEAD/aardio-erp/favicon.ico -------------------------------------------------------------------------------- /aardio-erp/aardio-erp-mssql.sql: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/carlaau/aardio-erp/HEAD/aardio-erp/aardio-erp-mssql.sql -------------------------------------------------------------------------------- /aardio-erp/lib/ws/System/直连.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/carlaau/aardio-erp/HEAD/aardio-erp/lib/ws/System/直连.txt -------------------------------------------------------------------------------- /lib/carl/ctrl/.res/toolbar.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/carlaau/aardio-erp/HEAD/lib/carl/ctrl/.res/toolbar.gif -------------------------------------------------------------------------------- /lib/carl/ctrl/.res/toolbar.psd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/carlaau/aardio-erp/HEAD/lib/carl/ctrl/.res/toolbar.psd -------------------------------------------------------------------------------- /aardio-erp/.build/default.init.aardio: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/carlaau/aardio-erp/HEAD/aardio-erp/.build/default.init.aardio -------------------------------------------------------------------------------- /aardio-erp/.build/default.main.aardio: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/carlaau/aardio-erp/HEAD/aardio-erp/.build/default.main.aardio -------------------------------------------------------------------------------- /aardio-erp/layout/styles/msgbox.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/carlaau/aardio-erp/HEAD/aardio-erp/layout/styles/msgbox.css -------------------------------------------------------------------------------- /aardio-cgi/.build/default.init.aardio: -------------------------------------------------------------------------------- 1 | //发布前触发 2 | import ide; 3 | import process.file; 4 | process.file.terminate( ide.getPublishPath() ); -------------------------------------------------------------------------------- /aardio-erp/layout/styles/images/Home.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/carlaau/aardio-erp/HEAD/aardio-erp/layout/styles/images/Home.png -------------------------------------------------------------------------------- /aardio-erp/layout/styles/images/Quartz.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/carlaau/aardio-erp/HEAD/aardio-erp/layout/styles/images/Quartz.png -------------------------------------------------------------------------------- /aardio-erp/layout/styles/images/Search.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/carlaau/aardio-erp/HEAD/aardio-erp/layout/styles/images/Search.png -------------------------------------------------------------------------------- /aardio-erp/layout/styles/images/System.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/carlaau/aardio-erp/HEAD/aardio-erp/layout/styles/images/System.png -------------------------------------------------------------------------------- /aardio-erp/layout/styles/images/iDisk.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/carlaau/aardio-erp/HEAD/aardio-erp/layout/styles/images/iDisk.png -------------------------------------------------------------------------------- /aardio-erp/layout/styles/images/msgbox.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/carlaau/aardio-erp/HEAD/aardio-erp/layout/styles/images/msgbox.png -------------------------------------------------------------------------------- /aardio-erp/layout/styles/images/GetInfo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/carlaau/aardio-erp/HEAD/aardio-erp/layout/styles/images/GetInfo.png -------------------------------------------------------------------------------- /aardio-erp/layout/styles/images/Keychain.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/carlaau/aardio-erp/HEAD/aardio-erp/layout/styles/images/Keychain.png -------------------------------------------------------------------------------- /aardio-erp/layout/styles/images/Network.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/carlaau/aardio-erp/HEAD/aardio-erp/layout/styles/images/Network.png -------------------------------------------------------------------------------- /aardio-erp/layout/styles/images/Numbers.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/carlaau/aardio-erp/HEAD/aardio-erp/layout/styles/images/Numbers.png -------------------------------------------------------------------------------- /aardio-erp/layout/styles/images/Security.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/carlaau/aardio-erp/HEAD/aardio-erp/layout/styles/images/Security.png -------------------------------------------------------------------------------- /aardio-erp/layout/styles/images/Unknown.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/carlaau/aardio-erp/HEAD/aardio-erp/layout/styles/images/Unknown.png -------------------------------------------------------------------------------- /aardio-erp/layout/styles/images/loading.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/carlaau/aardio-erp/HEAD/aardio-erp/layout/styles/images/loading.png -------------------------------------------------------------------------------- /aardio-erp/layout/styles/images/password.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/carlaau/aardio-erp/HEAD/aardio-erp/layout/styles/images/password.png -------------------------------------------------------------------------------- /aardio-erp/layout/styles/images/qq/Thumbs.db: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/carlaau/aardio-erp/HEAD/aardio-erp/layout/styles/images/qq/Thumbs.db -------------------------------------------------------------------------------- /aardio-erp/layout/styles/images/Documents.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/carlaau/aardio-erp/HEAD/aardio-erp/layout/styles/images/Documents.png -------------------------------------------------------------------------------- /aardio-erp/layout/styles/images/Iconfactory.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/carlaau/aardio-erp/HEAD/aardio-erp/layout/styles/images/Iconfactory.png -------------------------------------------------------------------------------- /aardio-erp/layout/styles/images/Input-box.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/carlaau/aardio-erp/HEAD/aardio-erp/layout/styles/images/Input-box.png -------------------------------------------------------------------------------- /aardio-erp/layout/styles/images/msgboxErr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/carlaau/aardio-erp/HEAD/aardio-erp/layout/styles/images/msgboxErr.png -------------------------------------------------------------------------------- /aardio-erp/layout/styles/images/msgboxTest.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/carlaau/aardio-erp/HEAD/aardio-erp/layout/styles/images/msgboxTest.png -------------------------------------------------------------------------------- /aardio-erp/config/loginForm.table: -------------------------------------------------------------------------------- 1 | {txtUserName="admin";roadName="内网";ahtmlServerUrl="http://192.168.17.249:8020";cbreSart=false;beforeSave=null;txtPwd=""} -------------------------------------------------------------------------------- /aardio-erp/layout/styles/images/qq/afternoon.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/carlaau/aardio-erp/HEAD/aardio-erp/layout/styles/images/qq/afternoon.jpg -------------------------------------------------------------------------------- /aardio-cgi/.build/default.main.aardio: -------------------------------------------------------------------------------- 1 | //此触发器在生成EXE以后执行 2 | import ide; 3 | import fsys; 4 | 5 | //获取生成的EXE文件路径 6 | var publishFile = ide.getPublishPath(); -------------------------------------------------------------------------------- /aardio-erp/layout/styles/images/qq/btn_max_down.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/carlaau/aardio-erp/HEAD/aardio-erp/layout/styles/images/qq/btn_max_down.png -------------------------------------------------------------------------------- /aardio-erp/layout/styles/images/qq/btn_mini_down.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/carlaau/aardio-erp/HEAD/aardio-erp/layout/styles/images/qq/btn_mini_down.png -------------------------------------------------------------------------------- /aardio-erp/layout/styles/images/qq/btn_set_hover.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/carlaau/aardio-erp/HEAD/aardio-erp/layout/styles/images/qq/btn_set_hover.png -------------------------------------------------------------------------------- /aardio-erp/layout/styles/images/qq/btn_set_press.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/carlaau/aardio-erp/HEAD/aardio-erp/layout/styles/images/qq/btn_set_press.png -------------------------------------------------------------------------------- /aardio-erp/layout/styles/images/qq/btn_close_down.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/carlaau/aardio-erp/HEAD/aardio-erp/layout/styles/images/qq/btn_close_down.png -------------------------------------------------------------------------------- /aardio-erp/layout/styles/images/qq/btn_max_normal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/carlaau/aardio-erp/HEAD/aardio-erp/layout/styles/images/qq/btn_max_normal.png -------------------------------------------------------------------------------- /aardio-erp/layout/styles/images/qq/btn_mini_normal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/carlaau/aardio-erp/HEAD/aardio-erp/layout/styles/images/qq/btn_mini_normal.png -------------------------------------------------------------------------------- /aardio-erp/layout/styles/images/qq/btn_set_normal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/carlaau/aardio-erp/HEAD/aardio-erp/layout/styles/images/qq/btn_set_normal.png -------------------------------------------------------------------------------- /aardio-erp/layout/styles/images/qq/checkbox_normal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/carlaau/aardio-erp/HEAD/aardio-erp/layout/styles/images/qq/checkbox_normal.png -------------------------------------------------------------------------------- /aardio-erp/layout/styles/images/qq/checkbox_pushed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/carlaau/aardio-erp/HEAD/aardio-erp/layout/styles/images/qq/checkbox_pushed.png -------------------------------------------------------------------------------- /aardio-erp/layout/styles/images/qq/edit_frame_down.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/carlaau/aardio-erp/HEAD/aardio-erp/layout/styles/images/qq/edit_frame_down.png -------------------------------------------------------------------------------- /aardio-erp/layout/styles/images/qq/login_head_bkg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/carlaau/aardio-erp/HEAD/aardio-erp/layout/styles/images/qq/login_head_bkg.png -------------------------------------------------------------------------------- /aardio-erp/layout/styles/images/qq/noavatar_middle.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/carlaau/aardio-erp/HEAD/aardio-erp/layout/styles/images/qq/noavatar_middle.gif -------------------------------------------------------------------------------- /aardio-erp/layout/styles/images/bouncing-beach-ball.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/carlaau/aardio-erp/HEAD/aardio-erp/layout/styles/images/bouncing-beach-ball.png -------------------------------------------------------------------------------- /aardio-erp/layout/styles/images/qq/btn_close_normal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/carlaau/aardio-erp/HEAD/aardio-erp/layout/styles/images/qq/btn_close_normal.png -------------------------------------------------------------------------------- /aardio-erp/layout/styles/images/qq/btn_max_highlight.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/carlaau/aardio-erp/HEAD/aardio-erp/layout/styles/images/qq/btn_max_highlight.png -------------------------------------------------------------------------------- /aardio-erp/layout/styles/images/qq/btn_mini_highlight.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/carlaau/aardio-erp/HEAD/aardio-erp/layout/styles/images/qq/btn_mini_highlight.png -------------------------------------------------------------------------------- /aardio-erp/layout/styles/images/qq/btn_restore_down.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/carlaau/aardio-erp/HEAD/aardio-erp/layout/styles/images/qq/btn_restore_down.png -------------------------------------------------------------------------------- /aardio-erp/layout/styles/images/qq/btn_restore_normal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/carlaau/aardio-erp/HEAD/aardio-erp/layout/styles/images/qq/btn_restore_normal.png -------------------------------------------------------------------------------- /aardio-erp/layout/styles/images/qq/button_login_down.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/carlaau/aardio-erp/HEAD/aardio-erp/layout/styles/images/qq/button_login_down.png -------------------------------------------------------------------------------- /aardio-erp/layout/styles/images/qq/button_login_hover.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/carlaau/aardio-erp/HEAD/aardio-erp/layout/styles/images/qq/button_login_hover.png -------------------------------------------------------------------------------- /aardio-erp/layout/styles/images/qq/corner_right_hover.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/carlaau/aardio-erp/HEAD/aardio-erp/layout/styles/images/qq/corner_right_hover.png -------------------------------------------------------------------------------- /aardio-erp/layout/styles/images/qq/edit_frame_hover.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/carlaau/aardio-erp/HEAD/aardio-erp/layout/styles/images/qq/edit_frame_hover.png -------------------------------------------------------------------------------- /aardio-erp/layout/styles/images/qq/edit_frame_normal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/carlaau/aardio-erp/HEAD/aardio-erp/layout/styles/images/qq/edit_frame_normal.png -------------------------------------------------------------------------------- /aardio-erp/layout/styles/images/qq/switch_single_down.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/carlaau/aardio-erp/HEAD/aardio-erp/layout/styles/images/qq/switch_single_down.png -------------------------------------------------------------------------------- /aardio-erp/layout/styles/images/qq/btn_close_highlight.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/carlaau/aardio-erp/HEAD/aardio-erp/layout/styles/images/qq/btn_close_highlight.png -------------------------------------------------------------------------------- /aardio-erp/layout/styles/images/qq/button_login_normal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/carlaau/aardio-erp/HEAD/aardio-erp/layout/styles/images/qq/button_login_normal.png -------------------------------------------------------------------------------- /aardio-erp/layout/styles/images/qq/checkbox_hightlight.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/carlaau/aardio-erp/HEAD/aardio-erp/layout/styles/images/qq/checkbox_hightlight.png -------------------------------------------------------------------------------- /aardio-erp/layout/styles/images/qq/checkbox_tick_normal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/carlaau/aardio-erp/HEAD/aardio-erp/layout/styles/images/qq/checkbox_tick_normal.png -------------------------------------------------------------------------------- /aardio-erp/layout/styles/images/qq/checkbox_tick_pushed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/carlaau/aardio-erp/HEAD/aardio-erp/layout/styles/images/qq/checkbox_tick_pushed.png -------------------------------------------------------------------------------- /aardio-erp/layout/styles/images/qq/switch_single_hover.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/carlaau/aardio-erp/HEAD/aardio-erp/layout/styles/images/qq/switch_single_hover.png -------------------------------------------------------------------------------- /aardio-erp/layout/styles/images/qq/switch_single_normal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/carlaau/aardio-erp/HEAD/aardio-erp/layout/styles/images/qq/switch_single_normal.png -------------------------------------------------------------------------------- /aardio-erp/layout/styles/images/qq/btn_restore_highlight.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/carlaau/aardio-erp/HEAD/aardio-erp/layout/styles/images/qq/btn_restore_highlight.png -------------------------------------------------------------------------------- /aardio-erp/layout/styles/images/qq/checkbox_tick_highlight.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/carlaau/aardio-erp/HEAD/aardio-erp/layout/styles/images/qq/checkbox_tick_highlight.png -------------------------------------------------------------------------------- /aardio-erp/layout/styles/images/qq/corner_right_normal_down.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/carlaau/aardio-erp/HEAD/aardio-erp/layout/styles/images/qq/corner_right_normal_down.png -------------------------------------------------------------------------------- /aardio-erp/layout/styles/images/qq/edit_frame_down_reversed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/carlaau/aardio-erp/HEAD/aardio-erp/layout/styles/images/qq/edit_frame_down_reversed.png -------------------------------------------------------------------------------- /aardio-erp/layout/styles/images/qq/edit_frame_hover_reversed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/carlaau/aardio-erp/HEAD/aardio-erp/layout/styles/images/qq/edit_frame_hover_reversed.png -------------------------------------------------------------------------------- /aardio-erp/layout/styles/images/qq/corner_right_normal_breath.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/carlaau/aardio-erp/HEAD/aardio-erp/layout/styles/images/qq/corner_right_normal_breath.png -------------------------------------------------------------------------------- /aardio-erp/layout/styles/images/qq/edit_frame_normal_reversed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/carlaau/aardio-erp/HEAD/aardio-erp/layout/styles/images/qq/edit_frame_normal_reversed.png -------------------------------------------------------------------------------- /aardio-rpc/publicKey.txt: -------------------------------------------------------------------------------- 1 | BgIAAACkAABSU0ExAAQAAAEAAQDve7UdKeI35NfLa8JkE4YQsxwKNCeE/OwAsqwd 2 | iVv/g4I0Lay5DupUhM8j8DHPePg6TFiDQ2APSaSRx5hiA/lrDlfX2UBltJV+Hzl8 3 | lxhj/wChQl8+7A9I6IvcyjqCzwZMRllVj5cOUFouxJJV/PqemQf5n+vQJ90V2B6F 4 | kCnjxg== -------------------------------------------------------------------------------- /aardio-erp/lib/web/layout/behavior/login/password.aardio: -------------------------------------------------------------------------------- 1 | 2 | namespace web.layout.behavior.login.password 3 | 4 | onKeyUp = function( ltTarget,ltOwner,keyCode, altState, ltKeyParams ) { 5 | if(keyCode == 0xD/*_VK_ENTER*/){ 6 | ltOwner.getLayout().getEle("login").click();//回车登录 7 | } 8 | } -------------------------------------------------------------------------------- /aardio-rpc/.build/default.main.aardio: -------------------------------------------------------------------------------- 1 | //此触发器在生成EXE以后执行 2 | import ide; 3 | import fsys; 4 | 5 | //把main.aau复制到目标目录 6 | var pubMain = io.joinpath(ide.getPublisDir(),"/main.aardio"); 7 | if( !..io.exist(pubMain) ){ 8 | //fsys.copy( io.joinpath( ide.getProjectDir(),"/main.aardio"),pubMain) 9 | } -------------------------------------------------------------------------------- /aardio-erp/lib/web/layout/behavior/main/click.aardio: -------------------------------------------------------------------------------- 1 | 2 | namespace web.layout.behavior.main.click 3 | 4 | onMouseUp = { 5 | 6 | default = function( ltTarget,ltOwner,x,y,ltMouseParams ) { 7 | 8 | } 9 | 10 | status4 = function( ltTarget,ltOwner,x,y,ltMouseParams ){ 11 | ..process.execute(..config.__website) 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /aardio-erp/lib/web/layout/behavior/login/buttons.aardio: -------------------------------------------------------------------------------- 1 | 2 | namespace web.layout.behavior.login.buttons 3 | 4 | onButtonClick = { 5 | login = function (ltTarget,ltOwner,reason,behaviorParams) { 6 | var winform = ltOwner.getForm(); 7 | ltOwner.state.disabled = true; 8 | winform.btnLogin(); 9 | ltOwner.state.disabled = false; 10 | } 11 | } 12 | 13 | -------------------------------------------------------------------------------- /lib/carl/ctrl/_.aardio: -------------------------------------------------------------------------------- 1 | //自定义控件库 2 | namespace carl.ctrl{} 3 | 4 | import carl.ctrl.listviewex; 5 | import carl.ctrl.pagectrl;//分页控件 6 | import carl.ctrl.page; 7 | import carl.ctrl.toolbar; 8 | import carl.ctrl.treeviewex; 9 | import carl.ctrl.comboboxex; 10 | import carl.ctrl.tab; 11 | import carl.ctrl.select; 12 | 13 | /*intellisense() 14 | carl.ctrl = 自定义控件库 15 | end intellisense*/ -------------------------------------------------------------------------------- /aardio-erp/lib/web/layout/behavior/main/systemMenuClick.aardio: -------------------------------------------------------------------------------- 1 | 2 | namespace web.layout.behavior.main.systemMenuClick 3 | 4 | //显示隐藏我的桌面 5 | onMouseUp = function( ltTarget,ltOwner,x,y,ltMouseParams ) { 6 | if(..string.find(ltOwner.outerHTML,"我的桌面")){ 7 | ..mainForm.tab.hide = !..mainForm.tab.hide; 8 | }else { 9 | ..mainFormTabCtrl.addTabForm(ltOwner.path, ltOwner.innerText, ltOwner.id);//打开选项卡 10 | } 11 | } -------------------------------------------------------------------------------- /aardio-erp/lib/web/layout/behavior/msgbox.aardio: -------------------------------------------------------------------------------- 1 | 2 | namespace web.layout.behavior.msgbox 3 | 4 | onButtonClick = { 5 | 6 | btnOk = function (ltTarget,ltOwner,reason,behaviorParams) { 7 | var winform = ltOwner.getForm(); 8 | winform.msg = 1; 9 | winform.close(); 10 | } 11 | btnCancel = function (ltTarget,ltOwner,reason,behaviorParams) { 12 | var winform = ltOwner.getForm(); 13 | winform.msg = 0; 14 | winform.close(); 15 | } 16 | 17 | } 18 | 19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /aardio-erp/lib/web/layout/behavior/login/selectRoad.aardio: -------------------------------------------------------------------------------- 1 | 2 | //选择登录线路 3 | namespace web.layout.behavior.login.selectRoad 4 | 5 | onMenuItemClick = { 6 | //匹配不到id的节点会触发default函数*/ 7 | default = function (ltTarget,ltOwner,reason,behaviorParams) { 8 | var ltPopupOwner = ..web.layout.element( behaviorParams.he );//这是弹出菜单的按钮节点 9 | var roadName = ltTarget.innerText; 10 | var serverUrl = ltTarget.url; 11 | var winform = ltOwner.getForm(); 12 | winform.showRoad(roadName, serverUrl); 13 | } 14 | } -------------------------------------------------------------------------------- /aardio-erp/default.main.aardio: -------------------------------------------------------------------------------- 1 | 2 | import win.ui; 3 | import config; 4 | 5 | global.onError = function( err,over ){ 6 | if(!over){ 7 | import debug; 8 | var stack = debug.traceback(,"调用栈",3); 9 | } 10 | ws.System.Errlog.onError(err); 11 | if( _STUDIO_INVOKED ) return err; 12 | } 13 | 14 | //定义全局变量 15 | { 16 | tabLoginInfo = {}; //登录用户信息 17 | tabSystemFormMenu = {}; //菜单权限 18 | mainFormTabCtrl = null; //主界面选项卡 19 | } 20 | 21 | loadcodex("\res\Main\loginLayout.aardio"); 22 | -------------------------------------------------------------------------------- /aardio-cgi/default.aproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /aardio-erp/lib/web/layout/behavior/main/systemMenu.aardio: -------------------------------------------------------------------------------- 1 | 2 | namespace web.layout.behavior.main.systemMenu 3 | 4 | onMenuItemClick = { 5 | 6 | //匹配不到id的节点会触发default函数*/ 7 | default = function (ltTarget,ltOwner,reason,behaviorParams) { 8 | var ltPopupOwner = ..web.layout.element( behaviorParams.he );//这是弹出菜单的按钮节点 9 | if(ltTarget.innerText == "修改密码"){ 10 | ..mainForm.loadForm(ltTarget.path) 11 | }else { 12 | ..mainFormTabCtrl.addTabForm(ltTarget.path, ltTarget.innerText, ltTarget.id);//打开选项卡 13 | } 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /lib/carl/rpc/_.aardio: -------------------------------------------------------------------------------- 1 | 2 | namespace carl.rpc 3 | 4 | format = function(t){ 5 | var min,max = ..table.range(t); 6 | for(i=1;max;1){ 7 | if(t[i] === null){ 8 | t[i] = "null"; 9 | }elseif(t[i] === true){ 10 | t[i] = "true"; 11 | }elseif(t[i] === false){ 12 | t[i] = "false"; 13 | } 14 | } 15 | } 16 | 17 | unformat = function(t){ 18 | var min,max = ..table.range(t); 19 | for(i=1;max;1){ 20 | if(t[i] === "null"){ 21 | t[i] = null; 22 | }elseif(t[i] === "true"){ 23 | t[i] = true; 24 | }elseif(t[i] === "false"){ 25 | t[i] = false; 26 | } 27 | } 28 | } -------------------------------------------------------------------------------- /aardio-erp/lib/ws/Demo/Demo.aardio: -------------------------------------------------------------------------------- 1 | 2 | namespace ws.Demo.Demo 3 | 4 | import ws; 5 | import ws.sql; 6 | 7 | string = ..string; 8 | table = ..table; 9 | 10 | var webservice = ws.Demo; 11 | var tablename = "Demo" 12 | 13 | /*intellisense(ws.Demo.Demo)*/ 14 | 15 | insert = function(tab){ 16 | var sql = ws.sql.getInsertSql(tablename, tab); 17 | return webservice.exec(sql); 18 | } 19 | 20 | update = function(tab, Id){ 21 | var sql = ws.sql.getUpdateSql(tablename, tab, "Id = '" + Id + "'"); 22 | var ok,err = webservice.exec(sql) 23 | return ok,err; 24 | } 25 | 26 | /*end intellisense*/ 27 | -------------------------------------------------------------------------------- /aardio-erp/lib/ws/sql.aardio: -------------------------------------------------------------------------------- 1 | 2 | namespace ws.sql 3 | 4 | /*intellisense(ws.sql)*/ 5 | 6 | getInsertSql = function(tabname, tab, utf8){ 7 | var drive = ..config[["__drive"]] : ..thread.get("config.__drive") : "mysql"; 8 | 9 | return (drive=="mysql") ? 10 | ..carl.sql.my.getInsertSql(tabname, tab, utf8) : 11 | ..carl.sql.ms.getInsertSql(tabname, tab, utf8); 12 | } 13 | 14 | getUpdateSql = function(tabname, tab, where, utf8){ 15 | var drive = ..config[["__drive"]] : ..thread.get("config.__drive") : "mysql"; 16 | 17 | return (drive=="mysql") ? 18 | ..carl.sql.my.getUpdateSql(tabname, tab, where, utf8) : 19 | ..carl.sql.ms.getUpdateSql(tabname, tab, where, utf8); 20 | } 21 | 22 | /*end intellisense*/ -------------------------------------------------------------------------------- /aardio-rpc/default.aproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /aardio-erp/lib/ws/Demo/_.aardio: -------------------------------------------------------------------------------- 1 | //Demo数据库演示 2 | namespace ws.Demo 3 | 4 | var servUrl = "/system/rpc.aardio"; 5 | 6 | ahtmlServer = function(funcName,...){ 7 | return ..ws.ahtmlServer(servUrl, funcName, ...); 8 | } 9 | 10 | exec = function( ... ){ 11 | var ok,t = ahtmlServer("exec", ... ); 12 | if( ok ) 13 | return ..table.unpackArgs(t); 14 | return null,t; 15 | } 16 | 17 | getTable = function( ... ){ 18 | var ok,t = ahtmlServer("getTable", ... ); 19 | if( ok ){ 20 | var tab,err,fields = ..table.unpackArgs(t); 21 | if(tab) tab["fields"] = fields; 22 | return tab,err; 23 | } 24 | return null,t; 25 | } 26 | 27 | transaction = function( ... ){//事务执行,参数table 28 | var ok,t = ahtmlServer("transaction", ... ); 29 | if( ok ) 30 | return ..table.unpackArgs(t); 31 | return null,t; 32 | } -------------------------------------------------------------------------------- /aardio-erp/lib/ws/System/Errlog.aardio: -------------------------------------------------------------------------------- 1 | 2 | namespace ws.System.Errlog 3 | 4 | import ws.sql; 5 | import ws.System; 6 | import carl.update; 7 | import console; 8 | 9 | var tablename = "errlog"; 10 | 11 | var Ver = carl.update.getVersion();//版本号 12 | 13 | /*intellisense(ws.System.Errlog)*/ 14 | 15 | insert = function(tab){ 16 | var sql = ws.sql.getInsertSql(tablename, tab); 17 | var ok,err = ws.System.exec(sql) 18 | return ok,err; 19 | } 20 | 21 | onError = function(err){ 22 | if( _STUDIO_INVOKED ){ 23 | console.log("global",err) 24 | return ; 25 | } 26 | var t = {} 27 | t["ver"] = Ver; 28 | t["err"] = err; 29 | t["username"] = ..tabLoginInfo[["NickName"]] : ..thread.get("tabLoginInfo")[["NickName"]]; 30 | t["dtime"] = ws.getServerTime(); 31 | insert(t); 32 | } 33 | 34 | /*end intellisense*/ -------------------------------------------------------------------------------- /aardio-rpc/privateKey.txt: -------------------------------------------------------------------------------- 1 | BwIAAACkAABSU0EyAAQAAAEAAQDve7UdKeI35NfLa8JkE4YQsxwKNCeE/OwAsqwd 2 | iVv/g4I0Lay5DupUhM8j8DHPePg6TFiDQ2APSaSRx5hiA/lrDlfX2UBltJV+Hzl8 3 | lxhj/wChQl8+7A9I6IvcyjqCzwZMRllVj5cOUFouxJJV/PqemQf5n+vQJ90V2B6F 4 | kCnjxkl74Nos2524IjwzUsKbErdU45QHXEdCMyHHKoi7djY8uZEiaWEevxqHiq5o 5 | DsbzVFSl3YQb6njSd0S3IjaQ6td3xZXnKt40cAFxL8TmpbNe2hmYJwCfwoBf76Jp 6 | 6UHJlTdR0nxO0+HAz+4ds21Ed9Img7aLzS3xBVJF7F1+TM/r2ZEekC9QfAziiSyh 7 | qYV1PUdWb7C1FhrVfisCcVZS/wqktkFhq6zXg4AbBqrdrteXFzTBhUAXFmHqRdzn 8 | p2VfHs+fZl0qwBsNAdIDLLeGgwh1DPOrOcgodtAtDDhrNSpqZULY4opj9PH5Sy57 9 | lZh/1o+n4Vq09t86AQWuxf8O7pVYIb0WbXhycsHZ3PIFOEphW5co6KpjrFMctY1l 10 | t923D2nCxvlBLpyJSLpXlZqRZWHiTtlNI3/oqKZx5FLo+xAeQWDFDC6g3tFqU67l 11 | vsDa9mYn6wvukLzCjZ9eIom/lPVT6iolT1jhLEG50sGauQGefuUPE/HLB9dUvP+h 12 | 67seqsK2cVaXNWq8Me5EBwPPf1tV4PBlaejLyJDT8Hy3PhB8/caePfZ8VQ1Jf9D6 13 | kR70D5AUF73U99vkWRRrrwl68Rw= -------------------------------------------------------------------------------- /aardio-rpc/functions.aardio: -------------------------------------------------------------------------------- 1 | 2 | namespace functions//空间名字不能改名和删除 3 | 4 | /* 5 | 需让客户端调用的函数,请在以下自定义函数, 6 | 以下已默认sql数据库操作函数 7 | */ 8 | 9 | getServerTime = function(){//返回服务器时间 10 | var t = ..time(); 11 | t.format = "%Y-%m-%d %H:%M:%S"; 12 | return tostring(t); 13 | } 14 | 15 | exec = function( ... ){//执行sql语句 16 | return ..sqlhelper.exec( ... ); 17 | } 18 | 19 | getTable = function( ... ){//返回数据库查询table对像 20 | return ..sqlhelper.getTable( ... ); 21 | } 22 | 23 | getTables = function( ... ){//执行多个select语句,参数table对像 24 | return ..sqlhelper.getTables( ... ); 25 | } 26 | 27 | transaction = function( ... ){//事务执行,参数table对像 28 | return ..sqlhelper.transaction( ... ); 29 | } 30 | 31 | storedProcedures = function( ... ){//存储过程 32 | return ..sqlhelper.storedProcedures( ... ); 33 | } 34 | 35 | /* 请在以下编写自定义函数*/ 36 | 37 | funTest = function(...){ 38 | return ...; 39 | } 40 | -------------------------------------------------------------------------------- /aardio-erp/rpc/wwwroot/system/functions.aardio: -------------------------------------------------------------------------------- 1 | 2 | namespace functions//空间名字不能改名和删除 3 | 4 | /* 5 | 需让客户端调用的函数,请在以下自定义函数, 6 | 以下已默认sql数据库操作函数 7 | */ 8 | 9 | getServerTime = function(){//返回服务器时间 10 | var t = ..time(); 11 | t.format = "%Y-%m-%d %H:%M:%S"; 12 | return tostring(t); 13 | } 14 | 15 | exec = function( ... ){//执行sql语句 16 | return ..sqlhelper.exec( ... ); 17 | } 18 | 19 | getTable = function( ... ){//返回数据库查询table对像 20 | return ..sqlhelper.getTable( ... ); 21 | } 22 | 23 | getTables = function( ... ){//执行多个select语句,参数table对像 24 | return ..sqlhelper.getTables( ... ); 25 | } 26 | 27 | transaction = function( ... ){//事务执行,参数table对像 28 | return ..sqlhelper.transaction( ... ); 29 | } 30 | 31 | storedProcedures = function( ... ){//存储过程 32 | return ..sqlhelper.storedProcedures( ... ); 33 | } 34 | 35 | /* 请在以下编写自定义函数*/ 36 | 37 | funTest = function(...){ 38 | return ...; 39 | } 40 | -------------------------------------------------------------------------------- /aardio-erp/lib/ws/System/SystemUserToMenu.aardio: -------------------------------------------------------------------------------- 1 | 2 | namespace ws.System.SystemUserToMenu 3 | 4 | import ws; 5 | import ws.sql; 6 | import ws.System; 7 | 8 | string = ..string; 9 | table = ..table; 10 | 11 | var webservice = ws.System; 12 | var tablename = "SystemUserToMenu" 13 | 14 | getUserMenuIds = function(SystemUserId){ 15 | var sql = "SELECT MenuId FROM " + tablename + " where SystemUserId='" + SystemUserId + "'"; 16 | var tab,err = webservice.getTable(sql); 17 | if(!tab) return null,err; 18 | var t = {} 19 | for(i=1;#tab;1){ 20 | var row = tab[i]; 21 | table.push(t,row.MenuId) 22 | } 23 | return t; 24 | } 25 | 26 | getInsertSql = function(t){ 27 | return ws.sql.getInsertSql(tablename, t); 28 | } 29 | 30 | getDeleteSql = function(SystemUserId,MenuId){ 31 | return "delete from " + tablename + " where SystemUserId='" + SystemUserId + "' and MenuId='" + MenuId + "'"; 32 | } 33 | -------------------------------------------------------------------------------- /aardio-cgi/lib/config.aardio: -------------------------------------------------------------------------------- 1 | //config 配置文件 2 | import fsys.config; 3 | config = ..fsys.config("/config/"); 4 | 5 | //不需要序列化的配置名字前请添加下划线 6 | namespace config { 7 | __appName = "应用程序名"; 8 | __appVersion = "1.0.0.01"; 9 | __appDescription = "这是一个测试程序"; 10 | __website = "http://www.aardio.com/"; 11 | } 12 | 13 | /** 14 | config = ..fsys.config( 15 | ..fsys.joinpath( ..fsys.getSpecial( 0x1c /*_CSIDL_LOCAL_APPDATA*/ ),"应用程序名" ) 16 | ); 17 | **/ 18 | 19 | /**intellisense(config) 20 | __appName = 应用程序名 21 | __appVersion = 应用程序内部版本号 22 | __appDescription = 程序说明 23 | __website = 官方网站 24 | 25 | saveAll() = 写入所有配置到文件 26 | default.load() = 从配置文件(文件名"default")载入\n加载成功返回对象,加载失败返回null空值\n!fsys_table. 27 | default.save() = 存储到配置文件(文件名"default") 28 | default.mixin = @.mixin(\n 键名 = 值__;\n 键名 = 值;\n);//该数会自动调用save函数保存配置到文件 29 | default.属性名 = 自配置文件(文件名"default")读写属性\n属性值可以是支持序列化的普通变量,支持table对象.\n配置文件在首次使用时自动加载,退出程序时自动保存. 30 | end intellisense**/ 31 | -------------------------------------------------------------------------------- /aardio-erp/layout/titlebar.html: -------------------------------------------------------------------------------- 1 | 2 | 3 |
4 | 01r 5 |
6 | 7 | 8 |
u 9 | 10 | 16 |
  • 访问主页
  • 17 |
  • 在线升级
  • 18 |
    19 |
  • 修改密码
  • 20 |
  • 重载系统数据
  • 21 |
    22 |
  • 退出
  • 23 |
  • 打开控制台
  • 24 |
    25 |
    26 | 27 | 28 |
    -------------------------------------------------------------------------------- /aardio-rpc/res/rpc.aardio: -------------------------------------------------------------------------------- 1 | 2 | import carl.rpc.server; 3 | 4 | var f,err = loadcode("\config.aardio"); 5 | if(!f) return response.write(err); 6 | f(); 7 | 8 | f,err = loadcode("\sqlhelper.aardio"); 9 | if(!f) return response.write(err); 10 | f(); 11 | 12 | f,err = loadcode("\functions.aardio"); 13 | if(!f) return response.write(err); 14 | f(); 15 | response.write(request) 16 | 17 | var server = carl.rpc.server(config.rsaPrivateKey); 18 | var t = { server.receive() };//接收 19 | var funcName,err = t[1],t[2]; 20 | var func = functions[funcName]; 21 | if( !func ){ 22 | if(funcName){ 23 | response.write("'" + funcName + "' function not exist!"); 24 | }elseif( err ){ 25 | response.write(err); 26 | }else{ 27 | response.write("welcome to aardio rpc!") 28 | } 29 | return; 30 | } 31 | table.remove(t); 32 | try{ 33 | var jsontext = server.reply( func(table.unpackArgs(t)) );//执行自定义函数 并回复函数返回值 34 | response.write( jsontext ); 35 | jsontext = null; 36 | }catch(e){ 37 | response.write(funcName ++ '函数出错.\r\n' ++ (e:"")); 38 | } -------------------------------------------------------------------------------- /lib/carl/rsa.aardio: -------------------------------------------------------------------------------- 1 | //RSA 加密解密 2 | 3 | namespace carl.rsa 4 | 5 | import crypt.bin; 6 | import crypt.rsa; 7 | 8 | encrypt = function(str, publicKey){//RSA加密 9 | if(!#str) return; 10 | var bin,err; 11 | try{ 12 | publicKey = crypt.bin.decodeBase64( publicKey ); 13 | var rsa = crypt.rsa() 14 | rsa.importKey(publicKey) //导入公钥 15 | bin = rsa.encrypt(str); 16 | rsa.release(); 17 | } 18 | catch(e){ 19 | err = e; 20 | } 21 | return bin,err; 22 | }; 23 | 24 | decrypt = function(str, privateKey){//RSA解密 25 | if(!#str) return; 26 | var bin,err; 27 | try{ 28 | privateKey = crypt.bin.decodeBase64( privateKey ) 29 | var rsa = crypt.rsa(); 30 | rsa.importKey(privateKey); 31 | bin = rsa.decrypt(str); 32 | rsa.release(); 33 | } 34 | catch(e){ 35 | err = e; 36 | } 37 | return bin,err; 38 | }; 39 | 40 | /**intellisense() 41 | carl.rsa = RSA加密解密 42 | carl.rsa.encrypt(str, publicKey) = RSA加密,公钥key需先Base64编码 43 | carl.rsa.decrypt(str, privateKey) = RSA解密,私钥key需先Base64编码 44 | end intellisense**/ 45 | 46 | -------------------------------------------------------------------------------- /aardio-erp/layout/msgbox.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 12 | 13 | 14 | 15 | 16 | 21 |
    17 | 18 | 19 | 20 | 22 | 23 |
    24 | 25 | 29 | 30 | -------------------------------------------------------------------------------- /lib/carl/log.aardio: -------------------------------------------------------------------------------- 1 | //log 日志库 2 | namespace carl.log 3 | 4 | import fsys; 5 | 6 | writelog = function(str,filename,add = true,date = true){ 7 | var dir = "/log/"; 8 | if( !..io.exist(dir) ){ 9 | fsys.createDir("/log/") 10 | } 11 | str = tostring(str); 12 | if(date){ 13 | var tdate = ..time(); 14 | tdate.format="%Y%m%d"; 15 | filename = tostring(tdate) + "_" + filename; 16 | } 17 | var t = ..time(); 18 | t.format="%Y-%m-%d %H:%M:%S"; 19 | str = tostring(t) + " " + str + '\r\n'; 20 | ..string.save(dir + filename, str, add); 21 | } 22 | 23 | readlog = function(filename,date = true){ 24 | var str = ""; 25 | if(date){ 26 | var tdate = ..time(); 27 | tdate.format="%Y%m%d"; 28 | filename = tostring(tdate) + "_" + filename; 29 | } 30 | filename = "/log/" + filename; 31 | if( !..io.exist(filename) ) return str; 32 | var file = ..io.open(filename,"r"); 33 | var size = tonumber(file.size64()); 34 | size = size > 10000 ? 10000 : size; 35 | file.seek("end"); 36 | str = file.readback(size); 37 | file.close(); 38 | str = ..string.replace(str,'.*?\n',"",1); 39 | return str; 40 | } 41 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2016 carl 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy of 6 | this software and associated documentation files (the "Software"), to deal in 7 | the Software without restriction, including without limitation the rights to 8 | use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of 9 | the Software, and to permit persons to whom the Software is furnished to do so, 10 | subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS 17 | FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR 18 | COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER 19 | IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 20 | CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -------------------------------------------------------------------------------- /aardio-erp/layout/main.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 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 | -------------------------------------------------------------------------------- /aardio-erp/rpc/wwwroot/system/rpc.aardio: -------------------------------------------------------------------------------- 1 | 2 | import carl.rpc.server; 3 | 4 | var filename = string.replace(request.environ.SCRIPT_FILENAME,"@\\","\"); 5 | var dir = ..io.splitpath(filename).dir; 6 | var f,err = loadcode(dir ++ "\config.aardio"); 7 | if(!f) return response.write(err:""); 8 | f(); 9 | 10 | f,err = loadcode(dir ++ "\sqlhelper.aardio"); 11 | if(!f) return response.write(err:""); 12 | f(); 13 | 14 | f,err = loadcode(dir ++ "\functions.aardio"); 15 | if(!f) return response.write(err:""); 16 | f(); 17 | 18 | var server = carl.rpc.server(config.rsaPrivateKey); 19 | var t = { server.receive() };//接收 20 | var funcName,err = t[1],t[2]; 21 | var func = functions[funcName]; 22 | if( !func ){ 23 | if(funcName){ 24 | response.write("'" + funcName + "' function not exist!"); 25 | }elseif( err ){ 26 | response.write(err); 27 | }else{ 28 | response.write("welcome to aardio rpc!") 29 | } 30 | return; 31 | } 32 | table.remove(t); 33 | try{ 34 | var jsontext = server.reply( func(table.unpackArgs(t)) );//执行自定义函数 并回复函数返回值 35 | response.write( jsontext ); 36 | jsontext = null; 37 | }catch(e){ 38 | response.write(funcName ++ '函数出错.\r\n' ++ (e:"")); 39 | } -------------------------------------------------------------------------------- /aardio-cgi/main.aardio: -------------------------------------------------------------------------------- 1 | import fastcgi; 2 | import fastcgi.client; 3 | import fsys.log; 4 | 5 | import carl.rpc.server; 6 | import carl.mssql; 7 | import carl.mysql; 8 | import carl.oracle; 9 | import carl.sql; 10 | 11 | global.onError = function( err,over ){ 12 | if(!over){ 13 | import debug; 14 | var stack = debug.traceback(,"调用栈",3); 15 | err = ..string.concat(err,'\n',stack); 16 | } 17 | 18 | fsys.log.print( ..string.replace(err,"![\r\n]\n",'\r\n') ); //CGI级别错误写入日志 19 | } 20 | 21 | var fcgiClient = fastcgi.client(); 22 | 23 | fcgiClient.run( 24 | function(response,request){ 25 | /* 26 | 500错误应用级别的错误服务器上本地打开网页可以看到, 27 | CGI级别的错误请查看"CGI.EXE目录/config"下面生成的日志文件 28 | */ 29 | response.loadcode( request.path );//参数可省略 30 | } 31 | ); 32 | 33 | /* 34 | 此程序应先生成EXE文件、并在web服务器上注册为fastcgi模块才能使用, 35 | 以 win2008 ,IIS7为例(网上教程很多,请自行查找详细教程) 36 | 37 | 1、桌面右键点【计算机】,弹出菜单中点【管理】,【添加角色/添加IIS】 38 | 2、右键点【Web服务器(IIS)】,弹出菜单中点【添加角色服务】,确认已添加【CGI】 39 | 3、然后打开IIS,到指定的网站点击【处理程序映射】,添加【处理程序映射】 40 | 后缀名设为:*.aardio ( 如果设为 *,取消勾选请求限制到文件或目录则处理所有URL ) 41 | 模块选:FastCgiModule 42 | 可执行文件:选中使用本工程生成的 aardio-cgi.exe 即可 43 | 44 | 注意工程内的发布前触发器, 45 | \.build\default.init.aardio 会在每次发布前停止已运行的CGI进程, 46 | 这个操作需要管理权限如果在本机上安装IIS测试,本机测试建议以管理权限启动aardio开发环境 47 | */ 48 | -------------------------------------------------------------------------------- /aardio-erp/res/System/Error.aardio: -------------------------------------------------------------------------------- 1 | import win.ui; 2 | /*DSG{{*/ 3 | var winform = win.form(text="loading...";right=800;bottom=400;border="dialog frame";parent=...) 4 | winform.add( 5 | page={cls="page";text="整页控件";left=0;top=27;right=800;bottom=400;center=1;db=1;dl=1;dr=1;dt=1;edge=1;transparent=1;z=1}; 6 | toolbar={cls="toolbar";text="工具条";left=0;top=-2;right=800;bottom=25;center=1;dl=1;dr=1;dt=1;edge=1;transparent=1;z=2} 7 | ) 8 | /*}}*/ 9 | 10 | winform.listview = winform.page.listview(); 11 | winform.lvEx = winform.page.listviewEx(); 12 | winform.listview.onnotify = function(id,code,ptr){ 13 | return winform.lvEx.openonnotify(id,code,ptr)//默认菜单,排序 14 | } 15 | 16 | winform.page.webService = ws.System; 17 | winform.page.sql = "select Id,username,ver,err,dtime from errlog" 18 | winform.page.orderby = "id desc"; 19 | winform.page.table = { 20 | {key = "rowId";name = "序号";len = 50}; 21 | {key = "username";name = "用户姓名";len = 80}; 22 | {key = "ver";name = "版本";len = 50}; 23 | {key = "err";name = "错误内容";len = 650}; 24 | {key = "dtime";name = "错误时间";len = 130}; 25 | {key = "Id";name = "主键ID";len = 0}; 26 | } 27 | winform.btnSearch = function(){ 28 | winform.page.search(); 29 | win.clip.write(winform.page.lastSql) 30 | } 31 | 32 | winform.load = function(){ 33 | winform.page.load();//显示首页 34 | } 35 | 36 | winform.toolbar.btnSearch(winform.btnSearch, "查询") 37 | 38 | winform.show() 39 | //win.loopMessage(); 40 | return winform; 41 | -------------------------------------------------------------------------------- /aardio-rpc/rpc.aardio: -------------------------------------------------------------------------------- 1 | 2 | import carl.rpc.server; 3 | 4 | var filename = string.replace(request.environ.SCRIPT_FILENAME,"@\\","\"); 5 | var dir = ..io.splitpath(filename).dir; 6 | var f,err = loadcode(dir ++ "\config.aardio"); 7 | if(!f) return response.write(err:""); 8 | f(); 9 | 10 | f,err = loadcode(dir ++ "\sqlhelper.aardio"); 11 | if(!f) return response.write(err:""); 12 | f(); 13 | 14 | f,err = loadcode(dir ++ "\functions.aardio"); 15 | if(!f) return response.write(err:""); 16 | f(); 17 | 18 | var server = carl.rpc.server(config.rsaPrivateKey); 19 | var t = { server.receive() };//接收 20 | var funcName,err = t[1],t[2]; 21 | var func = functions[funcName]; 22 | 23 | var reply = function(t,func){ 24 | if(type.table != type(t)) return ; 25 | var funcName,err = t[1],t[2]; 26 | if( !func ){ 27 | if(funcName){ 28 | return "'" + funcName + "' function not exist!"; 29 | } 30 | elseif( err ){ 31 | return err; 32 | } 33 | else{ 34 | return "welcome to aardio rpc!"; 35 | } 36 | } 37 | if(type.function != type(func)) return ; 38 | var min,max = table.range(t); 39 | var tab = { call(func,,table.unpack(t,2,max)) }; 40 | var ok,err = tab[1],tab[2]; 41 | if( !ok ) return string.concat("function: ",funcName,"Run Error.",err); 42 | 43 | min,max = table.range(tab); 44 | return server.reply(table.unpack(tab,2,max)); 45 | } 46 | 47 | var ret; 48 | try{ 49 | ret = reply(t,func); 50 | } 51 | catch(e){ 52 | ret = e; 53 | } 54 | response.write(ret); -------------------------------------------------------------------------------- /aardio-erp/lib/ws/_.aardio: -------------------------------------------------------------------------------- 1 | //数据库访问层 2 | namespace ws 3 | 4 | import ws.System; 5 | import thread.manage; 6 | 7 | //RSA公钥,留空不加密 8 | var rsaPublicKey = /* 9 | BgIAAACkAABSU0ExAAQAAAEAAQDve7UdKeI35NfLa8JkE4YQsxwKNCeE/OwAsqwd 10 | iVv/g4I0Lay5DupUhM8j8DHPePg6TFiDQ2APSaSRx5hiA/lrDlfX2UBltJV+Hzl8 11 | lxhj/wChQl8+7A9I6IvcyjqCzwZMRllVj5cOUFouxJJV/PqemQf5n+vQJ90V2B6F 12 | kCnjxg== 13 | */ 14 | 15 | /*intellisense(ws)*/ 16 | 17 | getServerTime = function(){//返回服务器时间 18 | return ws.System.getServerTime(); 19 | } 20 | 21 | ahtmlServer = function(serverUrl,funcName, ...){ 22 | 23 | var func = function(serverUrl, rsaPublicKey, funcName, ...){ 24 | import carl.rpc.client; 25 | var rpc = carl.rpc.client(serverUrl, rsaPublicKey); 26 | rpc.code = "aardio"; 27 | rpc.client.contentType = "application/octet-stream"; 28 | var t = { rpc[funcName](...) }; 29 | rpc.close(); 30 | return true,t; 31 | } 32 | 33 | var path = "/config/loginForm.table"; 34 | var ahtmlServerUrl = ..thread.get("ahtmlServerUrl"); 35 | if(!#ahtmlServerUrl && ..io.exist(path)){ 36 | var t = eval(..string.load(path)) 37 | ahtmlServerUrl = t[["ahtmlServerUrl"]]; 38 | } 39 | if(!#ahtmlServerUrl) return null,"未配置ahtmlServerUrl"; 40 | 41 | var bool,t; 42 | manage = thread.manage(1); 43 | manage.create(func, ahtmlServerUrl ++ serverUrl, rsaPublicKey, funcName, ...).onEnd = function(...){ 44 | bool,t = ...; 45 | } 46 | manage.waitClose() 47 | return bool,t; 48 | } 49 | 50 | /*end intellisense*/ -------------------------------------------------------------------------------- /aardio-erp/lib/web/layout/behavior/titleMenu.aardio: -------------------------------------------------------------------------------- 1 | 2 | namespace web.layout.behavior.titleMenu 3 | 4 | onMenuItemClick = { 5 | 6 | // 事件可以是一个函数或列表,如果是列表键名匹配节点的id或name属性 7 | exit = function (ltTarget,ltOwner,reason,behaviorParams) { 8 | ltOwner.getForm().close(); 9 | } 10 | 11 | //匹配不到id的节点会触发default函数*/ 12 | default = function (ltTarget,ltOwner,reason,behaviorParams) { 13 | var ltPopupOwner = ..web.layout.element( behaviorParams.he );//这是弹出菜单的按钮节点 14 | ltOwner.getForm().msgbox( ltTarget.innerText,"提示" ) 15 | } 16 | 17 | update = function(ltTarget,ltOwner,reason,behaviorParams){ 18 | var winform = ltOwner.getForm(); 19 | var ok = ..update(winform);//检查更新版本 20 | if(!ok){ 21 | winform.msgbox("您已是最新版!","提示") 22 | } 23 | } 24 | 25 | //访问主页 26 | website = function(ltTarget,ltOwner,reason,behaviorParams){ 27 | ..process.execute(..thread.get("ahtmlServerUrl")); 28 | } 29 | 30 | editPwd = function(ltTarget,ltOwner,reason,behaviorParams){ 31 | ..mainForm.loadForm("\res\System\EditPwd.aardio"); 32 | } 33 | 34 | //重载我的权限 35 | limit = function(ltTarget,ltOwner,reason,behaviorParams){ 36 | if( ..reStartMainLimit() ){ 37 | ..mainForm.msgbox("重载成功","提示") 38 | } 39 | } 40 | 41 | openConsole = function(ltTarget,ltOwner,reason,behaviorParams){ 42 | var text = ltTarget.innerText; 43 | if(text == "打开控制台"){ 44 | ltTarget.innerText = "关闭控制台" 45 | ..io.open(); 46 | }else { 47 | ltTarget.innerText = "打开控制台" 48 | ..io.close() 49 | } 50 | } 51 | } -------------------------------------------------------------------------------- /aardio-erp/lib/web/layout/msgbox.aardio: -------------------------------------------------------------------------------- 1 | import win.ui; 2 | import win.clip; 3 | import string.html; 4 | import web.layoutEx; 5 | /*DSG{{*/ 6 | var winform = ..win.form(text="AAuto Form";right=250;bottom=170;border="none";max=false;min=false;parent=...) 7 | winform.add() 8 | /*}}*/ 9 | 10 | var form,msg,title,style = ...; 11 | winform.text = title : "提示"; 12 | 13 | msg = string.replace(msg:"",'\n',"
    ") 14 | msg = string.html.toText(msg); 15 | msg = string.html.fromText(msg); 16 | 17 | winform.wndproc = function(hwnd,message,wParam,lParam){ 18 | if( message == 0x100/*_WM_KEYDOWN*/ && (wParam == 0xD/*_VK_ENTER*/ || wParam == 0x20/*_VK_SPACE*/)) { 19 | winform.close() 20 | } 21 | } 22 | 23 | winform.reghotkey(function(id,mod,vk){ 24 | win.clip.write(string.html.toText(msg)); 25 | } 26 | ,0x2/*_MOD_CONTROL*/,'C'#); 27 | 28 | var wbLayout = web.layoutEx( winform,"/layout/msgbox.html",false ); 29 | wbLayout.getEle("msg").innerHTML = msg; 30 | 31 | var str1,str2,str3,str4; 32 | if( style == 0x10/*_MB_ICONHAND*/){//16 msgboxErr 33 | str1,str2,str3,str4 = "none","none","","none"; 34 | } 35 | elseif( style == 0x1|0x20 /*_MB_OKCANCEL|_MB_ICONQUESTION*/){//33 msgboxTest 36 | str1,str2,str3,str4 = "none","","none",""; 37 | } 38 | else { 39 | str1,str2,str3,str4 = "","none","none","none"; 40 | } 41 | wbLayout.getEle("msgbox").style.display = str1; 42 | wbLayout.getEle("msgboxTest").style.display = str2; 43 | wbLayout.getEle("msgboxErr").style.display = str3; 44 | wbLayout.getEle("Cancel").style.display = str4; 45 | 46 | var dt = 1; 47 | if(#msg>=300){ 48 | dt = 1.2; 49 | }elseif(#msg>=90){ 50 | dt = 1.1; 51 | } 52 | winform.right = winform.right * dt; 53 | winform.bottom = winform.bottom * dt; 54 | 55 | winform.show(); 56 | if(form) winform.doModal(form); 57 | //win.loopMessage(); 58 | return winform.msg;//确定:1 59 | -------------------------------------------------------------------------------- /aardio-erp/lib/ws/System/_.aardio: -------------------------------------------------------------------------------- 1 | //系统数据库 2 | namespace ws.System 3 | 4 | var servUrl = "/system/rpc.aardio";//ahtml-rpc服务端URL 5 | 6 | ahtmlServer = function(funcName,...){ 7 | var ok,err = checkToken() 8 | if(!ok) return null,err; 9 | return ..ws.ahtmlServer(servUrl, funcName, ...); 10 | } 11 | 12 | checkToken = function(){ 13 | var token = ..thread.get("ApiToken"); 14 | if(!token) return true; 15 | var sql = "select count(*)as num from SystemUser where Token='" + token + "'"; 16 | var ok,t = ..ws.ahtmlServer(servUrl, "getTable",sql); 17 | if( ok ){ 18 | var t,err = ..table.unpackArgs(t); 19 | if(!t or !#t) return null,err; 20 | return tonumber(t[1]["num"])," Token失效,请重新登录"; 21 | } 22 | return null,t; 23 | } 24 | 25 | exec = function( ... ){ 26 | var ok,t = ahtmlServer("exec", ... ); 27 | if( ok ) 28 | return ..table.unpackArgs(t); 29 | return null,t; 30 | } 31 | 32 | getTable = function( ... ){ 33 | var ok,t = ahtmlServer("getTable", ... ); 34 | if( ok ){ 35 | var tab,err,fields = ..table.unpackArgs(t); 36 | if(tab) tab["fields"] = fields; 37 | return tab,err; 38 | } 39 | return null,t; 40 | } 41 | 42 | transaction = function( ... ){//事务执行,参数table 43 | var ok,t = ahtmlServer("transaction", ... ); 44 | if( ok ) 45 | return ..table.unpackArgs(t); 46 | return null,t; 47 | } 48 | 49 | sp_getPrimaryKey = function(tablename){//返回表新增主键 50 | var ok,t = ahtmlServer("storedProcedures", "sp_getPrimaryKey", tablename);//执行存储过程 51 | if( ok ){ 52 | var t,err = ..table.unpackArgs(t); 53 | if(t) return t[1]["PrimaryKey"]; 54 | return null,err; 55 | } 56 | return null,t; 57 | } 58 | 59 | getServerTime = function(){ 60 | var ok,t = ahtmlServer("getServerTime"); 61 | if( ok ) 62 | return ..table.unpackArgs(t); 63 | 64 | var t = ..time(); 65 | t.format="%Y-%m-%d %H:%M:%S"; 66 | return tostring(t); 67 | } 68 | -------------------------------------------------------------------------------- /lib/carl/rpc/server.aardio: -------------------------------------------------------------------------------- 1 | //server 服务端 2 | import carl.rsa; 3 | import carl.rpc; 4 | import web.json; 5 | 6 | namespace carl.rpc 7 | 8 | server = class { 9 | ctor( rsaPrivateKey ){ 10 | this.rsaPrivateKey = rsaPrivateKey; 11 | if( !..request ) error("只能在rpc服务端调用",2); 12 | }; 13 | 14 | receive = function(){ 15 | var postdata = ..request.postData(); //.server["HTTP_RAW_POST_DATA"]; 16 | var funcName = ..request.get["op"]; 17 | var code = ..request.get["code"]:""; 18 | if( !#funcName ) return ; 19 | if( # this.rsaPrivateKey ){ 20 | postdata = ..carl.rsa.decrypt(postdata, this.rsaPrivateKey); 21 | if( !postdata ) return null,"Decryption post data error"; 22 | } 23 | var tab,err; 24 | try{ 25 | if( string.cmpMatch(code,"aardio" ) ){ 26 | tab = eval(postdata) 27 | }else { 28 | tab = ..web.json.parse(postdata); 29 | if(tab) ..carl.rpc.unformat(tab); 30 | } 31 | } 32 | catch(e){ 33 | err = e; 34 | } 35 | if( !tab ) return null,"rpc.receive parameter error," ++ (err:""); 36 | return funcName,table.unpackArgs(tab); 37 | } 38 | 39 | reply = function( ... ){ 40 | var code = ..request.get["code"]:""; 41 | var t = {...}; 42 | var str; 43 | if( string.cmpMatch(code,"aardio" ) ){ 44 | str = table.tostring(t,true); 45 | } 46 | else { 47 | ..carl.rpc.format(t); 48 | str = ..web.json.stringify(t); 49 | } 50 | return str; 51 | } 52 | } 53 | 54 | namespace server{ 55 | 56 | table = ..table; 57 | string = ..string; 58 | } 59 | 60 | 61 | /**intellisense() 62 | carl.rpc.server = rpc服务端 63 | carl.rpc.server( rsaPrivateKey ) = 创建rpc服务端,参数是RSA私钥,解密客户端发送的数据\n(参数可忽略,为空不解密,客户端RSA公钥也需对应为空) 64 | carl.rpc.server() = !server. 65 | !server.receive() = 接收客户端发送的数据,返回调用的函数名,及参数 66 | !server.reply(text) = 回复内容给客户端,支持多个参数,参数支持5种基本数据类型:null,table,string,boolean,number 67 | end intellisense**/ 68 | -------------------------------------------------------------------------------- /lib/carl/report/_.aardio: -------------------------------------------------------------------------------- 1 | import carl.report.template; 2 | 3 | namespace carl.report 4 | 5 | //日周月报表 6 | MonthWeeklyDay = function(func, sort, reportType, startDate, endDate, ... ){ 7 | if( reportType == "日报"){ 8 | reportType = "2"; 9 | } 10 | elseif( reportType == "周报"){ 11 | reportType = "0"; 12 | } 13 | elseif( reportType == "月报"){ 14 | reportType = "1"; 15 | } 16 | var tab,err = {}; 17 | var date1 = startDate; 18 | var date2 = endDate; 19 | if(reportType == "0"){//周报,每周是从星期一开始 20 | date1.addday(1-date1.dayofweek) 21 | date2.addday(7-(date2.dayofweek:7)) 22 | dt = date2.diffday(date1); 23 | dt = dt>=7 ? (tonumber(dt/7,10)) : 0;//相差周数 24 | dt = ..math.modf(dt); 25 | date2.addday(-6); 26 | } 27 | else if(reportType == "1") {//月报 28 | dt = date2.diffmonth(date1); 29 | } 30 | else {//日报 31 | dt = date2.diffday(date1); 32 | } 33 | var date,startnum,endnum,num,weeknum,dtnum; 34 | if(sort == "升序"){ 35 | date = date1; 36 | startnum = 0; endnum = dt; num = 1; 37 | weeknum = 7; dtnum = 1; 38 | }else { 39 | date = date2; 40 | startnum = dt; endnum = 0; num = -1; 41 | weeknum = -7; dtnum = -1; 42 | } 43 | date.format = "%Y-%m-%d"; 44 | for(i=startnum;endnum;num){ 45 | var t,err = func(tostring(date), reportType, ...); 46 | if(t and #t){ 47 | ..table.push(tab, ..table.unpack(t)); 48 | }elseif(err) { 49 | return null,err; 50 | } 51 | 52 | if(reportType == "0"){ 53 | date.addday(weeknum); 54 | }else if(reportType == "1") { 55 | date.addmonth(dtnum); 56 | }else { 57 | date.addday(dtnum); 58 | } 59 | ..win.delay(1) 60 | } 61 | return tab,err; 62 | } 63 | 64 | /**intellisense() 65 | carl.report = 报表 66 | carl.report.MonthWeeklyDay(func,sort,reportType,startDate,endDate,"func其他参数" ) = 生成日,周,月报表数据\nfunc:回调函数(日期,报表类型,其他参数)\n 如ws.Order.sp_WeeklyMonthShopReport\nsort:升序或降序\nreportType:报表类型 日报,周报,月报,\n时间对像,其他参数 67 | end intellisense**/ -------------------------------------------------------------------------------- /aardio-rpc/config.aardio: -------------------------------------------------------------------------------- 1 | //config 配置文件 2 | namespace config; 3 | 4 | /* 5 | 所使用的数据库,支持以下三种数据库 6 | 如:mssql,mysql,oracle 7 | */ 8 | driver = "mysql"; 9 | 10 | /* 11 | 主机名或主机 IP 12 | 本机可使用 "localhost" 或 "127.0.0.1" 13 | */ 14 | host = "localhost"; 15 | 16 | /* 17 | 实例名,只对mssql数据库有效 18 | */ 19 | msname = ""; 20 | 21 | /* 22 | 登录数据库所使用的用户名 23 | */ 24 | username = "root"; 25 | 26 | /* 27 | 登录数据库所使用的密码 28 | */ 29 | password = "123456"; 30 | 31 | /* 32 | 数据库名称,连接数据库成功后将自动选择该库 33 | */ 34 | dbname = "ErpAAuto"; 35 | 36 | /* 37 | 数据库端口 38 | */ 39 | port = 3306; 40 | 41 | /* 42 | RSA私钥, 用于解密post传输的加密数据包, 如果不需要解密请留空! 43 | 44 | 通过以下代码获取 45 | import crypt.rsa; 46 | import crypt.bin; 47 | var rsa = crypt.rsa(); 48 | rsa.genKey(); 49 | var publicKey = crypt.bin.encodeBase64(rsa.exportPublicKey());//RSA公钥 50 | var privateKey = crypt.bin.encodeBase64(rsa.exportPrivateKey()); //RSA私钥 51 | rsa.release(); 52 | string.save("/publicKey.txt", publicKey); 53 | string.save("/privateKey.txt", privateKey); 54 | */ 55 | rsaPrivateKey = /* 56 | BwIAAACkAABSU0EyAAQAAAEAAQDve7UdKeI35NfLa8JkE4YQsxwKNCeE/OwAsqwd 57 | iVv/g4I0Lay5DupUhM8j8DHPePg6TFiDQ2APSaSRx5hiA/lrDlfX2UBltJV+Hzl8 58 | lxhj/wChQl8+7A9I6IvcyjqCzwZMRllVj5cOUFouxJJV/PqemQf5n+vQJ90V2B6F 59 | kCnjxkl74Nos2524IjwzUsKbErdU45QHXEdCMyHHKoi7djY8uZEiaWEevxqHiq5o 60 | DsbzVFSl3YQb6njSd0S3IjaQ6td3xZXnKt40cAFxL8TmpbNe2hmYJwCfwoBf76Jp 61 | 6UHJlTdR0nxO0+HAz+4ds21Ed9Img7aLzS3xBVJF7F1+TM/r2ZEekC9QfAziiSyh 62 | qYV1PUdWb7C1FhrVfisCcVZS/wqktkFhq6zXg4AbBqrdrteXFzTBhUAXFmHqRdzn 63 | p2VfHs+fZl0qwBsNAdIDLLeGgwh1DPOrOcgodtAtDDhrNSpqZULY4opj9PH5Sy57 64 | lZh/1o+n4Vq09t86AQWuxf8O7pVYIb0WbXhycsHZ3PIFOEphW5co6KpjrFMctY1l 65 | t923D2nCxvlBLpyJSLpXlZqRZWHiTtlNI3/oqKZx5FLo+xAeQWDFDC6g3tFqU67l 66 | vsDa9mYn6wvukLzCjZ9eIom/lPVT6iolT1jhLEG50sGauQGefuUPE/HLB9dUvP+h 67 | 67seqsK2cVaXNWq8Me5EBwPPf1tV4PBlaejLyJDT8Hy3PhB8/caePfZ8VQ1Jf9D6 68 | kR70D5AUF73U99vkWRRrrwl68Rw= 69 | */; 70 | 71 | //rsaPrivateKey = ""; 72 | -------------------------------------------------------------------------------- /aardio-erp/rpc/wwwroot/system/config.aardio: -------------------------------------------------------------------------------- 1 | //config 配置文件 2 | namespace config; 3 | 4 | /* 5 | 所使用的数据库,支持以下三种数据库 6 | 如:mssql,mysql,oracle 7 | */ 8 | driver = "mysql"; 9 | 10 | /* 11 | 主机名或主机 IP 12 | 本机可使用 "localhost" 或 "127.0.0.1" 13 | */ 14 | host = "192.168.17.249"; 15 | 16 | /* 17 | 实例名,只对mssql数据库有效 18 | */ 19 | msname = ""; 20 | 21 | /* 22 | 登录数据库所使用的用户名 23 | */ 24 | username = "root"; 25 | 26 | /* 27 | 登录数据库所使用的密码 28 | */ 29 | password = "123456"; 30 | 31 | /* 32 | 数据库名称,连接数据库成功后将自动选择该库 33 | */ 34 | dbname = "ErpAAuto"; 35 | 36 | /* 37 | 数据库端口 38 | */ 39 | port = 3306; 40 | 41 | /* 42 | RSA私钥, 用于解密post传输的加密数据包, 如果不需要解密请留空! 43 | 44 | 通过以下代码获取 45 | import crypt.rsa; 46 | import crypt.bin; 47 | var rsa = crypt.rsa(); 48 | rsa.genKey(); 49 | var publicKey = crypt.bin.encodeBase64(rsa.exportPublicKey());//RSA公钥 50 | var privateKey = crypt.bin.encodeBase64(rsa.exportPrivateKey()); //RSA私钥 51 | rsa.release(); 52 | string.save("/publicKey.txt", publicKey); 53 | string.save("/privateKey.txt", privateKey); 54 | */ 55 | rsaPrivateKey = /* 56 | BwIAAACkAABSU0EyAAQAAAEAAQDve7UdKeI35NfLa8JkE4YQsxwKNCeE/OwAsqwd 57 | iVv/g4I0Lay5DupUhM8j8DHPePg6TFiDQ2APSaSRx5hiA/lrDlfX2UBltJV+Hzl8 58 | lxhj/wChQl8+7A9I6IvcyjqCzwZMRllVj5cOUFouxJJV/PqemQf5n+vQJ90V2B6F 59 | kCnjxkl74Nos2524IjwzUsKbErdU45QHXEdCMyHHKoi7djY8uZEiaWEevxqHiq5o 60 | DsbzVFSl3YQb6njSd0S3IjaQ6td3xZXnKt40cAFxL8TmpbNe2hmYJwCfwoBf76Jp 61 | 6UHJlTdR0nxO0+HAz+4ds21Ed9Img7aLzS3xBVJF7F1+TM/r2ZEekC9QfAziiSyh 62 | qYV1PUdWb7C1FhrVfisCcVZS/wqktkFhq6zXg4AbBqrdrteXFzTBhUAXFmHqRdzn 63 | p2VfHs+fZl0qwBsNAdIDLLeGgwh1DPOrOcgodtAtDDhrNSpqZULY4opj9PH5Sy57 64 | lZh/1o+n4Vq09t86AQWuxf8O7pVYIb0WbXhycsHZ3PIFOEphW5co6KpjrFMctY1l 65 | t923D2nCxvlBLpyJSLpXlZqRZWHiTtlNI3/oqKZx5FLo+xAeQWDFDC6g3tFqU67l 66 | vsDa9mYn6wvukLzCjZ9eIom/lPVT6iolT1jhLEG50sGauQGefuUPE/HLB9dUvP+h 67 | 67seqsK2cVaXNWq8Me5EBwPPf1tV4PBlaejLyJDT8Hy3PhB8/caePfZ8VQ1Jf9D6 68 | kR70D5AUF73U99vkWRRrrwl68Rw= 69 | */; 70 | 71 | //rsaPrivateKey = ""; 72 | -------------------------------------------------------------------------------- /aardio-erp/layout/login.html: -------------------------------------------------------------------------------- 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 | 41 |
    42 |
    线路:
    43 |
    u 44 | 45 | 46 |
    47 |
    48 |
    49 | 50 |
    51 | 54 | 58 |
    59 |
    60 | 61 | 62 | -------------------------------------------------------------------------------- /aardio-erp/res/Main/menu.aardio: -------------------------------------------------------------------------------- 1 | 2 | var wbLayout = ...; 3 | 4 | mainForm.wndproc = function(hwnd,message,wParam,lParam){ 5 | select( message ) { 6 | case 0x10/*_WM_CLOSE*/{ 7 | if(win.msgboxTest("确定退出程序?","提示")){ 8 | win.quitMessage(0); 9 | }else { 10 | return false; 11 | } 12 | } 13 | } 14 | } 15 | 16 | mainFormTabCtrl = carl.ctrl.tab(mainForm.tab); 17 | 18 | mainFormTabCtrl.wndproc = function(hwnd,message,wParam,lParam){ 19 | return mainFormTabCtrl.exWndproc(hwnd,message,wParam,lParam); 20 | } 21 | 22 | //重载权限 23 | reStartMainLimit = function(){ 24 | tabSystemFormMenu,tabSystemTreeMenu = {},{};//全局权限表 25 | var limitMenuIds; 26 | if(tabLoginInfo["LoginName"] != "admin"){//超级管理员无需分配, 27 | var tab,err = ws.System.SystemUserToMenu.getUserMenuIds(tabLoginInfo["SystemUserId"]); 28 | if(!tab){ 29 | mainForm.msgboxErr(err,"错误") 30 | return false; 31 | } 32 | limitMenuIds = #tab ? string.join(tab,",") : "0"; 33 | } 34 | var t1,t2 = ws.System.SystemMenu.getFormAndTreeMenuTable(limitMenuIds,addTabForm);//返回 窗口菜单,树形菜单 table对像 35 | if(t1 and t2){ 36 | tabSystemFormMenu,tabSystemTreeMenu = table.clone(t1),table.clone(t2); 37 | }else { 38 | var err = t2:""; 39 | mainForm.msgboxErr(err,"错误") 40 | return false; 41 | } 42 | /* 43 | 如有其他权限,请在这里扩展,比如增加门店权限,数据权限,部门权限,按钮权限 44 | tabSystemTreeShop,tabSystemLimitShop = {},{}; 45 | tabSystemTreeDepartment,tabSystemLimitDepartment = {},{}; 46 | */ 47 | if(table.count(tabSystemFormMenu) == 0){ 48 | if(tabLoginInfo["LoginName"] == "admin"){ 49 | mainFormTabCtrl.addTabForm("\res\System\Menu.aardio", "菜单管理") 50 | }else { 51 | mainForm.msgboxErr("您无权限,请联系部门管理员分配菜单权限!","错误") 52 | } 53 | } 54 | wbLayout.getEle("systemmenu").innerHTML = conn.showSystemMenuLayout(tabSystemTreeMenu);//HTMLayout菜单 55 | return true; 56 | } 57 | 58 | if(tabLoginInfo["LoginName"] != "admin"){ 59 | var ele = wbLayout.getEle("openConsole"); 60 | if(ele) ele.style.display = "none"; 61 | } 62 | 63 | reStartMainLimit();//加载权限 -------------------------------------------------------------------------------- /aardio-erp/res/Main/mainLayout.aardio: -------------------------------------------------------------------------------- 1 | import win.ui; 2 | /*DSG{{*/ 3 | mainForm = win.form(text="AAuto工程";right=600;bottom=400;border="none") 4 | mainForm.add( 5 | tab={cls="tab";left=2;top=105;right=600;bottom=380;db=1;dl=1;dr=1;dt=1;edge=1;z=1} 6 | ) 7 | /*}}*/ 8 | 9 | import web.layoutEx; 10 | import web.layout.behavior.main.systemMenu; 11 | import web.layout.behavior.main.systemMenuClick; 12 | import web.layout.behavior.main.click; 13 | 14 | mainForm.text = config.__appName; 15 | var wbLayout = web.layoutEx( mainForm,"/layout/main.html" ); 16 | 17 | var RoadName = ...; 18 | var status,load,serverTime,dtsec,tnow; 19 | mainForm.tab.hide = true; 20 | 21 | mainForm.addtimer( 1000, 22 | function(hwnd,msg,id,tick){ 23 | if( dtsec === null ){ 24 | serverTime = ws.getServerTime(); 25 | tnow = time(); 26 | if( serverTime ){ 27 | serverTime = time(serverTime,"%Y-%m-%d %H:%M:%S"); 28 | dtsec = serverTime.diffsecond(tnow); 29 | } 30 | }else { 31 | tnow = time(); 32 | tnow.addsecond(dtsec) 33 | } 34 | wbLayout.getEle("status5").innerText = "服务器时间: " ++ tostring(tnow); 35 | } 36 | ) 37 | 38 | mainForm.addtimer( 39 | 60000, 40 | function(hwnd,msg,id,tick){ 41 | var ok,err = ws.System.checkToken(); 42 | if(!ok) win.quitMessage(0) 43 | } 44 | ) 45 | 46 | load = function(){//加载数据库冷数据 47 | loadcode("\res\Main\menu.aardio")(wbLayout); 48 | } 49 | 50 | Ver = carl.update.getVersion();//版本号 51 | wbLayout.getEle("status1").innerText = "用户: " + tabLoginInfo["NickName"] + "(" + tabLoginInfo["LoginName"] + ")"; 52 | wbLayout.getEle("status2").innerText = "版本: " + Ver; 53 | wbLayout.getEle("status3").innerText = "线路: " + (RoadName:""); 54 | wbLayout.getEle("status4").innerHTML = "版权: " + config.__appCompanyName; 55 | wbLayout.getEle("info1").innerText = config.__info1; 56 | wbLayout.getEle("info2").innerText = config.__info2; 57 | 58 | var x,y,cx,cy = mainForm.getPos(); 59 | mainForm.setPos(x-210,y-115,cx+420,cy+230); 60 | mainForm.hitmax(); 61 | mainForm.show() 62 | load(); 63 | win.loopMessage(); 64 | -------------------------------------------------------------------------------- /aardio-erp/res/System/EditPwd.aardio: -------------------------------------------------------------------------------- 1 | import win.ui; 2 | /*DSG{{*/ 3 | var winform = win.form(text="修改个人密码";right=291;bottom=140;border="dialog frame";exmode="none";max=false;mode="popup";parent=...) 4 | winform.add( 5 | groupbox={cls="groupbox";text="修改密码";left=5;top=27;right=288;bottom=136;edge=1;z=1}; 6 | static={cls="static";text="新密码";left=17;top=80;right=70;bottom=97;transparent=1;z=4}; 7 | static2={cls="static";text="确认密码";left=17;top=108;right=71;bottom=125;dl=1;dt=1;transparent=1;z=3}; 8 | static3={cls="static";text="旧密码";left=17;top=52;right=68;bottom=72;dl=1;dt=1;transparent=1;z=5}; 9 | toolbar={cls="toolbar";text="工具条";left=0;top=-2;right=293;bottom=25;center=1;dl=1;dr=1;dt=1;edge=1;transparent=1;z=2}; 10 | txtNewPwd={cls="edit";left=76;top=74;right=279;bottom=97;edge=1;hidesel=1;tabstop=1;z=7}; 11 | txtNewPwd1={cls="edit";left=76;top=103;right=279;bottom=126;edge=1;hidesel=1;tabstop=1;z=8}; 12 | txtPwd={cls="edit";left=76;top=44;right=279;bottom=67;edge=1;hidesel=1;tabstop=1;z=6} 13 | ) 14 | /*}}*/ 15 | 16 | var trdate = ws.getServerTime(); 17 | 18 | winform.btnSave = function(){ 19 | var pwd = winform.txtPwd.text; 20 | var newPwd = winform.txtNewPwd.text; 21 | var newPwd1 = winform.txtNewPwd1.text; 22 | if(ws.System.SystemUser.encryptPwd(pwd) != tabLoginInfo["PassWord"]){ 23 | winform.msgbox("旧密码不对","提示") 24 | return ; 25 | } 26 | if( !#newPwd || newPwd != newPwd1){ 27 | winform.msgbox("新密码不一样","提示") 28 | return ; 29 | } 30 | /* 31 | if(tabLoginInfo["LoginName"] == "admin"){ 32 | winform.msgbox("不允许修改超级管理员密码","提示") 33 | return false; 34 | } 35 | */ 36 | var t = {} 37 | t["PassWord"] = ws.System.SystemUser.encryptPwd(newPwd); 38 | t["trdate"] = trdate; 39 | t["truser"] = tabLoginInfo["NickName"]; 40 | var ok,err = ws.System.SystemUser.update(t, tabLoginInfo["SystemUserId"]); 41 | if(!ok){ 42 | winform.msgbox("保存失败," ++ (err:""),"提示") 43 | }else { 44 | winform.msgbox("保存成功","提示"); 45 | winform.close(); 46 | } 47 | } 48 | 49 | winform.toolbar.btnSave(winform.btnSave,"保存") 50 | 51 | winform.show() 52 | //win.loopMessage(); 53 | return winform; 54 | -------------------------------------------------------------------------------- /aardio-erp/layout/styles/titlebar.css: -------------------------------------------------------------------------------- 1 | html,body{ 2 | margin:0; /*去掉默认的页面边距*/ 3 | height:100%;/*因为HTML元素的高度默认是按需增加的,所有需要显示指定根节点高度*/ 4 | background:#fff;/*网页背景色*/ 5 | overflow:hidden;/*避免出现滚动条*/ 6 | font-family: '宋体'; 7 | border: 1px solid #4B5F6B; 8 | } 9 | 10 | /*最大化后body会自动添加maximize属性,如果是圆角界面可以在这里移除圆角*/ 11 | body[maximize]{ 12 | border-radius:0; 13 | } 14 | 15 | body[maximize] #header{ 16 | border-radius:0; 17 | } 18 | 19 | #header{ 20 | height:32px; 21 | background:rgb(52,152,220); 22 | cursor:default; 23 | behavior:windowCommand; 24 | overflow:hidden;/*清除浮动*/ 25 | } 26 | 27 | #header .title-bar{ 28 | margin-right:95px; 29 | padding-left:15px; 30 | padding-top:2px; 31 | height:28px; 32 | line-height: 28px; 33 | display: block; 34 | color:#fff; 35 | } 36 | 37 | #header .titlebox{ 38 | width:max-intrinsic; 39 | height:28px; 40 | float:right; 41 | margin-right:8px; 42 | overflow-x:hidden; 43 | } 44 | 45 | #header .titlebox a{ 46 | display:inline-block; //显示为块节点 47 | width:max-intrinsic; 48 | height:14px; 49 | font-family:"Marlett";/*该字体显示按钮符号*/ 50 | font-size:14px; 51 | padding:4px; 52 | color:#fff; 53 | cursor:default; 54 | } 55 | 56 | /*CSS选择器中,方括号指定节点拥有的属性*/ 57 | #header .titlebox a[command]:hover{ 58 | background:#6ebccf; 59 | } 60 | 61 | #header .titlebox a[command]:active{ 62 | background:#FF0000; 63 | } 64 | 65 | #header a[command="window-restore"]{ 66 | content:"2";/*Marlett字体为还原按钮符号*/ 67 | } 68 | 69 | #header .window-menu{ 70 | display:block; 71 | float:right; 72 | behavior:popup-menu; 73 | width:max-intrinsic; 74 | height:14px; 75 | font-family:"Marlett";/*该字体显示按钮符号*/ 76 | font-size:14px; 77 | padding:4px; 78 | color:#fff; 79 | } 80 | 81 | #header .window-menu:hover{ 82 | background:#6ebccf; 83 | } 84 | 85 | #header .window-menu:owns-popup /*菜单已弹出*/ 86 | { 87 | background-color: #FF0000; 88 | color: #FFFFFF; 89 | } 90 | 91 | /*这里下面的 > 不要换成空格,避免子菜单被绑定多次behavior导致事件被触发多次*/ 92 | #header .window-menu > menu{ 93 | behavior:~ "titleMenu"; 94 | } 95 | 96 | -------------------------------------------------------------------------------- /aardio-rpc/sqlhelper.aardio: -------------------------------------------------------------------------------- 1 | 2 | namespace sqlhelper 3 | 4 | import carl.mssql; 5 | import carl.mysql; 6 | import carl.oracle; 7 | 8 | var driver = ..config.driver; 9 | 10 | connect = function(){ 11 | var conn,err; 12 | try{ 13 | if(driver == "mssql"){ 14 | var name = ""; 15 | if(#..config.msname) name = "\" + ..config.msname; 16 | conn,err = carl.mssql(..config.host ++ "," ++ ..config.port ++ name,..config.dbname,..config.username,..config.password); 17 | } 18 | elseif(driver == "mysql"){ 19 | conn,err = carl.mysql(..config.host ++ ":" ++ ..config.port,..config.dbname,..config.username,..config.password); 20 | } 21 | elseif(driver == "oracle"){ 22 | conn,err = carl.oracle(..config.host,..config.dbname,..config.username,..config.password,..config.port,..config.provider); 23 | } 24 | } 25 | catch(e){ 26 | err = e; 27 | } 28 | return conn,err; 29 | } 30 | 31 | exec = function( ... ){ 32 | var conn,err = connect(); 33 | if(!conn) return null,err; 34 | var ok,err = conn.exec( ... ); 35 | conn.close(); 36 | conn = null; 37 | return ok,err; 38 | } 39 | 40 | getTable = function( ... ){ 41 | var conn,err = connect(); 42 | if(!conn) return null,err; 43 | var t,err = conn.getTable( ... ); 44 | conn.close(); 45 | conn = null; 46 | var fields; 47 | if(t){ 48 | fields = t["fields"]; 49 | t["fields"] = null; 50 | } 51 | return t,err,fields; 52 | } 53 | 54 | getTables = function( tsql ){//执行多个select语句,参数table对像 55 | var conn,err = connect(); 56 | if(!conn) return null,err; 57 | var tab,err = {}; 58 | for(i=1;#tsql;1){ 59 | var t,e = conn.getTable(tsql[i]); 60 | if(!t){ 61 | tab = null; 62 | err = e; 63 | break; 64 | } 65 | ..table.push(tab,t); 66 | } 67 | conn.close(); 68 | conn = null; 69 | return tab,err; 70 | } 71 | 72 | transaction = function( ... ){//事务执行,参数table对像 73 | var conn,err = connect(); 74 | if(!conn) return null,err; 75 | var ok,err = conn.transaction( ... ); 76 | conn.close(); 77 | conn = null; 78 | return ok,err; 79 | } 80 | 81 | storedProcedures = function( ... ){//存储过程 82 | var conn,err = connect(); 83 | if(!conn) return null,err; 84 | var t,err = conn.storedProcedures( ... ); 85 | conn.close(); 86 | conn = null; 87 | return t,err; 88 | } -------------------------------------------------------------------------------- /aardio-erp/rpc/wwwroot/system/sqlhelper.aardio: -------------------------------------------------------------------------------- 1 | 2 | namespace sqlhelper 3 | 4 | import carl.mssql; 5 | import carl.mysql; 6 | import carl.oracle; 7 | 8 | var driver = ..config.driver; 9 | 10 | connect = function(){ 11 | var conn,err; 12 | try{ 13 | if(driver == "mssql"){ 14 | var name = ""; 15 | if(#..config.msname) name = "\" + ..config.msname; 16 | conn,err = carl.mssql(..config.host ++ "," ++ ..config.port ++ name,..config.dbname,..config.username,..config.password); 17 | } 18 | elseif(driver == "mysql"){ 19 | conn,err = carl.mysql(..config.host ++ ":" ++ ..config.port,..config.dbname,..config.username,..config.password); 20 | } 21 | elseif(driver == "oracle"){ 22 | conn,err = carl.oracle(..config.host,..config.dbname,..config.username,..config.password,..config.port,..config.provider); 23 | } 24 | } 25 | catch(e){ 26 | err = e; 27 | } 28 | return conn,err; 29 | } 30 | 31 | exec = function( ... ){ 32 | var conn,err = connect(); 33 | if(!conn) return null,err; 34 | var ok,err = conn.exec( ... ); 35 | conn.close(); 36 | conn = null; 37 | return ok,err; 38 | } 39 | 40 | getTable = function( ... ){ 41 | var conn,err = connect(); 42 | if(!conn) return null,err; 43 | var t,err = conn.getTable( ... ); 44 | conn.close(); 45 | conn = null; 46 | var fields; 47 | if(t){ 48 | fields = t["fields"]; 49 | t["fields"] = null; 50 | } 51 | return t,err,fields; 52 | } 53 | 54 | getTables = function( tsql ){//执行多个select语句,参数table对像 55 | var conn,err = connect(); 56 | if(!conn) return null,err; 57 | var tab,err = {}; 58 | for(i=1;#tsql;1){ 59 | var t,e = conn.getTable(tsql[i]); 60 | if(!t){ 61 | tab = null; 62 | err = e; 63 | break; 64 | } 65 | ..table.push(tab,t); 66 | } 67 | conn.close(); 68 | conn = null; 69 | return tab,err; 70 | } 71 | 72 | transaction = function( ... ){//事务执行,参数table对像 73 | var conn,err = connect(); 74 | if(!conn) return null,err; 75 | var ok,err = conn.transaction( ... ); 76 | conn.close(); 77 | conn = null; 78 | return ok,err; 79 | } 80 | 81 | storedProcedures = function( ... ){//存储过程 82 | var conn,err = connect(); 83 | if(!conn) return null,err; 84 | var t,err = conn.storedProcedures( ... ); 85 | conn.close(); 86 | conn = null; 87 | return t,err; 88 | } -------------------------------------------------------------------------------- /aardio-erp/.build/default.Manifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 10 | ERP 11 | 12 | 13 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 52 | 53 | 54 | 55 | 56 | 57 | True/PM 58 | 59 | 60 | 61 | -------------------------------------------------------------------------------- /aardio-cgi/.build/default.Manifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 10 | fastcgi服务端 11 | 12 | 13 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 52 | 53 | 54 | 55 | 56 | 57 | True/PM 58 | 59 | 60 | -------------------------------------------------------------------------------- /aardio-rpc/.build/default.Manifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 10 | aardio-rpc 11 | 12 | 13 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 52 | 53 | 54 | 55 | 56 | 57 | True/PM 58 | 59 | 60 | -------------------------------------------------------------------------------- /aardio-erp/lib/ws/System/SystemUser.aardio: -------------------------------------------------------------------------------- 1 | 2 | namespace ws.System.SystemUser 3 | 4 | import ws; 5 | import ws.sql; 6 | import ws.System; 7 | import crypt.des; 8 | import crypt.bin; 9 | 10 | string = ..string; 11 | table = ..table; 12 | 13 | var webservice = ws.System; 14 | var tablename = "SystemUser" 15 | 16 | /*intellisense(ws.System.SystemUser)*/ 17 | 18 | getPrimaryKey = function(){//返回主键 19 | return ws.System.sp_getPrimaryKey(tablename); 20 | } 21 | 22 | insert = function(tab){ 23 | var sql = ws.sql.getInsertSql(tablename, tab); 24 | return webservice.exec(sql); 25 | } 26 | 27 | update = function(tab, Id){ 28 | var sql = ws.sql.getUpdateSql(tablename, tab, "SystemUserId = '" + Id + "'"); 29 | var ok,err = webservice.exec(sql) 30 | return ok,err; 31 | } 32 | 33 | checkLogin = function(loginName, password){ 34 | loginName = string.replace(loginName, "'", "''"); 35 | password = string.replace(password, "'", "''"); 36 | var sql = "select SystemUserId,IsEnable from " + tablename + " where loginName = '" + loginName + "' and password = '" + password + "'"; 37 | var t,err = webservice.getTable(sql); 38 | if( !t ){ return null,"网络连接出错" ++ (err:""); } 39 | if( !#t ){ return null,"帐号密码错误" ++ (err:""); } 40 | if( t[1]["IsEnable"] != "1" ){ return null,"此用户已被禁用"; } 41 | ..math.randomize(); 42 | ..thread.set("ApiToken", null); 43 | var token = string.random(32); 44 | var SystemUserId = t[1]["SystemUserId"]; 45 | var ok,err = update({token = token}, SystemUserId); 46 | if(!ok) return null,err; 47 | ..thread.set("ApiToken", token); 48 | return SystemUserId; 49 | } 50 | 51 | getUserInfo = function(userId){ 52 | userId = string.replace(userId, "'", "''"); 53 | var sql = "select SystemUserId,LoginName,NickName,PassWord,CreateTime,IsEnable,IsAdmin from " + tablename + " where SystemUserId = '" + userId + "'"; 54 | var t,err = webservice.getTable(sql); 55 | if( !t ){ return null,err; } 56 | if( !#t ){ return null,"无此用户"; } 57 | return t[1]; 58 | } 59 | 60 | //返回需要权限控制的所有用户 61 | getLimitUserList = function(){ 62 | var sql = "SELECT SystemUserId,LoginName,NickName FROM SystemUser where IsEnable='1' and LoginName!='admin' order by LoginName"; 63 | var t,err = webservice.getTable(sql); 64 | if( !t ){ return null,err; } 65 | return t; 66 | } 67 | 68 | encryptPwd = function(pwd){//加密 69 | var des = crypt.des(); 70 | des.setPassword("aautoerp") 71 | pwd = des.encrypt(pwd); 72 | pwd = crypt.bin.encodeBase64(pwd); 73 | return pwd; 74 | } 75 | 76 | decryptPwd = function(pwd){//解密 77 | var des = crypt.des(); 78 | des.setPassword("aautoerp"); 79 | pwd = crypt.bin.decodeBase64(pwd); 80 | pwd = des.decrypt(pwd); 81 | return pwd; 82 | } 83 | 84 | /*end intellisense*/ -------------------------------------------------------------------------------- /lib/carl/rpc/client.aardio: -------------------------------------------------------------------------------- 1 | //client 客户端 2 | namespace carl.rpc 3 | 4 | client = class { 5 | ctor( serverUrl,rsaPublicKey,... ){ 6 | this.serverUrl = serverUrl; 7 | this.rsaPublicKey = rsaPublicKey; 8 | this.code = "aardio";//传输协议 json,aardio 9 | this.client = web.rest.client( ... ); 10 | this.client._http.addHeaders = "Accept-Encoding:gzip, deflate"; 11 | 12 | this.client.afterStringifyRequestParameters = function(postdata){ 13 | if( # this.rsaPublicKey ){ 14 | postdata,err = carl.rsa.encrypt(postdata, this.rsaPublicKey); 15 | if( !postdata ) error('加密错误: ' ++ (err:""),2); 16 | }; 17 | return postdata; 18 | } 19 | 20 | this.client.parseResponseResult = function( html ){ 21 | var r,tab; 22 | var l = string.left(html,4); 23 | if( string.find(l,"\{\[\d\]") ){ 24 | r,tab = call(eval,,html); 25 | } 26 | else { 27 | tab = web.json.tryParse(html); 28 | if(type(tab) == type.table) r = true; 29 | if(r) carl.rpc.unformat(tab); 30 | } 31 | if(r){ 32 | return table.unpackArgs(tab); 33 | } 34 | else { 35 | return null,'服务端错误: ' ++ html; 36 | } 37 | } 38 | }; 39 | 40 | close = function(){ 41 | this.client.close(); 42 | } 43 | 44 | @_meta; 45 | } 46 | 47 | namespace client{ 48 | import carl.rsa; 49 | import carl.rpc; 50 | import web.json; 51 | import web.rest.client; 52 | import inet.url; 53 | import zlib; 54 | 55 | table = ..table; 56 | string = ..string; 57 | 58 | _meta = { 59 | _get = function( k ){ 60 | if( type(k) == "string" && k[1]=='_'# ) return; 61 | k = tostring(k); 62 | if(!k) return; 63 | 64 | var api = { 65 | _code = owner.code:""; 66 | _post = owner.client.post; 67 | _urlReal = inet.url.appendExtraInfo(owner.serverUrl,"op=" ++ k ++ "&code=" ++ (owner.code:"") ++ "&_=" ++ ..math.random()); 68 | @_meta; 69 | } 70 | owner[[k]] = api; 71 | return api; 72 | } 73 | _call = function( ... ){ 74 | var t = {...}; 75 | var postdata; 76 | if( string.cmpMatch(owner._code,"aardio" ) ){ 77 | postdata = table.tostring(t); 78 | }else { 79 | carl.rpc.format(t); 80 | postdata = web.json.stringify(t); 81 | } 82 | return owner._post( owner._urlReal, postdata) ; 83 | } 84 | } 85 | } 86 | 87 | 88 | /**intellisense() 89 | carl.rpc.client = rpc客户端 90 | carl.rpc.client( rpcUrl,rsaPublicKey ) = 创建rpc客户端,参数1是rpc服务端URL,\n参数2是RSA公钥,数据传输启用RSA加密\n(参数2可忽略,为空不加密,服务端RSA私钥也需对应为空) 91 | carl.rpc.client() = !client. 92 | !client.服务端函数名("参数1","参数2") = 执行服务端函数,支持不定数个参数,\n可获取服务端函数的返回值\n参数支持5种基本数据类型:null,table,string,boolean,number 93 | !client.code = @.code = "json";//参数传输协议(json和aardio),默认json,aardio是用table.tostring()传输 94 | !client.close() = 关闭资源 95 | end intellisense**/ 96 | -------------------------------------------------------------------------------- /aardio-erp/res/System/User.aardio: -------------------------------------------------------------------------------- 1 | import win.ui; 2 | /*DSG{{*/ 3 | var winform = win.form(text="loading...";right=600;bottom=400;border="dialog frame";parent=...) 4 | winform.add( 5 | page={cls="page";text="整页控件";left=0;top=60;right=600;bottom=400;center=1;db=1;dl=1;dr=1;dt=1;edge=1;transparent=1;z=1}; 6 | static5={cls="static";text="登录名或姓名";left=9;top=36;right=88;bottom=50;dl=1;dt=1;transparent=1;z=2}; 7 | toolbar={cls="toolbar";text="工具条";left=0;top=-2;right=600;bottom=25;center=1;dl=1;dr=1;dt=1;edge=1;transparent=1;z=4}; 8 | txtText={cls="edit";left=91;top=31;right=261;bottom=53;autohscroll=false;autovscroll=false;dl=1;dt=1;edge=1;hidesel=1;tabstop=1;z=3} 9 | ) 10 | /*}}*/ 11 | 12 | winform.listview = winform.page.listview(); 13 | winform.lvEx = winform.page.listviewEx(); 14 | winform.listview.onnotify = function(id,code,ptr){ 15 | return winform.lvEx.openonnotify(id,code,ptr)//默认菜单,排序 16 | } 17 | 18 | winform.page.webService = ws.System; 19 | winform.page.sql = "SELECT SystemUserId,LoginName,NickName,PassWord,CreateTime,IsEnable,truser,trdate FROM SystemUser"; 20 | winform.page.orderby = "LoginName"; 21 | winform.page.table = { 22 | {key = "rowId";name = "序号";len = 50}; 23 | {key = "LoginName";name = "登录名";len = 100}; 24 | {key = "NickName";name = "姓名";len = 100}; 25 | {key = "CreateTime";name = "创建时间";len = 130}; 26 | {key = "IsEnable";name = "状态";len = 100}; 27 | {key = "truser";name = "异动人";len = 100}; 28 | {key = "trdate";name = "异动时间";len = 130}; 29 | {key = "SystemUserId";name = "主键ID";len = 0}; 30 | } 31 | winform.page.where = function(){ 32 | var where = "1=1 "; 33 | var txt = string.trim(winform.txtText.text); 34 | if( #txt ){ 35 | txt = string.replace(txt, "'","''"); 36 | where += " and ( LoginName like '%" + txt + "%' or NickName like '%" + txt + "%')" 37 | } 38 | if(tabLoginInfo["LoginName"] != "admin"){ 39 | where += " and LoginName != 'admin'"; 40 | } 41 | return where; 42 | } 43 | 44 | winform.lvEx.setCellBefore = function(value, key, row, col){ 45 | if( key == "IsEnable"){ 46 | if( value == "1" ){ 47 | value = "启用"; 48 | winform.lvEx.setTextColor(row,col,gdi.RGB(0,80,0))//绿色 49 | }else { 50 | value = "禁用"; 51 | winform.lvEx.setTextColor(row,col,gdi.RGB(255,0,0))//红色 52 | } 53 | } 54 | return value; 55 | } 56 | 57 | winform.load = function(){ 58 | winform.page.load();//显示首页 59 | } 60 | 61 | winform.btnSearch = function(){ 62 | winform.page.search(); 63 | } 64 | 65 | winform.btnAdd = function(){ 66 | winform.Add = true; 67 | winform.Edit = null; 68 | winform.trow = null; 69 | winform.loadForm("\res\system\UserAddEdit.aardio") 70 | } 71 | 72 | winform.btnEdit = function(){ 73 | if(not winform.page.start()){return ; } 74 | winform.Add = null; 75 | winform.Edit = true; 76 | winform.trow = winform.lvEx.getRowTable(winform.page.index); 77 | winform.loadForm("\res\system\UserAddEdit.aardio") 78 | } 79 | 80 | winform.toolbar.btnAdd(winform.btnAdd, "新增") 81 | winform.toolbar.btnEdit(winform.btnEdit,"修改") 82 | winform.toolbar.btnSearch(winform.btnSearch, "查询") 83 | 84 | winform.show() 85 | //win.loopMessage(); 86 | return winform; 87 | -------------------------------------------------------------------------------- /aardio-erp/layout/styles/main.css: -------------------------------------------------------------------------------- 1 | 2 | #container{ 3 | width:100%; 4 | height:100%%; /*撑满剩余可用空间*/ 5 | flow: horizontal; /*将容器内部块元素变为横向布局 - 比具有破坏性的float浮动布局更方便*/ 6 | margin:0 auto; 7 | overflow:hidden; 8 | background-color: #f5f5f5; 9 | } 10 | 11 | #container .lside{ 12 | width:150px; 13 | background:rgb(110,179,210); 14 | } 15 | 16 | #container .rside{ 17 | height:100%; 18 | background:#FFF; 19 | } 20 | 21 | #container .lside > *{ 22 | margin:38px 0px; 23 | } 24 | 25 | #container .rside > *{ 26 | margin:38px 10px; 27 | font-size:9pt; 28 | } 29 | 30 | #container .lside{ 31 | height:100%; 32 | width:150px; 33 | background:rgb(110,179,210); 34 | } 35 | 36 | #container .rside{ 37 | height:100%; 38 | background:#FFF; 39 | } 40 | 41 | #reflection { 42 | text-align:center; 43 | padding-bottom: 50px; 44 | height: 100px; 45 | width: 100%; 46 | margin:50% 0 0 0; 47 | overflow:hidden; 48 | behavior:reflection; 49 | -reflection-opacity-start: 0.4; 50 | -reflection-opacity-end: 0.0; 51 | -reflection-blur-radius: 3; 52 | } 53 | #reflection .maininfo{ 54 | font-size:50px; 55 | margin:* * 2px *; 56 | color:#4B5F6B; 57 | overflow:hidden; 58 | } 59 | 60 | .systemmenu { 61 | background-color: #FFF; 62 | border-bottom: 1px solid #a1a1a1; 63 | display: block; 64 | width: 100%; 65 | height: 70px; 66 | overflow: hidden; 67 | background-color: #FFFFFF #aeddff #aeddff #aeddff; 68 | flow: horizontal; 69 | } 70 | .systemmenu span{ 71 | padding: 5px 0 2px 0; 72 | } 73 | .systemmenu .sys-menu, .sys { 74 | display: inline-block; 75 | height: 50px; 76 | width: 50px; 77 | color: #333; 78 | text-decoration: none; 79 | text-align: center; 80 | margin: 3px 0 2px 5px; 81 | font-size: 12px; 82 | padding: 0 7px ; 83 | border-radius: 5px; 84 | border: 1px solid transparent; 85 | background-color: transparent; 86 | line-height: 100%; 87 | } 88 | .systemmenu .sys-menu { 89 | behavior: popup-menu; 90 | } 91 | .systemmenu .sys-menu > menu{ 92 | behavior:~ "main.systemMenu"; 93 | } 94 | .systemmenu .sys { 95 | behavior:~ "main.systemMenuClick"; 96 | } 97 | .systemmenu .sys-menu:hover, .sys:hover{ 98 | border: 1px solid #999999; 99 | transition: background-color(quart-in-out, 0.5s, 0.5s); 100 | } 101 | .systemmenu .sys-menu:owns-popup /*菜单已弹出*/ 102 | { 103 | border: 1px solid #999999; 104 | background-color: #BBE9FF; 105 | transition: background-color(quart-in-out, 0.5s, 0.5s); 106 | } 107 | .systemmenu .sys-menu img, .sys img { 108 | display: block; 109 | width: 40px; 110 | margin: 1px 1px 0 1px; 111 | } 112 | 113 | #mainfooter{ 114 | height:22px; 115 | background:rgb(52,152,220); 116 | font-size:12px; 117 | color:white; 118 | text-align:right; 119 | flow: horizontal; 120 | position:absolute;/*使用绝对定位*/ 121 | bottom:0px;/*底坐标为50像素*/ 122 | width:100%; 123 | overflow:hidden; 124 | } 125 | 126 | #mainfooter .status{ 127 | padding:5px 15px 0px; 128 | margin:0 0 0 20px; 129 | } 130 | #status4 { 131 | behavior:~ "main.click"; 132 | } -------------------------------------------------------------------------------- /aardio-erp/res/Main/loginLayout.aardio: -------------------------------------------------------------------------------- 1 | import win.ui; 2 | /*DSG{{*/ 3 | var winform = win.form(text="AAuto Form";right=429;bottom=329;border="none";max=false;parent=...) 4 | winform.add() 5 | /*}}*/ 6 | 7 | import web.layoutEx; 8 | import web.layout.behavior.login.buttons; 9 | import web.layout.behavior.login.selectRoad; 10 | import web.layout.behavior.login.password; 11 | 12 | var wbLayout,start,login; 13 | 14 | update = function(mainForm){ 15 | if(!_STUDIO_INVOKED){ 16 | var upUrl = thread.get("ahtmlServerUrl"); 17 | if(!#upUrl) return ; 18 | var Ver = carl.update.getVersion();//版本号 19 | var updateUrl = upUrl + "/update/index.html?r=" + math.random(); 20 | var downUrl = upUrl + "/update/Erp.exe"; 21 | var u = carl.update(updateUrl, downUrl,"Erp.exe", mainForm, _CMDLINE ); 22 | return u.checkUpdate(Ver,true);//检查更新 23 | } 24 | } 25 | 26 | start = function(){ 27 | var user = wbLayout.getEle("txtUserName").value; 28 | var pwd = wbLayout.getEle("txtPwd").value; 29 | if(!#user || !#pwd){ 30 | winform.msgbox("登录名或密码不能空!"); 31 | return false; 32 | } 33 | var roadName = wbLayout.getEle("roadName").innerText; 34 | conn.reg(wbLayout.getEle("cbreSart").state.checked);//是否开机运行 35 | return user,pwd,roadName; 36 | } 37 | 38 | login = function(user,pwd){ 39 | pwd = ws.System.SystemUser.encryptPwd(pwd); 40 | var SystemUserId,err = ws.System.SystemUser.checkLogin(user,pwd); 41 | if(!SystemUserId) return false,err; 42 | var tuser,err = ws.System.SystemUser.getUserInfo(SystemUserId); 43 | return tuser,err; 44 | } 45 | 46 | //选择线路 47 | winform.selectRoad = function(roadName){ 48 | if(!#roadName) return ; 49 | var serverUrl; 50 | var eles = wbLayout.$("li"); 51 | for(i=1;#eles;1){ 52 | var ele = eles[i]; 53 | if(ele.innerText == roadName){ 54 | serverUrl = ele.url; 55 | break ; 56 | } 57 | } 58 | winform.showRoad(roadName, serverUrl); 59 | } 60 | 61 | //显示线路 62 | winform.showRoad = function(roadName, serverUrl){ 63 | var ele = wbLayout.getEle("roadName"); 64 | ele.innerText = roadName; 65 | ele.url = serverUrl; 66 | thread.set("ahtmlServerUrl", serverUrl)//ahtml服务器URL 67 | } 68 | 69 | winform.btnLogin = function(){ 70 | var user,pwd,roadName = start(); 71 | if(!user) return false; 72 | tabLoginInfo,err = login(user,pwd); 73 | thread.set("tabLoginInfo", tabLoginInfo) 74 | if(tabLoginInfo){ 75 | wbLayout.setEle("txtPwd","") 76 | config.loginForm.roadName = roadName; 77 | config.loginForm.ahtmlServerUrl = thread.get("ahtmlServerUrl"); 78 | config.loginForm.save();//自动保存HL界面值 79 | winform.close(); 80 | loadcode("/res/Main/mainLayout.aardio")(roadName); 81 | }else { 82 | winform.msgbox("登录失败," ++ (err:"")); 83 | } 84 | } 85 | 86 | winform.text = config.__appName; 87 | wbLayout = web.layoutEx( winform, "/layout/login.html" ); 88 | wbLayout.getEle("roadMenu").innerHTML = conn.getLayoutRoadMenu(config.__appRoad);//线路菜单 89 | wbLayout.setEle("cbreSart", true);//初始开机运行 90 | winform.selectRoad("外网");//初始线路 91 | wbLayout.bindConfig( config.loginForm );//开启自动保存 92 | winform.selectRoad( config.loginForm.roadName)//上次 93 | update(winform);//检查更新版本 94 | 95 | winform.show() 96 | conn.deskQuick(); 97 | win.loopMessage(); 98 | return winform; 99 | -------------------------------------------------------------------------------- /aardio-erp/lib/config.aardio: -------------------------------------------------------------------------------- 1 | //config 配置文件 2 | 3 | import win.ui.menu; 4 | import win.ui.statusbar; 5 | import win.ui.toolbar; 6 | 7 | import fsys; 8 | import fsys.config; 9 | 10 | import process; 11 | import console; 12 | 13 | import carl.update; 14 | import carl.ctrl;//自定义控件库 15 | import carl.report;//报表库 16 | import carl.http; 17 | import conn; 18 | 19 | import ws; 20 | import ws.sql; 21 | import ws.System; 22 | import ws.System.SystemUser; 23 | import ws.System.Errlog; 24 | import ws.System.SystemMenu; 25 | import ws.System.SystemUserToMenu; 26 | 27 | config = ..fsys.config("/config/"); 28 | 29 | /** 30 | config = ..fsys.config( 31 | ..fsys.joinpath( ..fsys.getSpecial( 0x1c /*_CSIDL_LOCAL_APPDATA*/ ),"应用程序名" ) 32 | ); 33 | **/ 34 | 35 | //不需要序列化的配置名字前请添加下划线 36 | namespace config { 37 | __appName = "ERP系统框架 - by aardio"; 38 | __appCompanyName = "carl论坛 - aardio第三方论坛"; 39 | __website = "http://www.aardio.org/?erp"; 40 | __desktopName = "aardio ERP"; 41 | __appRoad = { 42 | {"内网";"http://192.168.17.249:8020"}; 43 | {"外网";"http://erp.carlaau.com"}; 44 | {"测试";"http://127.0.0.1:8020"}; 45 | //{"直连";""};//如果需要支持数据库直连,请去掉注释//, 然后把\lib\ws\System\直连.txt 重命名为_.aardio 46 | } 47 | __drive = "mysql";//或mssql 48 | __info1 = "ERP管理系统"; 49 | __info2 = "xx商务中心"; 50 | } 51 | thread.set("config.__drive", config.__drive); 52 | 53 | import util 54 | util.metaProperty.extend(win.ui.ctrl.datetimepick,{ 55 | checked = { 56 | _get = function(){ 57 | return ! ::SendMessageByStruct(owner.hwnd, 0x1001/*_DTM_GETSYSTEMTIME*/,0,owner.time);//修复win2003系统会崩溃 58 | } 59 | _set = function( v ){ 60 | if(!v) return ::SendMessageByStruct(owner.hwnd, 0x1002/*_DTM_SETSYSTEMTIME*/,1, {}); 61 | if(! ..time.istime(v)) error("无效的time对象",2); 62 | ::SendMessageByStruct(owner.hwnd, 0x1002/*_DTM_SETSYSTEMTIME*/,0, v); 63 | } 64 | }; 65 | }) 66 | 67 | /**intellisense(config) 68 | __appName = 应用程序名 69 | __appVersion = 应用程序内部版本号 70 | __appDescription = 程序说明 71 | __website = 官方网站 72 | __appCompanyName = 公司名称 73 | __appRoad = 线路 74 | __drive = 数据库类型,mysql 或mssql 75 | __desktopName = "桌面快捷方式名称" 76 | __info1 = 主界面信息1; 77 | __info2 = 主界面信息2; 78 | 79 | saveAll() = 写入所有配置到文件 80 | mainForm.load() = 从配置文件(文件名"default")载入\n加载成功返回对象,加载失败返回null空值\n!fsys_table. 81 | mainForm.save() = 存储到配置文件(文件名"default") 82 | mainForm.mixin = @.mixin(\n 键名 = 值__;\n 键名 = 值;\n);//该数会自动调用save函数保存配置到文件 83 | mainForm.控件名称 = 控件默认值\n调用save()函数同步控件当前值 84 | mainForm.属性名 = 自配置文件(文件名"default")读写属性\n属性值可以是支持序列化的普通变量,支持table对象.\n配置文件在首次使用时自动加载,退出程序时自动保存. 85 | end intellisense**/ 86 | 87 | /**intellisense() 88 | tabLoginInfo = 登录用户信息,全局变量 89 | tabLoginInfo.SystemUserId = 用户ID 90 | tabLoginInfo.LoginName = 登录名 91 | tabLoginInfo.NickName = 姓名 92 | tabLoginInfo.PassWord = 密码 93 | tabLoginInfo.CreateTime = 创建时间 94 | 95 | mainFormTabCtrl = 主界面选项卡,全局变量 96 | mainFormTabCtrl.addTabForm( file, title, menuId,其他参数) = 新建选项卡 97 | mainFormTabCtrl.isOpenOnlyOne = 是否允许一个fileurl打开多个选项卡,true 或 false 98 | mainFormTabCtrl.closeTabForm(selIndex) = 关闭当前选项卡 99 | mainFormTabCtrl.selIndex = 当前selIndex 100 | 101 | tabSystemTreeMenu = 菜单权限,全局变量 102 | 103 | end intellisense**/ -------------------------------------------------------------------------------- /lib/carl/ctrl/pageSort.aardio: -------------------------------------------------------------------------------- 1 | //pageSort 列名排序 2 | import win.ui; 3 | import carl.ctrl; 4 | import fsys; 5 | /*DSG{{*/ 6 | var winform = win.form(text="自定义设置列名";right=305;bottom=325;border="dialog frame";exmode="toolwindow";max=false;min=false) 7 | winform.add( 8 | lvex={cls="listviewex";text="listview扩展控件";left=1;top=26;right=305;bottom=325;db=1;dl=1;dr=1;dt=1;edge=1;transparent=1;z=2}; 9 | toolbar={cls="toolbar";text="工具条";left=0;top=-2;right=308;bottom=25;center=1;dl=1;dr=1;dt=1;edge=1;transparent=1;z=1} 10 | ) 11 | /*}}*/ 12 | 13 | var sortCommand,showList,tabSort,tabSortAll,save;; 14 | var form = ...; 15 | fsys.createDir("/config/") 16 | winform.lvex.isSort = false; 17 | winform.listview = winform.lvex.getListview(); 18 | 19 | var tabhead = { 20 | {key = "Show";name = "是否显示";len = 60}; 21 | {key = "ListName";name = "列名称";len = 150}; 22 | {key = "rowId";name = "排序号";len = 50}; 23 | } 24 | 25 | showList = function(tab){ 26 | winform.lvex.clearRow(); 27 | for(i,t in tab){ 28 | if((t.len || (t.len<=0 && t.s !== null)) && t.key != "rowId"){ 29 | var index = winform.lvex.addItem(""); 30 | winform.lvex.set("ListName",index,t.name) 31 | winform.lvex.set("rowId",index,index) 32 | if(t.s !== false) winform.listview.setChecked(index); 33 | } 34 | } 35 | } 36 | 37 | sortCommand = function(str){ 38 | var text1,text2,index2,check1,check2; 39 | for(index1=1;winform.listview.count;1){ 40 | if( winform.listview.getSelected(index1) ){ 41 | text1 = winform.lvex.get(index1,"ListName"); 42 | if(str == 1){//上移 43 | index2 = index1-1; 44 | }else { 45 | index2 = index1+1; 46 | } 47 | if(index2 < 1 || index2 > winform.listview.count) break ; 48 | text2 = winform.lvex.get(index2,"ListName"); 49 | check1 = winform.listview.getChecked(index1); 50 | check2 = winform.listview.getChecked(index2); 51 | winform.lvex.set("ListName",index2,text1); 52 | winform.lvex.set("ListName",index1,text2); 53 | winform.listview.setChecked(index2,check1); 54 | winform.listview.setChecked(index1,check2); 55 | winform.listview.setSelected(index2); 56 | winform.listview.setSelected(index1,false); 57 | winform.listview.selIndex = index2; 58 | winform.listview.ensureVisible(); 59 | break ; 60 | } 61 | } 62 | } 63 | 64 | save = function(tab){ 65 | tabSortAll[form.ResName] = tab; 66 | string.save(form.sortFilePath, table.tostring(tabSortAll)) 67 | form.lvex.clearAll(); 68 | form.load() 69 | } 70 | 71 | winform.btnUp = function(){ 72 | sortCommand(1); 73 | } 74 | 75 | winform.btnDown = function(){ 76 | sortCommand(2); 77 | } 78 | 79 | winform.btnDefault = function(){ 80 | showList(form.table); 81 | save(); 82 | } 83 | 84 | winform.btnSave = function(){ 85 | tabSort = {} 86 | for(index=1;winform.listview.count;1){ 87 | var s = winform.listview.getChecked(index); 88 | var n = winform.lvex.get(index,"ListName"); 89 | table.push(tabSort,{s=s;n=n}); 90 | } 91 | save(tabSort) 92 | } 93 | 94 | winform.load = function(){ 95 | winform.lvex.addHead(tabhead);//加载列名 96 | tabSort,tabSortAll = form.loadSort();//加载本地列名排序表 97 | showList(tabSort); 98 | } 99 | 100 | winform.toolbar.btnSave(winform.btnSave,"保存") 101 | winform.toolbar.btnUp(winform.btnUp, "上移") 102 | winform.toolbar.btnDown(winform.btnDown, "下移") 103 | winform.toolbar.btnRefresh(winform.btnDefault, "默认设置") 104 | winform.show() 105 | winform.load(); 106 | win.loopMessage(); 107 | return winform; 108 | -------------------------------------------------------------------------------- /lib/carl/ctrl/treeviewex.aardio: -------------------------------------------------------------------------------- 1 | //treeviewex 树形扩展控件 2 | namespace carl.ctrl.treeviewex{} 3 | 4 | //treeview 树形控件 5 | import win.ui.ctrl.metaProperty;//导入控件属性元表支持 6 | namespace win.ui.ctrl; 7 | 8 | class treeviewex{ 9 | ctor(treeview){ 10 | this = treeview; 11 | this.exIsToggle = true; 12 | this.exIsChecked = true; 13 | } 14 | 15 | exOnnotify = function(id,code,ptr){ 16 | if( code == 0xFFFFFFFE/*_NM_CLICK*/ ){ 17 | var hItem,ht = this.hitTest() 18 | select(ht) { 19 | case 4/*_TVHT_ONITEMLABEL你点在文本上了*/{ 20 | if(this.exIsToggle){//展开 21 | this.setSelected(hItem) 22 | this.toggle(hItem) 23 | } 24 | if(this.exMouseClick){//单击事件 25 | this.exMouseClick(hItem) 26 | } 27 | } 28 | case 0x40/*_TVHT_ONITEMSTATEICON你点在状态图标上了*/{ 29 | if(this.exIsChecked){ 30 | this.exClickSetChecked(hItem); 31 | } 32 | } 33 | case 8/*_TVHT_ONITEMINDENT你点在缩进部分了*/{ 34 | 35 | } 36 | case 2/*_TVHT_ONITEMICON你点在图标上了*/{ 37 | 38 | } 39 | case 0x10/*_TVHT_ONITEMBUTTON你点在项目按钮上了*/{ 40 | 41 | } 42 | else {//你点在空白部份了 43 | 44 | } 45 | } 46 | } 47 | } 48 | 49 | exExpandAll = function(){ 50 | for hChild in this.each(){ 51 | this.expandAll(hChild) 52 | } 53 | } 54 | 55 | exClickSetChecked = function(hParent){ 56 | this.setSelected(hParent) 57 | var bool = !this.getChecked(hParent); 58 | if(this.exCheckBoxesChanged){ 59 | this.exCheckBoxesChanged(hParent, bool);//选中事件 60 | } 61 | var eachChild,eachParent; 62 | eachChild = function(hParent){//全选或不选子项 63 | this.expand(hParent); 64 | for hItem in this.each(hParent){ 65 | this.setChecked(hItem, bool); 66 | if(this.exCheckBoxesChanged){ 67 | this.exCheckBoxesChanged(hItem, bool);//选中事件 68 | } 69 | eachChild(hItem) 70 | } 71 | } 72 | eachParent = function(hItem,bool){//只要其中一个子项选中,父项也选中,否则不选 73 | var hParent = this.getParentItem(hItem); 74 | if(hParent){ 75 | var ok = false; 76 | for hchild in this.each(hParent){ 77 | if(hchild != hItem && this.getChecked(hchild)){ 78 | ok = true; 79 | break ; 80 | } 81 | } 82 | bool = ok || bool; 83 | this.setChecked(hParent, bool); 84 | if(this.exCheckBoxesChanged){ 85 | this.exCheckBoxesChanged(hParent, bool);//选中事件 86 | } 87 | eachParent(hParent,bool) 88 | } 89 | } 90 | eachParent(hParent,bool) 91 | eachChild(hParent); 92 | } 93 | } 94 | 95 | 96 | /**intellisense() 97 | win.ui.ctrl.treeviewex = 树形扩展控件 98 | win.ui.ctrl.treeviewex(.(treeview控件) = treeview控件 99 | ?win.ui.ctrl.treeviewex = !treeview. 100 | !treeview.exExpandAll() = 展开全部节点 101 | !treeview.exIsToggle = @.exIsToggle = true;//是否开启 点击节点时折叠的就展开,展开的就折叠,\n开启:true,关闭:false,默认已开启 102 | !treeview.exIsChecked = @.exIsChecked = true;//是否开启以下两个功能\n1.打勾节点则全选所有子节点,不打勾则全不选子节点,\n2.子节点其中一个打勾,则父节点打勾,\n开启:true,关闭:false,默认已开启 103 | !treeview.exOnnotify = @.onnotify = function(id,code,ptr) { 104 | /*响应通知*/ 105 | 106 | return ??.exOnnotify(id,code,ptr); 107 | }; 108 | !treeview.exCheckBoxesChanged = @.exCheckBoxesChanged = function(hItem, checked){\n __\n}//选中事件 109 | !treeview.exMouseClick = @.exMouseClick = function(hItem){\n __\n}//单击事件 110 | end intellisense**/ 111 | -------------------------------------------------------------------------------- /aardio-erp/res/System/UserAddEdit.aardio: -------------------------------------------------------------------------------- 1 | import win.ui; 2 | /*DSG{{*/ 3 | var winform = win.form(text="loading...";right=291;bottom=258;border="dialog frame";exmode="none";max=false;mode="popup";parent=...) 4 | winform.add( 5 | cboIsEnable={cls="combobox";left=76;top=133;right=279;bottom=156;edge=1;items={"启用";"禁用"};mode="dropdownlist";tabstop=1;z=13}; 6 | groupbox={cls="groupbox";text="用户信息";left=5;top=27;right=288;bottom=254;edge=1;z=1}; 7 | static={cls="static";text="登录密码";left=17;top=80;right=70;bottom=97;transparent=1;z=4}; 8 | static2={cls="static";text="姓 名";left=17;top=108;right=64;bottom=125;dl=1;dt=1;transparent=1;z=3}; 9 | static3={cls="static";text="登 录 名";left=17;top=52;right=68;bottom=72;dl=1;dt=1;transparent=1;z=5}; 10 | static4={cls="static";text="状 态";left=17;top=139;right=57;bottom=157;transparent=1;z=9}; 11 | static7={cls="static";text="创建时间";left=17;top=168;right=70;bottom=186;transparent=1;z=6}; 12 | static8={cls="static";text="异动人";left=17;top=199;right=65;bottom=214;transparent=1;z=7}; 13 | static9={cls="static";text="异动时间";left=17;top=227;right=71;bottom=244;transparent=1;z=8}; 14 | toolbar={cls="toolbar";text="工具条";left=0;top=-2;right=293;bottom=25;center=1;dl=1;dr=1;dt=1;edge=1;transparent=1;z=2}; 15 | txtCreateTime={cls="edit";left=76;top=163;right=279;bottom=186;edge=1;hidesel=1;readonly=1;tabstop=1;z=14}; 16 | txtLoginName={cls="edit";left=76;top=44;right=279;bottom=67;edge=1;hidesel=1;tabstop=1;z=10}; 17 | txtNickName={cls="edit";left=76;top=103;right=279;bottom=126;edge=1;hidesel=1;tabstop=1;z=12}; 18 | txtPassWord={cls="edit";left=76;top=74;right=279;bottom=97;edge=1;hidesel=1;tabstop=1;z=11}; 19 | txttrdate={cls="edit";left=76;top=222;right=279;bottom=245;edge=1;hidesel=1;readonly=1;tabstop=1;z=16}; 20 | txttruser={cls="edit";left=76;top=192;right=279;bottom=215;edge=1;hidesel=1;readonly=1;tabstop=1;z=15} 21 | ) 22 | /*}}*/ 23 | 24 | winform.load = function(){ 25 | if( winform.parent.Add ){ 26 | winform.text = "新增用户" 27 | winform.txtCreateTime.text = ws.getServerTime(); 28 | } 29 | elseif( winform.parent.Edit ){ 30 | winform.text = "修改用户" 31 | conn.setwinform(winform,winform.parent.trow); 32 | } 33 | winform.cboIsEnable.selIndex = 1; 34 | winform.txttrdate.text = ws.getServerTime(); 35 | winform.txttruser.text = tabLoginInfo["NickName"] 36 | } 37 | 38 | winform.btnSave = function(){ 39 | var t = conn.getwinform(winform); 40 | if( !#t["LoginName"] or !#t["NickName"] ){ 41 | winform.msgbox("登录名,姓名不能为空","提示") 42 | return ; 43 | } 44 | if(winform.parent.Add && !#t["PassWord"]){ 45 | winform.msgbox("密码不能为空","提示") 46 | return ; 47 | } 48 | /* 49 | if(winform.parent.Edit && winform.parent.trow.LoginName == "admin"){ 50 | winform.msgbox("不允许修改超级管理员","提示") 51 | return false; 52 | } 53 | */ 54 | t["IsEnable"] = t["IsEnable"] == "启用" ? "1" : "0"; 55 | if( !#t["PassWord"] ){ 56 | t["PassWord"] = null;//为空不修改密码 57 | }else { 58 | t["PassWord"] = ws.System.SystemUser.encryptPwd(t["PassWord"]); 59 | } 60 | var ok,err; 61 | if( winform.parent.Edit ){ 62 | t["CreateTime"] = null; 63 | ok,err = ws.System.SystemUser.update(t, winform.parent.trow.SystemUserId); 64 | }else { 65 | t["SystemUserId"] = ws.System.SystemUser.getPrimaryKey(); 66 | ok,err = ws.System.SystemUser.insert(t) 67 | } 68 | if(!ok){ 69 | winform.msgbox("保存失败," ++ (err:""),"提示") 70 | }else { 71 | winform.msgbox("保存成功","提示"); 72 | winform.parent.btnSearch(); 73 | winform.close(); 74 | } 75 | } 76 | 77 | winform.toolbar.btnSave(winform.btnSave,"保存") 78 | 79 | winform.show(); 80 | winform.load(); 81 | //win.loopMessage(); 82 | return winform; 83 | -------------------------------------------------------------------------------- /lib/carl/oracle.aardio: -------------------------------------------------------------------------------- 1 | //oracle 数据库 2 | namespace carl 3 | 4 | oracle = class { 5 | ctor( server,database,uid,pwd,port = 1521,provider="MSDAORA"){ 6 | var conn,err; 7 | try{ 8 | var connstr = "Provider=%s;data source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=%s)(PORT=%s))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=%s)));user id=%s;password=%s"; 9 | port = tostring(port); 10 | conn,err = sqlServer( connstr,provider,server,port,database,uid,pwd ); 11 | } 12 | catch(e){ 13 | err = e; 14 | } 15 | if( conn ){ 16 | this.conn = conn; 17 | }else { 18 | return null,err; 19 | } 20 | }; 21 | 22 | regetTable = function(sql,...){//重写原库getTable函数 23 | var rs,err = this.conn.openRecordSet(sql,,,...); 24 | if(!rs) error(err,2); 25 | 26 | var fields = {}; 27 | for( i=1;rs.Fields.Count ){ 28 | fields[i] = rs.Fields(i-1).Name; 29 | } 30 | 31 | var trim = string.trimright; 32 | var result = { fields = fields }; 33 | var v; 34 | while(!rs.eof){ 35 | var row = {}; 36 | for(i,name in fields){ 37 | v = rs( name ).value; 38 | if( type( v ) == "string" ) v = trim(v); 39 | elseif(..time.istime(v)){//增加时间判断 40 | v.format="%Y-%m-%d %H:%M:%S"; 41 | v = tostring(v); 42 | } 43 | row[name] = v; 44 | } 45 | 46 | table.push( result,row ); 47 | rs.movenext(); 48 | } 49 | 50 | return result; 51 | } 52 | 53 | exec = function(sql){//执行SQL或存储过程,无返回值 54 | var ok,err; 55 | try{ 56 | if( this.conn ) 57 | ok,err = this.conn.exec(sql); 58 | } 59 | catch(e){ 60 | err = e; 61 | } 62 | return ok,err; 63 | } 64 | 65 | getTable = function(sql){//执行SQL,返回table记录集 66 | var t,err; 67 | try{ 68 | if( this.conn ) 69 | t,err = this.regetTable(sql); 70 | } 71 | catch(e){ 72 | err = e; 73 | } 74 | if( type(t) != type.table ) t = null; 75 | return t,err; 76 | } 77 | 78 | getTableFirst = function(sql,...){//执行SQL,返回第一条记录 79 | var row,result,err,rs; 80 | var tp = {...} 81 | try{ 82 | if( this.conn ){ 83 | rs,err = this.conn.openRecordSet(sql,,,table.unpack(tp)); 84 | if(!rs) return; 85 | 86 | var fields = {}; 87 | for( i=1;rs.Fields.Count ){ 88 | fields[i] = rs.Fields(i-1).Name; 89 | } 90 | var trim = string.trimright; 91 | row = {}; 92 | if(!rs.eof){ 93 | var v; 94 | for(i,name in fields){ 95 | v = rs( name ).value; 96 | if( type( v ) == "string" ){ 97 | v = trim(v); 98 | } 99 | elseif(..time.istime(v)){//增加时间判断 100 | v.format="%Y-%m-%d %H:%M:%S"; 101 | v = tostring(v); 102 | } 103 | row[name] = v; 104 | } 105 | } 106 | } 107 | } 108 | catch(e){ 109 | err = e; 110 | } 111 | if( type(row) != type.table ) row = null; 112 | return row,err; 113 | } 114 | 115 | close = function(){ 116 | if( this.conn ) 117 | this.conn.close(); 118 | } 119 | } 120 | 121 | namespace oracle{ 122 | import sqlServer; 123 | import com; 124 | 125 | table = ..table; 126 | string = ..string; 127 | } 128 | 129 | /**intellisense() 130 | carl.oracle = oracle数据库 131 | carl.oracle( server,database,uid,pwd,1521,"MSDAORA") = 创建oracle数据库连接,如果blob类型出错 把最后一个参数换成 "OraOLEDB.Oracle" 132 | carl.oracle() = !oracle. 133 | !oracle.conn = 数据库连接句柄 134 | !oracle.getTable(sql) = 返回查询结果集table对像\n每个元素代表一行,每行由N个键值对列组成,键fields为列名结果集 135 | !oracle.getTableFirst(sql) = 执行SQL,返回第一条记录,空记录返回空table对像 136 | !oracle.exec(sql) = 执行sq 成功返回ture,失败返回null,err 137 | !oracle.close() = 关闭连接 138 | end intellisense**/ 139 | -------------------------------------------------------------------------------- /lib/carl/ctrl/tab.aardio: -------------------------------------------------------------------------------- 1 | //tab 选项卡扩展 2 | 3 | import win.ui.menu; 4 | namespace carl.ctrl 5 | 6 | tab = class { 7 | ctor( tabctrl ){ 8 | var mainForm = ..win.form.getForm(tabctrl.hwnd) 9 | var x,y; 10 | var menuTab = ..win.ui.popmenu(mainForm);//选项卡右键菜单 11 | menuTab.add( 12 | '关闭当前标签页', 13 | function(id){ 14 | this.closeTabForm() 15 | } 16 | ) 17 | menuTab.add( 18 | '关闭其他标签页', 19 | function(id){ 20 | this.closeTabForm(,"other") 21 | } 22 | ) 23 | menuTab.add() 24 | menuTab.add( 25 | '关闭右侧标签页', 26 | function(id){ 27 | this.closeTabForm(,"right") 28 | } 29 | ) 30 | menuTab.add( 31 | '关闭左侧标签页', 32 | function(id){ 33 | this.closeTabForm(,"left") 34 | } 35 | ) 36 | menuTab.add() 37 | menuTab.add( 38 | '关闭全部标签页', 39 | function(id){ 40 | this.closeTabForm(,"all") 41 | } 42 | ) 43 | this = tabctrl; 44 | this.tabForm = {}; 45 | this.isOpenOnlyOne = true;//一个页面只能打开一次 46 | }; 47 | 48 | exWndproc = function(hwnd,message,wParam,lParam){ 49 | if ( message == 0x207/*_WM_MBUTTONDOWN*/ or message = 0x203/*_WM_LBUTTONDBLCLK*/) { //鼠标中键点击选项卡或双击,关闭窗口 50 | x,y = ::LOWORD(lParam), ::HIWORD(lParam); 51 | this.closeTabForm(); 52 | } 53 | else if (message = 0x204/*_WM_RBUTTONDOWN*/){ //鼠标右键点击选项卡,弹出菜单 54 | x,y = ::LOWORD(lParam), ::HIWORD(lParam); 55 | var rc = ::RECT(); 56 | rc.left,rc.top = x,y; 57 | ::ClientToScreen(this.hwnd,rc); 58 | menuTab.popup(rc.left,rc.top,true);//弹出菜单 59 | } 60 | } 61 | 62 | addTabForm = function( file, title, menuId, ...){ 63 | if(!#file) return ; 64 | this.hide = false; 65 | if(this.isOpenOnlyOne){ 66 | var index = table.find(this.tabForm,file); 67 | if( index ){ 68 | this.selIndex = index; 69 | return ; 70 | } 71 | } 72 | var form,wb = this.loadForm(file); 73 | if(!form) return null,wb; 74 | form.ResName = menuId : file;//列顺序用 75 | var sel = #this.items; 76 | this.selIndex = sel; 77 | if( title ) this.setItemText(sel,title); 78 | table.push(this.tabForm,file) 79 | if( form[["loadButton"]] ) form.loadButton(menuId);//页面按钮权限 80 | if( form[["load"]] ) form.load(...);//打开时加载 81 | 82 | for(name,ctrl in form.eachControl() ){ 83 | if(string.find(ctrl.cls:"","|