减少项目中的多余文件,优化打包

main
于阔 9 months ago
parent 75e69a41f0
commit 488c44ca9b

@ -8,10 +8,10 @@ VITE_API_BASE_PATH=dev
VITE_BASE_PATH=./
# 是否删除debugger
VITE_DROP_DEBUGGER=true
VITE_DROP_DEBUGGER=false
# 是否删除console.log
VITE_DROP_CONSOLE=true
VITE_DROP_CONSOLE=false
# 是否sourcemap
VITE_SOURCEMAP=true

@ -0,0 +1,169 @@
import { resolve } from 'path'
import { loadEnv } from 'vite'
import type { UserConfig, ConfigEnv } from 'vite'
import Vue from '@vitejs/plugin-vue'
import VueJsx from '@vitejs/plugin-vue-jsx'
import progress from 'vite-plugin-progress'
// import EslintPlugin from 'vite-plugin-eslint'
import { ViteEjsPlugin } from "vite-plugin-ejs"
import PurgeIcons from 'vite-plugin-purge-icons'
import VueI18nPlugin from "@intlify/unplugin-vue-i18n/vite"
import { createSvgIconsPlugin } from 'vite-plugin-svg-icons'
import { createStyleImportPlugin, ElementPlusResolve } from 'vite-plugin-style-import'
import UnoCSS from 'unocss/vite'
// https://vitejs.dev/config/
const root = process.cwd()
function pathResolve(dir: string) {
return resolve(root, '.', dir)
}
export default ({ command, mode }: ConfigEnv): UserConfig => {
let env = {} as any
const isBuild = command === 'build'
if (!isBuild) {
env = loadEnv((process.argv[3] === '--mode' ? process.argv[4] : process.argv[3]), root)
} else {
env = loadEnv(mode, root)
}
return {
base: env.VITE_BASE_PATH,
plugins: [
Vue({
script: {
// 开启defineModel
defineModel: true
}
}),
VueJsx(),
progress(),
createStyleImportPlugin({
resolves: [ElementPlusResolve()],
libs: [{
libraryName: 'element-plus',
esModule: true,
resolveStyle: (name) => {
if (name === 'click-outside') {
return ''
}
return `element-plus/es/components/${name.replace(/^el-/, '')}/style/css`
}
}]
}),
// EslintPlugin({
// cache: false,
// include: ['src/**/*.vue', 'src/**/*.ts', 'src/**/*.tsx'] // 检查的文件
// }),
VueI18nPlugin({
runtimeOnly: true,
compositionOnly: true,
include: [resolve(__dirname, 'src/locales/**')]
}),
createSvgIconsPlugin({
iconDirs: [pathResolve('src/assets/svgs')],
symbolId: 'icon-[dir]-[name]',
svgoOptions: true
}),
PurgeIcons(),
ViteEjsPlugin({
title: env.VITE_APP_TITLE
}),
UnoCSS(),
// sveltekit(),
],
css: {
preprocessorOptions: {
less: {
additionalData: '@import "./src/styles/variables.module.less";',
javascriptEnabled: true
}
}
},
resolve: {
extensions: ['.mjs', '.js', '.ts', '.jsx', '.tsx', '.json', '.less', '.css'],
alias: [
{
find: 'vue-i18n',
replacement: 'vue-i18n/dist/vue-i18n.cjs.js'
},
{
find: /\@\//,
replacement: `${pathResolve('src')}/`
}
]
},
build: {
minify: 'terser',
outDir: env.VITE_OUT_DIR || 'dist',
sourcemap: env.VITE_SOURCEMAP === 'true' ? 'inline' : false,
// brotliSize: false,
terserOptions: {
compress: {
drop_debugger: env.VITE_DROP_DEBUGGER === 'true',
drop_console: env.VITE_DROP_CONSOLE === 'true'
}
}
},
server: {
port: 4000,
proxy: {
// 选项写法
'/api': {
//target: 'http://214.129.16.68:8088/rdvs',
// target: 'http://172.16.87.111:8083/ordb',
target: 'http://localhost:8082/srdb',
// target: 'http://172.16.87.114:8095/ordb',
// target: 'http://172.16.87.111:8080/portal',
// target: 'http://localhost:8082/portal',
// target: 'http://192.168.183.136:8082/portal',
changeOrigin: true,
rewrite: path => path.replace(/^\/api/, '')
},
'/pro': {
//target: 'http://214.129.16.68:8088/rdvs',
// target: 'http://172.16.87.111:8083/ordb',
target: 'http://localhost:8082/srdb',
// target: 'http://172.16.87.114:8095/ordb',
// target: 'http://172.16.87.111:8080/portal',
// target: 'http://localhost:8082/portal',
// target: 'http://172.20.10.4:8082/portal',
// target: 'http://192.168.183.136:8082/portal',
changeOrigin: true,
rewrite: path => path.replace(/^\/pro/, '')
},
'/dev': {
target: 'http://172.16.87.114:8095/ordb',
changeOrigin: true,
rewrite: path => path.replace(/^\/dev/, '')
},
},
hmr: {
overlay: false
},
host: '0.0.0.0'
},
optimizeDeps: {
include: [
'vue',
'vue-router',
'vue-types',
'element-plus/es/locale/lang/zh-cn',
'element-plus/es/locale/lang/en',
'@iconify/iconify',
'@vueuse/core',
'axios',
'qs',
'echarts',
'echarts-wordcloud',
'qrcode',
'@wangeditor/editor',
'@wangeditor/editor-for-vue',
'vue-json-pretty',
'@zxcvbn-ts/core',
'dayjs'
]
}
}
}

@ -1,18 +0,0 @@
import { createProdMockServer } from 'vite-plugin-mock/es/createProdMockServer'
const modules = import.meta.glob('./**/*.ts', {
import: 'default',
eager: true
})
const mockModules: any[] = []
Object.keys(modules).forEach(async (key) => {
if (key.includes('_')) {
return
}
mockModules.push(...(modules[key] as any))
})
export function setupProdMockServer() {
createProdMockServer(mockModules)
}

@ -1,89 +0,0 @@
import config from '@/config/axios/config'
import { MockMethod } from 'vite-plugin-mock'
const { code } = config
const timeout = 1000
export default [
// 分析页统计接口
{
url: '/analysis/total',
method: 'get',
timeout,
response: () => {
return {
code: code,
data: {
users: 102400,
messages: 81212,
moneys: 9280,
shoppings: 13600
}
}
}
},
// 用户来源
{
url: '/analysis/userAccessSource',
method: 'get',
timeout,
response: () => {
return {
code: code,
data: [
{ value: 1000, name: 'analysis.directAccess' },
{ value: 310, name: 'analysis.mailMarketing' },
{ value: 234, name: 'analysis.allianceAdvertising' },
{ value: 135, name: 'analysis.videoAdvertising' },
{ value: 1548, name: 'analysis.searchEngines' }
]
}
}
},
// 每周用户活跃量
{
url: '/analysis/weeklyUserActivity',
method: 'get',
timeout,
response: () => {
return {
code: code,
data: [
{ value: 13253, name: 'analysis.monday' },
{ value: 34235, name: 'analysis.tuesday' },
{ value: 26321, name: 'analysis.wednesday' },
{ value: 12340, name: 'analysis.thursday' },
{ value: 24643, name: 'analysis.friday' },
{ value: 1322, name: 'analysis.saturday' },
{ value: 1324, name: 'analysis.sunday' }
]
}
}
},
// 每月销售额
{
url: '/analysis/monthlySales',
method: 'get',
timeout,
response: () => {
return {
code: code,
data: [
{ estimate: 100, actual: 120, name: 'analysis.january' },
{ estimate: 120, actual: 82, name: 'analysis.february' },
{ estimate: 161, actual: 91, name: 'analysis.march' },
{ estimate: 134, actual: 154, name: 'analysis.april' },
{ estimate: 105, actual: 162, name: 'analysis.may' },
{ estimate: 160, actual: 140, name: 'analysis.june' },
{ estimate: 165, actual: 145, name: 'analysis.july' },
{ estimate: 114, actual: 250, name: 'analysis.august' },
{ estimate: 163, actual: 134, name: 'analysis.september' },
{ estimate: 185, actual: 56, name: 'analysis.october' },
{ estimate: 118, actual: 99, name: 'analysis.november' },
{ estimate: 123, actual: 123, name: 'analysis.december' }
]
}
}
}
] as MockMethod[]

@ -1,205 +0,0 @@
import config from '@/config/axios/config'
import { MockMethod } from 'vite-plugin-mock'
import { toAnyString } from '@/utils'
import Mock from 'mockjs'
const { code } = config
const departmentList: any = []
const citys = ['厦门总公司', '北京分公司', '上海分公司', '福州分公司', '深圳分公司', '杭州分公司']
for (let i = 0; i < 5; i++) {
departmentList.push({
// 部门名称
departmentName: citys[i],
id: toAnyString(),
createTime: '@datetime',
// 状态
status: Mock.Random.integer(0, 1),
// 备注
remark: '@cword(10, 15)',
children: [
{
// 部门名称
departmentName: '研发部',
createTime: '@datetime',
// 状态
status: Mock.Random.integer(0, 1),
id: toAnyString(),
remark: '@cword(10, 15)'
},
{
// 部门名称
departmentName: '产品部',
createTime: '@datetime',
// 状态
status: Mock.Random.integer(0, 1),
id: toAnyString(),
remark: '@cword(10, 15)'
},
{
// 部门名称
departmentName: '运营部',
createTime: '@datetime',
// 状态
status: Mock.Random.integer(0, 1),
id: toAnyString(),
remark: '@cword(10, 15)'
},
{
// 部门名称
departmentName: '市场部',
createTime: '@datetime',
// 状态
status: Mock.Random.integer(0, 1),
id: toAnyString(),
remark: '@cword(10, 15)'
},
{
// 部门名称
departmentName: '销售部',
createTime: '@datetime',
// 状态
status: Mock.Random.integer(0, 1),
id: toAnyString(),
remark: '@cword(10, 15)'
},
{
// 部门名称
departmentName: '客服部',
createTime: '@datetime',
// 状态
status: Mock.Random.integer(0, 1),
id: toAnyString(),
remark: '@cword(10, 15)'
}
]
})
}
export default [
// 列表接口
{
url: '/department/list',
method: 'get',
response: () => {
return {
code: code,
data: {
list: departmentList
}
}
}
},
{
url: '/department/table/list',
method: 'get',
response: () => {
return {
code: code,
data: {
list: departmentList,
total: 5
}
}
}
},
{
url: '/department/users',
method: 'get',
timeout: 1000,
response: ({ query }) => {
const { pageSize } = query
// 根据pageSize来创建数据
const mockList: any = []
for (let i = 0; i < pageSize; i++) {
mockList.push(
Mock.mock({
// 用户名
username: '@cname',
// 账号
account: '@first',
// 邮箱
email: '@EMAIL',
// 创建时间
createTime: '@datetime',
// 角色
role: '@first',
// 用户id
id: toAnyString()
})
)
}
return {
code: code,
data: {
total: 100,
list: mockList
}
}
}
},
// 保存接口
{
url: '/department/user/save',
method: 'post',
timeout: 1000,
response: () => {
return {
code: code,
data: 'success'
}
}
},
// 删除接口
{
url: '/department/user/delete',
method: 'post',
response: ({ body }) => {
const ids = body.ids
if (!ids) {
return {
code: 500,
message: '请选择需要删除的数据'
}
} else {
return {
code: code,
data: 'success'
}
}
}
},
// 保存接口
{
url: '/department/save',
method: 'post',
timeout: 1000,
response: () => {
return {
code: code,
data: 'success'
}
}
},
// 删除接口
{
url: '/department/delete',
method: 'post',
response: ({ body }) => {
const ids = body.ids
if (!ids) {
return {
code: 500,
message: '请选择需要删除的数据'
}
} else {
return {
code: code,
data: 'success'
}
}
}
}
] as MockMethod[]

