2019-04-19 DAY6
前端到后端的一趟
先是在index。js里import一個(gè)/file的文件內(nèi)容,再在下面concat加上一個(gè)filerouter。---可以從index。js里找到file在哪。然后/file里有各種功能,比如/add和/delete??梢苑謩e路由到某個(gè)vue頁面。再寫一下vue頁面,很簡(jiǎn)單的就可以,就是一個(gè)form表單.
form表單 action到后端的controller。
比如/filecontroller里面,寫/upload的接口。具體實(shí)現(xiàn)寫在???看一下項(xiàng)目里怎么寫的。圖片上上傳到服務(wù)器,再到文件服務(wù)器,返回一個(gè)url地址。 vue頁面上顯示的這個(gè)圖片url就是到這個(gè)服務(wù)器端的地址。 一般之后會(huì)加到數(shù)據(jù)庫(kù)里面去,就是圖片的id,name,url.
還有一般 /add。/select可以返回一個(gè)apiresult〈user〉泛型。
這樣在swagger 里就可以看到他的很多信息。 dynamicbean就是一個(gè)動(dòng)態(tài)的返回map?很多信息返回不了。
返回一個(gè)常量,以后就可以只改一個(gè)常量的值,不用每個(gè)地方都改。
用戶,角色,權(quán)限的關(guān)系
1個(gè)用戶可以有多個(gè)角色,一個(gè)角色可以有多個(gè)權(quán)限。
一般是,把權(quán)限(就是模塊)給角色,再把角色給用戶。
一個(gè)用戶就有所有用的角色都權(quán)限了。
....實(shí)際操作起來和想象中不太一樣。。。。。好困
下午了...........................
admin\src\main\java\com\lh\controller\FileUploadController.java
@Controller
@RequestMapping("fileupload")
public class FileUploadController {
@Value("${aliyun.oss-endpoint}")
String endpoint;
@Value("${aliyun.oss-access-key-id}")
String accessKeyId;
@Value("${aliyun.oss-access-key-secret}")
String accessKeySecret;
@Value("${aliyun.oss-bucket-name}")
String bucketName;
@Value("${aliyun.oss-cname}")
String ossCname;
private static OSS ossClient;
/**
* 獲取sts臨時(shí)授權(quán)
*
* @param
* @return
*/
@RequestMapping(value = "upload")
@ResponseBody
public ApiResult upload(HttpServletRequest req) {
FileUtil fileUtil = new FileUtil();
File file = fileUtil.getUploadFile(req);
if (ossClient == null) {
ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
}
String key = "images/" + DateUtil.format("yyyyMMdd") + "/" + UUID.randomUUID().toString().replaceAll("-", "");
String fileName = file.getName();
String fileType = fileName.contains(".") ? fileName.substring(fileName.lastIndexOf(".") + 1) : "";
if (StringUtil.hasLength(fileType)) {
key = key + "." + fileType;
}
//System.out.println(key);
ossClient.putObject(bucketName, key, file);
ApiResult apiResult = ApiResult.build(200, "上傳成功", "http://" + ossCname + "/" + key);
file.delete();
//ossClient.shutdown();
return apiResult;
}
}

先貼一完整代碼 ↑↑





阿里云-對(duì)象存儲(chǔ)服務(wù)OSS-JAVA簡(jiǎn)單上傳
文件上傳
以下代碼用于上傳本地文件:
要有:endpoint;accesskeyid;accesskeysecret;再創(chuàng)建一個(gè)osslicent的實(shí)例,再putObject方法,就可以上傳到服務(wù)器。到時(shí)候再存到數(shù)據(jù)庫(kù)里去。
// Endpoint以杭州為例,其它Region請(qǐng)按實(shí)際情況填寫。
String endpoint = "http://oss-cn-hangzhou.aliyuncs.com";
// 阿里云主賬號(hào)AccessKey擁有所有API的訪問權(quán)限,風(fēng)險(xiǎn)很高。強(qiáng)烈建議您創(chuàng)建 并使用RAM賬號(hào)進(jìn)行API訪問或日常運(yùn)維,請(qǐng)登錄 https://ram.console.aliyun.com 創(chuàng)建RAM賬號(hào)。
String accessKeyId = "<yourAccessKeyId>";
String accessKeySecret = "<yourAccessKeySecret>";
// 創(chuàng)建OSSClient實(shí)例。
OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);
// 上傳文件。<yourLocalFile>由本地文件路徑加文件名包括后綴組成,例 如/users/local/myfile.txt。
ossClient.putObject("<yourBucketName>", "<yourObjectName>", new File("<yourLocalFile>"));
// 關(guān)閉OSSClient。
ossClient.shutdown();
2019-04-22 DAY7
一開始一直點(diǎn)不出來方法。。是因?yàn)闆]有定義成public的。。
mapper.xml可以不用寫,用這種方式:



