2022/1/21
通过列表的find方法获取指定用户的上班列表
业务逻辑说来不过增删改查,add,remove,list等,get,post,delete都是可以照着模仿的。
像 : @click =" show = true " show=true就是一个表达式, 相当于 @click=“f(n)” f(n)就是
show=true。 举个例子,设置添加按钮,触发时弹出弹窗,弹窗的显示就是靠show=true.
v-自定义指令,比如v-only-admin,虽然是一个属性,但是它是一个方法,当方法里面有设置
样式 style.display="none"的时候,这个指令就有了权限。
2022/1/22
user.info 获取用户信息
const getShangbanDate = async()=>{
const res = await user.info();
result(res)
.success((data) => {
console.log(data);
})
};
2022/1/24
时间格式转化为时间戳 Date.parse(new Date())
时间戳转换为时间格式 假设时间戳为a,那么就new Date(a)
const getShangbanData = async () =>{
const res = await user.info();
result(res)
.success(({ data }) => {
account.value = data.account;
});
if(!getSign()||(new Date(flagTime.value).getDate()!=new Date().getDate())){
//这里有个bug,第二天了就应该重新新增一条并且显示新增的那条才对
const res1 = await usersign.add(account.value);
result(res1)
.success(({ data }) => {
allTime.value = data;
shangbanDate.value= Date.parse(allTime.value.shangbanDate);
flagTime.value = shangbanDate.value;
shangbanDate.value = formatTimestamp(shangbanDate.value);
setSign(shangbanDate.value);
});
}
else{
message.error("已经签到,切勿重复签到!");
}
};
const getXiabanData = async () =>{
const res = await user.info();
result(res)
.success(({ data }) => {
account.value = data.account;
});
console.log(account.value);
const res1 = await usersign.update(account.value);
result(res1)
.success(({ data }) => {
allTime.value = data;
xiabanDate.value= Date.parse(allTime.value.xiabanDate) ;
xiabanDate.value = formatTimestamp(xiabanDate.value);
});
};
2022/1/25
做进一步的优化,让上下班签到的接口一致
const getXiabanData = async () =>{
const res = await user.info();
result(res)
.success(({ data }) => {
account.value = data.account;
});
console.log(account.value);
const res1 = await usersign.add(account.value,"xiaban");
result(res1)
.success(({ data }) => {
allTime.value = data;
xiabanDate.value= Date.parse(allTime.value.xiabanDate) ;
xiabanDate.value = formatTimestamp(xiabanDate.value);
});
};
if(!getSign()||(new Date(flagSTime.value).getDate()!=new Date().getDate())||
!getxiaSign()||(new Date(flagXTime.value).getDate()!=new Date().getDate()))
space-between 内部div的内部会换行是因为出现了块,所以需要设置“迟到”样式为display:inline-block,否则就会换行。
例子:
<a-button
@click=“getSignData(‘1’)”
type=“primary”
>
上班签到
</div>
<div>
{{formatTimestamp(shangbanDate)}}
<h6 style="display:inline-block">迟到</h6>
</div>
</space-between>
2022/1/26
const getSignData = async (flag) =>{
sign.value = Number(getSign());
xiasign.value = Number(getxiaSign());
console.log(new Date(xiasign.value).getDate()!=new Date().getDate());
if(
new Date(sign.value).getDate()!=new Date().getDate()||
new Date(xiasign.value).getDate()!=new Date().getDate()){
console.log(1);
//这里有个bug,第二天了就应该重新新增一条并且显示新增的那条才对
const res = await user.info();
result(res)
.success(({ data }) => {
account.value = data.account;
});
const res1 = await usersign.add(account.value,flag);
result(res1)
.success(({ data }) => {
allTime.value = data;
if(flag=="xiaban"){
xiabanDate.value= Date.parse(allTime.value.xiabanDate) ;
setxiaSign(xiabanDate.value);
}
else{
shangbanDate.value= Date.parse(allTime.value.shangbanDate);
setSign(shangbanDate.value);
}
});
}
else if(new Date(sign.value).getDate()==new Date().getDate()){
//如果不是第二天,就是更新当天的签到情况
}
else{
message.error("已经签到,切勿重复签到!");
}
};
前端写判断条件是为了减少向后端发起请求,后端是负责业务。
建议localstorage存储的数据应该存储在vuex里,这样数据才会响应式变化。
关于之前通过store.state获取userinfo,一直获取不到,是因为是userInfo,而不是userinfo,
i没有大写。下次遇到这种情况就先打印store.state看一下有值吗。然后再取里面的值。
bug:findUser更新的时间应该是最新一条,更新错了,希望能倒序找。
.find(query)
.sort({
_id: -1,
})
.skip((page - 1) * size)
.limit(size)
.exec();
query是对象。 比如({user})。而不是(user).
通过这种方法得到的是数组。
举个例子:const findUser = await UserSign.find({user,}).sort({_id:-1,}).limit(1).exec();
console.log(new Date(Date.parse(findUser[0].shangbanDate)).getDate());
如果是findUser.shangbanDate是获取不到值的。
先保留:
const getSignData = async (flag) =>{
sign.value = Number(getSign());
xiasign.value = Number(getxiaSign());
//这里有个bug,第二天了就应该重新新增一条并且显示新增的那条才对
//页面需要刷新页面才会及时更新数据
//每点击一次后台就会添加数据,而不是更新数据
account.value = store.state.userInfo.account;
const res1 = await usersign.add(account.value,flag);
result(res1)
.success(({ data }) => {
allTime.value = data;
if(flag==“xiaban”){
xiabanDate.value= Date.parse(allTime.value.xiabanDate) ;
setxiaSign(xiabanDate.value);
}
else{
shangbanDate.value= Date.parse(allTime.value.shangbanDate);
setSign(shangbanDate.value);
}
shangbanDate.value = localStorage.getItem("_ss");
xiabanDate.value=localStorage.getItem("_xx");
console.log(shangbanDate.value);
});
};
想让页面一开始就有显示值的方法是在return处就进行赋值。
想实现这个功能,其实是不用存到localstorage里的。
2022/1/27
删除了迟到的样式:
迟到
应该是只有对象才能被解构
关于axios.get 方法。发现它的传参写法跟post的传参写法是一样的,但是因为存的方式不同,
所以获取的方式不同。
在router中.post的参数通过ctx.request.body获取,而get的参数通过ctx.params获取。
因为curPage是局部变量,所以setPage里面用了getList函数,这样getList函数就可以获取setPage的curpage的值,这也正是利用了闭包原理。
遇到了一个onMounted函数的bug问题,首先写在onMounted函数里的函数就相当于一个自动执行的函数,发生于刷新页面之时。onMounted是一个钩子函数,是一定会执行的。
函数有两种执行方式,一种通过钩子函数,某个时间自动触发执行。一种是事件触发,通过
按钮执行。
上下班签到:
上班八点后签到就算迟到,
下班后六点后签到就算上班一天辛苦了,八点签到就算加班一天。
用户算是完成签到页面了,现在要完成用户的个人资料编辑。
页面显示用户信息,然后用户可以进行个人信息修改。
(个人设置一是可以修改密码,二是可以修改个人信息。)
bug:商品的编辑功能:有一个curEditGood的,其中有的写成了curEditgood,大小写不同,需要改成一致。
发现了ref声明和reactive声明还有一个区别,就是对象。
如果是ref的话,就是变量.value.属性。
如果是reactive的话,就是变量.属性。
2022/1/28
猜测:ctx.params约是前端网页route.params, (const route = useRoute();)也就是get,
get也就是router.push
r
e
c
o
r
d
.
i
d
:
r
o
u
t
e
r
.
p
u
s
h
(
‘
/
g
o
o
d
s
/
{record._id} : router.push(`/goods/
record.id:router.push(‘/goods/{record._id}`)
2022/1/29
用户个人信息包括,用户姓名,用户电话,用户地址(选择器),所在部门,入职时间。(入职时间和离职时间不可以修改)
用户登录成功的时候自动生成用户的入职时间。
用户可以申请离职,管理员可以查看申请离职的用户并删除记录。批准即等于删除。
2022/2/5
选择器 select 一个schema 两个表 关联 界面显示用到子表名字 取值用关联的那个 父,子共值。(就是那个good.classify)
但并不是所有的选择器都是这样的,只是说 有这种情况,有这种对应方案。