@ -1,63 +0,0 @@
import config from '@/config/axios/config'
import { MockMethod } from 'vite-plugin-mock'
const { code } = config
const timeout = 1000
const dictObj: Recordable = {
importance: [
{
value: 0,
label: 'tableDemo.commonly'
},
{
value: 1,
label: 'tableDemo.good'
},
{
value: 2,
label: 'tableDemo.important'
}
]
}
export default [
// 字典接口
{
url: '/dict/list',
method: 'get',
timeout,
response: () => {
return {
code: code,
data: dictObj
}
}
},
// 获取某个字典
{
url: '/dict/one',
method: 'get',
timeout,
response: () => {
return {
code: code,
data: [
{
label: 'test1',
value: 0
},
{
label: 'test2',
value: 1
},
{
label: 'test3',
value: 2
}
]
}
}
}
] as MockMethod[]

@ -1,265 +0,0 @@
import config from '@/config/axios/config'
import { MockMethod } from 'vite-plugin-mock'
import Mock from 'mockjs'
const { code } = config
const timeout = 1000
export default [
// 列表接口
{
url: '/menu/list',
method: 'get',
timeout,
response: () => {
return {
code: code,
data: {
list: [
{
path: '/dashboard',
component: '#',
redirect: '/dashboard/analysis',
name: 'Dashboard',
status: Mock.Random.integer(0, 1),
id: 1,
title: '首页',
meta: {
title: '首页',
icon: 'ant-design:dashboard-filled',
alwaysShow: true
},
children: [
{
path: 'analysis',
component: 'views/Dashboard/Analysis',
name: 'Analysis',
status: Mock.Random.integer(0, 1),
id: 2,
title: '分析页',
meta: {
title: '分析页',
noCache: true
}
},
{
path: 'workplace',
component: 'views/Dashboard/Workplace',
name: 'Workplace',
status: Mock.Random.integer(0, 1),
id: 3,
title: '工作台',
meta: {
title: '工作台',
noCache: true
}
}
]
},
{
path: '/external-link',
component: '#',
title: '文档',
meta: {
title: '文档',
icon: 'clarity:document-solid'
},
name: 'ExternalLink',
status: Mock.Random.integer(0, 1),
id: 4,
children: [
{
path: 'https://element-plus-admin-doc.cn/',
name: 'DocumentLink',
status: Mock.Random.integer(0, 1),
id: 5,
title: '文档',
meta: {
title: '文档'
}
}
]
},
{
path: '/level',
component: '#',
redirect: '/level/menu1/menu1-1/menu1-1-1',
name: 'Level',
status: Mock.Random.integer(0, 1),
id: 6,
title: '菜单',
meta: {
title: '菜单',
icon: 'carbon:skill-level-advanced'
},
children: [
{
path: 'menu1',
name: 'Menu1',
component: '##',
status: Mock.Random.integer(0, 1),
id: 7,
redirect: '/level/menu1/menu1-1/menu1-1-1',
title: '菜单1',
meta: {
title: '菜单1'
},
children: [
{
path: 'menu1-1',
name: 'Menu11',
component: '##',
status: Mock.Random.integer(0, 1),
id: 8,
redirect: '/level/menu1/menu1-1/menu1-1-1',
title: '菜单1-1',
meta: {
title: '菜单1-1',
alwaysShow: true
},
children: [
{
path: 'menu1-1-1',
name: 'Menu111',
component: 'views/Level/Menu111',
status: Mock.Random.integer(0, 1),
id: 9,
permission: ['edit', 'add', 'delete'],
title: '菜单1-1-1',
meta: {
title: '菜单1-1-1'
}
}
]
},
{
path: 'menu1-2',
name: 'Menu12',
component: 'views/Level/Menu12',
status: Mock.Random.integer(0, 1),
id: 10,
permission: ['edit', 'add', 'delete'],
title: '菜单1-2',
meta: {
title: '菜单1-2'
}
}
]
},
{
path: 'menu2',
name: 'Menu2Demo',
component: 'views/Level/Menu2',
status: Mock.Random.integer(0, 1),
id: 11,
permission: ['edit', 'add', 'delete'],
title: '菜单2',
meta: {
title: '菜单2'
}
}
]
},
{
path: '/example',
component: '#',
redirect: '/example/example-dialog',
name: 'Example',
status: Mock.Random.integer(0, 1),
id: 12,
title: '综合示例',
meta: {
title: '综合示例',
icon: 'ep:management',
alwaysShow: true
},
children: [
{
path: 'example-dialog',
component: 'views/Example/Dialog/ExampleDialog',
name: 'ExampleDialog',
status: Mock.Random.integer(0, 1),
id: 13,
title: '综合示例-弹窗',
permission: ['edit', 'add', 'delete'],
meta: {
title: '综合示例-弹窗',
permission: ['edit', 'add']
}
},
{
path: 'example-page',
component: 'views/Example/Page/ExamplePage',
name: 'ExamplePage',
status: Mock.Random.integer(0, 1),
id: 14,
permission: ['edit', 'add', 'delete'],
title: '综合示例-页面',
meta: {
title: '综合示例-页面',
permission: ['edit', 'add']
}
},
{
path: 'example-add',
component: 'views/Example/Page/ExampleAdd',
name: 'ExampleAdd',
status: Mock.Random.integer(0, 1),
id: 15,
permission: ['edit', 'add', 'delete'],
title: '综合示例-新增',
meta: {
title: '综合示例-新增',
noTagsView: true,
noCache: true,
hidden: true,
showMainRoute: true,
activeMenu: '/example/example-page',
permission: ['delete', 'add']
}
},
{
path: 'example-edit',
component: 'views/Example/Page/ExampleEdit',
name: 'ExampleEdit',
status: Mock.Random.integer(0, 1),
id: 16,
permission: ['edit', 'add', 'delete'],
title: '综合示例-编辑',
meta: {
title: '综合示例-编辑',
noTagsView: true,
noCache: true,
hidden: true,
showMainRoute: true,
activeMenu: '/example/example-page',
permission: ['delete', 'add']
}
},
{
path: 'example-detail',
component: 'views/Example/Page/ExampleDetail',
name: 'ExampleDetail',
status: Mock.Random.integer(0, 1),
id: 17,
permission: ['edit', 'add', 'delete'],
title: '综合示例-详情',
meta: {
title: '综合示例-详情',
noTagsView: true,
noCache: true,
hidden: true,
showMainRoute: true,
activeMenu: '/example/example-page',
permission: ['delete', 'edit']
}
}
]
}
]
}
}
}
}
] as MockMethod[]

@ -1,64 +0,0 @@
import config from '@/config/axios/config'
import { MockMethod } from 'vite-plugin-mock'
const timeout = 600000
const { code } = config
export default [
{
url: '/request/1',
method: 'get',
timeout,
response: () => {
return {
code: code,
data: 'request-1'
}
}
},
{
url: '/request/2',
method: 'get',
timeout,
response: () => {
return {
code: code,
data: 'request-2'
}
}
},
{
url: '/request/3',
method: 'get',
timeout,
response: () => {
return {
code: code,
data: 'request-3'
}
}
},
{
url: '/request/4',
method: 'get',
timeout,
response: () => {
return {
code: code,
data: 'request-4'
}
}
},
{
url: '/request/5',
method: 'get',
timeout,
response: () => {
return {
code: code,
data: 'request-5'
}
}
}
] as MockMethod[]

File diff suppressed because it is too large Load Diff

@ -1,256 +0,0 @@
import config from '@/config/axios/config'
import { MockMethod } from 'vite-plugin-mock'
import { toAnyString } from '@/utils'
import Mock from 'mockjs'
const { code } = config
const timeout = 1000
const count = 100
const baseContent =
'<p>I am testing data, I am testing data.</p><p><img src="https://wpimg.wallstcn.com/4c69009c-0fd4-4153-b112-6cb53d1cf943"></p>'
interface ListProps {
id: string
author: string
title: string
content: string
importance: number
display_time: string
pageviews: number
image_uri: string
}
interface TreeListProps {
id: string
author: string
title: string
content: string
importance: number
display_time: string
pageviews: number
children: TreeListProps[]
}
let List: ListProps[] = []
for (let i = 0; i < count; i++) {
List.push(
Mock.mock({
id: toAnyString(),
// timestamp: +Mock.Random.date('T'),
author: '@first',
title: '@title(5, 10)',
content: baseContent,
importance: '@integer(1, 3)',
display_time: '@datetime',
pageviews: '@integer(100, 500)',
image_uri: Mock.Random.image('@integer(100, 500)x@integer(100, 500)')
})
)
}
const treeList: TreeListProps[] = []
for (let i = 0; i < count; i++) {
treeList.push(
Mock.mock({
id: toAnyString(),
// timestamp: +Mock.Random.date('T'),
author: '@first',
title: '@title(5, 10)',
content: baseContent,
importance: '@integer(1, 3)',
display_time: '@datetime',
pageviews: '@integer(300, 5000)',
children: [
{
id: toAnyString(),
// timestamp: +Mock.Random.date('T'),
author: '@first',
title: '@title(5, 10)',
content: baseContent,
importance: '@integer(1, 3)',
display_time: '@datetime',
pageviews: '@integer(300, 5000)',
children: [
{
id: toAnyString(),
// timestamp: +Mock.Random.date('T'),
author: '@first',
title: '@title(5, 10)',
content: baseContent,
importance: '@integer(1, 3)',
display_time: '@datetime',
pageviews: '@integer(300, 5000)'
},
{
id: toAnyString(),
// timestamp: +Mock.Random.date('T'),
author: '@first',
title: '@title(5, 10)',
content: baseContent,
importance: '@integer(1, 3)',
display_time: '@datetime',
pageviews: '@integer(300, 5000)'
}
]
},
{
id: toAnyString(),
// timestamp: +Mock.Random.date('T'),
author: '@first',
title: '@title(5, 10)',
content: baseContent,
importance: '@integer(1, 3)',
display_time: '@datetime',
pageviews: '@integer(300, 5000)'
},
{
id: toAnyString(),
// timestamp: +Mock.Random.date('T'),
author: '@first',
title: '@title(5, 10)',
content: baseContent,
importance: '@integer(1, 3)',
display_time: '@datetime',
pageviews: '@integer(300, 5000)'
},
{
id: toAnyString(),
// timestamp: +Mock.Random.date('T'),
author: '@first',
title: '@title(5, 10)',
content: baseContent,
importance: '@integer(1, 3)',
display_time: '@datetime',
pageviews: '@integer(300, 5000)'
}
]
// image_uri
})
)
}
export default [
// 树形列表接口
{
url: '/example/treeList',
method: 'get',
timeout,
response: ({ query }) => {
const { title, pageIndex, pageSize } = query
const mockList = treeList.filter((item) => {
if (title && item.title.indexOf(title) < 0) return false
return true
})
const pageList = mockList.filter(
(_, index) => index < pageSize * pageIndex && index >= pageSize * (pageIndex - 1)
)
return {
code: code,
data: {
total: mockList.length,
list: pageList
}
}
}
},
// 列表接口
{
url: '/example/list',
method: 'get',
timeout,
response: ({ query }) => {
const { title, pageIndex, pageSize } = query
const mockList = List.filter((item) => {
if (title && item.title.indexOf(title) < 0) return false
return true
})
const pageList = mockList.filter(
(_, index) => index < pageSize * pageIndex && index >= pageSize * (pageIndex - 1)
)
return {
code: code,
data: {
total: mockList.length,
list: pageList
}
}
}
},
// 保存接口
{
url: '/example/save',
method: 'post',
timeout,
response: ({ body }) => {
if (!body.id) {
List = [
Object.assign(body, {
id: toAnyString()
})
].concat(List)
return {
code: code,
data: 'success'
}
} else {
List.map((item) => {
if (item.id === body.id) {
for (const key in item) {
item[key] = body[key]
}
}
})
return {
code: code,
data: 'success'
}
}
}
},
// 详情接口
{
url: '/example/detail',
method: 'get',
response: ({ query }) => {
const { id } = query
for (const example of List) {
if (example.id === id) {
return {
code: code,
data: example
}
}
}
}
},
// 删除接口
{
url: '/example/delete',
method: 'post',
response: ({ body }) => {
const ids = body.ids
if (!ids) {
return {
code: 500,
message: '请选择需要删除的数据'
}
} else {
let i = List.length
while (i--) {
if (ids.indexOf(List[i].id) !== -1) {
List.splice(i, 1)
}
}
return {
code: code,
data: 'success'
}
}
}
}
] as MockMethod[]