當(dāng)然service中要先定義這個(gè)mapper

2019-04-23 DAY8
今天有點(diǎn)懵懵的。。。。因?yàn)関ue不會(huì)
剛剛一直登陸不進(jìn)去,一開始說找不到一個(gè)bean,然后我寫了整個(gè)類名,然后說resultmap,發(fā)現(xiàn)用resulttype就進(jìn)去了?。。。?!因?yàn)槲覜]有定義resultmap
2019-04-23 DAY8
迷茫,不會(huì)vue,前后端分離不會(huì)寫。打算看一下vue.js
老大幫我把bug都改好了。恩!我得學(xué)一下vue了

2019-04-24 DAY9
vue.js學(xué)習(xí)(一):
在html中用{{}}傳值,里面可以是data中的key值(屬性)或者是methods中的方法名(帶括號(hào),可以傳值)
vue中,當(dāng)前對(duì)象的data中的key值用this.key在methods中傳值。
image.png
image.png


屬性綁定:v-bind綁在標(biāo)簽的屬性值上,v-html可以放在標(biāo)簽的中間就是p標(biāo)簽的中間加了一個(gè)websitetag的值就是一個(gè)a標(biāo)簽。
image.png
image.png


關(guān)于方法給不給括號(hào):如果在{{}中要給括號(hào),不然以為是屬性值,綁定事件上可以不給括號(hào)。
image.png

v-on:和@是一樣的,一般用@比較方便
image.png

阻止事件冒泡事件;.once只執(zhí)行一次:
image.png
image.png


鍵盤事件:可以指定按那兩個(gè)鍵才觸發(fā)方法
image.png

雙向綁定:先在input中加個(gè)ref的屬性給個(gè)名字,再在vue中用this.$refs.name.value拿到input傳過來的值!
image.png
image.png


雙向綁定用v-model更方便!vue的data中要有name屬性,如果屬性有值,name一開始{{name}}就能顯示值
image.png

計(jì)算屬性:大量耗時(shí)的時(shí)候使用,點(diǎn)擊一個(gè)觸發(fā)一個(gè),不像methods,點(diǎn)一個(gè),觸發(fā)全部。在{{}}中寫方法名的時(shí)候不能加()
image.png
image.png


v-if:v-else-if兩個(gè)只會(huì)顯示一個(gè)。
image.png
image.png


v-show和v-if的區(qū)別:v-show在標(biāo)簽中是存在的,只是display是不是none顯不顯示,而v-if不是。
image.png

v-for循環(huán)拿到數(shù)組中的每個(gè)元素值:
image.png
image.png
可以只拿到name和age不會(huì)有格式
image.png




用template標(biāo)簽不會(huì)像div那樣創(chuàng)建很多的div,他只會(huì)有一個(gè)。
image.png

component組件:template模板里面只能有一個(gè)根標(biāo)簽,不可用全局的變量,不然一個(gè)改了全改了。
結(jié)構(gòu)是這樣的
在html中,只要?jiǎng)?chuàng)建一個(gè)<greeting></greeting>標(biāo)簽就行了~!



執(zhí)行順序:component中是注冊(cè)app.vue這個(gè)組件。
先html,再main.js再app.vue

vue的結(jié)構(gòu):分三個(gè)部分
image.png

vue中調(diào)用別的組件。要在component中注冊(cè)
先import進(jìn)來,然后在components中注冊(cè),最后在template標(biāo)簽下使用。
image.png


局部組件的構(gòu)建:
image.png
這樣也可以


用了scoped,樣式就不會(huì)影響到別的關(guān)聯(lián)的vue了
image.png

父組件向子組件傳值,屬性傳值props:
image.png
我覺得都寫同名就好了
這樣寫更嚴(yán)謹(jǐn)



傳值和傳引用:
傳值,只變一個(gè),傳引用,全變

子組件向父組件傳值:
子組件中的點(diǎn)擊事件
觸發(fā)這個(gè)方法,注冊(cè)的事件名字是titlechanged,參數(shù)是后面那個(gè)“”里的
接著去他的父組件里找
找到這個(gè)事件,他要執(zhí)行這個(gè)update的方法,參數(shù)是一個(gè)事件
在方法里改變內(nèi)容
這里的title就是方法中的參數(shù)穿過來的





