配置页面配置路径

菜单页面路径配置

根据父id查询所有子菜单配置,避免菜单id配置重复

http://localhost:8013/scms/R02/R0202 父路径R02 对应 父id M02

  1. SELECT * FROM TB_SYS_MENU t WHERE t.menu_pid = 'M02'

根据子菜单id的排序向后添加菜单配置 注意必填字段

menu_id 不可重复 menu_name 菜单名称 menu_component(菜单路径,如果不是目录,必填)

menu_pid 父菜单id menu_sort 菜单排序 menu_path 链接地址(路由地址)

parent_menu_path 上级资源编号(上级路由地址)

左树右表配置

查询是否存在 父目录id

  1. select * from tb_pub_module_menus t where t.module_cd = 'clsBtree' --父目录id

如果有可以向该目录内添加左树右表菜单配置

  1. select * from tb_pub_module_menus_info where module_cd = 'clsBtree'

查询到该菜单下的所有子菜单,按order_by字段排序添加菜单配置 menu_cd 菜单id menu_anme 菜单名 menu_url菜单路径 menu_pre_cd 菜单父目录id(tb_pub_module_menus表的module_cd)

缓存刷新

左树右表配置后不会立即生效需要刷新缓存

  1. 重启公共子系统刷新
  2. 登录信贷系统: ->系统管理/页面框架配/刷新缓存按钮

打开左树右表时默认会打开第一个页面作为主业务页面,如果有其他子页面需要用到主业务页面的参数,需要将参数放置在浏览器缓存内

  1. //影像上传下载页面需要的主业务页面参数
  2. sessionStorage.setItem('appId', checkBussinessKey('dbhAppId'))
  3. sessionStorage.setItem('systemCode', 'aft')
  4. sessionStorage.setItem('imageListNo', 'aft')

左树右表菜单显示规则

tb_pub_module_menus_info表检查类型有 A R M

  • 类型A

checker字段#前面对应子系统calss #后面是对应的方法 最终返回布尔值来决定是否显示页面

  • 类型R

使用规则判断是否显示,checker字段为规则id

  • 类型M

规则模块,包含多个规则id 判断是否显示页面

规则对应的子系统配置在scmspub用户的tb_wfm_product_mapping (业务流程产品流程模板配置表)tree_module_cd字段 @后为子系统名

页面组成

avue组件库文档地址:https://avuejs.com/

element-ui组件库文档地址:https://element.eleme.cn

avue-crud 列表组件

crud组件常用功能

  • 搜索栏

    根据配置自动生成查询表单,表单项由option对象column数组配置

  • 列表展示

    根据option配置column数组生成列表的列

  • 分页组件

    提供一套分页组件,提供分页查询相关方法,如修改每页显示数量、切换下一页上一页、跳转到指定页码。

  • 对字段的增删改查

    提供新增、删除、修改、查看方法入口

    crud组件常用配置项

表单项配置

  1. editBtn: false,//是否显示行修改按钮
  2. delBtn: false,//是否显示行删除按钮
  3. addBtn: false,//是否显示添加按钮

字段项配置(可配置字段是否参与搜索、添加、添加、规则校验、事件)

主要配置项作用

  • prop 提交表单时的字段名(搜索、添加、修改)表单
  • type 字段类型,常用的有text输入框,select下拉框,date日期选择框 详情参考avue文档
  • hide 列是否在列表中显示
  • search 字段是否参与搜索
  • dicUrl 如果是字典下拉框 配置字典的请求地址
  • props 自定义字典的名称、值对应的key值
  • rules 新增,修改时表单的校验规则 详情参考avue-form校验文档
  • change 搜索栏里字段的事件
  • formslot 表单是否使用插槽自定义字段
  1. {
  2. label: '客户标识',
  3. prop: 'cusFlag',
  4. filterable: true,//是否可搜索
  5. type: 'select',//下拉框选项
  6. hide: true,//隐藏列
  7. search: false,//是否可搜索
  8. dicUrl: window.GLOBAL_OBJ.DIC_URL + 'CSM_CUS_FLAG', //字典项路径
  9. props: { label: 'text', value: 'value' },//字典项名字的key值和value的key值
  10. rules: [{ //当新增或修改时 客户标识字段的校验规则,可以有多个
  11. required: true,
  12. message: '请选择客户标识',
  13. trigger: ['blur', 'change']
  14. }],
  15. change(val) {// 搜索项里的客户标识字段的选中事件
  16. // 01:法人 02:非法人
  17. if (val.value === '01') {
  18. that.tableOption.column[1].display = false
  19. that.tableOption.column[2].display = true
  20. } else if (val.value === '02') {
  21. that.tableOption.column[1].display = true
  22. that.tableOption.column[2].display = false
  23. }
  24. }
  25. },

