npmrun 4 years ago
parent
commit
80d69d1fa6
  1. 61
      package-lock.json
  2. 1
      package.json
  3. 35
      plugins/md.ts
  4. 24
      src/main/facilities/clock/index.ts
  5. 1
      src/main/facilities/index.ts
  6. 8
      src/main/facilities/main/index.ts
  7. 3
      src/render/plugins/electron/index.ts
  8. 5
      src/render/route.tsx
  9. 16
      src/render/views/About/a.md
  10. 5
      src/render/views/About/index.tsx
  11. 50
      src/render/views/Home/Dialog.tsx
  12. 2
      src/render/views/Home/index.module.scss
  13. 106
      src/render/views/Home/index.tsx
  14. 7
      src/render/views/Home/useLocation.ts
  15. 4
      vite.config.ts

61
package-lock.json

@ -1368,6 +1368,34 @@
"progress": "^2.0.3",
"semver": "^6.2.0",
"sumchecker": "^3.0.1"
},
"dependencies": {
"fs-extra": {
"version": "8.1.0",
"resolved": "https://registry.nlark.com/fs-extra/download/fs-extra-8.1.0.tgz",
"integrity": "sha1-SdQ8RaiM2Wd2aMt74bRu/bjS4cA=",
"dev": true,
"requires": {
"graceful-fs": "^4.2.0",
"jsonfile": "^4.0.0",
"universalify": "^0.1.0"
}
},
"jsonfile": {
"version": "4.0.0",
"resolved": "https://registry.npm.taobao.org/jsonfile/download/jsonfile-4.0.0.tgz?cache=0&sync_timestamp=1604161797011&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fjsonfile%2Fdownload%2Fjsonfile-4.0.0.tgz",
"integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=",
"dev": true,
"requires": {
"graceful-fs": "^4.1.6"
}
},
"universalify": {
"version": "0.1.2",
"resolved": "https://registry.npm.taobao.org/universalify/download/universalify-0.1.2.tgz?cache=0&sync_timestamp=1603179967633&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Funiversalify%2Fdownload%2Funiversalify-0.1.2.tgz",
"integrity": "sha1-tkb2m+OULavOzJ1mOcgNwQXvqmY=",
"dev": true
}
}
},
"@electron/universal": {
@ -5758,14 +5786,13 @@
"dev": true
},
"fs-extra": {
"version": "8.1.0",
"resolved": "https://registry.nlark.com/fs-extra/download/fs-extra-8.1.0.tgz",
"integrity": "sha1-SdQ8RaiM2Wd2aMt74bRu/bjS4cA=",
"dev": true,
"version": "10.0.0",
"resolved": "https://registry.nlark.com/fs-extra/download/fs-extra-10.0.0.tgz",
"integrity": "sha1-n/YbZV3eU/s0qC34S7IUzoAuF8E=",
"requires": {
"graceful-fs": "^4.2.0",
"jsonfile": "^4.0.0",
"universalify": "^0.1.0"
"jsonfile": "^6.0.1",
"universalify": "^2.0.0"
}
},
"fs.realpath": {
@ -5969,8 +5996,7 @@
"graceful-fs": {
"version": "4.2.6",
"resolved": "https://registry.nlark.com/graceful-fs/download/graceful-fs-4.2.6.tgz",
"integrity": "sha1-/wQLKwhTsjw9MQJ1I3BvGIXXa+4=",
"dev": true
"integrity": "sha1-/wQLKwhTsjw9MQJ1I3BvGIXXa+4="
},
"graceful-readlink": {
"version": "1.0.1",
@ -6928,12 +6954,12 @@
}
},
"jsonfile": {
"version": "4.0.0",
"resolved": "https://registry.npm.taobao.org/jsonfile/download/jsonfile-4.0.0.tgz?cache=0&sync_timestamp=1604161797011&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fjsonfile%2Fdownload%2Fjsonfile-4.0.0.tgz",
"integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=",
"dev": true,
"version": "6.1.0",
"resolved": "https://registry.npm.taobao.org/jsonfile/download/jsonfile-6.1.0.tgz?cache=0&sync_timestamp=1604161797011&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fjsonfile%2Fdownload%2Fjsonfile-6.1.0.tgz",
"integrity": "sha1-vFWyY0eTxnnsZAMJTrE2mKbsCq4=",
"requires": {
"graceful-fs": "^4.1.6"
"graceful-fs": "^4.1.6",
"universalify": "^2.0.0"
}
},
"jszip": {
@ -8226,7 +8252,7 @@
},
"react-popper": {
"version": "1.3.11",
"resolved": "https://registry.npm.taobao.org/react-popper/download/react-popper-1.3.11.tgz?cache=0&sync_timestamp=1616674786422&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Freact-popper%2Fdownload%2Freact-popper-1.3.11.tgz",
"resolved": "https://registry.npm.taobao.org/react-popper/download/react-popper-1.3.11.tgz",
"integrity": "sha1-osw/Cme3W2bPpi0sQJ+d0fzHH/0=",
"dev": true,
"requires": {
@ -10018,10 +10044,9 @@
}
},
"universalify": {
"version": "0.1.2",
"resolved": "https://registry.npm.taobao.org/universalify/download/universalify-0.1.2.tgz?cache=0&sync_timestamp=1603179967633&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Funiversalify%2Fdownload%2Funiversalify-0.1.2.tgz",
"integrity": "sha1-tkb2m+OULavOzJ1mOcgNwQXvqmY=",
"dev": true
"version": "2.0.0",
"resolved": "https://registry.npm.taobao.org/universalify/download/universalify-2.0.0.tgz?cache=0&sync_timestamp=1603179967633&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Funiversalify%2Fdownload%2Funiversalify-2.0.0.tgz",
"integrity": "sha1-daSYTv7cSwiXXFrrc/Uw0C3yVxc="
},
"unpipe": {
"version": "1.0.0",

1
package.json

@ -93,6 +93,7 @@
"@emotion/react": "^11.4.0",
"@emotion/styled": "^11.3.0",
"framer-motion": "^4.1.17",
"fs-extra": "^10.0.0",
"normalize.css": "^8.0.1"
},
"build": {

35
plugins/md.ts

@ -0,0 +1,35 @@
import MarkdownIt from "markdown-it"
const mark = new MarkdownIt()
const mdToHtml = (str: string) => {
const content = mark.render(str)
return `
import React from "react"
export default React.createElement('div', {dangerouslySetInnerHTML:{__html: \`${content}\`} })`
}
export default function md(): any {
return {
name: "vite-plugin-md",
enforce: "pre",
transform(raw: any, id: any) {
if (!/\.md/g.test(id))
return
try {
return mdToHtml(raw)
} catch (e) {
this.error(e)
return ""
}
},
async handleHotUpdate(ctx: any) {
if (!/\.md/g.test(ctx.file))
return
const defaultRead = ctx.read
ctx.read = async function() {
return mdToHtml(await defaultRead())
}
}
}
}

24
src/main/facilities/clock/index.ts

@ -0,0 +1,24 @@
import { ipcMain } from "electron"
import fs from "fs-extra"
import path from "path"
const homeDir = require("os").homedir()
const clockJsonPath = path.resolve(homeDir, ".forceClock/clock.json")
fs.ensureFileSync(clockJsonPath)
try {
console.log(fs.readJSONSync(clockJsonPath))
const job = schedule.scheduleJob('42 * * * *', function(){
console.log('The answer to life, the universe, and everything!');
});
} catch (e) {
console.log(e)
// 读取JSON文件失败
}
ipcMain.on("@func:clock:saveData", function(event, data) {
fs.writeJson(clockJsonPath, data)
})
ipcMain.handle("@func:clock:getData", function() {
return fs.readJSONSync(clockJsonPath)
})

1
src/main/facilities/index.ts

@ -1,4 +1,5 @@
import Shared from "@main/share"
import "@main/facilities/clock"
import setTray from "@main/facilities/tray"
import { app, dialog, ipcMain } from "electron"
import Share from "../share"

8
src/main/facilities/main/index.ts

@ -21,12 +21,12 @@ export default function showWindow(url?: string) {
* Initial window options
*/
Shared.data.mainWindow = new BrowserWindow({
height: 95,
height: 600,
useContentSize: true,
width: 260,
width: 800,
resizable: true,
minWidth: 260,
minHeight: 95,
minWidth: 800,
minHeight: 600,
icon: __static + "/icon.png",
// show: false,
// frame: false, // 去除原生的菜单

3
src/render/plugins/electron/index.ts

@ -1,3 +1,6 @@
const electron = require("electron") // 只能用require
export default electron

5
src/render/route.tsx

@ -1,4 +1,5 @@
import Page404 from "@/views/Auth/Page404"
import Home from "@/views/Home"
import Login from "@/views/Login"
import React, { lazy } from "react"
import { useLocation } from "react-router-dom"
@ -81,9 +82,9 @@ const routes = [
},
{
path: "/home",
component: lazy(() => import("@/views/Home")),
component: Home,//lazy(() => import("@/views/Home")),
exact: true,
loading: () => <Loading color="blue"></Loading>,
// loading: () => <Loading color="blue"></Loading>,
root: true,
meta: {
auth: false,

16
src/render/views/About/a.md

@ -0,0 +1,16 @@
# 天涯路远,只争朝夕
时间如白驹过隙,一晃而过,在茫茫中,我仿佛已经丢失了很多,曾经的路已不见痕迹,前方的海无涯无际。
回首望去,过去的岁月如梦幻泡影,伸手一触,四散分离。
你还记得自己的梦想是什么吗?你还记得自己曾想过要干什么吗?如今的自己是否活成了当初讨厌的样子?
在冰冷的白色灯管下,我写下了这一段话,我也将深度思考,回答。这一切是否是自己期望的。
> 今天是2021-08-04 00:26:00,昨天是我**25岁**生日。
```javascript
console.log("时间会检验出答案"); // 请带上分号,给一切一个结束
```
## 曾经
阿松大

5
src/render/views/About/index.tsx

@ -1,7 +1,7 @@
import React from "react"
import style from "./index.module.scss"
import { useLocation, Route, Switch, useHistory } from "react-router-dom"
// import html from "./a.md"
import html from "./a.md"
function Test() {
return <div>test</div>
@ -20,8 +20,7 @@ export default function About(props: any) {
return (
<div className={`container ${style.about}`}>
<div className={"bp3-running-text bp3-text-large"}>
{/* {html} */}
<h1></h1>
{html}
</div>
{/*<div onClick={() =>back()}>阿萨 阿松大asdasd</div>*/}
{/*<div>22{props.children}{location.href}</div>*/}

50
src/render/views/Home/Dialog.tsx

@ -1,33 +1,30 @@
import {
Button,
ButtonGroup,
Card,
ControlGroup,
Elevation,
FormGroup,
HotkeysProvider,
Icon,
InputGroup,
Overlay,
TextArea,
} from "@blueprintjs/core"
import { Cell, Column, Table2 } from "@blueprintjs/table"
import React from "react"
import { Button, ButtonGroup, Card, FormGroup, InputGroup, Overlay, TextArea } from "@blueprintjs/core"
import cs from "classnames"
import React, { useEffect, useState } from "react"
import style from "./dialog.module.scss"
import { useState } from "react"
export default function Dialog(props: any) {
const { isOpen, setIsOpen } = props
const [title, setTitle] = useState<string>("")
const [time, setTime] = useState<string>("")
const [desc, setDesc] = useState<string>("")
function onInput(){
console.log('onInput');
function clickConfrim(){
props.onConfrim&&props.onConfrim(title,time,desc)
}
function onChange(){
console.log('onChange');
function clickCancel(){
setIsOpen(false)
props.onCancel&&props.onCancel()
}
useEffect(()=>{
if(isOpen){
setTitle("")
setTime("")
setDesc("")
}
}, [isOpen])
return (
<Overlay
isOpen={isOpen}
@ -39,24 +36,23 @@ export default function Dialog(props: any) {
<Card>
<form className="addClock clearfix">
<FormGroup label="标题" labelFor="title-input" labelInfo="(required)">
<InputGroup value={title} onChange={e => setTitle(e.target.value)} id="title-input" placeholder="请输入标题" />
<InputGroup value={title} onChange={e => setTitle(e.target.value)} id="title-input" placeholder="请输入标题"/>
</FormGroup>
<FormGroup helperText="一个通用的时间表示法" label="时间区间" labelFor="time-input" labelInfo="(required)">
<InputGroup onInput={()=>onInput()} onChange={()=>onChange()} id="time-input" placeholder="请输入时间区间" />
<InputGroup value={time} onChange={e => setTime(e.target.value)} id="time-input" placeholder="请输入时间区间"/>
</FormGroup>
<FormGroup label="描述" labelFor="desc-input">
<TextArea id="desc-input" style={{ width: "100%" }} growVertically={true} large={true} intent="primary" />
<TextArea value={desc} onChange={e => setDesc(e.target.value)} id="desc-input" style={{ width: "100%" }}
growVertically={true} large={true} intent="primary"/>
</FormGroup>
<ButtonGroup style={{ float: "right" }}>
<Button
intent="primary"
onClick={() => {
setIsOpen(true)
}}
onClick={()=>clickConfrim()}
>
</Button>
<Button intent="danger"></Button>
<Button intent="danger" onClick={()=>clickCancel()}></Button>
</ButtonGroup>
</form>
</Card>

2
src/render/views/Home/index.module.scss

@ -1,7 +1,5 @@
.container {
padding: 20px;
max-width: 100%;
margin: 0 auto;
.title {
font-size: 25px;
font-weight: bolder;

106
src/render/views/Home/index.tsx

@ -1,24 +1,14 @@
import electron from "@/plugins/electron"
import { addTodo, removeTodo } from "@/store/action/todo"
import {
Button,
ButtonGroup,
Card,
ControlGroup,
Elevation,
FormGroup,
HotkeysProvider,
Icon,
InputGroup,
Overlay,
TextArea,
} from "@blueprintjs/core"
import { Button, ButtonGroup, ControlGroup, FormGroup, HotkeysProvider, InputGroup } from "@blueprintjs/core"
import { Cell, Column, Table2 } from "@blueprintjs/table"
import React from "react"
import { useState } from "react"
import { connect } from "react-redux"
import cs from "classnames"
import _ from "lodash"
import React, { useEffect, useRef, useState } from "react"
import { connect } from "react-redux"
import Dialog from "./Dialog"
import style from "./index.module.scss"
import useLocation from "./useLocation"
export interface HomeProps {
add(text: string): void
@ -28,31 +18,64 @@ export interface HomeProps {
remove(id: number): void
}
let keyGen = 0
function Home(props: HomeProps) {
const [isOpen, setIsOpen] = useState<boolean>(false)
let clockList = [
{
key: 1,
title: "上班时间",
startTime: "2021-01-01 09:00:00",
endTime: "2021-01-01 17:00:00",
desc: "描述",
},
{
key: 2,
title: "上班时间",
startTime: "2021-01-01 09:00:00",
endTime: "2021-01-01 17:00:00",
desc: "描述",
},
]
const keyRef = useRef<HTMLInputElement>(null)
function delItem() {
let key = keyRef.current?.value
if (key) {
let index = _.findIndex(clockList, { key: +key })
if (index != -1) {
var list = [...clockList]
list.splice(index, 1)
setClockList(list)
keyRef.current!.value = ""
}
}
}
const { save, get } = useLocation()
const [clockList, setClockList] = useState<Record<string, any>[]>([])
const keyList = _.map(clockList, "key")
const titleList = _.map(clockList, "title")
const startTimeList = _.map(clockList, "startTime")
const endTimeList = _.map(clockList, "endTime")
const timeList = _.map(clockList, "time")
const descList = _.map(clockList, "desc")
function onConfrim(title: string, time: string, desc: string) {
if (title && time) {
const value = {
key: ++keyGen,
title: title,
time: time,
desc: desc
}
setClockList([...clockList, value])
setIsOpen(false)
}
}
useEffect(() => {
(async ()=>{
let list = await electron.ipcRenderer.invoke("@func:clock:getData")
if(list){
setClockList(list)
const keyList = _.map(list, "key")
if (keyList.length) {
keyGen = Math.max(...keyList)
}
}
})()
}, [])
useEffect(() => {
electron.ipcRenderer.send("@func:clock:saveData", clockList)
}, [clockList])
return (
<div className={style.container}>
<div className={cs(style.container, "container")}>
<div className={style.title}></div>
<div className={style.opeation}>
<ButtonGroup>
@ -71,35 +94,34 @@ function Home(props: HomeProps) {
<Table2 numRows={titleList.length}>
<Column name="KEY" cellRenderer={index => <Cell>{keyList[index]}</Cell>}></Column>
<Column name="标题" cellRenderer={index => <Cell>{titleList[index]}</Cell>}></Column>
<Column name="开始时间" cellRenderer={index => <Cell>{startTimeList[index]}</Cell>}></Column>
<Column name="结束时间" cellRenderer={index => <Cell>{endTimeList[index]}</Cell>}></Column>
<Column name="时间" cellRenderer={index => <Cell>{timeList[index]}</Cell>}></Column>
<Column name="描述" cellRenderer={index => <Cell>{descList[index]}</Cell>}></Column>
</Table2>
</HotkeysProvider>
<div style={{ margin: "10px 0" }}>
<FormGroup helperText="需要填入指定的闹钟进行删除" label="Key" labelFor="text-input" labelInfo="(required)">
<ControlGroup fill={false} vertical={false}>
<InputGroup id="text-input" placeholder="请输入Key值进行删除" />
<Button icon="trash" intent="danger" type="submit">
<InputGroup inputRef={keyRef} id="text-input" placeholder="请输入Key值进行删除"/>
<Button onClick={() => delItem()} icon="trash" intent="danger" type="submit">
</Button>
</ControlGroup>
</FormGroup>
</div>
<Dialog isOpen={isOpen} setIsOpen={setIsOpen}></Dialog>
<Dialog isOpen={isOpen} setIsOpen={setIsOpen} onConfrim={onConfrim}></Dialog>
</div>
)
}
const mapStateToProps = (state: any) => {
return {
todo: state.todo,
todo: state.todo
}
}
const mapDispatchToProps = (dispatch: any) => ({
add: (text: string) => dispatch(addTodo(text)),
remove: (id: string | number) => dispatch(removeTodo(id)),
remove: (id: string | number) => dispatch(removeTodo(id))
})
export default connect(mapStateToProps, mapDispatchToProps)(Home)

7
src/render/views/Home/useLocation.ts

@ -0,0 +1,7 @@
export default function useLocation() {
return {
save: localStorage.setItem.bind(localStorage),
remove: localStorage.removeItem.bind(localStorage),
get: localStorage.getItem.bind(localStorage),
}
}

4
vite.config.ts

@ -5,14 +5,14 @@ const { resolve, join } = require("path")
import electron from "vitejs-plugin-electron"
import { minifyHtml, injectHtml } from "vite-plugin-html"
import replace from '@rollup/plugin-replace';
// import md from './plugins/md';
import md from './plugins/md';
let isDev = process.env.NODE_ENV === "development"
let plugins = []
let staticPath = isDev? '/static': 'static'
plugins.push(
// md(),
md(),
replace({
preventAssignment: true,
"__static": staticPath,

Loading…
Cancel
Save