生命周期鉤子:
image.png

router-link不會(huì)重新加載頁面,而a標(biāo)簽會(huì)
image.png

2019-04-26 DAY10
vue.js學(xué)習(xí)(二):
components中的模塊名字如果是駝峰的,可以不加引號(hào),如果不是,就要加引號(hào),而且不能和已存在的標(biāo)簽重復(fù)。
非駝峰命名
注意上面的標(biāo)簽名都是app-heade


路由配置:
image.png


路由跳轉(zhuǎn)不進(jìn)行刷新,用view-view,不用a標(biāo)簽。(a標(biāo)簽會(huì)刷新一次)
因?yàn)橛卸鄠€(gè)頁面都在這一塊區(qū)域顯示,所以用這個(gè)標(biāo)簽



如果url輸入錯(cuò)誤可以用這個(gè)方式
跳轉(zhuǎn)到home

給路由起名字:
image.png
在這里使用,注意to前面的冒號(hào)是綁定的意思


實(shí)現(xiàn)跳轉(zhuǎn):
image.png
好幾種方式


二級(jí)路由
寫在about的children里面



默認(rèn)展示:用redirect
image.png
點(diǎn)到關(guān)于我們,自動(dòng)展示某個(gè)vue


全局守衛(wèi):就是在沒有登錄前不能看其他頁面
image.png

后置鉤子,組件內(nèi)守衛(wèi)(一般不怎么用,用的多是全局守衛(wèi))
就是說,進(jìn)入到這個(gè)組件之后會(huì)怎么樣

路由獨(dú)享的守衛(wèi)
兩種方式,第二種是全局守衛(wèi)復(fù)制過來的。就是要進(jìn)入這個(gè)組件之前的守衛(wèi)。next():進(jìn)入這個(gè)組件,有flase參數(shù)就又進(jìn)不去了

異步;beforeRouterEnter和beforeRouterLeave
beforeRouterEnter、就是進(jìn)入組件之前


復(fù)用router-view
image.png
就展示了一個(gè)組件:HOME
也展示其他組件用components,加一個(gè)default,一進(jìn)去就展示的組件,全部,不是只有Home
結(jié)果




路由步驟:
routes.js
import進(jìn)來
image.png
就是下面那個(gè)components里的組件可以用router-view跳轉(zhuǎn)
加入history、可以去掉#,很好





添加header組件,放到app.vue里面,實(shí)現(xiàn)點(diǎn)哪個(gè)跳那個(gè)
image.png
image.png
效果



2019-04-28 DAY11
axios全局配置:
image.png
image.png


全局配置 或者:
image.png
image.png


Java中交互方式分為同步和異步兩種,異同情況如下:
同步交互:指發(fā)送一個(gè)請(qǐng)求,需要等待返回,然后才能夠發(fā)送下一個(gè)請(qǐng)求,有個(gè)等待過程;
異步交互:指發(fā)送一個(gè)請(qǐng)求,不需要等待返回,隨時(shí)可以再發(fā)送下一個(gè)請(qǐng)求,即不需要等待。
區(qū)別:一個(gè)需要等待,一個(gè)不需要等待,在部分情況下,我們的項(xiàng)目開發(fā)中都會(huì)優(yōu)先選擇不需要等待的異步交互方式。
async的用法,它作為一個(gè)關(guān)鍵字放到函數(shù)前面,用于表示函數(shù)是一個(gè)異步函數(shù),因?yàn)閍sync就是異步的意思, 異步函數(shù)也就意味著該函數(shù)的執(zhí)行不會(huì)阻塞后面代碼的執(zhí)行。
await是等待的意思,那么它等待什么呢,它后面跟著什么呢?其實(shí)它后面可以放任何表達(dá)式,不過我們更多的是放一個(gè)返回promise 對(duì)象的表達(dá)式。注意await 關(guān)鍵字只能放到async 函數(shù)里面


2019-04-29 DAY12
新的一天,從報(bào)錯(cuò)開始

新的任務(wù):做一個(gè)項(xiàng)目管理的增刪查改,要有樹形目錄。
IMG_20190429_155215.jpg