avue-form组件

表单常用配置项

  • submitText 提交按钮文案

  • group 分组表单,放入正常的column配置就行

  • column 字段数组 group内字段与form表单字段配置方式一致

  • dicUrl 如果是字典下拉框 配置字典的请求地址

  • props 自定义字典的名称、值对应的key值

  • rules 新增,修改时表单的校验规则 详情参考avue-form校验文档

  1. option:{
  2. column:[{
  3. label: '内容',
  4. prop: 'text',
  5. }],
  6. group:[
  7. {
  8. icon:'el-icon-info',
  9. label: '分组1',
  10. collapse:false,
  11. prop: 'group1',
  12. column: [{
  13. label: '内容1',
  14. prop: 'text1',
  15. }]
  16. }]
  17. }

使用具名插槽向表单插入自定义组件

  • slot 子组件插槽名称
  • slot-scope 作用域插槽 (使用作用域插槽可获取子组件内属性)
  1. <template slot-scope="scope" slot="orgIddcForm">
  2. <tree-select :span="5" :code="code" :model-data.sync="scope.row.orgId" :placeholder="placeholder" @handleNodeClick="rootGetNode"/>
  3. </template>

avue表格组件和表单组件使用查找带回组件

机构选择组件 tree-select

  1. <template slot="orgId">
  2. <tree-select :span="24" :code="code" :model-data="rootNodeData.text" :tree-vlue.sync="formObj.orgId" :placeholder="'请选择机构'" style="margin-top:1px" @handleNodeClick="rootGetNode"/>
  3. </template>
  • :span相对于父元素所占用的栅格宽度可选值1-24

  • :code 查找此机构下的子机构

  • :model-data 选中机构后 输入框显示的内容

  • :tree-value.sync 选中机构后的机构id

  • @handleNodeClick 选择事件

查找客户经理

  1. <template slot="zbCustMgrName">
  2. <user-dialog :user-code.sync="formObj.zbCustMgrCode" style="padding- top: 7px;" placeholder="主办客户经理"/>
  3. </template>
  • user-code.sync 双向绑定的客户经理编号

路由跳转

单页面项目在使用router组件跳转是页面不刷新,仅修改router-view的内容

router.push方法跳转页面:

  1. this.$router.push({ name: 'Syserror', params: { sys: 'xp' }})
  2. this.$router.push({ path: '/R01/R0104' })
  3. this.$router.push({ path: `/myJob?jump=${wrok}` })
  1. //不带参跳转
  2. this.$router.push('/home')
  3. this.$router.push({name:'home'})
  4. this.$router.push({path:'/home'})
  5. //2. query传参
  6. this.$router.push({name:'home',query: {id:'1'}})
  7. this.$router.push({path:'/home',query: {id:'1'}})
  8. // html 取参 $route.query.id
  9. // script 取参 this.$route.query.id
  10. //3. params传参
  11. this.$router.push({name:'home',params: {id:'1'}}) // 只能用 name
  12. // 路由配置 path: "/home/:id" 或者 path: "/home:id" ,
  13. // 不配置path ,第一次可请求,刷新页面id会消失
  14. // 配置path,刷新页面id会保留

