├── .gitignore ├── App ├── Controller │ ├── GoodController.php │ └── UserController.php └── Model │ ├── Good.php │ └── User.php ├── Public ├── index.php └── show │ └── index.html ├── Resource ├── App.vue ├── component │ └── header.vue ├── js │ ├── entry.js │ └── main.js ├── package-lock.json ├── package.json └── webpack.config.js ├── composer.json └── index.php /.gitignore: -------------------------------------------------------------------------------- 1 | /.idea 2 | /vendor 3 | /composer.lock 4 | /Public/static -------------------------------------------------------------------------------- /App/Controller/GoodController.php: -------------------------------------------------------------------------------- 1 | response($items); 23 | } 24 | 25 | public function Post(){ 26 | // 添加商品 27 | $item = new Good(); 28 | $item->name = $this->request()->get('name'); 29 | $item->content = $this->request()->get('content'); 30 | $item->cover = $this->request()->get('cover'); 31 | $item->category_id = $this->request()->get('category_id'); 32 | $item->type_id = $this->request()->get('type_id'); 33 | 34 | if ($item->save()){ 35 | return $this->response(); 36 | } else { 37 | return $this->response("","500", "500000",'添加失败'); 38 | } 39 | } 40 | 41 | public function infoGet($id){ 42 | 43 | $item = Good::find($id); 44 | if (is_null($item)){ 45 | return $this->response("","404", "500404",'未找到商品ID:'.$id); 46 | } else { 47 | return $this->response($item); 48 | } 49 | } 50 | 51 | public function infoPut($id){ 52 | 53 | // TODO: 鉴权 54 | 55 | $item = Good::find($id); 56 | if (is_null($item)){ 57 | return $this->response("","404", "500404",'未找到商品ID:'.$id); 58 | } else { 59 | if(!is_null($this->request()->get('name'))) { 60 | $item->name = $this->request()->get('name'); 61 | } 62 | if(!is_null($this->request()->get('content'))) { 63 | $item->content = $this->request()->get('content'); 64 | } 65 | if(!is_null($this->request()->get('cover'))) { 66 | $item->cover = $this->request()->get('cover'); 67 | } 68 | if(!is_null($this->request()->get('category_id'))) { 69 | $item->category_id = $this->request()->get('category_id'); 70 | } 71 | if(!is_null($this->request()->get('type_id'))) { 72 | $item->type_id = $this->request()->get('type_id'); 73 | } 74 | if ($item->save()){ 75 | return $this->response($item); 76 | } else { 77 | return $this->response("","500", "500000",'修改失败'); 78 | } 79 | } 80 | } 81 | 82 | public function infoDelete($id){ 83 | $item = Good::find($id); 84 | if (is_null($item )){ 85 | return $this->response("","404", "500404",'未找到商品ID:'.$id); 86 | } else { 87 | if ($item ->delete()){ 88 | return $this->response(); 89 | } else { 90 | return $this->response("","500", "500000",'删除失败'); 91 | } 92 | } 93 | } 94 | 95 | } 96 | 97 | -------------------------------------------------------------------------------- /App/Controller/UserController.php: -------------------------------------------------------------------------------- 1 | response($users); 18 | } 19 | 20 | public function Post(){ 21 | // 用户注册 22 | $user = new User(); 23 | 24 | $user->name = $this->request()->get('name'); 25 | $user->email = $this->request()->get('email'); 26 | $user->password = md5("rY".$this->request->get('password')."sHOP"); 27 | 28 | if ($user->save()){ 29 | return $this->response(); 30 | } else { 31 | return $this->response("","500", "500000",'注册失败!用户名或邮箱重复'); 32 | } 33 | } 34 | 35 | public function infoGet($id){ 36 | 37 | $user = User::find($id); 38 | if (is_null($user)){ 39 | return $this->response("","404", "500404",'未找到用户ID:'.$id); 40 | } else { 41 | return $this->response($user); 42 | } 43 | } 44 | 45 | public function infoPut($id){ 46 | 47 | // TODO: 鉴权 48 | 49 | $user = User::find($id); 50 | if (is_null($user)){ 51 | return $this->response("","404", "500404",'未找到用户ID:'.$id); 52 | } else { 53 | if(!is_null($this->request()->get('name'))) { 54 | $user->name = $this->request()->get('name'); 55 | } 56 | if(!is_null($this->request()->get('email'))) { 57 | $user->email = $this->request()->get('email'); 58 | } 59 | if(!is_null($this->request()->get('status'))) { 60 | $user->status = $this->request()->get('status'); 61 | } 62 | if(!is_null($this->request()->get('level'))) { 63 | $user->level = $this->request()->get('level'); 64 | } 65 | if(!is_null($this->request()->get('password'))) { 66 | $user->password = md5("rY".$this->request->get('password')."sHOP"); 67 | } 68 | if ($user->save()){ 69 | return $this->response($user); 70 | } else { 71 | return $this->response("","500", "500000",'修改失败'); 72 | } 73 | } 74 | } 75 | 76 | public function infoDelete($id){ 77 | $user = User::find($id); 78 | if (is_null($user)){ 79 | return $this->response("","404", "500404",'未找到用户ID:'.$id); 80 | } else { 81 | if ($user->delete()){ 82 | return $this->response(); 83 | } else { 84 | return $this->response("","500", "500000",'删除失败'); 85 | } 86 | } 87 | } 88 | 89 | public function checkGet($type){ 90 | $condition = User::where([ $type => $this->request('s')])->count(); 91 | if ($condition > 0){ 92 | return $this->response("","200", "500000",'X 已被使用'); 93 | } else { 94 | return $this->response("","200", "0",'√ 可以使用'); 95 | } 96 | } 97 | 98 | 99 | } 100 | 101 | -------------------------------------------------------------------------------- /App/Model/Good.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 7 | 8 | RyShop 9 | 10 | 11 |
12 |
13 | 14 | 15 | -------------------------------------------------------------------------------- /Resource/App.vue: -------------------------------------------------------------------------------- 1 | 27 | -------------------------------------------------------------------------------- /Resource/component/header.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | RyShop V2 7 | -------------------------------------------------------------------------------- /Resource/js/entry.js: -------------------------------------------------------------------------------- 1 | require('./main.js'); -------------------------------------------------------------------------------- /Resource/js/main.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2019.1 Rytia RyShop 3 | */ 4 | 5 | import Vue from 'vue'; 6 | import VueRouter from 'vue-router'; 7 | import App from './../App.vue' 8 | import ElementUI from 'element-ui'; 9 | import 'element-ui/lib/theme-chalk/index.css'; 10 | 11 | Vue.use(VueRouter); 12 | Vue.use(ElementUI); 13 | 14 | var data = { a: 1 }; 15 | 16 | var vm = new Vue({ 17 | el: '#app', 18 | data: data, 19 | render: h => h(App) 20 | }); -------------------------------------------------------------------------------- /Resource/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "requires": true, 3 | "lockfileVersion": 1, 4 | "dependencies": { 5 | "ajv": { 6 | "version": "5.5.2", 7 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", 8 | "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", 9 | "dev": true, 10 | "requires": { 11 | "co": "^4.6.0", 12 | "fast-deep-equal": "^1.0.0", 13 | "fast-json-stable-stringify": "^2.0.0", 14 | "json-schema-traverse": "^0.3.0" 15 | } 16 | }, 17 | "async": { 18 | "version": "2.6.1", 19 | "resolved": "https://registry.npmjs.org/async/-/async-2.6.1.tgz", 20 | "integrity": "sha512-fNEiL2+AZt6AlAw/29Cr0UDe4sRAHCpEHh54WMz+Bb7QfNcFw4h3loofyJpLeQs4Yx7yuqu/2dLgM5hKOs6HlQ==", 21 | "dev": true, 22 | "requires": { 23 | "lodash": "^4.17.10" 24 | } 25 | }, 26 | "async-validator": { 27 | "version": "1.8.5", 28 | "resolved": "https://registry.npmjs.org/async-validator/-/async-validator-1.8.5.tgz", 29 | "integrity": "sha512-tXBM+1m056MAX0E8TL2iCjg8WvSyXu0Zc8LNtYqrVeyoL3+esHRZ4SieE9fKQyyU09uONjnMEjrNBMqT0mbvmA==", 30 | "requires": { 31 | "babel-runtime": "6.x" 32 | } 33 | }, 34 | "babel-helper-vue-jsx-merge-props": { 35 | "version": "2.0.3", 36 | "resolved": "https://registry.npmjs.org/babel-helper-vue-jsx-merge-props/-/babel-helper-vue-jsx-merge-props-2.0.3.tgz", 37 | "integrity": "sha512-gsLiKK7Qrb7zYJNgiXKpXblxbV5ffSwR0f5whkPAaBAR4fhi6bwRZxX9wBlIc5M/v8CCkXUbXZL4N/nSE97cqg==" 38 | }, 39 | "babel-runtime": { 40 | "version": "6.26.0", 41 | "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", 42 | "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", 43 | "requires": { 44 | "core-js": "^2.4.0", 45 | "regenerator-runtime": "^0.11.0" 46 | } 47 | }, 48 | "big.js": { 49 | "version": "5.2.2", 50 | "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", 51 | "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", 52 | "dev": true 53 | }, 54 | "co": { 55 | "version": "4.6.0", 56 | "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", 57 | "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", 58 | "dev": true 59 | }, 60 | "core-js": { 61 | "version": "2.6.3", 62 | "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.3.tgz", 63 | "integrity": "sha512-l00tmFFZOBHtYhN4Cz7k32VM7vTn3rE2ANjQDxdEN6zmXZ/xq1jQuutnmHvMG1ZJ7xd72+TA5YpUK8wz3rWsfQ==" 64 | }, 65 | "deepmerge": { 66 | "version": "1.5.2", 67 | "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-1.5.2.tgz", 68 | "integrity": "sha512-95k0GDqvBjZavkuvzx/YqVLv/6YYa17fz6ILMSf7neqQITCPbnfEnQvEgMPNjH4kgobe7+WIL0yJEHku+H3qtQ==" 69 | }, 70 | "element-ui": { 71 | "version": "2.5.4", 72 | "resolved": "http://registry.npm.taobao.org/element-ui/download/element-ui-2.5.4.tgz", 73 | "integrity": "sha512-VlyPZ1A2VtVJdnu9nUV+u/eGhKaEF+IoENbDgNlUza0Slj6Jb0bC9mzK95JK2g7QSe8YXUWhQVy+d2kZUE2oKQ==", 74 | "requires": { 75 | "async-validator": "~1.8.1", 76 | "babel-helper-vue-jsx-merge-props": "^2.0.0", 77 | "deepmerge": "^1.2.0", 78 | "normalize-wheel": "^1.0.1", 79 | "resize-observer-polyfill": "^1.5.0", 80 | "throttle-debounce": "^1.0.1" 81 | } 82 | }, 83 | "emojis-list": { 84 | "version": "2.1.0", 85 | "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", 86 | "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=", 87 | "dev": true 88 | }, 89 | "extract-text-webpack-plugin": { 90 | "version": "3.0.2", 91 | "resolved": "https://registry.npmjs.org/extract-text-webpack-plugin/-/extract-text-webpack-plugin-3.0.2.tgz", 92 | "integrity": "sha512-bt/LZ4m5Rqt/Crl2HiKuAl/oqg0psx1tsTLkvWbJen1CtD+fftkZhMaQ9HOtY2gWsl2Wq+sABmMVi9z3DhKWQQ==", 93 | "dev": true, 94 | "requires": { 95 | "async": "^2.4.1", 96 | "loader-utils": "^1.1.0", 97 | "schema-utils": "^0.3.0", 98 | "webpack-sources": "^1.0.1" 99 | } 100 | }, 101 | "fast-deep-equal": { 102 | "version": "1.1.0", 103 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", 104 | "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=", 105 | "dev": true 106 | }, 107 | "fast-json-stable-stringify": { 108 | "version": "2.0.0", 109 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", 110 | "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", 111 | "dev": true 112 | }, 113 | "json-schema-traverse": { 114 | "version": "0.3.1", 115 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", 116 | "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", 117 | "dev": true 118 | }, 119 | "json5": { 120 | "version": "1.0.1", 121 | "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", 122 | "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", 123 | "dev": true, 124 | "requires": { 125 | "minimist": "^1.2.0" 126 | } 127 | }, 128 | "loader-utils": { 129 | "version": "1.2.3", 130 | "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz", 131 | "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==", 132 | "dev": true, 133 | "requires": { 134 | "big.js": "^5.2.2", 135 | "emojis-list": "^2.0.0", 136 | "json5": "^1.0.1" 137 | } 138 | }, 139 | "lodash": { 140 | "version": "4.17.11", 141 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", 142 | "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", 143 | "dev": true 144 | }, 145 | "minimist": { 146 | "version": "1.2.0", 147 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", 148 | "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", 149 | "dev": true 150 | }, 151 | "normalize-wheel": { 152 | "version": "1.0.1", 153 | "resolved": "https://registry.npmjs.org/normalize-wheel/-/normalize-wheel-1.0.1.tgz", 154 | "integrity": "sha1-rsiGr/2wRQcNhWRH32Ls+GFG7EU=" 155 | }, 156 | "regenerator-runtime": { 157 | "version": "0.11.1", 158 | "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", 159 | "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" 160 | }, 161 | "resize-observer-polyfill": { 162 | "version": "1.5.1", 163 | "resolved": "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz", 164 | "integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==" 165 | }, 166 | "schema-utils": { 167 | "version": "0.3.0", 168 | "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.3.0.tgz", 169 | "integrity": "sha1-9YdyIs4+kx7a4DnxfrNxbnE3+M8=", 170 | "dev": true, 171 | "requires": { 172 | "ajv": "^5.0.0" 173 | } 174 | }, 175 | "source-list-map": { 176 | "version": "2.0.1", 177 | "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", 178 | "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==", 179 | "dev": true 180 | }, 181 | "source-map": { 182 | "version": "0.6.1", 183 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", 184 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", 185 | "dev": true 186 | }, 187 | "throttle-debounce": { 188 | "version": "1.1.0", 189 | "resolved": "https://registry.npmjs.org/throttle-debounce/-/throttle-debounce-1.1.0.tgz", 190 | "integrity": "sha512-XH8UiPCQcWNuk2LYePibW/4qL97+ZQ1AN3FNXwZRBNPPowo/NRU5fAlDCSNBJIYCKbioZfuYtMhG4quqoJhVzg==" 191 | }, 192 | "vue": { 193 | "version": "2.5.22", 194 | "resolved": "https://registry.npmjs.org/vue/-/vue-2.5.22.tgz", 195 | "integrity": "sha512-pxY3ZHlXNJMFQbkjEgGVMaMMkSV1ONpz+4qB55kZuJzyJOhn6MSy/YZdzhdnumegNzVTL/Dn3Pp4UrVBYt1j/g==" 196 | }, 197 | "vue-router": { 198 | "version": "3.0.2", 199 | "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-3.0.2.tgz", 200 | "integrity": "sha512-opKtsxjp9eOcFWdp6xLQPLmRGgfM932Tl56U9chYTnoWqKxQ8M20N7AkdEbM5beUh6wICoFGYugAX9vQjyJLFg==" 201 | }, 202 | "webpack-sources": { 203 | "version": "1.3.0", 204 | "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.3.0.tgz", 205 | "integrity": "sha512-OiVgSrbGu7NEnEvQJJgdSFPl2qWKkWq5lHMhgiToIiN9w34EBnjYzSYs+VbL5KoYiLNtFFa7BZIKxRED3I32pA==", 206 | "dev": true, 207 | "requires": { 208 | "source-list-map": "^2.0.0", 209 | "source-map": "~0.6.1" 210 | } 211 | } 212 | } 213 | } 214 | -------------------------------------------------------------------------------- /Resource/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "dependencies": { 3 | "element-ui": "^2.5.4", 4 | "vue": "^2.5.22", 5 | "vue-router": "^3.0.2" 6 | }, 7 | "devDependencies": { 8 | "css-loader": "^2.1.0", 9 | "extract-text-webpack-plugin": "^3.0.2", 10 | "file-loader": "^3.0.1", 11 | "node-sass": "^4.11.0", 12 | "sass-loader": "^7.1.0", 13 | "style-loader": "^0.23.1", 14 | "vue-loader": "^15.6.2", 15 | "vue-template-compiler": "^2.5.22" 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /Resource/webpack.config.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2019.1 Rytia RyShop 3 | */ 4 | const path = require('path'); 5 | const VueLoaderPlugin = require('vue-loader/lib/plugin'); 6 | module.exports = { 7 | mode: "development", 8 | entry: "./js/entry.js", 9 | output: { 10 | path: path.resolve(__dirname, '../Public/static'), 11 | filename: "bundle.js" 12 | }, 13 | module: { 14 | rules: [ 15 | { 16 | test: /\.css$/, 17 | use: ['style-loader', 'css-loader'] 18 | }, 19 | { 20 | test: /\.scss$/, 21 | use: [ 22 | "style-loader", // creates style nodes from JS strings 23 | "css-loader", // translates CSS into CommonJS 24 | "sass-loader" // compiles Sass to CSS, using Node Sass by default 25 | ] 26 | }, 27 | { 28 | test: /\.(eot|svg|ttf|woff|woff2)$/, 29 | loader: 'file-loader', 30 | options: { 31 | publicPath: './static/' 32 | } 33 | }, 34 | { 35 | test: /\.vue$/, 36 | loader: 'vue-loader' 37 | }, 38 | ] 39 | }, 40 | plugins: [ 41 | // 请确保引入这个插件! 42 | new VueLoaderPlugin() 43 | ], 44 | resolve: { 45 | alias: { 46 | 'vue$': 'vue/dist/vue.esm.js' // 用 webpack 1 时需用 'vue/dist/vue.common.js' 47 | } 48 | } 49 | }; -------------------------------------------------------------------------------- /composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "zzfly256/ryshop", 3 | "description": "A simple shop for vhost and vps.", 4 | "type": "project", 5 | "require": { 6 | "php-quickorm/framework": "^1.0" 7 | }, 8 | "license": "MIT", 9 | "authors": [ 10 | { 11 | "name": "Rytia", 12 | "email": "admin@zzfly.net" 13 | } 14 | ], 15 | "autoload": { 16 | "psr-4": { 17 | "Model\\": "App/Model/", 18 | "Controller\\": "App/Controller/" 19 | } 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /index.php: -------------------------------------------------------------------------------- 1 |