补充修改

This commit is contained in:
shizhong 2024-03-12 19:51:40 +08:00
parent f1c2a6ef37
commit b7ec0eef6d
55 changed files with 177 additions and 301 deletions

10
.vscode/launch.json vendored
View File

@ -1,12 +1,16 @@
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "Launch debug",
"type": "msedge",
"request": "launch",
"type": "chrome",
"name": "Launch Edge against localhost",
"url": "http://localhost",
"webRoot": "${workspaceFolder}/src"
"webRoot": "${workspaceFolder}/src",
"sourceMaps": true
}
]
}

View File

@ -5,6 +5,7 @@ import progress from 'vite-plugin-progress'
import EslintPlugin from 'vite-plugin-eslint'
import PurgeIcons from 'vite-plugin-purge-icons'
import { ViteEjsPlugin } from 'vite-plugin-ejs'
// @ts-ignore
import ElementPlus from 'unplugin-element-plus/vite'
import AutoImport from 'unplugin-auto-import/vite'
import Components from 'unplugin-vue-components/vite'
@ -17,10 +18,12 @@ import UnoCSS from 'unocss/vite'
export function createVitePlugins() {
const root = process.cwd()
// 路径查找
function pathResolve(dir: string) {
return resolve(root, '.', dir)
}
return [
Vue(),
VueJsx(),

View File

@ -17,7 +17,6 @@ const include = [
'cropperjs',
'lodash-es',
'nprogress',
'animate.css',
'vxe-table',
'vxe-table/es/style',
'vxe-table/lib/locale/lang/zh-CN',

View File

@ -49,7 +49,7 @@ export const getReturnList = async (params) => {
// 回退
export const returnTask = async (data) => {
return await request.put({ url: '/bpm/task/rollback', data })
return await request.put({ url: '/bpm/task/return', data })
}
/**

View File

@ -1,22 +1,12 @@
import request from '@/config/axios'
export interface DataSourceConfigVO {
id: number
id: number | undefined
name: string
url: string
username: string
password: string
createTime: Date
}
// 查询数据源配置列表
export const getDataSourceConfigListApi = () => {
return request.get({ url: '/infra/data-source-config/list' })
}
// 查询数据源配置详情
export const getDataSourceConfigApi = (id: number) => {
return request.get({ url: '/infra/data-source-config/get?id=' + id })
createTime?: Date
}
// 新增数据源配置
@ -33,3 +23,13 @@ export const updateDataSourceConfigApi = (data: DataSourceConfigVO) => {
export const deleteDataSourceConfigApi = (id: number) => {
return request.delete({ url: '/infra/data-source-config/delete?id=' + id })
}
// 查询数据源配置列表
export const getDataSourceConfigListApi = () => {
return request.get({ url: '/infra/data-source-config/list' })
}
// 查询数据源配置详情
export const getDataSourceConfigApi = (id: number) => {
return request.get({ url: '/infra/data-source-config/get?id=' + id })
}

View File

@ -13,6 +13,7 @@ export interface FileClientConfig {
accessSecret?: string
domain: string
}
export interface FileConfigVO {
id: number
name: string

View File

@ -6,36 +6,3 @@ import request from '@/config/axios'
export const getCacheApi = () => {
return request.get({ url: '/infra/redis/get-monitor-info' })
}
// 获取模块
export const getKeyDefineListApi = () => {
return request.get({ url: '/infra/redis/get-key-define-list' })
}
/**
* redis key列表
*/
export const getKeyListApi = (keyTemplate: string) => {
return request.get({
url: '/infra/redis/get-key-list',
params: {
keyTemplate
}
})
}
// 获取缓存内容
export const getKeyValueApi = (key: string) => {
return request.get({ url: '/infra/redis/get-key-value?key=' + key })
}
// 根据键名删除缓存
export const deleteKeyApi = (key: string) => {
return request.delete({ url: '/infra/redis/delete-key?key=' + key })
}
export const deleteKeysApi = (keyTemplate: string) => {
return request.delete({
url: '/infra/redis/delete-keys?',
params: {
keyTemplate
}
})
}

View File

@ -174,12 +174,3 @@ export interface RedisCommandStatsVO {
calls: number
usec: number
}
export interface RedisKeyInfo {
keyTemplate: string
keyType: string
valueType: string
timeoutType: number
timeout: number
memo: string
}

View File

@ -20,8 +20,8 @@ export interface Sku {
stock?: number // 库存
weight?: number // 商品重量单位kg 千克
volume?: number // 商品体积单位m^3 平米
firstBrokerageRecord?: number | string // 一级分销的佣金
secondBrokerageRecord?: number | string // 二级分销的佣金
firstBrokeragePrice?: number | string // 一级分销的佣金
secondBrokeragePrice?: number | string // 二级分销的佣金
salesCount?: number // 商品销量
}

View File

@ -2,7 +2,7 @@ import request from '@/config/axios'
import type { DictDataVO, DictDataPageReqVO, DictDataExportReqVO } from './types'
// 查询字典数据(精简)列表
export const listSimpleDictDataApi = () => {
export const getSimpleDictDataList = () => {
return request.get({ url: '/system/dict-data/simple-list' })
}

View File

@ -1,10 +1,10 @@
import request from '@/config/axios'
export interface ErrorCodeVO {
id: number
id: number | undefined
type: number
applicationName: string
code: number
code: number | undefined
message: string
memo: string
createTime: Date

View File

@ -25,6 +25,7 @@ export interface LoginLogReqVO extends PageParam {
export const getLoginLogPageApi = (params: LoginLogReqVO) => {
return request.get({ url: '/system/login-log/page', params })
}
// 导出登录日志
export const exportLoginLogApi = (params: LoginLogReqVO) => {
return request.download({ url: '/system/login-log/export', params })

View File

@ -1,8 +1,9 @@
import request from '@/config/axios'
export interface NotifyTemplateVO {
id: number
id?: number
name: string
nickname: string
code: string
content: string
type?: number
@ -19,7 +20,7 @@ export interface NotifyTemplatePageReqVO extends PageParam {
}
export interface NotifySendReqVO {
userId: number
userId: number | null
templateCode: string
templateParams: Map<String, Object>
}

View File

@ -30,17 +30,17 @@ export const getOAuth2ClientPageApi = (params: OAuth2ClientPageReqVO) => {
return request.get({ url: '/system/oauth2-client/page', params })
}
// 查询 OAuth2详情
// 查询 OAuth2 客户端的详情
export const getOAuth2ClientApi = (id: number) => {
return request.get({ url: '/system/oauth2-client/get?id=' + id })
}
// 新增 OAuth2
// 新增 OAuth2 客户端
export const createOAuth2ClientApi = (data: OAuth2ClientVO) => {
return request.post({ url: '/system/oauth2-client/create', data })
}
// 修改 OAuth2
// 修改 OAuth2 客户端
export const updateOAuth2ClientApi = (data: OAuth2ClientVO) => {
return request.put({ url: '/system/oauth2-client/update', data })
}

View File

@ -7,6 +7,8 @@ export interface RoleVO {
sort: number
status: number
type: number
dataScope: number
dataScopeDeptIds: number[]
createTime: Date
}
@ -56,3 +58,11 @@ export const updateRoleStatusApi = async (data: UpdateStatusReqVO) => {
export const deleteRoleApi = async (id: number) => {
return await request.delete({ url: '/system/role/delete?id=' + id })
}
// 导出角色
export const exportRole = (params) => {
return request.download({
url: '/system/role/export-excel',
params
})
}

View File

@ -1,4 +1,5 @@
import request from '@/config/axios'
import qs from 'qs'
export interface SensitiveWordVO {
id: number
@ -16,11 +17,9 @@ export interface SensitiveWordPageReqVO extends PageParam {
createTime?: Date[]
}
export interface SensitiveWordExportReqVO {
name?: string
tag?: string
status?: number
createTime?: Date[]
export interface SensitiveWordTestReqVO {
text: string
tag: string[]
}
// 查询敏感词列表
@ -49,7 +48,7 @@ export const deleteSensitiveWordApi = (id: number) => {
}
// 导出敏感词
export const exportSensitiveWordApi = (params: SensitiveWordExportReqVO) => {
export const exportSensitiveWordApi = (params: SensitiveWordPageReqVO) => {
return request.download({ url: '/system/sensitive-word/export-excel', params })
}
@ -59,6 +58,8 @@ export const getSensitiveWordTagsApi = () => {
}
// 获得文本所包含的不合法的敏感词数组
export const validateTextApi = (id: number) => {
return request.get({ url: '/system/sensitive-word/validate-text?' + id })
export const validateTextApi = (query: SensitiveWordTestReqVO) => {
return request.get({
url: '/system/sensitive-word/validate-text?' + qs.stringify(query, { arrayFormat: 'repeat' })
})
}

View File

@ -91,10 +91,10 @@ export const updateUserStatusApi = (id: number, status: number) => {
}
// 获取用户精简信息列表
export const getListSimpleUsersApi = () => {
export const getListSimpleUsersApi = (): Promise<UserVO[]> => {
return request.get({ url: '/system/user/simple-list' })
}
export const getSimpleUserList = () => {
export const getSimpleUserList = (): Promise<UserVO[]> => {
return request.get({ url: '/system/user/simple-list' })
}

View File

@ -196,8 +196,11 @@
max-height="600px"
>
<!-- append-to-body -->
<div>
<pre><code class="hljs" v-html="highlightedCode(previewResult)"></code></pre>
<div v-highlight>
<code class="hljs">
<!-- 高亮代码块 -->
{{ previewResult }}
</code>
</div>
</Dialog>
</div>
@ -233,6 +236,14 @@ import flowableModdleExtension from './plugins/extension-moddle/flowable'
// import xml2js from 'xml-js'
// import xml2js from 'fast-xml-parser'
import { XmlNode, XmlNodeType, parseXmlString } from 'steady-xml'
//
// import hljs from 'highlight.js/lib/highlight'
// import 'highlight.js/styles/github-gist.css'
// hljs.registerLanguage('xml', 'highlight.js/lib/languages/xml')
// hljs.registerLanguage('json', 'highlight.js/lib/languages/json')
// const eventName = reactive({
// name: ''
// })
defineOptions({ name: 'MyProcessDesigner' })
@ -360,9 +371,9 @@ const additionalModules = computed(() => {
return Modules
})
const moddleExtensions = computed(() => {
// console.log(props.onlyCustomizeModdle, 'props.onlyCustomizeModdle')
// console.log(props.moddleExtension, 'props.moddleExtension')
// console.log(props.prefix, 'props.prefix')
console.log(props.onlyCustomizeModdle, 'props.onlyCustomizeModdle')
console.log(props.moddleExtension, 'props.moddleExtension')
console.log(props.prefix, 'props.prefix')
const Extensions: any = {}
// 使
if (props.onlyCustomizeModdle) {
@ -425,22 +436,22 @@ const initBpmnModeler = () => {
// bpmnModeler.createDiagram()
// console.log(bpmnModeler, 'bpmnModeler111111')
console.log(bpmnModeler, 'bpmnModeler111111')
emit('init-finished', bpmnModeler)
initModelListeners()
}
const initModelListeners = () => {
const EventBus = bpmnModeler.get('eventBus')
// console.log(EventBus, 'EventBus')
console.log(EventBus, 'EventBus')
// , . - ,
props.events.forEach((event: any) => {
EventBus.on(event, function (eventObj) {
// let eventName = event.replace(/\./g, '-')
let eventName = event.replace(/\./g, '-')
// eventName.name = eventName
let element = eventObj ? eventObj.element : null
// console.log(eventName, 'eventName')
// console.log(element, 'element')
console.log(eventName, 'eventName')
console.log(element, 'element')
emit('element-click', element, eventObj)
// emit(eventName, element, eventObj)
})
@ -467,7 +478,7 @@ const initModelListeners = () => {
}
/* 创建新的流程图 */
const createNewDiagram = async (xml) => {
// console.log(xml, 'xml')
console.log(xml, 'xml')
//
let newId = props.processId || `Process_${new Date().getTime()}`
let newName = props.processName || `业务流程_${new Date().getTime()}`
@ -476,7 +487,7 @@ const createNewDiagram = async (xml) => {
// console.log(xmlString, 'xmlString')
// console.log(this.bpmnModeler.importXML);
let { warnings } = await bpmnModeler.importXML(xmlString)
// console.log(warnings, 'warnings')
console.log(warnings, 'warnings')
if (warnings && warnings.length) {
warnings.forEach((warn) => console.warn(warn))
}
@ -556,7 +567,7 @@ const downloadProcessAsSvg = () => {
}
const processSimulation = () => {
simulationStatus.value = !simulationStatus.value
// console.log(bpmnModeler.get('toggleMode', 'strict'), "bpmnModeler.get('toggleMode')")
console.log(bpmnModeler.get('toggleMode', 'strict'), "bpmnModeler.get('toggleMode')")
props.simulation && bpmnModeler.get('toggleMode', 'strict').toggleMode()
}
const processRedo = () => {
@ -619,7 +630,7 @@ const elementsAlign = (align) => {
}
/*----------------------------- 方法结束 ---------------------------------*/
const previewProcessXML = () => {
// console.log(bpmnModeler.saveXML, 'bpmnModeler')
console.log(bpmnModeler.saveXML, 'bpmnModeler')
bpmnModeler.saveXML({ format: true }).then(({ xml }) => {
// console.log(xml, 'xml111111')
previewResult.value = xml
@ -655,10 +666,10 @@ const previewProcessJson = () => {
}
/* ------------------------------------------------ 芋道源码 methods ------------------------------------------------------ */
const processSave = async () => {
// console.log(bpmnModeler, 'bpmnModelerbpmnModelerbpmnModelerbpmnModeler')
console.log(bpmnModeler, 'bpmnModelerbpmnModelerbpmnModelerbpmnModeler')
const { err, xml } = await bpmnModeler.saveXML()
// console.log(err, 'errerrerrerrerr')
// console.log(xml, 'xmlxmlxmlxmlxml')
console.log(err, 'errerrerrerrerr')
console.log(xml, 'xmlxmlxmlxmlxml')
//
if (err) {
// this.$modal.msgError('')
@ -668,38 +679,20 @@ const processSave = async () => {
// save
emit('save', xml)
}
/** 高亮显示 */
// const highlightedCode = (previewType, previewResult) => {
// console.log(previewType, 'previewType, previewResult')
// console.log(previewResult, 'previewType, previewResult')
// console.log(hljs.highlight, 'hljs.highlight')
// const result = hljs.highlight(previewType, previewResult.value || '', true)
// return result.value || '&nbsp;'
// }
onBeforeMount(() => {
// console.log(props, 'propspropspropsprops')
console.log(props, 'propspropspropsprops')
})
/**
* 代码高亮
*/
import hljs from 'highlight.js' //
import 'highlight.js/styles/github.css' //
import java from 'highlight.js/lib/languages/java'
import xml from 'highlight.js/lib/languages/java'
import javascript from 'highlight.js/lib/languages/javascript'
import sql from 'highlight.js/lib/languages/sql'
import typescript from 'highlight.js/lib/languages/typescript'
const highlightedCode = (item) => {
const language = item.filePath.substring(item.filePath.lastIndexOf('.') + 1)
const result = hljs.highlight(language, item.code || '', true)
return result.value || '&nbsp;'
}
/** 初始化 **/
onMounted(async () => {
onMounted(() => {
initBpmnModeler()
createNewDiagram(props.value)
//
hljs.registerLanguage('java', java)
hljs.registerLanguage('xml', xml)
hljs.registerLanguage('html', xml)
hljs.registerLanguage('vue', xml)
hljs.registerLanguage('javascript', javascript)
hljs.registerLanguage('sql', sql)
hljs.registerLanguage('typescript', typescript)
})
onBeforeUnmount(() => {
// this.$once('hook:beforeDestroy', () => {

View File

@ -1,4 +1,4 @@
<script lang="ts" name="Footer" setup>
<script lang="ts" setup>
import { useAppStore } from '@/store/modules/app'
import { useDesign } from '@/hooks/web/useDesign'

View File

@ -3,7 +3,6 @@ import type { RouteLocationNormalizedLoaded, RouterLinkProps } from 'vue-router'
import { usePermissionStore } from '@/store/modules/permission'
import { useTagsViewStore } from '@/store/modules/tagsView'
import { useAppStore } from '@/store/modules/app'
import { filterAffixTags } from './helper'
import { ContextMenu, ContextMenuExpose } from '@/layout/components/ContextMenu'
import { useDesign } from '@/hooks/web/useDesign'

View File

@ -454,5 +454,5 @@ export default {
btn_zoom_out: 'Zoom out',
preview: 'Preivew'
},
'OAuth 2.0': 'OAuth 2.0'
'OAuth 2.0': 'OAuth 2.0' // 避免菜单名是 OAuth 2.0 时,一直 warn 报错
}

View File

@ -122,7 +122,7 @@ const remainingRouter: AppRouteRecordRaw[] = [
hidden: true,
canTo: true,
icon: '',
activeMenu: 'system/dict/index'
activeMenu: '/system/dict'
}
}
]
@ -567,7 +567,8 @@ const remainingRouter: AppRouteRecordRaw[] = [
meta: {
title: '联系人详情',
noCache: true,
hidden: true
hidden: true,
activeMenu: '/crm/contact'
},
component: () => import('@/views/crm/contact/detail/index.vue')
},

View File

@ -1,9 +1,10 @@
import { defineStore } from 'pinia'
import { store } from '../index'
// @ts-ignore
import { DictDataVO } from '@/api/system/dict/types'
import { CACHE_KEY, useCache } from '@/hooks/web/useCache'
const { wsCache } = useCache('sessionStorage')
import { listSimpleDictDataApi } from '@/api/system/dict/dict.data'
import { getSimpleDictDataList } from '@/api/system/dict/dict.data'
export interface DictValueType {
value: any
@ -44,9 +45,9 @@ export const useDictStore = defineStore('dict', {
this.dictMap = dictMap
this.isSetDict = true
} else {
const res = await listSimpleDictDataApi()
const res = await getSimpleDictDataList()
// 设置数据
const dictDataMap = new Map<string, any>();
const dictDataMap = new Map<string, any>()
if (res != null) {
res.forEach((dictData: DictDataVO) => {
// 获得 dictType 层级
@ -61,7 +62,7 @@ export const useDictStore = defineStore('dict', {
colorType: dictData.colorType,
cssClass: dictData.cssClass
})
});
})
}
this.dictMap = dictDataMap
this.isSetDict = true
@ -76,7 +77,7 @@ export const useDictStore = defineStore('dict', {
},
async resetDict() {
wsCache.delete(CACHE_KEY.DICT_CACHE)
const res = await listSimpleDictDataApi()
const res = await getSimpleDictDataList()
// 设置数据
const dictDataMap = new Map<string, any>()
res.forEach((dictData: DictDataVO) => {

View File

@ -72,53 +72,6 @@ export function formatDate(date: Date, format?: string): string {
return date ? dayjs(date).format(format ?? 'YYYY-MM-DD HH:mm:ss') : ''
}
// TODO 芋艿:稍后去掉
// 日期格式化
export function parseTime(time: any, pattern?: string) {
if (arguments.length === 0 || !time) {
return null
}
const format = pattern || '{y}-{m}-{d} {h}:{i}:{s}'
let date
if (typeof time === 'object') {
date = time
} else {
if (typeof time === 'string' && /^[0-9]+$/.test(time)) {
time = parseInt(time)
} else if (typeof time === 'string') {
time = time
.replace(new RegExp(/-/gm), '/')
.replace('T', ' ')
.replace(new RegExp(/\.\d{3}/gm), '')
}
if (typeof time === 'number' && time.toString().length === 10) {
time = time * 1000
}
date = new Date(time)
}
const formatObj = {
y: date.getFullYear(),
m: date.getMonth() + 1,
d: date.getDate(),
h: date.getHours(),
i: date.getMinutes(),
s: date.getSeconds(),
a: date.getDay()
}
const time_str = format.replace(/{([ymdhisa])+}/g, (result, key) => {
let value = formatObj[key]
// Note: getDay() returns 0 on Sunday
if (key === 'a') {
return ['日', '一', '二', '三', '四', '五', '六'][value]
}
if (result.length > 0 && value < 10) {
value = '0' + value
}
return value || 0
})
return time_str
}
/**
* +
*/

View File

@ -271,6 +271,7 @@ export const handleTree = (data: any[], id?: string, parentId?: string, children
return tree
}
/**
*
* @param {*} data
@ -279,6 +280,7 @@ export const handleTree = (data: any[], id?: string, parentId?: string, children
* @param {*} children 'children'
* @param {*} rootId Id 0
*/
// @ts-ignore
export const handleTree2 = (data, id, parentId, children, rootId) => {
id = id || 'id'
parentId = parentId || 'parentId'

View File

@ -19,11 +19,11 @@
<el-col :span="24" style="padding-right: 10px; padding-left: 10px">
<el-form-item v-if="loginData.tenantEnable === 'true'" prop="tenantName">
<el-input
type="primary"
link
v-model="loginData.loginForm.tenantName"
:placeholder="t('login.tenantNamePlaceholder')"
:prefix-icon="iconHouse"
type="primary"
link
/>
</el-form-item>
</el-col>

View File

@ -70,7 +70,7 @@ const formRules = reactive({
status: [{ required: true, message: '状态不能为空', trigger: 'blur' }]
})
const formRef = ref() // Ref
const userList = ref([]) //
const userList = ref<any[]>([]) //
/** 打开弹窗 */
const open = async (type: string, id?: number) => {

View File

@ -16,8 +16,8 @@
</template>
<script lang="ts" setup>
import { propTypes } from '@/utils/propTypes'
import * as ActivityApi from '@/api/bpm/activity'
import { MyProcessViewer } from '@/components/bpmnProcessDesigner/package'
import * as ActivityApi from '@/api/bpm/activity'
defineOptions({ name: 'BpmProcessInstanceBpmnViewer' })

View File

@ -117,7 +117,7 @@ import { PropType } from 'vue'
import * as CodegenApi from '@/api/infra/codegen'
import * as DictDataApi from '@/api/system/dict/dict.type'
defineOptions({ name: 'InfraCodegenColumInfoForm' })
defineOptions({ name: 'InfraCodegenColumnInfoForm' })
const props = defineProps({
columns: {

View File

@ -1,4 +1,6 @@
<template>
<doc-alert title="数据库文档" url="https://doc.iocoder.cn/db-doc/" />
<ContentWrap title="数据库文档">
<div class="mb-10px">
<el-button type="primary" plain @click="handleExport('HTML')">

View File

@ -1,4 +1,7 @@
<template>
<doc-alert title="数据库 MyBatis" url="https://doc.iocoder.cn/mybatis/" />
<doc-alert title="多数据源(读写分离)" url="https://doc.iocoder.cn/dynamic-datasource/" />
<ContentWrap>
<IFrame v-if="!loading" :src="url" />
</ContentWrap>

View File

@ -1,4 +1,6 @@
<template>
<doc-alert title="Redis 缓存" url="https://doc.iocoder.cn/redis-cache/" />
<doc-alert title="本地缓存" url="https://doc.iocoder.cn/local-cache/" />
<el-scrollbar height="calc(100vh - 88px - 40px - 50px)">
<el-row>
<!-- 基本信息 -->
@ -59,68 +61,20 @@
</el-col>
</el-row>
</el-scrollbar>
<XModal v-model="dialogVisible" :title="keyTemplate + ' 模板'">
<el-row>
<el-col :span="14" class="mt-3">
<el-card shadow="always">
<template #header>
<div class="card-header">
<span>键名列表</span>
</div>
</template>
<el-table :data="cacheKeys" style="width: 100%" @row-click="handleKeyValue">
<el-table-column label="缓存键名" align="center" :show-overflow-tooltip="true">
<template #default="{ row }">
{{ row }}
</template>
</el-table-column>
<el-table-column label="操作" align="right" width="60">
<template #default="{ row }">
<XTextButton preIcon="ep:delete" @click="handleDeleteKey(row)" />
</template>
</el-table-column>
</el-table>
</el-card>
</el-col>
<el-col :span="10" class="mt-3">
<el-card shadow="always">
<template #header>
<div class="card-header">
<span>缓存内容</span>
<XTextButton
preIcon="ep:refresh"
title="清理全部"
class="float-right p-1"
@click="handleDeleteKeys(keyTemplate)"
/>
</div>
</template>
<el-descriptions :column="1">
<el-descriptions-item label="缓存键名:">{{ cacheForm.key }}</el-descriptions-item>
<el-descriptions-item label="缓存内容:">{{ cacheForm.value }}</el-descriptions-item>
</el-descriptions>
</el-card>
</el-col>
</el-row>
</XModal>
</template>
<script lang="ts" setup>
import * as RedisApi from '@/api/infra/redis'
import { RedisKeyInfo, RedisMonitorInfoVO } from '@/api/infra/redis/types'
import { DICT_TYPE } from '@/utils/dict'
import { RedisMonitorInfoVO } from '@/api/infra/redis/types'
defineOptions({ name: 'InfraRedis' })
const { t } = useI18n() //
const message = useMessage() //
const cache = ref<RedisMonitorInfoVO>()
//
const readRedisInfo = async () => {
const data = await RedisApi.getCacheApi()
cache.value = data
// loadEchartOptions(data.commandStats)
}
const dialogVisible = ref(false)
// 使
const usedmemoryEchartChika = reactive<any>({
title: {
@ -299,7 +253,7 @@ const usedMemoryInstance = async () => {
value: cache.value!.info.used_memory_human,
name: '内存消耗'
}
// console.log(cache.value!.info)
console.log(cache.value!.info)
usedmemoryEchartChika.tooltip = {
formatter: '{b} <br/>{a} : ' + cache.value!.info.used_memory_human
}
@ -313,7 +267,4 @@ onMounted(() => {
//
getSummary()
})
onBeforeMount(() => {
readRedisInfo()
})
</script>

View File

@ -1,4 +1,6 @@
<template>
<doc-alert title="服务监控" url="https://doc.iocoder.cn/server-monitor/" />
<ContentWrap>
<IFrame v-if="!loading" v-loading="loading" :src="src" />
</ContentWrap>

View File

@ -1,4 +1,6 @@
<template>
<doc-alert title="服务监控" url="https://doc.iocoder.cn/server-monitor/" />
<ContentWrap>
<IFrame v-if="!loading" v-loading="loading" :src="src" />
</ContentWrap>

View File

@ -1,4 +1,6 @@
<template>
<doc-alert title="接口文档" url="https://doc.iocoder.cn/api-doc/" />
<ContentWrap>
<IFrame :src="src" />
</ContentWrap>

View File

@ -74,7 +74,7 @@ import { useWebSocket } from '@vueuse/core'
import { getAccessToken } from '@/utils/auth'
import * as UserApi from '@/api/system/user'
defineOptions({ name: 'WebSocket' })
defineOptions({ name: 'InfraWebSocket' })
const message = useMessage() //

View File

@ -51,7 +51,7 @@ import { DICT_TYPE, getIntDictOptions } from '@/utils/dict'
import { CommonStatusEnum } from '@/utils/constants'
import * as ProductCategoryApi from '@/api/mall/product/category'
defineOptions({ name: 'ProductCategoryForm' })
defineOptions({ name: 'ProductCategory' })
const { t } = useI18n() //
const message = useMessage() //

View File

@ -15,10 +15,8 @@
</el-form-item>
</el-form>
<template #footer>
<div class="dialog-footer">
<el-button :disabled="formLoading" type="primary" @click="submitForm"> </el-button>
<el-button @click="dialogVisible = false"> </el-button>
</div>
</template>
</Dialog>
</template>

View File

@ -103,7 +103,7 @@
<el-table-column align="center" label="一级返佣(元)" min-width="168">
<template #default="{ row }">
<el-input-number
v-model="row.firstBrokerageRecord"
v-model="row.firstBrokeragePrice"
:min="0"
:precision="2"
:step="0.1"
@ -115,7 +115,7 @@
<el-table-column align="center" label="二级返佣(元)" min-width="168">
<template #default="{ row }">
<el-input-number
v-model="row.secondBrokerageRecord"
v-model="row.secondBrokeragePrice"
:min="0"
:precision="2"
:step="0.1"
@ -211,12 +211,12 @@
<template v-if="formData!.subCommissionType">
<el-table-column align="center" label="一级返佣(元)" min-width="80">
<template #default="{ row }">
{{ row.firstBrokerageRecord }}
{{ row.firstBrokeragePrice }}
</template>
</el-table-column>
<el-table-column align="center" label="二级返佣(元)" min-width="80">
<template #default="{ row }">
{{ row.secondBrokerageRecord }}
{{ row.secondBrokeragePrice }}
</template>
</el-table-column>
</template>
@ -294,7 +294,6 @@ import { PropertyAndValues } from './index'
import { ElTable } from 'element-plus'
defineOptions({ name: 'SkuList' })
const message = useMessage() //
const props = defineProps({
@ -326,8 +325,8 @@ const skuList = ref<Sku[]>([
stock: 0, //
weight: 0, //
volume: 0, //
firstBrokerageRecord: 0, //
secondBrokerageRecord: 0 //
firstBrokeragePrice: 0, //
secondBrokeragePrice: 0 //
}
]) //
@ -446,8 +445,8 @@ const generateTableData = (propertyList: any[]) => {
stock: 0,
weight: 0,
volume: 0,
firstBrokerageRecord: 0,
secondBrokerageRecord: 0
firstBrokeragePrice: 0,
secondBrokeragePrice: 0
}
// sku
const index = formData.value!.skus!.findIndex(
@ -522,8 +521,8 @@ watch(
stock: 0,
weight: 0,
volume: 0,
firstBrokerageRecord: 0,
secondBrokerageRecord: 0
firstBrokeragePrice: 0,
secondBrokeragePrice: 0
}
]
}

View File

@ -24,7 +24,7 @@ interface RuleConfig {
}
/**
*
* -
*
* @param spu
* @return PropertyAndValues
@ -51,4 +51,4 @@ const getPropertyList = (spu: Spu): PropertyAndValues[] => {
return properties
}
export { SkuList, getPropertyList, PropertyAndValues, RuleConfig }
export { SkuList, PropertyAndValues, RuleConfig, getPropertyList }

View File

@ -102,8 +102,8 @@ const formData = ref<ProductSpuApi.Spu>({
stock: 0, //
weight: 0, //
volume: 0, //
firstBrokerageRecord: 0, //
secondBrokerageRecord: 0 //
firstBrokeragePrice: 0, //
secondBrokeragePrice: 0 //
}
],
description: '', //
@ -127,15 +127,15 @@ const getDetail = async () => {
item.price = floatToFixed2(item.price)
item.marketPrice = floatToFixed2(item.marketPrice)
item.costPrice = floatToFixed2(item.costPrice)
item.firstBrokerageRecord = floatToFixed2(item.firstBrokerageRecord)
item.secondBrokerageRecord = floatToFixed2(item.secondBrokerageRecord)
item.firstBrokeragePrice = floatToFixed2(item.firstBrokeragePrice)
item.secondBrokeragePrice = floatToFixed2(item.secondBrokeragePrice)
} else {
//
item.price = formatToFraction(item.price)
item.marketPrice = formatToFraction(item.marketPrice)
item.costPrice = formatToFraction(item.costPrice)
item.firstBrokerageRecord = formatToFraction(item.firstBrokerageRecord)
item.secondBrokerageRecord = formatToFraction(item.secondBrokerageRecord)
item.firstBrokeragePrice = formatToFraction(item.firstBrokeragePrice)
item.secondBrokeragePrice = formatToFraction(item.secondBrokeragePrice)
}
})
formData.value = res
@ -165,8 +165,8 @@ const submitForm = async () => {
item.price = convertToInteger(item.price)
item.marketPrice = convertToInteger(item.marketPrice)
item.costPrice = convertToInteger(item.costPrice)
item.firstBrokerageRecord = convertToInteger(item.firstBrokerageRecord)
item.secondBrokerageRecord = convertToInteger(item.secondBrokerageRecord)
item.firstBrokeragePrice = convertToInteger(item.firstBrokeragePrice)
item.secondBrokeragePrice = convertToInteger(item.secondBrokeragePrice)
})
//
const newSliderPicUrls: any[] = []

View File

@ -60,22 +60,6 @@
<el-form-item label="用户标签" prop="tagIds">
<MemberTagSelect v-model="formData.tagIds" show-add />
</el-form-item>
<el-row>
<el-col :span="12">
<el-form-item label="用户等级" prop="levelId">
<MemberLevelSelect v-model="formData.levelId" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item
label="修改原因"
prop="levelReason"
v-if="formData.levelId !== originLevelId"
>
<el-input type="text" v-model="formData.levelReason" placeholder="请输入修改原因" />
</el-form-item>
</el-col>
</el-row>
<el-form-item label="用户分组" prop="groupId">
<MemberGroupSelect v-model="formData.groupId" />
</el-form-item>
@ -95,7 +79,6 @@ import * as UserApi from '@/api/member/user'
import * as AreaApi from '@/api/system/area'
import { defaultProps } from '@/utils/tree'
import MemberTagSelect from '@/views/member/tag/components/MemberTagSelect.vue'
import MemberLevelSelect from '@/views/member/level/components/MemberLevelSelect.vue'
import MemberGroupSelect from '@/views/member/group/components/MemberGroupSelect.vue'
const { t } = useI18n() //
@ -118,18 +101,14 @@ const formData = ref({
birthday: undefined,
mark: undefined,
tagIds: [],
levelId: undefined,
levelReason: undefined,
groupId: undefined
})
const formRules = reactive({
mobile: [{ required: true, message: '手机号不能为空', trigger: 'blur' }],
status: [{ required: true, message: '状态不能为空', trigger: 'blur' }],
levelReason: [{ required: true, message: '修改原因不能为空', trigger: 'blur' }]
status: [{ required: true, message: '状态不能为空', trigger: 'blur' }]
})
const formRef = ref() // Ref
const areaList = ref([]) //
const originLevelId = ref() //
/** 打开弹窗 */
const open = async (type: string, id?: number) => {
@ -142,7 +121,6 @@ const open = async (type: string, id?: number) => {
formLoading.value = true
try {
formData.value = await UserApi.getUser(id)
originLevelId.value = formData.value.levelId
} finally {
formLoading.value = false
}
@ -194,8 +172,6 @@ const resetForm = () => {
birthday: undefined,
mark: undefined,
tagIds: [],
levelId: undefined,
levelReason: undefined,
groupId: undefined
}
formRef.value?.resetFields()

View File

@ -1,4 +1,6 @@
<template>
<doc-alert title="公众号接入" url="https://doc.iocoder.cn/mp/account/" />
<!-- 搜索工作栏 -->
<ContentWrap>
<el-form

View File

@ -1,4 +1,6 @@
<template>
<doc-alert title="自动回复" url="https://doc.iocoder.cn/mp/auto-reply/" />
<!-- 搜索工作栏 -->
<ContentWrap>
<el-form class="-mb-15px" :model="queryParams" :inline="true" label-width="68px">

View File

@ -17,7 +17,7 @@
<span class="amr-duration" v-if="duration">{{ duration }} </span>
</el-icon>
<div v-if="content">
<el-tag type="success" size="mini">语音识别</el-tag>
<el-tag type="success" size="small">语音识别</el-tag>
{{ content }}
</div>
</div>

View File

@ -1,4 +1,6 @@
<template>
<doc-alert title="公众号图文" url="https://doc.iocoder.cn/mp/article/" />
<!-- 搜索工作栏 -->
<ContentWrap>
<el-form

View File

@ -1,4 +1,6 @@
<template>
<doc-alert title="公众号图文" url="https://doc.iocoder.cn/mp/article/" />
<!-- 搜索工作栏 -->
<ContentWrap>
<el-form

View File

@ -1,4 +1,5 @@
<template>
<doc-alert title="公众号素材" url="https://doc.iocoder.cn/mp/material/" />
<!-- 搜索工作栏 -->
<ContentWrap>
<el-form class="-mb-15px" :inline="true" label-width="68px">

View File

@ -1,4 +1,5 @@
<template>
<doc-alert title="公众号菜单" url="https://doc.iocoder.cn/mp/menu/" />
<!-- 搜索工作栏 -->
<ContentWrap>
<el-form class="-mb-15px" ref="queryFormRef" :inline="true" label-width="68px">

View File

@ -1,4 +1,6 @@
<template>
<doc-alert title="公众号标签" url="https://doc.iocoder.cn/mp/tag/" />
<!-- 搜索工作栏 -->
<ContentWrap>
<el-form

View File

@ -1,4 +1,6 @@
<template>
<doc-alert title="公众号粉丝" url="https://doc.iocoder.cn/mp/user/" />
<!-- 搜索工作栏 -->
<ContentWrap>
<el-form

View File

@ -14,7 +14,7 @@
<el-radio-group v-model="formData.socialType">
<el-radio
v-for="dict in getIntDictOptions(DICT_TYPE.SYSTEM_SOCIAL_TYPE)"
:key="dict.value as number"
:key="dict.value"
:label="dict.value"
>
{{ dict.label }}
@ -48,7 +48,7 @@
<el-radio-group v-model="formData.status">
<el-radio
v-for="dict in getIntDictOptions(DICT_TYPE.COMMON_STATUS)"
:key="dict.value as number"
:key="dict.value"
:label="dict.value"
>
{{ dict.label }}

View File

@ -28,7 +28,7 @@
>
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.SYSTEM_SOCIAL_TYPE)"
:key="dict.value as number"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
@ -43,7 +43,7 @@
>
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.USER_TYPE)"
:key="dict.value as number"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
@ -62,7 +62,7 @@
<el-select v-model="queryParams.status" class="!w-240px" clearable placeholder="请选择状态">
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.COMMON_STATUS)"
:key="dict.value as number"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>