Commit c9a9548b authored by qddidi's avatar qddidi

827

parents 8a5feb4c 8aa64e84
# kitty
### 在线演示
演示地址:http://139.196.87.48:9002/kitty
用户名:admin 密码:admin
温馨提示:
有在演示环境删除数据的童鞋们,如果可以的话,麻烦动动小指,点击头像面板,
选择 -> 备份还原 帮忙恢复到系统默认备份数据,方便后来的童鞋查看,谢谢啦。
### 技术交流
为了方便大家提问和技术交流,整了个QQ群,欢迎童鞋们加入。
QQ技术交流群: 528818161
### 博客教程
本人技术博客提供同步系列文章教程, 讲解了Kitty从零开始搭建的全过程:
[Vue.js + Element UI 实现权限管理系统 前端篇](https://www.cnblogs.com/xifengxiaoma/p/9533018.html)
[Spring Boot + Spring Cloud 实现权限管理系统 后端篇](https://www.cnblogs.com/xifengxiaoma/p/9474953.html)
### 分支说明
- master: 主推版本分支,支持分布式,服务治理(Spring Security + Spring Cloud)
- dev: 开发分支,适时合并到master分支,支持分布式,服务治理(Spring Security + Spring Cloud)
- shiro-cloud: 基于Spring Boot + Shiro + Spring Cloud,支持分布式、服务治理
- shiro: 基于Spring Boot + Shiro,不包含 Spring Cloud,部署环境稍微简单一点
### 项目介绍
- Kitty是基于Spring Boot、Spring Cloud、Vue、Element实现的Java快速开发平台。
- 目标是搭建出一套简洁易用的快速解决方案,可以帮助用户有效降低项目开发难度和成本。
- 个人博客提供本项目开发过程同步系列教程文章,手把手的教你如何开发同类系统。
### 功能列表
- ✔ 系统登录:系统用户登录,系统登录认证(token方式)
- ✔ 用户管理:新建用户,修改用户,删除用户,查询用户
- ✔ 机构管理:新建机构,修改机构,删除机构,查询机构
- ✔ 角色管理:新建角色,修改角色,删除角色,查询角色
- ✔ 菜单管理:新建菜单,修改菜单,删除菜单,查询菜单
- ✔ 字典管理:新建字典,修改字典,删除字典,查询字典
- ✔ 系统日志:记录用户操作日志,查看系统执行日志记录
- ✔ 数据监控:定制Druid信息,提供简洁有效的SQL监控
- ✔ 聚合文档:定制在线文档,提供简洁美观的API文档
- ✔ 备份还原:系统备份还原,一键恢复系统初始化数据
- ✔ 主题切换:支持主题切换,自定主题颜色,一键换肤
- ✔ 服务治理:集成Consul注册中心,实现服务注册和发现
- ✔ 服务监控:集成Spring Boot Admin,实现服务监控
- ✔ 服务消费:集成Ribbon、Feign,服务调用和负载均衡
- ✔ 服务熔断:集成Hystrix、Turbine,实现熔断和监控
- ✔ 服务网关:集成Spring Cloud Zuul,实现API网关
- ✔ 链路追踪:集成Sleuth、Zipkin,实现分布式链路追踪
- ✔ 配置中心:集成Config、Bus,实现分布式配置中心
- ✔ 代码生成:提供代码生成器,最大化的降低代码开发量
- ✘ 单点登录:利用 OAuth2, 提供统一的单点登录功能
- ✘ 系统登录:集成第三方登录功能(QQ、微信、微博)
- ...
### 代码生成器
代码生成器放在独立项目,地址如下:
[https://gitee.com/liuge1988/kitty-generator](https://gitee.com/liuge1988/kitty-generator)
### 软件架构
#### 后端架构
##### 开发环境
- IDE : eclipse 4.x
- JDK : JDK1.8.x
- Maven : Maven 3.5.x
- MySQL: MySQL 5.7.x
##### 技术选型
- 核心框架:Spring Boot 2.x
- 服务治理:Spring Cloud Finchley
- 安全框架:Spring Security 5.x
- 视图框架:Spring MVC 5.x
- 持久层框架:MyBatis 3.x
- 数据库连接池:Druid 1.x
- 日志管理:SLF4J、Log4j
##### 项目结构
- kitty-common: 公共代码模块,主要放置一些工具类
- kitty-core: 核心代码模块,主要封装公共业务模块
- kitty-admin: 后台管理模块,包含用户、角色、菜单管理等
- kitty-backup: 系统数据备份备份模块,可选择独立部署
- kitty-monitor: 系统监控服务端,监控Spring Boot服务模块
- kitty-producer: 服务提供者示例,方便在此基础上搭建模块
- kitty-consumer: 服务消费者示例,方便在此基础上搭建模块
- kitty-hystrix: 服务熔断监控模块,收集汇总熔断统计信息
- kitty-zuul: API服务网关模块,统一管理和转发外部调用请求
- kitty-config: 配置中心服务端,生成GIT配置文件的访问接口
- kitty-consul: 注册中心,安装说明目录,内附安装引导说明
- kitty-zipkin: 链路追踪,安装说明目录,内附安装引导说明
- config-repo: 配置中心仓库,在GIT上统一存储系统配置文件
- kitty-pom: 聚合模块,仅为简化打包,一键执行打包所有模块
#### 前端架构
##### 开发环境
- IDE : VS Code 1.27
- NODE: Node 8.9.x
- NPM : NPM 6.4.x
##### 技术选型
- 前端框架:Vue 2.x
- 页面组件:Element 2.x
- 状态管理:Vuex 2.x
- 后台交互:axios 0.18.x
- 图标使用:Font Awesome 4.x
##### 项目结构
kitty-ui
- assets: 图标、字体、国际化信息等静态信息
- components: 组件库,对常用组件进行封装
- http: 后台交互模块,统一后台接口请求API
- i18n: 国际化模块,使用Vue i18n进行国际化
- mock: Mock模块,模拟接口调用并返回定制数据
- permission: 权限控制模块,处理权限认证逻辑
- router: 路由管理模块,负责页面各种路由配置
- store: 状态管理模块,提供组件间状态共享
- utils: 工具模块,提供一些通用的工具方法
- views: 页面模块,主要放置各种页面视图组件
### 安装教程
#### 后端安装
1. 下载源码
git clone https://gitee.com/liuge1988/kitty.git
2. 导入工程
使用 Eclipse导入 Maven 项目,在此之前请确认已安装 JDK 和 Maven 工具。
3. 编译代码
找到 kitty-pom 工程的 pom.xml,执行 maven clean install 命令编译一键打包。
一般来说不会有什么问题,如果还是编译不成功,可以按照优先级逐个编译试一试。
4. 导入数据库
新建 kitty 数据库,导入 kitty-admin 工程 doc/kitty.sql 脚本,导入初始化数据库。
修改 kitty-admin 下 application.yml 中的数据库连接和账号密码为自己的数据库配置。
修改 kitty-backup 下 application.yml 中的数据库连接和账号密码为自己的数据库配置。
5. 启动系统
基础必需模块(注册中心:kitty-consul,服务监控:kitty-monitor)
找到 kitty-consul 工程,根据安装说明安装注册中心,完成后执行 consul agent -dev 启动。
找到 kitty-monitor 工程下的 KittyMonitorApplication, 启动项目,开启服务监控。
权限管理模块(权限管理:kitty-admin,备份还原:kitty-backup)
找到 kitty-admin 工程下的 KittyAdminApplication, 启动项目,开启权限管理系统服务。
找到 kitty-backup 工程下的 KittyBackupApplication.java,启动项目,开启备份还原服务。
其他模块根据各自需要选择性启动,模块依赖可以参见我的博客同步教程...
注意事项:
如果需要链路追踪服务,需要安装zipkin,找到 kitty-zipkin 工程,根据安装说明安装zipkin。
如果需要配置中心服务,需要安装rabbitMQ,找到 kitty-config 工程,根据安装说明安装rabbitMQ。
#### 前端安装
1. 下载源码
git clone https://gitee.com/liuge1988/kitty-ui.git
2. 编译代码
进入项目根目录,执行 npm install, 下载和安装项目相关依赖包。
3. 启动系统
执行 npm run dev 命令,启动项目,通过 http://localhost:8090 访问。
4. 项目打包
执行 npm run build 命令,启动打包,完成之后会生成 dist 目录。
5. Mock 开关
通过修改src/mock/index.js中的openMock变量,可以一键开启或关闭Mock功能。
6. 修改配置
如果想自定义端口(默认是8090),可以修改 config/index.js 下的 port 属性。
后台接口和备份服务器地址配置在 src/utils/global.js,如有修改请做相应变更。
### 系统展示
#### 登录界面
![输入图片说明](https://images.gitee.com/uploads/images/2018/1227/155412_c2f72f83_645970.png "屏幕截图.png")
#### 用户管理
![输入图片说明](https://images.gitee.com/uploads/images/2018/1227/154342_b8a9eaeb_645970.png "屏幕截图.png")
#### 机构管理
![输入图片说明](https://images.gitee.com/uploads/images/2018/1227/154417_7aefe6c2_645970.png "屏幕截图.png")
#### 角色管理
![输入图片说明](https://images.gitee.com/uploads/images/2018/1227/154431_6d8efe43_645970.png "屏幕截图.png")
#### 菜单管理
![输入图片说明](https://images.gitee.com/uploads/images/2018/1227/154446_61cd21a5_645970.png "屏幕截图.png")
#### 字典管理
![输入图片说明](https://images.gitee.com/uploads/images/2018/1227/154459_22ae6f2d_645970.png "屏幕截图.png")
#### 系统日志
![输入图片说明](https://images.gitee.com/uploads/images/2018/1227/154510_3c1bfd3f_645970.png "屏幕截图.png")
#### 数据监控
用户名:admin, 密码:admin,即服务端配置的密码
![输入图片说明](https://images.gitee.com/uploads/images/2018/1227/154556_8de439d5_645970.png "屏幕截图.png")
#### 服务监控
![输入图片说明](https://images.gitee.com/uploads/images/2018/1227/154701_6bcd25f2_645970.png "屏幕截图.png")
#### 注册中心
![输入图片说明](https://images.gitee.com/uploads/images/2018/1227/154734_877e893e_645970.png "屏幕截图.png")
#### 接口文档
![输入图片说明](https://images.gitee.com/uploads/images/2018/1227/154803_6a612548_645970.png "屏幕截图.png")
#### 代码生成
![输入图片说明](https://images.gitee.com/uploads/images/2018/1227/154840_18fc781c_645970.png "屏幕截图.png")
#### 主题切换
![输入图片说明](https://images.gitee.com/uploads/images/2018/1227/154943_1752c336_645970.png "屏幕截图.png")
### 参与贡献
1. Fork 本项目
2. 新建 Feat_xxx 分支
3. 提交代码
4. 新建 Pull Request
### 码云特技
1. 使用 Readme\_XXX.md 来支持不同的语言,例如 Readme\_en.md, Readme\_zh.md
2. 码云官方博客 [blog.gitee.com](https://blog.gitee.com)
3. 你可以 [https://gitee.com/explore](https://gitee.com/explore) 这个地址来了解码云上的优秀开源项目
4. [GVP](https://gitee.com/gvp) 全称是码云最有价值开源项目,是码云综合评定出的优秀开源项目
5. 码云官方提供的使用手册 [http://git.mydoc.io/](http://git.mydoc.io/)
6. 码云封面人物是一档用来展示码云会员风采的栏目 [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/)
\ No newline at end of file
This source diff could not be displayed because it is too large. You can view the blob instead.
...@@ -114,8 +114,8 @@ export default function $axios(options) { ...@@ -114,8 +114,8 @@ export default function $axios(options) {
break break
case 401: case 401:
err.message = '未授权,请登录' err.message = '未授权,请登录'
break break
case 403: case 403:
err.message = '拒绝访问' err.message = '拒绝访问'
...@@ -160,4 +160,4 @@ export default function $axios(options) { ...@@ -160,4 +160,4 @@ export default function $axios(options) {
reject(error) reject(error)
}) })
}) })
} }
\ No newline at end of file
...@@ -132,20 +132,20 @@ export const seledysqdc = (data) => { ...@@ -132,20 +132,20 @@ export const seledysqdc = (data) => {
} }
//覆盖人员查询 //覆盖人员查询
export const listAllBaseInfo = (data) => { export const listAllBaseInfo = (data) => {
return axios({ return axios({
url: '/baseInfo/getAllBaseInfo', url: '/baseInfo/getAllBaseInfo',
method: 'post', method: 'post',
data data
}) })
} }
// //
export const selectflowState = (params) => { export const selectflowState = (params) => {
return axios({ return axios({
url: '/folw/selectflowState', url: '/folw/selectflowState',
method: 'get', method: 'get',
params params
}) })
} }
//缴费信息查询 //缴费信息查询
export const listPayInfo = (data) => { export const listPayInfo = (data) => {
return axios({ return axios({
...@@ -164,12 +164,12 @@ export const getGrantList = (data) => { ...@@ -164,12 +164,12 @@ export const getGrantList = (data) => {
} }
//流程详情 //流程详情
export const selectRoleflowNo = (params) => { export const selectRoleflowNo = (params) => {
return axios({ return axios({
url: 'role/selectRoleflowNo', url: 'role/selectRoleflowNo',
method: 'get', method: 'get',
params params
}) })
} }
export const updatePassword = (data)=>{ export const updatePassword = (data)=>{
return axios({ return axios({
url: 'user/updatePassword', url: 'user/updatePassword',
...@@ -177,13 +177,44 @@ export const updatePassword = (data)=>{ ...@@ -177,13 +177,44 @@ export const updatePassword = (data)=>{
data data
}) })
} }
export const getTown = () => { export const getTown = () => {
return axios({ return axios({
url: '/dept/findTreeByUser', url: '/dept/findTreeByUser',
method: 'get', method: 'get',
})
}
//交互中心信息查询
export const getInteracts = (params) => {
return axios({
url: '/news/listinteract',
method: 'get',
params
})
}
//上传文件
export const saveFile = (data)=>{
return axios({
url: 'news/add',
method: 'post',
data
})
}
//更新文件状态
export const updateFileState = (id,state)=>{
return axios({
url: 'news/update/' + id + '/' + state,
method: 'post'
})
}
//新闻预览
export const newsPreView = (id)=>{
return axios({
url: 'news/view/'+id,
method: 'get'
}) })
} }
// //
//参保注销导出 //参保注销导出
export const selecbzxdc = (data) => { export const selecbzxdc = (data) => {
......
...@@ -10,8 +10,9 @@ import 'element-ui/lib/theme-chalk/index.css' ...@@ -10,8 +10,9 @@ import 'element-ui/lib/theme-chalk/index.css'
import 'font-awesome/css/font-awesome.min.css' import 'font-awesome/css/font-awesome.min.css'
import '@/assets/iconfont/iconfont.css' import '@/assets/iconfont/iconfont.css'
import getType from "@/utils/type.js" import getType from "@/utils/type.js"
import charts from 'echarts'; import axios from 'axios';
Vue.prototype.$echarts = charts
Vue.prototype.$axios = axios;
Vue.prototype.getType =getType.getType Vue.prototype.getType =getType.getType
Vue.prototype.regetType =getType.regetType Vue.prototype.regetType =getType.regetType
......
...@@ -25,16 +25,18 @@ import receivePersonnel from "@/views/Myvue/receivePersonnel"; ...@@ -25,16 +25,18 @@ import receivePersonnel from "@/views/Myvue/receivePersonnel";
import AllbaseInfo from "@/views/Myvue/allbaseInfo" import AllbaseInfo from "@/views/Myvue/allbaseInfo"
import PayInfo from "@/views/Myvue/payInfo" import PayInfo from "@/views/Myvue/payInfo"
import application from "@/views/Myvue/application" import application from "@/views/Myvue/application"
import authRecordphone from "@/views/Myvue/authRecordphone" import importByExcel from "@/views/Myvue/importByExcel"
import importByExcel from "@/views/Myvue/importByExcel"; import insuranceCancellationAudit from "@/views/Myvue/insuranceCancellationAudit"
import supPaymentAudit from "@/views/Myvue/supPaymentAudit"
import traRelationsAudit from "@/views/Myvue/traRelationsAudit"
import upgradeReoAudit from "@/views/Myvue/upgradeReoAudit"
import interact from "@/views/Myvue/interact"
import preView from "@/views/Myvue/preView"
import treatmentApplicationAudit from "@/views/Myvue/treatmentApplicationAudit"; import treatmentApplicationAudit from "@/views/Myvue/treatmentApplicationAudit";
import insuranceCancellationAudit from "@/views/Myvue/insuranceCancellationAudit";
import supPaymentAudit from "@/views/Myvue/supPaymentAudit";
import traRelationsAudit from "@/views/Myvue/traRelationsAudit";
import upgradeReoAudit from "@/views/Myvue/upgradeReoAudit";
import drcbzx from "@/views/Myvue/drcbzx"; import drcbzx from "@/views/Myvue/drcbzx";
import drbjbf from "@/views/Myvue/drbjbf"; import drbjbf from "@/views/Myvue/drbjbf";
import drtsyw from "@/views/Myvue/drtsyw"; import drtsyw from "@/views/Myvue/drtsyw";
import authRecordphone from "@/views/Myvue/authRecordphone";
Vue.use(Router) Vue.use(Router)
...@@ -165,6 +167,15 @@ const router = new Router({ ...@@ -165,6 +167,15 @@ const router = new Router({
component: traRelationsAudit component: traRelationsAudit
}, },
{ {
path:"/interact",
name:"交互中心",
component: interact
},
{
path:"/preView",
name:"预览",
component:preView
},{
path:"/insCanExport", path:"/insCanExport",
name:"参保注销导出", name:"参保注销导出",
component: drcbzx component: drcbzx
...@@ -200,13 +211,13 @@ const router = new Router({ ...@@ -200,13 +211,13 @@ const router = new Router({
}) })
router.beforeEach((to, from, next) => { router.beforeEach((to, from, next) => {
// 登录界面登录成功之后,会把用户信息保存在会话 // 登录界面登录成功之后,会把用户信息保存在会话
// 存在时间为会话生命周期,页面关闭即失效。 // 存在时间为会话生命周期,页面关闭即失效。
if(localStorage.getItem("token")){ if(localStorage.getItem("token")){
Cookies.set('token',localStorage.getItem("token")) Cookies.set('token',localStorage.getItem("token"))
} }
let token = Cookies.get('token') let token = Cookies.get('token')
let userName = sessionStorage.getItem('user') let userName = sessionStorage.getItem('user')
......
function utf8ByteToUnicodeStr(utf8Bytes){
var unicodeStr ="";
for (var pos = 0; pos < utf8Bytes.length;){
var flag= utf8Bytes[pos];
var unicode = 0 ;
if ((flag >>>7) === 0 ) {
unicodeStr+= String.fromCharCode(utf8Bytes[pos]);
pos += 1;
} else if ((flag &0xFC) === 0xFC ){
unicode = (utf8Bytes[pos] & 0x3) << 30;
unicode |= (utf8Bytes[pos+1] & 0x3F) << 24;
unicode |= (utf8Bytes[pos+2] & 0x3F) << 18;
unicode |= (utf8Bytes[pos+3] & 0x3F) << 12;
unicode |= (utf8Bytes[pos+4] & 0x3F) << 6;
unicode |= (utf8Bytes[pos+5] & 0x3F);
unicodeStr+= String.fromCharCode(unicode) ;
pos += 6;
}else if ((flag &0xF8) === 0xF8 ){
unicode = (utf8Bytes[pos] & 0x7) << 24;
unicode |= (utf8Bytes[pos+1] & 0x3F) << 18;
unicode |= (utf8Bytes[pos+2] & 0x3F) << 12;
unicode |= (utf8Bytes[pos+3] & 0x3F) << 6;
unicode |= (utf8Bytes[pos+4] & 0x3F);
unicodeStr+= String.fromCharCode(unicode) ;
pos += 5;
} else if ((flag &0xF0) === 0xF0 ){
unicode = (utf8Bytes[pos] & 0xF) << 18;
unicode |= (utf8Bytes[pos+1] & 0x3F) << 12;
unicode |= (utf8Bytes[pos+2] & 0x3F) << 6;
unicode |= (utf8Bytes[pos+3] & 0x3F);
unicodeStr+= String.fromCharCode(unicode) ;
pos += 4;
} else if ((flag &0xE0) === 0xE0 ){
unicode = (utf8Bytes[pos] & 0x1F) << 12;;
unicode |= (utf8Bytes[pos+1] & 0x3F) << 6;
unicode |= (utf8Bytes[pos+2] & 0x3F);
unicodeStr+= String.fromCharCode(unicode) ;
pos += 3;
} else if ((flag &0xC0) === 0xC0 ){ //110
unicode = (utf8Bytes[pos] & 0x3F) << 6;
unicode |= (utf8Bytes[pos+1] & 0x3F);
unicodeStr+= String.fromCharCode(unicode) ;
pos += 2;
} else{
unicodeStr+= String.fromCharCode(utf8Bytes[pos]);
pos += 1;
}
}
return unicodeStr;
}
...@@ -127,7 +127,7 @@ export default { ...@@ -127,7 +127,7 @@ export default {
} }
}, },
updatePassword: function () { updatePassword: function () {
var rex = /^[\w_-]{6,8}$/ var rex = /^[\w_-]{6,18}$/
if(this.item.password == ''){ if(this.item.password == ''){
this.$message({message: '请输入原密码', type: 'error'}) this.$message({message: '请输入原密码', type: 'error'})
return; return;
......
<template> <template>
<div> <div>
<el-cascader <el-cascader
:props="{ checkStrictly: true }" :props="{ checkStrictly: true }"
clearable clearable
...@@ -10,7 +9,6 @@ ...@@ -10,7 +9,6 @@
size="mini" size="mini"
@change="handleChange"></el-cascader> @change="handleChange"></el-cascader>
</div> </div>
</template> </template>
...@@ -28,6 +26,7 @@ ...@@ -28,6 +26,7 @@
handleChange(value) { handleChange(value) {
this.$emit('childByValue', value) this.$emit('childByValue', value)
}, },
}, },
created(){ created(){
this.$api.getlist.getTown().then((res) => { this.$api.getlist.getTown().then((res) => {
......
...@@ -355,6 +355,7 @@ ...@@ -355,6 +355,7 @@
this.chartdata.chartsize=10; this.chartdata.chartsize=10;
console.log(this.count); console.log(this.count);
if(this.count<1){ if(this.count<1){
this.count++;
this.$message.error('已经是第一页了'); this.$message.error('已经是第一页了');
}else{ }else{
this.echartzz=JSON.parse(sessionStorage.getItem("zz")); this.echartzz=JSON.parse(sessionStorage.getItem("zz"));
......
...@@ -195,9 +195,6 @@ ...@@ -195,9 +195,6 @@
for(var i in res.data.list){ for(var i in res.data.list){
res.data.list[i].idcard=this.decrypt(res.data.list[i].idcard) res.data.list[i].idcard=this.decrypt(res.data.list[i].idcard)
res.data.list[i].name=this.decrypt(res.data.list[i].name) res.data.list[i].name=this.decrypt(res.data.list[i].name)
var d=new Date(res.data.list[i].createtime)
var mon=(parseInt(d.getMonth()) + 1)
res.data.list[i].createtime=d.getFullYear()+"-"+mon+"-"+d.getDate()+" "+d.getHours() + ':' + d.getMinutes() + ':' + d.getSeconds();
res.data.list[i].recordtype=this.getType(res.data.list[i].recordtype) res.data.list[i].recordtype=this.getType(res.data.list[i].recordtype)
} }
this.tableData=res.data.list this.tableData=res.data.list
...@@ -277,9 +274,6 @@ ...@@ -277,9 +274,6 @@
for(var i in res.data.list){ for(var i in res.data.list){
res.data.list[i].idcard=this.decrypt(res.data.list[i].idcard) res.data.list[i].idcard=this.decrypt(res.data.list[i].idcard)
res.data.list[i].name=this.decrypt(res.data.list[i].name) res.data.list[i].name=this.decrypt(res.data.list[i].name)
var d=new Date(res.data.list[i].createtime)
var mon=(parseInt(d.getMonth()) + 1)
res.data.list[i].createtime=d.getFullYear()+"-"+mon+"-"+d.getDate()+" "+d.getHours() + ':' + d.getMinutes() + ':' + d.getSeconds();
res.data.list[i].recordtype=this.getType(res.data.list[i].recordtype) res.data.list[i].recordtype=this.getType(res.data.list[i].recordtype)
} }
this.tableData=res.data.list this.tableData=res.data.list
...@@ -482,9 +476,6 @@ ...@@ -482,9 +476,6 @@
for(var i in res.data.list){ for(var i in res.data.list){
res.data.list[i].idcard=this.decrypt(res.data.list[i].idcard) res.data.list[i].idcard=this.decrypt(res.data.list[i].idcard)
res.data.list[i].name=this.decrypt(res.data.list[i].name) res.data.list[i].name=this.decrypt(res.data.list[i].name)
var d=new Date(res.data.list[i].createtime)
var mon=(parseInt(d.getMonth()) + 1)
res.data.list[i].createtime=d.getFullYear()+"-"+mon+"-"+d.getDate()+" "+d.getHours() + ':' + d.getMinutes() + ':' + d.getSeconds();
res.data.list[i].recordtype=this.getType(res.data.list[i].recordtype) res.data.list[i].recordtype=this.getType(res.data.list[i].recordtype)
} }
this.tableData=res.data.list this.tableData=res.data.list
......
...@@ -20,7 +20,7 @@ ...@@ -20,7 +20,7 @@
<el-input v-model="form.special_type"></el-input> <el-input v-model="form.special_type"></el-input>
</el-form-item> </el-form-item>
<el-form-item label="险种类型"> <el-form-item label="险种类型">
<el-input v-model="form.other_social"></el-input> <el-input v-model="form.org_insuranceType"></el-input>
</el-form-item> </el-form-item>
</el-form> </el-form>
<el-form ref="form" :model="form" class="forml" label-width="90px"> <el-form ref="form" :model="form" class="forml" label-width="90px">
...@@ -135,7 +135,8 @@ export default { ...@@ -135,7 +135,8 @@ export default {
"address":"", "address":"",
"wuserId":'', "wuserId":'',
"old":"", "old":"",
"now":"" "now":"",
org_insuranceType: ""
}, },
urls: [ urls: [
...@@ -294,12 +295,12 @@ export default { ...@@ -294,12 +295,12 @@ export default {
this.form.name=this.decrypt(this.form.org_name) this.form.name=this.decrypt(this.form.org_name)
//this.form.name=this.form.org_name //this.form.name=this.form.org_name
this.form.identity_number=this.decrypt(this.form.org_idNum) this.form.identity_number=this.decrypt(this.form.org_idNum)
this.form.telphoneValue=this.decrypt(this.form.telphoneValue) // this.form.telphoneValue=this.decrypt(this.form.telphoneValue)
this.form.nation=this.form.nation this.form.nation=this.form.nation
this.form.pay_bank=this.form.org_bankName this.form.pay_bank=this.form.org_bankName
this.form.pay_type=this.form.org_pay this.form.pay_type=this.form.org_pay
this.form.special_type=this.form.org_position this.form.special_type=this.form.org_position
this.form.telphoneValue=this.form.org_telPhone this.form.telphoneValue=this.decrypt(this.form.org_telPhone)
this.form.address=this.form.org_address this.form.address=this.form.org_address
this.form.pay_account=this.form.org_bankNum this.form.pay_account=this.form.org_bankNum
......
<template>
<div>
<div class="op" style="margin-left: 10px">
<el-button type="success" plain size="mini" @click="dialogNewsFormVisible = true">上传<i class="el-icon-upload el-icon--right"></i></el-button>
</div>
<el-dialog title="发布信息" :visible.sync="dialogNewsFormVisible" >
<el-form ref="pushForm" enctype="multipart/form-data" :model="pushForm" label-width="100px" size="mini" :rules = "formrules" >
<el-form-item label="主题" prop = "newsName">
<el-input v-model="pushForm.newsName" placeholder="请输入主题" size = "medium" ></el-input>
</el-form-item>
<el-form-item label="描述" prop = "remark">
<el-input type = "textarea" :rows="8" placeholder="请输入内容 " v-model="pushForm.remark"></el-input>
</el-form-item>
<el-form-item label="附件上传" prop = "file">
<el-upload
ref="upload"
action=""
:auto-upload="false"
:limit="1"
align="left"
:on-change = "selectFile"
>
<el-button slot="trigger" size="small" class = "el-icon-upload2" type="success" >选取文件</el-button><span style="margin-left: 10px" class="el-upload__tip">不能超过10Mb</span>
</el-upload>
</el-form-item>
<el-form-item size="large">
<el-button size = "mini" type = "primary" @click = "upload('pushForm')">立即发布</el-button>
<el-button size = "mini" @click="closeDialog('pushForm')">取消</el-button>
</el-form-item>
</el-form>
</el-dialog>
<el-table
:data="tableData"
stripe
style="width: 100%">
<el-table-column
label="ID"
prop="id"
v-if = "false"
></el-table-column>
<el-table-column
prop="newsName"
label="标题"
align="center"
width = "180"
>
</el-table-column>
<el-table-column
prop="createTime"
label="创建时间"
align="center"
width = "180"
>
</el-table-column>
<el-table-column
prop="createBy"
label="操作人"
align="center"
>
</el-table-column>
<el-table-column
prop="remark"
label="描述"
align="center"
width = "300"
>
</el-table-column>
<el-table-column
prop="fileName"
label="文件名"
align="center"
width = "150"
>
</el-table-column>
<el-table-column label="状态" align="center" width="150">
<template slot-scope="scope">
<el-switch
v-model="scope.row.state"
active-color="#13ce66" inactive-color="#ff4949"
active-text = "启用" inactive-text="禁用"
:inactive-value = "0" :active-value = "2"
@change="changeSwitch(scope.row.state,scope.$index)">
</el-switch>
</template>
</el-table-column>
<el-table-column label="操作" align="center"
min-width="80">
<template slot-scope="scope">
<el-button
size="mini"
type="info"
@click="download(scope.$index, scope.row)">下载
</el-button>
</template>
</el-table-column>
</el-table>
<el-pagination
class="pone"
:page-size='10'
layout="total, prev, pager, next, jumper"
:total="totals"
:current-page.sync="Page"
@current-change="current_change">
</el-pagination>
</div>
</template>
<style>
.op{
display: flex;
align-items: center;
}
</style>
<script>
import Cookies from "js-cookie";
import {baseUrl} from "../../utils/global"
import axios from "axios"
let base64 = require('js-base64').Base64
export default {
data() {
let checkFile = (rule, value, callback) => {
let size = value.size/1024/1024
if(size > 10) {
//callback(new Error('上传文件不能超过10Mb'))
this.$message({
message: '上传文件不能超过10Mb',
type: 'error'
});
return;
} else {
callback()
}
};
return {
totals:0,
Page:1,
tableData: [],
dialogNewsFormVisible:false,
pushForm:{
newsName:"",
file:"",
fileName:"",
remark:"",
urlName:"interact",
fileType: 1,
state:0,
toType:2,
},
formrules:{
newsName:[
{required: true, message: '请输入主题', trigger: 'blur'}
],
remark:[
{required: true, message: '请输入描述'}
],
file:[
{required:true,message:'请选择文件'},
{ validator: checkFile}
]
}
}
},
methods:{
closeDialog(form){
this.dialogNewsFormVisible = false
this.$refs[form].resetFields();
this.$refs.upload.clearFiles();
},
selectFile(file){
let This = this;
let reader = new FileReader();
reader.readAsDataURL(file.raw);
this.converBase64(file,function (base64) {
This.pushForm.file = base64;
});
this.pushForm.fileName = file.name;
},
converBase64(file,callback) {
let reader = new FileReader();
reader.readAsDataURL(file.raw);
reader.onload = function (e) {
callback.call(this, this.result.substring(this.result.indexOf(",") + 1));
}
},
download(index,row){
axios.get(baseUrl + '/news/download/'+row.id, {
headers: {
"token": Cookies.get("token")
},
responseType: 'blob'
})
.then(res => {
let a = document.createElement("a");
let blob = new Blob([res.data],{type:""});
a.href = URL.createObjectURL(blob);
a.download = row.fileName;
a.click();
})
.catch(err => {
console.log(err);
});
},
upload(form){
this.$refs[form].validate((valid) => {
if (valid) {
this.$confirm('确认提交吗?', '提示', {}).then(() => {
this.$api.getlist.saveFile(this.pushForm).then((res) => {
if(res.code == 200) {
this.$message({message: '操作成功', type: 'success'})
this.closeDialog('pushForm');
this.current_change(0);
}else {
this.$message({message: '操作失败, ' + res.message, type: 'error'})
}
}).catch((res) => {
});
})
}
})
},
changeSwitch(value, index) {
let str = value == 2 ? '启用':value == 0 ? '禁用': '';
this.$confirm('确认'+ str +'?', '提示', {}).then(() => {
this.$api.getlist.updateFileState(this.tableData[index].id,value).then((res) => {
if(res.code == 200) {
this.$message({message: '操作成功', type: 'success'})
this.current_change(this.pageNum);
}else {
this.$message({message: '操作失败, ' + res.message, type: 'error'})
this.tableData[index].state = this.tableData[index].state == 0 ? 2 : 0;
}
}).catch((res) => {
});
}).catch(() => {
this.tableData[index].state = this.tableData[index].state == 0 ? 2 : 0;
})
},
current_change(s){
var data={
pageNum:s,
pageSize:10
}
this.$api.getlist.getInteracts(data).then((res) => {
this.totals=res.data.total
this.page=res.data.total.pageNum
this.tableData=res.data.list
}).catch((res) => {
});
},
stateFormat(row, column) {
if (row.state === 0) {
return '停用'
} else if (row.state === 1) {
return '默认'
} else if (row.state === 2) {
return '启用'
}
}
},
created(){
var data={
pageNum:1,
pageSize:10
}
this.$api.getlist.getInteracts(data).then((res) => {
this.totals = res.data.total
this.page = res.data.total.pageNum
this.tableData = res.data.list
this.tableData.forEach(element => {
this.tableData.state = this.tableData.state !== 0;
});
}).catch((res) => {
});
}
}
</script>
<template> <template>
<div> <div>
<div class="op" style="margin-left: 10px">
<el-button type="primary" size="mini" @click="dialogNewsFormVisible = true">发布<i class="el-icon-upload el-icon--right"></i></el-button>
</div>
<el-dialog title="发布新闻" width="40%" :visible.sync="dialogNewsFormVisible">
<el-form ref="pushForm" :model="pushForm" label-width="100px" size="mini" :rules = "formrules">
<el-form-item label="新闻主题" prop = "newsName">
<el-input v-model="pushForm.newsName" size = "medium"></el-input>
</el-form-item>
<el-form-item label="访问地址" prop = "urlName">
<el-select v-model="pushForm.urlName" placeholder="请选择"
style="width: 100%;">
<el-option v-for="item in urlNameData" :key="item.val"
:label="item.text" :value="item.val">
</el-option>
</el-select>
</el-form-item>
<el-form-item label="附件上传" prop = "file">
<el-upload
ref="upload"
action=""
:auto-upload="false"
:limit="1"
align="left"
accept = "application/msword,application/vnd.openxmlformats-officedocument.wordprocessingml.document"
:on-change = "selectFile"
>
<el-button slot="trigger" size="small" class = "el-icon-upload2" type="success">选取文件</el-button><span style="margin-left: 10px" class="el-upload__tip">只能上传word文件,且不超过5Mb</span>
</el-upload>
</el-form-item>
<el-form-item size="large">
<el-button type = "info" @click = "upload('pushForm')">立即发布</el-button>
<el-button @click = "closeDialog('pushForm')">取消</el-button>
</el-form-item>
</el-form>
</el-dialog>
<el-table <el-table
:data="tableData" :data="tableData"
stripe stripe
style="width: 100%"> style="width: 100%">
<el-table-column
prop="id"
v-if="false"
>
</el-table-column>
<el-table-column <el-table-column
prop="newsName" prop="newsName"
label="标题" label="标题"
align="center"
> >
</el-table-column> </el-table-column>
<el-table-column
prop="urlName"
label="地址"
align="center"
:formatter="urlFormat"
>
</el-table-column>
<el-table-column <el-table-column
prop="createTime" prop="createTime"
label="时间" label="创建时间"
> align="center"
>
</el-table-column> </el-table-column>
<el-table-column <el-table-column
prop="createBy" prop="createBy"
label="操作人" label="操作人"
> align="center"
>
</el-table-column>
<el-table-column
prop="todayCount"
label="今日访问量"
align = "right"
>
</el-table-column>
<el-table-column
prop="allCount"
label="总访问量"
align = "right"
>
</el-table-column>
<el-table-column label="状态" align="center">
<template slot-scope="scope">
<el-switch
v-model="scope.row.state"
active-color="#13ce66" inactive-color="#ff4949"
active-text = "启用" inactive-text="禁用"
:inactive-value = "0" :active-value = "2"
@change="changeSwitch(scope.row.state,scope.$index)">
</el-switch>
</template>
</el-table-column> </el-table-column>
<el-table-column label="操作" align="center"
<el-table-column min-width="100">
width="180"
label="操作">
<template slot-scope="scope"> <template slot-scope="scope">
<el-button <el-button
type="primary"
size="mini" size="mini"
icon="el-icon-edit-outline" type="info"
@click="handle(scope.$index, scope.row)">编辑</el-button> @click="preview(scope.$index, scope.row)">预览
</el-button>
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
<el-pagination <el-pagination
class="pone" class="pone"
:page-size='10' :page-size='10'
layout="total, prev, pager, next, jumper" layout="total, prev, pager, next, jumper"
:total="totals" :total="totals"
:current-page.sync="Page" :current-page.sync="Page"
@current-change="current_change" @current-change="current_change">
> </el-pagination>
</el-pagination> <el-dialog width="60%" :visible.sync="preViewVisible">
<div v-html = "content"></div>
</el-dialog>
</div> </div>
</template> </template>
<style>
.op{
display: flex;
align-items: center;
}
</style>
<script> <script>
import Cookies from "js-cookie";
import {baseUrl} from "../../utils/global"
import axios from "axios"
let base64 = require('js-base64').Base64
export default { export default {
data() { data() {
let checkFile = (rule, value, callback) => {
let size = value.size/1024/1024
if(size > 5) {
this.$message({
message: '上传文件不能超过5Mb',
type: 'error'
});
return;
} else {
callback()
}
};
return { return {
totals:0, totals:0,
Page:1, Page:1,
tableData: [] tableData: [],
dialogNewsFormVisible:false,
preViewVisible:false,
content:"",
urlNameData:[{val:'policy',text:'政策解读'},{val:'index',text:'主页'}],
pushForm:{
newsName:"",
file:"",
fileName:"",
remark:"",
urlName:"",
fileType: 1,
state:0,
toType:1
},
formrules:{
newsName:[
{required: true, message: '请输入主题', trigger: 'blur'}
],
urlName:[
{required: true, message: '请选择地址',trigger: 'change blur'}
],
file:[
{required:true,message:'请选择文件'},
{ validator: checkFile}
]
}
} }
}, },
methods:{ methods:{
current_change(s){ closeDialog(form){
var data={ this.dialogNewsFormVisible = false;
pageNum:s, this.$refs[form].resetFields();
pageSize:10 this.$refs.upload.clearFiles();
},
selectFile(file){
let This = this;
let reader = new FileReader();
reader.readAsDataURL(file.raw);
this.converBase64(file,function (base64) {
This.pushForm.file = base64;
});
this.pushForm.fileName = file.name;
},
converBase64(file,callback) {
let reader = new FileReader();
reader.readAsDataURL(file.raw);
reader.onload = function (e) {
callback.call(this, this.result.substring(this.result.indexOf(",") + 1));
} }
this.$api.getlist.newsList(data).then((res) => { },
this.tableData=res.data.list urlFormat(row,column) {
switch (row.urlName){
}).catch((res) => { case 'index':
return '主页'
}); case 'policy':
return '政策解读'
default :
return '';
}
},
preview(index,row){
this.preViewVisible = true;
this.$api.getlist.newsPreView(row.id).then((res)=>{
if(res.code == 200) {
this.content = res.data.htmlStr;
}
}).catch((res)=>{
})
},
changeSwitch(value,index) {
let str = value == 2 ? '启用':value == 0 ? '禁用': '';
this.$confirm('确认'+ str +'?', '提示', {}).then(() => {
this.$api.getlist.updateFileState(this.tableData[index].id,value).then((res) => {
if(res.code == 200) {
this.$message({message: '操作成功', type: 'success'})
this.current_change(this.pageNum);
}else {
this.$message({message: '操作失败, ' + res.message, type: 'error'})
this.tableData[index].state = this.tableData[index].state == 0 ? 2 : 0;
}
}).catch((res) => {
});
}).catch(() => {
this.tableData[index].state = this.tableData[index].state == 0 ? 2 : 0;
})
},
upload(form){
this.$refs[form].validate((valid) => {
if (valid) {
this.$confirm('确认提交吗?', '提示', {}).then(() => {
this.$api.getlist.saveFile(this.pushForm).then((res) => {
if(res.code == 200) {
this.$message({message: '操作成功', type: 'success'})
this.closeDialog('pushForm');
this.current_change(0);
}else {
this.$message({message: '操作失败, ' + res.message, type: 'error'})
}
}).catch((res) => {
});
})
}
})
},
current_change(s){
var data={
pageNum:s,
pageSize:10
}
this.$api.getlist.newsList(data).then((res) => {
if(res.code == 200) {
this.totals = res.data.total
this.page = res.data.total.pageNum
this.tableData = res.data.list
}
}).catch((res) => {
});
},
stateFormat(row, column) {
if (row.state === 0) {
return '停用'
} else if (row.state === 1) {
return '默认'
} else if (row.state === 2) {
return '启用'
} }
},
created(){
var data={
pageNum:1,
pageSize:10
} }
this.$api.getlist.newsList(data).then((res) => { },
this.tableData=res.data.list created(){
var data={
}).catch((res) => { pageNum:1,
pageSize:10
}); }
} this.$api.getlist.newsList(data).then((res) => {
if(res.code == 200) {
this.totals = res.data.total
this.page = res.data.total.pageNum
this.tableData = res.data.list
this.tableData.forEach(element => {
this.tableData.state = this.tableData.state !== 0;
});
}
}).catch((res) => {
});
}
} }
</script> </script>
\ No newline at end of file
<template>
<div :v-html="content"></div>
</template>
<script>
export default {
data() {
return {
content:""
}
},
methods: {
created() {
}
}
}
</script>
...@@ -48,7 +48,7 @@ ...@@ -48,7 +48,7 @@
<el-input v-model="form.pay_years"></el-input> <el-input v-model="form.pay_years"></el-input>
</el-form-item> </el-form-item>
<el-form-item label="补缴金额"> <el-form-item label="补缴金额">
<el-input v-model="form.pay_num"></el-input> <el-input v-model="form.pay_numTol"></el-input>
</el-form-item> </el-form-item>
<el-form-item label="银行账号"> <el-form-item label="银行账号">
<el-input v-model="form.bank_Account"></el-input> <el-input v-model="form.bank_Account"></el-input>
......
...@@ -169,9 +169,6 @@ ...@@ -169,9 +169,6 @@
for(var i in res.data.list){ for(var i in res.data.list){
res.data.list[i].idcard=this.decrypt(res.data.list[i].idcard) res.data.list[i].idcard=this.decrypt(res.data.list[i].idcard)
res.data.list[i].name=this.decrypt(res.data.list[i].name) res.data.list[i].name=this.decrypt(res.data.list[i].name)
var d=new Date(res.data.list[i].createtime)
var mon=(parseInt(d.getMonth()) + 1)
res.data.list[i].createtime=d.getFullYear()+"-"+mon+"-"+d.getDate()+" "+d.getHours() + ':' + d.getMinutes() + ':' + d.getSeconds();
res.data.list[i].recordtype=this.getType(res.data.list[i].recordtype) res.data.list[i].recordtype=this.getType(res.data.list[i].recordtype)
} }
this.tableData=res.data.list this.tableData=res.data.list
...@@ -241,9 +238,6 @@ ...@@ -241,9 +238,6 @@
for(var i in res.data.list){ for(var i in res.data.list){
res.data.list[i].idcard=this.decrypt(res.data.list[i].idcard) res.data.list[i].idcard=this.decrypt(res.data.list[i].idcard)
res.data.list[i].name=this.decrypt(res.data.list[i].name) res.data.list[i].name=this.decrypt(res.data.list[i].name)
var d=new Date(res.data.list[i].createtime)
var mon=(parseInt(d.getMonth()) + 1)
res.data.list[i].createtime=d.getFullYear()+"-"+mon+"-"+d.getDate()+d.getHours() + ':' + d.getMinutes() + ':' + d.getSeconds();
res.data.list[i].recordtype=this.getType(res.data.list[i].recordtype) res.data.list[i].recordtype=this.getType(res.data.list[i].recordtype)
} }
this.tableData=res.data.list this.tableData=res.data.list
...@@ -434,9 +428,6 @@ ...@@ -434,9 +428,6 @@
for(var i in res.data.list){ for(var i in res.data.list){
res.data.list[i].idcard=this.decrypt(res.data.list[i].idcard) res.data.list[i].idcard=this.decrypt(res.data.list[i].idcard)
res.data.list[i].name=this.decrypt(res.data.list[i].name) res.data.list[i].name=this.decrypt(res.data.list[i].name)
var d=new Date(res.data.list[i].createtime)
var mon=(parseInt(d.getMonth()) + 1)
res.data.list[i].createtime=d.getFullYear()+"-"+mon+"-"+d.getDate()+" "+d.getHours() + ':' + d.getMinutes() + ':' + d.getSeconds();
res.data.list[i].recordtype=this.getType(res.data.list[i].recordtype) res.data.list[i].recordtype=this.getType(res.data.list[i].recordtype)
} }
console.log(12312312) console.log(12312312)
......
...@@ -31,7 +31,7 @@ ...@@ -31,7 +31,7 @@
<div class="masks"></div> <div class="masks"></div>
<el-form ref="form" :model="form" class="form" label-width="auto"> <el-form ref="form" :model="form" class="form" label-width="auto">
<el-form-item label="原户籍地地址"> <el-form-item label="原户籍地地址">
<el-input v-model="form.old_Address"></el-input> <el-input v-model="form.address"></el-input>
</el-form-item> </el-form-item>
<el-form-item label="所属银行"> <el-form-item label="所属银行">
<el-input v-model="form.bank_Name"></el-input> <el-input v-model="form.bank_Name"></el-input>
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment