版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、這一天將講述一個(gè)基本的基于數(shù)據(jù)庫(kù)的權(quán)限管理系統(tǒng)的設(shè)計(jì),在這一天的課程的最后將講述“左右值無(wú)限分類(lèi)實(shí)現(xiàn)算法”如何來(lái)優(yōu)化“系統(tǒng)菜單”的結(jié)構(gòu)而告終。今天的內(nèi)容和前幾天的基礎(chǔ)框架是一樣的它們都屬于基礎(chǔ)知識(shí),在這些基礎(chǔ)知識(shí)上還可以擴(kuò)展出無(wú)數(shù)的變種與進(jìn)化設(shè)計(jì)。二、先來(lái)看客戶(hù)的一個(gè)需求2.1 用戶(hù)實(shí)際需求1. 所有的用戶(hù)、角色可動(dòng)態(tài)配置2. 所有的系統(tǒng)菜單的權(quán)限要求具體到“增,刪,改、查、打印、導(dǎo)出”這樣的小權(quán)限的設(shè)計(jì)3.
2、 所有的權(quán)限基于角色來(lái)進(jìn)行劃分和判斷4. 一個(gè)用戶(hù)可能屬于多個(gè)角色5. 系統(tǒng)菜單也能夠動(dòng)態(tài)的“增、刪、改、查”2.2 系統(tǒng)權(quán)限菜單樣例三、基于數(shù)據(jù)庫(kù)的系統(tǒng)權(quán)限表設(shè)計(jì)3.1 ER(Entity Relationship)圖圍繞上述需求,我們可以在數(shù)據(jù)庫(kù)內(nèi)進(jìn)行如下的表設(shè)計(jì),下面直接給出ER圖:3.2 表關(guān)系詳解上述設(shè)計(jì)有6張表,其中:T_User表用于存放用戶(hù)信息,此處只存放基礎(chǔ)
3、信息T_Role表用于存放系統(tǒng)角色信息T_User_Role表用于存放系統(tǒng)用戶(hù)與角色的匹配關(guān)系T_Sys_Menu表這張就是用于存放系統(tǒng)菜單的表了,這張表的設(shè)計(jì)主要使用了如下的表設(shè)計(jì)技巧:注意這邊的MENU_ID與MENU_PID如果這個(gè)菜單項(xiàng)是一級(jí)菜單,那么我們把它的MENU_PID設(shè)為0如果這個(gè)菜單是另一個(gè)菜單的子菜單,那么我們就把它的MENU_PID設(shè)為它的父菜單的MENU_ID。有了這樣的結(jié)構(gòu),我們一個(gè)遞歸就能把這顆“樹(shù)”顯示出來(lái)了,是不是?此處以O(shè)racle數(shù)據(jù)庫(kù)為例,不使用遞歸,直接把樹(shù)形結(jié)構(gòu)在數(shù)據(jù)庫(kù)中就造型造好(當(dāng)然,還有更好的方法如:有人喜歡設(shè)level或者是deep這樣的字段
4、來(lái)簡(jiǎn)化程序解析樹(shù)型結(jié)構(gòu)菜單,稍后我們會(huì)來(lái)講一個(gè)根本不需要用遞歸的樹(shù)型菜單的設(shè)計(jì)來(lái)最大程度優(yōu)化設(shè)計(jì)。)顯示整顆樹(shù)型菜單結(jié)構(gòu)的Oracle語(yǔ)句: SELECT *FROM T_SYS_MENUSTARTWITH MENU_PID=0CONNECTBYPRIOR MENU_ID=MENU_PIDorderby MENU_ID上述語(yǔ)句,已經(jīng)用數(shù)據(jù)查詢(xún)用句就將我們的這個(gè)“樹(shù)”的層次關(guān)系理出來(lái)了,如果我們手上有一個(gè)控件叫dtree.js,那么一個(gè)循環(huán)就可以把這個(gè)樹(shù)顯示出來(lái)了,不是嗎?來(lái)看dtree.js的應(yīng)用/公式: d.add(menu_id, menu_pid, menudescr, me
5、nu_url);d = new dTree('d'); d.add(0,-1,'菜單'); d.add(1,0,'報(bào)表查詢(xún)
6、9;,'example01.html'); d.add(2,1,'月報(bào)','example01.html'); d.ad
7、d(3,1,'季報(bào)','example01.html'); d.add(4,1,'年報(bào)','example01.html'); &
8、#160; d.add(5,0,'系統(tǒng)管理','example01.html'); d.add(6,5,'用戶(hù)管理','example01.html');
9、; d.add(7,6,'新增用戶(hù)','example01.html'); d.add(8,6,'刪除用戶(hù)','example01.html');
10、160; d.add(9,5,'角色管理','example01.html'); d.add(10,9,'新增角色','example01.html');
11、; d.add(11,9,'刪除角色','example01.html') document.write(d);大家看上面,這個(gè)是dtree.js插件,一個(gè)專(zhuān)門(mén)用于生成樹(shù)的js插件的使用方法,那么如果我們附以上述的sql語(yǔ)句在數(shù)據(jù)庫(kù)中把數(shù)據(jù)選出來(lái)后,是不是只要一個(gè)循環(huán)就可以給這個(gè)
12、dtree.js插件顯示了,不是嗎?我們?nèi)绻幌腼@示整顆樹(shù)只想顯示如:只顯示系統(tǒng)管理菜單有其下列所有的子菜單,那么我們的Oracle中的Sql應(yīng)該怎么寫(xiě)呢?經(jīng)查“系統(tǒng)管理”這個(gè)菜單的MENU_ID=105,于是我們的Sql語(yǔ)句如下:SELECT *FROM T_SYS_MENUSTARTWITH MENU_ID='105'CONNECTBYPRIOR MENU_ID=MENU_PIDorderby MENU_ID對(duì)吧?很簡(jiǎn)單哈!T_Privilege表用于存放系統(tǒng)每個(gè)菜單的詳細(xì)子權(quán)限如“增,刪,改,查”T_Menu_Privilege表這張表就是我們的最終終結(jié)大BOSS表,它里
13、面是一個(gè)完整的系統(tǒng)權(quán)限與角色關(guān)系間的對(duì)應(yīng)。比如說(shuō):我們想要知道“user”這個(gè)角色,可以操作哪些菜單,哪些權(quán)限,那么我們的SQL語(yǔ)句如下:selectdistinct m.menu_id,m.menu_descr,m.menu_url,m.menu_pid,p.privilege_id,p.privilege_type fromt_menu_privilege mp,t_sys_menu m,t_privilege p,t_user_role rwheremp.privilege_id=p.privilege_idand mp.role_id=r.role_idand mp.menu
14、_id=m.menu_idand r.role_id='user'orderby m.menu_id通過(guò)這個(gè)結(jié)果我們就知道了1. 角色“user”能操作哪些菜單2. 角色“user”對(duì)某個(gè)菜單具有什么樣的權(quán)限 進(jìn)而,我們可以推出:我們想要知道Danzel這個(gè)人,可以操作哪些菜單,以及在哪些菜單上有哪些可供操作的權(quán)限,我們使用如下的SQL語(yǔ)句:selectdistinct m.menu_id,m.menu_d
15、escr,m.menu_url,m.menu_pid,p.privilege_id,p.privilege_type fromt_menu_privilege mp,t_sys_menu m,t_privilege p,t_user_role rwheremp.privilege_id=p.privilege_idand mp.role_id=r.role_idand mp.menu_id=m.menu_idand r.user_id='Danzel'orderby m.menu_id;通過(guò)這個(gè)結(jié)果我們就知道了1.
16、60; Danzel這個(gè)人能操作哪些菜單2. Danzel對(duì)某個(gè)菜單具有什么樣的權(quán)限3.3 界面制作關(guān)于jsp,什么dao層,service層的具體代碼這個(gè)就不講了,這個(gè)沒(méi)有意義的哦,我們來(lái)講設(shè)計(jì)。登錄后如何顯示左邊的樹(shù)型菜單:ü 取得用戶(hù)名ü 將該用戶(hù)名作為參數(shù)input進(jìn)如下的SQL語(yǔ)句得到該用戶(hù)在登錄后可以看到的系統(tǒng)菜單:selectdistinct m.menu_id, m.menu_descr, m.menu_ur
17、l, m.menu_pidfromt_menu_privilege mp,t_sys_menu m,t_privilege p,t_user_role rwheremp.privilege_id=p.privilege_idand mp.role_id=r.role_idand mp.menu_id=m.menu_idand r.user_id='Danzel'STARTWITH MENU_PID='0'CONNECTBYPRIOR M.MENU_ID=M.MENU_PIDorderby M.MENU_ID將該結(jié)果直接給于index.jsp頁(yè)面上的dtree.j
18、s組件,一個(gè)循環(huán),所有菜單曾樹(shù)形顯示。知道用戶(hù)登錄后能夠?qū)δ男┎藛?,并且在相關(guān)界面操作時(shí)有哪些子權(quán)限如:增、刪、改、查、打印、報(bào)表的設(shè)計(jì):ü 在登錄時(shí)得到用戶(hù)名等信息,然后將該用戶(hù)名作為參數(shù)input進(jìn)入如下的sql語(yǔ)句:selectdistinct m.menu_id,m.menu_descr,m.menu_url,m.menu_pid,p.privilege_id,p.privilege_type fromt_menu_privilege mp,t_sys_menu m,t_privilege p,t_user_role rwheremp.pri
19、vilege_id=p.privilege_idand mp.role_id=r.role_idand mp.menu_id=m.menu_idand r.user_id='Danzel'orderby m.menu_id;ü 得到上述結(jié)果后,使用:Haspmap<String menuId, List menuList>這樣的結(jié)構(gòu)將該用戶(hù)所屬的角色分對(duì)每個(gè)菜單有哪些操作(增、刪、改、查、打印、報(bào)表)進(jìn)行存儲(chǔ),放入用戶(hù)的session中,在 以后用戶(hù)在每個(gè)界面進(jìn)行點(diǎn)擊動(dòng)作時(shí)進(jìn)行判斷,或者可以寫(xiě)個(gè)filter來(lái)進(jìn)行判斷,是不是就可以作到
20、:知道該登錄用戶(hù)在登錄后可以對(duì)哪些菜單進(jìn)行操作,并且擁有什么操作權(quán)限啦? 相應(yīng)的我們還需要制作如下的界面:ü 用戶(hù)的管理界面ü 角色的管理界面ü 用戶(hù)與角色的分配界面ü 系統(tǒng)菜單的管理界面ü 具體權(quán)限項(xiàng)的管理界面ü 系統(tǒng)菜單與角色間具體的權(quán)限分配界面好了,有了這些界面,一個(gè)完整的基于數(shù)據(jù)庫(kù)引擎的權(quán)限系統(tǒng)算是完成了。嚴(yán)重注意:在制作“系統(tǒng)菜單與角色間具體的權(quán)限分配界面”時(shí),如果在界面上
21、把某個(gè)角色對(duì)該條菜單的“查看”這個(gè)選項(xiàng)disable后,那么該角色將不擁有任何該菜單的所有權(quán)限,舉例:某角色對(duì)菜單A擁有如下權(quán)限:增、刪、改、打印但是這個(gè)“查看”權(quán)限沒(méi)有,也有可能是管理員誤操作,但是從真實(shí)情況我們來(lái)說(shuō),這個(gè)角色連“查看”的權(quán)限都沒(méi)有,連菜單都進(jìn)不了,他能做什么“增、刪、改。”等其它的操作???操作個(gè)頭啊!是吧?所以一旦界面上該角色對(duì)某個(gè)系統(tǒng)菜單沒(méi)有了查看權(quán)限后,它對(duì)這個(gè)菜單的其它權(quán)限也必須從T_MENU_PRIVILEGE這個(gè)表中刪除。四、改進(jìn)T_SYSTEM_MENU表的設(shè)計(jì)前面我們用的是Oracle特有的遞歸SQL將樹(shù)形菜單在從數(shù)據(jù)庫(kù)中選取出來(lái)時(shí)就已經(jīng)是一顆樹(shù)的結(jié)構(gòu)了,但是
22、像MYSQL,SQL SERVER, DB2等可能不帶有這樣的特SQL,那就需我們自己動(dòng)手去寫(xiě)遞歸,還有就是很多工程用的是jquery的tree或者是其它相關(guān)的ajax tree,這些tree都需要用到一個(gè)字段叫l(wèi)evel(此處指深度、層次的意思),如果按照原來(lái)的表結(jié)構(gòu),要取得這個(gè)level,恐怕是要寫(xiě)遞歸算法 了。就算有些數(shù)據(jù)庫(kù)有類(lèi)似的語(yǔ)句,那也需要你去修改你的SQL語(yǔ)句從未影響了性能與通用性。我們?cè)谶@邊說(shuō),我們無(wú)論什么數(shù)據(jù)庫(kù),如果都用相同的SQL就能把我們需要的東西在數(shù)據(jù)庫(kù)中就排好樹(shù)形結(jié)構(gòu)然后一次性選取出來(lái),那應(yīng)該有多好啊。答案 是有的,在原來(lái)的T_SYSTEM_MENU表中改動(dòng)也不大,只
23、需要增加兩個(gè)字段即可,即:lft與rgt(left, right),這種設(shè)計(jì)其實(shí)已經(jīng)有了,我在此只不過(guò)結(jié)合實(shí)際例子把它應(yīng)用到實(shí)際上,并且進(jìn)一步詳細(xì)描述如果來(lái)實(shí)現(xiàn)它,它就是被稱(chēng)為:左右值無(wú)限分類(lèi)實(shí)現(xiàn)算法也稱(chēng)為預(yù)排序遍歷樹(shù)算法,對(duì)于這種層次型數(shù)據(jù)(Hierarchical Data)一般我們有兩種設(shè)計(jì)方法:ü 毗鄰目錄模式(adjacencylist model)ü 預(yù)排序遍歷樹(shù)算法(modifiedpreorder tree traversal algorithm)4.1 基于lft, rgt的無(wú)限分類(lèi)算法我們來(lái)看一個(gè)圖,下面我
24、們把我們?cè)械牟藛萎?huà)成下面這樣的層次關(guān)系:我們把原有的系統(tǒng)菜單畫(huà)成了一個(gè)個(gè)的橢圓,最外層的就是我們的菜單,然后在每個(gè)橢園的兩個(gè)端點(diǎn)即left與right,按照從左->右,開(kāi)始用數(shù)字來(lái)標(biāo)號(hào),上面這個(gè)圖中可以看到最外層這個(gè)大橢園的lft(左)為1,它的rgt(右)為24。那么我們可以用一條標(biāo)準(zhǔn)的SQL,而非什么數(shù)據(jù)庫(kù)自帶的特有的、特殊的SQL來(lái)顯示出這個(gè)樹(shù)形菜單,來(lái)看下面的SQL:SELECT node.menu_id menuId, node.me
25、nu_descr menuDescr, node.lft, node.rgt, node.menu_url menuUrl, (COUNT(parent.menu_id)-1) menuLevel, node.menu_pid pidFRO
26、M t_sys_menu node, t_sys_menu parentWHERE node.lftBETWEEN parent.lftAND parent.rgt AND node.menu_descr!='菜單'GROUPBY node.menu_id,node.menu_descr,node.lft,node.rgt,node.menu
27、_url,node.menu_pidORDERBY node.lft來(lái)看顯示的結(jié)果看看上面這個(gè)結(jié)果,怎么樣?ü 樹(shù)形結(jié)構(gòu)也有了(可以用于dtree來(lái)顯示);ü 層次level也有了(可以用于ajax的一些tree);ü 我們用的SQL又是最標(biāo)準(zhǔn)的所有的數(shù)據(jù)庫(kù)都能用到的SQL;嘗到甜頭了是吧?那我們下面來(lái)看如何對(duì)這樣的基于t, rgt的數(shù)據(jù)結(jié)構(gòu)來(lái)作插入操作?4.2 如何在現(xiàn)有節(jié)點(diǎn)中插入新的子節(jié)點(diǎn)如果現(xiàn)在我們要在“報(bào)表查詢(xún)”這個(gè)圓里加入一個(gè)菜單,假設(shè)我們就叫“周報(bào)”,那么再來(lái)看這個(gè)原有的圖發(fā)生了什
28、么樣的改變,來(lái)看:看到么,原有的最外層橢園的rgt+2,原有的報(bào)表查詢(xún)這個(gè)園的右邊界呢?是不是也加了2啊?而原有的“月報(bào)”這個(gè)圓的lft加了多少?也是+2!那么來(lái)看“周報(bào)”這個(gè)圓的lft與rgt關(guān)系:“周報(bào)”的lft= “報(bào)表查詢(xún)”這個(gè)圓的lft+1“周報(bào)”的rgt=“報(bào)表查詢(xún)”這個(gè)圓的lft+2于是我們就可以整理出在原有葉子中插入child的公式:第一步:選取要被插入new child的外面這個(gè)圓的lft的值第二步:原有的數(shù)據(jù)中所有的rgt如果>第一步中得到的lft的值,那么全部+2第三步:原有的數(shù)據(jù)中所有的lft如果>第一步中得到的lft的值,那么全部+2第四步:將插入的節(jié)點(diǎn)的
29、lft與rgt的設(shè)計(jì),新節(jié)點(diǎn)的lft =第一步中的lft+1,新節(jié)點(diǎn)的rgt=第一步中的lft+2來(lái)看一個(gè)具體的例子:我們要在“報(bào)表查詢(xún)”即menu_id=101 中插入一個(gè)新的菜單,叫“周報(bào)”,下面是按照上面四步算法的相關(guān)SQL語(yǔ)句: 第一步SELECT lftFROM t_sys_menuwhere menu_id='101'這一步我們得到的值為:2第二步:UPDATE t_sys_menuSET rgt = rgt +2WHERE rgt >2;第三步:UPDA
30、TE t_sys_menuSET lft = lft +2WHERE lft >2;第四步:INSERTINTO t_sys_menu(menu_id, menu_descr, menu_url, lft, rgt)VALUES('113','周報(bào)','周報(bào)的url', (2+1), (2 +2);插完后我們運(yùn)行查詢(xún)SQL:SELECT node.menu_id menuId, node.menu_
31、descr menuDescr, node.lft, node.rgt, node.menu_url menuUrl, (COUNT(parent.menu_id)-1) menuLevel, node.menu_pid pidFROM t
32、_sys_menu node, t_sys_menu parentWHERE node.lft BETWEEN parent.lft AND parent.rgt AND node.menu_descr!='菜單'GROUPBY node.menu_id,node.menu_descr,node.lft,node.rgt,node.menu
33、_url,node.menu_pidORDERBY node.lftLook, 數(shù)據(jù)正確無(wú)誤,我們來(lái)看整個(gè)t_sys_menu表里的數(shù)據(jù):Look,整個(gè)最外層的“圓”,右邊界增加了2,從原有的24變成了26。1.3 如何插入一個(gè)新的節(jié)點(diǎn)上面講的是在原有的節(jié)點(diǎn)中插入一個(gè)子節(jié)點(diǎn),現(xiàn)在來(lái)講,如何插入一個(gè)新的節(jié)點(diǎn),比如說(shuō):我們現(xiàn)在有:報(bào)表查詢(xún),系統(tǒng)管理兩大菜單,我們還想加一個(gè)菜單:保單審核,怎么來(lái)做?我們把4.2節(jié)中“如何在現(xiàn)有節(jié)點(diǎn)中插入新的子節(jié)點(diǎn)”里四步公式,稍稍改動(dòng)一下第一步:選取要被插入新的節(jié)點(diǎn)左邊節(jié)點(diǎn)的rgt的值第二步:原有的數(shù)據(jù)中所有的rgt如
34、果>第一步中得到的rgt的值,那么全部+2第三步:原有的數(shù)據(jù)中所有的lft如果>第一步中得到的rgt的值,那么全部+2第四步:將插入的節(jié)點(diǎn)的lft與rgt的設(shè)計(jì),新節(jié)點(diǎn)的lft =第一步中的rgt+1,新節(jié)點(diǎn)的rgt=第一步中的rgt+2下面來(lái)看我們?cè)凇皥?bào)表查詢(xún)”與“系統(tǒng)管理”中間,插入一個(gè)菜單叫“保單審核”。第一步SELECT rgtFROM t_sys_menuwhere menu_id='101'這一步我們得到的值為:11第二步:UPDATE t_sys_menuSET rgt = rgt +2WHERE rgt >11;第三步:UPDATE t_sys
35、_menuSET lft = lft +2WHERE lft >11;第四步:INSERTINTO t_sys_menu(menu_id, menu_descr, menu_url, lft, rgt)VALUES('114','保單審核','', (11+1), (11 +2); 運(yùn)行下面的SQL語(yǔ)句我們來(lái)檢查一下插入的效果:SELECT &
36、#160; node.menu_id menuId, node.menu_descr menuDescr, &
37、#160; node.lft, node.rgt, node.menu_url menuUrl,
38、 (COUNT(parent.menu_id)-1) menuLevel, node.menu_pid pid FROM t_sys_menu node, &
39、#160; t_sys_menu parent WHERE node.lftBETWEEN parent.lftAND parent.rgt &
40、#160; AND node.menu_descr!='菜單' GROUPBY node.menu_id,node.menu_descr,node.lft,node.rgt,node.menu_url,node.menu_pid
41、60; ORDERBY node.lft怎么樣,結(jié)果對(duì)了吧,呵呵!看看整個(gè)菜單的右邊界吧,從原來(lái)的26變成了28了,是不是哦?1.3 如何刪除一個(gè)節(jié)點(diǎn)來(lái)看公式第一步:選取要被刪除的菜單的lft的值,rgt的值,以及寬度(width=rgt-lft+1);第二步:刪除所有的位于第一步中得到的lft與rgt之間的節(jié)點(diǎn);第三步:將所有的右邊界大于第一步中得到的rgt的所有節(jié)點(diǎn)的rgt的值減去第一步中得到的width第四步:將所有的左邊界大于第一步中得到的rgt的所有節(jié)點(diǎn)的lft的值減去第一步中得到的width來(lái)看實(shí)際例子,我們有
42、下面這樣的數(shù)據(jù):我們想將menu_id=114的保單審核刪除,當(dāng)然,這是一個(gè)父節(jié)點(diǎn),如果把它刪了,其子節(jié)點(diǎn)115即手工審核也必須被一起刪除,要不然它就成為臟數(shù)據(jù)了是不是?套用上述四步公式:第一步:SELECT lft, rgt, (rgt - lft +1) widthFROM t_sys_menuWHERE menu_id ='114'第二步:DELETEFROM t_sys_menuWHERE lftBETWEEN12AND15第三步:UPDATE t_sys_menuSET rgt = rgt -4WHERE rgt >15第四部:UPDATE t_sys_menu
43、SET lft = lft -4WHERE lft >15全部步驟完成后,我們來(lái)運(yùn)行檢驗(yàn)的SQL:SELECT node.menu_id menuId, node.menu_descr menuDescr, node.lft
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年地方政府與木材廠(chǎng)關(guān)于租地使用權(quán)轉(zhuǎn)讓的詳細(xì)合同
- 2024衛(wèi)星遙感影像在農(nóng)業(yè)領(lǐng)域的應(yīng)用合同
- 2024年度害蟲(chóng)控制合同書(shū)
- 2024帶有期權(quán)的地塊租賃合同
- 2024年度“踐行社會(huì)主義核心價(jià)值觀(guān)”主題教育活動(dòng)合同
- 2024地鐵施工空閑用地租賃合同
- 2024年度云計(jì)算服務(wù)API接口使用合同
- 2024年度中小企業(yè)發(fā)展貸款合同
- 2024年原材料長(zhǎng)期供應(yīng)與采購(gòu)合同
- 2024年企業(yè)數(shù)據(jù)存儲(chǔ)與安全服務(wù)合同
- 2022年北京市公務(wù)員錄用考試《行測(cè)》真題及答案解析
- 江蘇省泰興市2024-2025學(xué)年高三上學(xué)期期中考試語(yǔ)文試題(含答案)
- 家長(zhǎng)會(huì)教學(xué)課件
- 律師事務(wù)所律師事務(wù)所風(fēng)險(xiǎn)管理手冊(cè)
- 2024年消防宣傳月知識(shí)競(jìng)賽考試題庫(kù)500題(含答案)
- 2024年典型事故案例警示教育手冊(cè)15例
- 高一歷史(中外歷史綱要上冊(cè))期中測(cè)試卷及答案
- 20K607 防排煙及暖通防火設(shè)計(jì)審查與安裝
- 一氧化碳中毒培訓(xùn)課件
- 教案(餐巾折花)
評(píng)論
0/150
提交評(píng)論