commitb9e9f86d39Author: caoyanyi <caoyanyi@easycorp.ltd> Date: Fri Apr 26 13:35:56 2024 +0800 * Adjust mr actions style. commit1ddb2067b2Author: hufangzhou <hufangzhou@easycorp.ltd> Date: Fri Apr 26 13:24:05 2024 +0800 * Fix bug #48463. commit94528ed5b0Author: xieqiyu <xieqiyu@easycorp.ltd> Date: Fri Apr 26 13:17:29 2024 +0800 * Fix bug#48410. commitd1b38c54f9Author: caoyanyi <caoyanyi@easycorp.ltd> Date: Fri Apr 26 13:13:38 2024 +0800 - Remove mr repos switch block. commitc94da3e17aAuthor: sunhao <sunhao@easycorp.ltd> Date: Fri Apr 26 11:30:43 2024 +0800 * my: optimize UI of manage contacts page. commit2e74f33d22Author: 宋辰轩 <songchenxuan@easycorp.ltd> Date: Fri Apr 26 11:13:16 2024 +0800 * Fix bug #48317. commit45b6beccaeAuthor: liwenrui <liwenrui@easycorp.ltd> Date: Fri Apr 26 11:13:06 2024 +0800 * handle direct client download without selecting os. commit82be78538fAuthor: wangyuting <wangyuting@easycorp.ltd> Date: Fri Apr 26 10:43:42 2024 +0800 * Fix ipd project only one execution bug. commitfaa6c605fcAuthor: liumengyi <liumengyi@easycorp.ltd> Date: Fri Apr 26 10:42:25 2024 +0800 * Fix bug #48499, modify the icon. commit5134736779Author: xieqiyu <xieqiyu@easycorp.ltd> Date: Fri Apr 26 10:41:35 2024 +0800 * Fix bug#48167. commit5ca23cd76fAuthor: liumengyi <liumengyi@easycorp.ltd> Date: Fri Apr 26 10:30:02 2024 +0800 * Fix bug #48453. commit23cde4b38eAuthor: sunhao <sunhao@easycorp.ltd> Date: Fri Apr 26 10:19:28 2024 +0800 * tutorial: fix tutorial start modal style. commit1d710e10bdAuthor: sunhao <sunhao@easycorp.ltd> Date: Fri Apr 26 10:18:40 2024 +0800 * zin: fix batch-form style in old iframe modal. commitc9092603f0Author: liumengyi <liumengyi@easycorp.ltd> Date: Fri Apr 26 10:15:27 2024 +0800 * Fix bug #48495. commitc0aeb9f69dAuthor: sunguangming <sunguangming@easycorp.ltd> Date: Fri Apr 26 10:12:39 2024 +0800 * Fix bug #48431. commit4348fd543aAuthor: 宋辰轩 <songchenxuan@easycorp.ltd> Date: Fri Apr 26 10:11:45 2024 +0800 * Fix bug #48445. commitc9df08b1a1Author: 宋辰轩 <songchenxuan@easycorp.ltd> Date: Fri Apr 26 10:07:01 2024 +0800 * Fix bug for screen browse. commitebc469c0a4Author: wangyuting <wangyuting@easycorp.ltd> Date: Fri Apr 26 09:55:44 2024 +0800 * Adjust recentproject block css. commit9337fa109aAuthor: wangyuting <wangyuting@easycorp.ltd> Date: Fri Apr 26 09:50:34 2024 +0800 * Adjust recentproject block css. commit07903733bfAuthor: 王怡栋 <wangyidong@cnezsoft.com> Date: Fri Apr 26 09:33:39 2024 +0800 * Fix bug #48473. commita347de8354Author: wangyuting <wangyuting@easycorp.ltd> Date: Fri Apr 26 09:34:29 2024 +0800 * Add progress to recentproject block. task #116976. commite6e6c6047eAuthor: xieqiyu <xieqiyu@easycorp.ltd> Date: Fri Apr 26 09:29:12 2024 +0800 * Modify the problem of code review. commita53a577b69Author: sunguangming <sunguangming@easycorp.ltd> Date: Fri Apr 26 09:13:43 2024 +0800 * Finish task #45906. commit774cb4efbcAuthor: wangyuting <wangyuting@easycorp.ltd> Date: Fri Apr 26 09:03:42 2024 +0800 * Adjust review by me data to DAO search. commit976ef156b6Author: tianshujie <tianshujie@easycorp.ltd> Date: Fri Apr 26 09:00:51 2024 +0800 * Add class for copy project button. commit36f2c24a97Author: tianshujie <tianshujie@easycorp.ltd> Date: Fri Apr 26 09:00:39 2024 +0800 * Fix bug #48480. commitae9ef45621Author: xieqiyu <xieqiyu@easycorp.ltd> Date: Thu Apr 25 21:12:27 2024 +0800 * Optimated code. commit20eefb90dcAuthor: sunhao <sunhao@easycorp.ltd> Date: Thu Apr 25 19:42:50 2024 +0800 * zin: optimize UI for loading old pages. commit56006bca4fAuthor: sunhao <sunhao@easycorp.ltd> Date: Thu Apr 25 18:18:24 2024 +0800 * theme: update themes for old pages. commit0dd32057e4Author: liumengyi <liumengyi@easycorp.ltd> Date: Thu Apr 25 17:15:25 2024 +0800 * Modify style of productplan desc. commit272cdc4a61Author: liumengyi <liumengyi@easycorp.ltd> Date: Thu Apr 25 17:03:07 2024 +0800 * Fix bug #48413, replace executionLang with productplanLang. commit1f0b96aab2Author: tanghucheng <tanghucheng@easycorp.ltd> Date: Thu Apr 25 16:59:05 2024 +0800 * Program in the product lines can be empty. commitfb6bb48ee6Author: 宋辰轩 <songchenxuan@easycorp.ltd> Date: Thu Apr 25 17:02:29 2024 +0800 * Remove update bi guide img file. commit66bcb21455Author: liumengyi <liumengyi@easycorp.ltd> Date: Thu Apr 25 16:48:22 2024 +0800 * Fix bug #48464, set icon by project model. commitc5738c4129Author: 宋辰轩 <songchenxuan@easycorp.ltd> Date: Thu Apr 25 16:47:41 2024 +0800 * Fix bug for preview pivot. commitcc0a8aabceAuthor: hufangzhou <hufangzhou@easycorp.ltd> Date: Thu Apr 25 16:39:20 2024 +0800 + Add the or vision image. commit73d70324fdAuthor: hufangzhou <hufangzhou@easycorp.ltd> Date: Thu Apr 25 16:34:31 2024 +0800 * Change lang item. commita54780438aAuthor: liumengyi <liumengyi@easycorp.ltd> Date: Thu Apr 25 16:33:11 2024 +0800 * Modify the style of bugSteps. commitff5be095b4Author: tianshujie <tianshujie@easycorp.ltd> Date: Thu Apr 25 16:32:24 2024 +0800 * Fix bug #48453. commit0432554143Author: tianshujie <tianshujie@easycorp.ltd> Date: Thu Apr 25 16:21:52 2024 +0800 + Add comment. commit9155a82131Author: caoyanyi <caoyanyi@easycorp.ltd> Date: Thu Apr 25 16:07:55 2024 +0800 * Adjust jenkins job form style. commitdc272445cfAuthor: liumengyi <liumengyi@easycorp.ltd> Date: Thu Apr 25 15:59:31 2024 +0800 * Fix bug if the execution doesn't have the products. commit1fce0df29bAuthor: caoyanyi <caoyanyi@easycorp.ltd> Date: Thu Apr 25 15:48:41 2024 +0800 * Adjust app create tips. commita48e48394eAuthor: liumengyi <liumengyi@easycorp.ltd> Date: Thu Apr 25 15:47:09 2024 +0800 * Fix bug #48452. commitc500f9ce58Author: tianshujie <tianshujie@easycorp.ltd> Date: Thu Apr 25 15:27:17 2024 +0800 * Fix bug #48449. commit076b33652cAuthor: liumengyi <liumengyi@easycorp.ltd> Date: Thu Apr 25 15:11:57 2024 +0800 * Fix bug #48429, don't append relatedBugs to excludeBugs when linking bugs. commitbf59668dffAuthor: caoyanyi <caoyanyi@easycorp.ltd> Date: Fri Apr 19 11:22:22 2024 +0800 + Add page data for repo code view. commit91e83ce12bAuthor: caoyanyi <caoyanyi@easycorp.ltd> Date: Thu Apr 25 15:10:34 2024 +0800 * Adjust repo branch switch style. commit16147ac595Author: tianshujie <tianshujie@easycorp.ltd> Date: Thu Apr 25 15:09:44 2024 +0800 * Fix bug #48444. commitda77572ec8Author: wangyuting <wangyuting@easycorp.ltd> Date: Thu Apr 25 15:06:20 2024 +0800 * Adjust executionstatistic block burn. task #116977. commit73235c93c8Author: liumengyi <liumengyi@easycorp.ltd> Date: Thu Apr 25 15:03:45 2024 +0800 * Fix bug #48436, add ztfRun to the actions in execution::testcase. commit248b65ba6aAuthor: xieqiyu <xieqiyu@easycorp.ltd> Date: Thu Apr 25 15:02:39 2024 +0800 * Fix bug#48420. commit388f54b5ecAuthor: xieqiyu <xieqiyu@easycorp.ltd> Date: Thu Apr 25 15:01:03 2024 +0800 * Fix bug#48427. commit2c4122b084Author: liumengyi <liumengyi@easycorp.ltd> Date: Thu Apr 25 14:58:02 2024 +0800 * Fix bug #48441, keep in current tab when changing the stepsType. commitc9b094b3abAuthor: tianshujie <tianshujie@easycorp.ltd> Date: Thu Apr 25 14:58:13 2024 +0800 * Fix bug #48438. commitae10a1c686Author: liumengyi <liumengyi@easycorp.ltd> Date: Thu Apr 25 14:54:28 2024 +0800 * Fix bug #48435, replace `$this->session` with `$app->session`. commitc81031dab9Author: liumengyi <liumengyi@easycorp.ltd> Date: Thu Apr 25 14:49:42 2024 +0800 * Fix bug #48430, replace `{runID}`. commit0635779f1fAuthor: 王怡栋 <wangyidong@cnezsoft.com> Date: Thu Apr 25 14:48:58 2024 +0800 * Fix bug #48419. commit2b1358fb75Author: zhouxin <zhouxin@easycorp.ltd> Date: Thu Apr 25 14:46:08 2024 +0800 * Fix bug #47408. commitaef64e2c85Author: liumengyi <liumengyi@easycorp.ltd> Date: Thu Apr 25 14:45:30 2024 +0800 * Fix bug #48423, replace `<br />` with `<p></p>`. commit392a031495Author: tianshujie <tianshujie@easycorp.ltd> Date: Thu Apr 25 14:41:55 2024 +0800 * Show the product line when the program is not selected. commit1449ea4d06Author: tanghucheng <tanghucheng@easycorp.ltd> Date: Thu Apr 25 14:41:09 2024 +0800 * Fix bug #116431. commit9ce8dfe3eeAuthor: tianshujie <tianshujie@easycorp.ltd> Date: Thu Apr 25 14:31:03 2024 +0800 * Fix bug #48433. commit62a8779806Author: sunguangming <sunguangming@easycorp.ltd> Date: Thu Apr 25 14:28:56 2024 +0800 * Add loadProductModules function. commit8ec4efde62Author: liumengyi <liumengyi@easycorp.ltd> Date: Thu Apr 25 14:27:36 2024 +0800 * Add return type. commit035f15b16eAuthor: sunhao <sunhao@easycorp.ltd> Date: Thu Apr 25 14:21:50 2024 +0800 * disable loading effect on loading modal with same url. commit1b7aac3f6fAuthor: zhouxin <zhouxin@easycorp.ltd> Date: Thu Apr 25 14:19:34 2024 +0800 * Fix bug #47654. commit730ab12d86Author: sunhao <sunhao@easycorp.ltd> Date: Thu Apr 25 13:59:51 2024 +0800 * zin: add favicon to base page. commite7051b2d2fAuthor: liumengyi <liumengyi@easycorp.ltd> Date: Thu Apr 25 13:58:51 2024 +0800 * Fix bug #48421, removes duplicate projects. commit3089e95041Author: liumengyi <liumengyi@easycorp.ltd> Date: Thu Apr 25 13:43:47 2024 +0800 * Fix bug #48176. commit1409059467Author: tianshujie <tianshujie@easycorp.ltd> Date: Thu Apr 25 13:41:20 2024 +0800 * Fix bug #48418. commit6934f36b9eAuthor: zhouxin <zhouxin@easycorp.ltd> Date: Thu Apr 25 13:35:10 2024 +0800 * Remove useless method. commit908f7dd087Author: wangyuting <wangyuting@easycorp.ltd> Date: Thu Apr 25 13:30:56 2024 +0800 * Adjust teamachievement block css. task #116978. commitabb2d04bd0Author: zhouxin <zhouxin@easycorp.ltd> Date: Thu Apr 25 13:25:53 2024 +0800 * Optimize code. commit042726dd6aAuthor: tanghucheng <tanghucheng@easycorp.ltd> Date: Thu Apr 25 11:16:45 2024 +0800 * Fix bug #48143, Add $config->story->dtable->fieldList['roadmap']['width']. commitb3b3a4884bAuthor: tanghucheng <tanghucheng@easycorp.ltd> Date: Thu Apr 25 11:00:11 2024 +0800 * Fix bug #48415. commitb2878c8644Author: liumengyi <liumengyi@easycorp.ltd> Date: Thu Apr 25 10:59:32 2024 +0800 - Remove `var_dump`. commitb8e22a5446Author: liumengyi <liumengyi@easycorp.ltd> Date: Thu Apr 25 10:59:02 2024 +0800 * Optimize code for uploading files. commit328cf2c605Author: tianshujie <tianshujie@easycorp.ltd> Date: Thu Apr 25 10:57:27 2024 +0800 - Remove unused style. commit98f501ad66Author: sunhao <sunhao@easycorp.ltd> Date: Thu Apr 25 10:57:18 2024 +0800 * zui: update zui3 lib. commit138ae9b7bbAuthor: caoyanyi <caoyanyi@easycorp.ltd> Date: Thu Apr 25 10:55:12 2024 +0800 * Adjust repo page language. commit2a4abbde8dAuthor: 宋辰轩 <songchenxuan@easycorp.ltd> Date: Thu Apr 25 10:24:32 2024 +0800 * Fix bug #48350. commitc2c122b678Author: wangyuting <wangyuting@easycorp.ltd> Date: Thu Apr 25 10:22:08 2024 +0800 * Adjust welcome block css. task #116979. commit1cba83c80fAuthor: sunhao <sunhao@easycorp.ltd> Date: Thu Apr 25 10:21:24 2024 +0800 * kanban: optimize label style. commita92ca103b9Author: tianshujie <tianshujie@easycorp.ltd> Date: Thu Apr 25 10:18:16 2024 +0800 * Fix bug #48402. commitdecae20945Author: tianshujie <tianshujie@easycorp.ltd> Date: Thu Apr 25 10:11:24 2024 +0800 * Adjust select execution title style. commit8fc680ecc9Author: 宋辰轩 <songchenxuan@easycorp.ltd> Date: Thu Apr 25 10:03:04 2024 +0800 * Add delete file. commit0c08073647Author: tianshujie <tianshujie@easycorp.ltd> Date: Thu Apr 25 09:39:41 2024 +0800 * The date field was not validated when fixing the bug import task. commitb6aa30da6fAuthor: liyang <liyang@easycorp.ltd> Date: Thu Apr 25 09:41:02 2024 +0800 Add delete btn in import repo page. commit188bdfff90Author: liyang <liyang@easycorp.ltd> Date: Thu Apr 25 09:30:58 2024 +0800 Hide the hidden function of the imported code library page commit22e899b21fAuthor: sunguangming <sunguangming@easycorp.ltd> Date: Thu Apr 25 09:26:39 2024 +0800 * Fix bug #48372. commitdea8d5785aAuthor: tianshujie <tianshujie@easycorp.ltd> Date: Thu Apr 25 09:25:57 2024 +0800 * Remove the box when it is out of focus. commit94117eac4aAuthor: liumengyi <liumengyi@easycorp.ltd> Date: Thu Apr 25 09:21:31 2024 +0800 * Modify testtask's order in qastatistic block. commit16558b955dAuthor: 宋辰轩 <songchenxuan@easycorp.ltd> Date: Thu Apr 25 09:18:46 2024 +0800 * Use ajaxGetOldDropMenu commiteb7f606fe5Author: hufangzhou <hufangzhou@easycorp.ltd> Date: Thu Apr 25 09:07:24 2024 +0800 * Add todo-calendar privilege to or interface. commit119fef4faeAuthor: wangyuting <wangyuting@easycorp.ltd> Date: Thu Apr 25 09:06:33 2024 +0800 * Adjust closedSetting to closeSetting. commit1179f36595Author: tanghucheng <tanghucheng@easycorp.ltd> Date: Thu Apr 25 08:58:31 2024 +0800 * Fix bug #47758, unset percent when disabled. commitb143356a55Author: sunguangming <sunguangming@easycorp.ltd> Date: Thu Apr 25 08:56:35 2024 +0800 * Fix bug #48379. commite1ec138058Author: liumengyi <liumengyi@easycorp.ltd> Date: Thu Apr 25 08:52:51 2024 +0800 * Optimize code for bug #48271. commit8ca008736aAuthor: liwenrui <liwenrui@easycorp.ltd> Date: Thu Apr 25 08:49:31 2024 +0800 * tweak again, actually only wanted to add padding to the top. commit388006b340Author: liwenrui <liwenrui@easycorp.ltd> Date: Thu Apr 25 08:49:05 2024 +0800 * tweak zeneditor to add some padding back. commit0e0121b201Author: liwenrui <liwenrui@easycorp.ltd> Date: Thu Apr 25 08:27:23 2024 +0800 * update zeneditor and remove paragraph margin within. commit5e3b42a9f3Author: sunhao <sunhao@easycorp.ltd> Date: Wed Apr 24 17:32:20 2024 +0800 * zui: update zui3 lib. commit3e543c1403Author: wangyuting <wangyuting@easycorp.ltd> Date: Wed Apr 24 17:30:35 2024 +0800 * Optimize code. commitce8e34849dAuthor: wangyuting <wangyuting@easycorp.ltd> Date: Wed Apr 24 17:29:17 2024 +0800 * Fix project menu bug. bug #48121. commitbff8da8abaAuthor: sunhao <sunhao@easycorp.ltd> Date: Wed Apr 24 17:20:38 2024 +0800 * zin: sort fields after reload form. commit01e15f6635Author: liumengyi <liumengyi@easycorp.ltd> Date: Wed Apr 24 16:53:10 2024 +0800 * Fix bug #46381. commitb89caabfceAuthor: hufangzhou <hufangzhou@easycorp.ltd> Date: Wed Apr 24 16:53:21 2024 +0800 * Adjust the default filename for export execution. commit17d5d65a17Author: liumengyi <liumengyi@easycorp.ltd> Date: Wed Apr 24 16:47:28 2024 +0800 * Fix bug #48367, get linked bugs. commit3ee2f3ea5cAuthor: 宋辰轩 <songchenxuan@easycorp.ltd> Date: Wed Apr 24 16:45:43 2024 +0800 * Fix bug for preview pivot menu. commit2c00f9a657Author: xieqiyu <xieqiyu@easycorp.ltd> Date: Wed Apr 24 16:29:25 2024 +0800 * Fix bug#48334. commit484e24fd9dAuthor: liumengyi <liumengyi@easycorp.ltd> Date: Wed Apr 24 16:24:24 2024 +0800 * Fix bug #48343. commit1aa110645cAuthor: liwenrui <liwenrui@easycorp.ltd> Date: Wed Apr 24 16:01:19 2024 +0800 * fix ai prompt menu injected multiple times, bug #48358. commita2333979b5Author: zhouxin <zhouxin@easycorp.ltd> Date: Wed Apr 24 15:59:09 2024 +0800 * Fix height of project deviation pivot. commit7a3b20222fAuthor: liumengyi <liumengyi@easycorp.ltd> Date: Wed Apr 24 15:54:16 2024 +0800 * Replace runID in testcase::browse. commitab05d56301Author: tianshujie <tianshujie@easycorp.ltd> Date: Wed Apr 24 15:45:01 2024 +0800 * No iterative project hides execution column. commitdffcd9e5c7Author: sunguangming <sunguangming@easycorp.ltd> Date: Wed Apr 24 15:46:18 2024 +0800 * Fix sql error. commit22d89bb361Author: xieqiyu <xieqiyu@easycorp.ltd> Date: Wed Apr 24 15:43:11 2024 +0800 * Fix bug#48349. commit603195b1e1Author: tianshujie <tianshujie@easycorp.ltd> Date: Wed Apr 24 15:41:27 2024 +0800 * Adjust execution column style of the build list. commit989f2b8ca5Author: liumengyi <liumengyi@easycorp.ltd> Date: Wed Apr 24 15:27:01 2024 +0800 * Fix bug #48344, set runID. commit2db2a7f9dcAuthor: caoyanyi <caoyanyi@easycorp.ltd> Date: Wed Apr 24 15:25:54 2024 +0800 - Remove gitfox for 20.0. commit3a1f824210Author: xieqiyu <xieqiyu@easycorp.ltd> Date: Wed Apr 24 15:24:46 2024 +0800 * Fix bug#48351. commitaf0b038283Author: tianshujie <tianshujie@easycorp.ltd> Date: Wed Apr 24 15:14:43 2024 +0800 * Fix bug #48348. commitd4dc98d604Author: tanghucheng <tanghucheng@easycorp.ltd> Date: Wed Apr 24 15:13:00 2024 +0800 * Fix bug #48140, Enabled child stage for ipd project. commit08e0f83941Author: tianshujie <tianshujie@easycorp.ltd> Date: Wed Apr 24 15:07:36 2024 +0800 * Adjust height of the batchcreate stakeholder page. commit8e1dfa7634Author: tianshujie <tianshujie@easycorp.ltd> Date: Wed Apr 24 14:58:29 2024 +0800 * Fix bug #48345. commit0562ebb542Author: sunguangming <sunguangming@easycorp.ltd> Date: Wed Apr 24 14:55:42 2024 +0800 * Add story pairs to search form. commit2c062163a5Author: tanghucheng <tanghucheng@easycorp.ltd> Date: Wed Apr 24 14:40:10 2024 +0800 * Fix bug #48314. commitb812069307Author: qixinzhi <qixinzhi@easycorp.ltd> Date: Wed Apr 24 06:38:51 2024 +0000 * Auto column width with cell max value length. commitf9c1a3e850Author: qixinzhi <qixinzhi@easycorp.ltd> Date: Wed Apr 24 06:38:04 2024 +0000 * Delete screen 3 scheme. commit3ffa92734fAuthor: hufangzhou <hufangzhou@easycorp.ltd> Date: Wed Apr 24 14:35:14 2024 +0800 * Fix bug #48239. commit99e1864ca8Author: liumengyi <liumengyi@easycorp.ltd> Date: Wed Apr 24 14:30:08 2024 +0800 * Fix bug #46381. commit81c3ebaa0aAuthor: caoyanyi <caoyanyi@easycorp.ltd> Date: Wed Apr 24 14:28:26 2024 +0800 + Add time fliter for commit search. commit14d5bf7cf0Author: caoyanyi <caoyanyi@easycorp.ltd> Date: Wed Apr 24 09:34:53 2024 +0800 * Adjust repo create page linkage. commit6880ef70afAuthor: liumengyi <liumengyi@easycorp.ltd> Date: Wed Apr 24 14:22:28 2024 +0800 * Replace `->size` with `set::width` and `set::height` in echarts. commitb4ea64832aAuthor: caoyanyi <caoyanyi@easycorp.ltd> Date: Wed Apr 24 14:15:13 2024 +0800 * Adjust job view repo name. commit8168c98ba8Author: tianshujie <tianshujie@easycorp.ltd> Date: Wed Apr 24 14:13:53 2024 +0800 * Fix bug #48262. commitd480ef87bdAuthor: liumengyi <liumengyi@easycorp.ltd> Date: Wed Apr 24 13:51:05 2024 +0800 * Fix bug #48025, modify id. commit003a73d5cbAuthor: liumengyi <liumengyi@easycorp.ltd> Date: Wed Apr 24 13:49:12 2024 +0800 * Fix bug #48025, modify id. commit3ad257eb53Author: daitingting <daitingting@xirangit.com> Date: Wed Apr 24 05:43:53 2024 +0000 * Fix bug #48261. commit77e6744f1dAuthor: tianshujie <tianshujie@easycorp.ltd> Date: Wed Apr 24 13:42:13 2024 +0800 * Fix bug #48294. commitf10b3f5710Author: tianshujie <tianshujie@easycorp.ltd> Date: Wed Apr 24 13:36:01 2024 +0800 * Reset code. commit068f97bc38Author: liumengyi <liumengyi@easycorp.ltd> Date: Wed Apr 24 13:18:34 2024 +0800 * Fix bug #48308, set control of stage. commit078d566703Author: wangyuting <wangyuting@easycorp.ltd> Date: Wed Apr 24 13:18:41 2024 +0800 * Adjust edit feedback data toggle. commit34738e42d9Author: zhouxin <zhouxin@easycorp.ltd> Date: Wed Apr 24 13:13:29 2024 +0800 * Adjust lang. commiteddba468d0Author: liumengyi <liumengyi@easycorp.ltd> Date: Wed Apr 24 13:07:40 2024 +0800 * Fix bug #48310. commitfc673b76ceAuthor: liumengyi <liumengyi@easycorp.ltd> Date: Wed Apr 24 11:26:49 2024 +0800 * Fix bug #48310. commit7840c1ab35Author: sunguangming <sunguangming@easycorp.ltd> Date: Wed Apr 24 11:24:40 2024 +0800 * Remove dm driver from convert date. commitd47e91c07eAuthor: hufangzhou <hufangzhou@easycorp.ltd> Date: Wed Apr 24 11:20:10 2024 +0800 * Fix bug #48293. commitd475b63a74Author: daitingting <daitingting@xirangit.com> Date: Wed Apr 24 03:16:57 2024 +0000 * Fix bug #48261. commit655cc652beAuthor: 王怡栋 <wangyidong@cnezsoft.com> Date: Wed Apr 24 11:14:54 2024 +0800 * Fix bug for select usage when install. commit425fade713Author: tianshujie <tianshujie@easycorp.ltd> Date: Wed Apr 24 11:14:19 2024 +0800 * Fix bug #48303. commit723797107bAuthor: tianshujie <tianshujie@easycorp.ltd> Date: Wed Apr 24 11:09:27 2024 +0800 * Fix bug #48303. commit6740a4c699Author: tianshujie <tianshujie@easycorp.ltd> Date: Wed Apr 24 11:06:32 2024 +0800 * Fix bug #48306. commitc42f7ad83eAuthor: zhouxin <zhouxin@easycorp.ltd> Date: Wed Apr 24 11:02:21 2024 +0800 * Fix bug #48073. commite38f2f6531Author: liumengyi <liumengyi@easycorp.ltd> Date: Wed Apr 24 10:42:42 2024 +0800 * Set search form open. commit2cb511cf52Author: 王怡栋 <wangyidong@cnezsoft.com> Date: Wed Apr 24 10:07:43 2024 +0800 * Fix error for sso module. commitf8b093e0ebAuthor: xieqiyu <xieqiyu@easycorp.ltd> Date: Wed Apr 24 10:21:37 2024 +0800 * Fix the bug of duration and BSA default value. commitc3e9c7d7cdAuthor: liumengyi <liumengyi@easycorp.ltd> Date: Wed Apr 24 10:20:25 2024 +0800 * Fix bug #48243. commitc7cf68be63Author: hufangzhou <hufangzhou@easycorp.ltd> Date: Wed Apr 24 10:17:03 2024 +0800 * Fix bug #48280, #48289. commitb9cdcf5bcdAuthor: sunhao <sunhao@easycorp.ltd> Date: Wed Apr 24 10:17:34 2024 +0800 * my: fix cannot update badges in main navbar. commit3aa9609ce2Author: tianshujie <tianshujie@easycorp.ltd> Date: Wed Apr 24 10:16:21 2024 +0800 * Fix bug #48294. commitfb26e627deAuthor: sunhao <sunhao@easycorp.ltd> Date: Wed Apr 24 10:10:56 2024 +0800 Revert "* zin: fix cannot find page method on update." This reverts commit367a4ae49d. commit63a70421edAuthor: tianshujie <tianshujie@easycorp.ltd> Date: Wed Apr 24 09:45:07 2024 +0800 * Fix bug #48271. commitc1a66b708bAuthor: sunguangming <sunguangming@easycorp.ltd> Date: Wed Apr 24 09:40:09 2024 +0800 * Modify upgrade method. commitc68b2170f9Author: 王怡栋 <wangyidong@cnezsoft.com> Date: Wed Apr 24 09:18:09 2024 +0800 * Fix for sso login from zdoo. commit580b4f170fAuthor: liumengyi <liumengyi@easycorp.ltd> Date: Wed Apr 24 09:30:37 2024 +0800 * Fix bug #48272, update program's consumed, left and progress. commit1d9791a55eAuthor: 王怡栋 <wangyidong@cnezsoft.com> Date: Tue Apr 23 17:27:07 2024 +0800 * Remove useless code. commit40f0e10c1fAuthor: caoyanyi <caoyanyi@easycorp.ltd> Date: Tue Apr 23 17:18:03 2024 +0800 * Update standard sql. # Conflicts: # db/update20.0.beta2.sql # module/block/config/feedback.php # module/block/zen.php # module/custom/lang/vi.php # module/mr/ui/browsebyexecution.html.php # module/repo/lang/de.php # module/repo/lang/en.php # module/repo/lang/fr.php # module/repo/lang/zh-cn.php # module/space/lang/de.php # module/space/lang/en.php # module/space/lang/fr.php # module/space/lang/zh-cn.php # module/space/ui/createapplication.html.php # www/js/zui3/zen-editor/index.esm.js # www/js/zui3/zen-editor/p-0aaccc7e.js # www/js/zui3/zen-editor/p-276dd30f.js # www/js/zui3/zen-editor/p-2b13cc9a.js # www/js/zui3/zen-editor/p-38d18c5d.js # www/js/zui3/zen-editor/p-3f6cad83.js # www/js/zui3/zen-editor/p-51e3a048.js # www/js/zui3/zen-editor/p-617d463f.js # www/js/zui3/zen-editor/p-62c0132e.js # www/js/zui3/zen-editor/p-6d22490c.js # www/js/zui3/zen-editor/p-a563f50b.js # www/js/zui3/zen-editor/p-bf31230c.js # www/js/zui3/zen-editor/p-c6c95773.js # www/js/zui3/zen-editor/p-d83dd3f0.js # www/js/zui3/zen-editor/p-d8bedd14.js # www/js/zui3/zen-editor/p-eaaa4129.js # www/js/zui3/zen-editor/zen-editor.esm.js
449 lines
13 KiB
PHP
449 lines
13 KiB
PHP
<?php
|
|
declare(strict_types=1);
|
|
/**
|
|
* The model file of backup module of ZenTaoCMS.
|
|
*
|
|
* @copyright Copyright 2009-2023 禅道软件(青岛)有限公司(ZenTao Software (Qingdao) Co., Ltd. www.cnezsoft.com)
|
|
* @license ZPL(http://zpl.pub/page/zplv12.html) or AGPL(https://www.gnu.org/licenses/agpl-3.0.en.html)
|
|
* @author Yidong Wang <yidong@cnezsoft.com>
|
|
* @package backup
|
|
* @version $Id$
|
|
* @link https://www.zentao.net
|
|
*/
|
|
class backupModel extends model
|
|
{
|
|
/**
|
|
* Backup SQL.
|
|
*
|
|
* @param string $backupFile
|
|
* @access public
|
|
* @return object
|
|
*/
|
|
public function backSQL(string $backupFile): object
|
|
{
|
|
$zdb = $this->app->loadClass('zdb');
|
|
return $zdb->dump($backupFile);
|
|
}
|
|
|
|
/**
|
|
* Backup file.
|
|
*
|
|
* @param string $backupFile
|
|
* @access public
|
|
* @return object
|
|
*/
|
|
public function backFile(string $backupFile): object
|
|
{
|
|
$zfile = $this->app->loadClass('zfile');
|
|
|
|
$return = new stdclass();
|
|
$return->result = true;
|
|
$return->error = '';
|
|
|
|
if(!is_dir($backupFile)) mkdir($backupFile, 0777, true);
|
|
|
|
$tmpLogFile = $this->getTmpLogFile($backupFile);
|
|
$dataDir = $this->app->getAppRoot() . 'www/data/';
|
|
$count = $zfile->getCount($dataDir, array('course'));
|
|
file_put_contents($tmpLogFile, json_encode(array('allCount' => $count)));
|
|
|
|
$result = $zfile->copyDir($dataDir, $backupFile, $logLevel = false, $tmpLogFile, array('course'));
|
|
$this->processSummary($backupFile, $result['count'], $result['size'], $result['errorFiles'], $count);
|
|
unlink($tmpLogFile);
|
|
|
|
return $return;
|
|
}
|
|
|
|
/**
|
|
* Backup code.
|
|
*
|
|
* @param string $backupFile
|
|
* @access public
|
|
* @return object
|
|
*/
|
|
public function backCode(string $backupFile): object
|
|
{
|
|
$zfile = $this->app->loadClass('zfile');
|
|
$return = new stdclass();
|
|
$return->result = true;
|
|
$return->error = '';
|
|
|
|
$tmpLogFile = $this->getTmpLogFile($backupFile);
|
|
$appRoot = $this->app->getAppRoot();
|
|
$fileList = glob($appRoot . '*');
|
|
$wwwFileList = glob($appRoot . 'www/*');
|
|
|
|
$tmpFile = array_search($appRoot . 'tmp', $fileList);
|
|
$wwwFile = array_search($appRoot . 'www', $fileList);
|
|
$dataFile = array_search($appRoot . 'www/data', $wwwFileList);
|
|
unset($fileList[$tmpFile]);
|
|
unset($fileList[$wwwFile]);
|
|
unset($wwwFileList[$dataFile]);
|
|
|
|
$fileList = array_merge($fileList, $wwwFileList);
|
|
|
|
if(!is_dir($backupFile)) mkdir($backupFile, 0777, true);
|
|
|
|
$allCount = 0;
|
|
foreach($fileList as $codeFile) $allCount += $zfile->getCount($codeFile);
|
|
file_put_contents($tmpLogFile, json_encode(array('allCount' => $allCount)));
|
|
|
|
$copiedCount = 0;
|
|
$copiedSize = 0;
|
|
$errorFiles = array();
|
|
foreach($fileList as $codeFile)
|
|
{
|
|
$file = trim(str_replace($appRoot, '', $codeFile), DS);
|
|
if(is_dir($codeFile))
|
|
{
|
|
if(!is_dir($backupFile . DS . $file)) mkdir($backupFile . DS . $file, 0777, true);
|
|
$result = $zfile->copyDir($codeFile, $backupFile . DS . $file, $logLevel = false, $tmpLogFile);
|
|
$copiedCount += $result['count'];
|
|
$copiedSize += $result['size'];
|
|
$errorFiles += $result['errorFiles'];
|
|
}
|
|
else
|
|
{
|
|
$dirName = dirname($file);
|
|
if(!is_dir($backupFile . DS . $dirName)) mkdir($backupFile . DS . $dirName, 0777, true);
|
|
if($zfile->copyFile($codeFile, $backupFile . DS . $file))
|
|
{
|
|
$copiedCount += 1;
|
|
$copiedSize += filesize($codeFile);
|
|
}
|
|
else
|
|
{
|
|
$errorFiles[] = $codeFile;
|
|
}
|
|
}
|
|
}
|
|
|
|
$this->processSummary($backupFile, $copiedCount, $copiedSize, $errorFiles, $allCount);
|
|
unlink($tmpLogFile);
|
|
|
|
return $return;
|
|
}
|
|
|
|
/**
|
|
* Restore SQL.
|
|
*
|
|
* @param string $backupFile
|
|
* @access public
|
|
* @return object
|
|
*/
|
|
public function restoreSQL(string $backupFile): object
|
|
{
|
|
$zdb = $this->app->loadClass('zdb');
|
|
$allTables = $zdb->getAllTables();
|
|
foreach($allTables as $tableName => $tableType)
|
|
{
|
|
try
|
|
{
|
|
$this->dbh->query("DROP $tableType IF EXISTS `$tableName`");
|
|
}
|
|
catch(PDOException $e){}
|
|
}
|
|
|
|
return $zdb->import($backupFile);
|
|
}
|
|
|
|
/**
|
|
* Restore File.
|
|
*
|
|
* @param string $backupFile
|
|
* @access public
|
|
* @return object
|
|
*/
|
|
public function restoreFile(string $backupFile): object
|
|
{
|
|
$return = new stdclass();
|
|
$return->result = true;
|
|
$return->error = '';
|
|
|
|
if(is_file($backupFile))
|
|
{
|
|
$oldDir = getcwd();
|
|
chdir($this->app->getTmpRoot());
|
|
$this->app->loadClass('pclzip', true);
|
|
$zip = new pclzip($backupFile);
|
|
if($zip->extract(PCLZIP_OPT_PATH, $this->app->getAppRoot() . 'www/data/', PCLZIP_OPT_TEMP_FILE_ON) == 0)
|
|
{
|
|
$return->result = false;
|
|
$return->error = $zip->errorInfo();
|
|
}
|
|
chdir($oldDir);
|
|
}
|
|
elseif(is_dir($backupFile))
|
|
{
|
|
$zfile = $this->app->loadClass('zfile');
|
|
$zfile->copyDir($backupFile, $this->app->getAppRoot() . 'www/data/', $showDetails = false);
|
|
}
|
|
|
|
return $return;
|
|
}
|
|
|
|
/**
|
|
* Add file header.
|
|
*
|
|
* @param string $fileName
|
|
* @access public
|
|
* @return bool
|
|
*/
|
|
public function addFileHeader(string $fileName): bool
|
|
{
|
|
$die = "<?php die();?" . ">\n";
|
|
$tmpFile = $fileName . '.tmp';
|
|
rename($fileName, $tmpFile);
|
|
|
|
file_put_contents($fileName, $die);
|
|
$fh = fopen($tmpFile, 'r');
|
|
$length = 2 * 1024 * 1024;
|
|
while(!feof($fh))
|
|
{
|
|
$buff = fread($fh, $length);
|
|
file_put_contents($fileName, $buff, FILE_APPEND);
|
|
}
|
|
fclose($fh);
|
|
unlink($tmpFile);
|
|
|
|
return true;
|
|
}
|
|
|
|
/**
|
|
* Remove file header.
|
|
*
|
|
* @param string $fileName
|
|
* @access public
|
|
* @return bool
|
|
*/
|
|
public function removeFileHeader(string $fileName): bool
|
|
{
|
|
$tmpFile = $fileName . '.tmp';
|
|
$fh = fopen($fileName, 'r');
|
|
$length = 2 * 1024 * 1024;
|
|
$readedFirstLine = false;
|
|
while(!feof($fh))
|
|
{
|
|
if(!$readedFirstLine)
|
|
{
|
|
fgets($fh);
|
|
$readedFirstLine = true;
|
|
continue;
|
|
}
|
|
|
|
$buff = fread($fh, $length);
|
|
file_put_contents($tmpFile, $buff, FILE_APPEND);
|
|
}
|
|
fclose($fh);
|
|
rename($tmpFile, $fileName);
|
|
|
|
return true;
|
|
}
|
|
|
|
/**
|
|
* Get dir size.
|
|
*
|
|
* @param string $backup
|
|
* @access public
|
|
* @return array
|
|
*/
|
|
public function getBackupSummary(string $backup): array
|
|
{
|
|
$zfile = $this->app->loadClass('zfile');
|
|
if(is_file($backup))
|
|
{
|
|
$summary = array();
|
|
$summary['allCount'] = 1;
|
|
$summary['count'] = 1;
|
|
$summary['size'] = $zfile->getFileSize($backup);
|
|
|
|
return $summary;
|
|
}
|
|
|
|
$summaryFile = dirname($backup) . DS . 'summary';
|
|
if(!file_exists($summaryFile)) return array();
|
|
|
|
$summary = json_decode(file_get_contents(dirname($backup) . DS . 'summary'), true);
|
|
return zget($summary, basename($backup), array());
|
|
}
|
|
|
|
/**
|
|
* Get backup path.
|
|
*
|
|
* @access public
|
|
* @return string
|
|
*/
|
|
public function getBackupPath(): string
|
|
{
|
|
$backupPath = empty($this->config->backup->settingDir) ? $this->app->getTmpRoot() . 'backup' . DS : $this->config->backup->settingDir;
|
|
return rtrim(str_replace(DS, '/', $backupPath), '/') . '/';
|
|
}
|
|
|
|
/**
|
|
* Get backup file.
|
|
*
|
|
* @param string $name
|
|
* @param string $type sql|file|code
|
|
* @access public
|
|
* @return string|false
|
|
*/
|
|
public function getBackupFile(string $name, string $type): string|false
|
|
{
|
|
$backupPath = $this->getBackupPath();
|
|
if($type == 'sql')
|
|
{
|
|
if(file_exists($backupPath . $name . ".{$type}")) return $backupPath . $name . ".{$type}";
|
|
if(file_exists($backupPath . $name . ".{$type}.php")) return $backupPath . $name . ".{$type}.php";
|
|
}
|
|
else
|
|
{
|
|
if(file_exists($backupPath . $name . ".{$type}")) return $backupPath . $name . ".{$type}";
|
|
if(file_exists($backupPath . $name . ".{$type}.zip")) return $backupPath . $name . ".{$type}.zip";
|
|
if(file_exists($backupPath . $name . ".{$type}.zip.php")) return $backupPath . $name . ".{$type}.zip.php";
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* Get tmp log file.
|
|
*
|
|
* @param string $backupFile
|
|
* @access public
|
|
* @return string
|
|
*/
|
|
public function getTmpLogFile(string $backupFile): string
|
|
{
|
|
return $backupFile . '.tmp.summary';
|
|
}
|
|
|
|
/**
|
|
* Get backup dir progress.
|
|
*
|
|
* @param string $backup
|
|
* @access public
|
|
* @return array
|
|
*/
|
|
public function getBackupDirProgress(string $backup): array
|
|
{
|
|
$tmpLogFile = $this->getTmpLogFile($backup);
|
|
if(file_exists($tmpLogFile))
|
|
{
|
|
$log = json_decode(file_get_contents($tmpLogFile), true);
|
|
return empty($log) ? array() : $log;
|
|
}
|
|
return array('allCount' => 0, 'count' => 0);
|
|
}
|
|
|
|
/**
|
|
* Process filesize.
|
|
*
|
|
* @param int $fileSize
|
|
* @access public
|
|
* @return string
|
|
*/
|
|
public function processFileSize(int $fileSize): string
|
|
{
|
|
$bit = 'KB';
|
|
$fileSize = round($fileSize / 1024, 2);
|
|
if($fileSize >= 1024)
|
|
{
|
|
$bit = 'MB';
|
|
$fileSize = round($fileSize / 1024, 2);
|
|
}
|
|
if($fileSize >= 1024)
|
|
{
|
|
$bit = 'GB';
|
|
$fileSize = round($fileSize / 1024, 2);
|
|
}
|
|
|
|
return $fileSize . $bit;
|
|
}
|
|
|
|
/**
|
|
* Process backup summary.
|
|
*
|
|
* @param string $file
|
|
* @param int $count
|
|
* @param int $size
|
|
* @param array $errorFiles
|
|
* @param int $allCount
|
|
* @param string $action add|delete
|
|
* @access public
|
|
* @return bool
|
|
*/
|
|
public function processSummary(string $file, int $count, int $size, array $errorFiles = array(), int $allCount = 0, string $action = 'add'): bool
|
|
{
|
|
$backupPath = dirname($file);
|
|
$fileName = basename($file);
|
|
|
|
$summaryFile = $backupPath . DS . 'summary';
|
|
if(!file_exists($summaryFile) and !touch($summaryFile)) return false;
|
|
|
|
$summary = json_decode(file_get_contents($summaryFile), true);
|
|
if(empty($summary)) $summary = array();
|
|
|
|
if($action == 'add')
|
|
{
|
|
$summary[$fileName]['allCount'] = $allCount;
|
|
$summary[$fileName]['errorFiles'] = $errorFiles;
|
|
$summary[$fileName]['count'] = $count;
|
|
$summary[$fileName]['size'] = $size;
|
|
}
|
|
else
|
|
{
|
|
unset($summary[$fileName]);
|
|
}
|
|
|
|
if(file_put_contents($summaryFile, json_encode($summary))) return true;
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* Get disk space.
|
|
*
|
|
* @param string $backupPath
|
|
* @access public
|
|
* @return string
|
|
*/
|
|
public function getDiskSpace(string $backupPath): string
|
|
{
|
|
$nofile = strpos($this->config->backup->setting, 'nofile') !== false;
|
|
$diskFreeSpace = disk_free_space($backupPath);
|
|
$backFileSize = 0;
|
|
|
|
if(!$nofile)
|
|
{
|
|
$appRoot = $this->app->getAppRoot();
|
|
$appRootSize = $this->getDirSize($appRoot);
|
|
$backFileSize = $appRootSize - $this->getDirSize($appRoot . 'tmp') - $this->getDirSize($appRoot . 'www/data/course');
|
|
}
|
|
|
|
$backSqlSize = $this->dao->select('sum(data_length+index_length) as size')
|
|
->from('information_schema.tables')
|
|
->where('TABLE_SCHEMA')->eq($this->config->db->name)
|
|
->groupBy('TABLE_SCHEMA')
|
|
->fetch('size');
|
|
|
|
return $diskFreeSpace . ',' . ($backFileSize + $backSqlSize);
|
|
}
|
|
|
|
/**
|
|
* Get directory size.
|
|
*
|
|
* @param string $dir
|
|
* @access public
|
|
* @return int
|
|
*/
|
|
public function getDirSize(string $dir): int
|
|
{
|
|
if(!file_exists($dir)) return 0;
|
|
if(!is_readable($dir)) return 0;
|
|
$totalSize = 0;
|
|
$iterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($dir, RecursiveDirectoryIterator::SKIP_DOTS), RecursiveIteratorIterator::LEAVES_ONLY, RecursiveIteratorIterator::CATCH_GET_CHILD);
|
|
|
|
foreach($iterator as $file) $totalSize += $file->getSize();
|
|
return $totalSize;
|
|
}
|
|
}
|