@ -1,135 +0,0 @@
import config from '@/config/axios/config'
import { MockMethod } from 'vite-plugin-mock'
const { code } = config
const timeout = 1000
const List: {
username: string
password: string
role: string
roleId: string
permissions: string | string[]
}[] = [
{
username: 'admin',
password: 'o9%2B2oAvFf9DHDj1yBTJHhw%3D%3D',
role: 'admin',
roleId: '1',
permissions: ['*.*.*']
},
{
username: 'test',
password: 'test',
role: 'test',
roleId: '2',
permissions: ['example:dialog:create', 'example:dialog:delete']
}
]
export default [
// 列表接口
{
url: '/user/list',
method: 'get',
response: ({ query }) => {
const { username, pageIndex, pageSize } = query
const mockList = List.filter((item) => {
if (username && item.username.indexOf(username) < 0) return false
return true
})
const pageList = mockList.filter(
(_, index) => index < pageSize * pageIndex && index >= pageSize * (pageIndex - 1)
)
return {
code: code,
data: {
total: mockList.length,
list: pageList
}
}
}
},
// 登录接口
{
url: '/user/login',
method: 'post',
timeout,
response: ({ body }) => {
const data = body
let hasUser = false
for (const user of List) {
if (user.username === data.username && user.password === data.password) {
hasUser = true
return {
code: code,
data: user
}
}
}
if (!hasUser) {
return {
code: 500,
message: '账号或密码错误'
}
}
}
},
{
url: '/mobile/login',
method: 'post',
timeout,
response: ({ body }) => {
debugger
const data = body
let hasUser = false
for (const user of List) {
if (user.username === data.username && user.password === data.password) {
hasUser = true
return {
code: code,
data: user
}
}
}
return {
code: code,
data: {
code: 1
}
}
if (!hasUser) {
return {
code: 500,
message: '账号或密码错误'
}
}
}
},
// 退出接口
{
url: '/user/loginOut',
method: 'get',
timeout,
response: () => {
return {
code: code,
data: null
}
}
},
{
url: '/mobile/logout',
method: 'get',
timeout,
response: () => {
return {
code: code,
data: null
}
}
}
] as MockMethod[]

@ -1,172 +0,0 @@
import config from '@/config/axios/config'
import { MockMethod } from 'vite-plugin-mock'
const { code } = config
const timeout = 1000
export default [
// 获取统计
{
url: '/workplace/total',
method: 'get',
timeout,
response: () => {
return {
code: code,
data: {
project: 40,
access: 2340,
todo: 10
}
}
}
},
// 获取项目
{
url: '/workplace/project',
method: 'get',
timeout,
response: () => {
return {
code: code,
data: [
{
name: 'Github',
icon: 'akar-icons:github-fill',
message: 'workplace.introduction',
personal: 'Archer',
time: new Date()
},
{
name: 'Vue',
icon: 'logos:vue',
message: 'workplace.introduction',
personal: 'Archer',
time: new Date()
},
{
name: 'Angular',
icon: 'logos:angular-icon',
message: 'workplace.introduction',
personal: 'Archer',
time: new Date()
},
{
name: 'React',
icon: 'logos:react',
message: 'workplace.introduction',
personal: 'Archer',
time: new Date()
},
{
name: 'Webpack',
icon: 'logos:webpack',
message: 'workplace.introduction',
personal: 'Archer',
time: new Date()
},
{
name: 'Vite',
icon: 'vscode-icons:file-type-vite',
message: 'workplace.introduction',
personal: 'Archer',
time: new Date()
}
]
}
}
},
// 获取动态
{
url: '/workplace/dynamic',
method: 'get',
timeout,
response: () => {
return {
code: code,
data: [
{
keys: ['workplace.push', 'Github'],
time: new Date()
},
{
keys: ['workplace.push', 'Github'],
time: new Date()
},
{
keys: ['workplace.push', 'Github'],
time: new Date()
},
{
keys: ['workplace.push', 'Github'],
time: new Date()
},
{
keys: ['workplace.push', 'Github'],
time: new Date()
},
{
keys: ['workplace.push', 'Github'],
time: new Date()
}
]
}
}
},
// 获取团队信息
{
url: '/workplace/team',
method: 'get',
timeout,
response: () => {
return {
code: code,
data: [
{
name: 'Github',
icon: 'akar-icons:github-fill'
},
{
name: 'Vue',
icon: 'logos:vue'
},
{
name: 'Angular',
icon: 'logos:angular-icon'
},
{
name: 'React',
icon: 'logos:react'
},
{
name: 'Webpack',
icon: 'logos:webpack'
},
{
name: 'Vite',
icon: 'vscode-icons:file-type-vite'
}
]
}
}
},
// 获取指数
{
url: '/workplace/radar',
method: 'get',
timeout,
response: () => {
return {
code: code,
data: [
{ name: 'workplace.quote', max: 65, personal: 42, team: 50 },
{ name: 'workplace.contribution', max: 160, personal: 30, team: 140 },
{ name: 'workplace.hot', max: 300, personal: 20, team: 28 },
{ name: 'workplace.yield', max: 130, personal: 35, team: 35 },
{ name: 'workplace.follow', max: 100, personal: 80, team: 90 }
]
}
}
}
] as MockMethod[]

@ -8,9 +8,9 @@
"i": "pnpm install",
"dev": "vite --mode base",
"ts:check": "vue-tsc --noEmit --skipLibCheck",
"build:pro": "vite build --mode pro",
"build:pro": "node --max-old-space-size=4096 ./node_modules/vite/bin/vite.js build --mode pro",
"build:gitee": "vite build --mode gitee",
"build:dev": "vite build --mode dev",
"build:dev": "node --max-old-space-size=4096 ./node_modules/vite/bin/vite.js build --mode dev",
"build:test": "npm run ts:check && vite build --mode test",
"build:vite": "rimraf dist-moudle && vite build -c scripts/build/vite.config.ts --mode pro",
"serve:pro": "vite preview --mode pro",

