mirror of
https://github.com/cool-team-official/cool-admin-vue.git
synced 2024-11-01 06:02:38 +08:00
v4 测试
This commit is contained in:
parent
2610677c34
commit
8e741ffa41
4
.vscode/crud.code-snippets
vendored
4
.vscode/crud.code-snippets
vendored
@ -34,8 +34,8 @@
|
|||||||
"",
|
"",
|
||||||
"<script lang=\"ts\">",
|
"<script lang=\"ts\">",
|
||||||
"import { defineComponent, reactive } from \"vue\";",
|
"import { defineComponent, reactive } from \"vue\";",
|
||||||
"import { CrudLoad, Upsert, Table } from \"cl-admin-crud-vue3/types\";",
|
"import { CrudLoad, Upsert, Table } from \"@cool-vue/crud/types\";",
|
||||||
"import { useCool } from \"/@/core\";",
|
"import { useCool } from \"/@/cool\";",
|
||||||
"",
|
"",
|
||||||
"export default defineComponent({",
|
"export default defineComponent({",
|
||||||
" setup() {",
|
" setup() {",
|
||||||
|
187
build/config/rules.ts
Normal file
187
build/config/rules.ts
Normal file
@ -0,0 +1,187 @@
|
|||||||
|
export default [
|
||||||
|
{
|
||||||
|
test: ["avatar", "img", "image", "pic", "photo", "picture", "head", "icon"],
|
||||||
|
table: {
|
||||||
|
name: "cl-image",
|
||||||
|
props: {
|
||||||
|
size: 60
|
||||||
|
}
|
||||||
|
},
|
||||||
|
form: {
|
||||||
|
name: "cl-upload"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
test: ["avatars", "imgs", "images", "pics", "photos", "pictures", "heads", "icons"],
|
||||||
|
table: {
|
||||||
|
name: "cl-image",
|
||||||
|
props: {
|
||||||
|
size: 60
|
||||||
|
}
|
||||||
|
},
|
||||||
|
form: {
|
||||||
|
name: "cl-upload",
|
||||||
|
props: {
|
||||||
|
listType: "picture-card",
|
||||||
|
multiple: true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
test: ["file", "attachment", "attach", "url", "video", "music"],
|
||||||
|
table: {
|
||||||
|
name: "cl-link"
|
||||||
|
},
|
||||||
|
form: {
|
||||||
|
name: "cl-upload",
|
||||||
|
props: {
|
||||||
|
listType: "text",
|
||||||
|
limit: 1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
test: ["files", "attachments", "attachs", "urls", "videos", "musics"],
|
||||||
|
table: {
|
||||||
|
name: "cl-link"
|
||||||
|
},
|
||||||
|
form: {
|
||||||
|
name: "cl-upload",
|
||||||
|
props: {
|
||||||
|
listType: "text",
|
||||||
|
multiple: true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
test: ["enable", "status"],
|
||||||
|
table: {
|
||||||
|
name: "cl-switch"
|
||||||
|
},
|
||||||
|
form: {
|
||||||
|
name: "el-switch"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
test: ["type", "classify", "category"],
|
||||||
|
handler: "dict"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
test: ["types", "classifys", "categorys"],
|
||||||
|
handler: "dict_multiple"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
test: ["date"],
|
||||||
|
form: {
|
||||||
|
name: "el-date-picker",
|
||||||
|
props: {
|
||||||
|
type: "date"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
test: ["dates", "dateRange", "dateScope"],
|
||||||
|
form: {
|
||||||
|
name: "el-date-picker",
|
||||||
|
props: {
|
||||||
|
type: "daterange"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
test: ["time"],
|
||||||
|
form: {
|
||||||
|
name: "el-date-picker",
|
||||||
|
props: {
|
||||||
|
type: "datetime"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
test: ["times", "timeRange", "timeScope"],
|
||||||
|
form: {
|
||||||
|
name: "el-date-picker",
|
||||||
|
props: {
|
||||||
|
type: "datetimerange"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
test: ["star", "stars"],
|
||||||
|
table: {
|
||||||
|
name: "el-rate",
|
||||||
|
props: {
|
||||||
|
disabled: true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
form: {
|
||||||
|
name: "el-rate"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
test: ["progress", "rate", "ratio"],
|
||||||
|
table: {
|
||||||
|
name: "el-progress"
|
||||||
|
},
|
||||||
|
form: {
|
||||||
|
name: "el-slider",
|
||||||
|
props: {
|
||||||
|
style: {
|
||||||
|
width: "200px"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
test: ["num", "price", "age", "amount"],
|
||||||
|
form: {
|
||||||
|
name: "el-input-number",
|
||||||
|
props: {
|
||||||
|
min: 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
test: ["remark", "desc"],
|
||||||
|
table: {
|
||||||
|
showOverflowTooltip: true
|
||||||
|
},
|
||||||
|
form: {
|
||||||
|
name: "el-input",
|
||||||
|
props: {
|
||||||
|
type: "textarea",
|
||||||
|
rows: 4
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
test: ["rich", "text", "html", "content"],
|
||||||
|
form: {
|
||||||
|
name: "el-editor-quill",
|
||||||
|
props: {
|
||||||
|
height: 400
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
test: ["code", "codes"],
|
||||||
|
form: {
|
||||||
|
name: "el-codemirror",
|
||||||
|
props: {
|
||||||
|
height: 400
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
test: ["createTime"],
|
||||||
|
table: {
|
||||||
|
sortable: "desc"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
test: ["updateTime"],
|
||||||
|
table: {
|
||||||
|
sortable: "custom"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
];
|
396
build/plugins/cool.ts
Normal file
396
build/plugins/cool.ts
Normal file
@ -0,0 +1,396 @@
|
|||||||
|
import { Plugin } from "vite";
|
||||||
|
import prettier from "prettier";
|
||||||
|
import fs from "fs";
|
||||||
|
import path from "path";
|
||||||
|
import { isFunction, isRegExp, isString } from "lodash";
|
||||||
|
import rules from "../config/rules";
|
||||||
|
|
||||||
|
// 根路径
|
||||||
|
const coolPath = path.join(__dirname, `../../src/cool`);
|
||||||
|
|
||||||
|
// 格式化
|
||||||
|
function format(data: any) {
|
||||||
|
return {
|
||||||
|
label: data.label,
|
||||||
|
prop: data.prop,
|
||||||
|
...data,
|
||||||
|
component: data.component
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
// 颜色
|
||||||
|
const colors = [
|
||||||
|
"",
|
||||||
|
"#409EFF",
|
||||||
|
"#67C23A",
|
||||||
|
"#E6A23C",
|
||||||
|
"#F56C6C",
|
||||||
|
"#909399",
|
||||||
|
"#B0CFEB",
|
||||||
|
"#FF9B91",
|
||||||
|
"#E6A23C",
|
||||||
|
"#BFAD6F",
|
||||||
|
"#FB78F2"
|
||||||
|
];
|
||||||
|
|
||||||
|
// 组件处理器
|
||||||
|
const handler = {
|
||||||
|
// 单选
|
||||||
|
dict({ comment }) {
|
||||||
|
const [label, ...arr] = comment.split(" ");
|
||||||
|
|
||||||
|
// 选择列表
|
||||||
|
const list = arr.map((e: string, i: number) => {
|
||||||
|
const [value, label] = e.split("-");
|
||||||
|
const d: any = {
|
||||||
|
label,
|
||||||
|
value: isNaN(Number(value)) ? value : Number(value)
|
||||||
|
};
|
||||||
|
|
||||||
|
if (colors[i]) {
|
||||||
|
d.color = colors[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
return d;
|
||||||
|
});
|
||||||
|
|
||||||
|
const d = {
|
||||||
|
table: {
|
||||||
|
label,
|
||||||
|
dict: list
|
||||||
|
},
|
||||||
|
form: {
|
||||||
|
label,
|
||||||
|
value: list[0]?.value,
|
||||||
|
component: {
|
||||||
|
name: "",
|
||||||
|
options: list
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// 匹配组件
|
||||||
|
d.form.component.name = arr.length > 4 ? "el-select" : "el-radio-group";
|
||||||
|
|
||||||
|
return d;
|
||||||
|
},
|
||||||
|
|
||||||
|
// 多选
|
||||||
|
dict_multiple({ comment }) {
|
||||||
|
const { table, form }: any = handler.dict({ comment });
|
||||||
|
|
||||||
|
if (!form.component.props) {
|
||||||
|
form.component.props = {};
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!form.value) {
|
||||||
|
form.value = [];
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (form.component.name) {
|
||||||
|
case "el-select":
|
||||||
|
form.component.props.multiple = true;
|
||||||
|
form.component.props.filterable = true;
|
||||||
|
break;
|
||||||
|
case "el-radio-group":
|
||||||
|
form.component.name = "el-checkbox-group";
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
table,
|
||||||
|
form
|
||||||
|
};
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// 解析body
|
||||||
|
function parseJson(req: any) {
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
let d = "";
|
||||||
|
req.on("data", function (chunk: Buffer) {
|
||||||
|
d += chunk;
|
||||||
|
});
|
||||||
|
req.on("end", function () {
|
||||||
|
try {
|
||||||
|
resolve(JSON.parse(d));
|
||||||
|
} catch (e) {
|
||||||
|
reject(e);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// 创建组件
|
||||||
|
function createComponent(item: any) {
|
||||||
|
const { propertyName: prop, comment: label } = item;
|
||||||
|
|
||||||
|
let d = null;
|
||||||
|
|
||||||
|
rules.forEach((r: any) => {
|
||||||
|
const s = r.test.find((e: any) => {
|
||||||
|
if (isRegExp(e)) {
|
||||||
|
return e.test(prop);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isFunction(e)) {
|
||||||
|
return e(prop);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isString(e)) {
|
||||||
|
const re = new RegExp(`${e}$`);
|
||||||
|
return re.test(prop.toLocaleLowerCase());
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
});
|
||||||
|
|
||||||
|
if (s) {
|
||||||
|
if (r.handler) {
|
||||||
|
const fn = isString(r.handler) ? handler[r.handler] : r.handler;
|
||||||
|
|
||||||
|
if (isFunction(fn)) {
|
||||||
|
d = fn(item);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
d = {
|
||||||
|
...r,
|
||||||
|
test: undefined
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
function parse(v: any) {
|
||||||
|
if (v?.name) {
|
||||||
|
return {
|
||||||
|
prop,
|
||||||
|
label,
|
||||||
|
component: v
|
||||||
|
};
|
||||||
|
} else {
|
||||||
|
return {
|
||||||
|
prop,
|
||||||
|
label,
|
||||||
|
...v
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
column: parse(d?.table),
|
||||||
|
item: parse(d?.form)
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
// 获取页面标识
|
||||||
|
function getPageName(router: string) {
|
||||||
|
if (router.indexOf("/") === 0) {
|
||||||
|
router = router.substr(1, router.length);
|
||||||
|
}
|
||||||
|
|
||||||
|
return router ? `name: "${router.replace("/", "-")}",` : "";
|
||||||
|
}
|
||||||
|
|
||||||
|
// 创建文件
|
||||||
|
function createVue({ router, columns, prefix, api, module, filename }: any): void {
|
||||||
|
const upsert: any = {
|
||||||
|
items: []
|
||||||
|
};
|
||||||
|
|
||||||
|
const table: any = {
|
||||||
|
columns: []
|
||||||
|
};
|
||||||
|
|
||||||
|
// 遍历
|
||||||
|
columns.forEach((e: any) => {
|
||||||
|
// 组件
|
||||||
|
const { item, column }: any = createComponent(e);
|
||||||
|
|
||||||
|
// 验证规则
|
||||||
|
if (!e.nullable) {
|
||||||
|
item.required = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (item.component) {
|
||||||
|
upsert.items.push(format(item));
|
||||||
|
}
|
||||||
|
|
||||||
|
table.columns.push(format(column));
|
||||||
|
});
|
||||||
|
|
||||||
|
// 服务
|
||||||
|
const service = prefix.replace("/admin", "service").replace(/\//g, ".");
|
||||||
|
|
||||||
|
// 请求路径
|
||||||
|
const paths = api.map((e: any) => e.path);
|
||||||
|
|
||||||
|
// 权限
|
||||||
|
const permission: any = {
|
||||||
|
add: paths.includes("/add"),
|
||||||
|
del: paths.includes("/delete"),
|
||||||
|
update: paths.includes("/info") && paths.includes("/update"),
|
||||||
|
page: paths.includes("/page"),
|
||||||
|
upsert: true
|
||||||
|
};
|
||||||
|
permission.upsert = permission.add || permission.update;
|
||||||
|
|
||||||
|
// 是否有操作栏
|
||||||
|
if (permission.del || permission.upsert) {
|
||||||
|
const d: any = {
|
||||||
|
type: "op",
|
||||||
|
buttons: []
|
||||||
|
};
|
||||||
|
|
||||||
|
if (permission.upsert) {
|
||||||
|
d.buttons.push("edit");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (permission.del) {
|
||||||
|
d.buttons.push("delete");
|
||||||
|
}
|
||||||
|
|
||||||
|
table.columns.push(d);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 是否多选、序号
|
||||||
|
if (permission.del) {
|
||||||
|
table.columns.unshift({
|
||||||
|
type: "selection"
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
table.columns.unshift({
|
||||||
|
label: "#",
|
||||||
|
type: "index"
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// 代码模板
|
||||||
|
const temp = `<template>
|
||||||
|
<cl-crud :ref="setRefs('crud')" @load="onLoad">
|
||||||
|
<el-row type="flex" align="middle">
|
||||||
|
<!-- 刷新按钮 -->
|
||||||
|
<cl-refresh-btn />
|
||||||
|
${permission.add ? "<!-- 新增按钮 -->\n<cl-add-btn />" : ""}
|
||||||
|
${permission.del ? "<!-- 删除按钮 -->\n<cl-multi-delete-btn />" : ""}
|
||||||
|
<cl-flex1 />
|
||||||
|
<!-- 关键字搜索 -->
|
||||||
|
<cl-search-key />
|
||||||
|
</el-row>
|
||||||
|
|
||||||
|
<el-row>
|
||||||
|
<!-- 数据表格 -->
|
||||||
|
<cl-table :ref="setRefs('table')" v-bind="table" />
|
||||||
|
</el-row>
|
||||||
|
|
||||||
|
<el-row type="flex">
|
||||||
|
<cl-flex1 />
|
||||||
|
<!-- 分页控件 -->
|
||||||
|
<cl-pagination />
|
||||||
|
</el-row>
|
||||||
|
|
||||||
|
${
|
||||||
|
permission.update
|
||||||
|
? '<!-- 新增、编辑 -->\n<cl-upsert :ref="setRefs(\'upsert\')" v-bind="upsert" />'
|
||||||
|
: ""
|
||||||
|
}
|
||||||
|
</cl-crud>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang="ts">
|
||||||
|
import { defineComponent, reactive } from "vue";
|
||||||
|
import { CrudLoad, Table${permission.upsert ? ", Upsert" : ""} } from "@cool-vue/crud/types";
|
||||||
|
import { useCool } from "/@/cool";
|
||||||
|
|
||||||
|
export default defineComponent({
|
||||||
|
${getPageName(router)}
|
||||||
|
|
||||||
|
setup() {
|
||||||
|
const { refs, setRefs, service } = useCool();
|
||||||
|
|
||||||
|
${
|
||||||
|
permission.upsert
|
||||||
|
? "// 新增、编辑配置\nconst upsert = reactive<Upsert>(" +
|
||||||
|
JSON.stringify(upsert) +
|
||||||
|
");"
|
||||||
|
: ""
|
||||||
|
}
|
||||||
|
|
||||||
|
// 表格配置
|
||||||
|
const table = reactive<Table>(${JSON.stringify(table)});
|
||||||
|
|
||||||
|
// crud 加载
|
||||||
|
function onLoad({ ctx, app }: CrudLoad) {
|
||||||
|
// 绑定 service
|
||||||
|
ctx.service(${service}).done();
|
||||||
|
app.refresh();
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
refs,
|
||||||
|
setRefs,${permission.upsert ? "upsert," : ""}
|
||||||
|
table,
|
||||||
|
onLoad
|
||||||
|
};
|
||||||
|
}
|
||||||
|
});
|
||||||
|
</script>`;
|
||||||
|
|
||||||
|
const content = prettier.format(temp, {
|
||||||
|
parser: "vue",
|
||||||
|
useTabs: true,
|
||||||
|
tabWidth: 4,
|
||||||
|
endOfLine: "lf",
|
||||||
|
semi: true,
|
||||||
|
jsxBracketSameLine: true,
|
||||||
|
singleQuote: false,
|
||||||
|
printWidth: 100,
|
||||||
|
trailingComma: "none"
|
||||||
|
});
|
||||||
|
|
||||||
|
// views 目录是否存在
|
||||||
|
const dir = path.join(coolPath, `modules/${module}/views`);
|
||||||
|
if (!fs.existsSync(dir)) fs.mkdirSync(dir);
|
||||||
|
|
||||||
|
// 创建文件
|
||||||
|
fs.createWriteStream(path.join(dir, `${filename}.vue`), {
|
||||||
|
flags: "w"
|
||||||
|
}).write(content);
|
||||||
|
}
|
||||||
|
|
||||||
|
export const cool = (): Plugin | null => {
|
||||||
|
return {
|
||||||
|
name: "vite-cool",
|
||||||
|
configureServer(server) {
|
||||||
|
server.middlewares.use(async (req, res, next) => {
|
||||||
|
function done(data) {
|
||||||
|
res.writeHead(200, { "Content-Type": "text/html;charset=UTF-8" });
|
||||||
|
res.end(JSON.stringify(data));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (req.url.includes("/__cool_createMenu")) {
|
||||||
|
try {
|
||||||
|
const body: any = await parseJson(req);
|
||||||
|
await createVue(body);
|
||||||
|
done({
|
||||||
|
code: 1000
|
||||||
|
});
|
||||||
|
} catch (e) {
|
||||||
|
done({
|
||||||
|
code: 1001,
|
||||||
|
message: e.message
|
||||||
|
});
|
||||||
|
}
|
||||||
|
} else if (req.url.includes("/__cool_modules")) {
|
||||||
|
const dirs = fs.readdirSync(path.join(coolPath, "modules"));
|
||||||
|
done({
|
||||||
|
code: 1000,
|
||||||
|
data: dirs.filter((e) => !e.includes("."))
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
next();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
};
|
||||||
|
};
|
11
package.json
11
package.json
@ -1,17 +1,17 @@
|
|||||||
{
|
{
|
||||||
"name": "front-next",
|
"name": "front-next",
|
||||||
"version": "0.8.1",
|
"version": "4.0.0",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"dev": "vite",
|
"dev": "vite --host",
|
||||||
"build": "vite build",
|
"build": "vite build",
|
||||||
"serve": "vite preview",
|
"serve": "vite preview",
|
||||||
"lint:prettier": "prettier --write --loglevel warn \"src/**/*.{js,json,tsx,css,less,scss,vue,html,md}\"",
|
"lint:prettier": "prettier --write --loglevel warn \"src/**/*.{js,json,tsx,css,less,scss,vue,html,md}\"",
|
||||||
"lint:eslint": "eslint \"{src,mock}/**/*.{vue,ts,tsx}\" --fix"
|
"lint:eslint": "eslint \"{src,mock}/**/*.{vue,ts,tsx}\" --fix"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
|
"@cool-vue/crud": "^1.0.4",
|
||||||
"array.prototype.flat": "^1.2.4",
|
"array.prototype.flat": "^1.2.4",
|
||||||
"axios": "^0.21.1",
|
"axios": "^0.21.1",
|
||||||
"cl-admin-crud-vue3": "^0.9.6",
|
|
||||||
"clipboard": "^2.0.8",
|
"clipboard": "^2.0.8",
|
||||||
"clone-deep": "^4.0.1",
|
"clone-deep": "^4.0.1",
|
||||||
"codemirror": "^5.62.0",
|
"codemirror": "^5.62.0",
|
||||||
@ -22,6 +22,7 @@
|
|||||||
"glob": "^7.1.6",
|
"glob": "^7.1.6",
|
||||||
"js-beautify": "^1.13.5",
|
"js-beautify": "^1.13.5",
|
||||||
"merge": "^2.1.1",
|
"merge": "^2.1.1",
|
||||||
|
"merge-deep": "^3.0.3",
|
||||||
"mitt": "^2.1.0",
|
"mitt": "^2.1.0",
|
||||||
"mockjs": "^1.1.0",
|
"mockjs": "^1.1.0",
|
||||||
"nprogress": "^0.2.0",
|
"nprogress": "^0.2.0",
|
||||||
@ -50,14 +51,16 @@
|
|||||||
"eslint-config-prettier": "^8.1.0",
|
"eslint-config-prettier": "^8.1.0",
|
||||||
"eslint-plugin-prettier": "^3.3.1",
|
"eslint-plugin-prettier": "^3.3.1",
|
||||||
"eslint-plugin-vue": "^7.13.0",
|
"eslint-plugin-vue": "^7.13.0",
|
||||||
|
"iconv-lite": "^0.6.3",
|
||||||
"prettier": "^2.2.1",
|
"prettier": "^2.2.1",
|
||||||
"sass": "^1.42.1",
|
"sass": "^1.42.1",
|
||||||
"sass-loader": "^11.1.1",
|
"sass-loader": "^11.1.1",
|
||||||
"svg-sprite-loader": "^6.0.2",
|
"svg-sprite-loader": "^6.0.2",
|
||||||
"typescript": "4.4.3",
|
"typescript": "4.4.3",
|
||||||
"unplugin-vue-components": "0.15.4",
|
"unplugin-vue-components": "0.15.4",
|
||||||
"vite": "^2.6.7",
|
"vite": "2.6.7",
|
||||||
"vite-plugin-compression": "^0.3.5",
|
"vite-plugin-compression": "^0.3.5",
|
||||||
|
"vite-plugin-mock": "^2.9.6",
|
||||||
"vite-plugin-style-import": "^1.0.1",
|
"vite-plugin-style-import": "^1.0.1",
|
||||||
"vite-svg-loader": "^2.1.0"
|
"vite-svg-loader": "^2.1.0"
|
||||||
}
|
}
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
<el-config-provider :locale="locale">
|
<el-config-provider :locale="locale">
|
||||||
<div class="preload" v-if="loading">
|
<div class="preload" v-if="loading">
|
||||||
<div class="container">
|
<div class="container">
|
||||||
<p class="name">COOL-ADMIN</p>
|
<p class="name">{{ app.name }}</p>
|
||||||
<div class="loading"></div>
|
<div class="loading"></div>
|
||||||
<p class="title">正在加载菜单...</p>
|
<p class="title">正在加载菜单...</p>
|
||||||
<p class="sub-title">初次加载资源可能需要较多时间 请耐心等待</p>
|
<p class="sub-title">初次加载资源可能需要较多时间 请耐心等待</p>
|
||||||
@ -21,7 +21,7 @@
|
|||||||
import { computed, defineComponent } from "vue";
|
import { computed, defineComponent } from "vue";
|
||||||
import { ElConfigProvider } from "element-plus";
|
import { ElConfigProvider } from "element-plus";
|
||||||
import zhCn from "element-plus/lib/locale/lang/zh-cn";
|
import zhCn from "element-plus/lib/locale/lang/zh-cn";
|
||||||
import { useCool } from "/@/core";
|
import { useCool } from "/@/cool";
|
||||||
|
|
||||||
export default defineComponent({
|
export default defineComponent({
|
||||||
components: {
|
components: {
|
||||||
@ -29,13 +29,14 @@ export default defineComponent({
|
|||||||
},
|
},
|
||||||
|
|
||||||
setup() {
|
setup() {
|
||||||
const { store } = useCool();
|
const { store, app } = useCool();
|
||||||
const locale = zhCn;
|
const locale = zhCn;
|
||||||
const loading = computed(() => store.getters.appLoading);
|
const loading = computed(() => store.getters.appLoading);
|
||||||
|
|
||||||
return {
|
return {
|
||||||
locale,
|
locale,
|
||||||
loading
|
loading,
|
||||||
|
app
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
import store from "store";
|
import store from "store";
|
||||||
import { getUrlParam } from "/@/core/utils";
|
import { getUrlParam } from "/@/cool/utils";
|
||||||
import { MenuItem } from "/$/base/types";
|
import { MenuItem } from "/$/base/types";
|
||||||
|
|
||||||
// 路由模式
|
// 路由模式
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
import { onBeforeUpdate, ref, inject } from "vue";
|
import { onBeforeUpdate, ref, inject, computed } from "vue";
|
||||||
import { useRoute, useRouter } from "vue-router";
|
import { useRoute, useRouter } from "vue-router";
|
||||||
import { useStore } from "vuex";
|
import { useStore } from "vuex";
|
||||||
|
|
||||||
@ -23,6 +23,7 @@ export function useCool() {
|
|||||||
const store = useStore();
|
const store = useStore();
|
||||||
const route = useRoute();
|
const route = useRoute();
|
||||||
const router = useRouter();
|
const router = useRouter();
|
||||||
|
const app = computed(() => store.getters.app);
|
||||||
|
|
||||||
return {
|
return {
|
||||||
store,
|
store,
|
||||||
@ -31,6 +32,18 @@ export function useCool() {
|
|||||||
refs,
|
refs,
|
||||||
setRefs,
|
setRefs,
|
||||||
service,
|
service,
|
||||||
mitt
|
mitt,
|
||||||
|
app
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
export function useModule() {
|
||||||
|
const store = useStore();
|
||||||
|
const moduleList = computed(() => store.getters.moduleList);
|
||||||
|
const modules = computed(() => store.getters.modules);
|
||||||
|
|
||||||
|
return {
|
||||||
|
moduleList,
|
||||||
|
modules
|
||||||
};
|
};
|
||||||
}
|
}
|
@ -1,11 +1,8 @@
|
|||||||
import BaseService from "./service/base";
|
|
||||||
import { Service, Permission, useService } from "./service";
|
|
||||||
import { useRouter } from "./router";
|
|
||||||
import { useModule } from "./module";
|
|
||||||
import router from "/@/router";
|
import router from "/@/router";
|
||||||
import store from "/@/store";
|
import store from "/@/store";
|
||||||
|
import { service } from "./service";
|
||||||
const service = useService();
|
import { useRouter } from "./router";
|
||||||
|
import { useModule } from "./module";
|
||||||
|
|
||||||
async function bootstrap(app: any) {
|
async function bootstrap(app: any) {
|
||||||
app.config.globalProperties.service = store.service = service;
|
app.config.globalProperties.service = store.service = service;
|
||||||
@ -37,5 +34,6 @@ function usePermission(list: any[]) {
|
|||||||
deep(service);
|
deep(service);
|
||||||
}
|
}
|
||||||
|
|
||||||
export { Service, Permission, BaseService, service, bootstrap, usePermission };
|
export { service, bootstrap, usePermission };
|
||||||
|
export { BaseService, Service, Permission, useEps } from "./service";
|
||||||
export * from "./hook";
|
export * from "./hook";
|
@ -1,11 +1,11 @@
|
|||||||
import cool from "/@/cool";
|
import { modules as mods } from "/@/cool/modules";
|
||||||
import store from "/@/store";
|
import store from "/@/store";
|
||||||
import router from "/@/router";
|
import router from "/@/router";
|
||||||
import { deepMerge, isFunction, isObject, isEmpty } from "../utils";
|
import { deepMerge, isFunction, isObject, isEmpty } from "../utils";
|
||||||
import { deepFiles } from "../service";
|
import { deepFiles } from "../service";
|
||||||
|
|
||||||
// 模块列表
|
// 模块列表
|
||||||
const modules: any[] = [...cool.modules];
|
const modules: any[] = [...mods];
|
||||||
|
|
||||||
function useModule(app: any) {
|
function useModule(app: any) {
|
||||||
// 安装模块
|
// 安装模块
|
||||||
@ -78,6 +78,10 @@ function useModule(app: any) {
|
|||||||
const value: any = files[i].default;
|
const value: any = files[i].default;
|
||||||
const fname: string = (cname || "").split(".")[0];
|
const fname: string = (cname || "").split(".")[0];
|
||||||
|
|
||||||
|
if (name == "index.ts") {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
function next(d: any) {
|
function next(d: any) {
|
||||||
// 配置参数入口
|
// 配置参数入口
|
||||||
if (fn == "config.ts") {
|
if (fn == "config.ts") {
|
||||||
@ -159,7 +163,8 @@ function useModule(app: any) {
|
|||||||
pages: [],
|
pages: [],
|
||||||
views: [],
|
views: [],
|
||||||
store: {},
|
store: {},
|
||||||
_services: []
|
_services: [],
|
||||||
|
_local: true
|
||||||
})
|
})
|
||||||
);
|
);
|
||||||
}
|
}
|
@ -1,8 +1,7 @@
|
|||||||
import { ElMessage } from "element-plus";
|
import { ElMessage } from "element-plus";
|
||||||
import store from "/@/store";
|
import store from "/@/store";
|
||||||
import router, { ignore } from "/@/router";
|
import router, { ignore } from "/@/router";
|
||||||
import storage from "../utils/storage";
|
import { cloneDeep, storage } from "../utils";
|
||||||
import { cloneDeep } from "../utils";
|
|
||||||
|
|
||||||
const views = import.meta.globEager("/src/**/views/**/*.vue");
|
const views = import.meta.globEager("/src/**/views/**/*.vue");
|
||||||
|
|
@ -3,7 +3,7 @@ import request from "/@/service/request";
|
|||||||
import { baseUrl, isDev } from "/@/config/env";
|
import { baseUrl, isDev } from "/@/config/env";
|
||||||
|
|
||||||
export default class BaseService {
|
export default class BaseService {
|
||||||
constructor() {
|
constructor(options: any = {}) {
|
||||||
const crud: any = {
|
const crud: any = {
|
||||||
page: "page",
|
page: "page",
|
||||||
list: "list",
|
list: "list",
|
||||||
@ -13,6 +13,10 @@ export default class BaseService {
|
|||||||
update: "update"
|
update: "update"
|
||||||
};
|
};
|
||||||
|
|
||||||
|
if (options?.namespace) {
|
||||||
|
this.namespace = options?.namespace;
|
||||||
|
}
|
||||||
|
|
||||||
if (!this.permission) this.permission = {};
|
if (!this.permission) this.permission = {};
|
||||||
|
|
||||||
for (const i in crud) {
|
for (const i in crud) {
|
||||||
@ -51,62 +55,50 @@ export default class BaseService {
|
|||||||
return request(options);
|
return request(options);
|
||||||
}
|
}
|
||||||
|
|
||||||
list(params: any) {
|
list(data: any) {
|
||||||
return this.request({
|
return this.request({
|
||||||
url: "/list",
|
url: "/list",
|
||||||
method: "POST",
|
method: "POST",
|
||||||
data: {
|
data
|
||||||
...params
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
page(params: any) {
|
page(data: any) {
|
||||||
return this.request({
|
return this.request({
|
||||||
url: "/page",
|
url: "/page",
|
||||||
method: "POST",
|
method: "POST",
|
||||||
data: {
|
data
|
||||||
...params
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
info(params: any) {
|
info(params: any) {
|
||||||
return this.request({
|
return this.request({
|
||||||
url: "/info",
|
url: "/info",
|
||||||
params: {
|
params
|
||||||
...params
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
update(params: any) {
|
update(data: any) {
|
||||||
return this.request({
|
return this.request({
|
||||||
url: "/update",
|
url: "/update",
|
||||||
method: "POST",
|
method: "POST",
|
||||||
data: {
|
data
|
||||||
...params
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
delete(params: any) {
|
delete(data: any) {
|
||||||
return this.request({
|
return this.request({
|
||||||
url: "/delete",
|
url: "/delete",
|
||||||
method: "POST",
|
method: "POST",
|
||||||
data: {
|
data
|
||||||
...params
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
add(params: any) {
|
add(data: any) {
|
||||||
return this.request({
|
return this.request({
|
||||||
url: "/add",
|
url: "/add",
|
||||||
method: "POST",
|
method: "POST",
|
||||||
data: {
|
data
|
||||||
...params
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -1,7 +1,5 @@
|
|||||||
import { isObject } from "../utils";
|
import { isObject } from "../utils";
|
||||||
|
|
||||||
console.log(__PROXY_LIST__);
|
|
||||||
|
|
||||||
export function Permission(value: string) {
|
export function Permission(value: string) {
|
||||||
return function (target: any, key: any, descriptor: any) {
|
return function (target: any, key: any, descriptor: any) {
|
||||||
if (!target.permission) {
|
if (!target.permission) {
|
141
src/cool/core/service/index.ts
Normal file
141
src/cool/core/service/index.ts
Normal file
@ -0,0 +1,141 @@
|
|||||||
|
import BaseService from "./base";
|
||||||
|
import { Service, Permission } from "./decorator";
|
||||||
|
import { basename } from "../utils";
|
||||||
|
|
||||||
|
function deepFiles(list: any[]) {
|
||||||
|
const modules: any = {};
|
||||||
|
|
||||||
|
list.forEach((e) => {
|
||||||
|
const arr: any[] = e.path.split("/");
|
||||||
|
const parents: any[] = arr.slice(0, arr.length - 1);
|
||||||
|
const name: string = basename(e.path).replace(".ts", "");
|
||||||
|
|
||||||
|
let curr: any = modules;
|
||||||
|
let prev: any = null;
|
||||||
|
let key: any = null;
|
||||||
|
|
||||||
|
parents.forEach((k) => {
|
||||||
|
if (!curr[k]) {
|
||||||
|
curr[k] = {};
|
||||||
|
}
|
||||||
|
|
||||||
|
prev = curr;
|
||||||
|
curr = curr[k];
|
||||||
|
key = k;
|
||||||
|
});
|
||||||
|
|
||||||
|
if (name == "index") {
|
||||||
|
prev[key] = e.value;
|
||||||
|
} else {
|
||||||
|
curr[name] = e.value;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
return modules;
|
||||||
|
}
|
||||||
|
|
||||||
|
function useService() {
|
||||||
|
const files = import.meta.globEager("/src/service/**/*.ts");
|
||||||
|
const d: any = [];
|
||||||
|
|
||||||
|
for (const i in files) {
|
||||||
|
if (!i.includes("request.ts")) {
|
||||||
|
const value = files[i].default;
|
||||||
|
d.push({
|
||||||
|
path: i.replace("/src/service/", ""),
|
||||||
|
value: new value()
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const s = deepFiles(d);
|
||||||
|
s.request = new BaseService().request;
|
||||||
|
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
|
||||||
|
const service = useService();
|
||||||
|
|
||||||
|
function useEps() {
|
||||||
|
return service.base.common
|
||||||
|
.eps()
|
||||||
|
.then((res: any) => {
|
||||||
|
for (const i in res) {
|
||||||
|
res[i].forEach((e: any) => {
|
||||||
|
// 分隔路径
|
||||||
|
const arr = e.prefix
|
||||||
|
.replace(/\//, "")
|
||||||
|
.replace("admin", "")
|
||||||
|
.split("/")
|
||||||
|
.filter(Boolean);
|
||||||
|
|
||||||
|
function deep(d: any, i: number) {
|
||||||
|
const k = arr[i];
|
||||||
|
|
||||||
|
if (k) {
|
||||||
|
// 是否最后一个
|
||||||
|
if (arr[i + 1]) {
|
||||||
|
if (!d[k]) {
|
||||||
|
d[k] = {};
|
||||||
|
}
|
||||||
|
|
||||||
|
deep(d[k], i + 1);
|
||||||
|
} else {
|
||||||
|
// 本地不存在则创建实例
|
||||||
|
if (!d[k]) {
|
||||||
|
d[k] = new BaseService({
|
||||||
|
namespace: e.prefix.replace("/admin/", "")
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// 创建方法
|
||||||
|
e.api.forEach((a: any) => {
|
||||||
|
const n = a.path.replace("/", "");
|
||||||
|
|
||||||
|
if (
|
||||||
|
![
|
||||||
|
"add",
|
||||||
|
"info",
|
||||||
|
"update",
|
||||||
|
"page",
|
||||||
|
"list",
|
||||||
|
"delete"
|
||||||
|
].includes(n)
|
||||||
|
) {
|
||||||
|
// 设置权限
|
||||||
|
d[k].permission[n] = (
|
||||||
|
(d[k].namespace ? d[k].namespace + "/" : "") + n
|
||||||
|
).replace(/\//g, ":");
|
||||||
|
|
||||||
|
// 本地不存在则创建
|
||||||
|
if (!d[k][n]) {
|
||||||
|
d[k][n] = function (data: any) {
|
||||||
|
return this.request({
|
||||||
|
url: a.path,
|
||||||
|
method: a.method,
|
||||||
|
[a.method.toLocaleLowerCase() == "post"
|
||||||
|
? "data"
|
||||||
|
: "params"]: data
|
||||||
|
});
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
deep(service, 0);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log(service);
|
||||||
|
|
||||||
|
return res;
|
||||||
|
})
|
||||||
|
.catch((err: string) => {
|
||||||
|
console.error("Eps error", err);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
export { BaseService, Service, Permission, service, deepFiles, useService, useEps };
|
@ -1,22 +1,2 @@
|
|||||||
import Crud from "cl-admin-crud-vue3";
|
export * from "./core";
|
||||||
import "cl-admin-crud-vue3/dist/index.css";
|
export * from "./modules";
|
||||||
|
|
||||||
export default {
|
|
||||||
modules: [
|
|
||||||
// crud 模块
|
|
||||||
{
|
|
||||||
name: "crud",
|
|
||||||
value: Crud,
|
|
||||||
options: {
|
|
||||||
crud: {
|
|
||||||
dict: {
|
|
||||||
sort: {
|
|
||||||
prop: "order",
|
|
||||||
order: "sort"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
]
|
|
||||||
};
|
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
import { iconfontUrl, app } from "/@/config/env";
|
import { iconfontUrl, app } from "/@/config/env";
|
||||||
import { basename } from "/@/core/utils";
|
import { basename } from "/@/cool/utils";
|
||||||
import { createLink } from "../utils";
|
import { createLink } from "../utils";
|
||||||
|
|
||||||
// 主题初始化
|
// 主题初始化
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="cl-avatar" :class="[size, shape]" :style="[style]">
|
<div class="cl-avatar" :class="[size, shape]" :style="[style]">
|
||||||
<el-image :src="src" alt="">
|
<el-image :src="src || modelValue" alt="">
|
||||||
<template #error>
|
<template #error>
|
||||||
<div class="image-slot">
|
<div class="image-slot">
|
||||||
<i class="el-icon-user-solid" :style="{ color }"></i>
|
<i class="el-icon-user-solid" :style="{ color }"></i>
|
||||||
@ -12,12 +12,13 @@
|
|||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import { computed, defineComponent } from "vue";
|
import { computed, defineComponent } from "vue";
|
||||||
import { isNumber } from "/@/core/utils";
|
import { isNumber } from "/@/cool/utils";
|
||||||
|
|
||||||
export default defineComponent({
|
export default defineComponent({
|
||||||
name: "cl-avatar",
|
name: "cl-avatar",
|
||||||
|
|
||||||
props: {
|
props: {
|
||||||
|
modelValue: String,
|
||||||
src: String,
|
src: String,
|
||||||
size: {
|
size: {
|
||||||
type: [String, Number],
|
type: [String, Number],
|
||||||
|
@ -17,7 +17,7 @@ import "codemirror/addon/hint/show-hint.css";
|
|||||||
import "codemirror/theme/hopscotch.css";
|
import "codemirror/theme/hopscotch.css";
|
||||||
import "codemirror/addon/hint/javascript-hint";
|
import "codemirror/addon/hint/javascript-hint";
|
||||||
import "codemirror/mode/javascript/javascript";
|
import "codemirror/mode/javascript/javascript";
|
||||||
import { deepMerge } from "/@/core/utils";
|
import { deepMerge } from "/@/cool/utils";
|
||||||
|
|
||||||
export default defineComponent({
|
export default defineComponent({
|
||||||
name: "cl-codemirror",
|
name: "cl-codemirror",
|
||||||
|
@ -33,10 +33,10 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import { deepTree } from "/@/core/utils";
|
import { deepTree } from "/@/cool/utils";
|
||||||
import { ElMessage } from "element-plus";
|
import { ElMessage } from "element-plus";
|
||||||
import { defineComponent, inject, nextTick, onMounted, ref, watch } from "vue";
|
import { defineComponent, inject, nextTick, onMounted, ref, watch } from "vue";
|
||||||
import { useCool } from "/@/core";
|
import { useCool } from "/@/cool";
|
||||||
|
|
||||||
export default defineComponent({
|
export default defineComponent({
|
||||||
name: "cl-dept-check",
|
name: "cl-dept-check",
|
||||||
@ -79,7 +79,7 @@ export default defineComponent({
|
|||||||
|
|
||||||
// 刷新树形列表
|
// 刷新树形列表
|
||||||
function refresh() {
|
function refresh() {
|
||||||
service.base.system.dept
|
service.base.sys.department
|
||||||
.list()
|
.list()
|
||||||
.then((res: any[]) => {
|
.then((res: any[]) => {
|
||||||
list.value = deepTree(res);
|
list.value = deepTree(res);
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
import { useCool } from "/@/core";
|
import { useCool } from "/@/cool";
|
||||||
import { deepTree } from "/@/core/utils";
|
import { deepTree } from "/@/cool/utils";
|
||||||
import { ElMessage, ElMessageBox } from "element-plus";
|
import { ElMessage, ElMessageBox } from "element-plus";
|
||||||
import { defineComponent, h, ref } from "vue";
|
import { defineComponent, h, ref } from "vue";
|
||||||
|
|
||||||
@ -16,7 +16,7 @@ export default defineComponent({
|
|||||||
|
|
||||||
// 刷新列表
|
// 刷新列表
|
||||||
async function refresh() {
|
async function refresh() {
|
||||||
return await service.base.system.dept.list().then(deepTree);
|
return await service.base.sys.department.list().then(deepTree);
|
||||||
}
|
}
|
||||||
|
|
||||||
// 转移
|
// 转移
|
||||||
@ -51,7 +51,7 @@ export default defineComponent({
|
|||||||
type: "warning"
|
type: "warning"
|
||||||
})
|
})
|
||||||
.then(() => {
|
.then(() => {
|
||||||
service.base.system.user
|
service.base.sys.user
|
||||||
.move({
|
.move({
|
||||||
departmentId: id,
|
departmentId: id,
|
||||||
userIds: ids
|
userIds: ids
|
||||||
|
@ -63,9 +63,9 @@
|
|||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import { defineComponent, inject, onMounted, ref } from "vue";
|
import { defineComponent, inject, onMounted, ref } from "vue";
|
||||||
import { ElMessage, ElMessageBox } from "element-plus";
|
import { ElMessage, ElMessageBox } from "element-plus";
|
||||||
import { ContextMenu } from "cl-admin-crud-vue3";
|
import { ContextMenu } from "@cool-vue/crud";
|
||||||
import { useCool } from "/@/core";
|
import { useCool } from "/@/cool";
|
||||||
import { deepTree, isArray, revDeepTree, isPc } from "/@/core/utils";
|
import { deepTree, isArray, revDeepTree, isPc } from "/@/cool/utils";
|
||||||
|
|
||||||
export default defineComponent({
|
export default defineComponent({
|
||||||
name: "cl-dept-tree",
|
name: "cl-dept-tree",
|
||||||
@ -113,7 +113,7 @@ export default defineComponent({
|
|||||||
isDrag.value = false;
|
isDrag.value = false;
|
||||||
loading.value = true;
|
loading.value = true;
|
||||||
|
|
||||||
await service.base.system.dept.list().then((res: any[]) => {
|
await service.base.sys.department.list().then((res: any[]) => {
|
||||||
list.value = deepTree(res);
|
list.value = deepTree(res);
|
||||||
emit("list-change", list.value);
|
emit("list-change", list.value);
|
||||||
});
|
});
|
||||||
@ -179,7 +179,7 @@ export default defineComponent({
|
|||||||
form: e,
|
form: e,
|
||||||
on: {
|
on: {
|
||||||
submit: (data: any, { done, close }: any) => {
|
submit: (data: any, { done, close }: any) => {
|
||||||
service.base.system.dept[method]({
|
service.base.sys.department[method]({
|
||||||
id: e.id,
|
id: e.id,
|
||||||
parentId: e.parentId,
|
parentId: e.parentId,
|
||||||
name: data.name,
|
name: data.name,
|
||||||
@ -202,7 +202,7 @@ export default defineComponent({
|
|||||||
// 删除部门
|
// 删除部门
|
||||||
function rowDel(e: any) {
|
function rowDel(e: any) {
|
||||||
const del = async (f: boolean) => {
|
const del = async (f: boolean) => {
|
||||||
await service.base.system.dept
|
await service.base.sys.department
|
||||||
.delete({
|
.delete({
|
||||||
ids: [e.id],
|
ids: [e.id],
|
||||||
deleteUser: f
|
deleteUser: f
|
||||||
@ -259,7 +259,7 @@ export default defineComponent({
|
|||||||
|
|
||||||
deep(list.value, null);
|
deep(list.value, null);
|
||||||
|
|
||||||
await service.base.system.dept
|
await service.base.sys.department
|
||||||
.order(
|
.order(
|
||||||
ids.map((e, i) => {
|
ids.map((e, i) => {
|
||||||
return {
|
return {
|
||||||
@ -298,7 +298,7 @@ export default defineComponent({
|
|||||||
"suffix-icon": "el-icon-plus",
|
"suffix-icon": "el-icon-plus",
|
||||||
hidden:
|
hidden:
|
||||||
(n && n.level >= props.level) ||
|
(n && n.level >= props.level) ||
|
||||||
!service.base.system.dept._permission.add,
|
!service.base.sys.department._permission.add,
|
||||||
callback: (_: any, done: Function) => {
|
callback: (_: any, done: Function) => {
|
||||||
rowEdit({
|
rowEdit({
|
||||||
name: "",
|
name: "",
|
||||||
@ -311,7 +311,7 @@ export default defineComponent({
|
|||||||
{
|
{
|
||||||
label: "编辑",
|
label: "编辑",
|
||||||
"suffix-icon": "el-icon-edit",
|
"suffix-icon": "el-icon-edit",
|
||||||
hidden: !service.base.system.dept._permission.update,
|
hidden: !service.base.sys.department._permission.update,
|
||||||
callback: (_: any, done: Function) => {
|
callback: (_: any, done: Function) => {
|
||||||
rowEdit(d);
|
rowEdit(d);
|
||||||
done();
|
done();
|
||||||
@ -320,7 +320,7 @@ export default defineComponent({
|
|||||||
{
|
{
|
||||||
label: "删除",
|
label: "删除",
|
||||||
"suffix-icon": "el-icon-delete",
|
"suffix-icon": "el-icon-delete",
|
||||||
hidden: !d.parentId || !service.base.system.dept._permission.delete,
|
hidden: !d.parentId || !service.base.sys.department._permission.delete,
|
||||||
callback: (_: any, done: Function) => {
|
callback: (_: any, done: Function) => {
|
||||||
rowDel(d);
|
rowDel(d);
|
||||||
done();
|
done();
|
||||||
@ -329,7 +329,7 @@ export default defineComponent({
|
|||||||
{
|
{
|
||||||
label: "新增成员",
|
label: "新增成员",
|
||||||
"suffix-icon": "el-icon-user",
|
"suffix-icon": "el-icon-user",
|
||||||
hidden: !service.base.system.user._permission.add,
|
hidden: !service.base.sys.user._permission.add,
|
||||||
callback: (_: any, done: Function) => {
|
callback: (_: any, done: Function) => {
|
||||||
emit("user-add", d);
|
emit("user-add", d);
|
||||||
done();
|
done();
|
||||||
|
@ -15,8 +15,8 @@
|
|||||||
import { computed, defineComponent, onMounted, ref, watch } from "vue";
|
import { computed, defineComponent, onMounted, ref, watch } from "vue";
|
||||||
import Quill from "quill";
|
import Quill from "quill";
|
||||||
import "quill/dist/quill.snow.css";
|
import "quill/dist/quill.snow.css";
|
||||||
import { isNumber } from "/@/core/utils";
|
import { isNumber } from "/@/cool/utils";
|
||||||
import { useCool } from "/@/core";
|
import { useCool } from "/@/cool";
|
||||||
|
|
||||||
export default defineComponent({
|
export default defineComponent({
|
||||||
name: "cl-editor-quill",
|
name: "cl-editor-quill",
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import { computed, defineComponent, ref } from "vue";
|
import { computed, defineComponent, ref } from "vue";
|
||||||
import { isNumber } from "/@/core/utils";
|
import { isNumber } from "/@/cool/utils";
|
||||||
|
|
||||||
export default defineComponent({
|
export default defineComponent({
|
||||||
name: "icon-svg",
|
name: "icon-svg",
|
||||||
|
@ -27,12 +27,14 @@
|
|||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import { computed, defineComponent } from "vue";
|
import { computed, defineComponent } from "vue";
|
||||||
import { isArray, isNumber, isString } from "/@/core/utils";
|
import { isArray, isNumber, isString } from "/@/cool/utils";
|
||||||
|
|
||||||
export default defineComponent({
|
export default defineComponent({
|
||||||
name: "cl-image",
|
name: "cl-image",
|
||||||
|
|
||||||
props: {
|
props: {
|
||||||
|
modelValue: [String, Array],
|
||||||
|
src: [String, Array],
|
||||||
size: {
|
size: {
|
||||||
type: [Number, Array],
|
type: [Number, Array],
|
||||||
default: 100
|
default: 100
|
||||||
@ -45,7 +47,6 @@ export default defineComponent({
|
|||||||
type: String,
|
type: String,
|
||||||
default: "cover"
|
default: "cover"
|
||||||
},
|
},
|
||||||
src: [String, Array],
|
|
||||||
justify: {
|
justify: {
|
||||||
type: String,
|
type: String,
|
||||||
default: "center"
|
default: "center"
|
||||||
@ -54,7 +55,7 @@ export default defineComponent({
|
|||||||
|
|
||||||
setup(props) {
|
setup(props) {
|
||||||
const urls = computed(() => {
|
const urls = computed(() => {
|
||||||
const urls: any = props.src;
|
const urls: any = props.modelValue || props.src;
|
||||||
|
|
||||||
if (isArray(urls)) {
|
if (isArray(urls)) {
|
||||||
return urls;
|
return urls;
|
||||||
|
79
src/cool/modules/base/components/link/index.vue
Normal file
79
src/cool/modules/base/components/link/index.vue
Normal file
@ -0,0 +1,79 @@
|
|||||||
|
<template>
|
||||||
|
<a v-for="item in urls" :key="item" class="cl-link" :href="item" :target="target">
|
||||||
|
<el-icon><icon-link /></el-icon>{{ filename(item) }}
|
||||||
|
</a>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang="ts">
|
||||||
|
import { defineComponent, computed } from "vue";
|
||||||
|
import { isArray, isString, last } from "/@/cool/utils";
|
||||||
|
import { Link } from "@element-plus/icons";
|
||||||
|
|
||||||
|
export default defineComponent({
|
||||||
|
name: "cl-link",
|
||||||
|
|
||||||
|
components: {
|
||||||
|
"icon-link": Link
|
||||||
|
},
|
||||||
|
|
||||||
|
props: {
|
||||||
|
modelValue: [String, Array],
|
||||||
|
href: [String, Array],
|
||||||
|
text: {
|
||||||
|
type: String,
|
||||||
|
default: "查看"
|
||||||
|
},
|
||||||
|
target: {
|
||||||
|
type: String,
|
||||||
|
default: "_blank"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
setup(props) {
|
||||||
|
const urls = computed(() => {
|
||||||
|
const urls: any = props.modelValue || props.href;
|
||||||
|
|
||||||
|
if (isArray(urls)) {
|
||||||
|
return urls;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isString(urls)) {
|
||||||
|
return (urls || "").split(",").filter(Boolean);
|
||||||
|
}
|
||||||
|
|
||||||
|
return [];
|
||||||
|
});
|
||||||
|
|
||||||
|
function filename(url: string) {
|
||||||
|
return last(url.split("/"));
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
urls,
|
||||||
|
filename
|
||||||
|
};
|
||||||
|
}
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
.cl-link {
|
||||||
|
display: inline-flex;
|
||||||
|
align-items: center;
|
||||||
|
text-align: left;
|
||||||
|
background-color: $color-primary;
|
||||||
|
color: #fff;
|
||||||
|
padding: 0 5px;
|
||||||
|
border-radius: 5px;
|
||||||
|
font-size: 12px;
|
||||||
|
margin: 2px;
|
||||||
|
|
||||||
|
.el-icon {
|
||||||
|
margin-right: 2px;
|
||||||
|
}
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
text-decoration: underline;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
@ -1,10 +1,10 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="cl-menu-icons">
|
<div class="cl-menu-icons__wrap">
|
||||||
<el-popover
|
<el-popover
|
||||||
|
v-model:visible="visible"
|
||||||
placement="bottom-start"
|
placement="bottom-start"
|
||||||
trigger="click"
|
|
||||||
width="480px"
|
width="480px"
|
||||||
popper-class="popper-menu-icon"
|
popper-class="cl-menu-icons"
|
||||||
>
|
>
|
||||||
<el-row :gutter="10" class="list scroller1">
|
<el-row :gutter="10" class="list scroller1">
|
||||||
<el-col v-for="(item, index) in list" :key="index" :span="3" :xs="4">
|
<el-col v-for="(item, index) in list" :key="index" :span="3" :xs="4">
|
||||||
@ -91,7 +91,7 @@ export default defineComponent({
|
|||||||
|
|
||||||
.
|
.
|
||||||
<style lang="scss">
|
<style lang="scss">
|
||||||
.popper-menu-icon {
|
.cl-menu-icons {
|
||||||
max-width: 90%;
|
max-width: 90%;
|
||||||
box-sizing: border-box;
|
box-sizing: border-box;
|
||||||
|
|
||||||
|
244
src/cool/modules/base/components/menu/quick.vue
Normal file
244
src/cool/modules/base/components/menu/quick.vue
Normal file
@ -0,0 +1,244 @@
|
|||||||
|
<template>
|
||||||
|
<el-button type="success" size="mini" @click="create">快速创建</el-button>
|
||||||
|
|
||||||
|
<cl-form :ref="setRefs('form')" />
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang="ts">
|
||||||
|
import { defineComponent } from "vue";
|
||||||
|
import { useModule } from "/@/cool";
|
||||||
|
import { last, isEmpty } from "/@/cool/utils";
|
||||||
|
import { ElMessage } from "element-plus";
|
||||||
|
import { useCool } from "/@/cool/core";
|
||||||
|
|
||||||
|
export default defineComponent({
|
||||||
|
name: "cl-menu-quick",
|
||||||
|
|
||||||
|
emits: ["success"],
|
||||||
|
|
||||||
|
setup(_, { emit }) {
|
||||||
|
const { service, refs, setRefs } = useCool();
|
||||||
|
|
||||||
|
// 快速创建
|
||||||
|
async function create() {
|
||||||
|
// 模块列表
|
||||||
|
const modules = await service.request({
|
||||||
|
url: "/__cool_modules"
|
||||||
|
});
|
||||||
|
|
||||||
|
// 数据结构列表
|
||||||
|
const eps: any[] = await service.base.common.eps();
|
||||||
|
const entities: any[] = [];
|
||||||
|
|
||||||
|
for (const i in eps) {
|
||||||
|
eps[i].forEach((e: any) => {
|
||||||
|
if (!isEmpty(e.columns)) {
|
||||||
|
entities.push({
|
||||||
|
label: `${e.name}(${e.prefix})`,
|
||||||
|
value: entities.length,
|
||||||
|
filename: last(e.prefix.split("/")),
|
||||||
|
...e
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// 打开
|
||||||
|
refs.value.form.open({
|
||||||
|
title: "快速创建",
|
||||||
|
width: "900px",
|
||||||
|
items: [
|
||||||
|
{
|
||||||
|
prop: "module",
|
||||||
|
label: {
|
||||||
|
text: "模块名称",
|
||||||
|
tip: "菜单文件存放在所选模块的 views 目录下",
|
||||||
|
icon: "el-icon-question"
|
||||||
|
},
|
||||||
|
span: 9,
|
||||||
|
component: {
|
||||||
|
name: "el-select",
|
||||||
|
props: {
|
||||||
|
filterable: true,
|
||||||
|
clearable: true
|
||||||
|
},
|
||||||
|
options: modules.map((e: string) => {
|
||||||
|
return {
|
||||||
|
label: e,
|
||||||
|
value: e
|
||||||
|
};
|
||||||
|
})
|
||||||
|
},
|
||||||
|
required: true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
prop: "entity",
|
||||||
|
label: {
|
||||||
|
text: "数据结构",
|
||||||
|
tip: "所选实体会通过规则配置自动转换",
|
||||||
|
icon: "el-icon-question"
|
||||||
|
},
|
||||||
|
span: 15,
|
||||||
|
component: {
|
||||||
|
name: "el-select",
|
||||||
|
props: {
|
||||||
|
filterable: true,
|
||||||
|
clearable: true,
|
||||||
|
onChange(i: number) {
|
||||||
|
refs.value.form.setForm(
|
||||||
|
"router",
|
||||||
|
"/" +
|
||||||
|
(refs.value.form.getForm("module") || "test") +
|
||||||
|
"/" +
|
||||||
|
entities[i].filename
|
||||||
|
);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
options: entities
|
||||||
|
},
|
||||||
|
required: true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
prop: "name",
|
||||||
|
label: "菜单名称",
|
||||||
|
span: 9,
|
||||||
|
component: {
|
||||||
|
name: "el-input",
|
||||||
|
props: {
|
||||||
|
placeholder: "请输入菜单名称"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
required: true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
prop: "router",
|
||||||
|
label: "菜单路由",
|
||||||
|
span: 15,
|
||||||
|
component: {
|
||||||
|
name: "el-input",
|
||||||
|
props: {
|
||||||
|
placeholder: "请输入菜单路由,如:/test"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
prop: "parentId",
|
||||||
|
label: "上级节点",
|
||||||
|
component: {
|
||||||
|
name: "cl-menu-tree"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
prop: "keepAlive",
|
||||||
|
value: true,
|
||||||
|
label: "路由缓存",
|
||||||
|
component: {
|
||||||
|
name: "el-radio-group",
|
||||||
|
options: [
|
||||||
|
{
|
||||||
|
label: "开启",
|
||||||
|
value: true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: "关闭",
|
||||||
|
value: false
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
prop: "icon",
|
||||||
|
label: "菜单图标",
|
||||||
|
component: {
|
||||||
|
name: "cl-menu-icons"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
prop: "orderNum",
|
||||||
|
label: "排序号",
|
||||||
|
component: {
|
||||||
|
name: "el-input-number",
|
||||||
|
props: {
|
||||||
|
placeholder: "请填写排序号",
|
||||||
|
min: 0,
|
||||||
|
max: 99,
|
||||||
|
"controls-position": "right"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
on: {
|
||||||
|
submit(data: any, { done, close }: any) {
|
||||||
|
// 选择的数据结构
|
||||||
|
const item = entities[data.entity];
|
||||||
|
|
||||||
|
// 插入菜单
|
||||||
|
service.base.sys.menu
|
||||||
|
.add({
|
||||||
|
type: 1,
|
||||||
|
isShow: true,
|
||||||
|
viewPath: `cool/modules/${data.module}/views/${item.filename}.vue`,
|
||||||
|
...data
|
||||||
|
})
|
||||||
|
.then((res: any) => {
|
||||||
|
// 权限列表
|
||||||
|
const perms: any[] = [];
|
||||||
|
|
||||||
|
item.api.forEach((e: any) => {
|
||||||
|
const d: any = {
|
||||||
|
type: 2,
|
||||||
|
parentId: res.id,
|
||||||
|
name: e.summary || e.path,
|
||||||
|
perms: [e.path]
|
||||||
|
};
|
||||||
|
|
||||||
|
if (e.path == "/update") {
|
||||||
|
if (item.api.find((a: any) => a.path == "/info")) {
|
||||||
|
d.perms.push("/info");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
d.perms = d.perms
|
||||||
|
.map((e: string) =>
|
||||||
|
(item.prefix.replace("/admin/", "") + e).replace(
|
||||||
|
/\//g,
|
||||||
|
":"
|
||||||
|
)
|
||||||
|
)
|
||||||
|
.join(";");
|
||||||
|
|
||||||
|
perms.push(d);
|
||||||
|
});
|
||||||
|
|
||||||
|
// 批量插入权限
|
||||||
|
service.base.sys.menu.add(perms).then(() => {
|
||||||
|
emit("success");
|
||||||
|
close();
|
||||||
|
|
||||||
|
service.request({
|
||||||
|
url: "/__cool_createMenu",
|
||||||
|
method: "POST",
|
||||||
|
data: {
|
||||||
|
...item,
|
||||||
|
...data
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
})
|
||||||
|
.catch((err: string) => {
|
||||||
|
ElMessage.error(err);
|
||||||
|
done();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
refs,
|
||||||
|
setRefs,
|
||||||
|
create
|
||||||
|
};
|
||||||
|
}
|
||||||
|
});
|
||||||
|
</script>
|
@ -1,6 +1,6 @@
|
|||||||
import { computed, defineComponent, h, ref, watch } from "vue";
|
import { computed, defineComponent, h, ref, watch } from "vue";
|
||||||
import "./index.scss";
|
import "./index.scss";
|
||||||
import { useCool } from "/@/core";
|
import { useCool } from "/@/cool";
|
||||||
|
|
||||||
export default defineComponent({
|
export default defineComponent({
|
||||||
name: "cl-menu-slider",
|
name: "cl-menu-slider",
|
||||||
|
@ -17,7 +17,7 @@
|
|||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import { computed, defineComponent, onMounted, ref } from "vue";
|
import { computed, defineComponent, onMounted, ref } from "vue";
|
||||||
import { firstMenu } from "../../utils";
|
import { firstMenu } from "../../utils";
|
||||||
import { useCool } from "/@/core";
|
import { useCool } from "/@/cool";
|
||||||
|
|
||||||
export default defineComponent({
|
export default defineComponent({
|
||||||
name: "cl-menu-topbar",
|
name: "cl-menu-topbar",
|
||||||
|
@ -1,43 +1,45 @@
|
|||||||
<template>
|
<template>
|
||||||
<el-popover
|
<div class="cl-menu-tree__wrap">
|
||||||
:visible="visible"
|
<el-popover
|
||||||
placement="bottom-start"
|
v-model:visible="visible"
|
||||||
trigger="click"
|
placement="bottom-start"
|
||||||
width="500px"
|
trigger="click"
|
||||||
popper-class="cl-menu-tree"
|
width="500px"
|
||||||
>
|
popper-class="cl-menu-tree"
|
||||||
<el-input v-model="keyword" size="small">
|
>
|
||||||
<template #prefix>
|
<el-input v-model="keyword" size="small">
|
||||||
<i class="el-input__icon el-icon-search"></i>
|
<template #prefix>
|
||||||
|
<i class="el-input__icon el-icon-search"></i>
|
||||||
|
</template>
|
||||||
|
</el-input>
|
||||||
|
|
||||||
|
<div class="cl-menu-tree__scroller scroller1">
|
||||||
|
<el-tree
|
||||||
|
ref="treeRef"
|
||||||
|
node-key="menuId"
|
||||||
|
:data="treeList"
|
||||||
|
:props="{
|
||||||
|
label: 'name',
|
||||||
|
children: 'children'
|
||||||
|
}"
|
||||||
|
:highlight-current="true"
|
||||||
|
:expand-on-click-node="false"
|
||||||
|
:default-expanded-keys="expandedKeys"
|
||||||
|
:filter-node-method="filterNode"
|
||||||
|
@current-change="onCurrentChange"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<template #reference>
|
||||||
|
<el-input v-model="name" readonly placeholder="请选择" @click="visible = true" />
|
||||||
</template>
|
</template>
|
||||||
</el-input>
|
</el-popover>
|
||||||
|
</div>
|
||||||
<div class="cl-menu-tree__scroller scroller1">
|
|
||||||
<el-tree
|
|
||||||
ref="treeRef"
|
|
||||||
node-key="menuId"
|
|
||||||
:data="treeList"
|
|
||||||
:props="{
|
|
||||||
label: 'name',
|
|
||||||
children: 'children'
|
|
||||||
}"
|
|
||||||
:highlight-current="true"
|
|
||||||
:expand-on-click-node="false"
|
|
||||||
:default-expanded-keys="expandedKeys"
|
|
||||||
:filter-node-method="filterNode"
|
|
||||||
@current-change="onCurrentChange"
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<template #reference>
|
|
||||||
<el-input v-model="name" readonly placeholder="请选择" @click="visible = true" />
|
|
||||||
</template>
|
|
||||||
</el-popover>
|
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import { computed, defineComponent, inject, onMounted, ref, watch } from "vue";
|
import { computed, defineComponent, inject, onMounted, ref, watch } from "vue";
|
||||||
import { deepTree } from "/@/core/utils";
|
import { deepTree } from "/@/cool/utils";
|
||||||
|
|
||||||
export default defineComponent({
|
export default defineComponent({
|
||||||
name: "cl-menu-tree",
|
name: "cl-menu-tree",
|
||||||
@ -74,7 +76,7 @@ export default defineComponent({
|
|||||||
|
|
||||||
// 刷新列表
|
// 刷新列表
|
||||||
function refresh() {
|
function refresh() {
|
||||||
service.base.system.menu.list().then((res: any) => {
|
service.base.sys.menu.list().then((res: any) => {
|
||||||
const _list = res.filter((e: any) => e.type != 2);
|
const _list = res.filter((e: any) => e.type != 2);
|
||||||
|
|
||||||
_list.unshift({
|
_list.unshift({
|
||||||
|
@ -32,9 +32,9 @@
|
|||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import { computed, reactive, watch } from "vue";
|
import { computed, reactive, watch } from "vue";
|
||||||
import { last } from "/@/core/utils";
|
import { last } from "/@/cool/utils";
|
||||||
import { useCool } from "/@/core";
|
import { useCool } from "/@/cool";
|
||||||
import { ContextMenu } from "cl-admin-crud-vue3";
|
import { ContextMenu } from "@cool-vue/crud";
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: "cl-process",
|
name: "cl-process",
|
||||||
|
@ -26,7 +26,7 @@
|
|||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import { defineComponent, inject, onMounted, ref, watch } from "vue";
|
import { defineComponent, inject, onMounted, ref, watch } from "vue";
|
||||||
import { ElMessage } from "element-plus";
|
import { ElMessage } from "element-plus";
|
||||||
import { deepTree } from "/@/core/utils";
|
import { deepTree } from "/@/cool/utils";
|
||||||
|
|
||||||
export default defineComponent({
|
export default defineComponent({
|
||||||
name: "cl-role-perms",
|
name: "cl-role-perms",
|
||||||
@ -85,7 +85,7 @@ export default defineComponent({
|
|||||||
|
|
||||||
// 刷新列表
|
// 刷新列表
|
||||||
function refresh() {
|
function refresh() {
|
||||||
service.base.system.menu
|
service.base.sys.menu
|
||||||
.list()
|
.list()
|
||||||
.then((res: any[]) => {
|
.then((res: any[]) => {
|
||||||
list.value = deepTree(res);
|
list.value = deepTree(res);
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import { defineComponent, inject, onMounted, ref, watch } from "vue";
|
import { defineComponent, inject, onMounted, ref, watch } from "vue";
|
||||||
import { isArray } from "/@/core/utils";
|
import { isArray } from "/@/cool/utils";
|
||||||
|
|
||||||
export default defineComponent({
|
export default defineComponent({
|
||||||
name: "cl-role-select",
|
name: "cl-role-select",
|
||||||
@ -45,7 +45,7 @@ export default defineComponent({
|
|||||||
);
|
);
|
||||||
|
|
||||||
onMounted(async () => {
|
onMounted(async () => {
|
||||||
list.value = await service.base.system.role.list();
|
list.value = await service.base.sys.role.list();
|
||||||
});
|
});
|
||||||
|
|
||||||
return {
|
return {
|
||||||
|
@ -18,8 +18,8 @@
|
|||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import { computed, defineComponent, ref, watch } from "vue";
|
import { computed, defineComponent, ref, watch } from "vue";
|
||||||
import _ from "lodash";
|
import _ from "lodash";
|
||||||
import { isEmpty } from "/@/core/utils";
|
import { isEmpty } from "/@/cool/utils";
|
||||||
import { useCool } from "/@/core";
|
import { useCool } from "/@/cool";
|
||||||
|
|
||||||
export default defineComponent({
|
export default defineComponent({
|
||||||
name: "cl-route-nav",
|
name: "cl-route-nav",
|
||||||
|
@ -21,7 +21,7 @@
|
|||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import { computed, defineComponent } from "vue";
|
import { computed, defineComponent } from "vue";
|
||||||
import { getBrowser } from "/@/core/utils";
|
import { getBrowser } from "/@/cool/utils";
|
||||||
|
|
||||||
export default defineComponent({
|
export default defineComponent({
|
||||||
name: "cl-scrollbar",
|
name: "cl-scrollbar",
|
||||||
|
112
src/cool/modules/base/components/switch/index.vue
Normal file
112
src/cool/modules/base/components/switch/index.vue
Normal file
@ -0,0 +1,112 @@
|
|||||||
|
<template>
|
||||||
|
<div class="cl-switch">
|
||||||
|
<el-switch
|
||||||
|
:ref="setRefs('switch')"
|
||||||
|
:model-value="status"
|
||||||
|
:disabled="disabled"
|
||||||
|
:loading="loading"
|
||||||
|
:width="width"
|
||||||
|
:inline-prompt="inlinePrompt"
|
||||||
|
:active-icon="activeIcon"
|
||||||
|
:inactive-icon="inactiveIcon"
|
||||||
|
:active-text="activeText"
|
||||||
|
:inactive-text="inactiveText"
|
||||||
|
:active-value="activeValue"
|
||||||
|
:inactive-value="inactiveValue"
|
||||||
|
:active-color="activeColor"
|
||||||
|
:inactive-color="inactiveColor"
|
||||||
|
:border-color="borderColor"
|
||||||
|
:string="string"
|
||||||
|
:validate-event="validateEvent"
|
||||||
|
:before-change="beforeChange"
|
||||||
|
@change="onChange"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang="ts">
|
||||||
|
import { ElMessage } from "element-plus";
|
||||||
|
import { defineComponent, inject, ref, watch } from "vue";
|
||||||
|
import { useCool } from "/@/cool/core";
|
||||||
|
|
||||||
|
export default defineComponent({
|
||||||
|
name: "cl-switch",
|
||||||
|
|
||||||
|
props: {
|
||||||
|
scope: null,
|
||||||
|
column: null,
|
||||||
|
modelValue: [Boolean, String, Number],
|
||||||
|
disabled: Boolean,
|
||||||
|
loading: Boolean,
|
||||||
|
width: Number,
|
||||||
|
inlinePrompt: Boolean,
|
||||||
|
activeIcon: String,
|
||||||
|
inactiveIcon: String,
|
||||||
|
activeText: String,
|
||||||
|
inactiveText: String,
|
||||||
|
activeValue: {
|
||||||
|
type: [Boolean, String, Number],
|
||||||
|
default: 1
|
||||||
|
},
|
||||||
|
inactiveValue: {
|
||||||
|
type: [Boolean, String, Number],
|
||||||
|
default: 0
|
||||||
|
},
|
||||||
|
activeColor: String,
|
||||||
|
inactiveColor: String,
|
||||||
|
borderColor: String,
|
||||||
|
string: String,
|
||||||
|
validateEvent: {
|
||||||
|
type: Boolean,
|
||||||
|
default: true
|
||||||
|
},
|
||||||
|
beforeChange: Function
|
||||||
|
},
|
||||||
|
|
||||||
|
emits: ["update:modelValue", "change"],
|
||||||
|
|
||||||
|
setup(props, { emit }) {
|
||||||
|
const { refs, setRefs } = useCool();
|
||||||
|
const crud = inject<any>("crud");
|
||||||
|
|
||||||
|
// 状态
|
||||||
|
const status = ref<any>(props.modelValue);
|
||||||
|
|
||||||
|
watch(
|
||||||
|
() => props.modelValue,
|
||||||
|
(val: any) => {
|
||||||
|
status.value = val;
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
function focus() {
|
||||||
|
refs.value.switch.focus();
|
||||||
|
}
|
||||||
|
|
||||||
|
function onChange(val: boolean | string | number) {
|
||||||
|
crud.service
|
||||||
|
.update({
|
||||||
|
...props.scope,
|
||||||
|
[props.column.property]: val
|
||||||
|
})
|
||||||
|
.then(() => {
|
||||||
|
emit("update:modelValue", val);
|
||||||
|
emit("change", val);
|
||||||
|
status.value = val;
|
||||||
|
ElMessage.success("更新成功");
|
||||||
|
})
|
||||||
|
.catch((err: string) => {
|
||||||
|
ElMessage.error(err);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
refs,
|
||||||
|
setRefs,
|
||||||
|
focus,
|
||||||
|
onChange,
|
||||||
|
status
|
||||||
|
};
|
||||||
|
}
|
||||||
|
});
|
||||||
|
</script>
|
@ -34,8 +34,8 @@
|
|||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import { computed, defineComponent, ref } from "vue";
|
import { computed, defineComponent, ref } from "vue";
|
||||||
import { href } from "/@/core/utils";
|
import { href } from "/@/cool/utils";
|
||||||
import { useCool } from "/@/core";
|
import { useCool } from "/@/cool";
|
||||||
|
|
||||||
export default defineComponent({
|
export default defineComponent({
|
||||||
props: {
|
props: {
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
<div class="page-login">
|
<div class="page-login">
|
||||||
<div class="box">
|
<div class="box">
|
||||||
<img class="logo" src="../../static/images/logo.png" alt="" />
|
<img class="logo" src="../../static/images/logo.png" alt="" />
|
||||||
<p class="desc">COOL ADMIN是一款快速开发后台权限管理系统</p>
|
<p class="desc">{{ app.name }}是一款快速开发后台权限管理系统</p>
|
||||||
|
|
||||||
<el-form label-position="top" class="form" size="medium" :disabled="saving">
|
<el-form label-position="top" class="form" size="medium" :disabled="saving">
|
||||||
<el-form-item label="用户名">
|
<el-form-item label="用户名">
|
||||||
@ -57,7 +57,8 @@
|
|||||||
import { defineComponent, reactive, ref } from "vue";
|
import { defineComponent, reactive, ref } from "vue";
|
||||||
import { ElMessage } from "element-plus";
|
import { ElMessage } from "element-plus";
|
||||||
import Captcha from "./components/captcha.vue";
|
import Captcha from "./components/captcha.vue";
|
||||||
import { useCool } from "/@/core";
|
import { useCool } from "/@/cool";
|
||||||
|
import { useEps } from "/@/cool/core";
|
||||||
|
|
||||||
export default defineComponent({
|
export default defineComponent({
|
||||||
cool: {
|
cool: {
|
||||||
@ -71,7 +72,7 @@ export default defineComponent({
|
|||||||
},
|
},
|
||||||
|
|
||||||
setup() {
|
setup() {
|
||||||
const { refs, setRefs, store, router }: any = useCool();
|
const { refs, setRefs, store, router, app }: any = useCool();
|
||||||
|
|
||||||
const saving = ref<boolean>(false);
|
const saving = ref<boolean>(false);
|
||||||
|
|
||||||
@ -106,6 +107,9 @@ export default defineComponent({
|
|||||||
// 用户信息
|
// 用户信息
|
||||||
await store.dispatch("userInfo");
|
await store.dispatch("userInfo");
|
||||||
|
|
||||||
|
// 读取Eps
|
||||||
|
await useEps();
|
||||||
|
|
||||||
// 权限菜单
|
// 权限菜单
|
||||||
const [first] = await store.dispatch("permMenu");
|
const [first] = await store.dispatch("permMenu");
|
||||||
|
|
||||||
@ -114,7 +118,7 @@ export default defineComponent({
|
|||||||
} else {
|
} else {
|
||||||
router.push("/");
|
router.push("/");
|
||||||
}
|
}
|
||||||
} catch (err) {
|
} catch (err: any) {
|
||||||
ElMessage.error(err);
|
ElMessage.error(err);
|
||||||
refs.value.captcha.refresh();
|
refs.value.captcha.refresh();
|
||||||
}
|
}
|
||||||
@ -124,10 +128,11 @@ export default defineComponent({
|
|||||||
|
|
||||||
return {
|
return {
|
||||||
refs,
|
refs,
|
||||||
|
setRefs,
|
||||||
form,
|
form,
|
||||||
saving,
|
saving,
|
||||||
toLogin,
|
toLogin,
|
||||||
setRefs
|
app
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
import { BaseService, Service } from "/@/core";
|
import { BaseService, Service } from "/@/cool";
|
||||||
|
|
||||||
@Service("base/comm")
|
@Service("base/comm")
|
||||||
class Common extends BaseService {
|
class Common extends BaseService {
|
||||||
@ -75,6 +75,15 @@ class Common extends BaseService {
|
|||||||
url: "/permmenu"
|
url: "/permmenu"
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 数据接口
|
||||||
|
*/
|
||||||
|
eps() {
|
||||||
|
return this.request({
|
||||||
|
url: "/eps"
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export default Common;
|
export default Common;
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
import { BaseService, Service } from "/@/core";
|
import { BaseService, Service } from "/@/cool";
|
||||||
|
|
||||||
@Service("base/open")
|
@Service("base/open")
|
||||||
class Open extends BaseService {
|
class Open extends BaseService {
|
||||||
|
@ -1,32 +0,0 @@
|
|||||||
import { BaseService, Service, Permission } from "/@/core";
|
|
||||||
|
|
||||||
@Service("base/plugin/info")
|
|
||||||
class PluginInfo extends BaseService {
|
|
||||||
@Permission("config")
|
|
||||||
config(data: any) {
|
|
||||||
return this.request({
|
|
||||||
url: "/config",
|
|
||||||
method: "POST",
|
|
||||||
data
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
@Permission("getConfig")
|
|
||||||
getConfig(params: any) {
|
|
||||||
return this.request({
|
|
||||||
url: "/getConfig",
|
|
||||||
params
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
@Permission("enable")
|
|
||||||
enable(data: any) {
|
|
||||||
return this.request({
|
|
||||||
url: "/enable",
|
|
||||||
method: "POST",
|
|
||||||
data
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
export default PluginInfo;
|
|
@ -1,15 +0,0 @@
|
|||||||
import { BaseService, Service, Permission } from "/@/core";
|
|
||||||
|
|
||||||
@Service("base/sys/department")
|
|
||||||
class SysDepartment extends BaseService {
|
|
||||||
@Permission("order")
|
|
||||||
order(data: any) {
|
|
||||||
return this.request({
|
|
||||||
url: "/order",
|
|
||||||
method: "POST",
|
|
||||||
data
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
export default SysDepartment;
|
|
@ -1,32 +0,0 @@
|
|||||||
import { BaseService, Service, Permission } from "/@/core";
|
|
||||||
|
|
||||||
@Service("base/sys/log")
|
|
||||||
class SysLog extends BaseService {
|
|
||||||
@Permission("clear")
|
|
||||||
clear() {
|
|
||||||
return this.request({
|
|
||||||
url: "/clear",
|
|
||||||
method: "POST"
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
@Permission("getKeep")
|
|
||||||
getKeep() {
|
|
||||||
return this.request({
|
|
||||||
url: "/getKeep"
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
@Permission("setKeep")
|
|
||||||
setKeep(value: any) {
|
|
||||||
return this.request({
|
|
||||||
url: "/setKeep",
|
|
||||||
method: "POST",
|
|
||||||
data: {
|
|
||||||
value
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
export default SysLog;
|
|
@ -1,6 +0,0 @@
|
|||||||
import { BaseService, Service } from "/@/core";
|
|
||||||
|
|
||||||
@Service("base/sys/menu")
|
|
||||||
class SysMenu extends BaseService {}
|
|
||||||
|
|
||||||
export default SysMenu;
|
|
@ -1,6 +0,0 @@
|
|||||||
import { BaseService, Service } from "/@/core";
|
|
||||||
|
|
||||||
@Service("base/sys/param")
|
|
||||||
class SysParam extends BaseService {}
|
|
||||||
|
|
||||||
export default SysParam;
|
|
@ -1,6 +0,0 @@
|
|||||||
import { BaseService, Service } from "/@/core";
|
|
||||||
|
|
||||||
@Service("base/sys/role")
|
|
||||||
class SysRole extends BaseService {}
|
|
||||||
|
|
||||||
export default SysRole;
|
|
@ -1,41 +0,0 @@
|
|||||||
import { BaseService, Service, Permission } from "/@/core";
|
|
||||||
|
|
||||||
@Service("base/sys/task")
|
|
||||||
class SysTask extends BaseService {
|
|
||||||
@Permission("stop")
|
|
||||||
stop(data: any) {
|
|
||||||
return this.request({
|
|
||||||
url: "/stop",
|
|
||||||
method: "POST",
|
|
||||||
data
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
@Permission("start")
|
|
||||||
start(data: any) {
|
|
||||||
return this.request({
|
|
||||||
url: "/start",
|
|
||||||
method: "POST",
|
|
||||||
data
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
@Permission("once")
|
|
||||||
once(data: any) {
|
|
||||||
return this.request({
|
|
||||||
url: "/once",
|
|
||||||
method: "POST",
|
|
||||||
data
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
@Permission("log")
|
|
||||||
log(params: any) {
|
|
||||||
return this.request({
|
|
||||||
url: "/log",
|
|
||||||
params
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
export default SysTask;
|
|
@ -1,15 +0,0 @@
|
|||||||
import { BaseService, Service, Permission } from "/@/core";
|
|
||||||
|
|
||||||
@Service("base/sys/user")
|
|
||||||
class SysUser extends BaseService {
|
|
||||||
@Permission("move")
|
|
||||||
move(data: any) {
|
|
||||||
return this.request({
|
|
||||||
url: "/move",
|
|
||||||
method: "POST",
|
|
||||||
data
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
export default SysUser;
|
|
@ -1,6 +1,7 @@
|
|||||||
import store from "store";
|
import store from "store";
|
||||||
import { deepMerge, getBrowser } from "/@/core/utils";
|
import { deepMerge, getBrowser } from "/@/cool/utils";
|
||||||
import { app } from "/@/config/env";
|
import { app } from "/@/config/env";
|
||||||
|
import { useEps } from "/@/cool";
|
||||||
|
|
||||||
const browser = getBrowser();
|
const browser = getBrowser();
|
||||||
|
|
||||||
@ -29,8 +30,12 @@ const actions = {
|
|||||||
if (getters.token) {
|
if (getters.token) {
|
||||||
commit("SHOW_LOADING");
|
commit("SHOW_LOADING");
|
||||||
|
|
||||||
|
// 读取Eps
|
||||||
|
await useEps();
|
||||||
|
|
||||||
// 读取菜单权限
|
// 读取菜单权限
|
||||||
await dispatch("permMenu");
|
await dispatch("permMenu");
|
||||||
|
|
||||||
// 获取用户信息
|
// 获取用户信息
|
||||||
dispatch("userInfo");
|
dispatch("userInfo");
|
||||||
|
|
||||||
|
@ -2,11 +2,11 @@ import { ElMessage } from "element-plus";
|
|||||||
import storage from "store";
|
import storage from "store";
|
||||||
import store from "/@/store";
|
import store from "/@/store";
|
||||||
import router from "/@/router";
|
import router from "/@/router";
|
||||||
import { deepTree, revDeepTree, isArray, isEmpty } from "/@/core/utils";
|
import { deepTree, revDeepTree, isArray, isEmpty } from "/@/cool/utils";
|
||||||
import { menuList } from "/@/config/env";
|
import { menuList } from "/@/config/env";
|
||||||
import { revisePath } from "../utils";
|
import { revisePath } from "../utils";
|
||||||
import { MenuItem } from "../types";
|
import { MenuItem } from "../types";
|
||||||
import { usePermission } from "/@/core";
|
import { usePermission } from "/@/cool";
|
||||||
|
|
||||||
const state = {
|
const state = {
|
||||||
// 视图路由,type=1
|
// 视图路由,type=1
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
import { storage, href } from "/@/core/utils";
|
import { storage, href } from "/@/cool/utils";
|
||||||
import store from "/@/store";
|
import store from "/@/store";
|
||||||
import { Token } from "../types";
|
import { Token } from "../types";
|
||||||
|
|
||||||
|
@ -25,8 +25,8 @@
|
|||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import { ElMessage } from "element-plus";
|
import { ElMessage } from "element-plus";
|
||||||
import { defineComponent, reactive, ref } from "vue";
|
import { defineComponent, reactive, ref } from "vue";
|
||||||
import { useCool } from "/@/core";
|
import { useCool } from "/@/cool";
|
||||||
import { cloneDeep } from "/@/core/utils";
|
import { cloneDeep } from "/@/cool/utils";
|
||||||
|
|
||||||
export default defineComponent({
|
export default defineComponent({
|
||||||
name: "sys-info",
|
name: "sys-info",
|
||||||
|
@ -4,7 +4,7 @@
|
|||||||
<cl-refresh-btn />
|
<cl-refresh-btn />
|
||||||
|
|
||||||
<el-button
|
<el-button
|
||||||
v-permission="service.base.system.log.permission.clear"
|
v-permission="service.base.sys.log.permission.clear"
|
||||||
size="mini"
|
size="mini"
|
||||||
type="danger"
|
type="danger"
|
||||||
@click="clear"
|
@click="clear"
|
||||||
@ -41,8 +41,8 @@
|
|||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import { defineComponent, reactive, ref } from "vue";
|
import { defineComponent, reactive, ref } from "vue";
|
||||||
import { ElMessage, ElMessageBox } from "element-plus";
|
import { ElMessage, ElMessageBox } from "element-plus";
|
||||||
import { useCool } from "/@/core";
|
import { useCool } from "/@/cool";
|
||||||
import { CrudLoad, Table } from "cl-admin-crud-vue3/types";
|
import { CrudLoad, Table } from "@cool-vue/crud/types";
|
||||||
|
|
||||||
export default defineComponent({
|
export default defineComponent({
|
||||||
name: "sys-log",
|
name: "sys-log",
|
||||||
@ -111,13 +111,13 @@ export default defineComponent({
|
|||||||
|
|
||||||
// crud 加载
|
// crud 加载
|
||||||
function onLoad({ ctx, app }: CrudLoad) {
|
function onLoad({ ctx, app }: CrudLoad) {
|
||||||
ctx.service(service.base.system.log).done();
|
ctx.service(service.base.sys.log).done();
|
||||||
app.refresh();
|
app.refresh();
|
||||||
}
|
}
|
||||||
|
|
||||||
// 保存天数
|
// 保存天数
|
||||||
function saveDay() {
|
function saveDay() {
|
||||||
service.base.system.log.setKeep(day.value).then(() => {
|
service.base.sys.log.setKeep(day.value).then(() => {
|
||||||
ElMessage.success("保存成功");
|
ElMessage.success("保存成功");
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -128,7 +128,7 @@ export default defineComponent({
|
|||||||
type: "warning"
|
type: "warning"
|
||||||
})
|
})
|
||||||
.then(() => {
|
.then(() => {
|
||||||
service.base.system.log
|
service.base.sys.log
|
||||||
.clear()
|
.clear()
|
||||||
.then(() => {
|
.then(() => {
|
||||||
ElMessage.success("清空成功");
|
ElMessage.success("清空成功");
|
||||||
@ -142,7 +142,7 @@ export default defineComponent({
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 获取天数
|
// 获取天数
|
||||||
service.base.system.log.getKeep().then((res: number) => {
|
service.base.sys.log.getKeep().then((res: number) => {
|
||||||
day.value = Number(res);
|
day.value = Number(res);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -3,6 +3,7 @@
|
|||||||
<el-row type="flex">
|
<el-row type="flex">
|
||||||
<cl-refresh-btn />
|
<cl-refresh-btn />
|
||||||
<cl-add-btn />
|
<cl-add-btn />
|
||||||
|
<cl-menu-quick @success="refresh()" v-if="isDev" />
|
||||||
</el-row>
|
</el-row>
|
||||||
|
|
||||||
<el-row>
|
<el-row>
|
||||||
@ -77,10 +78,11 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import { useCool } from "/@/core";
|
import { useCool } from "/@/cool";
|
||||||
import { deepTree } from "/@/core/utils";
|
import { deepTree } from "/@/cool/utils";
|
||||||
import { defineComponent, reactive } from "vue";
|
import { defineComponent, reactive } from "vue";
|
||||||
import { CrudLoad, Table, Upsert, RefreshOp } from "cl-admin-crud-vue3/types";
|
import { CrudLoad, Table, Upsert, RefreshOp } from "@cool-vue/crud/types";
|
||||||
|
import { isDev } from "/@/config/env";
|
||||||
|
|
||||||
export default defineComponent({
|
export default defineComponent({
|
||||||
name: "sys-menu",
|
name: "sys-menu",
|
||||||
@ -90,13 +92,13 @@ export default defineComponent({
|
|||||||
|
|
||||||
// crud 加载
|
// crud 加载
|
||||||
function onLoad({ ctx, app }: CrudLoad) {
|
function onLoad({ ctx, app }: CrudLoad) {
|
||||||
ctx.service(service.base.system.menu).done();
|
ctx.service(service.base.sys.menu).done();
|
||||||
app.refresh();
|
app.refresh();
|
||||||
}
|
}
|
||||||
|
|
||||||
// 刷新监听
|
// 刷新监听
|
||||||
function onRefresh(_: any, { render }: RefreshOp) {
|
function onRefresh(_: any, { render }: RefreshOp) {
|
||||||
service.base.system.menu.list().then((list: any[]) => {
|
service.base.sys.menu.list().then((list: any[]) => {
|
||||||
list.map((e) => {
|
list.map((e) => {
|
||||||
e.permList = e.perms ? e.perms.split(",") : [];
|
e.permList = e.perms ? e.perms.split(",") : [];
|
||||||
});
|
});
|
||||||
@ -135,6 +137,11 @@ export default defineComponent({
|
|||||||
router.push(url);
|
router.push(url);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 刷新
|
||||||
|
function refresh() {
|
||||||
|
refs.value.crud.refresh();
|
||||||
|
}
|
||||||
|
|
||||||
// 表格配置
|
// 表格配置
|
||||||
const table = reactive<Table>({
|
const table = reactive<Table>({
|
||||||
props: {
|
props: {
|
||||||
@ -238,7 +245,9 @@ export default defineComponent({
|
|||||||
|
|
||||||
// 新增、编辑配置
|
// 新增、编辑配置
|
||||||
const upsert = reactive<Upsert>({
|
const upsert = reactive<Upsert>({
|
||||||
width: "800px",
|
dialog: {
|
||||||
|
width: "800px"
|
||||||
|
},
|
||||||
items: [
|
items: [
|
||||||
{
|
{
|
||||||
prop: "type",
|
prop: "type",
|
||||||
@ -273,10 +282,7 @@ export default defineComponent({
|
|||||||
placeholder: "请输入节点名称"
|
placeholder: "请输入节点名称"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
rules: {
|
required: true
|
||||||
required: true,
|
|
||||||
message: "名称不能为空"
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
prop: "parentId",
|
prop: "parentId",
|
||||||
@ -294,7 +300,7 @@ export default defineComponent({
|
|||||||
component: {
|
component: {
|
||||||
name: "el-input",
|
name: "el-input",
|
||||||
props: {
|
props: {
|
||||||
placeholder: "请输入节点路由"
|
placeholder: "请输入节点路由,如:/test"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@ -383,7 +389,9 @@ export default defineComponent({
|
|||||||
onRowClick,
|
onRowClick,
|
||||||
upsertAppend,
|
upsertAppend,
|
||||||
setPermission,
|
setPermission,
|
||||||
toUrl
|
toUrl,
|
||||||
|
refresh,
|
||||||
|
isDev
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
@ -36,8 +36,8 @@
|
|||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import { ElMessageBox } from "element-plus";
|
import { ElMessageBox } from "element-plus";
|
||||||
import { defineComponent, nextTick, reactive } from "vue";
|
import { defineComponent, nextTick, reactive } from "vue";
|
||||||
import { useCool } from "/@/core";
|
import { useCool } from "/@/cool";
|
||||||
import { CrudLoad, Table, Upsert } from "cl-admin-crud-vue3/types";
|
import { CrudLoad, Table, Upsert } from "@cool-vue/crud/types";
|
||||||
|
|
||||||
export default defineComponent({
|
export default defineComponent({
|
||||||
name: "sys-param",
|
name: "sys-param",
|
||||||
@ -158,7 +158,7 @@ export default defineComponent({
|
|||||||
|
|
||||||
// crud 加载
|
// crud 加载
|
||||||
function onLoad({ ctx, app }: CrudLoad) {
|
function onLoad({ ctx, app }: CrudLoad) {
|
||||||
ctx.service(service.base.system.param).done();
|
ctx.service(service.base.sys.param).done();
|
||||||
app.refresh();
|
app.refresh();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -50,8 +50,8 @@
|
|||||||
import { ElMessage } from "element-plus";
|
import { ElMessage } from "element-plus";
|
||||||
import { defineComponent, reactive } from "vue";
|
import { defineComponent, reactive } from "vue";
|
||||||
import { checkPerm } from "/$/base";
|
import { checkPerm } from "/$/base";
|
||||||
import { useCool } from "/@/core";
|
import { useCool } from "/@/cool";
|
||||||
import { CrudLoad, RefreshOp, Table } from "cl-admin-crud-vue3/types";
|
import { CrudLoad, RefreshOp, Table } from "@cool-vue/crud/types";
|
||||||
|
|
||||||
export default defineComponent({
|
export default defineComponent({
|
||||||
name: "plugin",
|
name: "plugin",
|
||||||
|
@ -22,7 +22,7 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import { CrudLoad, Table, Upsert } from "cl-admin-crud-vue3/types";
|
import { CrudLoad, Table, Upsert } from "@cool-vue/crud/types";
|
||||||
import { defineComponent, inject, reactive } from "vue";
|
import { defineComponent, inject, reactive } from "vue";
|
||||||
|
|
||||||
export default defineComponent({
|
export default defineComponent({
|
||||||
@ -153,7 +153,7 @@ export default defineComponent({
|
|||||||
|
|
||||||
// crud 加载
|
// crud 加载
|
||||||
function onLoad({ ctx, app }: CrudLoad) {
|
function onLoad({ ctx, app }: CrudLoad) {
|
||||||
ctx.service(service.base.system.role).done();
|
ctx.service(service.base.sys.role).done();
|
||||||
app.refresh();
|
app.refresh();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -28,7 +28,7 @@
|
|||||||
<cl-add-btn />
|
<cl-add-btn />
|
||||||
<cl-multi-delete-btn />
|
<cl-multi-delete-btn />
|
||||||
<el-button
|
<el-button
|
||||||
v-permission="service.base.system.user.permission.move"
|
v-permission="service.base.sys.user.permission.move"
|
||||||
size="mini"
|
size="mini"
|
||||||
type="success"
|
type="success"
|
||||||
:disabled="selects.ids.length == 0"
|
:disabled="selects.ids.length == 0"
|
||||||
@ -71,7 +71,7 @@
|
|||||||
<!-- 单个转移 -->
|
<!-- 单个转移 -->
|
||||||
<template #slot-move-btn="{ scope }">
|
<template #slot-move-btn="{ scope }">
|
||||||
<el-button
|
<el-button
|
||||||
v-permission="service.base.system.user.permission.move"
|
v-permission="service.base.sys.user.permission.move"
|
||||||
type="text"
|
type="text"
|
||||||
size="mini"
|
size="mini"
|
||||||
@click="toMove(scope.row)"
|
@click="toMove(scope.row)"
|
||||||
@ -103,8 +103,8 @@
|
|||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import { computed, defineComponent, reactive, ref, watch } from "vue";
|
import { computed, defineComponent, reactive, ref, watch } from "vue";
|
||||||
import { useCool } from "/@/core";
|
import { useCool } from "/@/cool";
|
||||||
import { Table, Upsert } from "cl-admin-crud-vue3/types";
|
import { Table, Upsert } from "@cool-vue/crud/types";
|
||||||
|
|
||||||
export default defineComponent({
|
export default defineComponent({
|
||||||
name: "sys-user",
|
name: "sys-user",
|
||||||
@ -379,7 +379,7 @@ export default defineComponent({
|
|||||||
|
|
||||||
// crud 加载
|
// crud 加载
|
||||||
function onLoad({ ctx, app }: any) {
|
function onLoad({ ctx, app }: any) {
|
||||||
ctx.service(service.base.system.user).done();
|
ctx.service(service.base.sys.user).done();
|
||||||
app.refresh();
|
app.refresh();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -54,7 +54,7 @@ import Session from "./session.vue";
|
|||||||
import Message from "./message.vue";
|
import Message from "./message.vue";
|
||||||
import Input from "./input.vue";
|
import Input from "./input.vue";
|
||||||
import { parseContent } from "../utils";
|
import { parseContent } from "../utils";
|
||||||
import { useCool } from "/@/core";
|
import { useCool } from "/@/cool";
|
||||||
import NotifyMp3 from "../static/notify.mp3";
|
import NotifyMp3 from "../static/notify.mp3";
|
||||||
|
|
||||||
export default defineComponent({
|
export default defineComponent({
|
||||||
|
@ -29,7 +29,7 @@
|
|||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import { computed, defineComponent, ref } from "vue";
|
import { computed, defineComponent, ref } from "vue";
|
||||||
import { useCool } from "/@/core";
|
import { useCool } from "/@/cool";
|
||||||
|
|
||||||
// 表情列表
|
// 表情列表
|
||||||
const emoji = {
|
const emoji = {
|
||||||
|
@ -44,7 +44,7 @@
|
|||||||
import { defineComponent, inject, nextTick, reactive, ref } from "vue";
|
import { defineComponent, inject, nextTick, reactive, ref } from "vue";
|
||||||
import Emoji from "./emoji.vue";
|
import Emoji from "./emoji.vue";
|
||||||
import Upload from "./upload.vue";
|
import Upload from "./upload.vue";
|
||||||
import { useCool } from "/@/core";
|
import { useCool } from "/@/cool";
|
||||||
|
|
||||||
export default defineComponent({
|
export default defineComponent({
|
||||||
components: {
|
components: {
|
||||||
|
@ -113,8 +113,8 @@
|
|||||||
import { computed, defineComponent, inject, nextTick, onUnmounted, reactive, ref } from "vue";
|
import { computed, defineComponent, inject, nextTick, onUnmounted, reactive, ref } from "vue";
|
||||||
import dayjs from "dayjs";
|
import dayjs from "dayjs";
|
||||||
import { ElMessage } from "element-plus";
|
import { ElMessage } from "element-plus";
|
||||||
import { isString } from "/@/core/utils";
|
import { isString } from "/@/cool/utils";
|
||||||
import { useCool } from "/@/core";
|
import { useCool } from "/@/cool";
|
||||||
import IconVoice from "./icon-voice.vue";
|
import IconVoice from "./icon-voice.vue";
|
||||||
|
|
||||||
import AvatarUrl from "../static/images/custom-avatar.png";
|
import AvatarUrl from "../static/images/custom-avatar.png";
|
||||||
|
@ -11,7 +11,7 @@
|
|||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import { defineComponent, onBeforeMount, ref } from "vue-demi";
|
import { defineComponent, onBeforeMount, ref } from "vue-demi";
|
||||||
import { useCool } from "/@/core";
|
import { useCool } from "/@/cool";
|
||||||
|
|
||||||
export default defineComponent({
|
export default defineComponent({
|
||||||
name: "cl-chat-notice",
|
name: "cl-chat-notice",
|
||||||
|
@ -55,10 +55,10 @@
|
|||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import { computed, defineComponent, onUnmounted, reactive, ref } from "vue";
|
import { computed, defineComponent, onUnmounted, reactive, ref } from "vue";
|
||||||
import { ElMessage } from "element-plus";
|
import { ElMessage } from "element-plus";
|
||||||
import { isEmpty } from "/@/core/utils";
|
import { isEmpty } from "/@/cool/utils";
|
||||||
import { ContextMenu } from "cl-admin-crud-vue3";
|
import { ContextMenu } from "@cool-vue/crud";
|
||||||
import { parseContent } from "../utils";
|
import { parseContent } from "../utils";
|
||||||
import { useCool } from "/@/core";
|
import { useCool } from "/@/cool";
|
||||||
|
|
||||||
export default defineComponent({
|
export default defineComponent({
|
||||||
setup() {
|
setup() {
|
||||||
|
@ -12,7 +12,7 @@
|
|||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import { defineComponent, inject } from "vue";
|
import { defineComponent, inject } from "vue";
|
||||||
import { useCool } from "/@/core";
|
import { useCool } from "/@/cool";
|
||||||
|
|
||||||
export default defineComponent({
|
export default defineComponent({
|
||||||
props: {
|
props: {
|
||||||
@ -85,7 +85,7 @@ export default defineComponent({
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 上传中
|
// 上传中
|
||||||
function onUploadProgress(e: any, file: ElFile) {
|
function onUploadProgress(e: any, file: any) {
|
||||||
store.commit("UPDATE_MESSAGE", {
|
store.commit("UPDATE_MESSAGE", {
|
||||||
file,
|
file,
|
||||||
data: {
|
data: {
|
||||||
@ -95,7 +95,7 @@ export default defineComponent({
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 上传成功
|
// 上传成功
|
||||||
function onUploadSuccess(res: any, file: ElFile) {
|
function onUploadSuccess(res: any, file: any) {
|
||||||
store.commit("UPDATE_MESSAGE", {
|
store.commit("UPDATE_MESSAGE", {
|
||||||
file,
|
file,
|
||||||
data: {
|
data: {
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
import { BaseService, Service, Permission } from "/@/core";
|
import { BaseService, Service, Permission } from "/@/cool";
|
||||||
|
|
||||||
@Service({
|
@Service({
|
||||||
namespace: "im/message",
|
namespace: "im/message",
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
import { BaseService, Service, Permission } from "/@/core";
|
import { BaseService, Service, Permission } from "/@/cool";
|
||||||
|
|
||||||
@Service({
|
@Service({
|
||||||
namespace: "im/session",
|
namespace: "im/session",
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
import { isArray } from "/@/core/utils";
|
import { isArray } from "/@/cool/utils";
|
||||||
|
|
||||||
const state = {
|
const state = {
|
||||||
list: []
|
list: []
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
import { isBoolean } from "/@/core/utils";
|
import { isBoolean } from "/@/cool/utils";
|
||||||
|
|
||||||
const state = {
|
const state = {
|
||||||
list: [],
|
list: [],
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
import { isObject } from "/@/core/utils";
|
import { isObject } from "/@/cool/utils";
|
||||||
|
|
||||||
export function parseContent({ content, contentType }: any) {
|
export function parseContent({ content, contentType }: any) {
|
||||||
const data = isObject(content) ? content : JSON.parse(content);
|
const data = isObject(content) ? content : JSON.parse(content);
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import { AdvSearchItem } from "cl-admin-crud-vue3/types";
|
import { AdvSearchItem } from "@cool-vue/crud/types";
|
||||||
import { defineComponent, ref } from "vue";
|
import { defineComponent, ref } from "vue";
|
||||||
|
|
||||||
export default defineComponent({
|
export default defineComponent({
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import { ContextMenu } from "cl-admin-crud-vue3";
|
import { ContextMenu } from "@cool-vue/crud";
|
||||||
import { ElMessage } from "element-plus";
|
import { ElMessage } from "element-plus";
|
||||||
import { defineComponent } from "vue";
|
import { defineComponent } from "vue";
|
||||||
|
|
||||||
|
@ -50,7 +50,7 @@
|
|||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import { defineComponent, ref, resolveComponent, h } from "vue";
|
import { defineComponent, ref, resolveComponent, h } from "vue";
|
||||||
import { CrudLoad, FormItem, FormRef } from "cl-admin-crud-vue3/types";
|
import { CrudLoad, FormItem, FormRef } from "@cool-vue/crud/types";
|
||||||
import { TestService } from "../../utils/service";
|
import { TestService } from "../../utils/service";
|
||||||
import Test from "./render/test.vue";
|
import Test from "./render/test.vue";
|
||||||
import Test2 from "./render/test2";
|
import Test2 from "./render/test2";
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import { QueryList } from "cl-admin-crud-vue3/types";
|
import { QueryList } from "@cool-vue/crud/types";
|
||||||
import { defineComponent, ref } from "vue";
|
import { defineComponent, ref } from "vue";
|
||||||
|
|
||||||
export default defineComponent({
|
export default defineComponent({
|
||||||
|
@ -6,8 +6,8 @@
|
|||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import { defineComponent, onMounted, ref } from "vue";
|
import { defineComponent, onMounted, ref } from "vue";
|
||||||
import { TableColumn } from "cl-admin-crud-vue3/types";
|
import { TableColumn } from "@cool-vue/crud/types";
|
||||||
import { useCool } from "/@/core";
|
import { useCool } from "/@/cool";
|
||||||
import Test2 from "./render/test2";
|
import Test2 from "./render/test2";
|
||||||
|
|
||||||
export default defineComponent({
|
export default defineComponent({
|
||||||
@ -29,7 +29,20 @@ export default defineComponent({
|
|||||||
label: "存款",
|
label: "存款",
|
||||||
prop: "price",
|
prop: "price",
|
||||||
sortable: true,
|
sortable: true,
|
||||||
minWidth: 120
|
minWidth: 120,
|
||||||
|
component: {
|
||||||
|
name: "el-progress"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: "文件",
|
||||||
|
prop: "urls",
|
||||||
|
component: {
|
||||||
|
name: "cl-link",
|
||||||
|
props: {
|
||||||
|
size: 50
|
||||||
|
}
|
||||||
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: "状态",
|
label: "状态",
|
||||||
@ -38,12 +51,11 @@ export default defineComponent({
|
|||||||
dict: [
|
dict: [
|
||||||
{
|
{
|
||||||
label: "启用",
|
label: "启用",
|
||||||
value: 1,
|
value: 1
|
||||||
type: "primary"
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: "禁用",
|
label: "禁用",
|
||||||
value: 0,
|
value: 2,
|
||||||
type: "danger"
|
type: "danger"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import { UpsertItem, UpsertRef } from "cl-admin-crud-vue3/types";
|
import { UpsertItem, UpsertRef } from "@cool-vue/crud/types";
|
||||||
import { defineComponent, ref } from "vue";
|
import { defineComponent, ref } from "vue";
|
||||||
|
|
||||||
export default defineComponent({
|
export default defineComponent({
|
||||||
@ -21,122 +21,32 @@ export default defineComponent({
|
|||||||
|
|
||||||
const items = ref<UpsertItem[]>([
|
const items = ref<UpsertItem[]>([
|
||||||
{
|
{
|
||||||
label: "测试hook",
|
label: "多图",
|
||||||
prop: "hook",
|
prop: "imgs",
|
||||||
hook: {
|
|
||||||
bind: ["split", "number"],
|
|
||||||
submit: "join"
|
|
||||||
},
|
|
||||||
component: {
|
component: {
|
||||||
name: "el-select",
|
name: "cl-upload",
|
||||||
props: {
|
props: {
|
||||||
|
listType: "picture-card",
|
||||||
multiple: true
|
multiple: true
|
||||||
},
|
|
||||||
options: [
|
|
||||||
{
|
|
||||||
label: "景天",
|
|
||||||
value: 1
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: "李逍遥",
|
|
||||||
value: 2
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: "宇文拓",
|
|
||||||
value: 3
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
type: "tabs",
|
|
||||||
props: {
|
|
||||||
labels: [
|
|
||||||
{
|
|
||||||
label: "基本信息",
|
|
||||||
value: "base"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: "金融",
|
|
||||||
value: "financial"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: "工作",
|
|
||||||
value: "work"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: {
|
|
||||||
text: "姓名",
|
|
||||||
icon: "el-icon-question",
|
|
||||||
tip: "姓名是汉语词语,拼音是 xìng míng ,意思是由姓和名组成"
|
|
||||||
},
|
|
||||||
prop: "name",
|
|
||||||
group: "base",
|
|
||||||
collapse: false,
|
|
||||||
component: {
|
|
||||||
name: "el-input"
|
|
||||||
},
|
|
||||||
rules: {
|
|
||||||
required: true,
|
|
||||||
message: "姓名不能为空"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: "存款",
|
|
||||||
prop: "price",
|
|
||||||
value: 0,
|
|
||||||
group: "financial",
|
|
||||||
component: {
|
|
||||||
name: "el-input-number"
|
|
||||||
},
|
|
||||||
append: ({ h }: any) => {
|
|
||||||
return h("p", "元");
|
|
||||||
},
|
|
||||||
rules: {
|
|
||||||
required: true,
|
|
||||||
message: "存款不能为空"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: "公司",
|
|
||||||
prop: "company",
|
|
||||||
value: "cool",
|
|
||||||
group: "work",
|
|
||||||
component: {
|
|
||||||
name: "el-input"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: "状态",
|
|
||||||
prop: "status",
|
|
||||||
value: 1,
|
|
||||||
component: {
|
|
||||||
name: "el-radio-group",
|
|
||||||
options: [
|
|
||||||
{
|
|
||||||
label: "启用",
|
|
||||||
value: 1
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: "禁用",
|
|
||||||
value: 0
|
|
||||||
}
|
|
||||||
],
|
|
||||||
props: {
|
|
||||||
onChange(v: any) {
|
|
||||||
upsertRef.value?.toggleItem("remark", v == 1);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: "备注",
|
label: "文件",
|
||||||
prop: "remark",
|
prop: "file",
|
||||||
component: {
|
component: {
|
||||||
name: "el-input"
|
name: "cl-upload",
|
||||||
|
props: {
|
||||||
|
listType: "text",
|
||||||
|
limit: 1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: "开关",
|
||||||
|
prop: "switch",
|
||||||
|
component: {
|
||||||
|
name: "el-switch"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
]);
|
]);
|
||||||
|
@ -9,6 +9,7 @@ export const UserList = [
|
|||||||
createTime: "2019年09月02日",
|
createTime: "2019年09月02日",
|
||||||
price: 75.99,
|
price: 75.99,
|
||||||
status: 1,
|
status: 1,
|
||||||
|
urls: "https://images.quanjing.com/ojo003/thu/pe0082640.jpg,https://images.quanjing.com/rad005/thu/rad600-02347621.jpg",
|
||||||
hook: "1,2"
|
hook: "1,2"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -16,28 +17,32 @@ export const UserList = [
|
|||||||
name: "陈二",
|
name: "陈二",
|
||||||
createTime: "2019年09月05日",
|
createTime: "2019年09月05日",
|
||||||
price: 242.1,
|
price: 242.1,
|
||||||
status: 1
|
urls: [
|
||||||
|
"https://images.quanjing.com/rad005/thu/rad600-02347621.jpg",
|
||||||
|
"https://images.quanjing.com/ojo003/thu/pe0082640.jpg"
|
||||||
|
],
|
||||||
|
status: 2
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
id: 3,
|
id: 3,
|
||||||
name: "张三",
|
name: "张三",
|
||||||
createTime: "2019年09月12日",
|
createTime: "2019年09月12日",
|
||||||
price: 74.11,
|
price: 74.11,
|
||||||
status: 0
|
status: 3
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
id: 4,
|
id: 4,
|
||||||
name: "李四",
|
name: "李四",
|
||||||
createTime: "2019年09月13日",
|
createTime: "2019年09月13日",
|
||||||
price: 276.64,
|
price: 276.64,
|
||||||
status: 0
|
status: 4
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
id: 5,
|
id: 5,
|
||||||
name: "王五",
|
name: "王五",
|
||||||
createTime: "2019年09月18日",
|
createTime: "2019年09月18日",
|
||||||
price: 160.23,
|
price: 160.23,
|
||||||
status: 1
|
status: 5
|
||||||
}
|
}
|
||||||
];
|
];
|
||||||
|
|
||||||
|
@ -36,7 +36,6 @@
|
|||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import { defineComponent } from "vue";
|
import { defineComponent } from "vue";
|
||||||
import { CrudLoad } from "cl-admin-crud-vue3/types";
|
|
||||||
import { TestService } from "../utils/service";
|
import { TestService } from "../utils/service";
|
||||||
import Dialog from "../components/crud/dialog.vue";
|
import Dialog from "../components/crud/dialog.vue";
|
||||||
import ContextMenu from "../components/crud/context-menu.vue";
|
import ContextMenu from "../components/crud/context-menu.vue";
|
||||||
@ -45,6 +44,7 @@ import AdvSearch from "../components/crud/adv-search.vue";
|
|||||||
import Table from "../components/crud/table.vue";
|
import Table from "../components/crud/table.vue";
|
||||||
import Upsert from "../components/crud/upsert.vue";
|
import Upsert from "../components/crud/upsert.vue";
|
||||||
import Form from "../components/crud/form.vue";
|
import Form from "../components/crud/form.vue";
|
||||||
|
import { CrudLoad } from "@cool-vue/crud/types";
|
||||||
|
|
||||||
export default defineComponent({
|
export default defineComponent({
|
||||||
name: "crud",
|
name: "crud",
|
||||||
|
20
src/cool/modules/index.ts
Normal file
20
src/cool/modules/index.ts
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
import Crud from "@cool-vue/crud";
|
||||||
|
import "@cool-vue/crud/dist/index.css";
|
||||||
|
|
||||||
|
export const modules = [
|
||||||
|
// crud 模块
|
||||||
|
{
|
||||||
|
name: "crud",
|
||||||
|
value: Crud,
|
||||||
|
options: {
|
||||||
|
crud: {
|
||||||
|
dict: {
|
||||||
|
sort: {
|
||||||
|
prop: "order",
|
||||||
|
order: "sort"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
];
|
@ -1,41 +0,0 @@
|
|||||||
import { BaseService, Service, Permission } from "/@/core";
|
|
||||||
|
|
||||||
@Service("task/info")
|
|
||||||
class SysTask extends BaseService {
|
|
||||||
@Permission("stop")
|
|
||||||
stop(data: any) {
|
|
||||||
return this.request({
|
|
||||||
url: "/stop",
|
|
||||||
method: "POST",
|
|
||||||
data
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
@Permission("start")
|
|
||||||
start(data: any) {
|
|
||||||
return this.request({
|
|
||||||
url: "/start",
|
|
||||||
method: "POST",
|
|
||||||
data
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
@Permission("once")
|
|
||||||
once(data: any) {
|
|
||||||
return this.request({
|
|
||||||
url: "/once",
|
|
||||||
method: "POST",
|
|
||||||
data
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
@Permission("log")
|
|
||||||
log(params: any) {
|
|
||||||
return this.request({
|
|
||||||
url: "/log",
|
|
||||||
params
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
export default SysTask;
|
|
@ -218,9 +218,9 @@ import { computed, defineComponent, onMounted, reactive } from "vue";
|
|||||||
import { ElMessage, ElMessageBox } from "element-plus";
|
import { ElMessage, ElMessageBox } from "element-plus";
|
||||||
import Draggable from "vuedraggable/src/vuedraggable";
|
import Draggable from "vuedraggable/src/vuedraggable";
|
||||||
import { checkPerm } from "/$/base";
|
import { checkPerm } from "/$/base";
|
||||||
import { ContextMenu } from "cl-admin-crud-vue3";
|
import { ContextMenu } from "@cool-vue/crud";
|
||||||
import Cron from "../components/cron";
|
import Cron from "../components/cron";
|
||||||
import { useCool } from "/@/core";
|
import { useCool } from "/@/cool";
|
||||||
|
|
||||||
export default defineComponent({
|
export default defineComponent({
|
||||||
name: "task",
|
name: "task",
|
||||||
|
@ -107,7 +107,7 @@
|
|||||||
<script>
|
<script>
|
||||||
import { mapGetters } from "vuex";
|
import { mapGetters } from "vuex";
|
||||||
import { isDev } from "/@/config/env";
|
import { isDev } from "/@/config/env";
|
||||||
import { isArray, cloneDeep } from "/@/core/utils";
|
import { isArray, cloneDeep } from "/@/cool/utils";
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: "cl-theme",
|
name: "cl-theme",
|
||||||
|
@ -108,7 +108,7 @@
|
|||||||
|
|
||||||
<script>
|
<script>
|
||||||
import { mapGetters } from "vuex";
|
import { mapGetters } from "vuex";
|
||||||
import { clone, last, isArray, isNumber, isBoolean, basename } from "/@/core/utils";
|
import { clone, last, isArray, isNumber, isBoolean, basename } from "/@/cool/utils";
|
||||||
import { v4 as uuidv4 } from "uuid";
|
import { v4 as uuidv4 } from "uuid";
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
@ -274,22 +274,23 @@ export default {
|
|||||||
},
|
},
|
||||||
|
|
||||||
_urls() {
|
_urls() {
|
||||||
const format = {
|
return this.urls.filter((e) => Boolean(e.url));
|
||||||
image: ["bmp", "jpg", "jpeg", "png", "tif", "gif", "svg", "webp"]
|
|
||||||
};
|
|
||||||
|
|
||||||
return this.urls
|
|
||||||
.filter((e) => Boolean(e.url))
|
|
||||||
.map((e) => {
|
|
||||||
const arr = e.url.split(".");
|
|
||||||
const suf = last(arr).toLowerCase();
|
|
||||||
e.type = format.image.includes(suf) ? "image" : null;
|
|
||||||
return e;
|
|
||||||
});
|
|
||||||
},
|
},
|
||||||
|
|
||||||
_file() {
|
_file() {
|
||||||
return this._urls[0];
|
const d = this._urls[0];
|
||||||
|
|
||||||
|
if (d) {
|
||||||
|
const suf = last(d.url.split(".")).toLowerCase();
|
||||||
|
|
||||||
|
if (["bmp", "jpg", "jpeg", "png", "tif", "gif", "svg", "webp"].includes(suf)) {
|
||||||
|
d.type = "image";
|
||||||
|
}
|
||||||
|
|
||||||
|
return d;
|
||||||
|
} else {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
_style() {
|
_style() {
|
||||||
@ -402,15 +403,25 @@ export default {
|
|||||||
|
|
||||||
// 预览图片
|
// 预览图片
|
||||||
_onPreview(file) {
|
_onPreview(file) {
|
||||||
this.preview.visible = true;
|
let url = "";
|
||||||
this.preview.url = file.url;
|
|
||||||
|
|
||||||
if (!file.url) {
|
if (file.raw) {
|
||||||
const item = this.urls.find((e) => e.uid == file.uid);
|
if (file.raw.type.indexOf("image/") == 0) {
|
||||||
|
const item = this.urls.find((e) => e.uid == file.uid);
|
||||||
|
|
||||||
if (item) {
|
if (item) {
|
||||||
this.preview.url = item.url;
|
url = item.url;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
if (file.type == "image") {
|
||||||
|
url = file.url;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (url) {
|
||||||
|
this.preview.visible = true;
|
||||||
|
this.preview.url = url;
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
@ -35,9 +35,9 @@
|
|||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import { ElMessage, ElMessageBox } from "element-plus";
|
import { ElMessage, ElMessageBox } from "element-plus";
|
||||||
import { computed, defineComponent, inject, ref, watch } from "vue";
|
import { computed, defineComponent, inject, ref, watch } from "vue";
|
||||||
import { isEmpty } from "/@/core/utils";
|
import { isEmpty } from "/@/cool/utils";
|
||||||
import { ContextMenu } from "cl-admin-crud-vue3";
|
import { ContextMenu } from "@cool-vue/crud";
|
||||||
import { useCool } from "/@/core";
|
import { useCool } from "/@/cool";
|
||||||
|
|
||||||
export default defineComponent({
|
export default defineComponent({
|
||||||
name: "cl-upload-space-category",
|
name: "cl-upload-space-category",
|
||||||
|
@ -47,7 +47,7 @@
|
|||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import { computed, defineComponent, inject } from "vue";
|
import { computed, defineComponent, inject } from "vue";
|
||||||
import { ContextMenu } from "cl-admin-crud-vue3";
|
import { ContextMenu } from "@cool-vue/crud";
|
||||||
import { ElMessage } from "element-plus";
|
import { ElMessage } from "element-plus";
|
||||||
import Clipboard from "clipboard";
|
import Clipboard from "clipboard";
|
||||||
|
|
||||||
|
@ -140,10 +140,10 @@
|
|||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import { computed, defineComponent, provide, reactive, ref, watch } from "vue";
|
import { computed, defineComponent, provide, reactive, ref, watch } from "vue";
|
||||||
import { ElMessage, ElMessageBox } from "element-plus";
|
import { ElMessage, ElMessageBox } from "element-plus";
|
||||||
import { isEmpty } from "/@/core/utils";
|
import { isEmpty } from "/@/cool/utils";
|
||||||
import Category from "./category.vue";
|
import Category from "./category.vue";
|
||||||
import FileItem from "./file-item.vue";
|
import FileItem from "./file-item.vue";
|
||||||
import { useCool } from "/@/core";
|
import { useCool } from "/@/cool";
|
||||||
|
|
||||||
export default defineComponent({
|
export default defineComponent({
|
||||||
name: "cl-upload-space",
|
name: "cl-upload-space",
|
||||||
@ -283,7 +283,7 @@ export default defineComponent({
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 上传失败
|
// 上传失败
|
||||||
function onError(err: string, file: ElFile) {
|
function onError(err: string, file: any) {
|
||||||
const item = list.value.find((e) => file.uid == e.uid);
|
const item = list.value.find((e) => file.uid == e.uid);
|
||||||
|
|
||||||
if (item) {
|
if (item) {
|
||||||
@ -305,7 +305,7 @@ export default defineComponent({
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 上传进度
|
// 上传进度
|
||||||
function onProgress({ percent }: any, file: ElFile) {
|
function onProgress({ percent }: any, file: any) {
|
||||||
const item = list.value.find(({ uid }: any) => uid == file.uid);
|
const item = list.value.find(({ uid }: any) => uid == file.uid);
|
||||||
|
|
||||||
if (item) {
|
if (item) {
|
||||||
|
@ -1,6 +0,0 @@
|
|||||||
import { BaseService, Service } from "/@/core";
|
|
||||||
|
|
||||||
@Service("space/info")
|
|
||||||
class SpaceInfo extends BaseService {}
|
|
||||||
|
|
||||||
export default SpaceInfo;
|
|
@ -1,6 +0,0 @@
|
|||||||
import { BaseService, Service } from "/@/core";
|
|
||||||
|
|
||||||
@Service("space/type")
|
|
||||||
class SpaceType extends BaseService {}
|
|
||||||
|
|
||||||
export default SpaceType;
|
|
1
src/cool/utils.ts
Normal file
1
src/cool/utils.ts
Normal file
@ -0,0 +1 @@
|
|||||||
|
export * from "./core/utils";
|
@ -1 +0,0 @@
|
|||||||
export * from "./core";
|
|
@ -1,54 +0,0 @@
|
|||||||
import BaseService from "./base";
|
|
||||||
import { Service, Permission } from "./decorator";
|
|
||||||
import { basename } from "../utils";
|
|
||||||
|
|
||||||
function deepFiles(list: any[]) {
|
|
||||||
const modules: any = {};
|
|
||||||
|
|
||||||
list.forEach((e) => {
|
|
||||||
const arr: any[] = e.path.split("/");
|
|
||||||
const parents: any[] = arr.slice(0, arr.length - 1);
|
|
||||||
const name: string = basename(e.path).replace(".ts", "");
|
|
||||||
|
|
||||||
let curr: any = modules;
|
|
||||||
let prev: any = null;
|
|
||||||
let key: any = null;
|
|
||||||
|
|
||||||
parents.forEach((k) => {
|
|
||||||
if (!curr[k]) {
|
|
||||||
curr[k] = {};
|
|
||||||
}
|
|
||||||
|
|
||||||
prev = curr;
|
|
||||||
curr = curr[k];
|
|
||||||
key = k;
|
|
||||||
});
|
|
||||||
|
|
||||||
if (name == "index") {
|
|
||||||
prev[key] = e.value;
|
|
||||||
} else {
|
|
||||||
curr[name] = e.value;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
return modules;
|
|
||||||
}
|
|
||||||
|
|
||||||
function useService() {
|
|
||||||
const files = import.meta.globEager("/src/service/**/*.ts");
|
|
||||||
const d: any = [];
|
|
||||||
|
|
||||||
for (const i in files) {
|
|
||||||
if (!i.includes("request.ts")) {
|
|
||||||
const value = files[i].default;
|
|
||||||
d.push({
|
|
||||||
path: i.replace("/src/service/", ""),
|
|
||||||
value: new value()
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return deepFiles(d);
|
|
||||||
}
|
|
||||||
|
|
||||||
export { BaseService, Service, Permission, deepFiles, useService };
|
|
12
src/core/types/index.d.ts
vendored
12
src/core/types/index.d.ts
vendored
@ -1,12 +0,0 @@
|
|||||||
import { Store } from "vuex";
|
|
||||||
import { Router } from "vue-router";
|
|
||||||
|
|
||||||
export declare class CoolStore<S> extends Store<S> {
|
|
||||||
service?: any;
|
|
||||||
}
|
|
||||||
|
|
||||||
export declare interface CoolRouter extends Router {
|
|
||||||
$plugin?: {
|
|
||||||
addViews(list: any[], options?: any): void;
|
|
||||||
};
|
|
||||||
}
|
|
@ -2,7 +2,7 @@ import { createApp } from "vue";
|
|||||||
import App from "./App.vue";
|
import App from "./App.vue";
|
||||||
|
|
||||||
// cool
|
// cool
|
||||||
import { bootstrap } from "./core";
|
import { bootstrap } from "./cool";
|
||||||
|
|
||||||
// router
|
// router
|
||||||
import router from "./router";
|
import router from "./router";
|
||||||
@ -10,6 +10,7 @@ import router from "./router";
|
|||||||
// store
|
// store
|
||||||
import store from "./store";
|
import store from "./store";
|
||||||
|
|
||||||
|
// mock
|
||||||
import "./mock";
|
import "./mock";
|
||||||
|
|
||||||
// element-plus
|
// element-plus
|
||||||
@ -26,10 +27,10 @@ const app = createApp(App);
|
|||||||
|
|
||||||
bootstrap(app)
|
bootstrap(app)
|
||||||
.then(() => {
|
.then(() => {
|
||||||
// // echarts 可视图表
|
// echarts 可视图表
|
||||||
app.component("v-chart", VueECharts);
|
app.component("v-chart", VueECharts);
|
||||||
|
|
||||||
// // 事件通讯
|
// 事件通讯
|
||||||
app.provide("mitt", mitt());
|
app.provide("mitt", mitt());
|
||||||
|
|
||||||
app.use(store).use(router).use(ElementPlus).mount("#app");
|
app.use(store).use(router).use(ElementPlus).mount("#app");
|
||||||
|
@ -32,7 +32,7 @@
|
|||||||
import { computed, defineComponent } from "vue";
|
import { computed, defineComponent } from "vue";
|
||||||
import Topbar from "./topbar.vue";
|
import Topbar from "./topbar.vue";
|
||||||
import Slider from "./slider.vue";
|
import Slider from "./slider.vue";
|
||||||
import { useCool } from "/@/core";
|
import { useCool } from "/@/cool";
|
||||||
|
|
||||||
export default defineComponent({
|
export default defineComponent({
|
||||||
components: {
|
components: {
|
||||||
|
@ -14,7 +14,7 @@
|
|||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import { computed, defineComponent } from "vue";
|
import { computed, defineComponent } from "vue";
|
||||||
import Logo from "/@/assets/icon/logo/silder-simple.png";
|
import Logo from "/@/assets/icon/logo/silder-simple.png";
|
||||||
import { useCool } from "/@/core";
|
import { useCool } from "/@/cool";
|
||||||
|
|
||||||
export default defineComponent({
|
export default defineComponent({
|
||||||
setup() {
|
setup() {
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user