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)
 但并不是所有的选择器都是这样的,只是说 有这种情况,有这种对应方案。