query 和 params 的区别

  1. query跳转会在地址栏url上面拼接参数 类似于get请求
  2. params 参数跳转不拼接sql 类似post请求(推荐)

    页面请求后台api

    api使用和存放位置

    接口js文件统一存方在src/api/子系统名/业务表/index.js 通常会生成一个业务js文件,存放业务页面调用后台api接口的方法,使用时在页面script标签内引入即可:
    1. import { queryList, addObj, putObj, delObj, syncCusInfo } from '@/api/customer/corpor/tbCsmCorporation_form'

    接口调用

  • 调用接口时注意get方式使用params存放请求参数
  • post方法使用data存放请求参数
  • 获取单条数据一般将uuid拼接在请求地址里发送get请求
  1. getList(){
  2. queryList(Object.assign({
  3. pageNum: page.currentPage,
  4. size: page.pageSize,
  5. handleUser: this.userCode // this.userCode
  6. }, params)).then(response => {
  7. this.tableData = response.list
  8. this.page.total = response.page.totalResult
  9. this.tableLoading = false
  10. })
  11. }

api接口js文件结构

  • 引入request请求工具类
  • 网关子系统路径
  • 要导出的api接口方法
    1. import request from '@/utils/request' //请求工具js
    2. const prefix = '/api/v1/customer' //网关和子系统路径
    3. export function addObj(obj) { //新增方法
    4. return request({
    5. url: prefix + '/tbCsmCorporation',
    6. method: 'post',
    7. data: obj //参数 注意参数名为data表示要将请求参数放入请求体
    8. })
    9. }
    10. export function queryList(obj) {
    11. console.log(JSON.stringify(obj))
    12. return request({
    13. url: prefix + '/tbCsmCorporation',
    14. method: 'get',
    15. params: obj //注意参数名为params表示要将请求参数链接到url上(&name=张三&...)
    16. })
    17. }
    18. export function getObj(id) {
    19. return request({
    20. url: prefix + '/tbFleRecordTransApply/' + id,
    21. method: 'get'
    22. })
    23. }

跨域问题

本地启动前台工程访问本地后台接口时会出现跨域请求问题! 图片1.png

什么是跨域

出于浏览器的同源策略限制.同源策略是一种约定,它是浏览器最核心也是最基本的安全功能,如果缺少了同源策略,则浏览器的正常的功能可能会受到影响,跨域收是Web是构建在同源策略基础上的,浏览器只是针对同源策略的一种实现,同源策略会阻止一个域的JavaScript脚本和另一个域的内容进行交互,所谓同源(即指同一个域)就是两个页面具备同样的协议(protocol),主机(host)和端口号(port)

当一个请求url的协议,域名,端口三者之间任意一个与当前的url不同都即为跨域

当前页面url 被请求页面url 是否跨域 原因 http://www.test.com/ http://www.test.com/index.html 否 同源(协议、域名、端口号相同) http://www.test.com/ https://www.test.com/index.html 跨域 协议不同(http/https) http://www.test.com/ http://www.baidu.com/ 跨域 主域名不同(test/baidu) http://www.test.com/ http://blog.test.com/ 跨域 子域名不同(www/blog)

解决本地调用跨域问题

后台子系统需要添加跨域配置,添加在项目springboot模块的启动类文件夹内,重启项目。

图片2.png

  1. import org.springframework.context.annotation.Bean;
  2. import org.springframework.context.annotation.Configuration;
  3. import org.springframework.web.cors.CorsConfiguration;
  4. import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
  5. import org.springframework.web.filter.CorsFilter;
  6. @Configuration
  7. public class CustomCORSConfiguration {
  8. private CorsConfiguration buildConfig(){
  9. CorsConfiguration corsConfiguration = new CorsConfiguration();
  10. corsConfiguration.addAllowedHeader("*");
  11. corsConfiguration.addAllowedMethod("*");
  12. corsConfiguration.addAllowedOrigin("*");
  13. return corsConfiguration;
  14. }
  15. @Bean
  16. public CorsFilter corsFilter(){
  17. UrlBasedCorsConfigurationSource urlBasedCorsConfigurationSource = new UrlBasedCorsConfigurationSource();
  18. urlBasedCorsConfigurationSource.registerCorsConfiguration("/**",buildConfig());
  19. return new CorsFilter(urlBasedCorsConfigurationSource);
  20. }
  21. }

网关地址(后台环境)切换

图片3.png

本地测试时修改dev.env.js 文件里 BASE_API对象的值,该值是各个环境的网关地址:

如专项测试:’”http://10.6.11.118:8888“‘

主环境测试:’”http://10.6.11.90:8888“‘

如果重启项目后地址未改变,需要删除vue编译缓存,删除后需要重启项目

位置:node-modules/.cache