2019-05-07 DAY13
這一天真的很累,完成了后端的基本內(nèi)容,vue的樹形怎么都不會(huì)寫。
2019-05-09 DAY14
然后電腦又壞了。剛剛?cè)フ伊死洗?,解決了一些問題。
1、前端沒有顯示添加的模塊,但是輸入接口能跳轉(zhuǎn)。是因?yàn)闆]有配置模塊里和到角色的權(quán)限里面。。
2、對(duì)于數(shù)據(jù)庫(kù)的設(shè)計(jì)問題,id應(yīng)該設(shè)置為自增長(zhǎng),number要計(jì)算。


因?yàn)楦讣?jí)目錄到時(shí)候肯定不止這么兩個(gè)。,應(yīng)該放在刪除,下載,按鈕旁邊。無論在哪個(gè)文檔下面都可以添加子文檔。
4、樹形結(jié)構(gòu)的設(shè)計(jì),后端再寫一個(gè)接口,接受parentId,返回list。就是說接收到parentID為0,就是第一層。
................下午了........
腦子很亂,讓我來理一下。
目前遇到的問題:
1、下載的接口寫不好,不能從給的url地址下載下來文件。
2、上傳文件的前端不知道怎么寫,用他給的uploadfilebutton返回的url是個(gè)很詭異的地址,有80多k。
3、怎么把這一條數(shù)據(jù)的id傳給這一條數(shù)據(jù)的按鈕跳轉(zhuǎn)的新增頁面
4、關(guān)鍵字number在哪里計(jì)算。
5、樹還是出不來
成功了?。。。。。。。。。?!
2019-05-10 DAY15
昨天把功能基本寫好了,今天就總結(jié)一下

emmmm下載好像還不行。?!,F(xiàn)在是打開這個(gè)東西。
1、樹形是怎么出來的
然后就去看vue.js了。。。??吹暮芾?/p>
2019-05-13 DAY16
又是周一,今天眼睛不是很舒服。
prop屬性詳解:https://www.cnblogs.com/xiaohuochai/p/7388866.html
靜態(tài)Prop通過為子組件在父組件中的占位符添加特性的方式來達(dá)到傳值的目的


動(dòng)態(tài)props:動(dòng)態(tài)地綁定父組件的數(shù)據(jù)到子模板的 props,與綁定到任何普通的HTML特性相類似,就是用 v-bind。每當(dāng)父組件的數(shù)據(jù)變化時(shí),該變化也會(huì)傳導(dǎo)給子組件

總結(jié)一下:
子組件在props中創(chuàng)建一個(gè)屬性,用以接收父組件傳過來的值
父組件中注冊(cè)子組件
在子組件標(biāo)簽中添加子組件props中創(chuàng)建的屬性
把需要傳給子組件的值賦給該屬性
子組件向父組件傳值
1.在子組件中創(chuàng)建一個(gè)按鈕,給按鈕綁定一個(gè)點(diǎn)擊事件
2.在響應(yīng)該點(diǎn)擊事件的函數(shù)中
使用$emit來觸發(fā)一個(gè)自定義事件,并傳遞一個(gè)參數(shù)
image.png
3.在父組件中的子標(biāo)簽中監(jiān)聽該自定義事件并添加一個(gè)響應(yīng)該事件的處理方法

總結(jié)一下:
子組件中需要以某種方式例如點(diǎn)擊事件的方法來觸發(fā)一個(gè)自定義事件
將需要傳的值作為$emit的第二個(gè)參數(shù),該值將作為實(shí)參傳給響應(yīng)自定義事件的方法
在父組件中注冊(cè)子組件并在子組件標(biāo)簽上綁定對(duì)自定義事件的監(jiān)聽
Vue的slot-scope的場(chǎng)景的個(gè)人理解(寫的很好)
簡(jiǎn)單來說:
理解插槽作用域的使用方式
1.父組件傳遞了todos數(shù)組給子組件
2.子組件通過props接受了數(shù)組數(shù)據(jù),這里應(yīng)該沒有任何問題
3.子組件拿到數(shù)組后v-for渲染列表,并且通過 <slot :todo="todo">的方式,把數(shù)組內(nèi)的每一個(gè)todo對(duì)象,傳遞給父組件
4.父組件通過slot-scope="slotProps"的方式,接受todo對(duì)象,之后就可以通過slotProps.todo.xxx的方式來使用了
所以數(shù)據(jù)的流動(dòng)經(jīng)歷了
父組件傳遞todos數(shù)組給子組件
子組件遍歷todos數(shù)組,把里面的todo對(duì)象傳遞給父組件
props,scope,slot,ref,is,slot,sync等知識(shí)點(diǎn)(寫的很好)
好了,看了近一天。?;究炊畍ue了。。。