@ -49,4 +49,11 @@ onMounted(() => {
margin-left: 12px;
margin-right: 12px;
}
.el-upload{
--un-icon:unset !important;
-webkit-mask:unset !important;
background-color:unset !important;
width:unset !important;
height:unset !important;
}
</style>

@ -18,7 +18,7 @@ const config: AxiosConfig = {
base: '/api',
// 打包生产环境接口前缀
dev: '/pro',
dev: '/dev',
// dev: '/ordb',
// 打包生产环境接口前缀

@ -1,223 +0,0 @@
<script setup lang="tsx">
import { ContentWrap } from '@/components/ContentWrap'
import { Form, FormSchema } from '@/components/Form'
import { useForm } from '@/hooks/web/useForm'
import { ref,reactive } from 'vue'
import { ElButton} from 'element-plus';
// import {identificationTable} from "@/views/amld/CaseManageComponents/transcationInfoTable/identificationTable"
defineOptions({
name: 'CaseManageInfo'
})
const { formRegister } = useForm()
const formSchema = reactive<FormSchema[]>([
{
field: 'pkid',
label: '可疑交易报告触发点',
component: 'Select',
componentProps: {},
},
{
field: 'pkid',
label: '紧急程度',
component: 'Select',
componentProps: {},
},
{
field: 'pkid',
label: '报送方向',
component:"Select",
componentProps: {
props: {
multiple: true
}
},
},
{
field: 'pkid',
label: '可疑交易特征',
component:"Select",
componentProps: {
props: {
multiple: true
}
},
},
{
field: 'pkid',
label: '资金交易及客户行为情况',
component:"Input",
componentProps: {
type: 'textarea'
},
},
{
field: 'pkid',
label: '疑点分析',
component:"Input",
componentProps: {
type: 'textarea'
},
},
{
field: 'pkid',
label: '排除可疑原因',
component:"Input",
componentProps: {
type: 'textarea'
},
},
])
const rules = reactive({
})
let systemUse = reactive({
activeName:1,
title:"可疑案例处理信息显示",
//
reportInfo:[
{
title:"编号",
value:"20220513111120805022",
},
{
title:"状态",
value:"处理中",
},
{
title:"数据时间: 报送次数: 0",
value:"2022-05-13",
},
{
title:"报送次数",
value:"0",
}
],
//
companyInfo:{
},
riskButtonStatus:"展开",///
ristButtonStatus:false,//
})
//
const contentShowStatus = ()=>{
if(systemUse.riskButtonStatus == "展开"){
systemUse.riskButtonStatus = "隐藏";
systemUse.ristButtonStatus = true;
}else{
systemUse.riskButtonStatus = "展开";
systemUse.ristButtonStatus = false;
}
}
</script>
<template>
<ContentWrap>
<h1>{{ systemUse.title }}</h1>
<div class="reportInfoData grayFont">
<template v-for="(item,index) in systemUse.reportInfo" :key="index">
<span>{{ item.title }}</span>
<span>{{ item.value }}</span>
</template>
</div>
<div class="staticInfo">可疑情况与模型 <span class="redFont"> 疑似涉税犯罪</span> 相似 触发了模型中 <span class="redFont"> 交易方式对公客户资金交易基本全部通过网上银行 资金交易量与企业注册资金和经营规模明显不符</span>的可疑特征</div>
<div class="staticInfo">案例涉及 1名可疑客户<span class="linkFont">天峻县鑫博酒店0000080003210964</span>持有 有效证件类型<span class="grayFont">企业法人营业执照号码 </span> 证件号码<span class="grayFont"> 92632823MA757HWF5U</span>
</div>
<div class="staticInfo">环顾周期内, 案例涉及<span class="grayFont">5笔交易</span> , 交易累计金额:<span class="grayFont">112389.57</span>
</div>
<ul>
<li>
<span><img src="@/assets/imgs/star.png" />风险分析</span>
<ElButton type="primary" @click="contentShowStatus">{{ systemUse.riskButtonStatus }}</ElButton>
<div class="content" v-show="systemUse.ristButtonStatus">
<p><strong>[交易行为分析]</strong></p>
<p><img src="@/assets/imgs/Dot.png" />交易渠道分析 <img src="@/assets/imgs/setting.png" class="settingImg" />网上银行 其他 2,其中<span class="grayFont">网上银行 交易笔数2 交易金额19150.00 金额占比 17.00 % 其他 交易笔数3 交易金额93239.57 金额占比 83.00 %</span></p>
<p><img src="@/assets/imgs/Dot.png" />对手分析:<img src="@/assets/imgs/setting.png" class="settingImg" />交易对手有 5 ,<span class="grayFont">小额支付系统清算 , 李晓燕 , 谢玉良 , 马爱米乃</span>交易去向有 2个地区<span class="grayFont">CHN630103 , CHN632823</span></p>
</div>
</li>
<li>
<span><img src="@/assets/imgs/star.png" />甄别结论</span>
</li>
</ul>
<Form :rules="rules" @register="formRegister" :schema="formSchema" />
<p class="buttonList">
<ElButton type="primary">上传附件</ElButton>
<ElButton type="primary">确认上报</ElButton>
<ElButton type="primary">排除可疑</ElButton>
<ElButton type="primary">加入跟踪库</ElButton>
<ElButton type="primary">保存</ElButton>
</p>
</ContentWrap>
</template>
<style scoped lang="scss">
.buttonList{
text-align: center;
}
h1{
text-align:center;
}
.reportInfoData{
text-align:center;
}
.staticInfo{
text-indent: 2em;
margin:10px 0px;
}
ul{
li{
list-style-type: none;
min-height:40px;
line-height:40px;
border-bottom:1px dotted #eee;
position: relative;
span{
color:rgb(3, 123, 142);
img{
width:15px;
margin-right:10px;
}
}
button{
position:absolute;
right:5px;
}
}
}
.content p{
margin:0px 20px;
text-indent: 2em;
img{
width:12px;
margin-right:5px;
}
.settingImg{
cursor: pointer;
border-bottom:1px solid transparent;
}
.settingImg:hover{
border-bottom:1px solid #0780b4;
}
}
.redFont{
color:rgb(184, 79, 79);
}
.grayFont{
color:#999;
}
.linkFont{
color:#18aeee;
cursor: pointer;
}
.linkFont:hover{
color:#0780b4;
border-bottom:1px solid #0780b4;
}
</style>

@ -1,3 +0,0 @@
import CaseManageInfo from './CaseManageInfo.vue'
export { CaseManageInfo }

@ -1,84 +0,0 @@
<!-- 客户评级分析 -->
<script lang="tsx" setup>
import { Echart } from '@/components/Echart'
import { EChartsOption } from 'echarts'
import { reactive } from "vue";
import { set } from 'lodash-es'
import { pieOptions, barOptions } from './echarts-data'
let pieOptionsData = reactive<EChartsOption>(pieOptions) as EChartsOption
let barOptionsData = reactive<EChartsOption>(barOptions) as EChartsOption
const echartsClickFun = (params) => {
set(barOptionsData, "title.text", params.name);
switch (params.dataIndex) {
case 0:
//
set(barOptionsData, "series", [{
name: "分数",
data: [12],
type: 'bar',
},]);
set(barOptionsData, "xAxis.data", ["地址"]);
break;
case 1:
//
set(barOptionsData, "series", [{
name: "职业风险程度",
data: [9],
type: 'bar',
},]);
set(barOptionsData, "xAxis.data", ["职业风险程度"]);
break;
case 2:
//
set(barOptionsData, "series", [{
name: "自然人客户年龄",
data: [2,3,1,2,2],
type: 'bar',
},]);
set(barOptionsData, "xAxis.data", ["身份证件或身份证明文件的种类","自然人客户年龄","与客户建立业务关系的渠道","反洗钱交易监测记录","提示信息或权威媒体报道信息"]);
break;
case 3:
//
set(barOptionsData, "series", [{
name: ["代理办理","非面对面交易","特殊业务类型的交易频率","与现金的关联程度"],
data: [1,1,2,1],
type: 'bar',
},]);
set(barOptionsData, "xAxis.data",["代理办理","非面对面交易","特殊业务类型的交易频率","与现金的关联程度"]);
break;
}
}
</script>
<template>
<h4>{{}} 王婷婷评级信息 </h4>
<p>评级日期 2022-05-13 风险等级 较低风险</p>
<p>客户<span class="redFont">王婷婷 客户号 :0000080006391470</span> 2022-05-13 根据采集结果计算出客户评级得分 <span
class="redFont">30.0 </span>,因而被系统评级为: <span class="redFont">较低风险</span></p>
<div class="chartList">
<!-- 分值分布 -->
<Echart :options="pieOptionsData" width="48%" height="350px" @call-echarts-click="echartsClickFun" />
<!-- 地域特性 -->
<Echart :options="barOptionsData" width="48%" height="350px" />
</div>
</template>
<style scoped lang="scss">
.redFont {
color: rgb(235, 83, 83)
}
h4,
p {
text-align: center;
}
.chartList {
display: flex;
margin: 1%;
}
</style>

@ -1,290 +0,0 @@
import { EChartsOption } from 'echarts';
import { useI18n } from '@/hooks/web/useI18n';
import { random } from 'lodash-es';
const { t } = useI18n();
//
export const lineOptions: EChartsOption = {
title: {
text: t('analysis.monthlySales'),
left: 'center',
},
xAxis: {
data: [
t('analysis.january'),
t('analysis.february'),
t('analysis.march'),
t('analysis.april'),
t('analysis.may'),
t('analysis.june'),
t('analysis.july'),
t('analysis.august'),
t('analysis.september'),
t('analysis.october'),
t('analysis.november'),
t('analysis.december'),
],
boundaryGap: false,
axisTick: {
show: false,
},
},
grid: {
left: 20,
right: 20,
bottom: 20,
top: 80,
containLabel: true,
},
tooltip: {
trigger: 'axis',
axisPointer: {
type: 'cross',
},
padding: [5, 10],
},
yAxis: {
axisTick: {
show: false,
},
},
legend: {
data: [t('analysis.estimate'), t('analysis.actual')],
top: 50,
},
series: [
{
name: t('analysis.estimate'),
smooth: true,
type: 'line',
data: [100, 120, 161, 134, 105, 160, 165, 114, 163, 185, 118, 123],
animationDuration: 2800,
animationEasing: 'cubicInOut',
},
{
name: t('analysis.actual'),
smooth: true,
type: 'line',
itemStyle: {},
data: [120, 82, 91, 154, 162, 140, 145, 250, 134, 56, 99, 123],
animationDuration: 2800,
animationEasing: 'quadraticOut',
},
],
};
//饼图
export const pieOptions: EChartsOption = {
title: {
text: "分值分布",
left: 'center',
},
tooltip: {
trigger: 'item',
formatter: '{a} <br/>{b} : {c} ({d}%)',
},
legend: {
orient: 'vertical',
bottom: 'bottom',
data: ["地域特性权重20", "职业特性权重15","客户特性权重40","业务特征权重25"],
},
series: [
{
name:"分值分布",
type: 'pie',
radius: '55%',
center: ['50%', '60%'],
data: [
{ value: 335, name: "地域特性权重20" },
{ value: 310, name: "职业特性权重15" },
{ value: 234, name: "客户特性权重40" },
{ value: 135, name: "业务特征权重25" },
],
},
],
};
//柱状图
export const barOptions: EChartsOption = {
title: {
text: "地域特性权重20",
left: 'center',
},
tooltip: {
trigger: 'axis',
axisPointer: {
type: 'shadow',
},
},
grid: {
left: 50,
right: 20,
bottom: 80,
},
xAxis: {
type: 'category',
data: ["地址"],
axisLabel:{
rotate: 45,
},
axisTick: {
alignWithLabel: true,
},
},
yAxis: {
type: 'value',
},
series: [
{
name: "分数",
data: [12],
type: 'bar',
},
],
};
export const radarOption: EChartsOption = {
legend: {
data: [t('workplace.personal'), t('workplace.team')],
},
radar: {
// shape: 'circle',
indicator: [
{ name: t('workplace.quote'), max: 65 },
{ name: t('workplace.contribution'), max: 160 },
{ name: t('workplace.hot'), max: 300 },
{ name: t('workplace.yield'), max: 130 },
{ name: t('workplace.follow'), max: 100 },
],
},
series: [
{
name: `xxx${t('workplace.index')}`,
type: 'radar',
data: [
{
value: [42, 30, 20, 35, 80],
name: t('workplace.personal'),
},
{
value: [50, 140, 290, 100, 90],
name: t('workplace.team'),
},
],
},
],
};
export const wordOptions = {
series: [
{
type: 'wordCloud',
gridSize: 2,
sizeRange: [12, 50],
rotationRange: [-90, 90],
shape: 'pentagon',
width: 600,
height: 400,
drawOutOfBound: true,
textStyle: {
color: function () {
return 'rgb(' + [Math.round(Math.random() * 160), Math.round(Math.random() * 160), Math.round(Math.random() * 160)].join(',') + ')';
},
},
emphasis: {
textStyle: {
shadowBlur: 10,
shadowColor: '#333',
},
},
data: [
{
name: 'Sam S Club',
value: 10000,
textStyle: {
color: 'black',
},
emphasis: {
textStyle: {
color: 'red',
},
},
},
{
name: 'Macys',
value: 6181,
},
{
name: 'Amy Schumer',
value: 4386,
},
{
name: 'Jurassic World',
value: 4055,
},
{
name: 'Charter Communications',
value: 2467,
},
{
name: 'Chick Fil A',
value: 2244,
},
{
name: 'Planet Fitness',
value: 1898,
},
{
name: 'Pitch Perfect',
value: 1484,
},
{
name: 'Express',
value: 1112,
},
{
name: 'Home',
value: 965,
},
{
name: 'Johnny Depp',
value: 847,
},
{
name: 'Lena Dunham',
value: 582,
},
{
name: 'Lewis Hamilton',
value: 555,
},
{
name: 'KXAN',
value: 550,
},
{
name: 'Mary Ellen Mark',
value: 462,
},
{
name: 'Farrah Abraham',
value: 366,
},
{
name: 'Rita Ora',
value: 360,
},
{
name: 'Serena Williams',
value: 282,
},
{
name: 'NCAA baseball tournament',
value: 273,
},
{
name: 'Point Break',
value: 265,
},
],
},
],
};

@ -1,3 +0,0 @@
import customerRateInfo from "./customerRateInfo.vue"
export {customerRateInfo}

@ -1,3 +0,0 @@
import scoreAdjustment from './scoreAdjustment.vue'
export { scoreAdjustment }

@ -1,435 +0,0 @@
<!-- 分值调整 -->
<script lang="tsx" setup>
import { ElButton,ElInput } from 'element-plus'
import { reactive } from 'vue'
import { propTypes } from '@/utils/propTypes'
const props = defineProps({
type: propTypes.string.def(''),
})
//
const rateScoreList = reactive({
regionalScore:1.0,//
professScore:1.0,//
customerCardTypeScore:1.0,//
customerAgeScore:1.0,//
customerRelaScore:1.0,//
monimoniRecordScore:1.0,//
customerTipRecordScore:1.0,//
proxyProcessScore:1.0,//
noFaceToFaceTranScore:1.0,//
balaceScore:1.0,//
correlationDegreeScore:1.0,//
addScoreAdje:"",//
reasonForAdje:"",//
})
//
const gradeCalulation = () => {
}
//
const submitScore = () => {
}
//
const exportScore = () => {
}
//退
const rebackScore = ()=>{
}
</script>
<template>
<div class="scoreTable">
<table class="scoreAdjTable">
<!-- 首行表头 -->
<tr>
<th>风险要素</th>
<th colspan="2">风险子项</th>
<th>权重</th>
<th>评分参考</th>
<th>系统评分</th>
<th>初评评分</th>
<th>复评评分</th>
</tr>
<!-- 地域特性权重20 -->
<tr>
<td rowspan="4">地域特性权重20</td>
<td rowspan="4">地址</td>
<td>境外地址</td>
<td rowspan="4">20</td>
<td>5.0</td>
<td rowspan="4">1.0</td>
<td rowspan="4" v-if="props.type == 'first'">
<ElInput v-model="rateScoreList.regionalScore" />
</td>
<td rowspan="4" v-if="props.type == 'first'">0.0</td>
<td rowspan="4" v-if="props.type == 'second'">
3.0
</td>
<td rowspan="4" v-if="props.type == 'second'"><ElInput v-model="rateScoreList.regionalScore" /></td>
</tr>
<tr>
<td>新疆西藏云南广东吉林广西福建地址</td>
<td>4.0</td>
</tr>
<tr>
<td>除新疆西藏云南广东吉林广西福建外的省外地址</td>
<td>3.0</td>
</tr>
<tr>
<td>青海省内地址</td>
<td>1.0</td>
</tr>
<!-- 职业特性权重15 -->
<tr>
<td rowspan="5">职业特性权重15</td>
<td rowspan="5">职业风险程度</td>
<td>公认具有较高风险的行业如珠宝业古董业拍卖业艺术品收藏典当行娱乐业博彩业评估事务所及无业人员</td>
<td rowspan="5">15</td>
<td>5.0</td>
<td rowspan="5">3.0</td>
<td rowspan="5" v-if="props.type == 'first'"><ElInput v-model="rateScoreList.professScore" /></td>
<td rowspan="5" v-if="props.type == 'first'">0.0</td>
<td rowspan="5" v-if="props.type == 'second'">3.0</td>
<td rowspan="5" v-if="props.type == 'second'"><ElInput v-model="rateScoreList.professScore" /></td>
</tr>
<tr>
<td>现金密集程度较高的行业如废品收购旅游餐饮零售影视娱乐</td>
<td>4.0</td>
</tr>
<tr>
<td>一般行业客户除上述和下述之外的所有行业如学生农民牧民个体工商户私营企业员工退休人员等</td>
<td>3.0</td>
</tr>
<tr>
<td>金融机构员工国有企业职工</td>
<td>2.0</td>
</tr>
<tr>
<td>公务员军人非盈利社会事业单位职工</td>
<td>1.0</td>
</tr>
<!-- 客户特性权重40 -->
<!-- 客户所持身份证件或身份证明文件的种类 -->
<tr>
<td rowspan="17">客户特性权重40</td>
<td rowspan="3">客户所持身份证件或身份证明文件的种类</td>
<td>护照港澳台居民身份证</td>
<td rowspan="3">10</td>
<td>5.0</td>
<td rowspan="3">1.0</td>
<td rowspan="3" v-if="props.type == 'first'"><ElInput v-model="rateScoreList.customerCardTypeScore" /></td>
<td rowspan="3" v-if="props.type == 'first'">0.0</td>
<td rowspan="3" v-if="props.type == 'second'">3.0</td>
<td rowspan="3" v-if="props.type == 'second'"><ElInput v-model="rateScoreList.customerCardTypeScore" /></td>
</tr>
<tr>
<td>除护照港澳台居民身份证和核查无误的居民身份证以外的其他有效证件</td>
<td>3.0</td>
</tr>
<tr>
<td>核查无误的居民身份证</td>
<td>1.0</td>
</tr>
<!-- 自然人客户年龄 -->
<tr>
<td rowspan="4">自然人客户年龄</td>
<td>25周岁以下</td>
<td rowspan="4">5</td>
<td>5.0</td>
<td rowspan="4">5.0</td>
<td rowspan="4" v-if="props.type == 'first'"><ElInput v-model="rateScoreList.customerAgeScore" /></td>
<td rowspan="4" v-if="props.type == 'first'">0.0</td>
<td rowspan="4" v-if="props.type == 'second'">0.0</td>
<td rowspan="4" v-if="props.type == 'second'"><ElInput v-model="rateScoreList.customerAgeScore" /></td>
</tr>
<tr>
<td>26-35周岁</td>
<td>4.0</td>
</tr>
<tr>
<td>36-60周岁</td>
<td>3.0</td>
</tr>
<tr>
<td>61岁以上</td>
<td>1.0</td>
</tr>
<!-- 与客户建立业务关系的渠道 -->
<tr>
<td rowspan="3">与客户建立业务关系的渠道</td>
<td>网络受理</td>
<td rowspan="3">5</td>
<td>5.0</td>
<td rowspan="3">1.0</td>
<td rowspan="3" v-if="props.type == 'first'"><ElInput v-model="rateScoreList.customerRelaScore" /></td>
<td rowspan="3" v-if="props.type == 'first'">0.0</td>
<td rowspan="3" v-if="props.type == 'second'">0.0</td>
<td rowspan="3" v-if="props.type == 'second'"><ElInput v-model="rateScoreList.customerRelaScore" /></td>
</tr>
<tr>
<td>代理受理其他方式</td>
<td>3.0</td>
</tr>
<tr>
<td>面对面直接受理柜面</td>
<td>1.0</td>
</tr>
<!-- 反洗钱交易监测记录 -->
<tr>
<td rowspan="3">反洗钱交易监测记录</td>
<td>60个工作日内上报可疑交易次数2</td>
<td rowspan="3">10</td>
<td>5.0</td>
<td rowspan="3">1.0</td>
<td rowspan="3" v-if="props.type == 'first'"><ElInput v-model="rateScoreList.monimoniRecordScore" /></td>
<td rowspan="3" v-if="props.type == 'first'">0.0</td>
<td rowspan="3" v-if="props.type == 'second'">0.0</td>
<td rowspan="3" v-if="props.type == 'second'"><ElInput v-model="rateScoreList.monimoniRecordScore" /></td>
</tr>
<tr>
<td>60个工作日内0上报可疑交易次数2</td>
<td>3.0</td>
</tr>
<tr>
<td>60个工作日内上报可疑交易次数=0</td>
<td>1.0</td>
</tr>
<!-- 涉及客户的风险提示信息或权威媒体报道信息 -->
<tr>
<td rowspan="4">涉及客户的风险提示信息或权威媒体报道信息</td>
<td>涉及风险提示或媒体报道</td>
<td rowspan="4">10</td>
<td>5.0</td>
<td rowspan="4">1.0</td>
<td rowspan="4" v-if="props.type == 'first'"><ElInput v-model="rateScoreList.customerTipRecordScore" /></td>
<td rowspan="4" v-if="props.type == 'first'">0.0</td>
<td rowspan="4" v-if="props.type == 'second'">3.0</td>
<td rowspan="4" v-if="props.type == 'second'"><ElInput v-model="rateScoreList.customerTipRecordScore" /></td>
</tr>
<tr>
<td>客户现在被查询/冻结/扣划</td>
<td>3.0</td>
</tr>
<tr>
<td>客户曾经或者现在被监管机构执法机关关注</td>
<td>2.0</td>
</tr>
<tr>
<td>无任何提示或媒体报道</td>
<td>1.0</td>
</tr>
<!-- 业务特征权重25 -->
<!-- 代理办理 -->
<tr>
<td rowspan="13">业务特征权重25</td>
<td rowspan="3">代理办理</td>
<td>30个工作日内同一代办人代理客户办理3次以上代理开立3个以上账户或以上业务</td>
<td rowspan="3">5</td>
<td>5.0</td>
<td rowspan="3">1.0</td>
<td rowspan="3" v-if="props.type == 'first'"><ElInput v-model="rateScoreList.proxyProcessScore" /></td>
<td rowspan="3" v-if="props.type == 'first'">0.0</td>
<td rowspan="3" v-if="props.type == 'second'">3.0</td>
<td rowspan="3" v-if="props.type == 'second'"><ElInput v-model="rateScoreList.proxyProcessScore" /></td>
</tr>
<tr>
<td>30个工作日内同一代办人代理客户办理业务小于3次</td>
<td>3.0</td>
</tr>
<tr>
<td>客户亲自到柜台办理开户业务</td>
<td>1.0</td>
</tr>
<!-- 非面对面交易 -->
<tr>
<td rowspan="3">非面对面交易</td>
<td>30日内办理非柜台业务交易限额200</td>
<td rowspan="3">5</td>
<td>5.0</td>
<td rowspan="3">1.0</td>
<td rowspan="3" v-if="props.type == 'first'"><ElInput v-model="rateScoreList.noFaceToFaceTranScore" /></td>
<td rowspan="3" v-if="props.type == 'first'">0.0</td>
<td rowspan="3" v-if="props.type == 'second'">0.0</td>
<td rowspan="3" v-if="props.type == 'second'"><ElInput v-model="rateScoreList.noFaceToFaceTranScore" /></td>
</tr>
<tr>
<td>30日内办理非柜台业务交易限额200</td>
<td>3.0</td>
</tr>
<tr>
<td>30日内未办理非柜台业务</td>
<td>1.0</td>
</tr>
<!-- -->
<tr>
<td rowspan="3">特殊业务类型的交易频率1.10个自然日连续10次规避大额监管现金为4.9-4.99万元或转账49-49.99万元
2.10个自然日同一客户个人结算账户连续开销户5次以上 3.90天未发生交易的账户突然启用且有5万元以上大额资金往来
4.10个自然日多个对公单位与同一个人之间转账次数超过50次金额200万元以上交易 5.个人账户资金通过转账方式转入1个自然内支取但余额20元以下或不留余额</td>
<td>符合其中3条以上的</td>
<td rowspan="3">10</td>
<td>5.0</td>
<td rowspan="3">1.0</td>
<td rowspan="3" v-if="props.type == 'first'"><ElInput v-model="rateScoreList.balaceScore" /></td>
<td rowspan="3" v-if="props.type == 'first'">0.0</td>
<td rowspan="3" v-if="props.type == 'second'">3.0</td>
<td rowspan="3" v-if="props.type == 'second'"><ElInput v-model="rateScoreList.balaceScore" /></td>
</tr>
<tr>
<td>符合1条以上小于3条</td>
<td>3.0</td>
</tr>
<tr>
<td>交易频率正常无频繁发生特殊交易</td>
<td>1.0</td>
</tr>
<!-- 与现金的关联程度 -->
<tr>
<td rowspan="4">与现金的关联程度</td>
<td>10个自然日现金收付合计200万或交易笔数50笔且单笔金额超过100元</td>
<td rowspan="4">5</td>
<td>5.0</td>
<td rowspan="4">1.0</td>
<td rowspan="4" v-if="props.type == 'first'"><ElInput v-model="rateScoreList.correlationDegreeScore" /></td>
<td rowspan="4" v-if="props.type == 'first'">0.0</td>
<td rowspan="4" v-if="props.type == 'second'">3.0</td>
<td rowspan="4" v-if="props.type == 'second'"><ElInput v-model="rateScoreList.correlationDegreeScore" /></td>
</tr>
<tr>
<td>10个自然日100现金收付合计200</td>
<td>4.0</td>
</tr>
<tr>
<td>10个自然日50现金收付合计100</td>
<td>3.0</td>
</tr>
<tr>
<td>10个自然日现金收付合计50</td>
<td>1.0</td>
</tr>
<!-- -->
<tr>
<td colspan="3">上次评级结果</td>
<td colspan="3">任务状态 {{ props.type=="first"?"待初评":"待复评" }}</td>
<td colspan="2">
<ElButton type="primary" @click="gradeCalulation"></ElButton>
</td>
</tr>
<tr>
<td colspan="8">上次评级理由{{ }}</td>
</tr>
<tr class="blockTr">
<td colspan="8"></td>
</tr>
<tr>
<td>系统</td>
<td colspan="3">系统评级结果 较低风险</td>
<td colspan="4">系统评级总分 30.0</td>
</tr>
<tr class="blockTr">
<td colspan="8">123</td>
</tr>
<tr>
<td rowspan="3">初评</td>
<td colspan="3">附加分调整 <ElInput v-model="rateScoreList.addScoreAdje" v-if="props.type=='first'" /> </td>
<td colspan="2">初评总分{{}}</td>
<td colspan="2">初评结果{{}}</td>
</tr>
<tr>
<td colspan="7">调整原因<ElInput type="textarea" v-model="rateScoreList.reasonForAdje" v-if="props.type=='first'" /></td>
</tr>
<tr>
<td colspan="3">初评用户{{ }}</td>
<td colspan="2">初评日期{{}}</td>
<td colspan="2"></td>
</tr>
<tr class="blockTr">
<td colspan="8">123</td>
</tr>
<!-- 复评 -->
<tr>
<td rowspan="4">复评</td>
<td colspan="3">附加分调整<ElInput v-model="rateScoreList.reasonForAdje">
<td colspan="2">复评总分</td>
<td colspan="2">复评结果</td>
</elinput></td></tr>
<tr>
<td colspan="7">调整原因<ElInput type="textarea" v-model="rateScoreList.reasonForAdje" /></td></tr>
<tr>
<td colspan="7">退回原因<ElInput type="textarea" v-model="rateScoreList.reasonForAdje" /></td></tr>
<tr>
<td colspan="2">复评用户{{ }}</td>
<td colspan="3">复评日期{{ }}</td>
<td colspan="2"></td>
</tr>
<tr class="blockTr">
<td colspan="8">123</td>
</tr>
<tr>
<td rowspan="3">审核</td>
<td colspan="7">退回原因{{ }}</td>
</tr>
<tr>
<td colspan="3">审核用户{{}}</td>
<td colspan="4">审核时间{{ }}</td>
</tr>
<tr>
<td colspan="3">
<ElButton type="primary">同意初评</ElButton>
</td>
<td colspan="2">
<ElButton type="primary">同意复评</ElButton>
</td>
<td colspan="2">
<ElButton type="primary">均不同意</ElButton>
</td>
</tr>
</table>
<p class="buttonList">
<ElButton type="primary" @click="submitScore"></ElButton>
<ElButton type="primary" @click="rebackScore" v-if="props.type=='second'">退</ElButton>
<ElButton type="primary" @click="exportScore"></ElButton>
</p>
</div>
</template>
<style lang="scss" scoped>
.scoreTable {
height: 75vh;
overflow-y: auto;
}
.scoreAdjTable {
width: 100%;
border-collapse: collapse;
overflow-y: auto;
tr {
min-height: 40px;
}
th {
background-color: #b8e6f8;
}
.blockTr {
color: transparent;
height: 40px;
}
th,
td {
border: 1px solid #b8e6f8;
max-width: 180px;
padding: 5px;
}
}
.buttonList {
text-align: center;
}
</style>

@ -1,138 +0,0 @@
<script setup lang="tsx">
import { ContentWrap } from '@/components/ContentWrap';
import { ElButton } from "element-plus"
import { reactive, ref, unref } from 'vue'
import { propTypes } from '@/utils/propTypes'
const systemUse = reactive({
title:"客户信息( 校验已通过 )",
tableInfo:[
{
columnName:"客户号:",
columnValue:"custCode",
},
{
columnName:"客户名称:",
columnValue:"custName",
},
{
columnName:"客户类型:",
columnValue:"",
},
{
columnName:"客户证件类型:",
columnValue:"",
},
{
columnName:"客户证件号码:",
columnValue:"",
},
{
columnName:"电话号码:",
columnValue:"",
},
{
columnName:"次数:",
columnValue:"",
},
{
columnName:"总金额:",
columnValue:"",
},
{
columnName:"规则编码:",
columnValue:"",
},
{
columnName:"规则名称:",
columnValue:"",
},
],//table
tableData:{},
})
const props = defineProps({
searchStatus: propTypes.bool.def(false),
customerInfo:propTypes.object.def({})
})
const editCustomerInfo = ()=>{
}
const detailCustomerInfo = ()=>{
}
const returnCustomerInfo = ()=>{
}
</script>
<template>
<ContentWrap>
<table>
<tr>
<th colspan="6" class="title">{{ systemUse.title }}</th>
</tr>
<tr>
<th>客户号</th>
<td>{{ props.customerInfo.custCode }}</td>
<th>客户名称</th>
<td>{{ props.customerInfo.custName }}</td>
<th>客户类型</th>
<td>对私</td>
</tr>
<tr>
<th>客户证件类型</th>
<td>居民身份证</td>
<th>客户证件号码</th>
<td>632124200110263676</td>
<th>电话号码</th>
<td>18897033113</td>
</tr>
<tr>
<th>次数</th>
<td>{{ props.customerInfo.tranRecord }}</td>
<th>总金额</th>
<td>{{ props.customerInfo.tranAmount }}</td>
<th>规则编码</th>
<td>{{ props.customerInfo.ruleCode }}</td>
</tr>
<tr>
<th>规则名称</th>
<td colspan="5">自然人客户银行账户与其他的银行账户之间当日单笔或者累计人民币50万元以上含50万元外币等值10万美元以上含10万美元的境内款项划转</td>
</tr>
<tr>
<td colspan="6">
<ElButton type="primary" @click="editCustomerInfo()"></ElButton>
<ElButton type="primary" @click="detailCustomerInfo()"></ElButton>
<!-- <ElButton type="primary" @click="returnCustomerInfo()"></ElButton> -->
</td>
</tr>
</table>
</ContentWrap>
</template>
<style scoped lang="scss">
table{
border:1px solid #eee;
border-collapse:collapse;
background-color: #e5f6fb;
font-size: 15px;
th,td{
width:16.7%;
height:30px;
line-height:30px;
border:1px solid #999;
}
th{
text-align:right;
}
td{
font-size: 16px;
}
.title{
text-align:center;
background-color: #51c7ee;
}
}
</style>

@ -1,3 +0,0 @@
import LargScaleOriginTable from './LargScaleOriginTable.vue'
export { LargScaleOriginTable }

@ -1,52 +0,0 @@
<script setup lang="tsx">
import { ContentWrap } from '@/components/ContentWrap';
import { Form, FormSchema } from '@/components/Form'
import { useForm } from '@/hooks/web/useForm'
import {reactive} from 'vue'
import { propTypes } from '@/utils/propTypes'
const { formRegister } = useForm()
const rules = reactive({
})
const props = defineProps({
title:propTypes.string.def(""),
branchName:propTypes.string.def(""),
formSchema:propTypes.object.def({})
})
const systemUse = reactive({
title:props.title,
branchName:props.branchName,
formSchema:props.formSchema
});
</script>
<template>
<ContentWrap class="ContentWrap">
<h3 v-if="systemUse.title">{{ systemUse.title }}</h3>
<p v-if="systemUse.branchName">{{ systemUse.branchName }}</p>
<Form :rules="rules" @register="formRegister" :schema="systemUse.formSchema" />
</ContentWrap>
</template>
<style scoped>
.ContentWrap{
/* background-color: #d5f0f5; */
min-width:1120px;
}
h3{
color:rgb(3, 87, 143);
text-align:center;
}
p{
font-size:18px;
color:rgb(3, 87, 143);
border-bottom:1px solid #eee;
}
</style>

@ -1,3 +0,0 @@
import customerInfoTable from './customerInfoTable.vue'
export { customerInfoTable }

@ -1,231 +0,0 @@
<script setup lang="tsx">
//
import { reactive, ref, unref } from 'vue'
import {
getTransactionInfoListApi,
delTransactionInfoListApi,
} from '@/api/amld/TransactionInfo/TransactionInfo'
import { TableData } from '@/api/amld/SuspiciousCaseDeal/SuspiciousCaseDeal/types'
import { useTable } from '@/hooks/web/useTable'
import { Table, TableColumn } from '@/components/Table'
import { ElButton, ElLink, ElLoading, ElPopconfirm, ElMessage } from 'element-plus'
import { Search } from '@/components/Search'
import { FormSchema } from '@/components/Form'
import { ContentWrap } from '@/components/ContentWrap'
import { useRouter } from 'vue-router'
import { useI18n } from '@/hooks/web/useI18n'
import { getWidth } from '@/utils';
import { propTypes } from '@/utils/propTypes'
const { push } = useRouter()
const { t } = useI18n()
const props = defineProps({
searchStatus:propTypes.bool.def(true),//
tableColumns:propTypes.array.def([]),
dataList:propTypes.array.def([]),
SearchSchema:propTypes.array.def([]),
});
let systemUse = reactive({
SearchSchema:props.SearchSchema,
})
const ids = ref<string[]>([])
const searchParams = ref({})
const { tableRegister, tableState, tableMethods } = useTable({
fetchDataApi: async () => {
const { currentPage, pageSize } = tableState
const res = await getTransactionInfoListApi({
pageIndex: unref(currentPage),
pageSize: unref(pageSize),
...unref(searchParams)
})
return {
list: res.body.list,
total: res.body.total
}
},
fetchDelApi: async () => {
const res = await delTransactionInfoListApi(unref(ids));
return !!res;
},
})
const { loading, dataList, total, currentPage, pageSize } = tableState
const { getList, getElTableExpose, delList, refresh } = tableMethods
// const searchSchema = reactive<FormSchema[]>([
// {
// field: 'attribute10',
// label: '',
// componentProps: {},
// component: 'Select'
// }
// ])
const tableColumns = reactive<TableColumn[]>([
{
field: 'selection',
type: 'selection',
fixed: true
},
{
field: 'custCode',
label: '客户号'
},
{
field: 'custName',
label: '客户名称'
},
{
field: 'tranOrganname',
label: '交易机构'
},
{
field: 'tranAcct',
label: '交易账户'
},
{
field: 'tranType',
label: '交易方式'
},
{
field: 'tranTime',
label: '交易时间'
},
{
field: 'currencyCode',
label: '币种'
},
{
field: 'amount',
label: '交易金额'
},
{
field: 'sendcode',
label: '资金收付标志'
},
{
field: 'oppOrganname',
label: '对方机构'
},
{
field: 'oppName',
label: '对手姓名'
},
{
field: 'oppAcctt',
label: '交易对手账号'
},
{
field: 'attribute1',
label: '校验状态'
},
{
field: 'oplasttime',
label: '操作人'
},
{
field: 'opuser',
label: '操作时间'
},
{
field: 'action',
label: t('tableDemo.action'),
width: 160,
fixed: 'right',
slots: {
default: (data: any) => {
return (
<>
<ElLink type="primary" underline={false} onClick={() => action("/caseManageT/transicationInfoAddRecord",data.row, 'edit')}>
{t('tableDemo.edit')}
</ElLink>
<ElPopconfirm
title={t('common.delTableMsg')}
width={200}
v-slots={{
reference: () => {
return (
<>
<ElLink type="primary" underline={false}>
{t('tableDemo.del')}
</ElLink>
</>
)
}
}}
onConfirm={() => delData(data.row)}
></ElPopconfirm>
<ElLink type="primary" underline={false} onClick={() => action("/caseManageT/transicationInfoAddRecord",data.row, 'detail')}>
{t('tableDemo.detail')}
</ElLink>
</>
)
}
}
}
].map(item => ({ minWidth: item.label ? getWidth(item.label) : 120, ...item }) as TableColumn))
/**单行查询**/
const action = async (path: string, row: TableData, type: string) => {
push(path);
}
const disabled = ref(true)
const onSelectionChange = (selection: TableData[]) => {
disabled.value = selection.length === 0
}
const setSearchParams = (data: any) => {
searchParams.value = data
getList()
}
//
const AddFlowWater = ()=>{
}
//
const downLoadDetail = () =>{
}
//
const batchCheck = ()=>{
}
</script>
<template>
<ContentWrap>
<Search :schema="systemUse.SearchSchema" @reset="setSearchParams" @search="setSearchParams" v-if="props.searchStatus" />
<Table
:columns="props.tableColumns"
v-model:pageSize="pageSize"
v-model:currentPage="currentPage"
default-expand-all
node-key="pkid"
:data="props.dataList"
:loading="loading"
:pagination="{
total
}"
@selection-change="onSelectionChange"
@register="tableRegister"
@refresh="refresh"
>
<!-- <template #buttons v-if="props.searchStatus">
<ElButton type="primary" @click="AddFlowWater"></ElButton>
<ElButton type="primary" @click="downLoadDetail"></ElButton>
<ElButton type="primary" @click="batchCheck"></ElButton>
</template> -->
</Table>
</ContentWrap>
</template>

@ -1,3 +0,0 @@
import identificationTable from './identificationTable.vue'
export { identificationTable }

@ -1,571 +0,0 @@
import { createRouter, createWebHashHistory } from 'vue-router'
import type { RouteRecordRaw } from 'vue-router'
import type { App } from 'vue'
import { Layout } from '@/utils/routerHelper'
import { useI18n } from '@/hooks/web/useI18n'
const { t } = useI18n()
export const constantRouterMap: AppRouteRecordRaw[] = [
{
path: '/',
component: Layout,
redirect: '/dashboard/analysis',
name: 'Root',
meta: {
hidden: true
}
},
{
path: '/dashboard',
component: Layout,
redirect: '/dashboard/analysis',
name: 'Dashboard',
meta: {
title: '首页',
icon: 'ant-design:dashboard-filled',
alwaysShow: true
},
children: [
{
path: 'analysis',
component: () => import('@/views/Dashboard/Analysis.vue'),
name: 'Analysis',
meta: {
title: '分析页',
noCache: true,
affix: true
}
}
]
},
{
path: '/redirect',
component: Layout,
name: 'Redirect',
children: [
{
path: '/redirect/:path(.*)',
name: 'Redirect',
component: () => import('@/views/Redirect/Redirect.vue'),
meta: {}
}
],
meta: {
hidden: true,
noTagsView: true
}
},
{
path: '/login',
component: () => import('@/views/Login/Login.vue'),
name: 'Login',
meta: {
hidden: true,
title: t('router.login'),
noTagsView: true
}
},
{
path: '/404',
component: () => import('@/views/Error/404.vue'),
name: 'NoFind',
meta: {
hidden: true,
title: '404',
noTagsView: true
}
}
]
export const asyncRouterMap: AppRouteRecordRaw[] = [
{
path: '/dashboard',
component: Layout,
redirect: '/dashboard/analysis',
name: 'Dashboard',
meta: {
title: t('router.dashboard'),
icon: 'ant-design:dashboard-filled',
alwaysShow: true
},
children: [
{
path: 'analysis',
component: () => import('@/views/Dashboard/Analysis.vue'),
name: 'Analysis',
meta: {
title: t('router.analysis'),
noCache: true,
affix: true
}
}
]
},
{
path: '/data-manage',
component: Layout,
redirect: '/data-manage/data-source-manage',
name: 'DataManage',
menuId: 'DataManage',
meta: {
title: '数据管理',
icon: 'tdesign:data-base',
alwaysShow: true
},
children: [
{
path: 'data-model-manage',
component: () => import('@/views/DataManage/DataModelManage/DataModelManage.vue'),
name: 'DataModelManage',
menuId: 'DataManage/DataModelManage',
meta: {
title: '数据模型管理'
}
},
{
path: 'data-set-manage',
component: () => import('@/views/DataManage/DataSetManage/DataSetManage.vue'),
name: 'DataSetManage',
menuId: 'DataManage/DataSetManage',
meta: {
title: '数据集管理'
}
}
]
},
{
path: '/data-review',
component: Layout,
redirect: '/data-review/data-review-detail-rule',
name: 'DataReview',
menuId: 'DataReview',
meta: {
title: t('router.dataReview'),
icon: 'tdesign:data-checked',
alwaysShow: true
},
children: [
{
path: 'data-review-detail-rule',
component: () => import('@/views/srdb/SrdbKxqRule/SrdbKxqRule.vue'),
name: 'SrdbKxqRule',
menuId: 'DataReview/SrdbKxqRule',
meta: {
title: '规则配置'
}
},
{
path: 'data-review-detail-rule',
component: () => import('@/views/DataReview/DataReviewDetailRule/DataReviewDetailRule.vue'),
name: 'DataReviewDetailRule',
menuId: 'DataReview/DataReviewDetailRule',
meta: {
title: '明细规则配置'
}
},
{
path: 'data-review-detail-rule-config/:id',
component: () =>
import('@/views/DataReview/DataReviewDetailRuleConfig/DataReviewDetailRuleConfig.vue'),
name: 'DataReviewDetailRuleConfig',
menuId: 'DataReview/DataReviewDetailRuleConfig',
meta: {
hidden: true,
title: '规则配置',
canTo: true,
activeMenu: '/data-review/data-review-detail-rule'
}
},
{
path: 'data-review-detail',
component: () => import('@/views/DataReview/DataReviewDetail.vue'),
name: 'DataReviewDetail',
menuId: 'DataReview/DataReviewDetail',
meta: {
title: t('router.dataReviewDetail')
}
},
{
path: 'data-review-detail-result',
component: () => import('@/views/DataReview/DataReviewDetailResult.vue'),
name: 'DataReviewDetailResult',
menuId: 'DataReview/DataReviewDetailResult',
meta: {
title: t('router.dataReviewDetailResult')
}
}
]
},
{
path: '/report-manage',
component: Layout,
redirect: '/report-manage/report-build-file',
name: 'ReportManage',
menuId: 'ReportManage',
meta: {
title: t('router.ReportManage'),
icon: 'ep:document',
alwaysShow: true
},
children: [
{
path: 'report-build-file',
component: () => import('@/views/Template/ReportBuildFile/ReportBuildFile.vue'),
name: 'ReportBuildFile',
menuId: 'ReportManage/ReportBuildFile',
meta: {
title: t('router.ReportBuildFile')
}
},
{
path: 'report-file-push',
component: () => import('@/views/Template/ReportFIlePush/ReportFilePush.vue'),
name: 'ReportFilePush',
menuId: 'ReportManage/ReportFilePush',
meta: {
title: t('router.ReportFilePush')
}
},
{
path: 'report-temp-config',
component: () => import('@/views/Template/ReportTempConfig/ReportTempConfig.vue'),
name: 'ReportTempConfig',
menuId: 'ReportManage/ReportTempConfig',
meta: {
title: t('router.ReportTempConfig')
}
},
{
path: 'temp-submit-manage',
component: () => import('@/views/Template/TempSubmitManage/TempSubmitManage.vue'),
name: 'TempSubmitManage',
menuId: 'ReportManage/TempSubmitManage',
meta: {
title: t('router.TempSubmitManage')
}
}
]
},
{
path: '/trusted-zone',
component: Layout,
redirect: '/trusted-zone/database-table-query',
name: 'trustedZone',
menuId: 'trustedZone',
meta: {
title: '可信区管理',
icon: 'tdesign:view-module',
alwaysShow: true
},
children: [
{
path: 'database-table-query',
component: () =>
import('@/views/TrustedZoneManage/DatabaseTableQuery/DatabaseTableQuery.vue'),
name: 'DatabaseTableQuery',
menuId: 'trustedZone/DatabaseTableQuery',
meta: {
title: '库表信息查询'
}
},
{
path: 'field-info-query',
component: () => import('@/views/TrustedZoneManage/FieldInfoQuery/FieldInfoQuery.vue'),
name: 'FieldInfoQuery',
menuId: 'trustedZone/FieldInfoQuery',
meta: {
title: '字段信息查询'
}
},
{
path: 'ledger-info-query',
component: () => import('@/views/TrustedZoneManage/LedgerInfoQuery/LedgerInfoQuery.vue'),
name: 'LedgerInfoQuery',
menuId: 'trustedZone/LedgerInfoQuery',
meta: {
title: '台账信息查询'
}
},
{
path: 'action-log-query',
component: () => import('@/views/TrustedZoneManage/ActionLogQuery/ActionLogQuery.vue'),
name: 'ActionLogQuery',
menuId: 'trustedZone/ActionLogQuery',
meta: {
title: '操作日志查询'
}
}
]
},
{
path: '/multipleQuery',
component: Layout,
redirect: '/multipleQuery/serviceLog',
name: 'multipleQuery',
menuId: 'multipleQuery',
meta: {
title: '综合查询',
icon: 'ep:data-analysis',
alwaysShow: true
},
children: [
{
path: 'serviceLog',
component: () => import('@/views/MultipleQuery/ServiceLog/ServiceLog.vue'),
name: 'ServiceLog',
menuId: 'multipleQuery/ServiceLog',
meta: {
title: t('router.servicelogqueryprototype')
}
},
{
path: 'submit-data-query',
component: () => import('@/views/MultipleQuery/SubmitDataQuery/SubmitDataQuery.vue'),
name: 'SubmitDataQuery',
menuId: 'multipleQuery/SubmitDataQuery',
meta: {
title: '报送数据查询'
}
}
]
},
{
path: '/amld',
component: Layout,
name: 'Amld',
menuId: 'Amld',
meta: {
title: '数据补录',
icon: 'eos-icons:role-binding',
alwaysShow: true,
},
children: [
{
path: 'amlRuleCust',
component: () => import('@/views/amld/AmlRuleCust/AmlRuleCust.vue'),
name: 'AmlRuleCust',
menuId: 'amld/AmlRuleCust',
meta: {
title: '客户信息补录'
}
},
]
},
{
path: '/job',
component: Layout,
redirect: '/job/rep-job',
name: 'Job',
menuId: 'Job',
meta: {
title: '作业管理',
icon: 'tdesign:task-setting',
alwaysShow: true
},
children: [
{
path: 'rep-job',
component: () => import('@/views/job/RepJob/RepJob.vue'),
name: 'RepJob',
menuId: 'job/RepJob',
meta: {
title: '作业配置'
}
},
{
path: 'JobMonitor',
component: () => import('@/views/job/RepTask/RepTask.vue'),
name: 'JobMonitor',
menuId: 'job/JobMonitor',
meta: {
title: '作业监控'
}
}
]
},
{
path: '/system',
component: Layout,
redirect: '/system/sys-menu',
name: 'System',
menuId: 'System',
meta: {
title: '系统管理',
icon: 'eos-icons:role-binding',
alwaysShow: true
},
children: [
{
path: 'rep-data-source',
component: () => import('@/views/param/RepDataSource/RepDataSource.vue'),
name: 'RepDataSource',
menuId: 'param/RepDataSource',
meta: {
title: '数据源管理'
}
},
{
path: 'sys-login-log',
component: () => import('@/views/system/SysLoginLog/SysLoginLog.vue'),
name: 'SysLoginLog',
menuId: 'system/SysLoginLog',
meta: {
title: '登陆日志查询'
}
},
{
path: 'sys-menu',
component: () => import('@/views/system/SysMenu/SysMenu.vue'),
name: 'SysMenu',
menuId: 'system/SysMenu',
meta: {
title: '菜单管理'
}
},
{
path: 'sys-role',
component: () => import('@/views/system/SysRole/SysRole.vue'),
name: 'SysRole',
menuId: 'system/SysRole',
meta: {
title: '角色管理'
}
},
{
path: 'sys-user',
component: () => import('@/views/system/SysUser/SysUser.vue'),
name: 'SysUser',
menuId: 'system/SysUser',
meta: {
title: '用户管理'
}
},
{
path: 'sys-organ',
component: () => import('@/views/param/SysOrgan/SysOrgan.vue'),
name: 'SysOrgan',
menuId: 'param/SysOrgan',
meta: {
title: '机构管理'
}
},
{
path: 'amlRuleCust',
component: () => import('@/views/amld/AmlRuleCust/AmlRuleCust.vue'),
name: 'AmlRuleCust',
menuId: 'system/AmlRuleCust',
meta: {
title: '客户信息补录'
}
},
{
path: 'sys-role',
component: () => import('@/views/system/SysRole/SysRole.vue'),
name: 'SysRole',
menuId: 'system/SysRole',
meta: {
title: '角色管理',
},
},
{
path: 'sys-user',
component: () => import('@/views/system/SysUser/SysUser.vue'),
name: 'SysUser',
menuId: 'system/SysUser',
meta: {
title: '用户管理',
},
},
{
path: 'sys-organ',
component: () => import('@/views/param/SysOrgan/SysOrgan.vue'),
name: 'SysOrgan',
menuId: 'param/SysOrgan',
meta: {
title: '机构管理',
},
},
{
path: 'sys-organ-tree',
component: () => import('@/views/param/SysOrganTree/SysOrganTree.vue'),
name: 'SysOrganTree',
menuId: 'param/SysOrganTree',
meta: {
title: '机构树管理'
}
},
{
path: 'sys-org-tree-detail/:id',
component: () => import('@/views/param/SysOrgTreeDetail/SysOrgTreeDetail.vue'),
name: 'SysOrgTreeDetail',
menuId: 'param/SysOrgTreeDetail',
meta: {
title: '机构树管理',
hidden: true
}
}
]
},
{
path: '/csck',
component: Layout,
redirect: '/csck/rep-job',
name: 'csck',
menuId: 'csck',
meta: {
title: '跨系统校验',
icon: 'tdesign:task-setting',
alwaysShow: true
},
children: [
{
path: 'CsckBusinessSystem',
component: () => import('@/views/csck/CsckBusinessSystem/CsckBusinessSystem.vue'),
name: 'CsckBusinessSystem',
menuId: 'csck/CsckBusinessSystem',
meta: {
title: '业务系统管理',
hidden: false
}
},
{
path: 'CsckBusinessSystem1',
component: () => import('@/views/csck/CsckBusinessSystem/CsckBusinessSystem1.vue'),
name: 'CsckBusinessSystem1',
menuId: 'csck/CsckBusinessSystem1',
meta: {
title: '业务系统管理1',
hidden: false
}
},
]
}
]
const router = createRouter({
history: createWebHashHistory(),
strict: true,
routes: constantRouterMap as RouteRecordRaw[],
scrollBehavior: () => ({ left: 0, top: 0 })
})
export const resetRouter = (): void => {
const resetWhiteNameList = ['Redirect', 'Login', 'NoFind', 'Root']
router.getRoutes().forEach((route) => {
const { name } = route
if (name && !resetWhiteNameList.includes(name as string)) {
router.hasRoute(name) && router.removeRoute(name)
}
})
}
export const setupRouter = (app: App<Element>) => {
app.use(router)
}
export default router

File diff suppressed because it is too large Load Diff

@ -1,143 +0,0 @@
import { createRouter, createWebHashHistory } from 'vue-router';
import type { RouteRecordRaw } from 'vue-router';
import type { App } from 'vue';
import { Layout } from '@/utils/routerHelper';
import { useI18n } from '@/hooks/web/useI18n';
const { t } = useI18n();
export const constantRouterMap: AppRouteRecordRaw[] = [
{
path: '/',
component: Layout,
redirect: '/dashboard/home',
name: 'Root',
meta: {
hidden: true
}
},
{
path: '/dashboard',
component: Layout,
redirect: '/dashboard/home',
name: 'Dashboard',
menuId: 'Dashboard',
meta: {
title: '首页',
icon: 'ant-design:home-outlined',
hidden: true,
},
children: [
{
path: 'home',
component: () => import('@/views/csck/CsckWorkFlow/CsckWorkFlow.vue'),
name: 'Home',
menuId: 'Home',
meta: {
title: '待办任务',
affix: true,
hidden: true,
},
},
],
},
{
path: '/redirect',
component: Layout,
name: 'Redirect',
children: [
{
path: '/redirect/:path(.*)',
name: 'Redirect',
component: () => import('@/views/Redirect/Redirect.vue'),
meta: {},
},
],
meta: {
hidden: true,
noTagsView: true,
},
},
{
path: '/login',
component: () => import('@/views/Login/Login.vue'),
name: 'Login',
meta: {
hidden: true,
title: t('router.login'),
noTagsView: true,
},
},
{
path: '/thirdPlatLogin',
component: () => import('@/views/Login/thirdPlatLogin.vue'),
name: 'thirdPlatLogin',
meta: {
hidden: true
},
},
{
path: '/404',
component: () => import('@/views/Error/404.vue'),
name: 'NoFind',
meta: {
hidden: true,
title: '404',
noTagsView: true,
},
},
{
path: '/RepJob',
component: () => import('@/views/job/RepJob/RepJob.vue'),
name: 'RepJob',
meta: {
title: '作业配置',
hidden:true
},
},
{
path: '/JobMonitor',
component: () => import('@/views/job/RepTask/RepTask.vue'),
name: 'JobMonitor',
meta: {
title: '任务监控',
hidden:true
},
},
{
path: '/RepScheduleJob',
component: () => import('@/views/job/RepScheduleJob/RepScheduleJob.vue'),
name: 'RepScheduleJob',
meta: {
title: '定时任务列表',
hidden:true
},
}
];
export const asyncRouterMap: AppRouteRecordRaw[] = [];
const router = createRouter({
history: createWebHashHistory(),
strict: true,
routes: constantRouterMap as RouteRecordRaw[],
scrollBehavior: () => ({ left: 0, top: 0 }),
});
export const resetRouter = (): void => {
const resetWhiteNameList = ['Redirect', 'Login', 'NoFind', 'Root'];
router.getRoutes().forEach(route => {
const { name } = route;
if (name && !resetWhiteNameList.includes(name as string)) {
router.hasRoute(name) && router.removeRoute(name);
}
});
};
export const setupRouter = (app: App<Element>) => {
app.use(router);
};
export default router;

File diff suppressed because it is too large Load Diff

@ -7,8 +7,8 @@
<ElInput v-model="IndexInfoData.startIndexTemp" type="number" style="width:100px;" class="OperateButton" /> -
<ElInput v-model="IndexInfoData.endIndexTemp" type="number" class="OperateButton" style="width:100px;" />
<ElButton type="primary" @click="getIndexTrend"></ElButton>
<ElButton type="primary">数据导出</ElButton>
<ElButton type="primary">转换</ElButton>
<!-- <ElButton type="primary">数据导出</ElButton>
<ElButton type="primary">转换</ElButton> -->
</div>
<div v-loading="chartsLoading">

@ -111,26 +111,22 @@ export default ({ command, mode }: ConfigEnv): UserConfig => {
proxy: {
// 选项写法
'/api': {
//target: 'http://214.129.16.68:8088/rdvs',
// target: 'http://172.16.87.111:8083/ordb',
target: 'http://localhost:8082/srdb',
// target: 'http://172.16.87.111:8080/portal',
// target: 'http://localhost:8082/portal',
// target: 'http://192.168.183.136:8082/portal',
// target: 'http://172.16.87.114:8095/ordb',
changeOrigin: true,
rewrite: path => path.replace(/^\/api/, '')
},
'/pro': {
//target: 'http://214.129.16.68:8088/rdvs',
// target: 'http://172.16.87.111:8083/ordb',
target: 'http://localhost:8082/srdb',
// target: 'http://172.16.87.111:8080/portal',
// target: 'http://localhost:8082/portal',
// target: 'http://172.20.10.4:8082/portal',
// target: 'http://192.168.183.136:8082/portal',
// target: 'http://172.16.87.114:8095/ordb',
changeOrigin: true,
rewrite: path => path.replace(/^\/pro/, '')
},
'/dev': {
target: 'http://172.16.87.114:8095/ordb',
changeOrigin: true,
rewrite: path => path.replace(/^\/dev/, '')
},
},
hmr: {
overlay: false

Loading…
Cancel
Save