Saas
什么是Saas
SaaS是Software-as-a-service(软件即服务)。SaaS提供商为企业搭建信息化所需要的所有网络基础设施及软件、硬件运作平台,并负责所有前期的实施、后期的维护等一系列服务,企业无需购买软硬件、建设机房、招聘IT人员,即可通过互联网使用信息系统
Saas模式:
Saas 模式下面的数据安全问题
方案一: 可一个租户都单独的数据库 – 安全性最高
方案二: 共享数据库 ,独立schema(oracle比较明显)(用户 方案 – 表)
方案三: 共享数据库 ,共享表 . – 目前
saas的权限设计
以前权限设计的模式:
Saas(平台) 怎么设计权限 ?
1.4 租户注册–流程
实现注册流程
学会: (1)怎么去保存 多张表
t_tenant /t_employee
(2)怎么处理 对象里面 有关联对象
employee (tenant)
前台封装参数值:
let para = Object.assign({
}, this.employee);
let tenant = {
companyName: para.companyName,
companyNum:para.companyNum,
address:para.address,
logo:para.logo
}
para.tenant = tenant;
后台通过Employee对象接收
分页
(1) 创建PageList
pageSize page total rows
(2) 创建BaseQuery对象 – >接收到前台传过来的值
(3)在对应的service成添加了分页的方法
public PageList<Department> findPage(DepartmentQuery departmentQuery) {
PageList<Department> pageList = new PageList();
//查询总数 select count(*) from xxx where xxxx
Long total = departmentMapper.findTotal(departmentQuery);
//总的条数
pageList.setTotal(total);
// select *from xx where limit 0, 10
List<Department> departments = departmentMapper.findData(departmentQuery);
//当前页的数据
pageList.setRows(departments);
return pageList;
}
高级查询
<!-- 分页查询总数据的方法 findTatal(DepartmentQuery query)-->
<select id="findTotal" parameterType="departmentQuery" resultType="long">
select count(*) from t_department
<where>
<if test="name != null and name != ''">
and name like concat('%',#{name},'%')
</if>
</where>
</select>
<!--limit 0,10 10,10-->
<select id="findData" parameterType="departmentQuery" resultType="Department">
select * from t_department
<where>
<if test="name != null and name != ''">
and name like concat('%',#{name},'%')
</if>
</where>
limit #{start},#{pageSize}
</select>
mybatis关系处理
jpa /mybatis
一对一 多对一 – >1方处理
一对多 多对多 --> 多方处理
查询操作
对1方(1对1 多对1)
<resultMap id="DepartmentMap" type="department">
<id column="id" property="id"></id>
<result column="name" property="name"></result>
<result column="sn" property="sn"></result>
<!--对一方处理-->
<association property="manage" javaType="employee">
<id column="eid" property="id"></id>
<result column="username" property="username"></result>
</association>
<association property="parent" javaType="department">
<id column="pid" property="id"></id>
<result column="pname" property="name"></result>
</association>
<association property="tenant" javaType="tenant">
<id column="tid" property="id"></id>
<result column="companyName" property="companyName"></result>
</association>
</resultMap>
<!--limit 0,10 10,10-->
<select id="findData" parameterType="departmentQuery" resultMap="DepartmentMap">
select d.id , d.name , d.sn , e.id eid,e.username , p.id pid, p.name pname
,t.id tid, t.companyName
from t_department d
join t_employee e on d.manager_id = e.id
join t_department p on d.parent_id = p.id
join t_tenant t on d.tenant_id = t.id
<where>
<if test="name != null and name != ''">
and name like concat('%',#{name},'%')
</if>
</where>
limit #{start},#{pageSize}
</select>
对多(1对多 多对多)
<!-- 查询子部门处理多方-->
<select id="loadChildrenDept" resultMap="childrenDeptMap">
select distinct d.id,d.name ,p.id pid ,p.name pname from t_department d
join t_department p on d.parent_id = p.id
order by p.id
</select>
<resultMap id="childrenDeptMap" type="department">
<id column="pid" property="id"></id>
<result column="pname" property="name"></result>
<collection property="childrens" javaType="department">
<id column="id" property="id"></id>
<result column="name" property="name"></result>
</collection>
</resultMap>
多对多注意:
在分页的时候,不要嵌套结果 要使用嵌套查询
增(修改) 删除
(1)对1方处理 (1对1 多对1)-- 增加/修改
多个员工对应1个部门 – >
Emloyee:
usename, pwd,Department dept;
新增/修改
insert into t_employee (username,pwd,dept_id) values(#{username},#{pwd},#{dept.id})
update t_employee set username = #{username},dept_id=#{dept.id} where id=#{id}
insert into t_department(name,manage_id) values(#{name},#{manage.id})
(2)对多方处理(1对多/多对多)–保存修改
升级elementui版本:
修改 package.json
"element-ui": "^2.12.0",
修改main.js 的index.css文件
import 'element-ui/lib/theme-chalk/index.css'
对话框:
修改 dialog 添加属性:
:visible.sync="addFormVisible"
穿梭框
<el-form-item label="权限" prop="permissions">
<el-transfer v-model="selectedPermissions" :data="allPermissions" :titles="titles" :props="{
key: 'id',
label: 'name'
}" @change="handleChange">
</el-transfer>
</el-form-item>
selectedPermissions:[],
allPermissions:[{
"id":1,"name":"添加员工"},{
"id":2,"name":"修改员工"},{
"id":3,"name":"删除员工"}],
titles:['所有权限', '已选权限'],
-----------------传值的时候,封装的参数--------------------------------
let paraselectPermsion = Object.assign({
},this.selectedPermissions);
para.permissions = [];
for(let key in paraselectPermsion ){
let permission ={
"id": paraselectPermsion[key]
}
para.permissions.push(permission);
}
接收保存
public void saveRolePermisison(Role role){
//保存角色t_role
roleMapper.save(role);
// 方案一 : 多次操作数据库
//方案二: 批量新增 insert into t_role_permission(role_id,permission_id) values(1,1),(1,2)
// insert into
// t_role_permission(role_id,permission_id) values(1,100),(1,201)
List<Map<String,Object>> rplist = new ArrayList();
List<Permission> permissions = role.getPermissions();
for (Permission permission : permissions) {
Long pid = permission.getId();
Long rid = role.getId();
Map rpMap = new HashMap();
rpMap.put("roleId",rid);
rpMap.put("permissionId",pid);
rplist.add(rpMap);
}
roleMapper.saveRolePermission(rplist);
}
<insert id="saveRolePermission" parameterType="arrayList">
insert into t_role_permission(role_id,permission_id) VALUES
<foreach collection="list" item="item" separator=",">
(#{item.roleId},#{item.permissionId})
</foreach>
</insert>
常用组件
(1)下拉组件
<el-form-item label="部门经理" prop="username">
<el-select v-model="managerId" placeholder="请选择">
<el-option
v-for="item in managers"
:key="item.id"
:label="item.username"
:value="item.id">
</el-option>
</el-select>
</el-form-item>
(2)穿梭框
<el-form-item label="权限" prop="permissions">
<el-transfer v-model="selectedPermissions" :data="allPermissions" :titles="titles" :props="{
key: 'id',
label: 'name'
}" @change="handleChange">
</el-transfer>
</el-form-item>
(3)上传
<el-upload
class="upload-demo"
action="http://localhost/file/upload"
:on-success="handleSuccess"
:file-list="fileList"
list-type="picture">
<el-button size="small" type="primary">点击上传</el-button>
<div slot="tip" class="el-upload__tip">只能上传jpg/png文件,且不超过500kb</div>
</el-upload>
百度地图–看官网
地图 在很多场景下面都在使用
地图有很多种类 – 百度地图 / 高德 /腾讯/谷歌
(1)百度平台得的key=123123123123123123123
百度地图
(2)怎么使用
a) 安装 vue-baidu-map
npm install vue-baidu-map --save
b) 全局引入百度地图 --main.js
import Vue from 'vue'
import BaiduMap from 'vue-baidu-map'
Vue.use(BaiduMap,{
// ak 是在百度地图开发者平台申请的密钥 详见 http://lbsyun.baidu.com/apiconsole/key */
ak: 'Hfr6TfnXRMrg1Df5P2VjwORlDrR8BvTR'
})
c)测试
<!-- 准备一个对话框-->
<el-dialog title="百度地图" width="60%" :visible.sync="mapDialogVisibale" v-model="mapDialogVisibale" :close-on-click-modal="false">
<baidu-map center="成都市" :zoom="11">
<bm-auto-complete v-model="keyword" :sugStyle="{
zIndex: 2100}">
<div style="margin-bottom:10px">
<input id="searchInput" type="text" placeholder="请输入关键字" class="searchinput"/>
<el-button type="success" @click="selectAdrressConfirm">确定</el-button>
</div>
</bm-auto-complete>
<bm-view class="bmap"/>
<bm-local-search :keyword="keyword" :auto-viewport="true" :panel="false"></bm-local-search>
</baidu-map>
</el-dialog>
# 1. 登录(掌握)
shiro: 安全框架,四大基石(身份认证 授权 密码学 会话管理)
项目里面怎么添加shiro
(1)创建一个shiro的maven模块
(2)导入jar包
<dependencies>
<dependency>
<groupId>cn.itsource</groupId>
<artifactId>crm_service</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-all</artifactId>
<version>1.4.1</version>
</dependency>