diff --git a/package.json b/package.json index 5766a38..37f8993 100644 --- a/package.json +++ b/package.json @@ -17,12 +17,15 @@ "dependencies": { "@element-plus/icons-vue": "1.1.4", "@vueuse/core": "8.5.0", + "@wangeditor/editor": "^5.1.14", + "@wangeditor/editor-for-vue": "^5.1.12", "axios": "0.26.1", "echarts": "5.3.2", "element-plus": "2.1.8", "file-saver": "2.0.5", "fuse.js": "6.5.3", "js-cookie": "3.0.1", + "js-md5": "^0.7.3", "jsencrypt": "3.2.1", "nprogress": "0.2.0", "pinia": "2.0.14", diff --git a/src/api/config.js b/src/api/config.js new file mode 100644 index 0000000..98d9260 --- /dev/null +++ b/src/api/config.js @@ -0,0 +1,64 @@ +import request from "@/utils/request"; + +export function launch(data) { + return request({ + url: "/v1/message/launch", + method: "post", + data, + }); +} +// 省市区选择 +export function areaList(params) { + return request({ + url: "/enterprise/v1/config/area", + method: "get", + params, + }); +} +// 领域 +export function industry(params) { + return request({ + url: "/enterprise/v1/config/industry", + method: "get", + params, + }); +} + +// 省列表 +export function provinceList() { + return request({ + url: "/region/allProvince", + method: "get", + }); +} + +// 市列表 +export function cityList(provinceCode) { + return request({ + url: "/region/allCity", + method: "get", + params: { + provinceCode, + }, + }); +} + +// 县区列表 +export function districtList(cityCode) { + return request({ + url: "/region/allArea", + method: "get", + params: { + cityCode, + }, + }); +} + +// 获取领域列表 +export function listSysIndustry(query) { + return request({ + url: "/business/sysIndustry/list", + method: "get", + params: query, + }); +} diff --git a/src/api/enterprise/index.js b/src/api/enterprise/index.js new file mode 100644 index 0000000..a10ae87 --- /dev/null +++ b/src/api/enterprise/index.js @@ -0,0 +1,53 @@ +import request from "@/utils/request"; + +// 个人信息录入 +export const insertClientUser = (data) => { + return request({ + url: "/app/insertClientUser", + method: "POST", + data, + }); +}; +// 企业信息修改 +export const updateEnterprise = (data) => { + return request({ + url: "/app/updateEnterprise", + method: "POST", + data, + }); +}; + +// 企业服务需求列表 +export const demandList = (params) => { + return request({ + url: "/app/demandList", + method: "GET", + params, + }); +}; + +// 产品列表 +export const getEnterpriseProduct = (params) => { + return request({ + url: "/app/getEnterpriseProduct", + method: "GET", + params, + }); +}; + +// 新增产品 +export const insertEnterpriseProduct = (data) => { + return request({ + url: "/app/insertEnterpriseProduct", + method: "POST", + data, + }); +}; +// 根据id获取产品信息 +export const getProductById = (params) => { + return request({ + url: "/app/getProductById", + method: "GET", + params, + }); +}; diff --git a/src/api/identity/index.js b/src/api/identity/index.js new file mode 100644 index 0000000..879ef5f --- /dev/null +++ b/src/api/identity/index.js @@ -0,0 +1,76 @@ +import request from "@/utils/request"; + +// 首页每一项 +export function identity() { + return request({ + url: "/app/getRoleStatus", + }); +} +// 当前状态 +export function settled() { + return request({ + url: "/enterprise/v1/settled", + }); +} +// 当前状态切换 +export function identitySwitch(data) { + return request({ + url: "/enterprise/v1/user/identity/switch", + method: "post", + data, + }); +} +// 申请企业入住 +export function insertEnterprise(data) { + return request({ + url: "/app/insertEnterprise", + method: "post", + data, + }); +} +// 所属单位 +export function researchSelect() { + return request({ + url: "/enterprise/v1/manage/research/select", + }); +} +// 所属单位>实验室 +export function laboratorySelect() { + return request({ + url: "/enterprise/v1/manage/research/laboratory", + }); +} +// 专家入驻 +export function expert(data) { + return request({ + url: "/enterprise/v1/settled/expert", + method: "post", + data, + }); +} +// 科研机构入驻 +export function research(data) { + return request({ + url: "/enterprise/v1/settled/research", + method: "post", + data, + }); +} + +// 实验室入驻 +export function laboratory(data) { + return request({ + url: "/enterprise/v1/settled/laboratory", + method: "post", + data, + }); +} + +// 实验室入驻 +export function agent(data) { + return request({ + url: "/enterprise/v1/settled/agent", + method: "post", + data, + }); +} diff --git a/src/api/login.js b/src/api/login.js index 26742e7..6e6cd1c 100644 --- a/src/api/login.js +++ b/src/api/login.js @@ -1,4 +1,4 @@ -import request from '@/utils/request' +import request from "@/utils/request"; // 登录方法 export function login(username, password, code, uuid) { @@ -6,54 +6,65 @@ export function login(username, password, code, uuid) { username, password, code, - uuid - } + uuid, + }; return request({ - url: '/login', + url: "/app/login", headers: { - isToken: false + isToken: false, }, - method: 'post', - data: data - }) + method: "post", + data: data, + }); } // 注册方法 export function register(data) { return request({ - url: '/register', + url: "/app/register", headers: { - isToken: false + isToken: false, }, - method: 'post', - data: data - }) + method: "post", + data: data, + }); } // 获取用户详细信息 export function getInfo() { return request({ - url: '/getInfo', - method: 'get' - }) + url: "/app/info", + method: "get", + }); } // 退出方法 export function logout() { return request({ - url: '/logout', - method: 'post' - }) + url: "/logout", + method: "post", + }); } // 获取验证码 export function getCodeImg() { return request({ - url: '/captchaImage', + url: "/captchaImage", headers: { - isToken: false + isToken: false, }, - method: 'get', - timeout: 20000 - }) -} \ No newline at end of file + method: "get", + timeout: 20000, + }); +} +// 重置密码 +export function resetPassword() { + return request({ + url: "/captchaImage", + headers: { + isToken: false, + }, + method: "get", + timeout: 20000, + }); +} diff --git a/src/assets/images/login.png b/src/assets/images/login.png new file mode 100644 index 0000000..bf67563 Binary files /dev/null and b/src/assets/images/login.png differ diff --git a/src/assets/images/weixin.png b/src/assets/images/weixin.png new file mode 100644 index 0000000..6332c16 Binary files /dev/null and b/src/assets/images/weixin.png differ diff --git a/src/assets/logo/logo.png b/src/assets/logo/logo.png index e263760..584a79a 100644 Binary files a/src/assets/logo/logo.png and b/src/assets/logo/logo.png differ diff --git a/src/components/ImageUpload/index.vue b/src/components/ImageUpload/index.vue index 7580438..176525b 100644 --- a/src/components/ImageUpload/index.vue +++ b/src/components/ImageUpload/index.vue @@ -80,7 +80,7 @@ const dialogImageUrl = ref(""); const dialogVisible = ref(false); const baseUrl = import.meta.env.VITE_APP_BASE_API; const uploadImgUrl = ref(import.meta.env.VITE_APP_BASE_API + "/common/upload"); // 上传的图片服务器地址 -const headers = ref({ Authorization: "Bearer " + getToken() }); +const headers = ref({ 'client-token': "Bearer " + getToken() }); const fileList = ref([]); const showTip = computed( () => props.isShowTip && (props.fileType || props.fileSize) diff --git a/src/components/VideoUpload/index.vue b/src/components/VideoUpload/index.vue new file mode 100644 index 0000000..a3a6535 --- /dev/null +++ b/src/components/VideoUpload/index.vue @@ -0,0 +1,345 @@ + + + + + diff --git a/src/components/WangEditor/index.vue b/src/components/WangEditor/index.vue new file mode 100644 index 0000000..0febe65 --- /dev/null +++ b/src/components/WangEditor/index.vue @@ -0,0 +1,113 @@ + + + diff --git a/src/components/WebsiteHeader/index.vue b/src/components/WebsiteHeader/index.vue new file mode 100644 index 0000000..52bded0 --- /dev/null +++ b/src/components/WebsiteHeader/index.vue @@ -0,0 +1,273 @@ + + + + + + + diff --git a/src/components/webGetCode/index.vue b/src/components/webGetCode/index.vue new file mode 100644 index 0000000..2012386 --- /dev/null +++ b/src/components/webGetCode/index.vue @@ -0,0 +1,67 @@ + + + + + \ No newline at end of file diff --git a/src/permission.js b/src/permission.js index d6ea76b..5bd43b9 100644 --- a/src/permission.js +++ b/src/permission.js @@ -1,63 +1,73 @@ -import router from './router' -import { ElMessage } from 'element-plus' -import NProgress from 'nprogress' -import 'nprogress/nprogress.css' -import { getToken } from '@/utils/auth' -import { isHttp } from '@/utils/validate' -import { isRelogin } from '@/utils/request' -import useUserStore from '@/store/modules/user' -import useSettingsStore from '@/store/modules/settings' -import usePermissionStore from '@/store/modules/permission' +import router from "./router"; +import { ElMessage } from "element-plus"; +import NProgress from "nprogress"; +import "nprogress/nprogress.css"; +import { getToken } from "@/utils/auth"; +import { isHttp } from "@/utils/validate"; +import { isRelogin } from "@/utils/request"; +import useUserStore from "@/store/modules/user"; +import useSettingsStore from "@/store/modules/settings"; +import usePermissionStore from "@/store/modules/permission"; NProgress.configure({ showSpinner: false }); -const whiteList = ['/login', '/auth-redirect', '/bind', '/register']; +const whiteList = ["/login", "/auth-redirect", "/bind", "/register"]; router.beforeEach((to, from, next) => { - NProgress.start() + NProgress.start(); if (getToken()) { - to.meta.title && useSettingsStore().setTitle(to.meta.title) + to.meta.title && useSettingsStore().setTitle(to.meta.title); /* has token*/ - if (to.path === '/login') { - next({ path: '/' }) - NProgress.done() + if (to.path === "/login") { + next({ path: "/" }); + NProgress.done(); } else { if (useUserStore().roles.length === 0) { - isRelogin.show = true + isRelogin.show = true; // 判断当前用户是否已拉取完user_info信息 - useUserStore().getInfo().then(() => { - isRelogin.show = false - usePermissionStore().generateRoutes().then(accessRoutes => { - // 根据roles权限生成可访问的路由表 - accessRoutes.forEach(route => { - if (!isHttp(route.path)) { - router.addRoute(route) // 动态添加可访问路由表 - } - }) - next({ ...to, replace: true }) // hack方法 确保addRoutes已完成 + useUserStore() + .getInfo() + .then(() => { + isRelogin.show = false; + // next({ ...to, replace: true }); + usePermissionStore() + .generateRoutes(useUserStore().roleId) + .then((accessRoutes) => { + console.log(accessRoutes); + // 根据roles权限生成可访问的路由表 + accessRoutes.forEach((route) => { + if (!isHttp(route.path)) { + router.addRoute(route); // 动态添加可访问路由表 + } + }); + next({ ...to, replace: true }); // hack方法 确保addRoutes已完成 + }); }) - }).catch(err => { - useUserStore().logOut().then(() => { - ElMessage.error(err) - next({ path: '/' }) - }) - }) + .catch((err) => { + console.log(err); + useUserStore() + .logOut() + .then(() => { + ElMessage.error(err); + next({ path: "/" }); + }); + }); } else { - next() + next(); } } } else { // 没有token if (whiteList.indexOf(to.path) !== -1) { // 在免登录白名单,直接进入 - next() + next(); } else { - next(`/login?redirect=${to.fullPath}`) // 否则全部重定向到登录页 - NProgress.done() + next(`/login?redirect=${to.fullPath}`); // 否则全部重定向到登录页 + NProgress.done(); } } -}) +}); router.afterEach(() => { - NProgress.done() -}) + NProgress.done(); +}); diff --git a/src/router/index.js b/src/router/index.js index b67a1df..9cb7870 100644 --- a/src/router/index.js +++ b/src/router/index.js @@ -1,6 +1,7 @@ -import { createWebHistory, createRouter } from 'vue-router' +import { createWebHistory, createRouter } from "vue-router"; /* Layout */ -import Layout from '@/layout' +import Layout from "@/layout"; +import basicInfo from "../views/admin/enterprise/account/basicInfo.vue"; /** * Note: 路由配置项 @@ -27,147 +28,502 @@ import Layout from '@/layout' // 公共路由 export const constantRoutes = [ { - path: '/redirect', + path: "/", + name: "Home", + component: () => import("../views/website/website-layout.vue"), + hidden: true, + children: [ + { + path: "login", + name: "login", + component: () => import("@/views/website/login/index.vue"), + children: [], + }, + { + path: "", + component: () => import("../views/website/home/index.vue"), + }, + ], + }, + { + path: "/redirect", component: Layout, hidden: true, children: [ { - path: '/redirect/:path(.*)', - component: () => import('@/views/redirect/index.vue') - } - ] - }, - { - path: '/login', - component: () => import('@/views/login'), - hidden: true - }, - { - path: '/register', - component: () => import('@/views/register'), - hidden: true + path: "/redirect/:path(.*)", + component: () => import("@/views/redirect/index.vue"), + }, + ], }, + // { + // path: "/login", + // component: () => import("@/views/login"), + // hidden: true, + // }, + // { + // path: "/register", + // component: () => import("@/views/register"), + // hidden: true, + // }, { path: "/:pathMatch(.*)*", - component: () => import('@/views/error/404'), - hidden: true + component: () => import("@/views/error/404"), + hidden: true, }, { - path: '/401', - component: () => import('@/views/error/401'), - hidden: true + path: "/401", + component: () => import("@/views/error/401"), + hidden: true, }, + { - path: '', - component: Layout, - redirect: '/index', + path: "/identity", + component: () => import("@/views/identity/layout"), + hidden: true, children: [ { - path: '/index', - component: () => import('@/views/index'), - name: 'Index', - meta: { title: '首页', icon: 'dashboard', affix: true } - } - ] + path: "index", + component: () => import("@/views/identity/index"), + name: "index", + meta: { title: "身份选择" }, + }, + { + path: "enterprise", + component: () => import("@/views/identity/enterprise"), + name: "enterprise", + meta: { title: "企业入驻" }, + }, + // { + // path:'expert', + // component: () => import('@/views/identity/expert'), + // name: 'expert', + // meta: { title: '专家入驻'} + // }, + // { + // path:'research', + // component: () => import('@/views/identity/research'), + // name: 'research', + // meta: { title: '研究机构入驻'} + // }, + // { + // path:'laboratory', + // component: () => import('@/views/identity/laboratory'), + // name: 'laboratory', + // meta: { title: '实验室入驻'} + // }, + // { + // path:'agent', + // component: () => import('@/views/identity/agent'), + // name: 'agent', + // meta: { title: '科技经纪人入驻'} + // } + ], }, { - path: '/user', + path: "/admin", + component: Layout, + redirect: "/admin/index", + children: [ + { + path: "index", + component: () => import("@/views/admin/index"), + name: "Index", + meta: { title: "首页", icon: "dashboard", affix: true }, + }, + ], + }, + + // { + // path: '', + // component: Layout, + // redirect: '/index', + // children: [ + // { + // path: '/index', + // component: () => import('@/views/index'), + // name: 'Index', + // meta: { title: '首页', icon: 'dashboard', affix: true } + // } + // ] + // }, + { + path: "/user", component: Layout, hidden: true, - redirect: 'noredirect', + redirect: "noredirect", children: [ { - path: 'profile', - component: () => import('@/views/system/user/profile/index'), - name: 'Profile', - meta: { title: '个人中心', icon: 'user' } - } - ] - } -] + path: "profile", + component: () => import("@/views/system/user/profile/index"), + name: "Profile", + meta: { title: "个人中心", icon: "user" }, + }, + ], + }, +]; +// 企业后台路由表 +export const enterpriseRoutes = [ + { + path: "/account", + component: Layout, + meta: { title: "账号管理", icon: "dashboard" }, + alwaysShow: true, + redirect: "/account/basicInfo", + children: [ + { + path: "basicInfo", + component: basicInfo, + name: "basicInfo", + meta: { title: "基本资料", icon: "list" }, + }, + { + path: "bill", + component: () => import("@/views/admin/enterprise/account/bill"), + name: "Bill", + meta: { title: "账单列表", icon: "list" }, + }, + { + path: "record", + component: () => import("@/views/admin/enterprise/account/record"), + name: "Record", + meta: { title: "创新币兑换记录", icon: "list" }, + }, + ], + }, + { + path: "/extension", + component: Layout, + meta: { title: "产品推广", icon: "dashboard" }, + alwaysShow: true, + redirect: "/extension/product", + children: [ + { + path: "product", + component: () => import("@/views/admin/enterprise/extension/product"), + name: "Product", + meta: { title: "产品列表", icon: "list" }, + }, + { + path: "release", + component: () => import("@/views/admin/enterprise/extension/release"), + hidden: true, + name: "Release", + meta: { title: "发布产品", icon: "list" }, + }, + { + path: "results", + component: () => import("@/views/admin/enterprise/extension/results"), + hidden: true, + name: "Results", + meta: { title: "匹配结果", icon: "list" }, + }, + { + path: "business", + component: () => import("@/views/admin/enterprise/extension/business"), + hidden: true, + name: "Business", + meta: { title: "浏览信息", icon: "list" }, + }, + ], + }, + { + path: "/demand", + component: Layout, + meta: { title: "需求管理", icon: "dashboard" }, + alwaysShow: true, + redirect: "/demand/serviceDemand", + children: [ + { + path: "serviceDemand", + component: () => + import("@/views/admin/enterprise/demand/serviceDemand"), + name: "serviceDemand", + meta: { title: "服务需求", icon: "list" }, + }, + { + path: "release", + component: () => import("@/views/admin/enterprise/demand/release"), + hidden: true, + name: "release", + meta: { title: "发布服务需求", icon: "list" }, + }, + { + path: "technology", + component: () => import("@/views/admin/enterprise/demand/technology"), + name: "technology", + meta: { title: "技术需求", icon: "list" }, + }, + { + path: "released", + component: () => import("@/views/admin/enterprise/demand/released"), + hidden: true, + name: "released", + meta: { title: "发布技术需求", icon: "list" }, + }, + { + path: "results", + component: () => import("@/views/admin/enterprise/demand/results"), + hidden: true, + name: "results", + meta: { title: "匹配结果", icon: "list" }, + }, + ], + }, + { + path: "/activity", + component: Layout, + meta: { title: "活动管理", icon: "dashboard" }, + alwaysShow: true, + redirect: "/activity/active", + children: [ + { + path: "active", + component: () => import("@/views/admin/enterprise/activity/active"), + name: "Active", + meta: { title: "活动列表", icon: "list" }, + }, + ], + }, +]; + +// 专家后台路由表 +export const expertRoutes = [ + { + path: "/account", + component: Layout, + meta: { title: "zj账号管理", icon: "dashboard" }, + alwaysShow: true, + // redirect: 'noRedirect', + redirect: "/account/bill", + children: [ + { + path: "bill", + component: () => import("@/views/admin/expert/account/bill"), + name: "Bill", + meta: { title: "账单列表", icon: "list" }, + }, + { + path: "exchange", + component: () => import("@/views/admin/expert/account/exchange"), + name: "Exchange", + meta: { title: "兑换记录", icon: "list" }, + }, + { + path: "basicInfo", + component: () => import("@/views/admin/expert/account/basicInfo"), + name: "basicInfo", + meta: { title: "基本资料", icon: "list" }, + }, + { + path: "transactionAuth", + component: () => import("@/views/admin/expert/account/transactionAuth"), + name: "transactionAuth", + meta: { title: "交易认证", icon: "list" }, + }, + { + path: "profit", + component: () => import("@/views/admin/expert/account/profit"), + name: "profit", + meta: { title: "收益管理", icon: "list" }, + }, + { + path: "withdrawal", + component: () => import("@/views/admin/expert/account/withdrawal"), + hidden: true, + name: "Withdrawal", + meta: { title: "提现记录", icon: "list" }, + }, + ], + }, + { + path: "/technology", + component: Layout, + meta: { title: "技术管理", icon: "dashboard" }, + alwaysShow: true, + redirect: "/technology/achievement", + children: [ + { + path: "achievement", + component: () => import("@/views/admin/expert/technology/achievement"), + name: "Achievement", + meta: { title: "成果列表", icon: "list" }, + }, + { + path: "release", + component: () => import("@/views/admin/expert/technology/release"), + hidden: true, + name: "Release", + meta: { title: "发布成果", icon: "list" }, + }, + { + path: "results", + component: () => import("@/views/admin/expert/technology/results"), + hidden: true, + name: "Results", + meta: { title: "匹配结果", icon: "list" }, + }, + { + path: "patent", + component: () => import("@/views/admin/expert/technology/patent"), + name: "patent", + meta: { title: "专利列表", icon: "list" }, + }, + { + path: "claimPatent", + component: () => import("@/views/admin/expert/technology/claimPatent"), + hidden: true, + name: "claimPatent", + meta: { title: "认领专利", icon: "list" }, + }, + { + path: "paper", + component: () => import("@/views/admin/expert/technology/paper"), + name: "Paper", + meta: { title: "论文列表", icon: "list" }, + }, + { + path: "research", + component: () => import("@/views/admin/expert/technology/research"), + name: "Research", + meta: { title: "科研项目列表", icon: "list" }, + }, + ], + }, + { + path: "/demand", + component: Layout, + meta: { title: "需求管理", icon: "dashboard" }, + alwaysShow: true, + redirect: "/demand/serviceDemand", + children: [ + { + path: "serviceDemand", + component: () => import("@/views/admin/expert/demand/serviceDemand"), + name: "serviceDemand", + meta: { title: "服务需求", icon: "list" }, + }, + { + path: "release", + component: () => import("@/views/admin/expert/demand/release"), + hidden: true, + name: "release", + meta: { title: "发布需求", icon: "list" }, + }, + { + path: "already", + component: () => import("@/views/admin/expert/demand/already"), + name: "already", + meta: { title: "已合作企业", icon: "list" }, + }, + { + path: "think", + component: () => import("@/views/admin/expert/demand/think"), + name: "think", + meta: { title: "想合作企业", icon: "list" }, + }, + ], + }, + + { + path: "/activity", + component: Layout, + meta: { title: "活动管理", icon: "dashboard" }, + alwaysShow: true, + redirect: "/activity/active", + children: [ + { + path: "active", + component: () => import("@/views/admin/expert/activity/active"), + name: "Active", + meta: { title: "活动列表", icon: "list" }, + }, + ], + }, +]; // 动态路由,基于用户权限动态去加载 export const dynamicRoutes = [ { - path: '/system/user-auth', + path: "/system/user-auth", component: Layout, hidden: true, - permissions: ['system:user:edit'], + permissions: ["system:user:edit"], children: [ { - path: 'role/:userId(\\d+)', - component: () => import('@/views/system/user/authRole'), - name: 'AuthRole', - meta: { title: '分配角色', activeMenu: '/system/user' } - } - ] + path: "role/:userId(\\d+)", + component: () => import("@/views/system/user/authRole"), + name: "AuthRole", + meta: { title: "分配角色", activeMenu: "/system/user" }, + }, + ], }, { - path: '/system/role-auth', + path: "/system/role-auth", component: Layout, hidden: true, - permissions: ['system:role:edit'], + permissions: ["system:role:edit"], children: [ { - path: 'user/:roleId(\\d+)', - component: () => import('@/views/system/role/authUser'), - name: 'AuthUser', - meta: { title: '分配用户', activeMenu: '/system/role' } - } - ] + path: "user/:roleId(\\d+)", + component: () => import("@/views/system/role/authUser"), + name: "AuthUser", + meta: { title: "分配用户", activeMenu: "/system/role" }, + }, + ], }, { - path: '/system/dict-data', + path: "/system/dict-data", component: Layout, hidden: true, - permissions: ['system:dict:list'], + permissions: ["system:dict:list"], children: [ { - path: 'index/:dictId(\\d+)', - component: () => import('@/views/system/dict/data'), - name: 'Data', - meta: { title: '字典数据', activeMenu: '/system/dict' } - } - ] + path: "index/:dictId(\\d+)", + component: () => import("@/views/system/dict/data"), + name: "Data", + meta: { title: "字典数据", activeMenu: "/system/dict" }, + }, + ], }, { - path: '/monitor/job-log', + path: "/monitor/job-log", component: Layout, hidden: true, - permissions: ['monitor:job:list'], + permissions: ["monitor:job:list"], children: [ { - path: 'index', - component: () => import('@/views/monitor/job/log'), - name: 'JobLog', - meta: { title: '调度日志', activeMenu: '/monitor/job' } - } - ] + path: "index", + component: () => import("@/views/monitor/job/log"), + name: "JobLog", + meta: { title: "调度日志", activeMenu: "/monitor/job" }, + }, + ], }, { - path: '/tool/gen-edit', + path: "/tool/gen-edit", component: Layout, hidden: true, - permissions: ['tool:gen:edit'], + permissions: ["tool:gen:edit"], children: [ { - path: 'index/:tableId(\\d+)', - component: () => import('@/views/tool/gen/editTable'), - name: 'GenEdit', - meta: { title: '修改生成配置', activeMenu: '/tool/gen' } - } - ] - } -] + path: "index/:tableId(\\d+)", + component: () => import("@/views/tool/gen/editTable"), + name: "GenEdit", + meta: { title: "修改生成配置", activeMenu: "/tool/gen" }, + }, + ], + }, +]; const router = createRouter({ history: createWebHistory(), routes: constantRoutes, scrollBehavior(to, from, savedPosition) { if (savedPosition) { - return savedPosition + return savedPosition; } else { - return { top: 0 } + return { top: 0 }; } }, }); diff --git a/src/settings.js b/src/settings.js index bd4b9e2..385628d 100644 --- a/src/settings.js +++ b/src/settings.js @@ -6,7 +6,7 @@ export default { /** * 侧边栏主题 深色主题theme-dark,浅色主题theme-light */ - sideTheme: 'theme-dark', + sideTheme: 'theme-light', /** * 是否系统布局配置 */ diff --git a/src/store/modules/permission.js b/src/store/modules/permission.js index c1c862b..6dca211 100644 --- a/src/store/modules/permission.js +++ b/src/store/modules/permission.js @@ -1,138 +1,171 @@ -import auth from '@/plugins/auth' -import router, { constantRoutes, dynamicRoutes } from '@/router' -import { getRouters } from '@/api/menu' -import Layout from '@/layout/index' -import ParentView from '@/components/ParentView' -import InnerLink from '@/layout/components/InnerLink' +import auth from "@/plugins/auth"; +import router, { constantRoutes, dynamicRoutes } from "@/router"; +import { getRouters } from "@/api/menu"; +import Layout from "@/layout/index"; +import ParentView from "@/components/ParentView"; +import InnerLink from "@/layout/components/InnerLink"; +import { enterpriseRoutes } from "@/router"; +import { expertRoutes } from "../../router"; // 匹配views里面所有的.vue文件 -const modules = import.meta.glob('./../../views/**/*.vue') +const modules = import.meta.glob("./../../views/**/*.vue"); -const usePermissionStore = defineStore( - 'permission', - { - state: () => ({ - routes: [], - addRoutes: [], - defaultRoutes: [], - topbarRouters: [], - sidebarRouters: [] - }), - actions: { - setRoutes(routes) { - this.addRoutes = routes - this.routes = constantRoutes.concat(routes) - }, - setDefaultRoutes(routes) { - this.defaultRoutes = constantRoutes.concat(routes) - }, - setTopbarRoutes(routes) { - this.topbarRouters = routes - }, - setSidebarRouters(routes) { - this.sidebarRouters = routes - }, - generateRoutes(roles) { - return new Promise(resolve => { - // 向后端请求路由数据 - getRouters().then(res => { - const sdata = JSON.parse(JSON.stringify(res.data)) - const rdata = JSON.parse(JSON.stringify(res.data)) - const defaultData = JSON.parse(JSON.stringify(res.data)) - const sidebarRoutes = filterAsyncRouter(sdata) - const rewriteRoutes = filterAsyncRouter(rdata, false, true) - const defaultRoutes = filterAsyncRouter(defaultData) - const asyncRoutes = filterDynamicRoutes(dynamicRoutes) - asyncRoutes.forEach(route => { router.addRoute(route) }) - this.setRoutes(rewriteRoutes) - this.setSidebarRouters(constantRoutes.concat(sidebarRoutes)) - this.setDefaultRoutes(sidebarRoutes) - this.setTopbarRoutes(defaultRoutes) - resolve(rewriteRoutes) - }) - }) - } - } - }) +const usePermissionStore = defineStore("permission", { + state: () => ({ + routes: [], + addRoutes: [], + defaultRoutes: [], + topbarRouters: [], + sidebarRouters: [], + }), + actions: { + setRoutes(routes) { + this.addRoutes = routes; + this.routes = constantRoutes.concat(routes); + console.log(routes); + }, + setDefaultRoutes(routes) { + this.defaultRoutes = constantRoutes.concat(routes); + }, + setTopbarRoutes(routes) { + this.topbarRouters = routes; + }, + setSidebarRouters(routes) { + this.sidebarRouters = routes; + }, + generateRoutes(roles) { + return new Promise((resolve) => { + let routesList = []; + if (roles == 1) { + routesList = enterpriseRoutes; + } else if (roles == 2) { + routesList = expertRoutes; + } + // console.log(routesList); + // const sdata = JSON.parse(JSON.stringify(routesList)); + // const rdata = JSON.parse(JSON.stringify(routesList)); + // const defaultData = JSON.parse(JSON.stringify(routesList)); + // const sidebarRoutes = filterAsyncRouter(sdata); + // const rewriteRoutes = filterAsyncRouter(rdata, false, true); + // const defaultRoutes = filterAsyncRouter(defaultData); + // const asyncRoutes = filterDynamicRoutes(dynamicRoutes); + // console.log( + // sdata, + // rdata, + // defaultData, + // sidebarRoutes, + // rewriteRoutes, + // defaultRoutes, + // asyncRoutes + // ); + // asyncRoutes.forEach((route) => { + // router.addRoute(route); + // }); + this.setRoutes(routesList); + this.setSidebarRouters(constantRoutes.concat(routesList)); + this.setDefaultRoutes(routesList); + this.setTopbarRoutes(routesList); + resolve(routesList); + // 向后端请求路由数据 + // getRouters().then(res => { + // console.log(res); + // const sdata = JSON.parse(JSON.stringify(res.data)) + // const rdata = JSON.parse(JSON.stringify(res.data)) + // const defaultData = JSON.parse(JSON.stringify(res.data)) + // const sidebarRoutes = filterAsyncRouter(sdata) + // const rewriteRoutes = filterAsyncRouter(rdata, false, true) + // const defaultRoutes = filterAsyncRouter(defaultData) + // const asyncRoutes = filterDynamicRoutes(dynamicRoutes) + // asyncRoutes.forEach(route => { router.addRoute(route) }) + // this.setRoutes(rewriteRoutes) + // this.setSidebarRouters(constantRoutes.concat(sidebarRoutes)) + // this.setDefaultRoutes(sidebarRoutes) + // this.setTopbarRoutes(defaultRoutes) + // resolve(rewriteRoutes) + // }) + }); + }, + }, +}); // 遍历后台传来的路由字符串,转换为组件对象 function filterAsyncRouter(asyncRouterMap, lastRouter = false, type = false) { - return asyncRouterMap.filter(route => { + return asyncRouterMap.filter((route) => { if (type && route.children) { - route.children = filterChildren(route.children) + route.children = filterChildren(route.children); } if (route.component) { // Layout ParentView 组件特殊处理 - if (route.component === 'Layout') { - route.component = Layout - } else if (route.component === 'ParentView') { - route.component = ParentView - } else if (route.component === 'InnerLink') { - route.component = InnerLink + if (route.component === "Layout") { + route.component = Layout; + } else if (route.component === "ParentView") { + route.component = ParentView; + } else if (route.component === "InnerLink") { + route.component = InnerLink; } else { - route.component = loadView(route.component) + route.component = loadView(route.component); } } if (route.children != null && route.children && route.children.length) { - route.children = filterAsyncRouter(route.children, route, type) + route.children = filterAsyncRouter(route.children, route, type); } else { - delete route['children'] - delete route['redirect'] + delete route["children"]; + delete route["redirect"]; } - return true - }) + return true; + }); } function filterChildren(childrenMap, lastRouter = false) { - var children = [] + var children = []; childrenMap.forEach((el, index) => { if (el.children && el.children.length) { - if (el.component === 'ParentView' && !lastRouter) { - el.children.forEach(c => { - c.path = el.path + '/' + c.path + if (el.component === "ParentView" && !lastRouter) { + el.children.forEach((c) => { + c.path = el.path + "/" + c.path; if (c.children && c.children.length) { - children = children.concat(filterChildren(c.children, c)) - return + children = children.concat(filterChildren(c.children, c)); + return; } - children.push(c) - }) - return + children.push(c); + }); + return; } } if (lastRouter) { - el.path = lastRouter.path + '/' + el.path + el.path = lastRouter.path + "/" + el.path; } - children = children.concat(el) - }) - return children + children = children.concat(el); + }); + return children; } // 动态路由遍历,验证是否具备权限 export function filterDynamicRoutes(routes) { - const res = [] - routes.forEach(route => { + const res = []; + routes.forEach((route) => { if (route.permissions) { if (auth.hasPermiOr(route.permissions)) { - res.push(route) + res.push(route); } } else if (route.roles) { if (auth.hasRoleOr(route.roles)) { - res.push(route) + res.push(route); } } - }) - return res + }); + return res; } export const loadView = (view) => { let res; for (const path in modules) { - const dir = path.split('views/')[1].split('.vue')[0]; + const dir = path.split("views/")[1].split(".vue")[0]; if (dir === view) { res = () => modules[path](); } } return res; -} +}; -export default usePermissionStore +export default usePermissionStore; diff --git a/src/store/modules/user.js b/src/store/modules/user.js index 7c2e6e8..5fa8481 100644 --- a/src/store/modules/user.js +++ b/src/store/modules/user.js @@ -1,70 +1,87 @@ -import { login, logout, getInfo } from '@/api/login' -import { getToken, setToken, removeToken } from '@/utils/auth' -import defAva from '@/assets/images/profile.jpg' +import { login, logout, getInfo } from "@/api/login"; +import { getToken, setToken, removeToken } from "@/utils/auth"; +import defAva from "@/assets/images/profile.jpg"; -const useUserStore = defineStore( - 'user', - { - state: () => ({ - token: getToken(), - name: '', - avatar: '', - roles: [], - permissions: [] - }), - actions: { - // 登录 - login(userInfo) { - const username = userInfo.username.trim() - const password = userInfo.password - const code = userInfo.code - const uuid = userInfo.uuid - return new Promise((resolve, reject) => { - login(username, password, code, uuid).then(res => { - setToken(res.token) - this.token = res.token - resolve() - }).catch(error => { - reject(error) +const useUserStore = defineStore("user", { + state: () => ({ + token: getToken(), + name: "", + avatar: "", + roles: [], + permissions: [], + roleId: localStorage.getItem("role-id") ?? 1, + }), + actions: { + // 登录 + login(userInfo) { + const username = userInfo.username.trim(); + const password = userInfo.password; + const code = userInfo.code; + const uuid = userInfo.uuid; + return new Promise((resolve, reject) => { + login(username, password, code, uuid) + .then((res) => { + setToken(res["client-token"]); + this.token = res["client-token"]; + resolve(); }) - }) - }, - // 获取用户信息 - getInfo() { - return new Promise((resolve, reject) => { - getInfo().then(res => { - const user = res.user - const avatar = (user.avatar == "" || user.avatar == null) ? defAva : import.meta.env.VITE_APP_BASE_API + user.avatar; + .catch((error) => { + reject(error); + }); + }); + }, + // 获取用户信息 + getInfo() { + return new Promise((resolve, reject) => { + getInfo() + .then((res) => { + const user = res.data.user; + const avatar = + user.avatar == "" || user.avatar == null + ? defAva + : import.meta.env.VITE_APP_BASE_API + user.avatar; - if (res.roles && res.roles.length > 0) { // 验证返回的roles是否是一个非空数组 - this.roles = res.roles - this.permissions = res.permissions + if (res.roles && res.roles.length > 0) { + // 验证返回的roles是否是一个非空数组 + this.roles = res.roles; + this.permissions = res.permissions; } else { - this.roles = ['ROLE_DEFAULT'] + this.roles = ["ROLE_DEFAULT"]; } - this.name = user.userName + this.name = user.userName; this.avatar = avatar; - resolve(res) - }).catch(error => { - reject(error) + resolve(res); }) - }) - }, - // 退出系统 - logOut() { - return new Promise((resolve, reject) => { - logout(this.token).then(() => { - this.token = '' - this.roles = [] - this.permissions = [] - removeToken() - resolve() - }).catch(error => { - reject(error) + .catch((error) => { + reject(error); + }); + }); + }, + // 退出系统 + logOut() { + return new Promise((resolve, reject) => { + logout(this.token) + .then(() => { + this.token = ""; + this.roles = []; + this.permissions = []; + removeToken(); + resolve(); }) - }) - } - } - }) + .catch((error) => { + reject(error); + }); + }); + }, -export default useUserStore + // 切换角色 + switchRole(roleId) { + // return new Promise((resolve, reject) => { + this.roleId = roleId; + localStorage.setItem("role-id", roleId); + // }); + }, + }, +}); + +export default useUserStore; diff --git a/src/utils/parameter.js b/src/utils/parameter.js new file mode 100644 index 0000000..b251992 --- /dev/null +++ b/src/utils/parameter.js @@ -0,0 +1,69 @@ +// 归属导航 +export const modeOptions = [ + { + value: 101, + label: '中小企业服务', + }, + { + value: 102, + label: '大型企业服务', + }, + { + value: 103, + label: '政府企业服务', + }, + { + value: 104, + label: '科研院所服务', + }, +] +// 学历 +export const educationOptions = [ + { key: 1, text: '小学' }, + { key: 2, text: '初中' }, + { key: 3, text: '高中' }, + { key: 4, text: '大专' }, + { key: 5, text: '本科' }, + { key: 6, text: '研究生' }, + { key: 7, text: '博士' }, +] +// 企业类型 +export const enterpriseOptions = [ + { key: "101", value: '上市企业' }, + { key: "102", value: '优质企业' }, + { key: "103", value: '普通企业' }, +] +// 成果成熟度 技术 +export const maturityOptions = [ + { key: 1, value: '正在研发' }, + { key: 2, value: '小试阶段' }, + { key: 3, value: '通过小试' }, + { key: 4, value: '中试阶段' }, + { key: 5, value: '通过中试' }, + { key: 6, value: '可规模生产' }, +] +// 成果领先型 领先标准 +export const leadOptions = [ + { key: 1, value: '国内先进' }, + { key: 2, value: '国内领先' }, + { key: 3, value: '国际先进' }, + { key: 4, value: '国际领先' }, +] +// 专利类型 +export const patentOptions = [ + { key: 1, value: '发明专利' }, + { key: 2, value: '外观设计' }, + { key: 3, value: '实用新型' }, +] +// 合作模式 +export const cooperationOptions = [ + { key: 101, value: '技术转让' }, + { key: 102, value: '技术许可' }, + { key: 103, value: '技术入股' }, + { key: 104, value: '合作开发' }, + { key: 105, value: '融资' }, + { key: 106, value: '公司' }, + { key: 107, value: '代理加盟' }, + { key: 108, value: '市场推广' }, + { key: 109, value: '其他' }, +] diff --git a/src/utils/request.js b/src/utils/request.js index 79c720c..8d73397 100644 --- a/src/utils/request.js +++ b/src/utils/request.js @@ -27,7 +27,7 @@ service.interceptors.request.use(config => { // 是否需要防止数据重复提交 const isRepeatSubmit = (config.headers || {}).repeatSubmit === false if (getToken() && !isToken) { - config.headers['Authorization'] = 'Bearer ' + getToken() // 让每个请求携带自定义token 请根据实际情况自行修改 + config.headers['client-token'] = 'Bearer ' + getToken() // 让每个请求携带自定义token 请根据实际情况自行修改 } // get请求映射params参数 if (config.method === 'get' && config.params) { diff --git a/src/views/admin/enterprise/account/basicInfo.vue b/src/views/admin/enterprise/account/basicInfo.vue new file mode 100644 index 0000000..adeb1f6 --- /dev/null +++ b/src/views/admin/enterprise/account/basicInfo.vue @@ -0,0 +1,141 @@ + + diff --git a/src/views/admin/enterprise/components/ReleaseForm/index.vue b/src/views/admin/enterprise/components/ReleaseForm/index.vue new file mode 100644 index 0000000..e9718a3 --- /dev/null +++ b/src/views/admin/enterprise/components/ReleaseForm/index.vue @@ -0,0 +1,266 @@ + + + + diff --git a/src/views/admin/enterprise/demand/serviceDemind.vue b/src/views/admin/enterprise/demand/serviceDemind.vue new file mode 100644 index 0000000..3b8cc6f --- /dev/null +++ b/src/views/admin/enterprise/demand/serviceDemind.vue @@ -0,0 +1,178 @@ + + + diff --git a/src/views/admin/enterprise/extension/business.vue b/src/views/admin/enterprise/extension/business.vue new file mode 100644 index 0000000..d30f829 --- /dev/null +++ b/src/views/admin/enterprise/extension/business.vue @@ -0,0 +1,173 @@ + + + \ No newline at end of file diff --git a/src/views/admin/enterprise/extension/product.vue b/src/views/admin/enterprise/extension/product.vue new file mode 100644 index 0000000..124cd97 --- /dev/null +++ b/src/views/admin/enterprise/extension/product.vue @@ -0,0 +1,201 @@ + + + diff --git a/src/views/admin/enterprise/extension/release.vue b/src/views/admin/enterprise/extension/release.vue new file mode 100644 index 0000000..0a0673a --- /dev/null +++ b/src/views/admin/enterprise/extension/release.vue @@ -0,0 +1,47 @@ + + diff --git a/src/views/admin/enterprise/extension/results.vue b/src/views/admin/enterprise/extension/results.vue new file mode 100644 index 0000000..dd76a49 --- /dev/null +++ b/src/views/admin/enterprise/extension/results.vue @@ -0,0 +1,222 @@ + + + + diff --git a/src/views/admin/index.vue b/src/views/admin/index.vue new file mode 100644 index 0000000..fc2511b --- /dev/null +++ b/src/views/admin/index.vue @@ -0,0 +1,93 @@ + + + + + diff --git a/src/views/components/CityOptions/index.vue b/src/views/components/CityOptions/index.vue new file mode 100644 index 0000000..2897dfd --- /dev/null +++ b/src/views/components/CityOptions/index.vue @@ -0,0 +1,174 @@ + + diff --git a/src/views/components/EnterpriseForm/index.vue b/src/views/components/EnterpriseForm/index.vue new file mode 100644 index 0000000..3d42cea --- /dev/null +++ b/src/views/components/EnterpriseForm/index.vue @@ -0,0 +1,263 @@ + + + + + diff --git a/src/views/components/FieldOptions/index.vue b/src/views/components/FieldOptions/index.vue new file mode 100644 index 0000000..c671121 --- /dev/null +++ b/src/views/components/FieldOptions/index.vue @@ -0,0 +1,218 @@ + + + + diff --git a/src/views/components/FieldSingle/index.vue b/src/views/components/FieldSingle/index.vue new file mode 100644 index 0000000..f17d31d --- /dev/null +++ b/src/views/components/FieldSingle/index.vue @@ -0,0 +1,146 @@ + + \ No newline at end of file diff --git a/src/views/components/InputBoxAdd/index.vue b/src/views/components/InputBoxAdd/index.vue new file mode 100644 index 0000000..4cdf14f --- /dev/null +++ b/src/views/components/InputBoxAdd/index.vue @@ -0,0 +1,109 @@ + + + + diff --git a/src/views/identity/enterprise.vue b/src/views/identity/enterprise.vue new file mode 100644 index 0000000..14419c4 --- /dev/null +++ b/src/views/identity/enterprise.vue @@ -0,0 +1,42 @@ + + diff --git a/src/views/identity/index.vue b/src/views/identity/index.vue new file mode 100644 index 0000000..2798c21 --- /dev/null +++ b/src/views/identity/index.vue @@ -0,0 +1,172 @@ + + diff --git a/src/views/identity/layout.vue b/src/views/identity/layout.vue new file mode 100644 index 0000000..ba32c22 --- /dev/null +++ b/src/views/identity/layout.vue @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/src/views/identity/test.vue b/src/views/identity/test.vue new file mode 100644 index 0000000..0b5da02 --- /dev/null +++ b/src/views/identity/test.vue @@ -0,0 +1 @@ + diff --git a/src/views/test.vue b/src/views/test.vue new file mode 100644 index 0000000..6948eec --- /dev/null +++ b/src/views/test.vue @@ -0,0 +1,3 @@ + diff --git a/src/views/website/home/index.vue b/src/views/website/home/index.vue new file mode 100644 index 0000000..94c1c21 --- /dev/null +++ b/src/views/website/home/index.vue @@ -0,0 +1,10 @@ + + diff --git a/src/views/website/login/index.vue b/src/views/website/login/index.vue new file mode 100644 index 0000000..37fb2ce --- /dev/null +++ b/src/views/website/login/index.vue @@ -0,0 +1,353 @@ + + + + + diff --git a/src/views/website/register/index.vue b/src/views/website/register/index.vue new file mode 100644 index 0000000..9c4b724 --- /dev/null +++ b/src/views/website/register/index.vue @@ -0,0 +1,235 @@ + + + + + diff --git a/src/views/website/retrieve/index.vue b/src/views/website/retrieve/index.vue new file mode 100644 index 0000000..b4d1d8b --- /dev/null +++ b/src/views/website/retrieve/index.vue @@ -0,0 +1,266 @@ + + + + + diff --git a/src/views/website/website-layout.vue b/src/views/website/website-layout.vue new file mode 100644 index 0000000..514c256 --- /dev/null +++ b/src/views/website/website-layout.vue @@ -0,0 +1,26 @@ + + + + + diff --git a/vite.config.js b/vite.config.js index 0567692..4230d99 100644 --- a/vite.config.js +++ b/vite.config.js @@ -31,7 +31,7 @@ export default defineConfig(({ mode, command }) => { proxy: { // https://cn.vitejs.dev/config/#server-proxy '/dev-api': { - target: 'http://localhost:8080', + target: 'http://172.20.10.10:1618', changeOrigin: true, rewrite: (p) => p.replace(/^\/dev-api/, '') }