diff --git a/scripts/release.mjs b/scripts/release.mjs new file mode 100644 index 0000000..84461b6 --- /dev/null +++ b/scripts/release.mjs @@ -0,0 +1,35 @@ +import path from 'path' +import fsExtra from 'fs-extra' +const { existsSync, remove, copy } = fsExtra +const cwd = process.cwd() +//打包发布路径,谨慎改动 +const releaseRelativePath = '../server/public/admin' +const distPath = path.resolve(cwd, 'dist') +const releasePath = path.resolve(cwd, releaseRelativePath) + +async function build() { + if (existsSync(releasePath)) { + await remove(releasePath) + } + console.log(`文件正在复制 ==> ${releaseRelativePath}`) + try { + await copyFile(distPath, releasePath) + } catch (error) { + console.log(`\n ${error}`) + } + console.log(`文件已复制 ==> ${releaseRelativePath}`) +} + +function copyFile(sourceDir, targetDir) { + return new Promise((resolve, reject) => { + copy(sourceDir, targetDir, (err) => { + if (err) { + reject(err) + } else { + resolve() + } + }) + }) +} + +build() diff --git a/src/App.vue b/src/App.vue new file mode 100644 index 0000000..b9f6fca --- /dev/null +++ b/src/App.vue @@ -0,0 +1,46 @@ + + + + + diff --git a/src/api/app.ts b/src/api/app.ts new file mode 100644 index 0000000..fec3423 --- /dev/null +++ b/src/api/app.ts @@ -0,0 +1,16 @@ +import request from '@/utils/request' + +// 配置 +export function getConfig() { + return request.get({ url: '/config/getConfig' }) +} + +// 工作台主页 +export function getWorkbench() { + return request.get({ url: '/workbench/index' }) +} + +//字典数据 +export function getDictData(params: any) { + return request.get({ url: '/config/dict', params }) +} diff --git a/src/api/app/recharge.ts b/src/api/app/recharge.ts new file mode 100644 index 0000000..2b3bdf5 --- /dev/null +++ b/src/api/app/recharge.ts @@ -0,0 +1,10 @@ +import request from '@/utils/request' + +export function getRechargeConfig() { + return request.get({ url: '/recharge.recharge/getConfig' }) +} + +// 设置 +export function setRechargeConfig(params: any) { + return request.post({ url: '/recharge.recharge/setConfig', params }) +} diff --git a/src/api/article.ts b/src/api/article.ts new file mode 100644 index 0000000..7c3a559 --- /dev/null +++ b/src/api/article.ts @@ -0,0 +1,69 @@ +import request from '@/utils/request' + +// 文章分类列表 +export function articleCateLists(params?: any) { + return request.get({ url: '/article.articleCate/lists', params }) +} +// 文章分类列表 +export function articleCateAll(params?: any) { + return request.get({ url: '/article.articleCate/all', params }) +} + +// 添加文章分类 +export function articleCateAdd(params: any) { + return request.post({ url: '/article.articleCate/add', params }) +} + +// 编辑文章分类 +export function articleCateEdit(params: any) { + return request.post({ url: '/article.articleCate/edit', params }) +} + +// 删除文章分类 +export function articleCateDelete(params: any) { + return request.post({ url: '/article.articleCate/delete', params }) +} + +// 文章分类详情 +export function articleCateDetail(params: any) { + return request.get({ url: '/article.articleCate/detail', params }) +} + +// 文章分类状态 +export function articleCateStatus(params: any) { + return request.post({ url: '/article.articleCate/updateStatus', params }) +} + +// 文章列表 +export function articleLists(params?: any) { + return request.get({ url: '/article.article/lists', params }) +} +// 文章列表 +export function articleAll(params?: any) { + return request.get({ url: '/article/all', params }) +} + +// 添加文章 +export function articleAdd(params: any) { + return request.post({ url: '/article.article/add', params }) +} + +// 编辑文章 +export function articleEdit(params: any) { + return request.post({ url: '/article.article/edit', params }) +} + +// 删除文章 +export function articleDelete(params: any) { + return request.post({ url: '/article.article/delete', params }) +} + +// 文章详情 +export function articleDetail(params: any) { + return request.get({ url: '/article.article/detail', params }) +} + +// 文章分类状态 +export function articleStatus(params: any) { + return request.post({ url: '/article.article/updateStatus', params }) +} diff --git a/src/api/channel/h5.ts b/src/api/channel/h5.ts new file mode 100644 index 0000000..d997e54 --- /dev/null +++ b/src/api/channel/h5.ts @@ -0,0 +1,11 @@ +import request from '@/utils/request' + +// H5渠道配置保存 +export function setH5Config(params: any) { + return request.post({ url: '/channel.web_page_setting/setConfig', params }) +} + +// H5渠道配置详情 +export function getH5Config() { + return request.get({ url: '/channel.web_page_setting/getConfig' }) +} diff --git a/src/api/channel/open_setting.ts b/src/api/channel/open_setting.ts new file mode 100644 index 0000000..51a6ece --- /dev/null +++ b/src/api/channel/open_setting.ts @@ -0,0 +1,11 @@ +import request from '@/utils/request' + +// 微信开发平台配置保存 +export function setOpenSettingConfig(params: any) { + return request.post({ url: '/channel.open_setting/setConfig', params }) +} + +// 微信开发平台配置详情 +export function getOpenSettingConfig() { + return request.get({ url: '/channel.open_setting/getConfig' }) +} diff --git a/src/api/channel/weapp.ts b/src/api/channel/weapp.ts new file mode 100644 index 0000000..a3a8976 --- /dev/null +++ b/src/api/channel/weapp.ts @@ -0,0 +1,11 @@ +import request from '@/utils/request' + +// 微信小程序配置保存 +export function setWeappConfig(params: any) { + return request.post({ url: '/channel.mnp_settings/setConfig', params }) +} + +// 微信小程序配置详情 +export function getWeappConfig() { + return request.get({ url: '/channel.mnp_settings/getConfig' }) +} diff --git a/src/api/channel/wx_oa.ts b/src/api/channel/wx_oa.ts new file mode 100644 index 0000000..f496b52 --- /dev/null +++ b/src/api/channel/wx_oa.ts @@ -0,0 +1,110 @@ +import request from '@/utils/request' + +// 微信公众号配置保存 +export function setOaConfig(params: any) { + return request.post({ url: '/channel.official_account_setting/setConfig', params }) +} + +// 微信公众号配置详情 +export function getOaConfig() { + return request.get({ url: '/channel.official_account_setting/getConfig' }) +} + +export interface Menu { + name: string + has_menu?: boolean + type?: string + url?: string + appid?: string + pagepath?: string + sub_button: Menu[] | any +} + +/** + * @return { Promise } + * @description 获取菜单 + */ +export function getOaMenu() { + return request.get({ url: '/channel.official_account_menu/detail' }) +} + +/** + * @return { Promise } + * @param { Menu } Menu + * @description 菜单保存 + */ +export function setOaMenuSave(params: Menu | any) { + return request.post({ url: '/channel.official_account_menu/save', params }) +} + +/** + * @return { Promise } + * @param { Menu } Menu + * @description 菜单发布 + */ +export function setOaMenuPublish(params: Menu | any) { + return request.post({ url: '/channel.official_account_menu/saveAndPublish', params }) +} + +/** + * @return { Promise } + * @param { string } reply_type + * @description 获取回复列表 + */ +export function getOaReplyList(params: { reply_type: string }) { + return request.get({ url: '/channel.official_account_reply/lists', params }) +} + +/** + * @return { Promise } + * @param { number } id + * @description 回复列表删除 + */ +export function oaReplyDel(params: { id: number }) { + return request.post({ url: '/channel.official_account_reply/delete', params }) +} + +/** + * @return { Promise } + * @param { number } id + * @description 回复状态修改 + */ +export function changeOaReplyStatus(params: { id: number }) { + return request.post({ url: '/channel.official_account_reply/status', params }) +} + +export interface Reply { + content: string // 内容 + content_type: number // 内容类型: 1=文本 + keyword?: string // 关键词 + matching_type?: number // 匹配方式: [1=全匹配, 2=模糊匹配] + name: string // 规则名称 + status: number // 状态: 1=开启, 0=关闭 + reply_type: number // 类型: 回复类型 1-关注回复 2-关键词回复 3-默认回复 + reply_num: number // 回复数量` + sort: number // 排序 +} +/** + * @return { Promise } + * @description 回复添加 + */ +export function oaReplyAdd(params: Reply) { + return request.post({ url: '/channel.official_account_reply/add', params }) +} + +/** + * @return { Promise } + * @description 回复编辑 + */ +export function oaReplyEdit(params: Reply) { + return request.post({ url: '/channel.official_account_reply/edit', params }) +} + +/** + * @return { Promise } + * @param { string } type + * @description 获取回复详情 + */ +export function getOaReplyDetail(params: { id: number }) { + return request.get({ url: '/channel.official_account_reply/detail', params }) +} diff --git a/src/api/consumer.ts b/src/api/consumer.ts new file mode 100644 index 0000000..ef92143 --- /dev/null +++ b/src/api/consumer.ts @@ -0,0 +1,21 @@ +import request from '@/utils/request' + +// 用户列表 +export function getUserList(params: any) { + return request.get({ url: '/user.user/lists', params }, { ignoreCancelToken: true }) +} + +// 用户详情 +export function getUserDetail(params: any) { + return request.get({ url: '/user.user/detail', params }) +} + +// 用户编辑 +export function userEdit(params: any) { + return request.post({ url: '/user.user/edit', params }) +} + +// 用户编辑 +export function adjustMoney(params: any) { + return request.post({ url: '/user.user/adjustMoney', params }) +} diff --git a/src/api/decoration.ts b/src/api/decoration.ts new file mode 100644 index 0000000..0e754db --- /dev/null +++ b/src/api/decoration.ts @@ -0,0 +1,31 @@ +import request from '@/utils/request' + +// 页面装修详情 +export function getDecoratePages(params: any) { + return request.get({ url: '/decorate.page/detail', params }, { ignoreCancelToken: true }) +} + +// 页面装修保存 +export function setDecoratePages(params: any) { + return request.post({ url: '/decorate.page/save', params }) +} + +// 获取首页文章数据 +export function getDecorateArticle(params?: any) { + return request.get({ url: '/decorate.data/article', params }) +} + +// 底部导航详情 +export function getDecorateTabbar(params?: any) { + return request.get({ url: '/decorate.tabbar/detail', params }) +} + +// 底部导航保存 +export function setDecorateTabbar(params: any) { + return request.post({ url: '/decorate.tabbar/save', params }) +} + +// pc装修数据 +export function getDecoratePc() { + return request.get({ url: '/decorate.data/pc' }) +} \ No newline at end of file diff --git a/src/api/file.ts b/src/api/file.ts new file mode 100644 index 0000000..2181001 --- /dev/null +++ b/src/api/file.ts @@ -0,0 +1,39 @@ +import request from '@/utils/request' + +export function fileCateAdd(params: Record) { + return request.post({url: '/file/addCate', params}) +} + +export function fileCateEdit(params: Record) { + return request.post({url: '/file/editCate', params}) +} + +// 文件分类删除 +export function fileCateDelete(params: Record) { + return request.post({url: '/file/delCate', params}) +} + +// 文件分类列表 +export function fileCateLists(params: Record) { + return request.get({url: '/file/listCate', params}) +} + +// 文件列表 +export function fileList(params: Record) { + return request.get({url: '/file/lists', params}, {ignoreCancelToken: true, isOpenRetry: false}) +} + +// 文件删除 +export function fileDelete(params: Record) { + return request.post({url: '/file/delete', params}) +} + +// 文件移动 +export function fileMove(params: Record) { + return request.post({url: '/file/move', params}) +} + +// 文件重命名 +export function fileRename(params: { id: number; name: string }) { + return request.post({url: '/file/rename', params}) +} diff --git a/src/api/finance.ts b/src/api/finance.ts new file mode 100644 index 0000000..7e0ed53 --- /dev/null +++ b/src/api/finance.ts @@ -0,0 +1,41 @@ +import request from '@/utils/request' + +// 余额明细 +export function accountLog(params?: any) { + return request.get({ url: '/finance.account_log/lists', params }) +} + +// 充值记录 +export function rechargeLists(params?: any) { + return request.get({ url: '/recharge.recharge/lists', params }, { ignoreCancelToken: true }) +} + +// 余额变动类型 +export function getUmChangeType(params?: any) { + return request.get({ url: '/finance.account_log/getUmChangeType', params }) +} + +//退款 +export function refund(params?: any) { + return request.post({ url: '/recharge.recharge/refund', params }) +} + +//重新退款 +export function refundAgain(params?: any) { + return request.post({ url: '/recharge.recharge/refundAgain', params }) +} + +//退款记录 +export function refundRecord(params?: any) { + return request.get({ url: '/finance.refund/record', params }) +} + +//退款日志 +export function refundLog(params?: any) { + return request.get({ url: '/finance.refund/log', params }) +} + +//退款统计 +export function refundStat(params?: any) { + return request.get({ url: '/finance.refund/stat', params }) +} diff --git a/src/api/message.ts b/src/api/message.ts new file mode 100644 index 0000000..9c0ba84 --- /dev/null +++ b/src/api/message.ts @@ -0,0 +1,31 @@ +import request from '@/utils/request' + +// 通知设置列表 +export function noticeLists(params: any) { + return request.get({ url: '/notice.notice/settingLists', params }) +} + +// 通知设置详情 +export function noticeDetail(params: any) { + return request.get({ url: '/notice.notice/detail', params }) +} + +// 通知设置保存 +export function setNoticeConfig(params: any) { + return request.post({ url: '/notice.notice/set', params }) +} + +// 短信设置列表 +export function smsLists() { + return request.get({ url: '/notice.sms_config/getConfig' }) +} + +// 短信设置详情 +export function smsDetail(params: any) { + return request.get({ url: '/notice.sms_config/detail', params }) +} + +// 短信设置保存 +export function setSmsConfig(params: any) { + return request.post({ url: '/notice.sms_config/setConfig', params }) +} diff --git a/src/api/org/department.ts b/src/api/org/department.ts new file mode 100644 index 0000000..3673ed5 --- /dev/null +++ b/src/api/org/department.ts @@ -0,0 +1,31 @@ +import request from '@/utils/request' + +// 部门列表 +export function deptLists(params?: any) { + return request.get({ url: '/dept.dept/lists', params }) +} + +// 添加部门 +export function deptAdd(params: any) { + return request.post({ url: '/dept.dept/add', params }) +} + +// 编辑部门 +export function deptEdit(params: any) { + return request.post({ url: '/dept.dept/edit', params }) +} + +// 删除部门 +export function deptDelete(params: any) { + return request.post({ url: '/dept.dept/delete', params }) +} + +// 部门详情 +export function deptDetail(params: any) { + return request.get({ url: '/dept.dept/detail', params }) +} + +// 部门列表全部 +export function deptAll() { + return request.get({ url: '/dept.dept/all' }) +} diff --git a/src/api/org/post.ts b/src/api/org/post.ts new file mode 100644 index 0000000..4b0f262 --- /dev/null +++ b/src/api/org/post.ts @@ -0,0 +1,31 @@ +import request from '@/utils/request' + +// 岗位列表 +export function jobsLists(params: any) { + return request.get({ url: '/dept.jobs/lists', params }, { ignoreCancelToken: true }) +} + +// 岗位列表全部 +export function jobsAll(params: any) { + return request.get({ url: '/dept.jobs/all', params }) +} + +// 添加岗位 +export function jobsAdd(params: any) { + return request.post({ url: '/dept.jobs/add', params }) +} + +// 编辑岗位 +export function jobsEdit(params: any) { + return request.post({ url: '/dept.jobs/edit', params }) +} + +// 删除岗位 +export function jobsDelete(params: any) { + return request.post({ url: '/dept.jobs/delete', params }) +} + +// 岗位详情 +export function jobsDetail(params: any) { + return request.get({ url: '/dept.jobs/detail', params }) +} diff --git a/src/api/perms/admin.ts b/src/api/perms/admin.ts new file mode 100644 index 0000000..dd40ff9 --- /dev/null +++ b/src/api/perms/admin.ts @@ -0,0 +1,29 @@ +import request from '@/utils/request' + +// 管理员列表 +export function adminLists(params: any) { + return request.get({ url: '/auth.admin/lists', params }, { ignoreCancelToken: true }) +} +// 管理员列表全部 +export function adminAll(params: any) { + return request.get({ url: '/auth.admin/all', params }) +} +// 管理员添加 +export function adminAdd(params: any) { + return request.post({ url: '/auth.admin/add', params }) +} + +// 管理员编辑 +export function adminEdit(params: any) { + return request.post({ url: '/auth.admin/edit', params }) +} + +// 管理员删除 +export function adminDelete(params: any) { + return request.post({ url: '/auth.admin/delete', params }) +} + +// 管理员详情 +export function adminDetail(params: any) { + return request.get({ url: '/auth.admin/detail', params }) +} diff --git a/src/api/perms/menu.ts b/src/api/perms/menu.ts new file mode 100644 index 0000000..ea13670 --- /dev/null +++ b/src/api/perms/menu.ts @@ -0,0 +1,30 @@ +import request from '@/utils/request' + +// 菜单列表 +export function menuLists(params: Record) { + return request.get({ url: '/auth.menu/lists', params }) +} +// 菜单全部 +export function menuAll(params?: Record) { + return request.get({ url: '/auth.menu/all', params }) +} + +// 添加菜单 +export function menuAdd(params: Record) { + return request.post({ url: '/auth.menu/add', params }) +} + +// 编辑菜单 +export function menuEdit(params: Record) { + return request.post({ url: '/auth.menu/edit', params }) +} + +// 菜单删除 +export function menuDelete(params: Record) { + return request.post({ url: '/auth.menu/delete', params }) +} + +// 菜单详情 +export function menuDetail(params: Record) { + return request.get({ url: '/auth.menu/detail', params }) +} diff --git a/src/api/perms/role.ts b/src/api/perms/role.ts new file mode 100644 index 0000000..7c81d40 --- /dev/null +++ b/src/api/perms/role.ts @@ -0,0 +1,27 @@ +import request from '@/utils/request' + +// 角色列表 +export function roleLists(params: any) { + return request.get({ url: '/auth.role/lists', params }) +} +// 角色列表全部 +export function roleAll(params: any) { + return request.get({ url: '/auth.role/all', params }) +} +// 添加角色 +export function roleAdd(params: any) { + return request.post({ url: '/auth.role/add', params }) +} +// 编辑角色 +export function roleEdit(params: any) { + return request.post({ url: '/auth.role/edit', params }) +} +// 删除角色 +export function roleDelete(params: any) { + return request.post({ url: '/auth.role/delete', params }) +} + +// 角色详情 +export function roleDetail(params: any) { + return request.get({ url: '/auth.role/detail', params }) +} diff --git a/src/api/record.ts b/src/api/record.ts new file mode 100644 index 0000000..2b24e7d --- /dev/null +++ b/src/api/record.ts @@ -0,0 +1,26 @@ +import request from '@/utils/request' + +// 跟踪记录表列表 +export function apiRecordLists(params: any) { + return request.get({ url: '/record.record/lists', params }) +} + +// 添加跟踪记录表 +export function apiRecordAdd(params: any) { + return request.post({ url: '/record.record/add', params }) +} + +// 编辑跟踪记录表 +export function apiRecordEdit(params: any) { + return request.post({ url: '/record.record/edit', params }) +} + +// 删除跟踪记录表 +export function apiRecordDelete(params: any) { + return request.post({ url: '/record.record/delete', params }) +} + +// 跟踪记录表详情 +export function apiRecordDetail(params: any) { + return request.get({ url: '/record.record/detail', params }) +} \ No newline at end of file diff --git a/src/api/record_cate.ts b/src/api/record_cate.ts new file mode 100644 index 0000000..b2a397f --- /dev/null +++ b/src/api/record_cate.ts @@ -0,0 +1,26 @@ +import request from '@/utils/request' + +// 记录类型表列表 +export function apiRecordCateLists(params: any) { + return request.get({ url: '/record.record_cate/lists', params }) +} + +// 添加记录类型表 +export function apiRecordCateAdd(params: any) { + return request.post({ url: '/record.record_cate/add', params }) +} + +// 编辑记录类型表 +export function apiRecordCateEdit(params: any) { + return request.post({ url: '/record.record_cate/edit', params }) +} + +// 删除记录类型表 +export function apiRecordCateDelete(params: any) { + return request.post({ url: '/record.record_cate/delete', params }) +} + +// 记录类型表详情 +export function apiRecordCateDetail(params: any) { + return request.get({ url: '/record.record_cate/detail', params }) +} \ No newline at end of file diff --git a/src/api/setting/dict.ts b/src/api/setting/dict.ts new file mode 100644 index 0000000..cef4e83 --- /dev/null +++ b/src/api/setting/dict.ts @@ -0,0 +1,61 @@ +import request from '@/utils/request' + +// 字典类型列表 +export function dictTypeLists(params: any) { + return request.get({ url: '/setting.dict.dict_type/lists', params }) +} + +// 字典类型列表全部 +export function dictTypeAll(params: any) { + return request.get({ url: '/setting.dict.dict_type/all', params }) +} + +// 添加字典类型 +export function dictTypeAdd(params: any) { + return request.post({ url: '/setting.dict.dict_type/add', params }) +} + +// 编辑字典类型 +export function dictTypeEdit(params: any) { + return request.post({ url: '/setting.dict.dict_type/edit', params }) +} + +// 删除字典类型 +export function dictTypeDelete(params: any) { + return request.post({ url: '/setting.dict.dict_type/delete', params }) +} + +// 字典类型详情 +export function dictTypeDetail(params: any) { + return request.get({ url: '/setting.dict.dict_type/detail', params }) +} + +// 字典数据列表 +export function dictDataLists(params: any) { + return request.get( + { url: '/setting.dict.dict_data/lists', params }, + { + ignoreCancelToken: true + } + ) +} + +// 添加字典数据 +export function dictDataAdd(params: any) { + return request.post({ url: '/setting.dict.dict_data/add', params }) +} + +// 编辑字典数据 +export function dictDataEdit(params: any) { + return request.post({ url: '/setting.dict.dict_data/edit', params }) +} + +// 删除字典数据 +export function dictDataDelete(params: any) { + return request.post({ url: '/setting.dict.dict_data/delete', params }) +} + +// 字典数据详情 +export function dictDataDetail(params: any) { + return request.get({ url: '/setting.dict.dict_data/detail', params }) +} diff --git a/src/api/setting/pay.ts b/src/api/setting/pay.ts new file mode 100644 index 0000000..6bbad41 --- /dev/null +++ b/src/api/setting/pay.ts @@ -0,0 +1,26 @@ +import request from '@/utils/request' + +// 获取支付方式 +export function getPayWay() { + return request.get({ url: '/setting.pay.pay_way/getPayWay' }) +} + +// 设置支付方式 +export function setPayWay(params: any) { + return request.post({ url: '/setting.pay.pay_way/setPayWay', params }) +} + +// 获取支付方式 +export function getPayConfigLists() { + return request.get({ url: '/setting.pay.pay_config/lists' }) +} + +// 设置支付方式 +export function setPayConfig(params: any) { + return request.post({ url: '/setting.pay.pay_config/setConfig', params }) +} + +// 设置支付方式 +export function getPayConfig(params: any) { + return request.get({ url: '/setting.pay.pay_config/getConfig', params }) +} diff --git a/src/api/setting/search.ts b/src/api/setting/search.ts new file mode 100644 index 0000000..4d7e289 --- /dev/null +++ b/src/api/setting/search.ts @@ -0,0 +1,27 @@ +import request from '@/utils/request' + +/** + * @return { Promise } + * @description 获取热门搜索数据 + */ +export function getSearch() { + return request.get({ url: '/setting.hot_search/getConfig' }) +} + +export interface List { + name: string // 搜索关键字 + sort: number // 热门搜索排序 +} + +export interface Search { + status: number // 是否开启搜索0/1 + data: List[] +} +/** + * @return { Promise } + * @param { Search } Search + * @description 设置热门搜索 + */ +export function setSearch(params: Search) { + return request.post({ url: '/setting.hot_search/setConfig', params }) +} diff --git a/src/api/setting/storage.ts b/src/api/setting/storage.ts new file mode 100644 index 0000000..6fcbff7 --- /dev/null +++ b/src/api/setting/storage.ts @@ -0,0 +1,21 @@ +import request from '@/utils/request' + +// 获取存储引擎列表 +export function storageLists() { + return request.get({ url: '/setting.storage/lists' }) +} + +// 设置存储引擎信息 +export function storageChange(params: any) { + return request.post({ url: '/setting.storage/change', params }) +} + +// 设置存储引擎信息 +export function storageSetup(params: any) { + return request.post({ url: '/setting.storage/setup', params }) +} + +// 获取存储配置信息 +export function storageDetail(params: any) { + return request.get({ url: '/setting.storage/detail', params }) +} diff --git a/src/api/setting/system.ts b/src/api/setting/system.ts new file mode 100644 index 0000000..4e73a53 --- /dev/null +++ b/src/api/setting/system.ts @@ -0,0 +1,51 @@ +import request from '@/utils/request' + +// 获取系统环境 +export function systemInfo() { + return request.get({ url: '/setting.system.system/info' }) +} + +// 获取系统日志列表 +export function systemLogLists(params: any) { + return request.get({ url: '/setting.system.log/lists', params }, { ignoreCancelToken: true }) +} + +// 清除系统缓存 +export function systemCacheClear() { + return request.post({ url: '/setting.system.cache/clear' }) +} + +// 定时任务列表 +export function crontabLists(params: any) { + return request.get({ url: '/crontab.crontab/lists', params }) +} + +// 添加定时任务 +export function crontabAdd(params: any) { + return request.post({ url: '/crontab.crontab/add', params }) +} + +// 定时任务详情 +export function crontabDetail(params: any) { + return request.get({ url: '/crontab.crontab/detail', params }) +} + +// 编辑定时任务 +export function crontabEdit(params: any) { + return request.post({ url: '/crontab.crontab/edit', params }) +} + +// 删除定时任务 +export function crontabDel(params: any) { + return request.post({ url: '/crontab.crontab/delete', params }) +} + +// 获取规则执行时间 +export function crontabExpression(params: any) { + return request.get({ url: '/crontab.crontab/expression', params }) +} + +// 操作定时任务 +export function srontabOperate(params: any) { + return request.post({ url: '/crontab.crontab/operate', params }) +} diff --git a/src/api/setting/user.ts b/src/api/setting/user.ts new file mode 100644 index 0000000..2e8b341 --- /dev/null +++ b/src/api/setting/user.ts @@ -0,0 +1,43 @@ +import request from '@/utils/request' + +/** + * @return { Promise } + * @description 获取用户设置 + */ +export function getUserSetup() { + return request.get({ url: '/setting.user.user/getConfig' }) +} + +/** + * @return { Promise } + * @param { string } default_avatar 默认用户头像 + * @description 设置用户设置 + */ +export function setUserSetup(params: { default_avatar: string }) { + return request.post({ url: '/setting.user.user/setConfig', params }) +} + +/** + * @return { Promise } + * @description 设置登录注册规则 + */ +export function getLogin() { + return request.get({ url: '/setting.user.user/getRegisterConfig' }) +} + +export interface LoginSetup { + login_way: number[] | any // 登录方式, 逗号隔开 + coerce_mobile: number // 强制绑定手机 0/1 + login_agreement: number // 是否开启协议 0/1 + third_auth: number // 第三方登录 0/1 + wechat_auth: number // 微信授权登录 0-关闭 1-开启 + qq_auth: number // qq授权登录 0-关闭 1-开启 +} +/** + * @return { Promise } + * @param { LoginSetup } LoginSetup + * @description 设置登录注册规则 + */ +export function setLogin(params: LoginSetup) { + return request.post({ url: '/setting.user.user/setRegisterConfig', params }) +} diff --git a/src/api/setting/website.ts b/src/api/setting/website.ts new file mode 100644 index 0000000..0b96571 --- /dev/null +++ b/src/api/setting/website.ts @@ -0,0 +1,27 @@ +import request from '@/utils/request' + +// 获取备案信息 +export function getCopyright() { + return request.get({ url: '/setting.web.web_setting/getCopyright' }) +} +// 设置备案信息 +export function setCopyright(params: any) { + return request.post({ url: '/setting.web.web_setting/setCopyright', params }) +} +// 获取网站信息 +export function getWebsite() { + return request.get({ url: '/setting.web.web_setting/getWebsite' }) +} +// 设置网站信息 +export function setWebsite(params: any) { + return request.post({ url: '/setting.web.web_setting/setWebsite', params }) +} + +// 获取政策协议 +export function getProtocol() { + return request.get({ url: '/setting.web.web_setting/getAgreement' }) +} +// 设置政策协议 +export function setProtocol(params: any) { + return request.post({ url: '/setting.web.web_setting/setAgreement', params }) +} diff --git a/src/api/tools/code.ts b/src/api/tools/code.ts new file mode 100644 index 0000000..69056de --- /dev/null +++ b/src/api/tools/code.ts @@ -0,0 +1,51 @@ +import request from '@/utils/request' + +// 代码生成已选数据表列表接口 +export function generateTable(params: any) { + return request.get({ url: '/tools.generator/generateTable', params }) +} + +// 数据表列表接口 +export function dataTable(params: any) { + return request.get({ url: '/tools.generator/dataTable', params }) +} + +//选择要生成代码的数据表 +export function selectTable(params: any) { + return request.post({ url: '/tools.generator/selectTable', params }) +} + +// 已选择的数据表详情 +export function tableDetail(params: any) { + return request.get({ url: '/tools.generator/detail', params }) +} + +//同步字段 +export function syncColumn(params: any) { + return request.post({ url: '/tools.generator/syncColumn', params }) +} + +//删除已选择的数据表 +export function generateDelete(params: any) { + return request.post({ url: '/tools.generator/delete', params }) +} + +//编辑已选表字段 +export function generateEdit(params: any) { + return request.post({ url: '/tools.generator/edit', params }) +} + +//预览代码 +export function generatePreview(params: any) { + return request.post({ url: '/tools.generator/preview', params }) +} + +//生成代码 +export function generateCode(params: any) { + return request.post({ url: '/tools.generator/generate', params }) +} + +//获取模型 +export function getModels() { + return request.get({ url: '/tools.generator/getModels' }) +} diff --git a/src/api/user.ts b/src/api/user.ts new file mode 100644 index 0000000..39d2010 --- /dev/null +++ b/src/api/user.ts @@ -0,0 +1,22 @@ +import config from '@/config' +import request from '@/utils/request' + +// 登录 +export function login(params: Record) { + return request.post({ url: '/login/account', params: { ...params, terminal: config.terminal } }) +} + +// 退出登录 +export function logout() { + return request.post({ url: '/login/logout' }) +} + +// 用户信息 +export function getUserInfo() { + return request.get({ url: '/auth.admin/mySelf' }) +} + +// 编辑管理员信息 +export function setUserInfo(params: any) { + return request.post({ url: '/auth.admin/editSelf', params }) +} diff --git a/src/assets/icons/Androidfanhui.svg b/src/assets/icons/Androidfanhui.svg new file mode 100644 index 0000000..e9ada24 --- /dev/null +++ b/src/assets/icons/Androidfanhui.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/KMSguanli.svg b/src/assets/icons/KMSguanli.svg new file mode 100644 index 0000000..7c65298 --- /dev/null +++ b/src/assets/icons/KMSguanli.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/KTVyuding.svg b/src/assets/icons/KTVyuding.svg new file mode 100644 index 0000000..8187b5f --- /dev/null +++ b/src/assets/icons/KTVyuding.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/a-tixingdengpao.svg b/src/assets/icons/a-tixingdengpao.svg new file mode 100644 index 0000000..7074ae7 --- /dev/null +++ b/src/assets/icons/a-tixingdengpao.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/anquan.svg b/src/assets/icons/anquan.svg new file mode 100644 index 0000000..bf90259 --- /dev/null +++ b/src/assets/icons/anquan.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/anquan_mian.svg b/src/assets/icons/anquan_mian.svg new file mode 100644 index 0000000..f3486b5 --- /dev/null +++ b/src/assets/icons/anquan_mian.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/anquan_mian1.svg b/src/assets/icons/anquan_mian1.svg new file mode 100644 index 0000000..f3486b5 --- /dev/null +++ b/src/assets/icons/anquan_mian1.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/banxing_mian.svg b/src/assets/icons/banxing_mian.svg new file mode 100644 index 0000000..3cb468f --- /dev/null +++ b/src/assets/icons/banxing_mian.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/baoxian.svg b/src/assets/icons/baoxian.svg new file mode 100644 index 0000000..9885e88 --- /dev/null +++ b/src/assets/icons/baoxian.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/bendishenghuodaxue.svg b/src/assets/icons/bendishenghuodaxue.svg new file mode 100644 index 0000000..4754e16 --- /dev/null +++ b/src/assets/icons/bendishenghuodaxue.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/bianji.svg b/src/assets/icons/bianji.svg new file mode 100644 index 0000000..c8674e7 --- /dev/null +++ b/src/assets/icons/bianji.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/biaoqing.svg b/src/assets/icons/biaoqing.svg new file mode 100644 index 0000000..fcc84fb --- /dev/null +++ b/src/assets/icons/biaoqing.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/bukejian.svg b/src/assets/icons/bukejian.svg new file mode 100644 index 0000000..c79cd78 --- /dev/null +++ b/src/assets/icons/bukejian.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/caipinguanli.svg b/src/assets/icons/caipinguanli.svg new file mode 100644 index 0000000..3b1fc28 --- /dev/null +++ b/src/assets/icons/caipinguanli.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/caiwu.svg b/src/assets/icons/caiwu.svg new file mode 100644 index 0000000..e3e92f4 --- /dev/null +++ b/src/assets/icons/caiwu.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/caiwu_jifen.svg b/src/assets/icons/caiwu_jifen.svg new file mode 100644 index 0000000..07d01df --- /dev/null +++ b/src/assets/icons/caiwu_jifen.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/caiwu_tixian.svg b/src/assets/icons/caiwu_tixian.svg new file mode 100644 index 0000000..982ac58 --- /dev/null +++ b/src/assets/icons/caiwu_tixian.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/canyinfuwu.svg b/src/assets/icons/canyinfuwu.svg new file mode 100644 index 0000000..5d87395 --- /dev/null +++ b/src/assets/icons/canyinfuwu.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/carryout.svg b/src/assets/icons/carryout.svg new file mode 100644 index 0000000..4a06640 --- /dev/null +++ b/src/assets/icons/carryout.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/chexiao.svg b/src/assets/icons/chexiao.svg new file mode 100644 index 0000000..b9e6e5d --- /dev/null +++ b/src/assets/icons/chexiao.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/chihuohongbao.svg b/src/assets/icons/chihuohongbao.svg new file mode 100644 index 0000000..bb1fb66 --- /dev/null +++ b/src/assets/icons/chihuohongbao.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/chuangyiwuliao.svg b/src/assets/icons/chuangyiwuliao.svg new file mode 100644 index 0000000..045057d --- /dev/null +++ b/src/assets/icons/chuangyiwuliao.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/daiyunying.svg b/src/assets/icons/daiyunying.svg new file mode 100644 index 0000000..dc1c7c5 --- /dev/null +++ b/src/assets/icons/daiyunying.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/danwei.svg b/src/assets/icons/danwei.svg new file mode 100644 index 0000000..ba527e8 --- /dev/null +++ b/src/assets/icons/danwei.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/danxuankuang.svg b/src/assets/icons/danxuankuang.svg new file mode 100644 index 0000000..2ef171c --- /dev/null +++ b/src/assets/icons/danxuankuang.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/danxuanxuanzhong.svg b/src/assets/icons/danxuanxuanzhong.svg new file mode 100644 index 0000000..c7f230c --- /dev/null +++ b/src/assets/icons/danxuanxuanzhong.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/dayin.svg b/src/assets/icons/dayin.svg new file mode 100644 index 0000000..0d2291d --- /dev/null +++ b/src/assets/icons/dayin.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/dayin_mian.svg b/src/assets/icons/dayin_mian.svg new file mode 100644 index 0000000..7989ff6 --- /dev/null +++ b/src/assets/icons/dayin_mian.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/del.svg b/src/assets/icons/del.svg new file mode 100644 index 0000000..f938140 --- /dev/null +++ b/src/assets/icons/del.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/diancanshezhi.svg b/src/assets/icons/diancanshezhi.svg new file mode 100644 index 0000000..8723cbf --- /dev/null +++ b/src/assets/icons/diancanshezhi.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/dianhua.svg b/src/assets/icons/dianhua.svg new file mode 100644 index 0000000..be006a9 --- /dev/null +++ b/src/assets/icons/dianhua.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/dianhua_mian.svg b/src/assets/icons/dianhua_mian.svg new file mode 100644 index 0000000..5554077 --- /dev/null +++ b/src/assets/icons/dianhua_mian.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/dianpu_fengge.svg b/src/assets/icons/dianpu_fengge.svg new file mode 100644 index 0000000..a7dc3e1 --- /dev/null +++ b/src/assets/icons/dianpu_fengge.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/dianputuijian.svg b/src/assets/icons/dianputuijian.svg new file mode 100644 index 0000000..0e8a4c8 --- /dev/null +++ b/src/assets/icons/dianputuijian.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/dianzifapiao.svg b/src/assets/icons/dianzifapiao.svg new file mode 100644 index 0000000..b2db463 --- /dev/null +++ b/src/assets/icons/dianzifapiao.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/dingcan.svg b/src/assets/icons/dingcan.svg new file mode 100644 index 0000000..46d4e95 --- /dev/null +++ b/src/assets/icons/dingcan.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/dingdan.svg b/src/assets/icons/dingdan.svg new file mode 100644 index 0000000..e5b35a9 --- /dev/null +++ b/src/assets/icons/dingdan.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/dingdan1.svg b/src/assets/icons/dingdan1.svg new file mode 100644 index 0000000..5330a6a --- /dev/null +++ b/src/assets/icons/dingdan1.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/dingdan_mian.svg b/src/assets/icons/dingdan_mian.svg new file mode 100644 index 0000000..0929276 --- /dev/null +++ b/src/assets/icons/dingdan_mian.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/dingwei.svg b/src/assets/icons/dingwei.svg new file mode 100644 index 0000000..ef573a7 --- /dev/null +++ b/src/assets/icons/dingwei.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/dingwei_mian.svg b/src/assets/icons/dingwei_mian.svg new file mode 100644 index 0000000..8c86674 --- /dev/null +++ b/src/assets/icons/dingwei_mian.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/ditu.svg b/src/assets/icons/ditu.svg new file mode 100644 index 0000000..6b5e5f2 --- /dev/null +++ b/src/assets/icons/ditu.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/ditu_mian.svg b/src/assets/icons/ditu_mian.svg new file mode 100644 index 0000000..bb542bf --- /dev/null +++ b/src/assets/icons/ditu_mian.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/duizhang.svg b/src/assets/icons/duizhang.svg new file mode 100644 index 0000000..f63d6df --- /dev/null +++ b/src/assets/icons/duizhang.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/elemo.svg b/src/assets/icons/elemo.svg new file mode 100644 index 0000000..c1d5388 --- /dev/null +++ b/src/assets/icons/elemo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/ezhanggui.svg b/src/assets/icons/ezhanggui.svg new file mode 100644 index 0000000..cd50b0b --- /dev/null +++ b/src/assets/icons/ezhanggui.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/falvfuwubaoxiaohei.svg b/src/assets/icons/falvfuwubaoxiaohei.svg new file mode 100644 index 0000000..27ea856 --- /dev/null +++ b/src/assets/icons/falvfuwubaoxiaohei.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/fengniaopaotui.svg b/src/assets/icons/fengniaopaotui.svg new file mode 100644 index 0000000..3f5f7b1 --- /dev/null +++ b/src/assets/icons/fengniaopaotui.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/fenxiang.svg b/src/assets/icons/fenxiang.svg new file mode 100644 index 0000000..e4eb7cc --- /dev/null +++ b/src/assets/icons/fenxiang.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/fukuan.svg b/src/assets/icons/fukuan.svg new file mode 100644 index 0000000..939c745 --- /dev/null +++ b/src/assets/icons/fukuan.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/fukuan_mian.svg b/src/assets/icons/fukuan_mian.svg new file mode 100644 index 0000000..ba094cc --- /dev/null +++ b/src/assets/icons/fukuan_mian.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/fullscreen-exit.svg b/src/assets/icons/fullscreen-exit.svg new file mode 100644 index 0000000..e845a79 --- /dev/null +++ b/src/assets/icons/fullscreen-exit.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/fullscreen.svg b/src/assets/icons/fullscreen.svg new file mode 100644 index 0000000..516e890 --- /dev/null +++ b/src/assets/icons/fullscreen.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/fuwushichang.svg b/src/assets/icons/fuwushichang.svg new file mode 100644 index 0000000..2564370 --- /dev/null +++ b/src/assets/icons/fuwushichang.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/fuzhi.svg b/src/assets/icons/fuzhi.svg new file mode 100644 index 0000000..659c6e0 --- /dev/null +++ b/src/assets/icons/fuzhi.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/gaode.svg b/src/assets/icons/gaode.svg new file mode 100644 index 0000000..8d26343 --- /dev/null +++ b/src/assets/icons/gaode.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/gengduo.svg b/src/assets/icons/gengduo.svg new file mode 100644 index 0000000..2956729 --- /dev/null +++ b/src/assets/icons/gengduo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/gengduoandroid.svg b/src/assets/icons/gengduoandroid.svg new file mode 100644 index 0000000..ecde71b --- /dev/null +++ b/src/assets/icons/gengduoandroid.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/gift.svg b/src/assets/icons/gift.svg new file mode 100644 index 0000000..add9ce8 --- /dev/null +++ b/src/assets/icons/gift.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/gongyingshang.svg b/src/assets/icons/gongyingshang.svg new file mode 100644 index 0000000..9426995 --- /dev/null +++ b/src/assets/icons/gongyingshang.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/goods.svg b/src/assets/icons/goods.svg new file mode 100644 index 0000000..b80fbed --- /dev/null +++ b/src/assets/icons/goods.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/gou.svg b/src/assets/icons/gou.svg new file mode 100644 index 0000000..6354197 --- /dev/null +++ b/src/assets/icons/gou.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/gouwuche.svg b/src/assets/icons/gouwuche.svg new file mode 100644 index 0000000..6e76f7d --- /dev/null +++ b/src/assets/icons/gouwuche.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/gouxuan.svg b/src/assets/icons/gouxuan.svg new file mode 100644 index 0000000..8fe88a6 --- /dev/null +++ b/src/assets/icons/gouxuan.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/gouxuan_mian.svg b/src/assets/icons/gouxuan_mian.svg new file mode 100644 index 0000000..375972b --- /dev/null +++ b/src/assets/icons/gouxuan_mian.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/guanbi.svg b/src/assets/icons/guanbi.svg new file mode 100644 index 0000000..831bd0e --- /dev/null +++ b/src/assets/icons/guanbi.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/guanli.svg b/src/assets/icons/guanli.svg new file mode 100644 index 0000000..4848092 --- /dev/null +++ b/src/assets/icons/guanli.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/guanli_mian.svg b/src/assets/icons/guanli_mian.svg new file mode 100644 index 0000000..db46ff1 --- /dev/null +++ b/src/assets/icons/guanli_mian.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/gukefapiao.svg b/src/assets/icons/gukefapiao.svg new file mode 100644 index 0000000..341b686 --- /dev/null +++ b/src/assets/icons/gukefapiao.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/haibaosheji.svg b/src/assets/icons/haibaosheji.svg new file mode 100644 index 0000000..f875157 --- /dev/null +++ b/src/assets/icons/haibaosheji.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/heshoujilu.svg b/src/assets/icons/heshoujilu.svg new file mode 100644 index 0000000..cd25273 --- /dev/null +++ b/src/assets/icons/heshoujilu.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/heshoujilu1.svg b/src/assets/icons/heshoujilu1.svg new file mode 100644 index 0000000..f8d1bd4 --- /dev/null +++ b/src/assets/icons/heshoujilu1.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/hexiao_order.svg b/src/assets/icons/hexiao_order.svg new file mode 100644 index 0000000..f1c4034 --- /dev/null +++ b/src/assets/icons/hexiao_order.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/hide-2.svg b/src/assets/icons/hide-2.svg new file mode 100644 index 0000000..8c74146 --- /dev/null +++ b/src/assets/icons/hide-2.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/hide.svg b/src/assets/icons/hide.svg new file mode 100644 index 0000000..5cbbabd --- /dev/null +++ b/src/assets/icons/hide.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/hongbao.svg b/src/assets/icons/hongbao.svg new file mode 100644 index 0000000..9d331b5 --- /dev/null +++ b/src/assets/icons/hongbao.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/huiche.svg b/src/assets/icons/huiche.svg new file mode 100644 index 0000000..5022718 --- /dev/null +++ b/src/assets/icons/huiche.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/huiyuanyingxiao.svg b/src/assets/icons/huiyuanyingxiao.svg new file mode 100644 index 0000000..ae06769 --- /dev/null +++ b/src/assets/icons/huiyuanyingxiao.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/huodongbaoming.svg b/src/assets/icons/huodongbaoming.svg new file mode 100644 index 0000000..0c60672 --- /dev/null +++ b/src/assets/icons/huodongbaoming.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/huodongguanli.svg b/src/assets/icons/huodongguanli.svg new file mode 100644 index 0000000..def7109 --- /dev/null +++ b/src/assets/icons/huodongguanli.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/huodongzhongxin.svg b/src/assets/icons/huodongzhongxin.svg new file mode 100644 index 0000000..f22bb26 --- /dev/null +++ b/src/assets/icons/huodongzhongxin.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/huojian.svg b/src/assets/icons/huojian.svg new file mode 100644 index 0000000..f439dd8 --- /dev/null +++ b/src/assets/icons/huojian.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/huojian_mian.svg b/src/assets/icons/huojian_mian.svg new file mode 100644 index 0000000..812d3be --- /dev/null +++ b/src/assets/icons/huojian_mian.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/huolala.svg b/src/assets/icons/huolala.svg new file mode 100644 index 0000000..a42ade7 --- /dev/null +++ b/src/assets/icons/huolala.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/iOSfanhui.svg b/src/assets/icons/iOSfanhui.svg new file mode 100644 index 0000000..8aeefbb --- /dev/null +++ b/src/assets/icons/iOSfanhui.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/jia.svg b/src/assets/icons/jia.svg new file mode 100644 index 0000000..18fbd45 --- /dev/null +++ b/src/assets/icons/jia.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/jia_mian.svg b/src/assets/icons/jia_mian.svg new file mode 100644 index 0000000..5899c91 --- /dev/null +++ b/src/assets/icons/jia_mian.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/jian.svg b/src/assets/icons/jian.svg new file mode 100644 index 0000000..295037f --- /dev/null +++ b/src/assets/icons/jian.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/jian_mian.svg b/src/assets/icons/jian_mian.svg new file mode 100644 index 0000000..e9dfa91 --- /dev/null +++ b/src/assets/icons/jian_mian.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/jianpan.svg b/src/assets/icons/jianpan.svg new file mode 100644 index 0000000..5a7dcb9 --- /dev/null +++ b/src/assets/icons/jianpan.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/jianpanshanchu.svg b/src/assets/icons/jianpanshanchu.svg new file mode 100644 index 0000000..a5a5de1 --- /dev/null +++ b/src/assets/icons/jianpanshanchu.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/jianshao.svg b/src/assets/icons/jianshao.svg new file mode 100644 index 0000000..0a4d919 --- /dev/null +++ b/src/assets/icons/jianshao.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/jiaopeiwangputong.svg b/src/assets/icons/jiaopeiwangputong.svg new file mode 100644 index 0000000..ec73071 --- /dev/null +++ b/src/assets/icons/jiaopeiwangputong.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/jiaoyi.svg b/src/assets/icons/jiaoyi.svg new file mode 100644 index 0000000..1396bac --- /dev/null +++ b/src/assets/icons/jiaoyi.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/jiedan.svg b/src/assets/icons/jiedan.svg new file mode 100644 index 0000000..fcbe7a1 --- /dev/null +++ b/src/assets/icons/jiedan.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/jiekuan.svg b/src/assets/icons/jiekuan.svg new file mode 100644 index 0000000..4b7377f --- /dev/null +++ b/src/assets/icons/jiekuan.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/jingshi.svg b/src/assets/icons/jingshi.svg new file mode 100644 index 0000000..3cecfc7 --- /dev/null +++ b/src/assets/icons/jingshi.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/jingshi_mian.svg b/src/assets/icons/jingshi_mian.svg new file mode 100644 index 0000000..fe636ee --- /dev/null +++ b/src/assets/icons/jingshi_mian.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/jingshi_mian1.svg b/src/assets/icons/jingshi_mian1.svg new file mode 100644 index 0000000..fe636ee --- /dev/null +++ b/src/assets/icons/jingshi_mian1.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/jingyin.svg b/src/assets/icons/jingyin.svg new file mode 100644 index 0000000..753f254 --- /dev/null +++ b/src/assets/icons/jingyin.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/jingyin_mian.svg b/src/assets/icons/jingyin_mian.svg new file mode 100644 index 0000000..ce56e68 --- /dev/null +++ b/src/assets/icons/jingyin_mian.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/jingying.svg b/src/assets/icons/jingying.svg new file mode 100644 index 0000000..5630813 --- /dev/null +++ b/src/assets/icons/jingying.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/jingying_mian.svg b/src/assets/icons/jingying_mian.svg new file mode 100644 index 0000000..4e7ca35 --- /dev/null +++ b/src/assets/icons/jingying_mian.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/jingyinggonglve.svg b/src/assets/icons/jingyinggonglve.svg new file mode 100644 index 0000000..0cd3755 --- /dev/null +++ b/src/assets/icons/jingyinggonglve.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/jingzhunyingxiao.svg b/src/assets/icons/jingzhunyingxiao.svg new file mode 100644 index 0000000..781b0bb --- /dev/null +++ b/src/assets/icons/jingzhunyingxiao.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/jinhuo.svg b/src/assets/icons/jinhuo.svg new file mode 100644 index 0000000..c5d9214 --- /dev/null +++ b/src/assets/icons/jinhuo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/kaitongwaimai.svg b/src/assets/icons/kaitongwaimai.svg new file mode 100644 index 0000000..a6daad9 --- /dev/null +++ b/src/assets/icons/kaitongwaimai.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/kanjia.svg b/src/assets/icons/kanjia.svg new file mode 100644 index 0000000..9f6840b --- /dev/null +++ b/src/assets/icons/kanjia.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/kefu.svg b/src/assets/icons/kefu.svg new file mode 100644 index 0000000..f32cacd --- /dev/null +++ b/src/assets/icons/kefu.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/kejian.svg b/src/assets/icons/kejian.svg new file mode 100644 index 0000000..8b89874 --- /dev/null +++ b/src/assets/icons/kejian.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/kejian_mian.svg b/src/assets/icons/kejian_mian.svg new file mode 100644 index 0000000..62223b4 --- /dev/null +++ b/src/assets/icons/kejian_mian.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/keziyuyue.svg b/src/assets/icons/keziyuyue.svg new file mode 100644 index 0000000..0d2f1f9 --- /dev/null +++ b/src/assets/icons/keziyuyue.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/kezizhongxin.svg b/src/assets/icons/kezizhongxin.svg new file mode 100644 index 0000000..7fbcc6c --- /dev/null +++ b/src/assets/icons/kezizhongxin.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/koubei.svg b/src/assets/icons/koubei.svg new file mode 100644 index 0000000..a744077 --- /dev/null +++ b/src/assets/icons/koubei.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/kuaijiehuifu.svg b/src/assets/icons/kuaijiehuifu.svg new file mode 100644 index 0000000..72aa5c5 --- /dev/null +++ b/src/assets/icons/kuaijiehuifu.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/ladu_mian.svg b/src/assets/icons/ladu_mian.svg new file mode 100644 index 0000000..a40816c --- /dev/null +++ b/src/assets/icons/ladu_mian.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/lanyadingwei.svg b/src/assets/icons/lanyadingwei.svg new file mode 100644 index 0000000..205653f --- /dev/null +++ b/src/assets/icons/lanyadingwei.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/list-2.svg b/src/assets/icons/list-2.svg new file mode 100644 index 0000000..1f471f3 --- /dev/null +++ b/src/assets/icons/list-2.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/mendiandongtai.svg b/src/assets/icons/mendiandongtai.svg new file mode 100644 index 0000000..7a7b415 --- /dev/null +++ b/src/assets/icons/mendiandongtai.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/mishiyuding.svg b/src/assets/icons/mishiyuding.svg new file mode 100644 index 0000000..b856afa --- /dev/null +++ b/src/assets/icons/mishiyuding.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/mishiyuding1.svg b/src/assets/icons/mishiyuding1.svg new file mode 100644 index 0000000..7ac9101 --- /dev/null +++ b/src/assets/icons/mishiyuding1.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/notice_buyer.svg b/src/assets/icons/notice_buyer.svg new file mode 100644 index 0000000..bab1997 --- /dev/null +++ b/src/assets/icons/notice_buyer.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/paiduiquhao.svg b/src/assets/icons/paiduiquhao.svg new file mode 100644 index 0000000..fb7abc9 --- /dev/null +++ b/src/assets/icons/paiduiquhao.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/paimai.svg b/src/assets/icons/paimai.svg new file mode 100644 index 0000000..0139a69 --- /dev/null +++ b/src/assets/icons/paimai.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/pingjia.svg b/src/assets/icons/pingjia.svg new file mode 100644 index 0000000..9b39672 --- /dev/null +++ b/src/assets/icons/pingjia.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/pingtaifapiao.svg b/src/assets/icons/pingtaifapiao.svg new file mode 100644 index 0000000..b6b3315 --- /dev/null +++ b/src/assets/icons/pingtaifapiao.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/pinpai.svg b/src/assets/icons/pinpai.svg new file mode 100644 index 0000000..f4b129c --- /dev/null +++ b/src/assets/icons/pinpai.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/qianbao.svg b/src/assets/icons/qianbao.svg new file mode 100644 index 0000000..f384250 --- /dev/null +++ b/src/assets/icons/qianbao.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/qianbao_mian.svg b/src/assets/icons/qianbao_mian.svg new file mode 100644 index 0000000..897f029 --- /dev/null +++ b/src/assets/icons/qianbao_mian.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/qiehuan.svg b/src/assets/icons/qiehuan.svg new file mode 100644 index 0000000..37e0a94 --- /dev/null +++ b/src/assets/icons/qiehuan.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/qingchu.svg b/src/assets/icons/qingchu.svg new file mode 100644 index 0000000..dc898ac --- /dev/null +++ b/src/assets/icons/qingchu.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/qingchu_mian.svg b/src/assets/icons/qingchu_mian.svg new file mode 100644 index 0000000..94ecaa2 --- /dev/null +++ b/src/assets/icons/qingchu_mian.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/qishoupeisong.svg b/src/assets/icons/qishoupeisong.svg new file mode 100644 index 0000000..9adc068 --- /dev/null +++ b/src/assets/icons/qishoupeisong.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/qiyedingcan.svg b/src/assets/icons/qiyedingcan.svg new file mode 100644 index 0000000..147c9e2 --- /dev/null +++ b/src/assets/icons/qiyedingcan.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/qiyedingcan1.svg b/src/assets/icons/qiyedingcan1.svg new file mode 100644 index 0000000..a3c3277 --- /dev/null +++ b/src/assets/icons/qiyedingcan1.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/quanbu.svg b/src/assets/icons/quanbu.svg new file mode 100644 index 0000000..db088f5 --- /dev/null +++ b/src/assets/icons/quanbu.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/quanping.svg b/src/assets/icons/quanping.svg new file mode 100644 index 0000000..0a5cfbe --- /dev/null +++ b/src/assets/icons/quanping.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/qudao.svg b/src/assets/icons/qudao.svg new file mode 100644 index 0000000..e0fbf39 --- /dev/null +++ b/src/assets/icons/qudao.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/qudao_xiaochengxu.svg b/src/assets/icons/qudao_xiaochengxu.svg new file mode 100644 index 0000000..54af407 --- /dev/null +++ b/src/assets/icons/qudao_xiaochengxu.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/rencaizhaopin.svg b/src/assets/icons/rencaizhaopin.svg new file mode 100644 index 0000000..6113e53 --- /dev/null +++ b/src/assets/icons/rencaizhaopin.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/rili.svg b/src/assets/icons/rili.svg new file mode 100644 index 0000000..5d751bf --- /dev/null +++ b/src/assets/icons/rili.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/rili2.svg b/src/assets/icons/rili2.svg new file mode 100644 index 0000000..ba2d55d --- /dev/null +++ b/src/assets/icons/rili2.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/rizhi.svg b/src/assets/icons/rizhi.svg new file mode 100644 index 0000000..bfdf2b0 --- /dev/null +++ b/src/assets/icons/rizhi.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/saoma.svg b/src/assets/icons/saoma.svg new file mode 100644 index 0000000..260981d --- /dev/null +++ b/src/assets/icons/saoma.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/set_pay.svg b/src/assets/icons/set_pay.svg new file mode 100644 index 0000000..639bb8e --- /dev/null +++ b/src/assets/icons/set_pay.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/set_peisong.svg b/src/assets/icons/set_peisong.svg new file mode 100644 index 0000000..a87ca69 --- /dev/null +++ b/src/assets/icons/set_peisong.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/set_user.svg b/src/assets/icons/set_user.svg new file mode 100644 index 0000000..800baf5 --- /dev/null +++ b/src/assets/icons/set_user.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/set_weihu.svg b/src/assets/icons/set_weihu.svg new file mode 100644 index 0000000..e6765f1 --- /dev/null +++ b/src/assets/icons/set_weihu.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/shanchu.svg b/src/assets/icons/shanchu.svg new file mode 100644 index 0000000..9655138 --- /dev/null +++ b/src/assets/icons/shanchu.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/shanchu_mian.svg b/src/assets/icons/shanchu_mian.svg new file mode 100644 index 0000000..17ffa4e --- /dev/null +++ b/src/assets/icons/shanchu_mian.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/shangchuan.svg b/src/assets/icons/shangchuan.svg new file mode 100644 index 0000000..f2d1a01 --- /dev/null +++ b/src/assets/icons/shangchuan.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/shangchuanzhaopian.svg b/src/assets/icons/shangchuanzhaopian.svg new file mode 100644 index 0000000..5e90e91 --- /dev/null +++ b/src/assets/icons/shangchuanzhaopian.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/shangpinguanli.svg b/src/assets/icons/shangpinguanli.svg new file mode 100644 index 0000000..c15f1a1 --- /dev/null +++ b/src/assets/icons/shangpinguanli.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/shangpinzhushou.svg b/src/assets/icons/shangpinzhushou.svg new file mode 100644 index 0000000..9972561 --- /dev/null +++ b/src/assets/icons/shangpinzhushou.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/shangpuyuding.svg b/src/assets/icons/shangpuyuding.svg new file mode 100644 index 0000000..4250f00 --- /dev/null +++ b/src/assets/icons/shangpuyuding.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/shebeiguanli.svg b/src/assets/icons/shebeiguanli.svg new file mode 100644 index 0000000..1ca4ef0 --- /dev/null +++ b/src/assets/icons/shebeiguanli.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/shengfuwangputong.svg b/src/assets/icons/shengfuwangputong.svg new file mode 100644 index 0000000..467b687 --- /dev/null +++ b/src/assets/icons/shengfuwangputong.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/shengyin.svg b/src/assets/icons/shengyin.svg new file mode 100644 index 0000000..9b1d63b --- /dev/null +++ b/src/assets/icons/shengyin.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/shengyin_mian.svg b/src/assets/icons/shengyin_mian.svg new file mode 100644 index 0000000..00c76a7 --- /dev/null +++ b/src/assets/icons/shengyin_mian.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/shezhi.svg b/src/assets/icons/shezhi.svg new file mode 100644 index 0000000..785b60f --- /dev/null +++ b/src/assets/icons/shezhi.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/shezhi_mian.svg b/src/assets/icons/shezhi_mian.svg new file mode 100644 index 0000000..0bdc106 --- /dev/null +++ b/src/assets/icons/shezhi_mian.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/shichang.svg b/src/assets/icons/shichang.svg new file mode 100644 index 0000000..d5d5d88 --- /dev/null +++ b/src/assets/icons/shichang.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/shichang_mian.svg b/src/assets/icons/shichang_mian.svg new file mode 100644 index 0000000..083b301 --- /dev/null +++ b/src/assets/icons/shichang_mian.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/shijian.svg b/src/assets/icons/shijian.svg new file mode 100644 index 0000000..9ad8b2e --- /dev/null +++ b/src/assets/icons/shijian.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/shijian_mian.svg b/src/assets/icons/shijian_mian.svg new file mode 100644 index 0000000..6c00d41 --- /dev/null +++ b/src/assets/icons/shijian_mian.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/shoudan.svg b/src/assets/icons/shoudan.svg new file mode 100644 index 0000000..9967dd8 --- /dev/null +++ b/src/assets/icons/shoudan.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/shouqi.svg b/src/assets/icons/shouqi.svg new file mode 100644 index 0000000..e8386f1 --- /dev/null +++ b/src/assets/icons/shouqi.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/shouqi_mian.svg b/src/assets/icons/shouqi_mian.svg new file mode 100644 index 0000000..b022d4c --- /dev/null +++ b/src/assets/icons/shouqi_mian.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/shouye.svg b/src/assets/icons/shouye.svg new file mode 100644 index 0000000..288b24f --- /dev/null +++ b/src/assets/icons/shouye.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/shouye_mian.svg b/src/assets/icons/shouye_mian.svg new file mode 100644 index 0000000..d180e9b --- /dev/null +++ b/src/assets/icons/shouye_mian.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/shouyiren.svg b/src/assets/icons/shouyiren.svg new file mode 100644 index 0000000..3b409d2 --- /dev/null +++ b/src/assets/icons/shouyiren.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/show.svg b/src/assets/icons/show.svg new file mode 100644 index 0000000..2fdf9b9 --- /dev/null +++ b/src/assets/icons/show.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/shuangjiantouxiangyou.svg b/src/assets/icons/shuangjiantouxiangyou.svg new file mode 100644 index 0000000..56c0e61 --- /dev/null +++ b/src/assets/icons/shuangjiantouxiangyou.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/shuangjiantouxiangzuo.svg b/src/assets/icons/shuangjiantouxiangzuo.svg new file mode 100644 index 0000000..1a90a69 --- /dev/null +++ b/src/assets/icons/shuangjiantouxiangzuo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/shuaxin.svg b/src/assets/icons/shuaxin.svg new file mode 100644 index 0000000..a4686b3 --- /dev/null +++ b/src/assets/icons/shuaxin.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/shuju.svg b/src/assets/icons/shuju.svg new file mode 100644 index 0000000..8418b76 --- /dev/null +++ b/src/assets/icons/shuju.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/shuju2.svg b/src/assets/icons/shuju2.svg new file mode 100644 index 0000000..bea4c25 --- /dev/null +++ b/src/assets/icons/shuju2.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/shuju_liuliang.svg b/src/assets/icons/shuju_liuliang.svg new file mode 100644 index 0000000..21b048b --- /dev/null +++ b/src/assets/icons/shuju_liuliang.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/shuju_mian.svg b/src/assets/icons/shuju_mian.svg new file mode 100644 index 0000000..5da2d78 --- /dev/null +++ b/src/assets/icons/shuju_mian.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/sort.svg b/src/assets/icons/sort.svg new file mode 100644 index 0000000..1e760a8 --- /dev/null +++ b/src/assets/icons/sort.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/sousuo.svg b/src/assets/icons/sousuo.svg new file mode 100644 index 0000000..2387e0a --- /dev/null +++ b/src/assets/icons/sousuo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/sucai.svg b/src/assets/icons/sucai.svg new file mode 100644 index 0000000..23499f8 --- /dev/null +++ b/src/assets/icons/sucai.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/temp-open.svg b/src/assets/icons/temp-open.svg new file mode 100644 index 0000000..54f3e08 --- /dev/null +++ b/src/assets/icons/temp-open.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/temp.svg b/src/assets/icons/temp.svg new file mode 100644 index 0000000..3cbd08c --- /dev/null +++ b/src/assets/icons/temp.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/tianjia.svg b/src/assets/icons/tianjia.svg new file mode 100644 index 0000000..b06fe16 --- /dev/null +++ b/src/assets/icons/tianjia.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/tishi.svg b/src/assets/icons/tishi.svg new file mode 100644 index 0000000..e14e118 --- /dev/null +++ b/src/assets/icons/tishi.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/tishi_mian.svg b/src/assets/icons/tishi_mian.svg new file mode 100644 index 0000000..04334ea --- /dev/null +++ b/src/assets/icons/tishi_mian.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/tongxunlu_mian.svg b/src/assets/icons/tongxunlu_mian.svg new file mode 100644 index 0000000..b7c06ab --- /dev/null +++ b/src/assets/icons/tongxunlu_mian.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/tongzhi.svg b/src/assets/icons/tongzhi.svg new file mode 100644 index 0000000..a227028 --- /dev/null +++ b/src/assets/icons/tongzhi.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/tongzhi_mian.svg b/src/assets/icons/tongzhi_mian.svg new file mode 100644 index 0000000..876676f --- /dev/null +++ b/src/assets/icons/tongzhi_mian.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/tuichuquanping.svg b/src/assets/icons/tuichuquanping.svg new file mode 100644 index 0000000..3832030 --- /dev/null +++ b/src/assets/icons/tuichuquanping.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/tuiguang.svg b/src/assets/icons/tuiguang.svg new file mode 100644 index 0000000..7d5bb2d --- /dev/null +++ b/src/assets/icons/tuiguang.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/tuiguang_mian.svg b/src/assets/icons/tuiguang_mian.svg new file mode 100644 index 0000000..005323a --- /dev/null +++ b/src/assets/icons/tuiguang_mian.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/tupian.svg b/src/assets/icons/tupian.svg new file mode 100644 index 0000000..64b511d --- /dev/null +++ b/src/assets/icons/tupian.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/tupian_mian.svg b/src/assets/icons/tupian_mian.svg new file mode 100644 index 0000000..0875efd --- /dev/null +++ b/src/assets/icons/tupian_mian.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/user_biaoqian.svg b/src/assets/icons/user_biaoqian.svg new file mode 100644 index 0000000..206fff6 --- /dev/null +++ b/src/assets/icons/user_biaoqian.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/user_gaikuang.svg b/src/assets/icons/user_gaikuang.svg new file mode 100644 index 0000000..b4ae10e --- /dev/null +++ b/src/assets/icons/user_gaikuang.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/user_guanli.svg b/src/assets/icons/user_guanli.svg new file mode 100644 index 0000000..e00fd79 --- /dev/null +++ b/src/assets/icons/user_guanli.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/wangpudiandan.svg b/src/assets/icons/wangpudiandan.svg new file mode 100644 index 0000000..77cc413 --- /dev/null +++ b/src/assets/icons/wangpudiandan.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/weixin.svg b/src/assets/icons/weixin.svg new file mode 100644 index 0000000..f043f12 --- /dev/null +++ b/src/assets/icons/weixin.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/weixin_mian.svg b/src/assets/icons/weixin_mian.svg new file mode 100644 index 0000000..5c4e92e --- /dev/null +++ b/src/assets/icons/weixin_mian.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/wode.svg b/src/assets/icons/wode.svg new file mode 100644 index 0000000..4cc5c10 --- /dev/null +++ b/src/assets/icons/wode.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/wode_mian.svg b/src/assets/icons/wode_mian.svg new file mode 100644 index 0000000..ea9ebfb --- /dev/null +++ b/src/assets/icons/wode_mian.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/xiangji.svg b/src/assets/icons/xiangji.svg new file mode 100644 index 0000000..a9f7b5f --- /dev/null +++ b/src/assets/icons/xiangji.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/xiaoxi.svg b/src/assets/icons/xiaoxi.svg new file mode 100644 index 0000000..cf220c8 --- /dev/null +++ b/src/assets/icons/xiaoxi.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/xiazai.svg b/src/assets/icons/xiazai.svg new file mode 100644 index 0000000..c741576 --- /dev/null +++ b/src/assets/icons/xiazai.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/xitongquanxian.svg b/src/assets/icons/xitongquanxian.svg new file mode 100644 index 0000000..b34ac74 --- /dev/null +++ b/src/assets/icons/xitongquanxian.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/yingxiao_qipao.svg b/src/assets/icons/yingxiao_qipao.svg new file mode 100644 index 0000000..238ddf2 --- /dev/null +++ b/src/assets/icons/yingxiao_qipao.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/yingyezizhi.svg b/src/assets/icons/yingyezizhi.svg new file mode 100644 index 0000000..23ae5be --- /dev/null +++ b/src/assets/icons/yingyezizhi.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/yinhangka.svg b/src/assets/icons/yinhangka.svg new file mode 100644 index 0000000..20c1fdc --- /dev/null +++ b/src/assets/icons/yinhangka.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/yiwen.svg b/src/assets/icons/yiwen.svg new file mode 100644 index 0000000..ef07f2e --- /dev/null +++ b/src/assets/icons/yiwen.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/youhui.svg b/src/assets/icons/youhui.svg new file mode 100644 index 0000000..4358e1c --- /dev/null +++ b/src/assets/icons/youhui.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/youjian.svg b/src/assets/icons/youjian.svg new file mode 100644 index 0000000..1304c01 --- /dev/null +++ b/src/assets/icons/youjian.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/youjiantou.svg b/src/assets/icons/youjiantou.svg new file mode 100644 index 0000000..5c59926 --- /dev/null +++ b/src/assets/icons/youjiantou.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/yulibao.svg b/src/assets/icons/yulibao.svg new file mode 100644 index 0000000..b785c04 --- /dev/null +++ b/src/assets/icons/yulibao.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/yuyin.svg b/src/assets/icons/yuyin.svg new file mode 100644 index 0000000..1ac06af --- /dev/null +++ b/src/assets/icons/yuyin.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/yuyueguanli.svg b/src/assets/icons/yuyueguanli.svg new file mode 100644 index 0000000..080255d --- /dev/null +++ b/src/assets/icons/yuyueguanli.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/yuyueguanlishezhi.svg b/src/assets/icons/yuyueguanlishezhi.svg new file mode 100644 index 0000000..eac7549 --- /dev/null +++ b/src/assets/icons/yuyueguanlishezhi.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/zhankai.svg b/src/assets/icons/zhankai.svg new file mode 100644 index 0000000..aef4e53 --- /dev/null +++ b/src/assets/icons/zhankai.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/zhankai_mian.svg b/src/assets/icons/zhankai_mian.svg new file mode 100644 index 0000000..187e3e9 --- /dev/null +++ b/src/assets/icons/zhankai_mian.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/zhibo.svg b/src/assets/icons/zhibo.svg new file mode 100644 index 0000000..d329b49 --- /dev/null +++ b/src/assets/icons/zhibo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/zhibo_mian.svg b/src/assets/icons/zhibo_mian.svg new file mode 100644 index 0000000..443e2cb --- /dev/null +++ b/src/assets/icons/zhibo_mian.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/zhuangxiu.svg b/src/assets/icons/zhuangxiu.svg new file mode 100644 index 0000000..c692c45 --- /dev/null +++ b/src/assets/icons/zhuangxiu.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/zhuangxiu_mian.svg b/src/assets/icons/zhuangxiu_mian.svg new file mode 100644 index 0000000..53e8deb --- /dev/null +++ b/src/assets/icons/zhuangxiu_mian.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/zhuoweiguanli.svg b/src/assets/icons/zhuoweiguanli.svg new file mode 100644 index 0000000..ee9d0cc --- /dev/null +++ b/src/assets/icons/zhuoweiguanli.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/zichanzhuanrang.svg b/src/assets/icons/zichanzhuanrang.svg new file mode 100644 index 0000000..8a8d546 --- /dev/null +++ b/src/assets/icons/zichanzhuanrang.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/zuliao.svg b/src/assets/icons/zuliao.svg new file mode 100644 index 0000000..e210df3 --- /dev/null +++ b/src/assets/icons/zuliao.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/zuliaoyuding.svg b/src/assets/icons/zuliaoyuding.svg new file mode 100644 index 0000000..69a9d99 --- /dev/null +++ b/src/assets/icons/zuliaoyuding.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/images/blue1.png b/src/assets/images/blue1.png new file mode 100644 index 0000000..64519fd Binary files /dev/null and b/src/assets/images/blue1.png differ diff --git a/src/assets/images/blue2.png b/src/assets/images/blue2.png new file mode 100644 index 0000000..55ab1b5 Binary files /dev/null and b/src/assets/images/blue2.png differ diff --git a/src/assets/images/blue3.png b/src/assets/images/blue3.png new file mode 100644 index 0000000..23b7ad3 Binary files /dev/null and b/src/assets/images/blue3.png differ diff --git a/src/assets/images/green1.png b/src/assets/images/green1.png new file mode 100644 index 0000000..bbf7b7d Binary files /dev/null and b/src/assets/images/green1.png differ diff --git a/src/assets/images/green2.png b/src/assets/images/green2.png new file mode 100644 index 0000000..5dbbbe6 Binary files /dev/null and b/src/assets/images/green2.png differ diff --git a/src/assets/images/green3.png b/src/assets/images/green3.png new file mode 100644 index 0000000..baba2bd Binary files /dev/null and b/src/assets/images/green3.png differ diff --git a/src/assets/images/icon_folder.png b/src/assets/images/icon_folder.png new file mode 100644 index 0000000..99b800f Binary files /dev/null and b/src/assets/images/icon_folder.png differ diff --git a/src/assets/images/no_perms.png b/src/assets/images/no_perms.png new file mode 100644 index 0000000..c37c89b Binary files /dev/null and b/src/assets/images/no_perms.png differ diff --git a/src/assets/images/pink1.png b/src/assets/images/pink1.png new file mode 100644 index 0000000..a3af218 Binary files /dev/null and b/src/assets/images/pink1.png differ diff --git a/src/assets/images/pink2.png b/src/assets/images/pink2.png new file mode 100644 index 0000000..de9dbe7 Binary files /dev/null and b/src/assets/images/pink2.png differ diff --git a/src/assets/images/pink3.png b/src/assets/images/pink3.png new file mode 100644 index 0000000..28d8cc6 Binary files /dev/null and b/src/assets/images/pink3.png differ diff --git a/src/assets/images/purple1.png b/src/assets/images/purple1.png new file mode 100644 index 0000000..bf0946a Binary files /dev/null and b/src/assets/images/purple1.png differ diff --git a/src/assets/images/purple2.png b/src/assets/images/purple2.png new file mode 100644 index 0000000..05c9cef Binary files /dev/null and b/src/assets/images/purple2.png differ diff --git a/src/assets/images/purple3.png b/src/assets/images/purple3.png new file mode 100644 index 0000000..a280049 Binary files /dev/null and b/src/assets/images/purple3.png differ diff --git a/src/assets/images/red1.png b/src/assets/images/red1.png new file mode 100644 index 0000000..e9932cb Binary files /dev/null and b/src/assets/images/red1.png differ diff --git a/src/assets/images/red2.png b/src/assets/images/red2.png new file mode 100644 index 0000000..5a10e43 Binary files /dev/null and b/src/assets/images/red2.png differ diff --git a/src/assets/images/red3.png b/src/assets/images/red3.png new file mode 100644 index 0000000..e106b7b Binary files /dev/null and b/src/assets/images/red3.png differ diff --git a/src/assets/images/theme_black.png b/src/assets/images/theme_black.png new file mode 100644 index 0000000..417b4d4 Binary files /dev/null and b/src/assets/images/theme_black.png differ diff --git a/src/assets/images/theme_white.png b/src/assets/images/theme_white.png new file mode 100644 index 0000000..52714ba Binary files /dev/null and b/src/assets/images/theme_white.png differ diff --git a/src/assets/images/yellow1.png b/src/assets/images/yellow1.png new file mode 100644 index 0000000..7e4d86b Binary files /dev/null and b/src/assets/images/yellow1.png differ diff --git a/src/assets/images/yellow2.png b/src/assets/images/yellow2.png new file mode 100644 index 0000000..49a0c57 Binary files /dev/null and b/src/assets/images/yellow2.png differ diff --git a/src/assets/images/yellow3.png b/src/assets/images/yellow3.png new file mode 100644 index 0000000..e435d84 Binary files /dev/null and b/src/assets/images/yellow3.png differ diff --git a/src/components/app-link/index.vue b/src/components/app-link/index.vue new file mode 100644 index 0000000..e7fe926 --- /dev/null +++ b/src/components/app-link/index.vue @@ -0,0 +1,38 @@ + + + diff --git a/src/components/color-picker/index.vue b/src/components/color-picker/index.vue new file mode 100644 index 0000000..ed86ef4 --- /dev/null +++ b/src/components/color-picker/index.vue @@ -0,0 +1,32 @@ + + + \ No newline at end of file diff --git a/src/components/daterange-picker/index.vue b/src/components/daterange-picker/index.vue new file mode 100644 index 0000000..5ad8f04 --- /dev/null +++ b/src/components/daterange-picker/index.vue @@ -0,0 +1,43 @@ + + + diff --git a/src/components/del-wrap/index.vue b/src/components/del-wrap/index.vue new file mode 100644 index 0000000..787f3e2 --- /dev/null +++ b/src/components/del-wrap/index.vue @@ -0,0 +1,51 @@ + + + + + diff --git a/src/components/dict-value/index.vue b/src/components/dict-value/index.vue new file mode 100644 index 0000000..7d34aec --- /dev/null +++ b/src/components/dict-value/index.vue @@ -0,0 +1,35 @@ + + diff --git a/src/components/editor/index.vue b/src/components/editor/index.vue new file mode 100644 index 0000000..3a7b6c5 --- /dev/null +++ b/src/components/editor/index.vue @@ -0,0 +1,143 @@ + + + + diff --git a/src/components/export-data/index.vue b/src/components/export-data/index.vue new file mode 100644 index 0000000..b687c9d --- /dev/null +++ b/src/components/export-data/index.vue @@ -0,0 +1,149 @@ + + diff --git a/src/components/footer-btns/index.vue b/src/components/footer-btns/index.vue new file mode 100644 index 0000000..eb5aea2 --- /dev/null +++ b/src/components/footer-btns/index.vue @@ -0,0 +1,30 @@ + + + + + diff --git a/src/components/icon/index.ts b/src/components/icon/index.ts new file mode 100644 index 0000000..831fcad --- /dev/null +++ b/src/components/icon/index.ts @@ -0,0 +1,19 @@ +import * as ElementPlusIcons from '@element-plus/icons-vue' +//@ts-ignore +import localIconsName from 'virtual:svg-icons-names' + +export const LOCAL_ICON_PREFIX = 'local-icon-' +export const EL_ICON_PREFIX = 'el-icon-' + +const elIconsName: string[] = [] + +for (const [, component] of Object.entries(ElementPlusIcons)) { + elIconsName.push(`${EL_ICON_PREFIX}${component.name}`) +} + +export function getElementPlusIconNames() { + return elIconsName +} +export function getLocalIconNames() { + return localIconsName +} diff --git a/src/components/icon/index.vue b/src/components/icon/index.vue new file mode 100644 index 0000000..98dff2a --- /dev/null +++ b/src/components/icon/index.vue @@ -0,0 +1,48 @@ + diff --git a/src/components/icon/picker.vue b/src/components/icon/picker.vue new file mode 100644 index 0000000..27fc8cd --- /dev/null +++ b/src/components/icon/picker.vue @@ -0,0 +1,185 @@ + + + diff --git a/src/components/icon/svg-icon.vue b/src/components/icon/svg-icon.vue new file mode 100644 index 0000000..10c6919 --- /dev/null +++ b/src/components/icon/svg-icon.vue @@ -0,0 +1,38 @@ + + + diff --git a/src/components/image-contain/index.vue b/src/components/image-contain/index.vue new file mode 100644 index 0000000..e0285b9 --- /dev/null +++ b/src/components/image-contain/index.vue @@ -0,0 +1,42 @@ + + + + + diff --git a/src/components/link/article-list.vue b/src/components/link/article-list.vue new file mode 100644 index 0000000..e52f201 --- /dev/null +++ b/src/components/link/article-list.vue @@ -0,0 +1,149 @@ + + + + + \ No newline at end of file diff --git a/src/components/link/custom-link.vue b/src/components/link/custom-link.vue new file mode 100644 index 0000000..990cb95 --- /dev/null +++ b/src/components/link/custom-link.vue @@ -0,0 +1,42 @@ + + + diff --git a/src/components/link/index.ts b/src/components/link/index.ts new file mode 100644 index 0000000..616b9b8 --- /dev/null +++ b/src/components/link/index.ts @@ -0,0 +1,18 @@ +export enum MenuTypeEnum { + 'SHOP_PAGES' = 'shop', + 'APPTOOL' = 'application_tool', + 'OTHER_LINK' = 'other_link' +} + +export enum LinkTypeEnum { + 'SHOP_PAGES' = 'shop', + 'ARTICLE_LIST' = 'article', + 'CUSTOM_LINK' = 'custom' +} + +export interface Link { + path: string + name?: string + type: string + query?: Record +} diff --git a/src/components/link/index.vue b/src/components/link/index.vue new file mode 100644 index 0000000..41b8ec4 --- /dev/null +++ b/src/components/link/index.vue @@ -0,0 +1,145 @@ + + + + + diff --git a/src/components/link/picker.vue b/src/components/link/picker.vue new file mode 100644 index 0000000..91b53f8 --- /dev/null +++ b/src/components/link/picker.vue @@ -0,0 +1,87 @@ + + + + + diff --git a/src/components/link/shop-pages.vue b/src/components/link/shop-pages.vue new file mode 100644 index 0000000..009c390 --- /dev/null +++ b/src/components/link/shop-pages.vue @@ -0,0 +1,109 @@ + + + diff --git a/src/components/material/file.vue b/src/components/material/file.vue new file mode 100644 index 0000000..5169d3f --- /dev/null +++ b/src/components/material/file.vue @@ -0,0 +1,70 @@ + + + + + diff --git a/src/components/material/hook.ts b/src/components/material/hook.ts new file mode 100644 index 0000000..fa4be57 --- /dev/null +++ b/src/components/material/hook.ts @@ -0,0 +1,224 @@ +import { + fileCateAdd, + fileCateDelete, + fileCateEdit, + fileCateLists, + fileDelete, + fileList, + fileMove, + fileRename +} from '@/api/file' +import { usePaging } from '@/hooks/usePaging' +import feedback from '@/utils/feedback' +import { ElMessage, ElTree, type CheckboxValueType } from 'element-plus' +import { shallowRef, type Ref } from 'vue' + +// 左侧分组的钩子函数 +export function useCate(type: number) { + const treeRef = shallowRef>() + // 分组列表 + const cateLists = ref([]) + + // 选中的分组id + const cateId = ref('') + + // 获取分组列表 + const getCateLists = async () => { + const data = await fileCateLists({ + page_type: 0, + type + }) + const item: any[] = [ + { + name: '全部', + id: '' + }, + { + name: '未分组', + id: 0 + } + ] + cateLists.value = data.lists + cateLists.value.unshift(...item) + setTimeout(() => { + treeRef.value?.setCurrentKey(cateId.value) + }, 0) + } + + // 添加分组 + const handleAddCate = async (value: string) => { + await fileCateAdd({ + type, + name: value, + pid: 0 + }) + getCateLists() + } + + const handleAddChildCate = async (value: string, pid: number) => { + await fileCateAdd({ + type, + name: value, + pid: pid + }) + getCateLists() + } + + // 编辑分组 + const handleEditCate = async (value: string, id: number) => { + await fileCateEdit({ + id, + name: value + }) + getCateLists() + } + + // 删除分组 + const handleDeleteCate = async (id: number, children?: number) => { + if (children) { + await feedback.confirm('删除文件夹将会永久删除文件夹及其所有内容。您确定要继续吗?') + } else { + await feedback.confirm('确定要删除?') + } + await fileCateDelete({ id }) + cateId.value = '' + getCateLists() + } + + //选中分类 + const handleCatSelect = (item: any) => { + cateId.value = item.id + } + + return { + treeRef, + cateId, + cateLists, + handleAddCate, + handleAddChildCate, + handleEditCate, + handleDeleteCate, + getCateLists, + handleCatSelect + } +} + +// 处理文件的钩子函数 +export function useFile( + cateId: Ref, + type: Ref, + limit: Ref, + size: number +) { + const tableRef = shallowRef() + const listShowType = ref('normal') + const moveId = ref(0) + const select = ref([]) + const isCheckAll = ref(false) + const isIndeterminate = ref(false) + const fileParams = reactive({ + name: '', + type: type, + cid: cateId, + source: '' + }) + const { pager, getLists, resetPage } = usePaging({ + fetchFun: fileList, + params: fileParams, + firstLoading: true, + size + }) + + const getFileList = () => { + getLists() + } + const refresh = () => { + resetPage() + } + + const isSelect = (id: number) => { + return !!select.value.find((item: any) => item.id == id) + } + + const batchFileDelete = async (id?: number[]) => { + await feedback.confirm( + '确认删除后,本地或云存储文件也将同步删除,如文件已被使用,请谨慎操作!' + ) + const ids = id ? id : select.value.map((item: any) => item.id) + await fileDelete({ ids }) + getFileList() + clearSelect() + } + + const batchFileMove = async () => { + const ids = select.value.map((item: any) => item.id) + await fileMove({ ids, cid: moveId.value }) + moveId.value = 0 + getFileList() + clearSelect() + } + + const selectFile = (item: any) => { + const index = select.value.findIndex((items: any) => items.id == item.id) + if (index != -1) { + select.value.splice(index, 1) + return + } + if (select.value.length == limit.value) { + if (limit.value == 1) { + select.value = [] + select.value.push(item) + return + } + ElMessage.warning('已达到选择上限') + return + } + select.value.push(item) + } + + const clearSelect = () => { + select.value = [] + } + + const cancelSelete = (id: number) => { + select.value = select.value.filter((item: any) => item.id != id) + } + + const selectAll = (value: CheckboxValueType) => { + isIndeterminate.value = false + tableRef.value?.toggleAllSelection() + if (value) { + select.value = [...pager.lists] + return + } + clearSelect() + } + + const handleFileRename = async (name: string, id: number) => { + await fileRename({ + id, + name + }) + getFileList() + } + return { + listShowType, + tableRef, + moveId, + pager, + fileParams, + select, + isCheckAll, + isIndeterminate, + getFileList, + refresh, + batchFileDelete, + batchFileMove, + selectFile, + isSelect, + clearSelect, + cancelSelete, + selectAll, + handleFileRename + } +} diff --git a/src/components/material/index.vue b/src/components/material/index.vue new file mode 100644 index 0000000..da01eae --- /dev/null +++ b/src/components/material/index.vue @@ -0,0 +1,655 @@ + + + + + diff --git a/src/components/material/picker.vue b/src/components/material/picker.vue new file mode 100644 index 0000000..5b43cfc --- /dev/null +++ b/src/components/material/picker.vue @@ -0,0 +1,315 @@ + + + + + diff --git a/src/components/material/preview.vue b/src/components/material/preview.vue new file mode 100644 index 0000000..6accaa0 --- /dev/null +++ b/src/components/material/preview.vue @@ -0,0 +1,72 @@ + + + diff --git a/src/components/overflow-tooltip/index.vue b/src/components/overflow-tooltip/index.vue new file mode 100644 index 0000000..57734db --- /dev/null +++ b/src/components/overflow-tooltip/index.vue @@ -0,0 +1,47 @@ + + + + + diff --git a/src/components/pagination/index.vue b/src/components/pagination/index.vue new file mode 100644 index 0000000..020d304 --- /dev/null +++ b/src/components/pagination/index.vue @@ -0,0 +1,50 @@ + + + diff --git a/src/components/popover-input/index.vue b/src/components/popover-input/index.vue new file mode 100644 index 0000000..88ba84a --- /dev/null +++ b/src/components/popover-input/index.vue @@ -0,0 +1,130 @@ + + + + + diff --git a/src/components/popup/index.vue b/src/components/popup/index.vue new file mode 100644 index 0000000..726f89f --- /dev/null +++ b/src/components/popup/index.vue @@ -0,0 +1,132 @@ + + + + + diff --git a/src/components/upload/index.vue b/src/components/upload/index.vue new file mode 100644 index 0000000..6f2846e --- /dev/null +++ b/src/components/upload/index.vue @@ -0,0 +1,158 @@ + + + + + diff --git a/src/components/video-player/index.vue b/src/components/video-player/index.vue new file mode 100644 index 0000000..8a49f31 --- /dev/null +++ b/src/components/video-player/index.vue @@ -0,0 +1,72 @@ + + + diff --git a/src/config/index.ts b/src/config/index.ts new file mode 100644 index 0000000..8c33a20 --- /dev/null +++ b/src/config/index.ts @@ -0,0 +1,10 @@ +const config = { + terminal: 1, //终端 + title: '后台管理系统', //网站默认标题 + version: '1.8.0', //版本号 + baseUrl: `${import.meta.env.VITE_APP_BASE_URL || ''}/`, //请求接口域名 + urlPrefix: 'adminapi', //请求默认前缀 + timeout: 10 * 1000 //请求超时时长 +} + +export default config diff --git a/src/config/setting.ts b/src/config/setting.ts new file mode 100644 index 0000000..35d62e1 --- /dev/null +++ b/src/config/setting.ts @@ -0,0 +1,16 @@ +const defaultSetting = { + showCrumb: true, // 是否显示面包屑 + showLogo: true, // 是否显示logo + isUniqueOpened: false, //只展开一个一级菜单 + sideWidth: 200, //侧边栏宽度 + sideTheme: 'light', //侧边栏主题 + sideDarkColor: '#1d2124', //侧边栏深色主题颜色 + openMultipleTabs: true, // 是否开启多标签tab栏 + theme: '#4A5DFF', //主题色 + successTheme: '#67c23a', //成功主题色 + warningTheme: '#e6a23c', //警告主题色 + dangerTheme: '#f56c6c', //危险主题色 + errorTheme: '#f56c6c', //错误主题色 + infoTheme: '#909399' //信息主题色 +} +export default defaultSetting diff --git a/src/enums/appEnums.ts b/src/enums/appEnums.ts new file mode 100644 index 0000000..90ac145 --- /dev/null +++ b/src/enums/appEnums.ts @@ -0,0 +1,40 @@ +//菜单主题类型 +export enum ThemeEnum { + LIGHT = 'light', + DARK = 'dark' +} + +// 菜单类型 +export enum MenuEnum { + CATALOGUE = 'M', + MENU = 'C', + BUTTON = 'A' +} + +// 屏幕 +export enum ScreenEnum { + SM = 640, + MD = 768, + LG = 1024, + XL = 1280, + '2XL' = 1536 +} + +// 客户端类型 +export enum ClientEnum { + MP_WEIXIN = 1, // 微信-小程序 + OA_WEIXIN = 2, // 微信-公众号 + H5 = 3, // H5 + PC = 4, // PC + IOS = 5, //苹果 + ANDROID = 6 //安卓 +} + +export const ClientMap = { + [ClientEnum.MP_WEIXIN]: '微信小程序', + [ClientEnum.OA_WEIXIN]: '微信公众号', + [ClientEnum.H5]: '手机H5', + [ClientEnum.PC]: '电脑PC', + [ClientEnum.IOS]: '苹果APP', + [ClientEnum.ANDROID]: '安卓APP' +} diff --git a/src/enums/cacheEnums.ts b/src/enums/cacheEnums.ts new file mode 100644 index 0000000..45624e4 --- /dev/null +++ b/src/enums/cacheEnums.ts @@ -0,0 +1,8 @@ +// 本地缓冲key + +//token +export const TOKEN_KEY = 'token' +//账号 +export const ACCOUNT_KEY = 'account' +//设置 +export const SETTING_KEY = 'setting' diff --git a/src/enums/pageEnum.ts b/src/enums/pageEnum.ts new file mode 100644 index 0000000..1509ff5 --- /dev/null +++ b/src/enums/pageEnum.ts @@ -0,0 +1,7 @@ +export enum PageEnum { + //登录页面 + LOGIN = '/login', + //无权限页面 + ERROR_403 = '/403', + INDEX = '/' +} diff --git a/src/enums/requestEnums.ts b/src/enums/requestEnums.ts new file mode 100644 index 0000000..7ee2107 --- /dev/null +++ b/src/enums/requestEnums.ts @@ -0,0 +1,18 @@ +export enum ContentTypeEnum { + // json + JSON = 'application/json;charset=UTF-8', + // form-data 上传资源(图片,视频) + FORM_DATA = 'multipart/form-data;charset=UTF-8' +} + +export enum RequestMethodsEnum { + GET = 'GET', + POST = 'POST' +} + +export enum RequestCodeEnum { + SUCCESS = 1, + FAIL = 0, + LOGIN_FAILURE = -1, + OPEN_NEW_PAGE = 2 +} diff --git a/src/hooks/useDictOptions.ts b/src/hooks/useDictOptions.ts new file mode 100644 index 0000000..d79ec5a --- /dev/null +++ b/src/hooks/useDictOptions.ts @@ -0,0 +1,67 @@ +import { getDictData } from '@/api/app' +import { reactive, toRaw } from 'vue' + +interface Options { + [propName: string]: { + api: PromiseFun + params?: Record + transformData?(data: any): any + } +} + +// { +// dict: { +// api: dictData, +// params: { name: 'user' }, +// transformData(data: any) { +// return data.list +// } +// } +// } + +export function useDictOptions(options: Options) { + const optionsData: any = reactive({}) + const optionsKey = Object.keys(options) + const apiLists = optionsKey.map((key) => { + const value = options[key] + optionsData[key] = [] + return () => value.api(toRaw(value.params) || {}) + }) + + const refresh = async () => { + const res = await Promise.allSettled>(apiLists.map((api) => api())) + res.forEach((item, index) => { + const key = optionsKey[index] + if (item.status == 'fulfilled') { + const { transformData } = options[key] + const data = transformData ? transformData(item.value) : item.value + optionsData[key] = data + } + }) + } + refresh() + return { + optionsData: optionsData as T, + refresh + } +} + +// useDictData<{ +// dict: any[] +// }>(['dict']) + +export function useDictData(dict: string) { + const dictData: any = reactive({}) + const refresh = async () => { + const data = await getDictData({ + type: dict + }) + Object.assign(dictData, data) + } + refresh() + + return { + dictData: dictData as T, + refresh + } +} diff --git a/src/hooks/useLockFn.ts b/src/hooks/useLockFn.ts new file mode 100644 index 0000000..c4423d6 --- /dev/null +++ b/src/hooks/useLockFn.ts @@ -0,0 +1,21 @@ +import { ref } from 'vue' + +export function useLockFn(fn: (...args: any[]) => Promise) { + const isLock = ref(false) + const lockFn = async (...args: any[]) => { + if (isLock.value) return + isLock.value = true + try { + const res = await fn(...args) + isLock.value = false + return res + } catch (e) { + isLock.value = false + throw e + } + } + return { + isLock, + lockFn + } +} diff --git a/src/hooks/useMultipleTabs.ts b/src/hooks/useMultipleTabs.ts new file mode 100644 index 0000000..02e1e43 --- /dev/null +++ b/src/hooks/useMultipleTabs.ts @@ -0,0 +1,47 @@ +import useTabsStore from '@/stores/modules/multipleTabs' +import useSettingStore from '@/stores/modules/setting' + +export default function useMultipleTabs() { + const router = useRouter() + const route = useRoute() + const tabsStore = useTabsStore() + const settingStore = useSettingStore() + + const tabsLists = computed(() => { + return tabsStore.getTabList + }) + + const currentTab = computed(() => { + return route.fullPath + }) + + const addTab = () => { + if (!settingStore.openMultipleTabs) return + tabsStore.addTab(router) + } + + const removeTab = (fullPath?: any) => { + if (!settingStore.openMultipleTabs) return + fullPath = fullPath ?? route.fullPath + tabsStore.removeTab(fullPath, router) + } + + const removeOtherTab = () => { + if (!settingStore.openMultipleTabs) return + tabsStore.removeOtherTab(route) + } + + const removeAllTab = () => { + if (!settingStore.openMultipleTabs) return + tabsStore.removeAllTab(router) + } + + return { + tabsLists, + currentTab, + addTab, + removeTab, + removeOtherTab, + removeAllTab + } +} diff --git a/src/hooks/usePaging.ts b/src/hooks/usePaging.ts new file mode 100644 index 0000000..9c33890 --- /dev/null +++ b/src/hooks/usePaging.ts @@ -0,0 +1,64 @@ +import { reactive, toRaw } from 'vue' + +// 分页钩子函数 +interface Options { + page?: number + size?: number + fetchFun: (_arg: any) => Promise + params?: Record + firstLoading?: boolean +} + +export function usePaging(options: Options) { + const { page = 1, size = 15, fetchFun, params = {}, firstLoading = false } = options + // 记录分页初始参数 + const paramsInit: Record = Object.assign({}, toRaw(params)) + // 分页数据 + const pager = reactive({ + page, + size, + loading: firstLoading, + count: 0, + lists: [] as any[], + extend: {} as Record + }) + // 请求分页接口 + const getLists = () => { + pager.loading = true + return fetchFun({ + page_no: pager.page, + page_size: pager.size, + ...params + }) + .then((res: any) => { + pager.count = res?.count + pager.lists = res?.lists + pager.extend = res?.extend + return Promise.resolve(res) + }) + .catch((err: any) => { + return Promise.reject(err) + }) + .finally(() => { + pager.loading = false + }) + } + // 重置为第一页 + const resetPage = () => { + pager.page = 1 + getLists() + } + // 重置参数 + const resetParams = () => { + Object.keys(paramsInit).forEach((item) => { + params[item] = paramsInit[item] + }) + getLists() + } + return { + pager, + getLists, + resetParams, + resetPage + } +} diff --git a/src/hooks/useWatchRoute.ts b/src/hooks/useWatchRoute.ts new file mode 100644 index 0000000..381b2ec --- /dev/null +++ b/src/hooks/useWatchRoute.ts @@ -0,0 +1,17 @@ +import type { RouteLocationNormalizedLoaded } from 'vue-router' + +export function useWatchRoute(callback: (route: RouteLocationNormalizedLoaded) => void) { + const route = useRoute() + watch( + route, + () => { + callback(route) + }, + { + immediate: true + } + ) + return { + route + } +} diff --git a/src/install/directives/copy.ts b/src/install/directives/copy.ts new file mode 100644 index 0000000..c0b1909 --- /dev/null +++ b/src/install/directives/copy.ts @@ -0,0 +1,28 @@ +/** + * perm 操作权限处理 + * 指令用法: + * 编辑 + */ + +import feedback from '@/utils/feedback' +import useClipboard from 'vue-clipboard3' +const clipboard = 'data-clipboard-text' +export default { + mounted: (el: HTMLElement, binding: any) => { + el.setAttribute(clipboard, binding.value) + const { toClipboard } = useClipboard() + + el.onclick = () => { + toClipboard(el.getAttribute(clipboard)!) + .then(() => { + feedback.msgSuccess('复制成功') + }) + .catch(() => { + feedback.msgError('复制失败') + }) + } + }, + updated: (el: HTMLElement, binding: any) => { + el.setAttribute(clipboard, binding.value) + } +} diff --git a/src/install/directives/perms.ts b/src/install/directives/perms.ts new file mode 100644 index 0000000..507dbfe --- /dev/null +++ b/src/install/directives/perms.ts @@ -0,0 +1,29 @@ +/** + * perm 操作权限处理 + * 指令用法: + * 编辑 + */ + +import useUserStore from '@/stores/modules/user' + +export default { + mounted: (el: HTMLElement, binding: any) => { + const { value } = binding + const userStore = useUserStore() + const permissions = userStore.perms + const all_permission = '*' + if (Array.isArray(value)) { + if (value.length > 0) { + const hasPermission = permissions.some((key: string) => { + return all_permission == key || value.includes(key) + }) + + if (!hasPermission) { + el.parentNode && el.parentNode.removeChild(el) + } + } + } else { + throw new Error('like v-perms="[\'auth.menu/edit\']"') + } + } +} diff --git a/src/install/index.ts b/src/install/index.ts new file mode 100644 index 0000000..eab8563 --- /dev/null +++ b/src/install/index.ts @@ -0,0 +1,27 @@ +import type { App } from 'vue' +const modules = import.meta.glob('./**/*', { eager: true }) + +// 安装方法,执行某一类相同操作 +function install(app: App) { + Object.keys(modules).forEach((key) => { + const name = key.replace(/(.*\/)*([^.]+).*/gi, '$2') + const type = key.replace(/^\.\/([\w-]+).*/gi, '$1') + const module: any = modules[key] + if (module.default) { + switch (type) { + // 用于注册全局指令 + case 'directives': + app.directive(name, module.default) + break + // 使用插件 + case 'plugins': + typeof module.default === 'function' && module.default(app) + break + } + } + }) +} + +export default { + install +} diff --git a/src/install/plugins/echart.ts b/src/install/plugins/echart.ts new file mode 100644 index 0000000..96edebb --- /dev/null +++ b/src/install/plugins/echart.ts @@ -0,0 +1,63 @@ +//引入 echarts 核心模块,核心模块提供了 echarts 使用必须要的接口。 + +import * as echarts from 'echarts/core' +//引入柱状图图表,图表后缀都为 Chart +import { + BarChart, + LineChart, + PieChart, + MapChart, + PictorialBarChart, + RadarChart, + ScatterChart +} from 'echarts/charts' +// 引入提示框,标题,直角坐标系,数据集,内置数据转换器组件,组件后缀都为 Component +import { + TitleComponent, + TooltipComponent, + GridComponent, + PolarComponent, + AriaComponent, + ParallelComponent, + LegendComponent, + RadarComponent, + ToolboxComponent, + DataZoomComponent, + VisualMapComponent, + TimelineComponent, + CalendarComponent, + GraphicComponent +} from 'echarts/components' + +//引入 Canvas 渲染器,注意引入 CanvasRenderer 或者 SVGRenderer 是必须的一步 +import { CanvasRenderer } from 'echarts/renderers' +//标签自动布局,全局过渡动画等特性 +import { LabelLayout, UniversalTransition } from 'echarts/features' + +// 注册必须的组件 +echarts.use([ + LegendComponent, + TitleComponent, + TooltipComponent, + GridComponent, + PolarComponent, + AriaComponent, + ParallelComponent, + BarChart, + LineChart, + PieChart, + MapChart, + RadarChart, + PictorialBarChart, + RadarComponent, + ToolboxComponent, + DataZoomComponent, + VisualMapComponent, + TimelineComponent, + CalendarComponent, + GraphicComponent, + ScatterChart, + CanvasRenderer, + LabelLayout, + UniversalTransition +]) diff --git a/src/install/plugins/element.ts b/src/install/plugins/element.ts new file mode 100644 index 0000000..ac6ae23 --- /dev/null +++ b/src/install/plugins/element.ts @@ -0,0 +1,11 @@ +import * as ElementPlusIcons from '@element-plus/icons-vue' +import type { App } from 'vue' +//https://github.com/element-plus/element-plus/issues/7293 +import 'element-plus/es/components/dialog/style/css' + +export default (app: App) => { + // 全局注册ElementPlus图标 + for (const [key, component] of Object.entries(ElementPlusIcons)) { + app.component(key, component) + } +} diff --git a/src/install/plugins/hljs.ts b/src/install/plugins/hljs.ts new file mode 100644 index 0000000..041ac77 --- /dev/null +++ b/src/install/plugins/hljs.ts @@ -0,0 +1,8 @@ +import type { App } from 'vue' +import 'highlight.js/styles/github.css' +import hljs from 'highlight.js/lib/common' +import hljsVuePlugin from '@highlightjs/vue-plugin' +console.log(hljs) +export default (app: App) => { + app.use(hljsVuePlugin) +} diff --git a/src/install/plugins/pinia.ts b/src/install/plugins/pinia.ts new file mode 100644 index 0000000..6e72e75 --- /dev/null +++ b/src/install/plugins/pinia.ts @@ -0,0 +1,6 @@ +import store from '@/stores' +import type { App } from 'vue' + +export default (app: App) => { + app.use(store) +} diff --git a/src/install/plugins/router.ts b/src/install/plugins/router.ts new file mode 100644 index 0000000..475874e --- /dev/null +++ b/src/install/plugins/router.ts @@ -0,0 +1,8 @@ +import router from '@/router' +import { registerRouteGuard } from '@/router/guard' +import type { App } from 'vue' + +export default (app: App) => { + registerRouteGuard(router) + app.use(router) +} diff --git a/src/layout/components/footer.vue b/src/layout/components/footer.vue new file mode 100644 index 0000000..1a41561 --- /dev/null +++ b/src/layout/components/footer.vue @@ -0,0 +1,22 @@ + + + diff --git a/src/layout/default/components/header/breadcrumb.vue b/src/layout/default/components/header/breadcrumb.vue new file mode 100644 index 0000000..58c8ef2 --- /dev/null +++ b/src/layout/default/components/header/breadcrumb.vue @@ -0,0 +1,20 @@ + + diff --git a/src/layout/default/components/header/fold.vue b/src/layout/default/components/header/fold.vue new file mode 100644 index 0000000..7ce9360 --- /dev/null +++ b/src/layout/default/components/header/fold.vue @@ -0,0 +1,15 @@ + + + diff --git a/src/layout/default/components/header/full-screen.vue b/src/layout/default/components/header/full-screen.vue new file mode 100644 index 0000000..96cec1e --- /dev/null +++ b/src/layout/default/components/header/full-screen.vue @@ -0,0 +1,10 @@ + + + diff --git a/src/layout/default/components/header/index.vue b/src/layout/default/components/header/index.vue new file mode 100644 index 0000000..3f6d839 --- /dev/null +++ b/src/layout/default/components/header/index.vue @@ -0,0 +1,55 @@ + + + + + diff --git a/src/layout/default/components/header/multiple-tabs.vue b/src/layout/default/components/header/multiple-tabs.vue new file mode 100644 index 0000000..16a5d48 --- /dev/null +++ b/src/layout/default/components/header/multiple-tabs.vue @@ -0,0 +1,122 @@ + + + + diff --git a/src/layout/default/components/header/refresh.vue b/src/layout/default/components/header/refresh.vue new file mode 100644 index 0000000..a55ccba --- /dev/null +++ b/src/layout/default/components/header/refresh.vue @@ -0,0 +1,14 @@ + + + diff --git a/src/layout/default/components/header/user-drop-down.vue b/src/layout/default/components/header/user-drop-down.vue new file mode 100644 index 0000000..371bfda --- /dev/null +++ b/src/layout/default/components/header/user-drop-down.vue @@ -0,0 +1,42 @@ + + + diff --git a/src/layout/default/components/main.vue b/src/layout/default/components/main.vue new file mode 100644 index 0000000..b5386b3 --- /dev/null +++ b/src/layout/default/components/main.vue @@ -0,0 +1,26 @@ + + + + + diff --git a/src/layout/default/components/setting/drawer.vue b/src/layout/default/components/setting/drawer.vue new file mode 100644 index 0000000..efd08fd --- /dev/null +++ b/src/layout/default/components/setting/drawer.vue @@ -0,0 +1,220 @@ + + + + + diff --git a/src/layout/default/components/setting/index.vue b/src/layout/default/components/setting/index.vue new file mode 100644 index 0000000..d0f4957 --- /dev/null +++ b/src/layout/default/components/setting/index.vue @@ -0,0 +1,19 @@ + + + diff --git a/src/layout/default/components/sidebar/index.vue b/src/layout/default/components/sidebar/index.vue new file mode 100644 index 0000000..28413a0 --- /dev/null +++ b/src/layout/default/components/sidebar/index.vue @@ -0,0 +1,44 @@ + + + + + diff --git a/src/layout/default/components/sidebar/logo.vue b/src/layout/default/components/sidebar/logo.vue new file mode 100644 index 0000000..f1e8cb9 --- /dev/null +++ b/src/layout/default/components/sidebar/logo.vue @@ -0,0 +1,61 @@ + + + + diff --git a/src/layout/default/components/sidebar/menu-item.vue b/src/layout/default/components/sidebar/menu-item.vue new file mode 100644 index 0000000..09b46aa --- /dev/null +++ b/src/layout/default/components/sidebar/menu-item.vue @@ -0,0 +1,87 @@ + + + + diff --git a/src/layout/default/components/sidebar/menu.vue b/src/layout/default/components/sidebar/menu.vue new file mode 100644 index 0000000..a56a181 --- /dev/null +++ b/src/layout/default/components/sidebar/menu.vue @@ -0,0 +1,101 @@ + + + + + diff --git a/src/layout/default/components/sidebar/side.vue b/src/layout/default/components/sidebar/side.vue new file mode 100644 index 0000000..dc499e8 --- /dev/null +++ b/src/layout/default/components/sidebar/side.vue @@ -0,0 +1,66 @@ + + + + + diff --git a/src/layout/default/index.vue b/src/layout/default/index.vue new file mode 100644 index 0000000..ba6eb38 --- /dev/null +++ b/src/layout/default/index.vue @@ -0,0 +1,22 @@ + + + diff --git a/src/main.ts b/src/main.ts new file mode 100644 index 0000000..79cae31 --- /dev/null +++ b/src/main.ts @@ -0,0 +1,10 @@ +import { createApp } from 'vue' +import App from './App.vue' +import install from './install' +import './permission' +import './styles/index.scss' +import 'virtual:svg-icons-register' + +const app = createApp(App) +app.use(install) +app.mount('#app') diff --git a/src/permission.ts b/src/permission.ts new file mode 100644 index 0000000..decf89b --- /dev/null +++ b/src/permission.ts @@ -0,0 +1,83 @@ +/** + * 权限控制 + */ + +import NProgress from 'nprogress' +import router, { findFirstValidRoute } from './router' +import 'nprogress/nprogress.css' +import { isExternal } from './utils/validate' +import useUserStore from './stores/modules/user' +import { INDEX_ROUTE, INDEX_ROUTE_NAME } from './router/routes' +import { PageEnum } from './enums/pageEnum' +import useTabsStore from './stores/modules/multipleTabs' +import { clearAuthInfo } from './utils/auth' +import config from './config' + +// NProgress配置 +NProgress.configure({ showSpinner: false }) + +const loginPath = PageEnum.LOGIN +const defaultPath = PageEnum.INDEX +// 免登录白名单 +const whiteList: string[] = [PageEnum.LOGIN, PageEnum.ERROR_403] +router.beforeEach(async (to, from, next) => { + // 开始 Progress Bar + NProgress.start() + document.title = to.meta.title ?? config.title + const userStore = useUserStore() + const tabsStore = useTabsStore() + if (whiteList.includes(to.path)) { + // 在免登录白名单,直接进入 + next() + } else if (userStore.token) { + // 获取用户信息 + const hasGetUserInfo = Object.keys(userStore.userInfo).length !== 0 + if (hasGetUserInfo) { + if (to.path === loginPath) { + next({ path: defaultPath }) + } else { + next() + } + } else { + try { + await userStore.getUserInfo() + const routes = userStore.routes + // 找到第一个有效路由 + const routeName = findFirstValidRoute(routes) + // 没有有效路由跳转到403页面 + if (!routeName) { + clearAuthInfo() + next(PageEnum.ERROR_403) + return + } + tabsStore.setRouteName(routeName!) + INDEX_ROUTE.redirect = { name: routeName } + + // 动态添加index路由 + router.addRoute(INDEX_ROUTE) + routes.forEach((route: any) => { + // https 则不插入 + if (isExternal(route.path)) { + return + } + if (!route.children) { + router.addRoute(INDEX_ROUTE_NAME, route) + return + } + // 动态添加可访问路由表 + router.addRoute(route) + }) + next({ ...to, replace: true }) + } catch (err) { + clearAuthInfo() + next({ path: loginPath, query: { redirect: to.fullPath } }) + } + } + } else { + next({ path: loginPath, query: { redirect: to.fullPath } }) + } +}) + +router.afterEach(() => { + NProgress.done() +}) diff --git a/src/router/guard/index.ts b/src/router/guard/index.ts new file mode 100644 index 0000000..7662402 --- /dev/null +++ b/src/router/guard/index.ts @@ -0,0 +1,12 @@ +import type { Router } from 'vue-router' + +const modules = import.meta.glob('./*.ts', { eager: true }) + +export function registerRouteGuard(router: Router) { + Object.keys(modules).forEach((key) => { + const fn = (modules[key] as any).default + if (typeof fn === 'function') { + fn(router) + } + }) +} \ No newline at end of file diff --git a/src/router/guard/init.ts b/src/router/guard/init.ts new file mode 100644 index 0000000..9fd48d9 --- /dev/null +++ b/src/router/guard/init.ts @@ -0,0 +1,22 @@ +import useAppStore from '@/stores/modules/app' +import type { Router } from 'vue-router' + +export default function createInitGuard(router: Router) { + router.beforeEach(async () => { + const appStore = useAppStore() + if (Object.keys(appStore.config).length == 0) { + // 获取配置 + const data: any = await appStore.getConfig() + + // 设置网站logo + let favicon: HTMLLinkElement = document.querySelector('link[rel="icon"]')! + if (favicon) { + favicon.href = data.web_favicon + } + favicon = document.createElement('link') + favicon.rel = 'icon' + favicon.href = data.web_favicon + document.head.appendChild(favicon) + } + }) +} diff --git a/src/router/index.ts b/src/router/index.ts new file mode 100644 index 0000000..f9a9bde --- /dev/null +++ b/src/router/index.ts @@ -0,0 +1,110 @@ +import { createRouter, createWebHistory, RouterView, type RouteRecordRaw } from 'vue-router' +import { MenuEnum } from '@/enums/appEnums' +import { isExternal } from '@/utils/validate' +import { constantRoutes, INDEX_ROUTE_NAME, LAYOUT } from './routes' +import useUserStore from '@/stores/modules/user' + +// 匹配views里面所有的.vue文件,动态引入 +const modules = import.meta.glob('/src/views/**/*.vue') + +// +export function getModulesKey() { + return Object.keys(modules).map((item) => item.replace('/src/views/', '').replace('.vue', '')) +} + +// 过滤路由所需要的数据 +export function filterAsyncRoutes(routes: any[], firstRoute = true) { + return routes.map((route) => { + const routeRecord = createRouteRecord(route, firstRoute) + if (route.children != null && route.children && route.children.length) { + routeRecord.children = filterAsyncRoutes(route.children, false) + } + return routeRecord + }) +} + +// 创建一条路由记录 +export function createRouteRecord(route: any, firstRoute: boolean): RouteRecordRaw { + //@ts-ignore + const routeRecord: RouteRecordRaw = { + path: isExternal(route.paths) ? route.paths : firstRoute ? `/${route.paths}` : route.paths, + name: Symbol(route.paths), + meta: { + hidden: !route.is_show, + keepAlive: !!route.is_cache, + title: route.name, + perms: route.perms, + query: route.params, + icon: route.icon, + type: route.type, + activeMenu: route.selected + } + } + switch (route.type) { + case MenuEnum.CATALOGUE: + routeRecord.component = firstRoute ? LAYOUT : RouterView + if (!route.children) { + routeRecord.component = RouterView + } + break + case MenuEnum.MENU: + routeRecord.component = loadRouteView(route.component) + break + } + return routeRecord +} + +// 动态加载组件 +export function loadRouteView(component: string) { + try { + const key = Object.keys(modules).find((key) => { + return key.includes(`/${component}.vue`) + }) + if (key) { + return modules[key] + } + throw Error(`找不到组件${component},请确保组件路径正确`) + } catch (error) { + console.error(error) + return RouterView + } +} + +// 找到第一个有效的路由 +export function findFirstValidRoute(routes: RouteRecordRaw[]): string | undefined { + for (const route of routes) { + if (route.meta?.type == MenuEnum.MENU && !route.meta?.hidden && !isExternal(route.path)) { + return route.name as string + } + if (route.children) { + const name = findFirstValidRoute(route.children) + if (name) { + return name + } + } + } +} +//通过权限字符查询路由路径 +export function getRoutePath(perms: string) { + const routerObj = useRouter() || router + return routerObj.getRoutes().find((item) => item.meta?.perms == perms)?.path || '' +} + +// 重置路由 +export function resetRouter() { + router.removeRoute(INDEX_ROUTE_NAME) + const { routes } = useUserStore() + routes.forEach((route) => { + const name = route.name + if (name && router.hasRoute(name)) { + router.removeRoute(name) + } + }) +} + +const router = createRouter({ + history: createWebHistory(import.meta.env.BASE_URL), + routes: constantRoutes +}) + +export default router diff --git a/src/router/routes.ts b/src/router/routes.ts new file mode 100644 index 0000000..100d54c --- /dev/null +++ b/src/router/routes.ts @@ -0,0 +1,89 @@ +/** + * Note: 路由配置项 + * + * path: '/path' // 路由路径 + * name:'router-name' // 设定路由的名字,一定要填写不然使用时会出现各种问题 + * meta : { + title: 'title' // 设置该路由在侧边栏的名字 + icon: 'icon-name' // 设置该路由的图标 + activeMenu: '/system/user' // 当路由设置了该属性,则会高亮相对应的侧边栏。 + query: '{"id": 1}' // 访问路由的默认传递参数 + hidden: true // 当设置 true 的时候该路由不会在侧边栏出现 + hideTab: true //当设置 true 的时候该路由不会在多标签tab栏出现 + } + */ + +import type { RouteRecordRaw } from 'vue-router' +import { PageEnum } from '@/enums/pageEnum' +import Layout from '@/layout/default/index.vue' + +export const LAYOUT = () => Promise.resolve(Layout) + +export const INDEX_ROUTE_NAME = Symbol() + +export const constantRoutes: Array = [ + { + path: '/:pathMatch(.*)*', + component: () => import('@/views/error/404.vue') + }, + { + path: PageEnum.ERROR_403, + component: () => import('@/views/error/403.vue') + }, + { + path: PageEnum.LOGIN, + component: () => import('@/views/account/login.vue') + }, + { + path: '/user', + component: LAYOUT, + children: [ + { + path: 'setting', + component: () => import('@/views/user/setting.vue'), + name: Symbol(), + meta: { + title: '个人设置' + } + } + ] + }, + { + path: '/decoration/pc_details', + component: () => import('@/views/decoration/pc_details.vue') + } + // { + // path: '/dev_tools', + // component: LAYOUT, + // children: [ + // { + // path: 'code/edit', + // component: () => import('@/views/dev_tools/code/edit.vue'), + // meta: { + // title: '编辑数据表', + // activeMenu: '/dev_tools/code' + // } + // } + // ] + // }, + // { + // path: '/setting', + // component: LAYOUT, + // children: [ + // { + // path: 'dict/data', + // component: () => import('@/views/setting/dict/data/index.vue'), + // meta: { + // title: '数据管理', + // activeMenu: '/setting/dict' + // } + // } + // ] + // } +] + +export const INDEX_ROUTE: RouteRecordRaw = { + path: PageEnum.INDEX, + component: LAYOUT, + name: INDEX_ROUTE_NAME +} diff --git a/src/stores/index.ts b/src/stores/index.ts new file mode 100644 index 0000000..7c7ea69 --- /dev/null +++ b/src/stores/index.ts @@ -0,0 +1,3 @@ +import { createPinia } from 'pinia' +const store = createPinia() +export default store diff --git a/src/stores/modules/app.ts b/src/stores/modules/app.ts new file mode 100644 index 0000000..07ab422 --- /dev/null +++ b/src/stores/modules/app.ts @@ -0,0 +1,51 @@ +import { getConfig } from '@/api/app' +import { defineStore } from 'pinia' +interface AppSate { + config: Record + isMobile: boolean + isCollapsed: boolean + isRouteShow: boolean +} + +const useAppStore = defineStore({ + id: 'app', + state: (): AppSate => { + return { + config: {}, + isMobile: true, + isCollapsed: false, + isRouteShow: true + } + }, + actions: { + getImageUrl(url: string) { + return url.indexOf('http') ? `${this.config.oss_domain}${url}` : url + }, + getConfig() { + return new Promise((resolve, reject) => { + getConfig() + .then((data) => { + this.config = data + resolve(data) + }) + .catch((err) => { + reject(err) + }) + }) + }, + setMobile(value: boolean) { + this.isMobile = value + }, + toggleCollapsed(toggle?: boolean) { + this.isCollapsed = toggle ?? !this.isCollapsed + }, + refreshView() { + this.isRouteShow = false + nextTick(() => { + this.isRouteShow = true + }) + } + } +}) + +export default useAppStore diff --git a/src/stores/modules/multipleTabs.ts b/src/stores/modules/multipleTabs.ts new file mode 100644 index 0000000..5c60b03 --- /dev/null +++ b/src/stores/modules/multipleTabs.ts @@ -0,0 +1,169 @@ +import { defineStore } from 'pinia' +import { isExternal } from '@/utils/validate' +import type { + LocationQuery, + RouteLocationNormalized, + RouteParamsRaw, + Router, + RouteRecordName +} from 'vue-router' +import { PageEnum } from '@/enums/pageEnum' + +interface TabItem { + name: RouteRecordName + fullPath: string + path: string + title?: string + query?: LocationQuery + params?: RouteParamsRaw +} + +interface TabsSate { + cacheTabList: Set + tabList: TabItem[] + tasMap: Record + indexRouteName: RouteRecordName +} + +const getHasTabIndex = (fullPath: string, tabList: TabItem[]) => { + return tabList.findIndex((item) => item.fullPath == fullPath) +} + +const isCannotAddRoute = (route: RouteLocationNormalized, router: Router) => { + const { path, meta, name } = route + if (!path || isExternal(path)) return true + if (meta?.hideTab) return true + if (!router.hasRoute(name!)) return true + if (([PageEnum.LOGIN, PageEnum.ERROR_403] as string[]).includes(path)) { + return true + } + return false +} + +const findTabsIndex = (fullPath: string, tabList: TabItem[]) => { + return tabList.findIndex((item) => item.fullPath === fullPath) +} + +const getComponentName = (route: RouteLocationNormalized) => { + return route.matched.at(-1)?.components?.default?.name +} + +export const getRouteParams = (tabItem: TabItem) => { + const { params, path, query } = tabItem + return { + params: params || {}, + path, + query: query || {} + } +} + +const useTabsStore = defineStore({ + id: 'tabs', + state: (): TabsSate => ({ + cacheTabList: new Set(), + tabList: [], + tasMap: {}, + indexRouteName: '' + }), + getters: { + getTabList(): TabItem[] { + return this.tabList + }, + getCacheTabList(): string[] { + return Array.from(this.cacheTabList) + } + }, + actions: { + setRouteName(name: RouteRecordName) { + this.indexRouteName = name + }, + addCache(componentName?: string) { + if (componentName) this.cacheTabList.add(componentName) + }, + removeCache(componentName?: string) { + if (componentName && this.cacheTabList.has(componentName)) { + this.cacheTabList.delete(componentName) + } + }, + clearCache() { + this.cacheTabList.clear() + }, + resetState() { + this.cacheTabList = new Set() + this.tabList = [] + this.tasMap = {} + this.indexRouteName = '' + }, + addTab(router: Router) { + const route = unref(router.currentRoute) + const { name, query, meta, params, fullPath, path } = route + if (isCannotAddRoute(route, router)) return + const hasTabIndex = getHasTabIndex(fullPath!, this.tabList) + const componentName = getComponentName(route) + const tabItem = { + name: name!, + path, + fullPath, + title: meta?.title, + query, + params + } + this.tasMap[fullPath] = tabItem + if (meta?.keepAlive) { + console.log(componentName) + this.addCache(componentName) + } + if (hasTabIndex != -1) { + return + } + + this.tabList.push(tabItem) + }, + removeTab(fullPath: string, router: Router) { + const { currentRoute, push } = router + const index = findTabsIndex(fullPath, this.tabList) + // 移除tab + if (this.tabList.length > 1) { + index !== -1 && this.tabList.splice(index, 1) + } + const componentName = getComponentName(currentRoute.value) + this.removeCache(componentName) + if (fullPath !== currentRoute.value.fullPath) { + return + } + // 删除选中的tab + let toTab: TabItem | null = null + + if (index === 0) { + toTab = this.tabList[index] + } else { + toTab = this.tabList[index - 1] + } + + const toRoute = getRouteParams(toTab) + push(toRoute) + }, + removeOtherTab(route: RouteLocationNormalized) { + this.tabList = this.tabList.filter((item) => item.fullPath == route.fullPath) + const componentName = getComponentName(route) + this.cacheTabList.forEach((name) => { + if (componentName !== name) { + this.removeCache(name) + } + }) + }, + removeAllTab(router: Router) { + const { push, currentRoute } = router + const { name } = unref(currentRoute) + if (name == this.indexRouteName) { + this.removeOtherTab(currentRoute.value) + return + } + this.tabList = [] + this.clearCache() + push(PageEnum.INDEX) + } + } +}) + +export default useTabsStore diff --git a/src/stores/modules/setting.ts b/src/stores/modules/setting.ts new file mode 100644 index 0000000..219a58b --- /dev/null +++ b/src/stores/modules/setting.ts @@ -0,0 +1,55 @@ +import { defineStore } from 'pinia' +import defaultSetting from '@/config/setting' +import cache from '@/utils/cache' +import { isObject } from '@vue/shared' +import { setTheme } from '@/utils/theme' +import { SETTING_KEY } from '@/enums/cacheEnums' +const storageSetting = cache.get(SETTING_KEY) + +export const useSettingStore = defineStore({ + id: 'setting', + state: () => { + const state = { + showDrawer: false, + ...defaultSetting + } + isObject(storageSetting) && Object.assign(state, storageSetting) + return state + }, + actions: { + // 设置布局设置 + setSetting(data: Record) { + const { key, value } = data + if (this.hasOwnProperty(key)) { + //@ts-ignore + this[key] = value + } + const settings: any = Object.assign({}, this.$state) + delete settings.showDrawer + cache.set(SETTING_KEY, settings) + }, + // 设置主题色 + setTheme(isDark: boolean) { + setTheme( + { + primary: this.theme, + success: this.successTheme, + warning: this.warningTheme, + danger: this.dangerTheme, + error: this.errorTheme, + info: this.infoTheme + }, + isDark + ) + }, + resetTheme() { + for (const key in defaultSetting) { + //@ts-ignore + this[key] = defaultSetting[key] + } + cache.remove(SETTING_KEY) + } + } +}) + +export default useSettingStore diff --git a/src/stores/modules/user.ts b/src/stores/modules/user.ts new file mode 100644 index 0000000..27b4ebc --- /dev/null +++ b/src/stores/modules/user.ts @@ -0,0 +1,82 @@ +import { defineStore } from 'pinia' +import cache from '@/utils/cache' +import type { RouteRecordRaw } from 'vue-router' +import { getUserInfo, login, logout } from '@/api/user' +import router, { filterAsyncRoutes } from '@/router' +import { TOKEN_KEY } from '@/enums/cacheEnums' +import { PageEnum } from '@/enums/pageEnum' +import { clearAuthInfo, getToken } from '@/utils/auth' +export interface UserState { + token: string + userInfo: Record + routes: RouteRecordRaw[] + perms: string[] +} + +const useUserStore = defineStore({ + id: 'user', + state: (): UserState => ({ + token: getToken() || '', + // 用户信息 + userInfo: {}, + // 路由 + routes: [], + // 权限 + perms: [] + }), + getters: {}, + actions: { + resetState() { + this.token = '' + this.userInfo = {} + this.perms = [] + }, + login(playload: any) { + const { account, password } = playload + return new Promise((resolve, reject) => { + login({ + account: account.trim(), + password: password + }) + .then((data) => { + this.token = data.token + cache.set(TOKEN_KEY, data.token) + resolve(data) + }) + .catch((error) => { + reject(error) + }) + }) + }, + logout() { + return new Promise((resolve, reject) => { + logout() + .then(async (data) => { + this.token = '' + await router.push(PageEnum.LOGIN) + clearAuthInfo() + resolve(data) + }) + .catch((error) => { + reject(error) + }) + }) + }, + getUserInfo() { + return new Promise((resolve, reject) => { + getUserInfo() + .then((data) => { + this.userInfo = data.user + this.perms = data.permissions + this.routes = filterAsyncRoutes(data.menu) + resolve(data) + }) + .catch((error) => { + reject(error) + }) + }) + } + } +}) + +export default useUserStore diff --git a/src/styles/dark.css b/src/styles/dark.css new file mode 100644 index 0000000..ae969fd --- /dev/null +++ b/src/styles/dark.css @@ -0,0 +1,49 @@ +:root.dark { + color-scheme: dark; + --table-header-bg-color: var(--el-bg-color); + --el-bg-color-page: #0a0a0a; + --el-bg-color: #1d2124; + --el-bg-color-overlay: #1d1e1f; + --el-text-color-primary: #e5eaf3; + --el-text-color-regular: #cfd3dc; + --el-text-color-secondary: #a3a6ad; + --el-text-color-placeholder: #8d9095; + --el-text-color-disabled: #6c6e72; + --el-border-color-darker: #636466; + --el-border-color-dark: #58585b; + --el-border-color: #4c4d4f; + --el-border-color-light: #414243; + --el-border-color-lighter: #363637; + --el-border-color-extra-light: #2b2b2c; + --el-fill-color-darker: #424243; + --el-fill-color-dark: #39393a; + --el-fill-color: #303030; + --el-fill-color-light: #262727; + --el-fill-color-lighter: #1d1d1d; + --el-fill-color-extra-light: #191919; + --el-fill-color-blank: var(--el-bg-color); + --el-mask-color: rgba(0, 0, 0, 0.8); + --el-mask-color-extra-light: rgba(0, 0, 0, 0.3); + --el-box-shadow: 0px 12px 32px 4px rgba(0, 0, 0, 0.36), 0px 8px 20px rgba(0, 0, 0, 0.72); + --el-box-shadow-light: 0px 0px 12px rgba(0, 0, 0, 0.72); + --el-box-shadow-lighter: 0px 0px 6px rgba(0, 0, 0, 0.72); + --el-box-shadow-dark: 0px 16px 48px 16px rgba(0, 0, 0, 0.72), 0px 12px 32px #000000, + 0px 8px 16px -8px #000000 !important; + /* wangeditor主题 */ + --w-e-textarea-bg-color: var(--el-bg-color); + --w-e-textarea-color: var(--el-text-color-primary); + --w-e-textarea-border-color: var(--el-border-color); + --w-e-textarea-slight-border-color: var(--el-border-color-light); + --w-e-textarea-slight-color: var(--el-border-color); + --w-e-textarea-slight-bg-color: var(--el-bg-color-page); + /* --w-e-textarea-selected-border-color: #b4d5ff; + --w-e-textarea-handler-bg-color: #4290f7; */ + --w-e-toolbar-color: var(--el-text-color-primary); + --w-e-toolbar-bg-color: var(--el-bg-color); + --w-e-toolbar-active-color: var(--el-text-color-primary); + --w-e-toolbar-active-bg-color: var(--el-bg-color); + --w-e-toolbar-disabled-color: var(--el-text-color-disabled); + --w-e-toolbar-border-color: var(--el-border-color); + --w-e-modal-button-bg-color: var(--el-bg-color); + --w-e-modal-button-border-color: var(--el-border-color); +} diff --git a/src/styles/element.scss b/src/styles/element.scss new file mode 100644 index 0000000..a493e35 --- /dev/null +++ b/src/styles/element.scss @@ -0,0 +1,151 @@ +:root { + // 弹窗居中 + .el-overlay-dialog { + display: flex; + justify-content: center; + align-items: center; + min-height: 100%; + position: static; + + .el-dialog { + --el-dialog-content-font-size: var(--el-font-size-base); + --el-dialog-margin-top: 50px; + max-width: calc(100vw - 30px); + flex: none; + display: flex; + flex-direction: column; + border-radius: 5px; + + &.body-padding .el-dialog__body { + padding: 0; + } + + .el-dialog__body { + flex: 1; + padding: 15px 20px; + } + .el-dialog__header { + font-size: var(--el-font-size-large); + } + } + } + + .el-drawer { + --el-drawer-padding-primary: 16px; + &__header { + margin-bottom: 0; + padding: 13px 16px; + border-bottom: 1px solid var(--el-border-color-lighter); + } + &__title { + @apply text-tx-primary; + } + } + + .el-table { + --el-table-header-text-color: var(--el-text-color-primary); + --el-table-header-bg-color: var(--table-header-bg-color); + font-size: var(--el-font-size-base); + + thead { + th { + font-weight: 400; + } + } + } + + .el-input-group__prepend { + background-color: var(--el-fill-color-blank); + } + + .el-checkbox { + --el-checkbox-font-size: var(--el-font-size-base); + } + + .el-menu--popup-container { + &.theme-light { + .el-menu { + .el-menu-item { + &.is-active { + @apply bg-primary-light-9 border-primary border-r-2; + } + } + .el-menu-item:hover, + .el-sub-menu__title:hover { + color: var(--el-color-primary); + } + } + } + &.theme-dark { + .el-menu { + .el-menu-item { + &.is-active { + @apply bg-primary; + } + } + } + } + } + + .el-message-box { + --el-messagebox-width: 350px; + } + .el-date-editor { + --el-date-editor-datetimerange-width: 380px; + .el-range-input { + font-size: var(--el-font-size-small); + } + } + + .el-button--primary { + --el-button-hover-link-text-color: var(--el-color-primary-light-3); + } + .el-button--success { + --el-button-hover-link-text-color: var(--el-color-success-light-3); + } + .el-button--info { + --el-button-hover-link-text-color: var(--el-color-info-light-3); + } + .el-button--warning { + --el-button-hover-link-text-color: var(--el-color-warning-light-3); + } + .el-button--danger { + --el-button-hover-link-text-color: var(--el-color-danger-light-3); + } + .el-image__error { + font-size: 12px; + } + .el-tabs__nav-wrap::after { + height: 1px; + } + .el-page-header { + &__breadcrumb { + margin-bottom: 0; + } + } +} +@media (max-width: 768px) { + .el-pagination > .el-pagination__jump { + display: none !important; + } + .el-pagination > .el-pagination__sizes { + display: none !important; + } +} + +.el-button { + // 防止被tailwindcss默认样式覆盖 + background-color: var(--el-button-bg-color, var(--el-color-white)); + + //覆盖el-button的点击样式 + &:focus { + color: var(--el-button-text-color); + border-color: var(--el-button-border-color); + background-color: var(--el-button-bg-color); + } + &:hover { + color: var(--el-button-hover-text-color); + border-color: var(--el-button-hover-border-color); + background-color: var(--el-button-hover-bg-color); + } +} diff --git a/src/styles/index.scss b/src/styles/index.scss new file mode 100644 index 0000000..7bd1726 --- /dev/null +++ b/src/styles/index.scss @@ -0,0 +1,6 @@ + +@import 'element.scss'; +@import 'dark.css'; +@import 'var.css'; +@import 'tailwind.css'; +@import 'public.scss'; diff --git a/src/styles/public.scss b/src/styles/public.scss new file mode 100644 index 0000000..a11a8bd --- /dev/null +++ b/src/styles/public.scss @@ -0,0 +1,18 @@ +body { + @apply text-base text-tx-primary overflow-hidden min-w-[375px]; +} +.form-tips { + @apply text-tx-secondary text-xs leading-6 mt-1; +} + +.clearfix:after { + content: ''; + display: block; + clear: both; + visibility: hidden; +} + +/* NProgress */ +#nprogress .bar { + @apply bg-primary #{!important}; +} diff --git a/src/styles/tailwind.css b/src/styles/tailwind.css new file mode 100644 index 0000000..bd6213e --- /dev/null +++ b/src/styles/tailwind.css @@ -0,0 +1,3 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; \ No newline at end of file diff --git a/src/styles/var.css b/src/styles/var.css new file mode 100644 index 0000000..a10631a --- /dev/null +++ b/src/styles/var.css @@ -0,0 +1,48 @@ +:root { + --el-font-family: theme(fontFamily.sans); + --el-font-weight-primary: 400; + --el-menu-item-height: 46px; + --el-menu-sub-item-height: var(--el-menu-item-height); + --el-menu-icon-width: 18px; + --aside-width: 200px; + --navbar-height: 50px; + --color-white: #ffffff; + --table-header-bg-color: #f8f8f8; + --el-font-size-extra-large: 18px; + --el-menu-base-level-padding: 16px; + --el-menu-level-padding: 26px; + --el-font-size-large: 16px; + --el-font-size-medium: 15px; + --el-font-size-base: 14px; + --el-font-size-small: 13px; + --el-font-size-extra-small: 12px; + + --el-bg-color: var(--color-white); + --el-bg-color-page: #f6f6f6; + --el-bg-color-overlay: #ffffff; + --el-text-color-primary: #333333; + --el-text-color-regular: #666666; + --el-text-color-secondary: #999999; + --el-text-color-placeholder: #a8abb2; + --el-text-color-disabled: #c0c4cc; + --el-border-color: #dcdfe6; + --el-border-color-light: #e4e7ed; + --el-border-color-lighter: #ebeef5; + --el-border-color-extra-light: #f2f2f2; + --el-border-color-dark: #d4d7de; + --el-border-color-darker: #cdd0d6; + --el-fill-color: #f0f2f5; + --el-fill-color-light: #f8f8f8; + --el-fill-color-lighter: #fafafa; + --el-fill-color-extra-light: #fafcff; + --el-fill-color-dark: #ebedf0; + --el-fill-color-darker: #e6e8eb; + --el-fill-color-blank: #ffffff; + --el-mask-color: rgba(255, 255, 255, 0.9); + --el-mask-color-extra-light: rgba(255, 255, 255, 0.3); + -el-box-shadow: 0px 12px 32px 4px rgba(0, 0, 0, 0.04), 0px 8px 20px rgba(0, 0, 0, 0.08); + --el-box-shadow-light: 0px 0px 12px rgba(0, 0, 0, 0.12); + --el-box-shadow-lighter: 0px 0px 6px rgba(0, 0, 0, 0.12); + --el-box-shadow-dark: 0px 16px 48px 16px rgba(0, 0, 0, 0.08), 0px 12px 32px rgba(0, 0, 0, 0.12), + 0px 8px 16px -8px rgba(0, 0, 0, 0.16); +} diff --git a/src/utils/auth.ts b/src/utils/auth.ts new file mode 100644 index 0000000..abc6f92 --- /dev/null +++ b/src/utils/auth.ts @@ -0,0 +1,18 @@ +import { TOKEN_KEY } from '@/enums/cacheEnums' +import { resetRouter } from '@/router' +import useTabsStore from '@/stores/modules/multipleTabs' +import useUserStore from '@/stores/modules/user' +import cache from './cache' + +export function getToken() { + return cache.get(TOKEN_KEY) +} + +export function clearAuthInfo() { + const userStore = useUserStore() + const tabsStore = useTabsStore() + userStore.resetState() + tabsStore.resetState() + cache.remove(TOKEN_KEY) + resetRouter() +} diff --git a/src/utils/cache.ts b/src/utils/cache.ts new file mode 100644 index 0000000..e16973f --- /dev/null +++ b/src/utils/cache.ts @@ -0,0 +1,53 @@ +const cache = { + key: 'like_admin_', + //设置缓存(expire为缓存时效) + set(key: string, value: any, expire?: string) { + key = this.getKey(key) + let data: any = { + expire: expire ? this.time() + expire : '', + value + } + + if (typeof data === 'object') { + data = JSON.stringify(data) + } + try { + window.localStorage.setItem(key, data) + } catch (e) { + return null + } + }, + get(key: string) { + key = this.getKey(key) + try { + const data = window.localStorage.getItem(key) + if (!data) { + return null + } + const { value, expire } = JSON.parse(data) + if (expire && expire < this.time()) { + window.localStorage.removeItem(key) + return null + } + return value + } catch (e) { + return null + } + }, + //获取当前时间 + time() { + return Math.round(new Date().getTime() / 1000) + }, + remove(key: string) { + key = this.getKey(key) + window.localStorage.removeItem(key) + }, + clear() { + window.localStorage.clear() + }, + getKey(key: string) { + return this.key + key + } +} + +export default cache diff --git a/src/utils/env.ts b/src/utils/env.ts new file mode 100644 index 0000000..d8951e9 --- /dev/null +++ b/src/utils/env.ts @@ -0,0 +1,13 @@ +/** + * @description: 开发模式 + */ +export function isDevMode(): boolean { + return import.meta.env.DEV +} + +/** + * @description: 生成模式 + */ +export function isProdMode(): boolean { + return import.meta.env.PROD +} diff --git a/src/utils/feedback.ts b/src/utils/feedback.ts new file mode 100644 index 0000000..91672ab --- /dev/null +++ b/src/utils/feedback.ts @@ -0,0 +1,95 @@ +import { + ElMessage, + ElMessageBox, + ElNotification, + ElLoading, + type ElMessageBoxOptions +} from 'element-plus' +import type { LoadingInstance } from 'element-plus/es/components/loading/src/loading' + +export class Feedback { + private loadingInstance: LoadingInstance | null = null + static instance: Feedback | null = null + static getInstance() { + return this.instance ?? (this.instance = new Feedback()) + } + // 消息提示 + msg(msg: string) { + ElMessage.info(msg) + } + // 错误消息 + msgError(msg: string) { + ElMessage.error(msg) + } + // 成功消息 + msgSuccess(msg: string) { + ElMessage.success(msg) + } + // 警告消息 + msgWarning(msg: string) { + ElMessage.warning(msg) + } + // 弹出提示 + alert(msg: string) { + ElMessageBox.alert(msg, '系统提示') + } + // 错误提示 + alertError(msg: string) { + ElMessageBox.alert(msg, '系统提示', { type: 'error' }) + } + // 成功提示 + alertSuccess(msg: string) { + ElMessageBox.alert(msg, '系统提示', { type: 'success' }) + } + // 警告提示 + alertWarning(msg: string) { + ElMessageBox.alert(msg, '系统提示', { type: 'warning' }) + } + // 通知提示 + notify(msg: string) { + ElNotification.info(msg) + } + // 错误通知 + notifyError(msg: string) { + ElNotification.error(msg) + } + // 成功通知 + notifySuccess(msg: string) { + ElNotification.success(msg) + } + // 警告通知 + notifyWarning(msg: string) { + ElNotification.warning(msg) + } + // 确认窗体 + confirm(msg: string) { + return ElMessageBox.confirm(msg, '温馨提示', { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning' + }) + } + // 提交内容 + prompt(content: string, title: string, options?: ElMessageBoxOptions) { + return ElMessageBox.prompt(content, title, { + confirmButtonText: '确定', + cancelButtonText: '取消', + ...options + }) + } + // 打开全局loading + loading(msg: string) { + this.loadingInstance = ElLoading.service({ + lock: true, + text: msg + }) + } + // 关闭全局loading + closeLoading() { + this.loadingInstance?.close() + } +} + +const feedback = Feedback.getInstance() + +export default feedback diff --git a/src/utils/request/axios.ts b/src/utils/request/axios.ts new file mode 100644 index 0000000..65703e0 --- /dev/null +++ b/src/utils/request/axios.ts @@ -0,0 +1,165 @@ +import { RequestMethodsEnum } from '@/enums/requestEnums' +import axios, { + AxiosError, + type AxiosInstance, + type AxiosRequestConfig, + type AxiosResponse +} from 'axios' +import { isFunction, merge, cloneDeep } from 'lodash' +import axiosCancel from './cancel' +import type { RequestData, RequestOptions } from './type' + +export class Axios { + private axiosInstance: AxiosInstance + private readonly config: AxiosRequestConfig + private readonly options: RequestOptions + constructor(config: AxiosRequestConfig) { + this.config = config + this.options = config.requestOptions + this.axiosInstance = axios.create(config) + this.setupInterceptors() + } + + /** + * @description 获取axios实例 + */ + getAxiosInstance() { + return this.axiosInstance + } + + /** + * @description 设置拦截器 + */ + setupInterceptors() { + if (!this.config.axiosHooks) { + return + } + const { + requestInterceptorsHook, + requestInterceptorsCatchHook, + responseInterceptorsHook, + responseInterceptorsCatchHook + } = this.config.axiosHooks + this.axiosInstance.interceptors.request.use( + (config) => { + this.addCancelToken(config) + if (isFunction(requestInterceptorsHook)) { + config = requestInterceptorsHook(config) + } + return config + }, + (err: Error) => { + if (isFunction(requestInterceptorsCatchHook)) { + requestInterceptorsCatchHook(err) + } + return err + } + ) + this.axiosInstance.interceptors.response.use( + (response: AxiosResponse) => { + this.removeCancelToken(response.config.url!) + if (isFunction(responseInterceptorsHook)) { + response = responseInterceptorsHook(response) + } + return response + }, + (err: AxiosError) => { + if (isFunction(responseInterceptorsCatchHook)) { + responseInterceptorsCatchHook(err) + } + if (err.code != AxiosError.ERR_CANCELED) { + this.removeCancelToken(err.config?.url!) + } + + if (err.code == AxiosError.ECONNABORTED || err.code == AxiosError.ERR_NETWORK) { + return new Promise((resolve) => setTimeout(resolve, 500)).then(() => + this.retryRequest(err) + ) + } + return Promise.reject(err) + } + ) + } + + /** + * @description 添加CancelToken + */ + addCancelToken(config: AxiosRequestConfig) { + const { ignoreCancelToken } = config.requestOptions + !ignoreCancelToken && axiosCancel.add(config) + } + + /** + * @description 移除CancelToken + */ + removeCancelToken(url: string) { + axiosCancel.remove(url) + } + + /** + * @description 重新请求 + */ + retryRequest(error: AxiosError) { + const config = error.config + const { retryCount, isOpenRetry } = config.requestOptions + if (!isOpenRetry || config.method?.toUpperCase() == RequestMethodsEnum.POST) { + return Promise.reject(error) + } + config.retryCount = config.retryCount ?? 0 + + if (config.retryCount >= retryCount) { + return Promise.reject(error) + } + config.retryCount++ + + return this.axiosInstance.request(config) + } + /** + * @description get请求 + */ + get( + config: Partial, + options?: Partial + ): Promise { + return this.request({ ...config, method: RequestMethodsEnum.GET }, options) + } + + /** + * @description post请求 + */ + post( + config: Partial, + options?: Partial + ): Promise { + return this.request({ ...config, method: RequestMethodsEnum.POST }, options) + } + + /** + * @description 请求函数 + */ + request( + config: Partial, + options?: Partial + ): Promise { + const opt: RequestOptions = merge({}, this.options, options) + const axioxConfig: AxiosRequestConfig = { + ...cloneDeep(config), + requestOptions: opt + } + const { urlPrefix } = opt + // 拼接请求前缀如api + if (urlPrefix) { + axioxConfig.url = `${urlPrefix}${config.url}` + } + return new Promise((resolve, reject) => { + this.axiosInstance + .request>>(axioxConfig) + .then((res) => { + resolve(res) + }) + .catch((err) => { + reject(err) + }) + }) + } +} diff --git a/src/utils/request/cancel.ts b/src/utils/request/cancel.ts new file mode 100644 index 0000000..00edb5d --- /dev/null +++ b/src/utils/request/cancel.ts @@ -0,0 +1,37 @@ +import axios, { type AxiosRequestConfig, type Canceler } from 'axios' + +const cancelerMap = new Map() + +// 获取一个唯一的请求键,它由请求的 URL 和参数组成 +function getRequestKey(config: AxiosRequestConfig): string { + const { url, method, params, data } = config + return [method, url, JSON.stringify(params), JSON.stringify(data)].join("&") +} + +export class AxiosCancel { + private static instance?: AxiosCancel + + static createInstance() { + return this.instance ?? (this.instance = new AxiosCancel()) + } + add(config: AxiosRequestConfig) { + const requestKey = getRequestKey(config) + this.remove(requestKey) + config.cancelToken = new axios.CancelToken((cancel) => { + if (!cancelerMap.has(requestKey)) { + cancelerMap.set(requestKey, cancel) + } + }) + } + remove(requestKey: string) { + if (cancelerMap.has(requestKey)) { + const cancel = cancelerMap.get(requestKey) + cancel && cancel(requestKey) + cancelerMap.delete(requestKey) + } + } +} + +const axiosCancel = AxiosCancel.createInstance() + +export default axiosCancel diff --git a/src/utils/request/index.ts b/src/utils/request/index.ts new file mode 100644 index 0000000..e66915d --- /dev/null +++ b/src/utils/request/index.ts @@ -0,0 +1,123 @@ +import { merge } from 'lodash' +import configs from '@/config' +import { Axios } from './axios' +import { ContentTypeEnum, RequestCodeEnum, RequestMethodsEnum } from '@/enums/requestEnums' +import type { AxiosHooks } from './type' +import { clearAuthInfo, getToken } from '../auth' +import feedback from '../feedback' +import NProgress from 'nprogress' +import { AxiosError, type AxiosRequestConfig } from 'axios' +import router from '@/router' +import { PageEnum } from '@/enums/pageEnum' + +// 处理axios的钩子函数 +const axiosHooks: AxiosHooks = { + requestInterceptorsHook(config) { + NProgress.start() + const { withToken, isParamsToData } = config.requestOptions + const params = config.params || {} + const headers = config.headers || {} + + // 添加token + if (withToken) { + const token = getToken() + headers.token = token + } + // POST请求下如果无data,则将params视为data + if ( + isParamsToData && + !Reflect.has(config, 'data') && + config.method?.toUpperCase() === RequestMethodsEnum.POST + ) { + config.data = params + config.params = {} + } + config.headers = headers + return config + }, + requestInterceptorsCatchHook(err) { + NProgress.done() + return err + }, + async responseInterceptorsHook(response) { + NProgress.done() + const { isTransformResponse, isReturnDefaultResponse } = response.config.requestOptions + + //返回默认响应,当需要获取响应头及其他数据时可使用 + if (isReturnDefaultResponse) { + return response + } + // 是否需要对数据进行处理 + if (!isTransformResponse) { + return response.data + } + const { code, data, show, msg } = response.data + switch (code) { + case RequestCodeEnum.SUCCESS: + if (show) { + msg && feedback.msgSuccess(msg) + } + return data + case RequestCodeEnum.FAIL: + if (show) { + msg && feedback.msgError(msg) + } + return Promise.reject(data) + case RequestCodeEnum.LOGIN_FAILURE: + clearAuthInfo() + router.push(PageEnum.LOGIN) + return Promise.reject() + case RequestCodeEnum.OPEN_NEW_PAGE: + window.location.href = data.url + return data + default: + return data + } + }, + responseInterceptorsCatchHook(error) { + NProgress.done() + if (error.code !== AxiosError.ERR_CANCELED) { + error.message && feedback.msgError(error.message) + } + return Promise.reject(error) + } +} + +const defaultOptions: AxiosRequestConfig = { + //接口超时时间 + timeout: configs.timeout, + // 基础接口地址 + baseURL: configs.baseUrl, + //请求头 + headers: { 'Content-Type': ContentTypeEnum.JSON, version: configs.version }, + // 处理 axios的钩子函数 + axiosHooks: axiosHooks, + // 每个接口可以单独配置 + requestOptions: { + // 是否将params视为data参数,仅限post请求 + isParamsToData: true, + //是否返回默认的响应 + isReturnDefaultResponse: false, + // 需要对返回数据进行处理 + isTransformResponse: true, + // 接口拼接地址 + urlPrefix: configs.urlPrefix, + // 忽略重复请求 + ignoreCancelToken: false, + // 是否携带token + withToken: true, + // 开启请求超时重新发起请求请求机制 + isOpenRetry: true, + // 重新请求次数 + retryCount: 2 + } +} + +function createAxios(opt?: Partial) { + return new Axios( + // 深度合并 + merge(defaultOptions, opt || {}) + ) +} +const request = createAxios() +export default request diff --git a/src/utils/request/type.d.ts b/src/utils/request/type.d.ts new file mode 100644 index 0000000..a7f364d --- /dev/null +++ b/src/utils/request/type.d.ts @@ -0,0 +1,38 @@ +import type { AxiosRequestConfig, AxiosResponse } from 'axios' + +import 'axios' +declare module 'axios' { + // 扩展 RouteMeta + interface AxiosRequestConfig { + retryCount?: number + axiosHooks?: AxiosHooks + requestOptions: RequestOptions + } +} + +export interface RequestOptions { + isParamsToData: boolean + isReturnDefaultResponse: boolean + isTransformResponse: boolean + urlPrefix: string + ignoreCancelToken: boolean + withToken: boolean + isOpenRetry: boolean + retryCount: number +} + +export interface AxiosHooks { + requestInterceptorsHook?: (config: AxiosRequestConfig) => AxiosRequestConfig + requestInterceptorsCatchHook?: (error: Error) => void + responseInterceptorsHook?: ( + response: AxiosResponse> + ) => AxiosResponse | RequestData | T + responseInterceptorsCatchHook?: (error: AxiosError) => void +} + +export interface RequestData { + code: number + data: T + msg: string + show: boolean +} diff --git a/src/utils/theme.ts b/src/utils/theme.ts new file mode 100644 index 0000000..d11fe18 --- /dev/null +++ b/src/utils/theme.ts @@ -0,0 +1,74 @@ +import colors from 'css-color-function' +const lightConfig = { + 'dark-2': 'shade(20%)', + 'light-3': 'tint(30%)', + 'light-5': 'tint(50%)', + 'light-7': 'tint(70%)', + 'light-8': 'tint(80%)', + 'light-9': 'tint(90%)' +} + +const darkConfig = { + 'light-3': 'shade(20%)', + 'light-5': 'shade(30%)', + 'light-7': 'shade(50%)', + 'light-8': 'shade(60%)', + 'light-9': 'shade(70%)', + 'dark-2': 'tint(20%)' +} + +const themeId = 'theme-vars' + +/** + * @author Jason + * @description 用于生成elementui主题的行为变量 + * 可选值有primary、success、warning、danger、error、info + */ + +export const generateVars = (color: string, type = 'primary', isDark = false) => { + const colos = { + [`--el-color-${type}`]: color + } + const config: Record = isDark ? darkConfig : lightConfig + for (const key in config) { + colos[`--el-color-${type}-${key}`] = `color(${color} ${config[key]})` + } + return colos +} + +/** + * @author Jason + * @description 用于设置css变量 + * @param key css变量key 如 --color-primary + * @param value css变量值 如 #f40 + * @param dom dom元素 + */ +export const setCssVar = (key: string, value: string, dom = document.documentElement) => { + dom.style.setProperty(key, value) +} + +/** + * @author Jason + * @description 设置主题 + */ +export const setTheme = (options: Record, isDark = false) => { + const varsMap: Record = Object.keys(options).reduce((prev, key) => { + return Object.assign(prev, generateVars(options[key], key, isDark)) + }, {}) + + let theme = Object.keys(varsMap).reduce((prev, key) => { + const color = colors.convert(varsMap[key]) + return `${prev}${key}:${color};` + }, '') + theme = `:root{${theme}}` + let style = document.getElementById(themeId) + if (style) { + style.innerHTML = theme + return + } + style = document.createElement('style') + style.setAttribute('type', 'text/css') + style.setAttribute('id', themeId) + style.innerHTML = theme + document.head.append(style) +} diff --git a/src/utils/util.ts b/src/utils/util.ts new file mode 100644 index 0000000..57d9ab6 --- /dev/null +++ b/src/utils/util.ts @@ -0,0 +1,162 @@ +import { isObject } from '@vue/shared' +import { cloneDeep } from 'lodash' + +/** + * @description 添加单位 + * @param {String | Number} value 值 100 + * @param {String} unit 单位 px em rem + */ +export const addUnit = (value: string | number, unit = 'px') => { + return !Object.is(Number(value), NaN) ? `${value}${unit}` : value +} + +/** + * @description 添加单位 + * @param {unknown} value + * @return {Boolean} + */ +export const isEmpty = (value: unknown) => { + return value == null && typeof value == 'undefined' +} + +/** + * @description 树转数组,队列实现广度优先遍历 + * @param {Array} data 数据 + * @param {Object} props `{ children: 'children' }` + */ + +export const treeToArray = (data: any[], props = { children: 'children' }) => { + data = cloneDeep(data) + const { children } = props + const newData = [] + const queue: any[] = [] + data.forEach((child: any) => queue.push(child)) + while (queue.length) { + const item: any = queue.shift() + if (item[children]) { + item[children].forEach((child: any) => queue.push(child)) + delete item[children] + } + newData.push(item) + } + return newData +} + +/** + * @description 数组转 + * @param {Array} data 数据 + * @param {Object} props `{ parent: 'pid', children: 'children' }` + */ + +export const arrayToTree = ( + data: any[], + props = { id: 'id', parentId: 'pid', children: 'children' } +) => { + data = cloneDeep(data) + const { id, parentId, children } = props + const result: any[] = [] + const map = new Map() + data.forEach((item) => { + map.set(item[id], item) + const parent = map.get(item[parentId]) + if (parent) { + parent[children] = parent[children] ?? [] + parent[children].push(item) + } else { + result.push(item) + } + }) + return result +} + +/** + * @description 获取正确的路经 + * @param {String} path 数据 + */ +export function getNormalPath(path: string) { + if (path.length === 0 || !path || path == 'undefined') { + return path + } + const newPath = path.replace('//', '/') + const length = newPath.length + if (newPath[length - 1] === '/') { + return newPath.slice(0, length - 1) + } + return newPath +} + +/** + * @description对象格式化为Query语法 + * @param { Object } params + * @return {string} Query语法 + */ +export function objectToQuery(params: Record): string { + let query = '' + for (const props of Object.keys(params)) { + const value = params[props] + const part = encodeURIComponent(props) + '=' + if (!isEmpty(value)) { + if (isObject(value)) { + for (const key of Object.keys(value)) { + if (!isEmpty(value[key])) { + const params = props + '[' + key + ']' + const subPart = encodeURIComponent(params) + '=' + query += subPart + encodeURIComponent(value[key]) + '&' + } + } + } else { + query += part + encodeURIComponent(value) + '&' + } + } + } + return query.slice(0, -1) +} + +/** + * @description 时间格式化 + * @param dateTime { number } 时间戳 + * @param fmt { string } 时间格式 + * @return { string } + */ +// yyyy:mm:dd|yyyy:mm|yyyy年mm月dd日|yyyy年mm月dd日 hh时MM分等,可自定义组合 +export const timeFormat = (dateTime: number, fmt = 'yyyy-mm-dd') => { + // 如果为null,则格式化当前时间 + if (!dateTime) { + dateTime = Number(new Date()) + } + // 如果dateTime长度为10或者13,则为秒和毫秒的时间戳,如果超过13位,则为其他的时间格式 + if (dateTime.toString().length == 10) { + dateTime *= 1000 + } + const date = new Date(dateTime) + let ret + const opt: any = { + 'y+': date.getFullYear().toString(), // 年 + 'm+': (date.getMonth() + 1).toString(), // 月 + 'd+': date.getDate().toString(), // 日 + 'h+': date.getHours().toString(), // 时 + 'M+': date.getMinutes().toString(), // 分 + 's+': date.getSeconds().toString() // 秒 + } + for (const k in opt) { + ret = new RegExp('(' + k + ')').exec(fmt) + if (ret) { + fmt = fmt.replace( + ret[1], + ret[1].length == 1 ? opt[k] : opt[k].padStart(ret[1].length, '0') + ) + } + } + return fmt +} + +/** + * @description 获取不重复的id + * @param length { Number } id的长度 + * @return { String } id + */ +export const getNonDuplicateID = (length = 8) => { + let idStr = Date.now().toString(36) + idStr += Math.random().toString(36).substring(3, length) + return idStr +} diff --git a/src/utils/validate.ts b/src/utils/validate.ts new file mode 100644 index 0000000..0f8d8f1 --- /dev/null +++ b/src/utils/validate.ts @@ -0,0 +1,7 @@ +/** + * @param {string} path + * @returns {Boolean} + */ +export function isExternal(path: string) { + return /^(https?:|mailto:|tel:)/.test(path) +} diff --git a/src/views/account/images/login_bg.png b/src/views/account/images/login_bg.png new file mode 100644 index 0000000..787837a Binary files /dev/null and b/src/views/account/images/login_bg.png differ diff --git a/src/views/account/login.vue b/src/views/account/login.vue new file mode 100644 index 0000000..74b1aeb --- /dev/null +++ b/src/views/account/login.vue @@ -0,0 +1,130 @@ + + + + + diff --git a/src/views/app/recharge/index.vue b/src/views/app/recharge/index.vue new file mode 100644 index 0000000..aad882f --- /dev/null +++ b/src/views/app/recharge/index.vue @@ -0,0 +1,52 @@ + + diff --git a/src/views/article/column/edit.vue b/src/views/article/column/edit.vue new file mode 100644 index 0000000..b0727ab --- /dev/null +++ b/src/views/article/column/edit.vue @@ -0,0 +1,93 @@ + + diff --git a/src/views/article/column/index.vue b/src/views/article/column/index.vue new file mode 100644 index 0000000..3f15093 --- /dev/null +++ b/src/views/article/column/index.vue @@ -0,0 +1,108 @@ + + diff --git a/src/views/article/lists/edit.vue b/src/views/article/lists/edit.vue new file mode 100644 index 0000000..27ab1ab --- /dev/null +++ b/src/views/article/lists/edit.vue @@ -0,0 +1,173 @@ + + + diff --git a/src/views/article/lists/index.vue b/src/views/article/lists/index.vue new file mode 100644 index 0000000..23ba5b8 --- /dev/null +++ b/src/views/article/lists/index.vue @@ -0,0 +1,170 @@ + + diff --git a/src/views/channel/h5.vue b/src/views/channel/h5.vue new file mode 100644 index 0000000..ec92552 --- /dev/null +++ b/src/views/channel/h5.vue @@ -0,0 +1,65 @@ + + diff --git a/src/views/channel/open_setting.vue b/src/views/channel/open_setting.vue new file mode 100644 index 0000000..5b99d4c --- /dev/null +++ b/src/views/channel/open_setting.vue @@ -0,0 +1,75 @@ + + diff --git a/src/views/channel/weapp.vue b/src/views/channel/weapp.vue new file mode 100644 index 0000000..d3a436e --- /dev/null +++ b/src/views/channel/weapp.vue @@ -0,0 +1,198 @@ + + diff --git a/src/views/channel/wx_oa/config.vue b/src/views/channel/wx_oa/config.vue new file mode 100644 index 0000000..ed7b6f5 --- /dev/null +++ b/src/views/channel/wx_oa/config.vue @@ -0,0 +1,215 @@ + + diff --git a/src/views/channel/wx_oa/menu.vue b/src/views/channel/wx_oa/menu.vue new file mode 100644 index 0000000..9adb884 --- /dev/null +++ b/src/views/channel/wx_oa/menu.vue @@ -0,0 +1,47 @@ + + + + + diff --git a/src/views/channel/wx_oa/menu_com/oa-attr.vue b/src/views/channel/wx_oa/menu_com/oa-attr.vue new file mode 100644 index 0000000..2e8a024 --- /dev/null +++ b/src/views/channel/wx_oa/menu_com/oa-attr.vue @@ -0,0 +1,90 @@ + + + + + diff --git a/src/views/channel/wx_oa/menu_com/oa-menu-form-edit.vue b/src/views/channel/wx_oa/menu_com/oa-menu-form-edit.vue new file mode 100644 index 0000000..a455134 --- /dev/null +++ b/src/views/channel/wx_oa/menu_com/oa-menu-form-edit.vue @@ -0,0 +1,73 @@ + + + diff --git a/src/views/channel/wx_oa/menu_com/oa-menu-form.vue b/src/views/channel/wx_oa/menu_com/oa-menu-form.vue new file mode 100644 index 0000000..3e456a6 --- /dev/null +++ b/src/views/channel/wx_oa/menu_com/oa-menu-form.vue @@ -0,0 +1,108 @@ + + + diff --git a/src/views/channel/wx_oa/menu_com/oa-phone.vue b/src/views/channel/wx_oa/menu_com/oa-phone.vue new file mode 100644 index 0000000..0d82849 --- /dev/null +++ b/src/views/channel/wx_oa/menu_com/oa-phone.vue @@ -0,0 +1,121 @@ + + + + + diff --git a/src/views/channel/wx_oa/menu_com/useMenuOa.ts b/src/views/channel/wx_oa/menu_com/useMenuOa.ts new file mode 100644 index 0000000..e536e1d --- /dev/null +++ b/src/views/channel/wx_oa/menu_com/useMenuOa.ts @@ -0,0 +1,165 @@ +import { ref } from 'vue' +import feedback from '@/utils/feedback' +import type { FormRules } from 'element-plus' +import { setOaMenuSave, getOaMenu, setOaMenuPublish } from '@/api/channel/wx_oa' +import type { Menu } from '@/api/channel/wx_oa' + +// 菜单实例 +export const menuRef = shallowRef() +// 菜单数据 +const menuList = ref([]) +const menuIndex = ref(0) + +// 校验 +export const rules = reactive({ + name: [ + { + required: true, + message: '必填项不能为空', + trigger: ['blur', 'change'] + }, + { + min: 1, + max: 12, + message: '长度限制12个字符', + trigger: ['blur', 'change'] + } + ], + menuType: [ + { + required: true, + message: '必填项不能为空', + trigger: ['blur', 'change'] + } + ], + visitType: [ + { + required: true, + message: '必填项不能为空', + trigger: ['blur', 'change'] + } + ], + url: [ + { + required: true, + message: '必填项不能为空', + trigger: ['blur', 'change'] + }, + { + pattern: + /(http|https):\/\/[\w\-_]+(\.[\w\-_]+)+([\w\-\.,@?^=%&:/~\+#]*[\w\-\@?^=%&/~\+#])?/, + message: '请输入合法的网址链接', + trigger: ['blur', 'change'] + } + ], + appId: [ + { + required: true, + message: '必填项不能为空', + trigger: ['blur', 'change'] + } + ], + pagePath: [ + { + required: true, + message: '必填项不能为空', + trigger: ['blur', 'change'] + } + ] +}) + +export const useMenuOa = (ref: any) => { + if (ref) menuRef.value = ref + + // 添加主菜单 + const handleAddMenu = () => { + menuList.value.push({ + name: '菜单名称', + has_menu: false, + type: 'view', + url: '', + appid: '', + pagepath: '', + sub_button: [] + }) + } + + // 添加子菜单 + const handleAddSubMenu = (event?: Menu) => { + const index = menuIndex.value + if (menuList.value[index].sub_button.length >= 5) { + feedback.msgError('已添加上限~') + return + } + menuList.value[index].sub_button.push(event) + } + + // 编辑子菜单 + const handleEditSubMenu = (event: Menu, subIndex: number) => { + const index = menuIndex.value + menuList.value[index].sub_button[subIndex] = event + } + + // 删除主菜单 + const handleDelMenu = (index: number) => { + if (index != 0) { + menuIndex.value-- + } + menuList.value.splice(index, 1) + } + + // 删除子菜单 + const handleDelSubMenu = (index: number, subIndex: number) => { + menuList.value[index].sub_button.splice(subIndex, 1) + } + + // 获取菜单 + const getOaMenuFunc = async () => { + try { + menuList.value = await getOaMenu() + } catch (error) { + console.log('获取菜单=>', error) + } + } + + // 保存菜单 + const handleSave = async () => { + const refs = menuRef.value.value + for (let i = 0; i < refs.length; i++) { + try { + await refs[i].menuFormRef.validate() + } catch (error) { + menuIndex.value = i + return + } + } + await setOaMenuSave(menuList.value) + } + + // 保存菜单 + const handlePublish = async () => { + const refs = menuRef.value.value + for (let i = 0; i < refs.length; i++) { + try { + await refs[i].menuFormRef.validate() + } catch (error) { + menuIndex.value = i + return + } + } + await setOaMenuPublish(menuList.value) + } + + return { + menuList, + menuIndex, + handleAddMenu, + handleAddSubMenu, + handleEditSubMenu, + handleDelMenu, + handleDelSubMenu, + getOaMenuFunc, + handleSave, + handlePublish + } +} diff --git a/src/views/channel/wx_oa/reply/default_reply.vue b/src/views/channel/wx_oa/reply/default_reply.vue new file mode 100644 index 0000000..42e2c92 --- /dev/null +++ b/src/views/channel/wx_oa/reply/default_reply.vue @@ -0,0 +1,109 @@ + + diff --git a/src/views/channel/wx_oa/reply/edit.vue b/src/views/channel/wx_oa/reply/edit.vue new file mode 100644 index 0000000..38a07eb --- /dev/null +++ b/src/views/channel/wx_oa/reply/edit.vue @@ -0,0 +1,189 @@ + + diff --git a/src/views/channel/wx_oa/reply/follow_reply.vue b/src/views/channel/wx_oa/reply/follow_reply.vue new file mode 100644 index 0000000..0d2e1b7 --- /dev/null +++ b/src/views/channel/wx_oa/reply/follow_reply.vue @@ -0,0 +1,108 @@ + + diff --git a/src/views/channel/wx_oa/reply/keyword_reply.vue b/src/views/channel/wx_oa/reply/keyword_reply.vue new file mode 100644 index 0000000..8a866e9 --- /dev/null +++ b/src/views/channel/wx_oa/reply/keyword_reply.vue @@ -0,0 +1,124 @@ + + diff --git a/src/views/consumer/components/account-adjust.vue b/src/views/consumer/components/account-adjust.vue new file mode 100644 index 0000000..889cb3b --- /dev/null +++ b/src/views/consumer/components/account-adjust.vue @@ -0,0 +1,104 @@ + + diff --git a/src/views/consumer/lists/detail.vue b/src/views/consumer/lists/detail.vue new file mode 100644 index 0000000..4d49e2a --- /dev/null +++ b/src/views/consumer/lists/detail.vue @@ -0,0 +1,167 @@ + + + diff --git a/src/views/consumer/lists/index.vue b/src/views/consumer/lists/index.vue new file mode 100644 index 0000000..5d195f2 --- /dev/null +++ b/src/views/consumer/lists/index.vue @@ -0,0 +1,98 @@ + + diff --git a/src/views/decoration/component/add-nav.vue b/src/views/decoration/component/add-nav.vue new file mode 100644 index 0000000..9ad64d3 --- /dev/null +++ b/src/views/decoration/component/add-nav.vue @@ -0,0 +1,101 @@ + + + + diff --git a/src/views/decoration/component/decoration-img.vue b/src/views/decoration/component/decoration-img.vue new file mode 100644 index 0000000..03a0106 --- /dev/null +++ b/src/views/decoration/component/decoration-img.vue @@ -0,0 +1,59 @@ + + + + + diff --git a/src/views/decoration/component/pages/attr-setting.vue b/src/views/decoration/component/pages/attr-setting.vue new file mode 100644 index 0000000..c5ae4d5 --- /dev/null +++ b/src/views/decoration/component/pages/attr-setting.vue @@ -0,0 +1,36 @@ + + diff --git a/src/views/decoration/component/pages/menu.vue b/src/views/decoration/component/pages/menu.vue new file mode 100644 index 0000000..df774f6 --- /dev/null +++ b/src/views/decoration/component/pages/menu.vue @@ -0,0 +1,49 @@ + + + + diff --git a/src/views/decoration/component/pages/preview-pc.vue b/src/views/decoration/component/pages/preview-pc.vue new file mode 100644 index 0000000..4aeaa9e --- /dev/null +++ b/src/views/decoration/component/pages/preview-pc.vue @@ -0,0 +1,170 @@ + + + + diff --git a/src/views/decoration/component/pages/preview.vue b/src/views/decoration/component/pages/preview.vue new file mode 100644 index 0000000..bf7db1c --- /dev/null +++ b/src/views/decoration/component/pages/preview.vue @@ -0,0 +1,226 @@ + + + + diff --git a/src/views/decoration/component/tabbar/mobile/attr.vue b/src/views/decoration/component/tabbar/mobile/attr.vue new file mode 100644 index 0000000..188d836 --- /dev/null +++ b/src/views/decoration/component/tabbar/mobile/attr.vue @@ -0,0 +1,186 @@ + + diff --git a/src/views/decoration/component/tabbar/mobile/content.vue b/src/views/decoration/component/tabbar/mobile/content.vue new file mode 100644 index 0000000..5da1e8d --- /dev/null +++ b/src/views/decoration/component/tabbar/mobile/content.vue @@ -0,0 +1,44 @@ + + + diff --git a/src/views/decoration/component/tabbar/mobile/index.ts b/src/views/decoration/component/tabbar/mobile/index.ts new file mode 100644 index 0000000..44e335d --- /dev/null +++ b/src/views/decoration/component/tabbar/mobile/index.ts @@ -0,0 +1,6 @@ +import attr from './attr.vue' +import content from './content.vue' +export default { + attr, + content +} diff --git a/src/views/decoration/component/tabbar/pc/attr.vue b/src/views/decoration/component/tabbar/pc/attr.vue new file mode 100644 index 0000000..8ae3a89 --- /dev/null +++ b/src/views/decoration/component/tabbar/pc/attr.vue @@ -0,0 +1,40 @@ + + diff --git a/src/views/decoration/component/tabbar/pc/content.vue b/src/views/decoration/component/tabbar/pc/content.vue new file mode 100644 index 0000000..4b76a0d --- /dev/null +++ b/src/views/decoration/component/tabbar/pc/content.vue @@ -0,0 +1,101 @@ + + + diff --git a/src/views/decoration/component/tabbar/pc/index.ts b/src/views/decoration/component/tabbar/pc/index.ts new file mode 100644 index 0000000..44e335d --- /dev/null +++ b/src/views/decoration/component/tabbar/pc/index.ts @@ -0,0 +1,6 @@ +import attr from './attr.vue' +import content from './content.vue' +export default { + attr, + content +} diff --git a/src/views/decoration/component/tabbar/pc/menu-set.vue b/src/views/decoration/component/tabbar/pc/menu-set.vue new file mode 100644 index 0000000..9bdf926 --- /dev/null +++ b/src/views/decoration/component/tabbar/pc/menu-set.vue @@ -0,0 +1,119 @@ + + + diff --git a/src/views/decoration/component/widgets/banner/attr.vue b/src/views/decoration/component/widgets/banner/attr.vue new file mode 100644 index 0000000..25fd410 --- /dev/null +++ b/src/views/decoration/component/widgets/banner/attr.vue @@ -0,0 +1,176 @@ + + + + diff --git a/src/views/decoration/component/widgets/banner/content.vue b/src/views/decoration/component/widgets/banner/content.vue new file mode 100644 index 0000000..479808f --- /dev/null +++ b/src/views/decoration/component/widgets/banner/content.vue @@ -0,0 +1,45 @@ + + + + diff --git a/src/views/decoration/component/widgets/banner/index.ts b/src/views/decoration/component/widgets/banner/index.ts new file mode 100644 index 0000000..c776bce --- /dev/null +++ b/src/views/decoration/component/widgets/banner/index.ts @@ -0,0 +1,8 @@ +import attr from './attr.vue' +import content from './content.vue' +import options from './options' +export default { + attr, + content, + options +} diff --git a/src/views/decoration/component/widgets/banner/options.ts b/src/views/decoration/component/widgets/banner/options.ts new file mode 100644 index 0000000..dbd35d4 --- /dev/null +++ b/src/views/decoration/component/widgets/banner/options.ts @@ -0,0 +1,18 @@ +export default () => ({ + title: '首页轮播图', + name: 'banner', + content: { + enabled: 1, + style: 1, // 展示样式---1=常规,2=大屏 + bg_style: 0, // 背景联动---0=关闭,1=开启 + data: [ + { + image: '', + bg: '', + name: '', + link: {} + } + ] + }, + styles: {} +}) diff --git a/src/views/decoration/component/widgets/customer-service/attr.vue b/src/views/decoration/component/widgets/customer-service/attr.vue new file mode 100644 index 0000000..0284d6e --- /dev/null +++ b/src/views/decoration/component/widgets/customer-service/attr.vue @@ -0,0 +1,45 @@ + + + + diff --git a/src/views/decoration/component/widgets/customer-service/content.vue b/src/views/decoration/component/widgets/customer-service/content.vue new file mode 100644 index 0000000..056649e --- /dev/null +++ b/src/views/decoration/component/widgets/customer-service/content.vue @@ -0,0 +1,51 @@ + + + + diff --git a/src/views/decoration/component/widgets/customer-service/index.ts b/src/views/decoration/component/widgets/customer-service/index.ts new file mode 100644 index 0000000..c776bce --- /dev/null +++ b/src/views/decoration/component/widgets/customer-service/index.ts @@ -0,0 +1,8 @@ +import attr from './attr.vue' +import content from './content.vue' +import options from './options' +export default { + attr, + content, + options +} diff --git a/src/views/decoration/component/widgets/customer-service/options.ts b/src/views/decoration/component/widgets/customer-service/options.ts new file mode 100644 index 0000000..a32eb43 --- /dev/null +++ b/src/views/decoration/component/widgets/customer-service/options.ts @@ -0,0 +1,12 @@ +export default () => ({ + title: '客服设置', + name: 'customer-service', + content: { + title: '添加客服二维码', + time: '', + mobile: '', + qrcode: '', + remark: '' + }, + styles: {} +}) diff --git a/src/views/decoration/component/widgets/index.ts b/src/views/decoration/component/widgets/index.ts new file mode 100644 index 0000000..20bf4bf --- /dev/null +++ b/src/views/decoration/component/widgets/index.ts @@ -0,0 +1,14 @@ +const widgets: Record = import.meta.glob('./**/index.ts', { eager: true }) +interface Widget { + attr: any + content: any + options: any +} +console.log(widgets) +const exportWidgets: Record = {} +Object.keys(widgets).forEach((key) => { + const widgetName = key.replace(/^\.\/([\w-]+).*/gi, '$1') + exportWidgets[widgetName] = widgets[key]?.default +}) + +export default exportWidgets diff --git a/src/views/decoration/component/widgets/middle-banner/attr.vue b/src/views/decoration/component/widgets/middle-banner/attr.vue new file mode 100644 index 0000000..0351873 --- /dev/null +++ b/src/views/decoration/component/widgets/middle-banner/attr.vue @@ -0,0 +1,112 @@ + + + + diff --git a/src/views/decoration/component/widgets/middle-banner/content.vue b/src/views/decoration/component/widgets/middle-banner/content.vue new file mode 100644 index 0000000..7f2e1b9 --- /dev/null +++ b/src/views/decoration/component/widgets/middle-banner/content.vue @@ -0,0 +1,45 @@ + + + + diff --git a/src/views/decoration/component/widgets/middle-banner/index.ts b/src/views/decoration/component/widgets/middle-banner/index.ts new file mode 100644 index 0000000..c776bce --- /dev/null +++ b/src/views/decoration/component/widgets/middle-banner/index.ts @@ -0,0 +1,8 @@ +import attr from './attr.vue' +import content from './content.vue' +import options from './options' +export default { + attr, + content, + options +} diff --git a/src/views/decoration/component/widgets/middle-banner/options.ts b/src/views/decoration/component/widgets/middle-banner/options.ts new file mode 100644 index 0000000..5242cfe --- /dev/null +++ b/src/views/decoration/component/widgets/middle-banner/options.ts @@ -0,0 +1,15 @@ +export default () => ({ + title: '首页中部轮播图', + name: 'middle-banner', + content: { + enabled: 1, + data: [ + { + image: '', + name: '', + link: {} + } + ] + }, + styles: {} +}) diff --git a/src/views/decoration/component/widgets/my-service/attr.vue b/src/views/decoration/component/widgets/my-service/attr.vue new file mode 100644 index 0000000..388a185 --- /dev/null +++ b/src/views/decoration/component/widgets/my-service/attr.vue @@ -0,0 +1,50 @@ + + + + diff --git a/src/views/decoration/component/widgets/my-service/content.vue b/src/views/decoration/component/widgets/my-service/content.vue new file mode 100644 index 0000000..17ad15b --- /dev/null +++ b/src/views/decoration/component/widgets/my-service/content.vue @@ -0,0 +1,62 @@ + + + + diff --git a/src/views/decoration/component/widgets/my-service/index.ts b/src/views/decoration/component/widgets/my-service/index.ts new file mode 100644 index 0000000..c776bce --- /dev/null +++ b/src/views/decoration/component/widgets/my-service/index.ts @@ -0,0 +1,8 @@ +import attr from './attr.vue' +import content from './content.vue' +import options from './options' +export default { + attr, + content, + options +} diff --git a/src/views/decoration/component/widgets/my-service/options.ts b/src/views/decoration/component/widgets/my-service/options.ts new file mode 100644 index 0000000..f54952b --- /dev/null +++ b/src/views/decoration/component/widgets/my-service/options.ts @@ -0,0 +1,16 @@ +export default () => ({ + title: '我的服务', + name: 'my-service', + content: { + style: 1, + title: '我的服务', + data: [ + { + image: '', + name: '导航名称', + link: {} + } + ] + }, + styles: {} +}) diff --git a/src/views/decoration/component/widgets/nav/attr.vue b/src/views/decoration/component/widgets/nav/attr.vue new file mode 100644 index 0000000..aa8f688 --- /dev/null +++ b/src/views/decoration/component/widgets/nav/attr.vue @@ -0,0 +1,70 @@ + + + + diff --git a/src/views/decoration/component/widgets/nav/content.vue b/src/views/decoration/component/widgets/nav/content.vue new file mode 100644 index 0000000..8e55a27 --- /dev/null +++ b/src/views/decoration/component/widgets/nav/content.vue @@ -0,0 +1,40 @@ + + + + diff --git a/src/views/decoration/component/widgets/nav/index.ts b/src/views/decoration/component/widgets/nav/index.ts new file mode 100644 index 0000000..c776bce --- /dev/null +++ b/src/views/decoration/component/widgets/nav/index.ts @@ -0,0 +1,8 @@ +import attr from './attr.vue' +import content from './content.vue' +import options from './options' +export default { + attr, + content, + options +} diff --git a/src/views/decoration/component/widgets/nav/options.ts b/src/views/decoration/component/widgets/nav/options.ts new file mode 100644 index 0000000..b3cae1f --- /dev/null +++ b/src/views/decoration/component/widgets/nav/options.ts @@ -0,0 +1,18 @@ +export default () => ({ + title: '导航菜单', + name: 'nav', + content: { + enabled: 1, + style: 1, // 展示样式1=固定显示,2=分页显示 + per_line: 5, // 每行显示数量 + show_line: 2, // 显示行数 + data: [ + { + image: '', + name: '导航名称', + link: {} + } + ] + }, + styles: {} +}) diff --git a/src/views/decoration/component/widgets/news/attr.vue b/src/views/decoration/component/widgets/news/attr.vue new file mode 100644 index 0000000..6645dc4 --- /dev/null +++ b/src/views/decoration/component/widgets/news/attr.vue @@ -0,0 +1,20 @@ + + + + diff --git a/src/views/decoration/component/widgets/news/content.vue b/src/views/decoration/component/widgets/news/content.vue new file mode 100644 index 0000000..0dda52e --- /dev/null +++ b/src/views/decoration/component/widgets/news/content.vue @@ -0,0 +1,70 @@ + + + + + diff --git a/src/views/decoration/component/widgets/news/index.ts b/src/views/decoration/component/widgets/news/index.ts new file mode 100644 index 0000000..c776bce --- /dev/null +++ b/src/views/decoration/component/widgets/news/index.ts @@ -0,0 +1,8 @@ +import attr from './attr.vue' +import content from './content.vue' +import options from './options' +export default { + attr, + content, + options +} diff --git a/src/views/decoration/component/widgets/news/options.ts b/src/views/decoration/component/widgets/news/options.ts new file mode 100644 index 0000000..dde2c1f --- /dev/null +++ b/src/views/decoration/component/widgets/news/options.ts @@ -0,0 +1,7 @@ +export default () => ({ + title: '资讯', + name: 'news', + disabled: 1, + content: {}, + styles: {} +}) diff --git a/src/views/decoration/component/widgets/page-meta/attr.vue b/src/views/decoration/component/widgets/page-meta/attr.vue new file mode 100644 index 0000000..9ab8663 --- /dev/null +++ b/src/views/decoration/component/widgets/page-meta/attr.vue @@ -0,0 +1,63 @@ + + + + diff --git a/src/views/decoration/component/widgets/page-meta/content.vue b/src/views/decoration/component/widgets/page-meta/content.vue new file mode 100644 index 0000000..96aa234 --- /dev/null +++ b/src/views/decoration/component/widgets/page-meta/content.vue @@ -0,0 +1,8 @@ + + + + diff --git a/src/views/decoration/component/widgets/page-meta/index.ts b/src/views/decoration/component/widgets/page-meta/index.ts new file mode 100644 index 0000000..c776bce --- /dev/null +++ b/src/views/decoration/component/widgets/page-meta/index.ts @@ -0,0 +1,8 @@ +import attr from './attr.vue' +import content from './content.vue' +import options from './options' +export default { + attr, + content, + options +} diff --git a/src/views/decoration/component/widgets/page-meta/options.ts b/src/views/decoration/component/widgets/page-meta/options.ts new file mode 100644 index 0000000..90b6be1 --- /dev/null +++ b/src/views/decoration/component/widgets/page-meta/options.ts @@ -0,0 +1,14 @@ +export default () => ({ + title: '页面设置', + name: 'page-meta', + content: { + title_type: 1, + title: '', + title_img: '', + bg_type: 1, + bg_color: '', + bg_image: '', + text_color: '' + }, + styles: {} +}) diff --git a/src/views/decoration/component/widgets/pc-banner/attr.vue b/src/views/decoration/component/widgets/pc-banner/attr.vue new file mode 100644 index 0000000..028d383 --- /dev/null +++ b/src/views/decoration/component/widgets/pc-banner/attr.vue @@ -0,0 +1,165 @@ + + + + diff --git a/src/views/decoration/component/widgets/pc-banner/content.vue b/src/views/decoration/component/widgets/pc-banner/content.vue new file mode 100644 index 0000000..6a9c436 --- /dev/null +++ b/src/views/decoration/component/widgets/pc-banner/content.vue @@ -0,0 +1,103 @@ + + + + diff --git a/src/views/decoration/component/widgets/pc-banner/index.ts b/src/views/decoration/component/widgets/pc-banner/index.ts new file mode 100644 index 0000000..c776bce --- /dev/null +++ b/src/views/decoration/component/widgets/pc-banner/index.ts @@ -0,0 +1,8 @@ +import attr from './attr.vue' +import content from './content.vue' +import options from './options' +export default { + attr, + content, + options +} diff --git a/src/views/decoration/component/widgets/pc-banner/options.ts b/src/views/decoration/component/widgets/pc-banner/options.ts new file mode 100644 index 0000000..1000b39 --- /dev/null +++ b/src/views/decoration/component/widgets/pc-banner/options.ts @@ -0,0 +1,15 @@ +export default () => ({ + title: '首页轮播图', + name: 'pc-banner', + content: { + enabled: 1, + data: [ + { + image: '', + name: '', + link: {} + } + ] + }, + styles: {} +}) diff --git a/src/views/decoration/component/widgets/search/attr.vue b/src/views/decoration/component/widgets/search/attr.vue new file mode 100644 index 0000000..93f9278 --- /dev/null +++ b/src/views/decoration/component/widgets/search/attr.vue @@ -0,0 +1,20 @@ + + + + diff --git a/src/views/decoration/component/widgets/search/content.vue b/src/views/decoration/component/widgets/search/content.vue new file mode 100644 index 0000000..db2a07a --- /dev/null +++ b/src/views/decoration/component/widgets/search/content.vue @@ -0,0 +1,23 @@ + + + + diff --git a/src/views/decoration/component/widgets/search/index.ts b/src/views/decoration/component/widgets/search/index.ts new file mode 100644 index 0000000..c776bce --- /dev/null +++ b/src/views/decoration/component/widgets/search/index.ts @@ -0,0 +1,8 @@ +import attr from './attr.vue' +import content from './content.vue' +import options from './options' +export default { + attr, + content, + options +} diff --git a/src/views/decoration/component/widgets/search/options.ts b/src/views/decoration/component/widgets/search/options.ts new file mode 100644 index 0000000..e02e298 --- /dev/null +++ b/src/views/decoration/component/widgets/search/options.ts @@ -0,0 +1,7 @@ +export default () => ({ + title: '搜索', + name: 'search', + disabled: 1, + content: {}, + styles: {} +}) diff --git a/src/views/decoration/component/widgets/user-banner/attr.vue b/src/views/decoration/component/widgets/user-banner/attr.vue new file mode 100644 index 0000000..4b180c5 --- /dev/null +++ b/src/views/decoration/component/widgets/user-banner/attr.vue @@ -0,0 +1,101 @@ + + + + diff --git a/src/views/decoration/component/widgets/user-banner/content.vue b/src/views/decoration/component/widgets/user-banner/content.vue new file mode 100644 index 0000000..9668070 --- /dev/null +++ b/src/views/decoration/component/widgets/user-banner/content.vue @@ -0,0 +1,34 @@ + + + + diff --git a/src/views/decoration/component/widgets/user-banner/index.ts b/src/views/decoration/component/widgets/user-banner/index.ts new file mode 100644 index 0000000..c776bce --- /dev/null +++ b/src/views/decoration/component/widgets/user-banner/index.ts @@ -0,0 +1,8 @@ +import attr from './attr.vue' +import content from './content.vue' +import options from './options' +export default { + attr, + content, + options +} diff --git a/src/views/decoration/component/widgets/user-banner/options.ts b/src/views/decoration/component/widgets/user-banner/options.ts new file mode 100644 index 0000000..4adc70e --- /dev/null +++ b/src/views/decoration/component/widgets/user-banner/options.ts @@ -0,0 +1,15 @@ +export default () => ({ + title: '个人中心广告图', + name: 'user-banner', + content: { + enabled: 1, + data: [ + { + image: '', + name: '', + link: {} + } + ] + }, + styles: {} +}) diff --git a/src/views/decoration/component/widgets/user-info/attr.vue b/src/views/decoration/component/widgets/user-info/attr.vue new file mode 100644 index 0000000..93f9278 --- /dev/null +++ b/src/views/decoration/component/widgets/user-info/attr.vue @@ -0,0 +1,20 @@ + + + + diff --git a/src/views/decoration/component/widgets/user-info/content.vue b/src/views/decoration/component/widgets/user-info/content.vue new file mode 100644 index 0000000..b64e7e7 --- /dev/null +++ b/src/views/decoration/component/widgets/user-info/content.vue @@ -0,0 +1,16 @@ + + + + diff --git a/src/views/decoration/component/widgets/user-info/images/default_avatar.png b/src/views/decoration/component/widgets/user-info/images/default_avatar.png new file mode 100644 index 0000000..de31d02 Binary files /dev/null and b/src/views/decoration/component/widgets/user-info/images/default_avatar.png differ diff --git a/src/views/decoration/component/widgets/user-info/images/my_topbg.png b/src/views/decoration/component/widgets/user-info/images/my_topbg.png new file mode 100644 index 0000000..8984438 Binary files /dev/null and b/src/views/decoration/component/widgets/user-info/images/my_topbg.png differ diff --git a/src/views/decoration/component/widgets/user-info/index.ts b/src/views/decoration/component/widgets/user-info/index.ts new file mode 100644 index 0000000..c776bce --- /dev/null +++ b/src/views/decoration/component/widgets/user-info/index.ts @@ -0,0 +1,8 @@ +import attr from './attr.vue' +import content from './content.vue' +import options from './options' +export default { + attr, + content, + options +} diff --git a/src/views/decoration/component/widgets/user-info/options.ts b/src/views/decoration/component/widgets/user-info/options.ts new file mode 100644 index 0000000..b346829 --- /dev/null +++ b/src/views/decoration/component/widgets/user-info/options.ts @@ -0,0 +1,7 @@ +export default () => ({ + title: '用户信息', + name: 'user-info', + disabled: 1, + content: {}, + styles: {} +}) diff --git a/src/views/decoration/image/pc_index.png b/src/views/decoration/image/pc_index.png new file mode 100644 index 0000000..be3e5f9 Binary files /dev/null and b/src/views/decoration/image/pc_index.png differ diff --git a/src/views/decoration/pages/index.vue b/src/views/decoration/pages/index.vue new file mode 100644 index 0000000..ac42aea --- /dev/null +++ b/src/views/decoration/pages/index.vue @@ -0,0 +1,132 @@ + + + diff --git a/src/views/decoration/pc.vue b/src/views/decoration/pc.vue new file mode 100644 index 0000000..3c36bd0 --- /dev/null +++ b/src/views/decoration/pc.vue @@ -0,0 +1,40 @@ + + diff --git a/src/views/decoration/pc_details.vue b/src/views/decoration/pc_details.vue new file mode 100644 index 0000000..69c7d3b --- /dev/null +++ b/src/views/decoration/pc_details.vue @@ -0,0 +1,94 @@ + + + diff --git a/src/views/decoration/style/components/mobile-style.vue b/src/views/decoration/style/components/mobile-style.vue new file mode 100644 index 0000000..13c3485 --- /dev/null +++ b/src/views/decoration/style/components/mobile-style.vue @@ -0,0 +1,136 @@ + + diff --git a/src/views/decoration/style/components/theme-picker.vue b/src/views/decoration/style/components/theme-picker.vue new file mode 100644 index 0000000..e0976c0 --- /dev/null +++ b/src/views/decoration/style/components/theme-picker.vue @@ -0,0 +1,53 @@ + + + diff --git a/src/views/decoration/style/style.vue b/src/views/decoration/style/style.vue new file mode 100644 index 0000000..39bbf3f --- /dev/null +++ b/src/views/decoration/style/style.vue @@ -0,0 +1,60 @@ + + diff --git a/src/views/decoration/tabbar.vue b/src/views/decoration/tabbar.vue new file mode 100644 index 0000000..5a4b216 --- /dev/null +++ b/src/views/decoration/tabbar.vue @@ -0,0 +1,145 @@ + + + diff --git a/src/views/dev_tools/code/edit.vue b/src/views/dev_tools/code/edit.vue new file mode 100644 index 0000000..6764088 --- /dev/null +++ b/src/views/dev_tools/code/edit.vue @@ -0,0 +1,528 @@ + + + diff --git a/src/views/dev_tools/code/index.vue b/src/views/dev_tools/code/index.vue new file mode 100644 index 0000000..1e1fcec --- /dev/null +++ b/src/views/dev_tools/code/index.vue @@ -0,0 +1,232 @@ + + + diff --git a/src/views/dev_tools/components/code-preview.vue b/src/views/dev_tools/components/code-preview.vue new file mode 100644 index 0000000..0b6a75a --- /dev/null +++ b/src/views/dev_tools/components/code-preview.vue @@ -0,0 +1,63 @@ + + + diff --git a/src/views/dev_tools/components/data-table.vue b/src/views/dev_tools/components/data-table.vue new file mode 100644 index 0000000..0b418d0 --- /dev/null +++ b/src/views/dev_tools/components/data-table.vue @@ -0,0 +1,104 @@ + + + diff --git a/src/views/dev_tools/components/relations-add.vue b/src/views/dev_tools/components/relations-add.vue new file mode 100644 index 0000000..4b466f0 --- /dev/null +++ b/src/views/dev_tools/components/relations-add.vue @@ -0,0 +1,160 @@ + + diff --git a/src/views/error/403.vue b/src/views/error/403.vue new file mode 100644 index 0000000..53905ec --- /dev/null +++ b/src/views/error/403.vue @@ -0,0 +1,15 @@ + + + diff --git a/src/views/error/404.vue b/src/views/error/404.vue new file mode 100644 index 0000000..caa3d7f --- /dev/null +++ b/src/views/error/404.vue @@ -0,0 +1,9 @@ + + + diff --git a/src/views/error/components/error.vue b/src/views/error/components/error.vue new file mode 100644 index 0000000..5f0b959 --- /dev/null +++ b/src/views/error/components/error.vue @@ -0,0 +1,57 @@ + + + + diff --git a/src/views/finance/balance_details.vue b/src/views/finance/balance_details.vue new file mode 100644 index 0000000..d0fffee --- /dev/null +++ b/src/views/finance/balance_details.vue @@ -0,0 +1,106 @@ + + diff --git a/src/views/finance/component/refund-log.vue b/src/views/finance/component/refund-log.vue new file mode 100644 index 0000000..db20d75 --- /dev/null +++ b/src/views/finance/component/refund-log.vue @@ -0,0 +1,68 @@ + + + diff --git a/src/views/finance/recharge_record.vue b/src/views/finance/recharge_record.vue new file mode 100644 index 0000000..83214e0 --- /dev/null +++ b/src/views/finance/recharge_record.vue @@ -0,0 +1,141 @@ + + diff --git a/src/views/finance/refund_record.vue b/src/views/finance/refund_record.vue new file mode 100644 index 0000000..b3282a1 --- /dev/null +++ b/src/views/finance/refund_record.vue @@ -0,0 +1,228 @@ + + diff --git a/src/views/material/index.vue b/src/views/material/index.vue new file mode 100644 index 0000000..7fcfbd9 --- /dev/null +++ b/src/views/material/index.vue @@ -0,0 +1,63 @@ + + + + + diff --git a/src/views/message/notice/edit.vue b/src/views/message/notice/edit.vue new file mode 100644 index 0000000..c51ec7c --- /dev/null +++ b/src/views/message/notice/edit.vue @@ -0,0 +1,130 @@ + + + diff --git a/src/views/message/notice/index.vue b/src/views/message/notice/index.vue new file mode 100644 index 0000000..3ce896c --- /dev/null +++ b/src/views/message/notice/index.vue @@ -0,0 +1,86 @@ + + diff --git a/src/views/message/short_letter/edit.vue b/src/views/message/short_letter/edit.vue new file mode 100644 index 0000000..0449081 --- /dev/null +++ b/src/views/message/short_letter/edit.vue @@ -0,0 +1,128 @@ + + diff --git a/src/views/message/short_letter/index.vue b/src/views/message/short_letter/index.vue new file mode 100644 index 0000000..3a20862 --- /dev/null +++ b/src/views/message/short_letter/index.vue @@ -0,0 +1,56 @@ + + diff --git a/src/views/organization/department/edit.vue b/src/views/organization/department/edit.vue new file mode 100644 index 0000000..e33309f --- /dev/null +++ b/src/views/organization/department/edit.vue @@ -0,0 +1,161 @@ + + diff --git a/src/views/organization/department/index.vue b/src/views/organization/department/index.vue new file mode 100644 index 0000000..beba663 --- /dev/null +++ b/src/views/organization/department/index.vue @@ -0,0 +1,166 @@ + + diff --git a/src/views/organization/post/edit.vue b/src/views/organization/post/edit.vue new file mode 100644 index 0000000..f6b1574 --- /dev/null +++ b/src/views/organization/post/edit.vue @@ -0,0 +1,120 @@ + + diff --git a/src/views/organization/post/index.vue b/src/views/organization/post/index.vue new file mode 100644 index 0000000..9a6cc1d --- /dev/null +++ b/src/views/organization/post/index.vue @@ -0,0 +1,128 @@ + + diff --git a/src/views/permission/admin/edit.vue b/src/views/permission/admin/edit.vue new file mode 100644 index 0000000..decf6a5 --- /dev/null +++ b/src/views/permission/admin/edit.vue @@ -0,0 +1,274 @@ + + diff --git a/src/views/permission/admin/index.vue b/src/views/permission/admin/index.vue new file mode 100644 index 0000000..cbebc10 --- /dev/null +++ b/src/views/permission/admin/index.vue @@ -0,0 +1,183 @@ + + + diff --git a/src/views/permission/menu/edit.vue b/src/views/permission/menu/edit.vue new file mode 100644 index 0000000..35a290b --- /dev/null +++ b/src/views/permission/menu/edit.vue @@ -0,0 +1,299 @@ + + diff --git a/src/views/permission/menu/index.vue b/src/views/permission/menu/index.vue new file mode 100644 index 0000000..3e6360f --- /dev/null +++ b/src/views/permission/menu/index.vue @@ -0,0 +1,151 @@ + + diff --git a/src/views/permission/role/auth.vue b/src/views/permission/role/auth.vue new file mode 100644 index 0000000..616edb7 --- /dev/null +++ b/src/views/permission/role/auth.vue @@ -0,0 +1,154 @@ + + diff --git a/src/views/permission/role/edit.vue b/src/views/permission/role/edit.vue new file mode 100644 index 0000000..f4ec48b --- /dev/null +++ b/src/views/permission/role/edit.vue @@ -0,0 +1,101 @@ + + diff --git a/src/views/permission/role/index.vue b/src/views/permission/role/index.vue new file mode 100644 index 0000000..bae8076 --- /dev/null +++ b/src/views/permission/role/index.vue @@ -0,0 +1,107 @@ + + + diff --git a/src/views/record/edit.vue b/src/views/record/edit.vue new file mode 100644 index 0000000..75de6a3 --- /dev/null +++ b/src/views/record/edit.vue @@ -0,0 +1,131 @@ + + + diff --git a/src/views/record/index.vue b/src/views/record/index.vue new file mode 100644 index 0000000..21357d7 --- /dev/null +++ b/src/views/record/index.vue @@ -0,0 +1,137 @@ + + + diff --git a/src/views/record_cate/edit.vue b/src/views/record_cate/edit.vue new file mode 100644 index 0000000..2d22d8b --- /dev/null +++ b/src/views/record_cate/edit.vue @@ -0,0 +1,112 @@ + + + diff --git a/src/views/record_cate/index.vue b/src/views/record_cate/index.vue new file mode 100644 index 0000000..a42da3b --- /dev/null +++ b/src/views/record_cate/index.vue @@ -0,0 +1,129 @@ + + + diff --git a/src/views/setting/dict/data/edit.vue b/src/views/setting/dict/data/edit.vue new file mode 100644 index 0000000..8ebd142 --- /dev/null +++ b/src/views/setting/dict/data/edit.vue @@ -0,0 +1,126 @@ + + diff --git a/src/views/setting/dict/data/index.vue b/src/views/setting/dict/data/index.vue new file mode 100644 index 0000000..8d1fed0 --- /dev/null +++ b/src/views/setting/dict/data/index.vue @@ -0,0 +1,181 @@ + + + diff --git a/src/views/setting/dict/type/edit.vue b/src/views/setting/dict/type/edit.vue new file mode 100644 index 0000000..887e73e --- /dev/null +++ b/src/views/setting/dict/type/edit.vue @@ -0,0 +1,109 @@ + + diff --git a/src/views/setting/dict/type/index.vue b/src/views/setting/dict/type/index.vue new file mode 100644 index 0000000..58860e1 --- /dev/null +++ b/src/views/setting/dict/type/index.vue @@ -0,0 +1,170 @@ + + + diff --git a/src/views/setting/pay/config/edit.vue b/src/views/setting/pay/config/edit.vue new file mode 100644 index 0000000..3465ba4 --- /dev/null +++ b/src/views/setting/pay/config/edit.vue @@ -0,0 +1,298 @@ + + diff --git a/src/views/setting/pay/config/index.vue b/src/views/setting/pay/config/index.vue new file mode 100644 index 0000000..89c14bd --- /dev/null +++ b/src/views/setting/pay/config/index.vue @@ -0,0 +1,63 @@ + + + diff --git a/src/views/setting/pay/method/index.vue b/src/views/setting/pay/method/index.vue new file mode 100644 index 0000000..efc5fe7 --- /dev/null +++ b/src/views/setting/pay/method/index.vue @@ -0,0 +1,136 @@ + + + diff --git a/src/views/setting/search/index.vue b/src/views/setting/search/index.vue new file mode 100644 index 0000000..c5b0a9c --- /dev/null +++ b/src/views/setting/search/index.vue @@ -0,0 +1,171 @@ + + + + + diff --git a/src/views/setting/storage/edit.vue b/src/views/setting/storage/edit.vue new file mode 100644 index 0000000..ed87fbb --- /dev/null +++ b/src/views/setting/storage/edit.vue @@ -0,0 +1,194 @@ + + diff --git a/src/views/setting/storage/index.vue b/src/views/setting/storage/index.vue new file mode 100644 index 0000000..6f68e53 --- /dev/null +++ b/src/views/setting/storage/index.vue @@ -0,0 +1,65 @@ + + diff --git a/src/views/setting/system/cache.vue b/src/views/setting/system/cache.vue new file mode 100644 index 0000000..6fc2e2e --- /dev/null +++ b/src/views/setting/system/cache.vue @@ -0,0 +1,45 @@ + + + + diff --git a/src/views/setting/system/environment.vue b/src/views/setting/system/environment.vue new file mode 100644 index 0000000..0140a86 --- /dev/null +++ b/src/views/setting/system/environment.vue @@ -0,0 +1,79 @@ + + + + + + diff --git a/src/views/setting/system/journal.vue b/src/views/setting/system/journal.vue new file mode 100644 index 0000000..dfd7e9f --- /dev/null +++ b/src/views/setting/system/journal.vue @@ -0,0 +1,149 @@ + + + + + + diff --git a/src/views/setting/system/scheduled_task/edit.vue b/src/views/setting/system/scheduled_task/edit.vue new file mode 100644 index 0000000..bcb4da7 --- /dev/null +++ b/src/views/setting/system/scheduled_task/edit.vue @@ -0,0 +1,147 @@ + + + diff --git a/src/views/setting/system/scheduled_task/index.vue b/src/views/setting/system/scheduled_task/index.vue new file mode 100644 index 0000000..a2b0f2c --- /dev/null +++ b/src/views/setting/system/scheduled_task/index.vue @@ -0,0 +1,96 @@ + + + + + diff --git a/src/views/setting/user/login_register.vue b/src/views/setting/user/login_register.vue new file mode 100644 index 0000000..8a95eef --- /dev/null +++ b/src/views/setting/user/login_register.vue @@ -0,0 +1,172 @@ + + + + + + diff --git a/src/views/setting/user/setup.vue b/src/views/setting/user/setup.vue new file mode 100644 index 0000000..9593fcb --- /dev/null +++ b/src/views/setting/user/setup.vue @@ -0,0 +1,62 @@ + + + + + + diff --git a/src/views/setting/website/filing.vue b/src/views/setting/website/filing.vue new file mode 100644 index 0000000..26c9f28 --- /dev/null +++ b/src/views/setting/website/filing.vue @@ -0,0 +1,89 @@ + + + + diff --git a/src/views/setting/website/information.vue b/src/views/setting/website/information.vue new file mode 100644 index 0000000..12e7145 --- /dev/null +++ b/src/views/setting/website/information.vue @@ -0,0 +1,219 @@ + + + + + + diff --git a/src/views/setting/website/protocol.vue b/src/views/setting/website/protocol.vue new file mode 100644 index 0000000..cf45972 --- /dev/null +++ b/src/views/setting/website/protocol.vue @@ -0,0 +1,57 @@ + + + diff --git a/src/views/template/component/file.vue b/src/views/template/component/file.vue new file mode 100644 index 0000000..3e6a06e --- /dev/null +++ b/src/views/template/component/file.vue @@ -0,0 +1,63 @@ + + diff --git a/src/views/template/component/icon.vue b/src/views/template/component/icon.vue new file mode 100644 index 0000000..3448778 --- /dev/null +++ b/src/views/template/component/icon.vue @@ -0,0 +1,64 @@ + + diff --git a/src/views/template/component/link.vue b/src/views/template/component/link.vue new file mode 100644 index 0000000..8721042 --- /dev/null +++ b/src/views/template/component/link.vue @@ -0,0 +1,12 @@ + + diff --git a/src/views/template/component/overflow.vue b/src/views/template/component/overflow.vue new file mode 100644 index 0000000..f20722b --- /dev/null +++ b/src/views/template/component/overflow.vue @@ -0,0 +1,9 @@ + + diff --git a/src/views/template/component/popover_input.vue b/src/views/template/component/popover_input.vue new file mode 100644 index 0000000..90c945f --- /dev/null +++ b/src/views/template/component/popover_input.vue @@ -0,0 +1,48 @@ + + diff --git a/src/views/template/component/rich_text.vue b/src/views/template/component/rich_text.vue new file mode 100644 index 0000000..b1303f9 --- /dev/null +++ b/src/views/template/component/rich_text.vue @@ -0,0 +1,16 @@ + + diff --git a/src/views/template/component/upload.vue b/src/views/template/component/upload.vue new file mode 100644 index 0000000..4bb8f05 --- /dev/null +++ b/src/views/template/component/upload.vue @@ -0,0 +1,65 @@ + + diff --git a/src/views/user/setting.vue b/src/views/user/setting.vue new file mode 100644 index 0000000..4341d9a --- /dev/null +++ b/src/views/user/setting.vue @@ -0,0 +1,156 @@ + + + + + + diff --git a/src/views/workbench/index.vue b/src/views/workbench/index.vue new file mode 100644 index 0000000..290d256 --- /dev/null +++ b/src/views/workbench/index.vue @@ -0,0 +1,193 @@ + + + + + diff --git a/typings/index.d.ts b/typings/index.d.ts new file mode 100644 index 0000000..6c0aab2 --- /dev/null +++ b/typings/index.d.ts @@ -0,0 +1,5 @@ +declare module 'vue3-video-play' + +declare module 'css-color-function' + +type PromiseFun = (...arg: any[]) => Promise diff --git a/typings/router.d.ts b/typings/router.d.ts new file mode 100644 index 0000000..9fae641 --- /dev/null +++ b/typings/router.d.ts @@ -0,0 +1,14 @@ +import 'vue-router' +declare module 'vue-router' { + // 扩展 RouteMeta + interface RouteMeta { + type?: string + perms?: string + title?: string + icon?: string + hidden?: boolean + activeMenu?: string + hideTab?: boolean + keepAlive?: boolean + } +}