master
管理员 9 months ago
parent 3e1dd0d21b
commit 605c0bc184

@ -9,9 +9,10 @@ const poStore = usePoStore()
.logo { .logo {
background-repeat: no-repeat; background-repeat: no-repeat;
height: 100%; height: 100%;
width: 30em; width: 100%;
background-size: auto 7.2em; background-size: auto 7em;
background-position: 0 1em; background-position: center;
background-origin: content-box;
&.logo0 { &.logo0 {
@ -26,14 +27,14 @@ const poStore = usePoStore()
background-image: url(@/assets/imgs/logo1.png), url(@/assets/imgs/logo2.png); background-image: url(@/assets/imgs/logo1.png), url(@/assets/imgs/logo2.png);
background-repeat: no-repeat, no-repeat; background-repeat: no-repeat, no-repeat;
background-size: auto 4.6em, auto 4.6em; background-size: auto 4.6em, auto 4.6em;
background-position: 1.5em bottom, 0 top; background-position: center bottom, center top;
} }
&.logo3 { &.logo3 {
background-image: url(@/assets/imgs/logo1.png), url(@/assets/imgs/logo2.png); background-image: url(@/assets/imgs/logo1.png), url(@/assets/imgs/logo2.png);
background-repeat: no-repeat, no-repeat; background-repeat: no-repeat, no-repeat;
background-size: auto 4.6em, auto 4.6em; background-size: auto 4.6em, auto 4.6em;
background-position: 1.5em top, 0 bottom; background-position: center top, center bottom;
} }

@ -0,0 +1,100 @@
<template>
<div :class="cls()">
<slot :dict="dictStore.get(props.name, Number(props.value))">{{ dictStore.get(props.name,
Number(props.value))?.label}}</slot>
</div>
</template>
<script setup>
import { useDictStore } from '@/store'
const dictStore = useDictStore();
const props = defineProps({
name: {
type: String,
required: true
},
value: {
type: [String, Number],
required: true
},
border: {
type: Boolean,
default: false
}
});
const cls = () => {
let list = [];
list.push("c-tag");
list.push('c-' + dictStore.get(props.name, Number(props.value))?.type);
if (!props.border) {
list.push("c-tag-text");
}
return list;
}
</script>
<style lang="scss" scoped>
@layer {
.c-tag {
margin: var(--margin, 0);
display: inline-flex;
justify-content: center;
align-items: center;
line-height: 1.2;
border: solid 1px currentColor;
padding: .2em .4em;
border-radius: .2em;
position: relative;
transform: scale(.85);
color: var(--color, var(--inner-color, inherit));
&::before {
content: "";
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
background-color: currentColor;
opacity: 0.1;
}
&-text {
border: none;
&::before {
content: none;
}
}
}
.c-primary {
--inner-color: var(--w-primary);
}
.c-success {
--inner-color: var(--w-success);
}
.c-info {
--inner-color: var(--w-info);
}
.c-warning {
--inner-color: var(--w-warn);
}
.c-danger {
--inner-color: var(--w-danger);
}
}
</style>

@ -0,0 +1,46 @@
<template>
<el-select v-model="modelValue" :clearable="clearable" :size="size" :placeholder="placeholder" :disabled="disabled" >
<el-option v-for="item in dictStore.list(props.name)" :key="item.value" :label="item.label" :value="item.value" />
</el-select>
</template>
<script setup>
import { useDictStore } from '@/store'
const dictStore = useDictStore();
const modelValue = defineModel({type: Number});
const props = defineProps({
name: {
type: String,
required: true
},
clearable: {
type: Boolean,
default: false
},
size: {
type: String,
default: 'default'
},
placeholder: {
type: String,
default: '请选择'
},
disabled: {
type: Boolean,
default: false
},
})
const emit = defineEmits(['change'])
</script>
<style lang="scss" scoped>
</style>

@ -0,0 +1,28 @@
<template>
<template v-for="(item,index) in dictStore.list(props.name)" :key="item.value">
<slot :dict="item" :index="index"><w-tag :value="item.value" :name="props.name" :border="props.border"/></slot>
</template>
</template>
<script setup>
import { useDictStore } from '@/store'
const dictStore = useDictStore();
const props = defineProps({
name: {
type: String,
required: true
},
border: {
type: Boolean,
default: false
}
});
</script>

@ -485,6 +485,103 @@ const emRef3 = proxy.$refs.emRef3;
</el-tab-pane> </el-tab-pane>
<el-tab-pane label="字典数据">
<h2>字典显示组件: w-tag</h2>
<div>操作类型(sys_oper_type)<w-tag name="sys_oper_type" v-for="i in 9" :key="i" :value="i"/></div>
<div>其他设置<w-tag name="sys_oper_type" value="2" border />
<w-tag name="sys_oper_type" value="3" border style="--margin: 0 2em;" />
<w-tag name="sys_oper_type" value="4" border style="color:red;" />
</div>
<div>使用插槽<w-tag name="sys_oper_type" value="2" border >
<template #default="{dict}">
{{ JSON.stringify(dict) }}
</template>
</w-tag>
</div>
<w-code language="html">{{ ` <div>操作类型(sys_oper_type)<w-tag name="sys_oper_type" v-for="i in 9" :key="i" :value="i"/></div>
<div>其他设置<w-tag name="sys_oper_type" value="2" border />
<w-tag name="sys_oper_type" value="3" border style="--margin: 0 2em;" />
<w-tag name="sys_oper_type" value="4" border style="color:red;" />
</div>
<div>使用插槽<w-tag name="sys_oper_type" value="2" border >
<template #default="{dict}">
\{\{ JSON.stringify(dict) \}\}
</template>
</w-tag>
</div>` }}</w-code>
<h3>参数说明</h3>
<ol style="margin: 1em 3em;">
<li>name: 必填字典类型</li>
<li>value: 必填字典值Number,String</li>
<li>border: 是否显示边框</li>
<li>--margin: CSS变量外边距可以直接使用margin</li>
<li>--color: 颜色优先可以直接使用color</li>
<li>插槽(default): dict</li>
</ol>
<h2>字典列表显示组件: w-tags</h2>
<div>操作类型(sys_oper_type)<w-tags name="sys_oper_type" border/></div>
<div style="--margin: 0 2em; --color: red;">操作类型(sys_oper_type)<w-tags name="sys_oper_type" border/></div>
<div >操作类型(sys_oper_type)<w-tags name="sys_oper_type">
<template #default="{dict,index}">
<div>{{ index }}:{{ dict }}</div>
</template>
</w-tags></div>
<w-code language="html">{{ ` <div>操作类型(sys_oper_type)<w-tags name="sys_oper_type" border/></div>
<div style="--margin: 0 2em; --color: red;">操作类型(sys_oper_type)<w-tags name="sys_oper_type" border/></div>
<div >操作类型(sys_oper_type)<w-tags name="sys_oper_type">
<template #default="{dict,index}">
<div>\{\{ index \}\}:\{\{ dict \}\}</div>
</template>
</w-tags></div>` }}</w-code>
<h3>参数说明</h3>
<ol style="margin: 1em 3em;">
<li>name: 必填字典类型</li>
<li>border: 是否显示边框</li>
<li>--margin: CSS变量需要父元素设定</li>
<li>--color: 颜色优先需要父元素设定</li>
<li>插槽(default): dict,index</li>
</ol>
<h2>下拉选择组件: w-tag-select</h2>
<w-tag-select name="sys_oper_type" v-model="tag1"/>{{ tag1 }}
<w-tag-select name="sys_oper_type" v-model="tag2"/>{{ tag2 }}
<w-code language="html">{{ ` <w-tag-select name="sys_oper_type" v-model="tag1"/>\{\{ tag1 \}\}
<w-tag-select name="sys_oper_type" v-model="tag2"/>\{\{ tag2 \}\}` }}</w-code>
<h3>参数说明</h3>
<ol style="margin: 1em 3em;">
<li>name: 必填字典类型</li>
<li>说明: 本组使用el-select进行简单封装,复杂应用请使用字典数据仓库完成</li>
<li>可以使用的el-select属性:clearable,size,placeholder,disabled</li>
</ol>
<h2>字典数据仓库</h2>
<w-code language="javascript">{{ ` import { useDictStore } from '@/store';
const dictStore = useDictStore();` }}
</w-code>
<div>获取列表: dictStore.list('sys_oper_type')</div>
<pre style="font-size: .7em; height: 15em; margin: 1em; overflow-y: scroll; border: #FFF4 solid 1px; padding: 1em; border-radius: 1em; background-color: #fff1; ">{{ JSON.stringify(dictStore.list('sys_oper_type'),null,2) }}</pre>
<div>获取单个: dictStore.get('sys_oper_type',1)</div>
<pre style="font-size: .7em; height: 10em; margin: 1em; overflow-y: scroll; border: #FFF4 solid 1px; padding: 1em; border-radius: 1em; background-color: #fff1; ">{{ JSON.stringify(dictStore.get('sys_oper_type',1),null,2) }}</pre>
<div>同步获取列表: dictStore.listAsync('sys_oper_type')</div>
<w-code language="javascript">{{ ` const dictList = ref([]);
onMounted(async() => {
dictList.value = await dictStore.listAsync('sys_oper_type');
})` }}
</w-code>
<pre style="font-size: .7em; height: 15em; margin: 1em; overflow-y: scroll; border: #FFF4 solid 1px; padding: 1em; border-radius: 1em; background-color: #fff1; ">{{ JSON.stringify(dictList,null,2) }}</pre>
<div>同步获取单个: dictStore.getAsync('sys_oper_type',1)</div>
<w-code language="javascript">{{ `const dictOne = ref({});
onMounted(async() => {
dictOne.value = await dictStore.getAsync('sys_oper_type',1);
})` }}
</w-code>
<pre style="font-size: .7em; height: 10em; margin: 1em; overflow-y: scroll; border: #FFF4 solid 1px; padding: 1em; border-radius: 1em; background-color: #fff1; ">{{ JSON.stringify(dictOne,null,2) }}</pre>
<h2>原始请求方法: getDicts(name)</h2>
</el-tab-pane>
</el-tabs> </el-tabs>
@ -494,8 +591,24 @@ const emRef3 = proxy.$refs.emRef3;
<script setup> <script setup>
import { ElMessage } from 'element-plus'; import { ElMessage } from 'element-plus';
import { ref, useTemplateRef } from 'vue'; import { ref, useTemplateRef,onMounted } from 'vue';
import { unit } from '@/util' import { unit } from '@/util'
import { useDictStore } from '@/store'
const tag1 = ref(undefined);
const tag2 = ref(2);
const dictStore = useDictStore();
const dictList = ref([]);
onMounted(async() => {
dictList.value = await dictStore.listAsync('sys_oper_type');
})
const dictOne = ref({});
onMounted(async() => {
dictOne.value = await dictStore.getAsync('sys_oper_type',1);
})
const tabIndex = ref(localStorage.getItem('componentsTabIndex') || 'code'); const tabIndex = ref(localStorage.getItem('componentsTabIndex') || 'code');
@ -525,6 +638,18 @@ const resize = ({ chart, px, setOption }) => {
<style lang="scss" scoped> <style lang="scss" scoped>
h2 { h2 {
margin: 2em 0 1em; margin: 2em 0 1em;
position: relative;
&::before {
content: '';
position: absolute;
width: 100%;
height: 1px;
background-color: #FFF7;
bottom: -.4em;
transform: scaleY(.1);
}
} }
h3 { h3 {

@ -4,3 +4,4 @@ export { storeToRefs } from 'pinia'
export { useAuthStore } from "./modules/auth" export { useAuthStore } from "./modules/auth"
export { useCacheStore } from './modules/cache' export { useCacheStore } from './modules/cache'
export { usePoStore } from './modules/po' export { usePoStore } from './modules/po'
export { useDictStore } from './modules/dict'

@ -0,0 +1,85 @@
/**
* ruoyi字典数据仓库
*/
import { defineStore } from 'pinia'
import { ref, toRefs } from 'vue'
import { request } from '@/api'
const base = "/system/dict/data/"
const getDicts = (dictType) => request.get(base + "type/" + dictType);
/**
* 授权仓库
*/
export const useDictStore = defineStore('useDictStore', {
state: () => {
return {
dicts: {}
}
},
//计算字段
getters: {
},
//方法
actions: {
getDicts,
load(...args) {
const res = ref({});
return (() => {
args.forEach((dictType, index) => {
res.value[dictType] = [];
if (this.dicts[dictType]) {
res.value[dictType] = this.dicts[dictType];
} else {
this.listAsync(dictType).then(() => {
res.value[dictType] = this.dicts[dictType];
})
}
})
return res.value;
})()
},
listAsync(dictType) {
return new Promise((resolve, reject) => {
if (this.dicts[dictType] && this.dicts[dictType].length > 0) {
resolve(this.dicts[dictType]);
} else {
getDicts(dictType).then(resp => {
this.dicts[dictType] = resp.data.map(p => ({ label: p.dictLabel, value: Number(p.dictValue), type: p.listClass }))
resolve(this.dicts[dictType]);
}).catch(e => {
reject(e);
}
);
}
});
},
list(dictType) {
return this.load(dictType)[dictType];
},
getAsync(dictType, value) {
return new Promise((resolve, reject) => {
this.listAsync(dictType).then(list => {
resolve(list.find(item => item.value == value));
}).catch(e => {
reject(e);
}
);
});
},
get(dictType, value) {
return this.load(dictType)[dictType].find(item => item.value == value);
}
},
unistorage: false // 开启后对 state 的数据读写都将持久化
})

@ -31,20 +31,20 @@ public class MongoGenerator {
/** /**
* mongo * mongo
*/ */
private String packageName = "com.ruoyi.jobs"; private String packageName = "com.ruoyi.energy";
/** /**
* *
*/ */
private String moduleName = "jobs"; private String moduleName = "energy";
@Test @Test
@Disabled @Disabled
@DisplayName("mongodb代码生成") @DisplayName("mongodb代码生成")
public void generate() throws Exception { public void generate() throws Exception {
List<BaseInfo> entityList = scan(); //所有编写了@Info的实体类 // List<BaseInfo> entityList = scan(); //所有编写了@Info的实体类
// List<BaseInfo> entityList = scan("JobsTag1");//编写了@Info的实体类中的某些类 List<BaseInfo> entityList = scan("DeviceWarn");//编写了@Info的实体类中的某些类
System.out.println(new ObjectMapper().writerWithDefaultPrettyPrinter().writeValueAsString(entityList)); System.out.println(new ObjectMapper().writerWithDefaultPrettyPrinter().writeValueAsString(entityList));
generate(entityList); generate(entityList);
@ -132,8 +132,9 @@ public class MongoGenerator {
*/ */
public File[] getOutPath() { public File[] getOutPath() {
Set<String> paths = ClassUtil.getClassPaths(packageName); Set<String> paths = ClassUtil.getClassPaths(packageName);
paths = paths.stream().filter(path -> !path.contains("/ruoyi-admin/")).collect(Collectors.toSet());
if (CollUtil.isEmpty(paths) || paths.size() != 1) { if (CollUtil.isEmpty(paths) || paths.size() != 1) {
throw new RuntimeException("不能确定java包源目录"); throw new RuntimeException("不能确定java包源目录:"+paths);
} }
String path = paths.iterator().next(); String path = paths.iterator().next();
File file = new File(path.replace("/target/classes/", "/src/main/java/")); File file = new File(path.replace("/target/classes/", "/src/main/java/"));

@ -1,13 +1,46 @@
import request from '@/utils/request' import request from '@/utils/request'
/**
* ${entity.name}的前端api
${entity.toComment(0)}
*/
/**
* 基础路径
* @type {string}
*/
const base = '/${moduleName}/${entity.toSimpleLowerName()}/' const base = '/${moduleName}/${entity.toSimpleLowerName()}/'
/**
* 添加${entity.name}
* @param data ${entity.name}的数据
* @returns {Promise}
*/
export const doAdd = (data) => request.post(base, data) export const doAdd = (data) => request.post(base, data)
/**
* 修改${entity.name}
* @param data ${entity.name}的数据
* @returns {Promise}
*/
export const doUpdate = (data) => request.put(base, data) export const doUpdate = (data) => request.put(base, data)
/**
* 删除${entity.name}
* @param ids 编号数组
* @returns {Promise}
*/
export const doDelete = (ids) => request.delete(base+ids) export const doDelete = (ids) => request.delete(base+ids)
/**
* 获取${entity.name}的分页数据
* @param params 查询条件
* @returns {Promise}
*/
export const doPage = (params) => request.get(base + 'page', { params }) export const doPage = (params) => request.get(base + 'page', { params })
/**
* 获取单条${entity.name}的数据
* @param params 编号
* @returns {Promise}
*/
export const doGet = (id) => request.get(base + id) export const doGet = (id) => request.get(base + id)

@ -31,12 +31,24 @@ ${entity.toComment(0)}
@RequestMapping("/${moduleName}/${entity.toSimpleLowerName()}/") @RequestMapping("/${moduleName}/${entity.toSimpleLowerName()}/")
public class ${entity.toUpperName()}Api { public class ${entity.toUpperName()}Api {
/**
* 获取单个${entity.name}数据
* @param id 编号
* @return ${entity.name}数据
*/
@GetMapping("/{id}") @GetMapping("/{id}")
@SaCheckPermission("${moduleName}:${entity.toSimpleLowerName()}:query") @SaCheckPermission("${moduleName}:${entity.toSimpleLowerName()}:query")
public ${entity.toUpperName()} id(@NotNull(message = "编号不能为空") @PathVariable Long id) { public ${entity.toUpperName()} id(@NotNull(message = "编号不能为空") @PathVariable Long id) {
return findById(${entity.toUpperName()}.class, id); return findById(${entity.toUpperName()}.class, id);
} }
/**
* 获取${entity.name}的分页数据
* @param page 分页对象
* @param ${entity.toLowerName()} 完全匹配条件
* @param ${entity.toUpperName()}Query 其他条件
* @return ${entity.name}的分页数据
*/
@SaCheckPermission("${moduleName}:${entity.toSimpleLowerName()}:page") @SaCheckPermission("${moduleName}:${entity.toSimpleLowerName()}:page")
@GetMapping("/page") @GetMapping("/page")
public Page<${entity.toUpperName()}> page(Page<${entity.toUpperName()}> page, ${entity.toUpperName()} ${entity.toLowerName()}, ${entity.toUpperName()}Query query) { public Page<${entity.toUpperName()}> page(Page<${entity.toUpperName()}> page, ${entity.toUpperName()} ${entity.toLowerName()}, ${entity.toUpperName()}Query query) {
@ -44,6 +56,10 @@ public class ${entity.toUpperName()}Api {
} }
/**
* 添加${entity.name}
* @param ${entity.toLowerName()} ${entity.name}
*/
@SaCheckPermission("${moduleName}:${entity.toSimpleLowerName()}:add") @SaCheckPermission("${moduleName}:${entity.toSimpleLowerName()}:add")
@Log(title = "${entity.name}", businessType = BusinessType.INSERT) @Log(title = "${entity.name}", businessType = BusinessType.INSERT)
@RepeatSubmit @RepeatSubmit
@ -59,13 +75,16 @@ public class ${entity.toUpperName()}Api {
${entity.toLowerName()}.set${item.toUpperName()}(${item.addDefault}); ${entity.toLowerName()}.set${item.toUpperName()}(${item.addDefault});
#end #end
#else #else
${entity.toLowerName()}.set${item.toUpperName()}(null); ${entity.toLowerName()}.set${item.toUpperName()}(null);
#end #end
#end #end
doInsert(${entity.toLowerName()}); doInsert(${entity.toLowerName()});
} }
/**
* 修改${entity.name}
* @param ${entity.toLowerName()} ${entity.name}
*/
@SaCheckPermission("${moduleName}:${entity.toSimpleLowerName()}:update") @SaCheckPermission("${moduleName}:${entity.toSimpleLowerName()}:update")
@Log(title = "${entity.name}", businessType = BusinessType.UPDATE) @Log(title = "${entity.name}", businessType = BusinessType.UPDATE)
@RepeatSubmit @RepeatSubmit
@ -81,13 +100,16 @@ public class ${entity.toUpperName()}Api {
${entity.toLowerName()}.set${item.toUpperName()}(${item.updateDefault}); ${entity.toLowerName()}.set${item.toUpperName()}(${item.updateDefault});
#end #end
#else #else
${entity.toLowerName()}.set${item.toUpperName()}(null); ${entity.toLowerName()}.set${item.toUpperName()}(null);
#end #end
#end #end
doUpdate(${entity.toLowerName()}); doUpdate(${entity.toLowerName()});
} }
/**
* 删除${entity.name}
* @param ids 编号数组
*/
@SaCheckPermission("${moduleName}:${entity.toSimpleLowerName()}:delete") @SaCheckPermission("${moduleName}:${entity.toSimpleLowerName()}:delete")
@Log(title = "${entity.name}", businessType = BusinessType.DELETE) @Log(title = "${entity.name}", businessType = BusinessType.DELETE)
@DeleteMapping("/{ids}") @DeleteMapping("/{ids}")

@ -1,5 +1,6 @@
#set($a="$") #set($a="$")
#set($b="#") #set($b="#")
<!-- ${entity.name}的前端页面 -->
<template> <template>
<div class="${entity.toSimpleLowerName()}-root"> <div class="${entity.toSimpleLowerName()}-root">
<div class="search-form"> <div class="search-form">
@ -129,4 +130,4 @@ const handleDelete = async (row) => {
} }
} }
</style> </style>

Loading…
Cancel
Save