jeecgboot學習筆記

酸檸濤啊發表於2020-10-14

Shiro
Apache Shiro 是 Java 的一個安全框架,不會維護使用者許可權需要我們自己設計
token
*1.*當客戶端頻繁向伺服器請求,服務端頻繁的去查資料庫中的使用者的登入資訊,判斷密碼和使用者名稱是否對並且提出相應的提示,token就誕生了。
*2.*計算機身份驗證中是令牌。也就是說第一次客戶端登入後,服務端就生成了一個token(一串字串)並且返回給客戶端,以後只要帶著他就可以了,不需要再帶資料驗證。好處減輕伺服器的壓力,減少查詢次數。
3.兩種方法訪問
a用裝置號或者mac地址作為token
客戶端:使用者登入時獲取到裝置的裝置號/mac,並當做引數傳遞
服務端:接收後,使用一個變數接收並且將其作為一個token儲存在資料庫中並設定到session中,使用者請求時統一攔截,客戶端的token與session中的對比
問題:客戶端需要將裝置號或者mac地址作為引數傳遞,並且需要在服務端儲存,如果服務端超時,只需要到服務端將客戶傳遞的token到資料庫中查詢,並且賦值給token.
b.session值作為token
客戶端:使用者名稱密碼傳遞
服務端:接收後判斷,正確就將本地sessionid作為token返回給客戶端,客戶端以後就帶著這個token來就可以了。
好處:不需要儲存,缺點就是當session過期了,客戶端必須重新登入
jeecgboot
1.獲取使用者登入資訊

LoginUser sysUser = (LoginUser)SecurityUtils.getSubject().getPrincipal();

2.驗證token有效性

String token = request.getParameter("token");
  SysUser sysUser = shiroRealm.checkUserTokenIsEffect(token);

3.自定義註解學習

a.快取註解@Cacheable

@Cacheable(value="users",key="#pageable.pageSize")

把方法的返回值新增到ehcache中做快取,多次查詢的時候會先查詢快取內容
@CacheEvict

@CacheEvict(value="users",allEntries=true)	

清除快取 再兩次查詢中間加入清除快取,不然雖然插入成功但是二次查詢結果也是一樣的因為是在快取中查詢的。

b.字典註解@Dic

用於列表欄位字典翻譯(比如欄位sex存的值是1,會自動生成一個翻譯欄位 sex_dictText 值是‘男’)
實體類

@Dict(dicCode = "sex")
  private Integer sex;

前端
dataIndex 原始欄位是a 這裡dataIndex就是 a_dicText

columns: [

    {
     title: '性別',
     align: "center",
     width: 80,
     dataIndex: 'sex_dictText'
     }]

c.@PermissionData 資料許可權限制
lombok註解
lombok是在編譯期間動態的修改原始碼,其實可以達到反射一樣的效果,但是它比反射更加的高效,是在編譯器執行的
@Data 類中新增該註解可自動生成getter和setter、equals、canEqual、hashCode、tostring方法,如果為final屬性則不能生成setter方法
@EqualsAndHashCode(callSuper=false)????
@Accessors(chain = true):chain的中文含義是鏈式的,設定為true,則setter方法返回當前物件,如果不加,則返回當前屬性;
swagger註解
是一個規範且完整的框架,生成描述呼叫和視覺化restful風格的web服務
支援api自動生成同步的線上文件:直接通過程式碼生成文件,不需要自己手動編寫介面文件
提供web頁面線上測試api,生成的文件也支援線上測試。
用於實體類上
@ApiModel()對類進行說明
@ApiModelProperty()用於方法,欄位
@ApiIgnore()用於類,方法,方法引數

@Data     //lomlok註解 生成gettersetter方法
@TableName("students") //maybatis-plus的註解
@EqualsAndHashCode(callSuper = false)//lomlok生成的equals,hashCode註解
@Accessors(chain = true) //返回物件不是屬性
@ApiModel(value="students物件", description="學生類") //Swager註解
public class Students {
    
	/**id*/
	@TableId(type = IdType.UUID)
    @ApiModelProperty(value = "id")
	private java.lang.String id;
	}
/**修改時間*/
	@Excel(name = "修改時間", width = 20, format = "yyyy-MM-dd HH:mm:ss")
	@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
    @ApiModelProperty(value = "修改時間")
	private java.util.Date updateTime;
@Excel(name = "修改人", width = 15)
    @ApiModelProperty(value = "修改人1111")
	private java.lang.String updateName;

當用在介面上時
@Api()標識是swagger資源
@Api(tags=“學生類”)
@AutoLog(value = “學生類-分頁列表查詢”) 日誌
QueryWrapper mybatis plus 條件構造器

最上層抽象的Wapper條件構造抽象類
➷ 下一層就是抽象類AbstractWrapper:用於查詢條件封裝,生成sql的where條件

QueryWrapper : Entity 物件封裝操作類
UpdateWrapper : Update 條件封裝,用於Entity物件更新操作

eq是等於   ne不等於  gt大於>  ge大於等於>=
lt 小於    le大於等於 
@Slf4j
@Api(tags="學生類")//是swagger資源 可以自動生成文件
@RestController
@RequestMapping("/text/students")
public class StudentsController {
	@Autowired
	private IStudentsService studentsService;
	
	@AutoLog(value = "學生類-分頁列表查詢")//記錄日誌資訊,通過配置的切面類可以插入資料庫對應的日誌資訊
	@ApiOperation(value="學生類-分頁列表查詢", notes="學生類-分頁列表查詢")//表示一個http請求
	@GetMapping(value = "/list")
	@PermissionData(pageComponent=“text/StudentsList”)
	//text/StudentsList前端元件名稱
	public Result<IPage<Students>> queryPageList(Students students,
									  @RequestParam(name="pageNo", defaultValue="1") Integer pageNo,
									  @RequestParam(name="pageSize", defaultValue="10") Integer pageSize,
									  HttpServletRequest req) {
		Result<IPage<Students>> result = new Result<IPage<Students>>();//頁面
		QueryWrapper<Students> queryWrapper = QueryGenerator.initQueryWrapper(students, req.getParameterMap());//mybatis plus條件查詢
		Page<Students> page = new Page<Students>(pageNo, pageSize);
		IPage<Students> pageList = studentsService.page(page, queryWrapper);
		result.setSuccess(true);
		result.setResult(pageList);
		return result;
	}
	
	@AutoLog(value = "學生類-新增")
	@ApiOperation(value="學生類-新增", notes="學生類-新增")
	@PostMapping(value = "/add")
	@RequiresPermissions("students:add")
	public Result<Students> add(@RequestBody Students students) {
		Result<Students> result = new Result<Students>();
		try {
			studentsService.save(students);
			result.success("新增成功!");
		} catch (Exception e) {
			log.error(e.getMessage(),e);
			result.error500("操作失敗");
		}
		return result;
	}