diff --git a/.eslintrc.js b/.eslintrc.js index a29e57b..54a3bfa 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -12,6 +12,7 @@ module.exports = { rules: { 'import/no-unresolved': 0, 'import/extensions': 0, + 'import/no-extraneous-dependencies': 0, 'no-plusplus': 0, 'no-use-before-define': [ 'error', @@ -26,7 +27,7 @@ module.exports = { 'no-unused-expressions': 'off', 'vue/no-mutating-props': 'off', 'vue/no-multiple-template-root': 'off', - "no-shadow": ["error", { "builtinGlobals": false, "hoist": "functions", "allow": [] }], + 'no-shadow': ['error', { builtinGlobals: false, hoist: 'functions', allow: [] }], 'no-console': process.env.NODE_ENV === 'production' ? 'error' : 'off', 'no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'off', 'no-param-reassign': 'off', diff --git a/src/App.vue b/src/App.vue index d070b25..36b3c4f 100644 --- a/src/App.vue +++ b/src/App.vue @@ -1,65 +1,75 @@ diff --git a/src/components/tall/top/TopNavbar.vue b/src/components/tall/top/TopNavbar.vue index 4523b72..5cd756c 100644 --- a/src/components/tall/top/TopNavbar.vue +++ b/src/components/tall/top/TopNavbar.vue @@ -1,10 +1,18 @@ @@ -12,22 +20,52 @@ diff --git a/src/store/index.js b/src/store/index.js index f74febf..7fc6341 100644 --- a/src/store/index.js +++ b/src/store/index.js @@ -1,5 +1,8 @@ import { createStore } from 'vuex'; -import user from './tall/user'; import layout from './tall/layout'; +import projects from './tall/projects'; +import role from './tall/role'; +import task from './tall/task'; +import user from './tall/user'; -export default createStore({ modules: { user, layout } }); +export default createStore({ modules: { user, projects, role, task, layout } }); diff --git a/src/store/tall/projects/projects.js b/src/store/tall/projects/index.js similarity index 100% rename from src/store/tall/projects/projects.js rename to src/store/tall/projects/index.js diff --git a/src/store/tall/role/actions.js b/src/store/tall/role/actions.js new file mode 100644 index 0000000..dc3a48f --- /dev/null +++ b/src/store/tall/role/actions.js @@ -0,0 +1,20 @@ +import { queryChecker } from 'apis'; + +const actions = { + /** + * 根据项目id查找所有成员信息 + * @param {*} commit + * @param {object} params + */ + async getAllMembers({ commit }, params) { + try { + const data = await queryChecker(params); + commit('setMembers', data); + return data; + } catch (error) { + throw new Error(error); + } + }, +}; + +export default actions; diff --git a/src/store/tall/role/getters.js b/src/store/tall/role/getters.js new file mode 100644 index 0000000..efbfa27 --- /dev/null +++ b/src/store/tall/role/getters.js @@ -0,0 +1,14 @@ +const getters = { + // 是不是负责人 + isMine({ roleId, invisibleRoles, visibleRoles }) { + console.log(roleId, invisibleRoles, visibleRoles); + // if (!visibleRoles || !visibleRoles.length) return false; + // const visible = visibleRoles.find(visible => visible.id === roleId); + // if (visible) return visible.mine; + // const invisible = invisibleRoles.find(invisible => invisible.id === roleId); + // if (invisible) return visible.mine; + return false; + }, +}; + +export default getters; diff --git a/src/store/tall/role/index.js b/src/store/tall/role/index.js new file mode 100644 index 0000000..d22f64a --- /dev/null +++ b/src/store/tall/role/index.js @@ -0,0 +1,12 @@ +import state from './state'; +import getters from './getters'; +import mutations from './mutations'; +import actions from './actions'; + +export default { + namespaced: true, + state, + getters, + mutations, + actions, +}; diff --git a/src/store/tall/role/mutations.js b/src/store/tall/role/mutations.js new file mode 100644 index 0000000..83bd215 --- /dev/null +++ b/src/store/tall/role/mutations.js @@ -0,0 +1,39 @@ +const mutations = { + /** + * 设置不展示的角色信息 + * @param {Object} state + * @param {Array} data 服务端返回的模板数组 + */ + setInvisibleRoles(state, data) { + state.invisibleRoles = data || []; + }, + + /** + * 设置展示的角色信息 + * @param {Object} state + * @param {Array} data 服务端返回的模板数组 + */ + setVisibleRoles(state, data) { + state.visibleRoles = data || []; + }, + + /** + * 设置当前角色信息 + * @param {Object} state + * @param {string} roleId 当前正在展示的角色的id + */ + setRoleId(state, roleId) { + state.roleId = roleId; + }, + + /** + * 设置项目下所有成员信息 + * @param {Object} state + * @param {Array} data 服务端返回的模板数组 + */ + setMembers(state, data) { + state.members = data || []; + }, +}; + +export default mutations; diff --git a/src/store/tall/role/state.js b/src/store/tall/role/state.js new file mode 100644 index 0000000..1117de7 --- /dev/null +++ b/src/store/tall/role/state.js @@ -0,0 +1,8 @@ +const state = { + invisibleRoles: [], // 不展示的角色信息 + visibleRoles: [], // 展示的角色信息 + roleId: '', // 当前展示查看的角色id + members: [], // 项目下所有成员 +}; + +export default state; diff --git a/src/store/tall/task/index.js b/src/store/tall/task/index.js new file mode 100644 index 0000000..39cb191 --- /dev/null +++ b/src/store/tall/task/index.js @@ -0,0 +1,320 @@ +import { getGlobal, getPermanent } from 'apis'; + +export default { + namespaced: true, + + state: { + scrollTop: 0, + scrollToTaskId: '', // 时间轴自动滚动的位置 + isShrink: false, // true: 收起, false:展开 + tip: { + taskId: '', // 当前正在修改状态的任务的id + show: false, + status: 0, // 所点击任务的当前状态码 + text: '', + left: 0, // 鼠标点击位置距离左边的距离 + top: 0, // 鼠标点击位置距离上边的距离 + }, + timeNode: new Date().getTime(), // 时间基准点 + timeUnit: 4, // 时间颗粒度 + topEnd: false, // 时间轴向上查任务到顶了 + bottomEnd: false, // 时间轴向下查任务到底了 + permanents: [], // 永久日常任务 + dailyTasks: [], // 日常任务 + tasks: [], // 所有的定期任务 + showSkeleton: false, // 定期任务骨架屏 + newProjectInfo: {}, + showScrollTo: false, // 是否可以设置时间轴自动滚动的位置 + }, + + getters: { + // 所有的日常任务 永久 + 可变 日常任务 + globals({ dailyTasks, permanents }) { + return [...permanents, ...dailyTasks]; + }, + + // unitConfig({ timeUnit }) { + // const target = uni.$t.timeConfig.timeUnits.find(item => item.id === timeUnit); + // return target; + // }, + + // 计算任务开始时间的格式 + startTimeFormat(state, { unitConfig }) { + return unitConfig.format || 'D日 HH:mm'; + }, + + // 计算颗粒度 对应的 dayjs add 的单位 + timeGranularity(state, { unitConfig }) { + return unitConfig.granularity; + }, + }, + + mutations: { + /** + * 记录时间轴向上滚动的距离 + * @param { object } state + * @param { number } num + */ + setScrollTop(state, num) { + state.scrollTop = num; + }, + + /** + * 记录时间轴向上滚动的距离 + * @param { object } state + * @param {string} taskId + */ + setScrollToTaskId(state, taskId) { + state.scrollToTaskId = taskId; + }, + + /** + * 设置日常任务当前是否应该处于收缩状态 + * @param { object } state + * @param { boolean } data + */ + setShrink(state, data) { + state.isShrink = data; + }, + + /** + * 设置tip的值 + * @param {object} state + * @param {object} data + */ + setTip(state, data) { + if (!data) return; + state.tip = { ...data }; + }, + + /** + * 是否显示tips + * @param { object } state + * @param { boolean } show + */ + setTipShow(state, show) { + state.tip.show = show; + }, + + /** + * 是否显示tips + * @param { object } state + * @param { number } status + */ + setStatus(state, status) { + state.tip.status = status; + }, + + /** + * 设置时间基准点 + * @param { object } state + * @param { number } data + */ + setTimeNode(state, data) { + state.timeNode = data; + }, + + /** + * 设置时间颗粒度 + * @param { object } state + * @param { number } data + */ + setTimeUnit(state, data) { + state.timeUnit = data; + }, + + /** + * 设置向上查到的定期任务数据 + * @param {Object} state + * @param {Array} data 服务端返回的模板数组 + */ + setUpTasks(state, data) { + if (!state.tasks.length) { + state.tasks = [...data]; // 原来没有数据 + } else { + state.tasks = [...data, ...state.tasks]; + + const arr = []; + let flag = false; + state.tasks.forEach(task => { + arr.forEach(item => { + if (task.id === item.id) { + flag = true; + } + }); + + if (!flag) { + arr.push(task); + } + }); + + state.tasks = [...arr]; + // state.tasks = [...data.concat(state.tasks)]; + } + }, + + /** + * 设置向下查到的定期任务数据 + * @param {Object} state + * @param {Array} data 服务端返回的模板数组 + */ + setDownTasks(state, data) { + if (!state.tasks && !state.tasks.length) { + state.tasks = [...data]; + } else { + state.tasks = [...state.tasks, ...data]; + + const arr = []; + let flag = false; + state.tasks.forEach(task => { + arr.forEach(item => { + if (task.id === item.id) { + flag = true; + } + }); + + if (!flag) { + arr.push(task); + } + }); + + state.tasks = [...arr]; + // state.tasks = [...state.tasks.concat(data)]; + } + }, + + /** + * 添加任务后更新tasks + * @param {Object} state + * @param {Array} data 新添加的task + */ + updateTasks(state, data) { + state.tasks = [...data]; + }, + + /** + * 设置添加任务的位置 + * @param {*} state + * @param {*} data + */ + setAddPosition(state, data) { + console.log('data: ', data); + }, + + /** + * 设置日常任务数据 + * @param {Object} state + * @param {Array} data 服务端返回的模板数组 + */ + setDailyTasks(state, data) { + state.dailyTasks = data || []; + }, + + /** + * 设置永久固定任务 + * @param {object} state + * @param {array} tasks 服务端查询到的永久日常任务书籍 + */ + setPermanents(state, tasks) { + state.permanents = tasks || []; + }, + + /** + * 设置时间轴是否继续向上查任务 + * @param {Object} state + * @param {Boolean} show + */ + setTopEnd(state, show) { + state.topEnd = show; + }, + + /** + * 设置时间轴是否继续向下查任务 + * @param {Object} state + * @param {Boolean} show + */ + setBottomEnd(state, show) { + state.bottomEnd = show; + }, + + // 清空标志位 如切换角色等使用 + clearEndFlag(state) { + state.topEnd = false; + state.bottomEnd = false; + }, + + // 清空定期任务 + clearTasks(state) { + state.tasks = []; + }, + + /** + * 收到消息设置任务状态 + * @param {Object} state + * @param {Array} data 服务端返回的模板数组 + */ + setTaskStatus(state, data) { + const item = state.tasks.find(i => i.id === data.id); + item.process = data.taskStatus; + }, + + /** + * 收到打开新项目消息状态 + * @param {Object} state + * @param {Array} data 服务端返回的模板数组 + */ + setNewProjectInfo(state, data) { + state.newProjectInfo = data; + }, + + /** + * 设置骨架屏是否显示 + * @param {Object} state + * @param {Boolean} show + */ + setShowSkeleton(state, show) { + state.showSkeleton = show; + }, + + /** + * 是否设置时间轴自动滚动的位置 + * @param {Object} state + * @param {Boolean} show + */ + setShowScrollTo(state, show) { + state.showScrollTo = show; + }, + }, + + actions: { + /** + * 根据角色查找永久的日常任务 + * @param {*} commit + * @param {string} roleId 角色id + */ + async getPermanent({ commit }, param) { + try { + const data = await getPermanent(param); + commit('setPermanents', data); + return data; + } catch (error) { + throw new Error(error); + } + }, + + /** + * 根据时间和角色查找日常任务 + * @param {*} commit + * @param {object} param 请求参数 roleId, timeNode, timeUnit + */ + async getGlobal({ commit }, param) { + try { + const data = await getGlobal(param); + commit('setDailyTasks', data); + return data; + } catch (error) { + throw new Error(error); + } + }, + }, +}; diff --git a/src/store/tall/user/index.js b/src/store/tall/user/index.js index d92689b..3330a84 100644 --- a/src/store/tall/user/index.js +++ b/src/store/tall/user/index.js @@ -14,6 +14,10 @@ export default { if (!user) return null; return user.id; }, + account({ user }) { + if (!user) return null; + return user.account; + }, }, mutations: { @@ -25,11 +29,11 @@ export default { setUser(state, user) { state.user = user; if (user) { - localStorage.setItem('token', user.token); - localStorage.setItem('user', JSON.stringify(user)); + sessionStorage.setItem('token', user.token); + sessionStorage.setItem('user', JSON.stringify(user)); } else { - localStorage.removeItem('token'); - localStorage.removeItem('user'); + sessionStorage.removeItem('token'); + sessionStorage.removeItem('user'); } }, }, diff --git a/src/views/detail/Test.vue b/src/views/detail/Test.vue index 0021872..6d82af5 100644 --- a/src/views/detail/Test.vue +++ b/src/views/detail/Test.vue @@ -1,3 +1,26 @@ - + + + diff --git a/src/views/home/Index.vue b/src/views/home/Index.vue index 56edbe4..8fa3d71 100644 --- a/src/views/home/Index.vue +++ b/src/views/home/Index.vue @@ -1,26 +1,84 @@ - + diff --git a/src/views/user/SignIn.vue b/src/views/user/SignIn.vue index 87e5468..d1f1542 100644 --- a/src/views/user/SignIn.vue +++ b/src/views/user/SignIn.vue @@ -1,5 +1,133 @@ - + + +